diff --git a/backend/templates/jobs.html b/backend/templates/jobs.html index aceea93..326e661 100644 --- a/backend/templates/jobs.html +++ b/backend/templates/jobs.html @@ -30,6 +30,12 @@ +
+ + +
@@ -190,6 +196,33 @@
+ + + {% endblock %} {% block scripts %} @@ -251,6 +284,15 @@ document.getElementById('editCommentsForm').setAttribute('data-url', `/api/jobs/${jobId}/comments`); document.getElementById('editJobComments').value = comments || ''; }); + + // Approve-Modal vorbereiten + document.getElementById('approveJobModal').addEventListener('show.bs.modal', function(event) { + const button = event.relatedTarget; + const jobId = button.getAttribute('data-job-id'); + + document.getElementById('approveJobId').value = jobId; + document.getElementById('approveJobForm').setAttribute('data-url', `/api/jobs/${jobId}/approve`); + }); }); async function loadPrinters() { @@ -261,13 +303,45 @@ const selectElement = document.getElementById('jobPrinterId'); selectElement.innerHTML = ''; - // Nur verfügbare Drucker anzeigen - printers.filter(printer => printer.status === 0).forEach(printer => { + // Drucker anzeigen (alle, da man jetzt auch für belegte Drucker Jobs erstellen kann) + printers.forEach(printer => { const option = document.createElement('option'); option.value = printer.id; - option.textContent = `${printer.name} - ${printer.description}`; + + // Status-Information zum Drucker hinzufügen + const statusText = printer.status === 0 ? '(Verfügbar)' : '(Belegt)'; + option.textContent = `${printer.name} - ${printer.description} ${statusText}`; + + // Belegte Drucker visuell unterscheiden + if (printer.status !== 0) { + option.classList.add('text-muted'); + } + selectElement.appendChild(option); }); + + // Hinweis auf die Checkbox für Warteschlange anzeigen oder verstecken + const allowQueuedJobsCheckbox = document.getElementById('allowQueuedJobs'); + const queueCheckboxContainer = allowQueuedJobsCheckbox.closest('.form-check'); + + // Prüfen, ob es belegte Drucker gibt + const hasBusyPrinters = printers.some(printer => printer.status !== 0); + queueCheckboxContainer.style.display = hasBusyPrinters ? 'block' : 'none'; + + // Event-Listener für die Druckerauswahl hinzufügen + selectElement.addEventListener('change', function() { + const selectedPrinterId = this.value; + const selectedPrinter = printers.find(p => p.id === selectedPrinterId); + + if (selectedPrinter && selectedPrinter.status !== 0) { + // Wenn ein belegter Drucker ausgewählt wird, Checkbox für Warteschlange anzeigen + queueCheckboxContainer.style.display = 'block'; + allowQueuedJobsCheckbox.checked = true; + } else if (selectedPrinter && selectedPrinter.status === 0) { + // Wenn ein verfügbarer Drucker ausgewählt wird, Checkbox für Warteschlange verstecken + allowQueuedJobsCheckbox.checked = false; + } + }); } catch (e) { console.error('Fehler beim Laden der Drucker:', e); } @@ -283,7 +357,8 @@ const startDate = new Date(job.startAt); const formattedStart = startDate.toLocaleString(); - const isActive = !job.aborted && job.remainingMinutes > 0; + const isActive = !job.aborted && job.remainingMinutes > 0 && !job.waitingApproval; + const isWaiting = !job.aborted && job.waitingApproval; let statusText = ''; let statusClass = ''; @@ -291,6 +366,9 @@ if (job.aborted) { statusText = 'Abgebrochen'; statusClass = 'text-danger'; + } else if (job.waitingApproval) { + statusText = 'Wartet auf Freischaltung'; + statusClass = 'text-info'; } else if (job.remainingMinutes <= 0) { statusText = 'Abgeschlossen'; statusClass = 'text-success'; @@ -299,13 +377,16 @@ statusClass = 'text-warning'; } + // Zeige die verbleibende Zeit an + const remainingTime = job.waitingApproval ? '-' : job.remainingMinutes; + row.innerHTML = ` ${job.id} ${job.printerId} ${job.userId} ${formattedStart} ${job.durationInMinutes} - ${job.remainingMinutes} + ${remainingTime} ${statusText} ${job.comments || '-'} @@ -329,6 +410,22 @@ Verlängern ` : ''} + + ${isWaiting ? ` + + + ` : ''} +