import Link from "next/link"; import { Suspense } from "react"; import { EmployeeFilters } from "@/components/employees/EmployeeFilters"; import { Avatar } from "@/components/ui/Avatar"; import { StatusChip } from "@/components/ui/StatusChip"; import { fmtDate } from "@/lib/format"; import { breadcrumbFor, loadOrgMaps } from "@/lib/org"; import { createClient } from "@/lib/supabase/server"; import type { EmploymentStatus } from "@/lib/supabase/types"; const PAGE_SIZE = 15; type SearchParams = { q?: string; division?: string; status?: string; location?: string; page?: string }; type EmployeesPageProps = { searchParams: Promise; }; function pageHref(params: SearchParams, page: number): string { const sp = new URLSearchParams(); if (params.q) sp.set("q", params.q); if (params.division) sp.set("division", params.division); if (params.status) sp.set("status", params.status); if (params.location) sp.set("location", params.location); sp.set("page", String(page)); return `/employees?${sp.toString()}`; } export default async function EmployeesPage({ searchParams }: EmployeesPageProps) { const params = await searchParams; const supabase = await createClient(); const orgMaps = await loadOrgMaps(supabase); const page = Math.max(1, Number(params.page ?? "1") || 1); const from = (page - 1) * PAGE_SIZE; const to = from + PAGE_SIZE - 1; let query = supabase .from("employees") .select( "id, first_name, last_name, personnel_number, job_title, team_id, division_id, location_id, entry_date, employment_type, weekly_hours, status", { count: "exact" } ) .order("last_name", { ascending: true }) .range(from, to); if (params.q) { const q = params.q.trim(); if (/^\d+$/.test(q)) { query = query.eq("personnel_number", Number(q)); } else { query = query.or(`first_name.ilike.%${q}%,last_name.ilike.%${q}%,job_title.ilike.%${q}%`); } } if (params.division) query = query.eq("division_id", params.division); if (params.status) query = query.eq("status", params.status as EmploymentStatus); if (params.location) query = query.eq("location_id", params.location); const { data: employeesData, count } = await query; const employees = employeesData ?? []; const totalPages = Math.max(1, Math.ceil((count ?? 0) / PAGE_SIZE)); return (

{count ?? 0} Mitarbeiter:innen gefunden

{employees.map((e) => { const { division, team } = breadcrumbFor(orgMaps, e.division_id, e.team_id); const location = e.location_id ? orgMaps.locations.get(e.location_id) : undefined; return ( ); })} {employees.length === 0 && ( )}
Mitarbeiter:in Pers.-Nr. Bereich/Team Standort Eintritt Beschäftigung Status
{e.first_name} {e.last_name}
{e.job_title}
{e.personnel_number}
{division?.name ?? "–"}
{team?.name ?? "–"}
{location?.name ?? "–"} {fmtDate(e.entry_date)} {e.employment_type} · {e.weekly_hours}h
Keine Mitarbeiter:innen gefunden.
{totalPages > 1 && (
{Array.from({ length: totalPages }, (_, i) => i + 1).map((p) => ( {p} ))}
)}
); }