"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 { ClipboardListIcon, Printer } from 'lucide-react' import { useDocumentPrint } from '@/shared/hooks/use-document-print' import { Badge } from '@/shared/components/ui/badge' import { useRouter } from 'next/navigation' import { formatDate, formatEnum, formatNumber } from '@/shared/utils/formatters' import { useFilterParams } from '@/shared/hooks/use-filter-params' import { FilterDrawer, FilterTrigger } from '@/shared/components/filter-drawer' import { jobCardFilterConfig, JobCardFilterFields } from '@/modules/job-cards/job-card-filters' 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", } export default function JobCardsPage() { const router = useRouter() const filter = useFilterParams(jobCardFilterConfig) const { print, isPrinting } = useDocumentPrint() return ( <> routeKey={JOB_CARD_ROUTES.INDEX} getClient={(api) => api.jobCards} searchable searchPlaceholder="Search job cards..." statusFilter={{ statuses: JobCardStatus }} extraParams={filter.appliedParams} onRowClick={(row) => router.push(`/sales/job-cards/${row.id}`)} headerProps={({ selectedItem, invalidateQuery }) => ({ title: "Job Cards", actions: (
{(resourceId, {close}) => ( { invalidateQuery(); close();}} /> )}
), })} columns={({ actionsColumn }) => [ { accessorKey: "title", header: ({ column }) => , cell: ({ row }) => { const item = row.original as unknown as JobCardItem return (
{item.title}
) }, }, { accessorKey: "order_number", header: ({ column }) => , }, { accessorKey: "check_in_date", header: ({ column }) => , cell: ({ getValue }) => { const val = getValue() return formatDate(val) } }, { accessorKey: "vehicle_id", header: ({ column }) => , cell: ({ row }) => { const item = row.original as unknown as JobCardItem return item.km_in ? formatNumber(item.km_in) : "—" }, }, { accessorKey: "created_at", header: ({ column }) => , cell: ({ row }) => { const item = row.original as unknown as JobCardItem return formatDate(item.created_at) }, }, { accessorKey: "status", header: ({ column }) => , cell: ({ row }) => { const item = row.original as unknown as JobCardItem return ( {formatEnum(item.status)} ) }, }, actionsColumn({ extraItems: (row) => [ { label: isPrinting ? "Printing..." : "Print", icon: Printer, onClick: (r) => print("job_card", String(r.id), "print"), }, ], }), ]} /> { if (!open) filter.close() }} onSubmit={filter.onSubmit} onReset={filter.reset} activeFilterCount={filter.activeFilterCount} title="Filter Job Cards" > ) }