"use client" import { ResourcePage } from '@/shared/data-view/resource-page' import { ColumnHeader } from '@/shared/data-view/table-view' import FormDialog from '@/shared/components/form-dialog' import { JobCardForm } from '@/modules/job-cards/job-card-form' import { JOB_CARD_ROUTES, JobCardStatus } from '@garage/api' import type { JobCardsClient } from '@garage/api' import { Tabs, TabsList, TabsTrigger } from '@/shared/components/ui/tabs' import { ClipboardListIcon, SearchIcon } from 'lucide-react' import { Badge } from '@/shared/components/ui/badge' import { Input } from '@/shared/components/ui/input' import { useRouter } from 'next/navigation' import { useState, useEffect } from 'react' type JobCardItem = { id: number title?: string status?: string check_in_date?: string km_in?: number created_at?: string } const statusColorMap: Record = { draft: "secondary", check_in: "default", in_progress: "default", completed: "default", invoiced: "outline", cancelled: "destructive", } const formatStatus = (status?: string) => { if (!status) return "—" return status .split("_") .map((w) => w.charAt(0).toUpperCase() + w.slice(1)) .join(" ") } export default function JobCardsPage() { const router = useRouter() const [searchInput, setSearchInput] = useState("") const [search, setSearch] = useState("") const [statusFilter, setStatusFilter] = useState("all") useEffect(() => { const timer = setTimeout(() => setSearch(searchInput), 400) return () => clearTimeout(timer) }, [searchInput]) const extraParams: Record = {} if (search) extraParams.search = search if (statusFilter !== "all") extraParams.status = statusFilter return ( pageTitle="Job Cards" routeKey={JOB_CARD_ROUTES.INDEX} getClient={(api) => api.jobCards} extraParams={extraParams} onRowClick={(row) => router.push(`/sales/job-cards/${row.id}`)} headerProps={({ selectedItem, invalidateQuery }) => ({ actions: ( {(resourceId) => ( )} ), })} columns={({ actionsColumn }) => [ { accessorKey: "title", header: ({ column }) => , cell: ({ row }) => { const item = row.original as unknown as JobCardItem return (
{item.title}
) }, }, { accessorKey: "status", header: ({ column }) => , cell: ({ row }) => { const item = row.original as unknown as JobCardItem return ( {formatStatus(item.status)} ) }, }, { accessorKey: "check_in_date", header: ({ column }) => , }, { accessorKey: "km_in", header: ({ column }) => , cell: ({ row }) => { const item = row.original as unknown as JobCardItem return item.km_in ? Number(item.km_in).toLocaleString() : "—" }, }, { accessorKey: "created_at", header: ({ column }) => , cell: ({ row }) => { const item = row.original as unknown as JobCardItem return item.created_at ? new Date(item.created_at).toLocaleDateString() : "—" }, }, actionsColumn(), ]} toolbar={
setSearchInput(e.target.value)} className="pl-8" />
} tableHeader={ All {JobCardStatus.map((status) => ( {formatStatus(status)} ))} } /> ) }