import type { VisibilityState, SortingState, ColumnDef, FilterFn, ColumnFiltersState } from '@tanstack/react-table' import { useReactTable, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getFacetedRowModel, getFacetedUniqueValues, flexRender } from '@tanstack/react-table' import { rankItem } from '@tanstack/match-sorter-utils' import { useState } from 'react' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' import { ReloadIcon } from '@radix-ui/react-icons' import DataTableToolbar from './data-table-toolbar' // eslint-disable-next-line @typescript-eslint/no-explicit-any const fuzzyFilter: FilterFn = (row, columnId, value, addMeta) => { // Rank the item const itemRank = rankItem(row.getValue(columnId), value) // Store the itemRank info addMeta({ itemRank }) // Return if the item should be filtered in/out return itemRank.passed } interface DataTableProps { columns: ColumnDef[] data: TData[] isLoading: boolean } const DataTable = ({ columns, data, isLoading }: DataTableProps) => { const [rowSelection, setRowSelection] = useState({}) const [columnVisibility, setColumnVisibility] = useState({}) const [columnFilters, setColumnFilters] = useState([]) const [sorting, setSorting] = useState([ { id: 'type', desc: false } ]) const table = useReactTable({ data, columns, filterFns: { fuzzy: fuzzyFilter }, state: { sorting, columnVisibility, rowSelection, columnFilters }, globalFilterFn: fuzzyFilter, enableRowSelection: true, onRowSelectionChange: setRowSelection, onSortingChange: setSorting, onColumnFiltersChange: setColumnFilters, onColumnVisibilityChange: setColumnVisibility, getCoreRowModel: getCoreRowModel(), getFilteredRowModel: getFilteredRowModel(), getSortedRowModel: getSortedRowModel(), getFacetedRowModel: getFacetedRowModel(), getFacetedUniqueValues: getFacetedUniqueValues() }) 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())} ))} )) ) : isLoading ? ( Loading... ) : ( No results. )}
) } export default DataTable