"use client"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { useParams, useRouter } from "next/navigation"; import { api } from "@/lib/api"; import type { Deadline } from "@/lib/types"; import { Breadcrumb } from "@/components/layout/Breadcrumb"; import { NotesList } from "@/components/notes/NotesList"; import { Skeleton } from "@/components/ui/Skeleton"; import { format, parseISO, formatDistanceToNow, isPast } from "date-fns"; import { de } from "date-fns/locale"; import { AlertTriangle, CheckCircle2, Clock, ExternalLink, } from "lucide-react"; import Link from "next/link"; import { toast } from "sonner"; interface DeadlineDetail extends Deadline { case_number?: string; case_title?: string; } const STATUS_CONFIG: Record< string, { label: string; bg: string; icon: typeof Clock } > = { pending: { label: "Offen", bg: "bg-amber-50 text-amber-700", icon: Clock }, completed: { label: "Erledigt", bg: "bg-emerald-50 text-emerald-700", icon: CheckCircle2, }, overdue: { label: "Ueberfaellig", bg: "bg-red-50 text-red-700", icon: AlertTriangle, }, }; function getEffectiveStatus(d: DeadlineDetail): string { if (d.status === "completed") return "completed"; if (isPast(parseISO(d.due_date))) return "overdue"; return "pending"; } function DetailSkeleton() { return (
); } export default function DeadlineDetailPage() { const { id } = useParams<{ id: string }>(); const router = useRouter(); const queryClient = useQueryClient(); const { data: deadline, isLoading, error, } = useQuery({ queryKey: ["deadline", id], queryFn: () => api.get(`/deadlines/${id}`), }); const completeMutation = useMutation({ mutationFn: () => api.patch(`/deadlines/${id}/complete`), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["deadline", id] }); queryClient.invalidateQueries({ queryKey: ["deadlines"] }); queryClient.invalidateQueries({ queryKey: ["dashboard"] }); toast.success("Frist als erledigt markiert"); }, onError: () => toast.error("Fehler beim Abschliessen der Frist"), }); if (isLoading) return ; if (error || !deadline) { return (

Frist nicht gefunden

Die Frist existiert nicht oder Sie haben keine Berechtigung.

Zurueck zu Fristen
); } const status = getEffectiveStatus(deadline); const config = STATUS_CONFIG[status] ?? STATUS_CONFIG.pending; const StatusIcon = config.icon; const dueDate = parseISO(deadline.due_date); const relativeTime = formatDistanceToNow(dueDate, { addSuffix: true, locale: de, }); return (
{/* Header */}
{config.label}

{deadline.title}

{deadline.description && (

{deadline.description}

)}
{deadline.status !== "completed" && ( )}
{/* Due date */}
Faellig: {format(dueDate, "d. MMMM yyyy", { locale: de })} ({relativeTime})
{deadline.warning_date && (

Warnung am:{" "} {format(parseISO(deadline.warning_date), "d. MMMM yyyy", { locale: de, })}

)} {deadline.original_due_date && deadline.original_due_date !== deadline.due_date && (

Urspruengliches Datum:{" "} {format(parseISO(deadline.original_due_date), "d. MMMM yyyy", { locale: de, })}

)} {deadline.completed_at && (

Erledigt am:{" "} {format(parseISO(deadline.completed_at), "d. MMMM yyyy, HH:mm", { locale: de, })}

)}
{/* Case context */} {deadline.case_id && (

Akte

{deadline.case_number ? `Az. ${deadline.case_number}` : "Verknuepfte Akte"} {deadline.case_title && ` — ${deadline.case_title}`}

Zur Akte
)} {/* Source info */} {deadline.source && deadline.source !== "manual" && (

Quelle

{deadline.source === "calculated" ? "Berechnet" : deadline.source === "caldav" ? "CalDAV Sync" : deadline.source} {deadline.rule_id && ` (Regel: ${deadline.rule_id})`}

)} {/* Notes */}
); }