feat: Einführung neuer API-Endpunkte zur Verwaltung von Benutzereinstellungen und Druckerstatus. Implementierung von Funktionen zur Überprüfung wartender Jobs und zur Aktualisierung aller Drucker. Verbesserung der Benutzeroberfläche durch optimierte Ladeanzeigen und Warnungen für Offline-Drucker. Anpassungen in den Templates zur Unterstützung neuer Funktionen und zur Verbesserung der Benutzererfahrung.

This commit is contained in:
2025-05-27 12:19:03 +02:00
parent cbe1864678
commit e9071c7b57
11 changed files with 1101 additions and 17 deletions

View File

@@ -35,6 +35,17 @@
<option value="">Drucker auswählen...</option>
<!-- Wird durch JavaScript gefüllt -->
</select>
<div id="printer-status-warning" class="mt-2 hidden">
<div class="flex items-center p-3 bg-orange-50 dark:bg-orange-900/20 border border-orange-200 dark:border-orange-800 rounded-lg">
<svg class="w-5 h-5 text-orange-500 mr-2 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
</svg>
<div class="text-sm">
<p class="font-medium text-orange-800 dark:text-orange-200">Offline-Drucker ausgewählt</p>
<p class="text-orange-700 dark:text-orange-300">Der Job wird erstellt, startet aber erst, wenn der Drucker online geht.</p>
</div>
</div>
</div>
</div>
<!-- Gewünschte Startzeit -->
@@ -202,12 +213,31 @@ document.addEventListener('DOMContentLoaded', function() {
loadPrinters();
loadActiveJobs();
// Event-Listener für Drucker-Auswahl (Offline-Warnung)
const printerSelect = document.getElementById('printer_id');
const statusWarning = document.getElementById('printer-status-warning');
if (printerSelect && statusWarning) {
printerSelect.addEventListener('change', function() {
const selectedOption = this.options[this.selectedIndex];
if (selectedOption && selectedOption.getAttribute('data-offline') === 'true') {
statusWarning.classList.remove('hidden');
} else {
statusWarning.classList.add('hidden');
}
});
}
// Formulare initialisieren
initNewJobForm();
initExtendJobForm();
// Timer für automatische Aktualisierung der Jobs (alle 60 Sekunden)
setInterval(loadActiveJobs, 60000);
// Timer für Überprüfung wartender Jobs (alle 30 Sekunden)
setInterval(checkWaitingJobs, 30000);
});
// Hilfsfunktion zum Formatieren des Datums für Datetime-Input
@@ -329,7 +359,8 @@ function populatePrinterSelect(printers, onlineOnly = false) {
statusIcon = '🔴';
statusText = 'Offline';
option.style.color = '#dc2626'; // Rot für offline
option.disabled = true; // Offline-Drucker deaktivieren
// Offline-Drucker NICHT deaktivieren, aber kennzeichnen
option.setAttribute('data-offline', 'true');
}
// Letzter Check-Zeitstempel
@@ -474,6 +505,35 @@ function loadActiveJobs() {
});
}
// Überprüfung wartender Jobs
function checkWaitingJobs() {
fetch('/api/jobs/check-waiting', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
}
})
.then(response => response.json())
.then(data => {
if (data.updated_jobs && data.updated_jobs.length > 0) {
// Benachrichtigung für aktivierte Jobs
data.updated_jobs.forEach(job => {
showNotification(
`🎉 Gute Nachrichten! Drucker "${job.printer_name}" ist online. Ihr Job "${job.name}" wurde aktiviert und startet bald.`,
'success'
);
});
// Jobs neu laden, um aktualisierte Status anzuzeigen
loadActiveJobs();
}
})
.catch(error => {
console.error('Fehler beim Überprüfen wartender Jobs:', error);
// Stille Fehler - nicht den Benutzer stören
});
}
// Initialisierung des Formulars für neue Jobs
function initNewJobForm() {
const form = document.getElementById('newJobForm');
@@ -493,6 +553,28 @@ function initNewJobForm() {
return;
}
// Prüfen, ob ein Offline-Drucker ausgewählt wurde
const selectedOption = document.querySelector(`#printer_id option[value="${printer_id}"]`);
if (selectedOption && selectedOption.getAttribute('data-offline') === 'true') {
const printerName = selectedOption.textContent.split(' (')[0].replace('🔴 ', '');
const confirmOffline = confirm(
`⚠️ WARNUNG: Offline-Drucker ausgewählt!\n\n` +
`Der Drucker "${printerName}" ist derzeit OFFLINE.\n\n` +
`Wenn Sie fortfahren:\n` +
`• Der Job wird als "Wartend auf Drucker" markiert\n` +
`• Sie erhalten eine Benachrichtigung, wenn der Drucker online geht\n` +
`• Der Job startet automatisch, sobald der Drucker verfügbar ist\n\n` +
`Möchten Sie trotzdem fortfahren?`
);
if (!confirmOffline) {
showNotification('Job-Erstellung abgebrochen. Bitte wählen Sie einen Online-Drucker oder warten Sie, bis der gewünschte Drucker verfügbar ist.', 'info');
return;
}
showNotification(`Job für Offline-Drucker "${printerName}" wird erstellt. Sie werden benachrichtigt, wenn der Drucker online geht.`, 'warning');
}
// Startzeit in ISO-Format konvertieren
const start_date = new Date(start_time);
@@ -761,10 +843,28 @@ function renderJobCard(job) {
</span>
`;
} else if (job.status === 'scheduled') {
// Prüfe, ob der Drucker online ist
const printerOnline = job.printer?.status === 'available' || job.printer?.active;
if (printerOnline) {
statusBadge = `
<span class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-400">
<span class="w-2 h-2 mr-1 bg-blue-500 rounded-full"></span>
Geplant
</span>
`;
} else {
statusBadge = `
<span class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-orange-100 dark:bg-orange-900/30 text-orange-800 dark:text-orange-400">
<span class="w-2 h-2 mr-1 bg-orange-500 rounded-full animate-pulse"></span>
Wartend auf Drucker
</span>
`;
}
} else if (job.status === 'waiting_for_printer') {
statusBadge = `
<span class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-400">
<span class="w-2 h-2 mr-1 bg-blue-500 rounded-full"></span>
Geplant
<span class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-yellow-100 dark:bg-yellow-900/30 text-yellow-800 dark:text-yellow-400">
<span class="w-2 h-2 mr-1 bg-yellow-500 rounded-full animate-pulse"></span>
Drucker offline
</span>
`;
}