"use client"; import { ArrowLeft, ArrowRightLeft, Clock, Pencil, RotateCcw, TrendingUp, XCircle } from "lucide-react"; import Link from "next/link"; import { useState } from "react"; import { Avatar } from "@/components/ui/Avatar"; import { Button } from "@/components/ui/Button"; import { StatusChip } from "@/components/ui/StatusChip"; import { fmtFullName, tenure } from "@/lib/format"; import type { OpenPositionResolved } from "@/lib/positions"; import type { Database } from "@/lib/supabase/types"; import { DatenAendernPanel } from "./panels/DatenAendernPanel"; import { KarenzPanel } from "./panels/KarenzPanel"; import { PromotePanel } from "./panels/PromotePanel"; import { RehirePanel } from "./panels/RehirePanel"; import { TerminatePanel } from "./panels/TerminatePanel"; import { TransferPanel } from "./panels/TransferPanel"; import { HistorieTab } from "./tabs/HistorieTab"; import { NotizenTab } from "./tabs/NotizenTab"; import { OrganisationTab } from "./tabs/OrganisationTab"; import { StammdatenTab } from "./tabs/StammdatenTab"; import { VertragTab } from "./tabs/VertragTab"; type EmployeeRow = Database["public"]["Tables"]["employees"]["Row"]; type Location = Database["public"]["Tables"]["locations"]["Row"]; type HistoryRow = Database["public"]["Tables"]["employee_history"]["Row"]; type Dependent = Database["public"]["Tables"]["employee_dependents"]["Row"]; type NoteRow = Database["public"]["Tables"]["employee_notes"]["Row"]; type MiniEmployee = { id: string; first_name: string; last_name: string; job_title: string; status?: string }; /** Die Planstelle, die die Person heute innehat. */ type PlacementInfo = { positionNumber: string; jobTitle: string; isChief: boolean; current: boolean }; type EmployeeDetailProps = { employee: EmployeeRow; placement: PlacementInfo | null; breadcrumb: string; manager: MiniEmployee | null; /** Nur gesetzt, wenn die zuständige Leitung abwesend ist und vertreten wird. */ formalManager: MiniEmployee | null; directReports: MiniEmployee[]; history: HistoryRow[]; dependents: Dependent[]; notes: NoteRow[]; locations: Location[]; openPositions: OpenPositionResolved[]; }; type PanelType = "transfer" | "promote" | "karenz" | "daten" | "terminate" | "rehire" | null; const TABS = ["Stammdaten", "Vertrag", "Organisation", "Historie", "HR-Notizen"] as const; export function EmployeeDetail(props: EmployeeDetailProps) { const { employee, placement, breadcrumb, manager, formalManager, directReports, history, dependents, notes, locations, openPositions } = props; const [tab, setTab] = useState<(typeof TABS)[number]>("Stammdaten"); const [panel, setPanel] = useState(null); const location = locations.find((l) => l.id === employee.location_id); const isActive = employee.status === "Aktiv" || employee.status === "Karenz"; const canEditData = employee.status !== "Ausgetreten"; return (
Zurück zu Mitarbeiter:innen

{fmtFullName(employee.first_name, employee.last_name, employee.title_prefix, employee.title_suffix)}

{placement?.jobTitle ?? employee.job_title}

{breadcrumb} {placement && ( <> {" · Planstelle "} {placement.positionNumber} {placement.isChief && " (Leitung)"} )}

Pers.-Nr. {employee.personnel_number} {employee.status !== "Geplant" && <> · Zugehörigkeit: {tenure(employee.entry_date, employee.exit_date)}}

{isActive && ( <> setPanel("transfer")} /> setPanel("promote")} /> setPanel("karenz")} /> )} {canEditData && setPanel("daten")} />} {isActive && ( )} {employee.status === "Ausgetreten" && ( )}
{/* Tabs, so the list gets the tablist role and each button says whether it is the selected one. */}
{TABS.map((t) => ( ))}
{tab === "Stammdaten" && } {tab === "Vertrag" && } {tab === "Organisation" && ( )} {tab === "Historie" && } {tab === "HR-Notizen" && }
setPanel(null)} employee={employee} openPositions={openPositions} /> setPanel(null)} employee={employee} /> setPanel(null)} employee={employee} /> setPanel(null)} employee={employee} dependents={dependents} locationCountry={location?.country} /> setPanel(null)} employee={employee} directReportCount={directReports.length} /> setPanel(null)} employee={employee} />
); } function ActionButton({ icon: Icon, label, onClick }: { icon: typeof ArrowRightLeft; label: string; onClick: () => void }) { return ( ); }