// frontend/src/pages/ShiftTemplates/ShiftTemplateEditor.tsx import React, { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { TemplateShiftSlot, TemplateShift, TemplateShiftTimeSlot, DEFAULT_DAYS } from '../../types/shiftTemplate'; import { shiftTemplateService } from '../../services/shiftTemplateService'; import ShiftDayEditor from './components/ShiftDayEditor'; import DefaultTemplateView from './components/DefaultTemplateView'; import styles from './ShiftTemplateEditor.module.css'; interface ExtendedTemplateShift extends Omit { id?: string; isPreview?: boolean; } const defaultShift: ExtendedTemplateShift = { dayOfWeek: 1, // Montag timeSlot: { id: '', name: '', startTime: '', endTime: '' }, requiredEmployees: 1, color: '#3498db' }; const ShiftTemplateEditor: React.FC = () => { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const isEditing = !!id; const [template, setTemplate] = useState>({ name: '', description: '', shifts: [], isDefault: false }); const [loading, setLoading] = useState(isEditing); const [saving, setSaving] = useState(false); const [showPreview, setShowPreview] = useState(false); useEffect(() => { if (isEditing) { loadTemplate(); } }, [id]); const loadTemplate = async () => { try { if (!id) return; const data = await shiftTemplateService.getTemplate(id); setTemplate({ name: data.name, description: data.description, shifts: data.shifts, isDefault: data.isDefault }); } catch (error) { console.error('Fehler beim Laden:', error); alert('Vorlage konnte nicht geladen werden'); } finally { setLoading(false); } }; const handleSave = async () => { if (!template.name.trim()) { alert('Bitte geben Sie einen Namen für die Vorlage ein'); return; } setSaving(true); try { if (isEditing && id) { await shiftTemplateService.updateTemplate(id, template); } else { await shiftTemplateService.createTemplate(template); } navigate('/shift-templates'); } catch (error) { console.error('Speichern fehlgeschlagen:', error); alert('Fehler beim Speichern der Vorlage'); } finally { setSaving(false); } }; const addShift = (dayOfWeek: number) => { const newShift: TemplateShiftSlot = { ...defaultShift, id: Date.now().toString(), dayOfWeek, timeSlot: { ...defaultShift.timeSlot, id: Date.now().toString() }, requiredEmployees: defaultShift.requiredEmployees, color: defaultShift.color }; setTemplate(prev => ({ ...prev, shifts: [...prev.shifts, newShift] })); }; const updateShift = (shiftId: string, updates: Partial) => { setTemplate(prev => ({ ...prev, shifts: prev.shifts.map(shift => shift.id === shiftId ? { ...shift, ...updates } : shift ) })); }; const removeShift = (shiftId: string) => { setTemplate(prev => ({ ...prev, shifts: prev.shifts.filter(shift => shift.id !== shiftId) })); }; // Preview-Daten für die DefaultTemplateView vorbereiten const previewTemplate: TemplateShift = { id: 'preview', name: template.name || 'Vorschau', description: template.description, shifts: template.shifts.map(shift => ({ ...shift, id: shift.id || 'preview-' + Date.now() })), createdBy: 'preview', createdAt: new Date().toISOString(), isDefault: template.isDefault }; if (loading) return
Lade Vorlage...
; return (

{isEditing ? 'Vorlage bearbeiten' : 'Neue Vorlage erstellen'}

{showPreview ? ( ) : ( <>
setTemplate(prev => ({ ...prev, name: e.target.value }))} placeholder="z.B. Standard Woche, Teilzeit Modell, etc." />