"use client" import { useMemo, useState } from "react" import { ResourcePage } from "@/shared/data-view/resource-page" import { ColumnHeader } from "@/shared/data-view/table-view" import FormDialog from "@/shared/components/form-dialog" import { EmployeeForm } from "@/modules/employees/employee-form" import { EMPLOYEE_ROUTES } from "@garage/api" import type { EmployeesClient } from "@garage/api" import { Avatar, AvatarFallback } from "@/shared/components/ui/avatar" import { Badge } from "@/shared/components/ui/badge" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/shared/components/ui/select" import { useRouter } from "next/navigation" import { formatEnum } from "@/shared/utils/formatters" const TYPE_OPTIONS = [ { value: "all", label: "All types" }, { value: "employee", label: "Employee" }, { value: "sales_person", label: "Sales Person" }, ] function initialsOf(first?: string | null, last?: string | null) { const f = (first ?? "").trim()[0] ?? "" const l = (last ?? "").trim()[0] ?? "" return (f + l).toUpperCase() || "?" } export default function EmployeesPage() { const router = useRouter() const [typeFilter, setTypeFilter] = useState("all") const extraParams = useMemo(() => { if (typeFilter === "all") return undefined return { type: typeFilter } }, [typeFilter]) return ( pageTitle="Employees" routeKey={EMPLOYEE_ROUTES.INDEX} searchable searchPlaceholder="Search employees..." statusFilter={{ statuses: ["active", "inactive"] }} extraParams={extraParams} getClient={(api) => api.employees} onRowClick={(row) => router.push(`/productivity/employees/${(row as any).id}`)} tableHeader={() => (
)} headerProps={({ selectedItem, invalidateQuery }) => ({ actions: ( {(resourceId) => ( )} ), })} columns={({ actionsColumn }) => [ { accessorKey: "first_name", header: ({ column }) => , cell: ({ row }) => { const r = row.original as any const fullName = `${r.first_name ?? ""} ${r.last_name ?? ""}`.trim() || "—" return (
{initialsOf(r.first_name, r.last_name)} {fullName}
) }, }, { accessorKey: "email", header: ({ column }) => , }, { accessorKey: "phone", header: ({ column }) => , cell: ({ row }) => (row.original as any).phone ?? "—", }, { accessorKey: "type", header: ({ column }) => , cell: ({ row }) => { const t = (row.original as any).type if (!t) return "—" return {t === "sales_person" ? "Sales Person" : "Employee"} }, }, { accessorKey: "department", header: ({ column }) => , cell: ({ row }) => { const d = (row.original as any).department?.name return d ? {d} : "—" }, }, { accessorKey: "role", header: ({ column }) => , cell: ({ row }) => { const r = (row.original as any).role?.name return r ? {r} : "—" }, }, { accessorKey: "status", header: ({ column }) => , cell: ({ row }) => { const status = row.original.status return ( {formatEnum(status)} ) }, }, actionsColumn(), ]} /> ) }