({
columns,
pageSize,
data,
loading,
name,
}: {
columns: ColumnDef<TData>[];
pageSize: number;
data: TData[];
loading: boolean;
name: string;
})
| 32 | }; |
| 33 | |
| 34 | export function useTable<TData>({ |
| 35 | columns, |
| 36 | pageSize, |
| 37 | data, |
| 38 | loading, |
| 39 | name, |
| 40 | }: { |
| 41 | columns: ColumnDef<TData>[]; |
| 42 | pageSize: number; |
| 43 | data: TData[]; |
| 44 | loading: boolean; |
| 45 | name: string; |
| 46 | }) { |
| 47 | const [page, setPage] = useQueryState( |
| 48 | 'page', |
| 49 | parseAsInteger.withDefault(1).withOptions(nuqsOptions), |
| 50 | ); |
| 51 | const [perPage, setPerPage] = useQueryState( |
| 52 | 'perPage', |
| 53 | parseAsInteger.withDefault(pageSize ?? 10).withOptions(nuqsOptions), |
| 54 | ); |
| 55 | const pagination: PaginationState = { |
| 56 | pageIndex: page - 1, |
| 57 | pageSize: perPage, |
| 58 | }; |
| 59 | |
| 60 | const { columnVisibility, setColumnVisibility, columnOrder, setColumnOrder } = |
| 61 | useDataTableColumnVisibility(columns, name); |
| 62 | |
| 63 | const [columnPinning, setColumnPinning] = useState<ColumnPinningState>({ |
| 64 | left: [ |
| 65 | ...columns |
| 66 | .filter((column) => column.meta?.pinned === 'left') |
| 67 | .map((column) => column.id!), |
| 68 | ], |
| 69 | right: columns |
| 70 | .filter((column) => column.meta?.pinned === 'right') |
| 71 | .map((column) => column.id!), |
| 72 | }); |
| 73 | |
| 74 | // Build per-key query parsers based on column metadata |
| 75 | const filterParsers = useMemo(() => { |
| 76 | return columns.reduce< |
| 77 | Record<string, Parser<string> | Parser<string[]> | Parser<number[]>> |
| 78 | >((acc, column) => { |
| 79 | const columnId = (column.id ?? (column as any).accessorKey)?.toString(); |
| 80 | if (!columnId) return acc; |
| 81 | const variant = column.meta?.variant; |
| 82 | |
| 83 | switch (variant) { |
| 84 | case 'text': |
| 85 | case 'number': |
| 86 | acc[columnId] = parseAsString.withDefault(''); |
| 87 | break; |
| 88 | case 'select': |
| 89 | acc[columnId] = parseAsString.withDefault(''); |
| 90 | break; |
| 91 | case 'multiSelect': |
no test coverage detected