"use client"; import { useQuery } from "@tanstack/react-query"; import { useParams, usePathname } from "next/navigation"; import Link from "next/link"; import { api } from "@/lib/api"; import type { Case } from "@/lib/types"; import { Breadcrumb } from "@/components/layout/Breadcrumb"; import { Skeleton } from "@/components/ui/Skeleton"; import { ArrowLeft, Activity, Clock, FileText, Users, UserCheck, StickyNote, AlertTriangle, ScrollText, Brain, } from "lucide-react"; import { format } from "date-fns"; import { de } from "date-fns/locale"; interface CaseDetail extends Case { parties: unknown[]; deadlines_count: number; } const STATUS_BADGE: Record = { active: "bg-emerald-50 text-emerald-700", pending: "bg-amber-50 text-amber-700", closed: "bg-neutral-100 text-neutral-600", archived: "bg-neutral-100 text-neutral-400", }; const STATUS_LABEL: Record = { active: "Aktiv", pending: "Anhaengig", closed: "Geschlossen", archived: "Archiviert", }; const TABS = [ { segment: "verlauf", label: "Verlauf", icon: Activity }, { segment: "fristen", label: "Fristen", icon: Clock }, { segment: "dokumente", label: "Dokumente", icon: FileText }, { segment: "parteien", label: "Parteien", icon: Users }, { segment: "mitarbeiter", label: "Mitarbeiter", icon: UserCheck }, { segment: "notizen", label: "Notizen", icon: StickyNote }, { segment: "protokoll", label: "Protokoll", icon: ScrollText }, { segment: "ki", label: "KI", icon: Brain }, ] as const; const TAB_LABELS: Record = { verlauf: "Verlauf", fristen: "Fristen", dokumente: "Dokumente", parteien: "Parteien", mitarbeiter: "Mitarbeiter", notizen: "Notizen", protokoll: "Protokoll", ki: "KI", }; function CaseDetailSkeleton() { return (
{[1, 2, 3, 4, 5].map((i) => ( ))}
{[1, 2, 3].map((i) => ( ))}
); } export default function CaseDetailLayout({ children, }: { children: React.ReactNode; }) { const { id } = useParams<{ id: string }>(); const pathname = usePathname(); const { data: caseDetail, isLoading, error, } = useQuery({ queryKey: ["case", id], queryFn: () => api.get(`/cases/${id}`), }); // Determine active tab from pathname const segments = pathname.split("/"); const activeSegment = segments[segments.length - 1] || "verlauf"; const activeTabLabel = TAB_LABELS[activeSegment]; if (isLoading) { return ; } if (error || !caseDetail) { return (

Akte nicht gefunden

Die Akte existiert nicht oder Sie haben keine Berechtigung.

Zurueck zu Akten
); } const breadcrumbItems = [ { label: "Dashboard", href: "/dashboard" }, { label: "Akten", href: "/cases" }, { label: caseDetail.case_number, href: `/cases/${id}/verlauf` }, ...(activeTabLabel ? [{ label: activeTabLabel }] : []), ]; const partiesCount = Array.isArray(caseDetail.parties) ? caseDetail.parties.length : 0; return (

{caseDetail.title}

{STATUS_LABEL[caseDetail.status] ?? caseDetail.status}
Az. {caseDetail.case_number} {caseDetail.case_type && {caseDetail.case_type}} {caseDetail.court && {caseDetail.court}} {caseDetail.court_ref && ({caseDetail.court_ref})}

Erstellt:{" "} {format(new Date(caseDetail.created_at), "d. MMM yyyy", { locale: de, })}

Aktualisiert:{" "} {format(new Date(caseDetail.updated_at), "d. MMM yyyy", { locale: de, })}

{caseDetail.ai_summary && (
{caseDetail.ai_summary}
)}
{children}
); }