import { useEffect, useState } from 'react' import { type SortingState, type VisibilityState, flexRender, getCoreRowModel, getFacetedRowModel, getFacetedUniqueValues, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table' import { cn } from '@/lib/utils' import { type NavigateFn, useTableUrlState } from '@/hooks/use-table-url-state' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { DataTablePagination, DataTableToolbar } from '@/components/data-table' import { roles } from '../data/data' import { type User } from '../data/schema' import { DataTableBulkActions } from './data-table-bulk-actions' import { usersColumns as columns } from './users-columns' type DataTableProps = { data: User[] search: Record navigate: NavigateFn } export function UsersTable({ data, search, navigate }: DataTableProps) { // Local UI-only states const [rowSelection, setRowSelection] = useState({}) const [columnVisibility, setColumnVisibility] = useState({}) const [sorting, setSorting] = useState([]) // Local state management for table (uncomment to use local-only state, not synced with URL) // const [columnFilters, onColumnFiltersChange] = useState([]) // const [pagination, onPaginationChange] = useState({ pageIndex: 0, pageSize: 10 }) // Synced with URL states (keys/defaults mirror users route search schema) const { columnFilters, onColumnFiltersChange, pagination, onPaginationChange, ensurePageInRange, } = useTableUrlState({ search, navigate, pagination: { defaultPage: 1, defaultPageSize: 10 }, globalFilter: { enabled: false }, columnFilters: [ // username per-column text filter { columnId: 'username', searchKey: 'username', type: 'string' }, { columnId: 'status', searchKey: 'status', type: 'array' }, { columnId: 'role', searchKey: 'role', type: 'array' }, ], }) // eslint-disable-next-line react-hooks/incompatible-library const table = useReactTable({ data, columns, state: { sorting, pagination, rowSelection, columnFilters, columnVisibility, }, enableRowSelection: true, onPaginationChange, onColumnFiltersChange, onRowSelectionChange: setRowSelection, onSortingChange: setSorting, onColumnVisibilityChange: setColumnVisibility, getPaginationRowModel: getPaginationRowModel(), getCoreRowModel: getCoreRowModel(), getFilteredRowModel: getFilteredRowModel(), getSortedRowModel: getSortedRowModel(), getFacetedRowModel: getFacetedRowModel(), getFacetedUniqueValues: getFacetedUniqueValues(), }) useEffect(() => { ensurePageInRange(table.getPageCount()) }, [table, ensurePageInRange]) return (
({ ...role })), }, ]} />
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => { return ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext() )} ) })} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext() )} ))} )) ) : ( No results. )}
) }