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:
@@ -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>
|
||||
`;
|
||||
}
|
||||
|
Reference in New Issue
Block a user