'use client'; import { useState } from 'react'; import { Appointment, AppointmentFormData, AppointmentPayload } from '@/types/appointment'; interface AppointmentFormProps { onAdd: (payload: AppointmentPayload) => void; onUpdate: (id: string, payload: AppointmentPayload) => void; editingAppointment: Appointment | null; onCancelEdit: () => void; } const emptyForm: AppointmentFormData = { arztName: '', arztArt: '', terminDatum: '', terminUhrzeit: '', bemerkungen: '', }; // Hilfsfunktionen: ISO-String -> Formularfelder const toDateInput = (iso: string) => { const d = new Date(iso); const y = d.getFullYear(); const m = String(d.getMonth() + 1).padStart(2, '0'); const day = String(d.getDate()).padStart(2, '0'); return `${y}-${m}-${day}`; }; const toTimeInput = (iso: string) => { const d = new Date(iso); const h = String(d.getHours()).padStart(2, '0'); const min = String(d.getMinutes()).padStart(2, '0'); return `${h}:${min}`; }; // Leitet die Formularfelder aus dem zu bearbeitenden Termin ab (oder leer). const buildInitialForm = ( editing: Appointment | null ): AppointmentFormData => editing ? { arztName: editing.arztName, arztArt: editing.arztArt ?? '', terminDatum: toDateInput(editing.termin), terminUhrzeit: toTimeInput(editing.termin), bemerkungen: editing.bemerkungen ?? '', } : emptyForm; export default function AppointmentForm({ onAdd, onUpdate, editingAppointment, onCancelEdit, }: AppointmentFormProps) { // Der Anfangszustand wird aus den Props abgeleitet. Wechselt der zu // bearbeitende Termin, wird die Komponente über einen `key` im Parent // neu gemountet – dadurch entfällt ein setState im Effect. const [formData, setFormData] = useState(() => buildInitialForm(editingAppointment) ); const handleChange = ( e: React.ChangeEvent ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!formData.arztName || !formData.terminDatum || !formData.terminUhrzeit) { alert('Bitte füllen Sie Name, Datum und Uhrzeit aus.'); return; } const termin = new Date( `${formData.terminDatum}T${formData.terminUhrzeit}` ).toISOString(); const payload: AppointmentPayload = { arztName: formData.arztName, arztArt: formData.arztArt, termin, erledigt: editingAppointment ? editingAppointment.erledigt : false, bemerkungen: formData.bemerkungen, }; if (editingAppointment) { onUpdate(editingAppointment.id, payload); } else { onAdd(payload); } }; const inputClass = 'w-full px-2 py-1 text-sm rounded border-2 border-gray-400 bg-white focus:border-blue-500 focus:outline-none'; return (
{editingAppointment && (
ℹ️ Bearbeitungsmodus: Sie bearbeiten einen bestehenden Termin. Klicken Sie auf "Aktualisieren", um die Änderungen zu speichern, oder "Abbrechen", um zur Neuerfassung zurückzukehren.
)}