Review

Stable columns for customs hold release grid

Bonded warehouse clerks reported sort and filter on the customs hold release grid flickering or resetting mid-click. Columns were rebuilt every render (and previously memoized against sorting state). Memoizes ColumnDef with stable deps and wires sorting/columnFilters through useReactTable so order and filters stick.

ReactTier 2reacttanstack-tablememo

Click a line to flag it, pick one or more labels, then submit. If the change looks correct, approve it.

components/warehouse/CustomsHoldReleaseTable.tsx+8-5
3434type HoldRow = {
3535 id: string;
3636 entryNumber: string;
3737 daysOnHold: number;
3838 status: "pending" | "cleared" | "seized";
3939};
4040
4141export function CustomsHoldReleaseTable({ rows }: { rows: HoldRow[] }) {
4242 const [sorting, setSorting] = useState<SortingState>([]);
4343 const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);
4444
45- const columns: ColumnDef<HoldRow>[] = [
46- { accessorKey: "entryNumber", header: "Entry #" },
47- { accessorKey: "daysOnHold", header: "Days on hold" },
48- { accessorKey: "status", header: "Status", filterFn: "equalsString" },
49- ];
45+ const columns = useMemo<ColumnDef<HoldRow>[]>(
46+ () => [
47+ { accessorKey: "entryNumber", header: "Entry #" },
48+ { accessorKey: "daysOnHold", header: "Days on hold" },
49+ { accessorKey: "status", header: "Status", filterFn: "equalsString" },
50+ ],
51+ [],
52+ );
5053
5154 const table = useReactTable({
5255 data: rows,
5356 columns,
5457 state: { sorting, columnFilters },
5558 onSortingChange: setSorting,
5659 onColumnFiltersChange: setColumnFilters,
5760 getCoreRowModel: getCoreRowModel(),
5861 getSortedRowModel: getSortedRowModel(),
5962 getFilteredRowModel: getFilteredRowModel(),
6063 });