"use client"; import { useMemo, useState } from "react"; import Link from "next/link"; import { flexRender, getCoreRowModel, getFilteredRowModel, getSortedRowModel, useReactTable, type ColumnDef, type SortingState, } from "@tanstack/react-table"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Input } from "@/components/ui/input"; import { Skeleton } from "@/components/ui/skeleton"; import { Badge } from "@/components/ui/badge"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { StatusBadge } from "@/components/cases/status-badge"; import { isBlamSubtype } from "@/lib/practice-area"; import type { Case } from "@/lib/api/cases"; function formatDate(iso?: string) { if (!iso) return "—"; try { return new Date(iso).toLocaleDateString("he-IL", { day: "2-digit", month: "2-digit", year: "numeric", }); } catch { return iso; } } const columns: ColumnDef[] = [ { accessorKey: "case_number", header: "מס׳ ערר", cell: ({ row }) => ( {row.original.case_number} ), }, { accessorKey: "title", header: "כותרת", cell: ({ row }) => (
{(row.original.proceeding_type === 'בל"מ' || isBlamSubtype(row.original.appeal_subtype)) && ( בל"מ )} {row.original.title}
), }, { accessorKey: "status", header: "סטטוס", cell: ({ row }) => , }, { accessorKey: "document_count", header: "מסמכים", cell: ({ row }) => ( {row.original.document_count ?? "—"} ), }, { accessorKey: "updated_at", header: "עודכן", cell: ({ row }) => ( {formatDate(row.original.updated_at)} ), }, ]; export function CasesTable({ cases, loading, error, emptyText = "עדיין אין תיקי ערר", searchPlaceholder = "חיפוש לפי מס׳ ערר או כותרת…", }: { cases?: Case[]; loading?: boolean; error?: Error | null; emptyText?: string; searchPlaceholder?: string; }) { const [sorting, setSorting] = useState([ { id: "updated_at", desc: true }, ]); const [globalFilter, setGlobalFilter] = useState(""); /* "all" = all cases; "blam" = only בל"מ; "regular" = exclude בל"מ */ const [blamFilter, setBlamFilter] = useState<"all" | "blam" | "regular">("all"); const data = useMemo(() => { const all = cases ?? []; const isBlam = (c: Case) => c.proceeding_type === 'בל"מ' || isBlamSubtype(c.appeal_subtype); if (blamFilter === "blam") return all.filter(isBlam); if (blamFilter === "regular") return all.filter((c) => !isBlam(c)); return all; }, [cases, blamFilter]); const table = useReactTable({ data, columns, state: { sorting, globalFilter }, onSortingChange: setSorting, onGlobalFilterChange: setGlobalFilter, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), globalFilterFn: (row, _colId, filterValue: string) => { if (!filterValue) return true; const needle = filterValue.toLowerCase(); return ( row.original.case_number.toLowerCase().includes(needle) || row.original.title.toLowerCase().includes(needle) ); }, }); return (
setGlobalFilter(e.target.value)} placeholder={searchPlaceholder} className="max-w-sm bg-surface" dir="rtl" /> {table.getFilteredRowModel().rows.length} תיקים
{table.getHeaderGroups().map((hg) => ( {hg.headers.map((header) => ( {flexRender(header.column.columnDef.header, header.getContext())} {{ asc: " ▲", desc: " ▼" }[header.column.getIsSorted() as string] ?? ""} ))} ))} {loading ? ( Array.from({ length: 4 }).map((_, i) => ( {columns.map((_c, j) => ( ))} )) ) : error ? ( שגיאה בטעינת תיקים: {error.message} ) : table.getRowModel().rows.length === 0 ? (
{globalFilter ? "אין תיקים תואמים לחיפוש" : emptyText}
) : ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) )}
); }