<!DOCTYPE html> <html lang="de"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{% block title %}MYP API Tester{% endblock %}</title> <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.css') }}"> <style> .sidebar { min-height: calc(100vh - 56px); background-color: #f8f9fa; } .api-response { max-height: 300px; overflow-y: auto; font-family: monospace; background-color: #f5f5f5; padding: 10px; border-radius: 4px; } .nav-link.active { background-color: #0d6efd; color: white !important; } </style> </head> <body> <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <div class="container-fluid"> <a class="navbar-brand" href="/">MYP API Tester</a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link {% if active_page == 'home' %}active{% endif %}" href="/">Home</a> </li> <li class="nav-item"> <a class="nav-link {% if active_page == 'printers' %}active{% endif %}" href="/admin/printers">Drucker</a> </li> <li class="nav-item"> <a class="nav-link {% if active_page == 'jobs' %}active{% endif %}" href="/admin/jobs">Druckaufträge</a> </li> <li class="nav-item"> <a class="nav-link {% if active_page == 'users' %}active{% endif %}" href="/admin/users">Benutzer</a> </li> <li class="nav-item"> <a class="nav-link {% if active_page == 'stats' %}active{% endif %}" href="/admin/stats">Statistiken</a> </li> </ul> <ul class="navbar-nav ms-auto"> {% if current_user %} <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-bs-toggle="dropdown"> {{ current_user.username }} </a> <ul class="dropdown-menu dropdown-menu-end"> <li><a class="dropdown-item" href="/logout">Abmelden</a></li> </ul> </li> {% else %} <li class="nav-item"> <a class="nav-link" href="/login">Anmelden</a> </li> {% endif %} </ul> </div> </div> </nav> <div class="container-fluid py-3"> {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} {% for category, message in messages %} <div class="alert alert-{{ category }}" role="alert"> {{ message }} </div> {% endfor %} {% endif %} {% endwith %} {% block content %}{% endblock %} </div> <script src="{{ url_for('static', filename='js/bootstrap.bundle.js') }}"></script> <script> function formatJson(jsonString) { try { const obj = JSON.parse(jsonString); return JSON.stringify(obj, null, 2); } catch (e) { return jsonString; } } document.addEventListener('DOMContentLoaded', function() { // Format all response areas document.querySelectorAll('.api-response').forEach(function(el) { if (el.textContent) { el.textContent = formatJson(el.textContent); } }); // Add event listener to show response areas document.querySelectorAll('.api-form').forEach(function(form) { form.addEventListener('submit', async function(e) { e.preventDefault(); const url = this.getAttribute('data-url'); const method = this.getAttribute('data-method') || 'GET'; const responseArea = document.getElementById(this.getAttribute('data-response')); const formData = new FormData(this); const data = {}; formData.forEach((value, key) => { if (value) { try { // Try to parse as JSON if it looks like JSON if (value.trim().startsWith('{') || value.trim().startsWith('[')) { data[key] = JSON.parse(value); } else { data[key] = value; } } catch (e) { data[key] = value; } } }); const options = { method: method, headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin' }; if (method !== 'GET' && method !== 'HEAD') { options.body = JSON.stringify(data); } try { responseArea.textContent = 'Sending request...'; const response = await fetch(url, options); const responseText = await response.text(); try { const formatted = formatJson(responseText); responseArea.textContent = formatted; } catch (e) { responseArea.textContent = responseText; } if (this.hasAttribute('data-reload') && response.ok) { setTimeout(() => { window.location.reload(); }, 1000); } } catch (err) { responseArea.textContent = 'Error: ' + err.message; } }); }); }); </script> {% block scripts %}{% endblock %} </body> </html>