"use client"; import { useState, useTransition } from "react"; import { useRouter } from "next/navigation"; import { Pencil, Undo2 } from "lucide-react"; import { AbsenceReason } from "@prisma/client"; import { toast } from "sonner"; import { deleteAbsence, updateAbsence } from "@/actions/absences"; import { absenceDate, canEditOwnAbsence } from "@/lib/absence-policy"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; export type ManagedAbsence = { id: string; childName: string; startDate: string; endDate: string; reason: AbsenceReason; note: string | null; updatedAt: string; }; export function AbsenceManagementActions({ absence, today, team = false, onChanged, }: { absence: ManagedAbsence; today: string; team?: boolean; onChanged?: () => void; }) { const [mode, setMode] = useState<"edit" | "withdraw" | null>(null); const [pending, startTransition] = useTransition(); const [error, setError] = useState(null); const [startDate, setStartDate] = useState(absence.startDate); const [endDate, setEndDate] = useState(absence.endDate); const router = useRouter(); if (!team && !canEditOwnAbsence(absence.startDate, today)) return (

Bereits begonnene Meldung: Änderungen über die Kita.

); const tomorrow = new Date(absenceDate(today).getTime() + 86_400_000) .toISOString() .slice(0, 10); function open(next: "edit" | "withdraw") { setStartDate(absence.startDate); setEndDate(absence.endDate); setError(null); setMode(next); } function submit(data?: FormData) { startTransition(async () => { try { const identity = { id: absence.id, updatedAt: absence.updatedAt }; const result = mode === "withdraw" ? await deleteAbsence(identity) : await updateAbsence({ ...identity, startDate, endDate, reason: String(data?.get("reason") ?? ""), note: String(data?.get("note") ?? ""), }); if (result.error) { setError(result.error); return; } toast.success( mode === "withdraw" ? "Abwesenheitsmeldung zurückgenommen." : "Abwesenheitsmeldung aktualisiert.", ); setMode(null); onChanged?.(); } catch { setError( "Die Meldung konnte nicht gespeichert werden. Bitte erneut versuchen.", ); } }); } return (
{ if (!isOpen && !pending) setMode(null); }} > {mode === "withdraw" ? "Abwesenheit zurücknehmen" : "Abwesenheit bearbeiten"} {absence.childName} {mode === "withdraw" ? ": Diese Meldung wird aus der Abwesenheitsübersicht entfernt." : ": Passe den Zeitraum, den Grund oder die Bemerkung an."} {!team && mode === "edit" ? " Änderungen sind nur für zukünftige Tage möglich." : ""}
{ event.preventDefault(); submit(new FormData(event.currentTarget)); }} > {mode === "edit" && (
{ const value = event.target.value; setStartDate(value); if (value > endDate) setEndDate(value); }} />
setEndDate(event.target.value)} />