import { useEffect, useState } from 'react' import { getRouteApi } from '@tanstack/react-router' import { type SortingState, type VisibilityState, flexRender, getCoreRowModel, getFacetedRowModel, getFacetedUniqueValues, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table' import { cn } from '@/lib/utils' import { 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 { priorities, statuses } from '../data/data' import { type Task } from '../data/schema' import { DataTableBulkActions } from './data-table-bulk-actions' import { tasksColumns as columns } from './tasks-columns' const route = getRouteApi('/_authenticated/tasks/') type DataTableProps = { data: Task[] } export function TasksTable({ data }: DataTableProps) { // Local UI-only states const [rowSelection, setRowSelection] = useState({}) const [sorting, setSorting] = useState([]) const [columnVisibility, setColumnVisibility] = useState({}) // Local state management for table (uncomment to use local-only state, not synced with URL) // const [globalFilter, onGlobalFilterChange] = useState('') // const [columnFilters, onColumnFiltersChange] = useState([]) // const [pagination, onPaginationChange] = useState({ pageIndex: 0, pageSize: 10 }) // Synced with URL states (updated to match route search schema defaults) const { globalFilter, onGlobalFilterChange, columnFilters, onColumnFiltersChange, pagination, onPaginationChange, ensurePageInRange, } = useTableUrlState({ search: route.useSearch(), navigate: route.useNavigate(), pagination: { defaultPage: 1, defaultPageSize: 10 }, globalFilter: { enabled: true, key: 'filter' }, columnFilters: [ { columnId: 'status', searchKey: 'status', type: 'array' }, { columnId: 'priority', searchKey: 'priority', type: 'array' }, ], }) // eslint-disable-next-line react-hooks/incompatible-library const table = useReactTable({ data, columns, state: { sorting, columnVisibility, rowSelection, columnFilters, globalFilter, pagination, }, enableRowSelection: true, onRowSelectionChange: setRowSelection, onSortingChange: setSorting, onColumnVisibilityChange: setColumnVisibility, globalFilterFn: (row, _columnId, filterValue) => { const id = String(row.getValue('id')).toLowerCase() const title = String(row.getValue('title')).toLowerCase() const searchValue = String(filterValue).toLowerCase() return id.includes(searchValue) || title.includes(searchValue) }, getCoreRowModel: getCoreRowModel(), getFilteredRowModel: getFilteredRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel(), getFacetedRowModel: getFacetedRowModel(), getFacetedUniqueValues: getFacetedUniqueValues(), onPaginationChange, onGlobalFilterChange, onColumnFiltersChange, }) const pageCount = table.getPageCount() useEffect(() => { ensurePageInRange(pageCount) }, [pageCount, ensurePageInRange]) return (
{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. )}
) }