import React, { useState, useEffect } from 'react'; import { X, Save, Calendar, Clock, MapPin, User, FileText, UserCheck } from 'lucide-react'; import { ScheduleItem, ScheduleItemType, Technician } from '../types'; import { SupabaseService } from '../services/supabaseService'; interface ScheduleItemModalProps { isOpen: boolean; onClose: () => void; onSave: (item: Omit | ScheduleItem) => Promise; initialItem?: ScheduleItem | null; } export const ScheduleItemModal: React.FC = ({ isOpen, onClose, onSave, initialItem }) => { const [technicians, setTechnicians] = useState([]); const [formData, setFormData] = useState({ title: '', customerName: '', technicianName: 'Max Müller', address: '', taskDescription: '', startTime: '08:00', endTime: '10:00', type: 'job' as ScheduleItemType, status: 'Geplant' as 'In Bearbeitung' | 'Geplant' | 'Abgeschlossen' }); const [isSaving, setIsSaving] = useState(false); const [errorMsg, setErrorMsg] = useState(''); useEffect(() => { if (isOpen) { SupabaseService.getTechnicians().then(techs => { setTechnicians(techs); if (!initialItem && techs.length > 0) { setFormData(prev => ({ ...prev, technicianName: techs[0].name })); } }).catch(err => console.error(err)); } }, [isOpen]); useEffect(() => { if (initialItem) { setFormData({ title: initialItem.title || '', customerName: initialItem.customerName || '', technicianName: initialItem.technicianName || 'Max Müller', address: initialItem.address || '', taskDescription: initialItem.taskDescription || '', startTime: initialItem.startTime || '08:00', endTime: initialItem.endTime || '10:00', type: initialItem.type || 'job', status: initialItem.status || 'Geplant' }); } else { setFormData({ title: '', customerName: '', technicianName: technicians.length > 0 ? technicians[0].name : 'Max Müller', address: '', taskDescription: '', startTime: '08:00', endTime: '10:00', type: 'job', status: 'Geplant' }); } setErrorMsg(''); }, [initialItem, isOpen]); if (!isOpen) return null; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.title.trim() || !formData.startTime || !formData.endTime) { setErrorMsg('Bitte Titel, Start- und Endzeit angeben.'); return; } try { setIsSaving(true); setErrorMsg(''); const isInProgress = formData.status === 'In Bearbeitung'; const isCompleted = formData.status === 'Abgeschlossen'; if (initialItem) { await onSave({ ...initialItem, ...formData, isInProgress, isCompleted }); } else { await onSave({ ...formData, isInProgress, isCompleted }); } onClose(); } catch (err: any) { setErrorMsg(err.message || 'Fehler beim Speichern des Termin-Eintrags'); } finally { setIsSaving(false); } }; return (
{/* Header */}

{initialItem ? 'Termineinsatz bearbeiten' : 'Neuen Termineinsatz planen'}

{/* Form Body */}
{errorMsg && (
{errorMsg}
)} {/* Title */}
setFormData({ ...formData, title: e.target.value })} placeholder="z.B. Wartung Heizungsanlage" required style={{ width: '100%', padding: '10px 14px', borderRadius: '8px', border: '1px solid #cbd5e1', fontSize: '0.95rem' }} />
{/* Technician Selection */}
{/* Customer & Address */}
setFormData({ ...formData, customerName: e.target.value })} placeholder="Max Mustermann" style={{ width: '100%', padding: '10px 14px 10px 38px', borderRadius: '8px', border: '1px solid #cbd5e1', fontSize: '0.95rem' }} />
setFormData({ ...formData, address: e.target.value })} placeholder="Musterweg 12" style={{ width: '100%', padding: '10px 14px 10px 38px', borderRadius: '8px', border: '1px solid #cbd5e1', fontSize: '0.95rem' }} />
{/* Times */}
setFormData({ ...formData, startTime: e.target.value })} required style={{ width: '100%', padding: '10px 14px 10px 38px', borderRadius: '8px', border: '1px solid #cbd5e1', fontSize: '0.95rem' }} />
setFormData({ ...formData, endTime: e.target.value })} required style={{ width: '100%', padding: '10px 14px 10px 38px', borderRadius: '8px', border: '1px solid #cbd5e1', fontSize: '0.95rem' }} />
{/* Type & Status */}
{/* Description */}