// frontend/src/pages/ShiftPlans/ShiftPlanCreate.tsx import React, { useState, useEffect } from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; import { shiftPlanService } from '../../services/shiftPlanService'; import { useNotification } from '../../contexts/NotificationContext'; import { useBackendValidation } from '../../hooks/useBackendValidation'; import styles from './ShiftPlanCreate.module.css'; // Interface für Template Presets interface TemplatePreset { name: string; label: string; description: string; } const ShiftPlanCreate: React.FC = () => { const navigate = useNavigate(); const [searchParams] = useSearchParams(); const { showNotification } = useNotification(); const { executeWithValidation, isSubmitting } = useBackendValidation(); const [planName, setPlanName] = useState(''); const [startDate, setStartDate] = useState(''); const [endDate, setEndDate] = useState(''); const [selectedPreset, setSelectedPreset] = useState(''); const [presets, setPresets] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { loadTemplatePresets(); }, []); const loadTemplatePresets = async () => { try { console.log('🔄 Lade verfügbare Vorlagen-Presets...'); const data = await shiftPlanService.getTemplatePresets(); console.log('✅ Presets geladen:', data); setPresets(data); // Setze das erste Preset als Standard, falls vorhanden if (data.length > 0) { setSelectedPreset(data[0].name); } } catch (error) { console.error('❌ Fehler beim Laden der Vorlagen-Presets:', error); showNotification({ type: 'error', title: 'Fehler beim Laden', message: 'Vorlagen-Presets konnten nicht geladen werden' }); } finally { setLoading(false); } }; const handleCreate = async () => { // Basic frontend validation only if (!planName.trim()) { showNotification({ type: 'error', title: 'Fehlende Angaben', message: 'Bitte geben Sie einen Namen für den Schichtplan ein' }); return; } if (!startDate) { showNotification({ type: 'error', title: 'Fehlende Angaben', message: 'Bitte wählen Sie ein Startdatum' }); return; } if (!endDate) { showNotification({ type: 'error', title: 'Fehlende Angaben', message: 'Bitte wählen Sie ein Enddatum' }); return; } if (new Date(endDate) < new Date(startDate)) { showNotification({ type: 'error', title: 'Ungültige Daten', message: 'Das Enddatum muss nach dem Startdatum liegen' }); return; } if (!selectedPreset) { showNotification({ type: 'error', title: 'Fehlende Angaben', message: 'Bitte wählen Sie eine Vorlage aus' }); return; } await executeWithValidation(async () => { console.log('🔄 Erstelle Schichtplan aus Preset...', { presetName: selectedPreset, name: planName, startDate, endDate }); // Erstelle den Plan aus dem ausgewählten Preset const createdPlan = await shiftPlanService.createFromPreset({ presetName: selectedPreset, name: planName, startDate: startDate, endDate: endDate, isTemplate: false }); console.log('✅ Plan erstellt:', createdPlan); // Erfolgsmeldung und Weiterleitung showNotification({ type: 'success', title: 'Erfolg', message: 'Schichtplan erfolgreich erstellt!' }); setTimeout(() => { navigate(`/shift-plans/${createdPlan.id}`); }, 1500); }); }; const getSelectedPresetDescription = () => { const preset = presets.find(p => p.name === selectedPreset); return preset ? preset.description : ''; }; if (loading) { return (
Lade Vorlagen...
); } return (

Neuen Schichtplan erstellen

setPlanName(e.target.value)} placeholder="z.B. KW 42 2025" className={styles.input} disabled={isSubmitting} />
setStartDate(e.target.value)} className={styles.input} disabled={isSubmitting} />
setEndDate(e.target.value)} className={styles.input} disabled={isSubmitting} />
{selectedPreset && (
{getSelectedPresetDescription()}
)} {presets.length === 0 && (

Keine Vorlagen verfügbar.

)}
); }; export default ShiftPlanCreate;