Files
Projektarbeit-MYP/backend/DOCS/BUTTON_RESERVIERUNG_ERSTELLEN_FIX.md

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

  1. Timing-Problem: Das Formular ist beim ersten Laden der Seite versteckt
  2. Event-Listener nicht registriert: Wenn das Formular versteckt ist, wird der Event-Listener möglicherweise nicht korrekt registriert
  3. 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:

  1. Option A: Auf "Erweitert" klicken im Formular-Header
  2. 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:

  1. Auf der Jobs-Seite (/jobs) nach unten scrollen
  2. Im Bereich "Neuen Druckauftrag erstellen" auf "Erweitert" klicken
  3. Das erweiterte Formular wird angezeigt
  4. Alle erforderlichen Felder ausfüllen:
    • Drucker auswählen
    • Startzeit eingeben
    • Dauer in Minuten
    • Job-Titel eingeben
  5. 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 Druckers
  • start_iso (String): Startzeit im ISO-Format
  • duration_minutes (Integer): Dauer in Minuten
  • name (String): Job-Titel

Optionale Felder

  • description (String): Beschreibung
  • file_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

  1. Code-Änderungen vollständig implementieren
  2. Funktionalität testen
  3. Event-Listener-Registrierung verifizieren
  4. Cross-Browser-Kompatibilität prüfen
  5. Performance-Impact bewerten