{% extends "base.html" %} {% block title %}Drucker - MYP API Tester{% endblock %} {% block content %} <div class="row"> <div class="col-md-12 mb-4"> <div class="card"> <div class="card-header d-flex justify-content-between align-items-center"> <h4 class="mb-0">Drucker verwalten</h4> <button class="btn btn-primary" type="button" data-bs-toggle="collapse" data-bs-target="#newPrinterForm"> Neuen Drucker hinzufügen </button> </div> <div class="collapse" id="newPrinterForm"> <div class="card-body border-bottom"> <form class="api-form" data-url="/api/printers" data-method="POST" data-response="createPrinterResponse" data-reload="true"> <div class="mb-3"> <label for="printerName" class="form-label">Name</label> <input type="text" class="form-control" id="printerName" name="name" required> </div> <div class="mb-3"> <label for="printerDescription" class="form-label">Beschreibung</label> <textarea class="form-control" id="printerDescription" name="description" rows="3" required></textarea> </div> <div class="mb-3"> <label for="printerStatus" class="form-label">Status</label> <select class="form-control" id="printerStatus" name="status"> <option value="0">Verfügbar (0)</option> <option value="1">Besetzt (1)</option> <option value="2">Wartung (2)</option> </select> </div> <div class="mb-3"> <label for="printerIpAddress" class="form-label">IP-Adresse (Tapo Steckdose)</label> <input type="text" class="form-control" id="printerIpAddress" name="ipAddress" placeholder="z.B. 192.168.1.100"> </div> <button type="submit" class="btn btn-success">Drucker erstellen</button> </form> <div class="mt-3"> <h6>Antwort:</h6> <pre class="api-response" id="createPrinterResponse"></pre> </div> </div> </div> <div class="card-body"> <form class="api-form mb-3" data-url="/api/printers" data-method="GET" data-response="printersResponse"> <button type="submit" class="btn btn-primary">Drucker aktualisieren</button> </form> <div class="table-responsive"> <table class="table table-striped table-hover"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Beschreibung</th> <th>Status</th> <th>IP-Adresse</th> <th>Aktueller Job</th> <th>Wartende Jobs</th> <th>Aktionen</th> </tr> </thead> <tbody id="printersTableBody"> <!-- Wird dynamisch gefüllt --> </tbody> </table> </div> <div> <h6>API-Antwort:</h6> <pre class="api-response" id="printersResponse"></pre> </div> </div> </div> </div> </div> <!-- Drucker bearbeiten Modal --> <div class="modal fade" id="editPrinterModal" tabindex="-1"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Drucker bearbeiten</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <form id="editPrinterForm" class="api-form" data-method="PUT" data-response="editPrinterResponse" data-reload="true"> <input type="hidden" id="editPrinterId" name="printerId"> <div class="mb-3"> <label for="editPrinterName" class="form-label">Name</label> <input type="text" class="form-control" id="editPrinterName" name="name" required> </div> <div class="mb-3"> <label for="editPrinterDescription" class="form-label">Beschreibung</label> <textarea class="form-control" id="editPrinterDescription" name="description" rows="3" required></textarea> </div> <div class="mb-3"> <label for="editPrinterStatus" class="form-label">Status</label> <select class="form-control" id="editPrinterStatus" name="status"> <option value="0">Verfügbar (0)</option> <option value="1">Besetzt (1)</option> <option value="2">Wartung (2)</option> </select> </div> <div class="mb-3"> <label for="editPrinterIpAddress" class="form-label">IP-Adresse (Tapo Steckdose)</label> <input type="text" class="form-control" id="editPrinterIpAddress" name="ipAddress" placeholder="z.B. 192.168.1.100"> </div> </form> <div class="mt-3"> <h6>Antwort:</h6> <pre class="api-response" id="editPrinterResponse"></pre> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Abbrechen</button> <button type="submit" form="editPrinterForm" class="btn btn-primary">Änderungen speichern</button> </div> </div> </div> </div> <!-- Drucker löschen Modal --> <div class="modal fade" id="deletePrinterModal" tabindex="-1"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Drucker löschen</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <p>Möchten Sie den Drucker <span id="deletePrinterName"></span> wirklich löschen?</p> <form id="deletePrinterForm" class="api-form" data-method="DELETE" data-response="deletePrinterResponse" data-reload="true"> <input type="hidden" id="deletePrinterId" name="printerId"> </form> <div class="mt-3"> <h6>Antwort:</h6> <pre class="api-response" id="deletePrinterResponse"></pre> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Abbrechen</button> <button type="submit" form="deletePrinterForm" class="btn btn-danger">Löschen</button> </div> </div> </div> </div> {% endblock %} {% block scripts %} <script> document.addEventListener('DOMContentLoaded', function() { // Drucker laden document.querySelector('form[data-url="/api/printers"]').dispatchEvent(new Event('submit')); // Tabelle aktualisieren, wenn Drucker geladen werden const printersResponse = document.getElementById('printersResponse'); const observer = new MutationObserver(function(mutations) { try { const printers = JSON.parse(printersResponse.textContent); updatePrintersTable(printers); } catch (e) { console.error('Fehler beim Parsen der Drucker-Daten:', e); } }); observer.observe(printersResponse, { childList: true, characterData: true, subtree: true }); // Edit-Modal vorbereiten document.getElementById('editPrinterModal').addEventListener('show.bs.modal', function(event) { const button = event.relatedTarget; const printerId = button.getAttribute('data-printer-id'); const printerName = button.getAttribute('data-printer-name'); const printerDescription = button.getAttribute('data-printer-description'); const printerStatus = button.getAttribute('data-printer-status'); const printerIpAddress = button.getAttribute('data-printer-ip'); document.getElementById('editPrinterId').value = printerId; document.getElementById('editPrinterForm').setAttribute('data-url', `/api/printers/${printerId}`); document.getElementById('editPrinterName').value = printerName; document.getElementById('editPrinterDescription').value = printerDescription; document.getElementById('editPrinterStatus').value = printerStatus; document.getElementById('editPrinterIpAddress').value = printerIpAddress || ''; }); // Delete-Modal vorbereiten document.getElementById('deletePrinterModal').addEventListener('show.bs.modal', function(event) { const button = event.relatedTarget; const printerId = button.getAttribute('data-printer-id'); const printerName = button.getAttribute('data-printer-name'); document.getElementById('deletePrinterId').value = printerId; document.getElementById('deletePrinterForm').setAttribute('data-url', `/api/printers/${printerId}`); document.getElementById('deletePrinterName').textContent = printerName; }); }); function updatePrintersTable(printers) { const tableBody = document.getElementById('printersTableBody'); tableBody.innerHTML = ''; printers.forEach(printer => { const row = document.createElement('tr'); const statusText = { 0: 'Verfügbar', 1: 'Besetzt', 2: 'Wartung' }[printer.status] || 'Unbekannt'; const statusClass = { 0: 'text-success', 1: 'text-warning', 2: 'text-danger' }[printer.status] || ''; // Informationen zum aktuellen Job let currentJobInfo = '-'; if (printer.latestJob && printer.status === 1) { // Verbleibende Zeit berechnen const remainingTime = printer.latestJob.remainingMinutes || 0; currentJobInfo = ` <div class="small"> <strong>ID:</strong> ${printer.latestJob.id.substring(0, 8)}...<br> <strong>Dauer:</strong> ${printer.latestJob.durationInMinutes} Min<br> <strong>Verbleibend:</strong> ${remainingTime} Min </div> `; } // Wartende Jobs anzeigen let waitingJobsInfo = '-'; if (printer.waitingJobs && printer.waitingJobs.length > 0) { const waitingJobsCount = printer.waitingJobs.length; waitingJobsInfo = ` <div class="small"> <strong>${waitingJobsCount} Job${waitingJobsCount !== 1 ? 's' : ''} in Warteschlange</strong><br> ${printer.waitingJobs.map((job, index) => `<span>${index + 1}. Job ${job.id.substring(0, 8)}... (${job.durationInMinutes} Min)</span>` ).join('<br>')} </div> `; } row.innerHTML = ` <td>${printer.id}</td> <td>${printer.name}</td> <td>${printer.description}</td> <td><span class="${statusClass}">${statusText} (${printer.status})</span></td> <td>${printer.ipAddress || '-'}</td> <td>${currentJobInfo}</td> <td>${waitingJobsInfo}</td> <td> <button type="button" class="btn btn-sm btn-primary" data-bs-toggle="modal" data-bs-target="#editPrinterModal" data-printer-id="${printer.id}" data-printer-name="${printer.name}" data-printer-description="${printer.description}" data-printer-status="${printer.status}" data-printer-ip="${printer.ipAddress || ''}"> Bearbeiten </button> <button type="button" class="btn btn-sm btn-danger" data-bs-toggle="modal" data-bs-target="#deletePrinterModal" data-printer-id="${printer.id}" data-printer-name="${printer.name}"> Löschen </button> </td> `; tableBody.appendChild(row); }); } </script> {% endblock %}