7.9 KiB
7.9 KiB
Button "Reservierung erstellen" - Problem-Analyse und Lösung
Problem-Beschreibung
Der Button "Reservierung erstellen" in der Jobs-Seite funktioniert nicht. Das Formular wird nicht abgeschickt, wenn der Benutzer auf den Button klickt.
Problem-Analyse
1. Formular ist standardmäßig versteckt
Das erweiterte Formular mit dem Submit-Button ist standardmäßig mit class="hidden"
versteckt:
<div id="expanded-form" class="hidden">
<form id="newJobForm" class="space-y-6">
2. Event-Listener wird möglicherweise zu früh registriert
Der Event-Listener wird in setupEventListeners()
registriert, aber das Form könnte zu diesem Zeitpunkt noch nicht im DOM sein.
3. Fehlende Robust-Behandlung
Die ursprüngliche Implementierung hat keine robuste Behandlung für dynamisch geladene Formulare.
Identifizierte Ursachen
- Timing-Problem: Das Formular ist beim ersten Laden der Seite versteckt
- Event-Listener nicht registriert: Wenn das Formular versteckt ist, wird der Event-Listener möglicherweise nicht korrekt registriert
- Fehlende Form-Validierung: Keine Client-seitige Validierung vor dem Submit
Lösung
Schritt 1: Button-Funktionalität prüfen
Der Benutzer muss zunächst das erweiterte Formular anzeigen:
- Option A: Auf "Erweitert" klicken im Formular-Header
- Option B: Auf "Vollständiger Auftrag" in den Quick-Actions klicken
Schritt 2: Event-Listener verbessern
// Robuste Event-Listener-Registrierung
setupFormSubmitListeners() {
const setupMainFormListener = () => {
const mainForm = document.getElementById('newJobForm');
if (mainForm) {
console.log('✅ Hauptformular gefunden - Event Listener wird registriert');
mainForm.removeEventListener('submit', this.handleJobSubmit.bind(this));
mainForm.addEventListener('submit', this.handleJobSubmit.bind(this));
return true;
}
return false;
};
// Mit MutationObserver für dynamische Inhalte
const observer = new MutationObserver(() => {
if (setupMainFormListener()) {
observer.disconnect();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
}
Schritt 3: Formular-Validierung verbessern
async handleJobSubmit(e) {
e.preventDefault();
// Debug-Ausgaben
console.log('🚀 Job-Submit gestartet');
const formData = new FormData(e.target);
const jobData = {
printer_id: parseInt(formData.get('printer_id')),
start_iso: formData.get('start_time'),
duration_minutes: parseInt(formData.get('duration')),
name: formData.get('job_title') || 'Neuer Druckjob'
};
// Validierung
if (!jobData.printer_id) {
this.showError('Bitte wählen Sie einen Drucker aus');
return;
}
if (!jobData.start_iso) {
this.showError('Bitte geben Sie eine Startzeit an');
return;
}
if (!jobData.duration_minutes || jobData.duration_minutes <= 0) {
this.showError('Bitte geben Sie eine gültige Dauer ein');
return;
}
// Submit-Button deaktivieren
const submitBtn = e.target.querySelector('button[type="submit"]');
if (submitBtn) {
submitBtn.disabled = true;
submitBtn.innerHTML = '<span class="loading-spinner"></span> Erstelle...';
}
try {
const response = await fetch('/api/jobs', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': this.getCSRFToken()
},
body: JSON.stringify(jobData)
});
const data = await response.json();
if (data.success) {
this.showSuccess('Job erfolgreich erstellt!');
this.loadJobs(); // Refresh job list
e.target.reset(); // Reset form
} else {
this.showError(`Fehler beim Erstellen: ${data.error}`);
}
} catch (error) {
console.error('❌ Fehler beim Job-Submit:', error);
this.showError('Fehler beim Erstellen des Jobs');
} finally {
// Button wieder aktivieren
if (submitBtn) {
submitBtn.disabled = false;
submitBtn.innerHTML = `
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v6m0 0v6m0-6h6m-6 0H6"/>
</svg>
<span>Reservierung erstellen</span>
`;
}
}
}
Schritt 4: ToggleFormExpansion verbessern
function toggleFormExpansion() {
console.log('🔄 toggleFormExpansion() aufgerufen');
const expandedForm = document.getElementById('expanded-form');
const toggleBtn = document.getElementById('form-toggle-btn');
const toggleText = toggleBtn.querySelector('span');
const toggleIcon = toggleBtn.querySelector('svg');
if (expandedForm.classList.contains('hidden')) {
console.log('👁️ Formular wird angezeigt');
expandedForm.classList.remove('hidden');
toggleText.textContent = 'Reduziert';
toggleIcon.style.transform = 'rotate(180deg)';
// Event-Listener für das Formular erneut registrieren
setTimeout(() => {
const form = document.getElementById('newJobForm');
if (form && !form.hasAttribute('data-listener-added')) {
console.log('🔧 Registriere Event-Listener für erweiterte Form');
form.addEventListener('submit', (e) => {
if (window.jobManager) {
window.jobManager.handleJobSubmit(e);
}
});
form.setAttribute('data-listener-added', 'true');
}
}, 100);
} else {
expandedForm.classList.add('hidden');
toggleText.textContent = 'Erweitert';
toggleIcon.style.transform = 'rotate(0deg)';
}
}
Sofort-Lösung für Benutzer
Aktuelle Workaround-Schritte:
- Auf der Jobs-Seite (/jobs) nach unten scrollen
- Im Bereich "Neuen Druckauftrag erstellen" auf "Erweitert" klicken
- Das erweiterte Formular wird angezeigt
- Alle erforderlichen Felder ausfüllen:
- Drucker auswählen
- Startzeit eingeben
- Dauer in Minuten
- Job-Titel eingeben
- Auf "Reservierung erstellen" klicken
Alternative:
- Auf "Vollständiger Auftrag" in den Quick-Actions klicken
Debug-Informationen
Browser-Konsole überwachen
Nach dem Laden der Seite sollten folgende Meldungen in der Browser-Konsole erscheinen:
✅ Hauptformular gefunden - Event Listener wird registriert
✅ Schnell-Reservierung Formular gefunden - Event Listener wird registriert
Bei Formular-Submit:
🚀 Job-Submit gestartet
📋 Job-Daten: {printer_id: 1, start_iso: "2024-...", ...}
🌐 Sende API-Request
📡 API Response Status: 201
📡 API Response Data: {success: true, ...}
Technische Details
Backend-Endpoint
- URL:
POST /api/jobs
- Blueprint:
blueprints.jobs.create_job()
- Authentifizierung: Login erforderlich
- CSRF-Schutz: Aktiv
Erforderliche Felder
printer_id
(Integer): ID des gewählten Druckersstart_iso
(String): Startzeit im ISO-Formatduration_minutes
(Integer): Dauer in Minutenname
(String): Job-Titel
Optionale Felder
description
(String): Beschreibungfile_path
(String): Pfad zur hochgeladenen Datei
Status
- Problem identifiziert: ✅
- Ursache analysiert: ✅
- Lösung implementiert: ⏳ (In Bearbeitung)
- Tests durchgeführt: ⏳ (Ausstehend)
- Dokumentation erstellt: ✅
Nächste Schritte
- Code-Änderungen vollständig implementieren
- Funktionalität testen
- Event-Listener-Registrierung verifizieren
- Cross-Browser-Kompatibilität prüfen
- Performance-Impact bewerten