const FoosTable = (foosTableProps: FoosTableProps) => { // const [sorting, setSorting] = useState([]) const columns = useMemo[]>( () => [ { accessorKey: "name", cell: (info: CellContext) => info.getValue(), header: () => Name, minWidth: 100, }, ], [] ); const [globalFilter, setGlobalFilter] = useState(""); const table = useReactTable({ data: foosTableProps.foos, columns: columns, // Pipeline filterFns: { fuzzy: fuzzyFilter, }, state: { globalFilter, }, onGlobalFilterChange: setGlobalFilter, globalFilterFn: fuzzyFilter, getCoreRowModel: getCoreRowModel(), getFilteredRowModel: getFilteredRowModel(), getSortedRowModel: getSortedRowModel(), getPaginationRowModel: getPaginationRowModel(), debugTable: true, initialState: { pagination: { pageSize: 25, }, }, }); const placeHolder = "🔎 Search"; 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.rank > 1; }; const fuzzySort: SortingFn = (rowA, rowB, columnId) => { let dir = 0; // Only sort by rank if the column has ranking information if (rowA.columnFiltersMeta[columnId]) { dir = compareItems( rowA.columnFiltersMeta[columnId]?.itemRank!, rowB.columnFiltersMeta[columnId]?.itemRank! ); } // Provide an alphanumeric fallback for when the item ranks are equal return dir === 0 ? sortingFns.alphanumeric(rowA, rowB, columnId) : dir; }; return (
setGlobalFilter(String(value))} className="p-1 border rounded-xl" placeholder={placeHolder} size={placeHolder.length} /> {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => { return ( ); })} ))} {table.getRowModel().rows.map((row) => { return ( { foosTableProps.setSelectedFoo(row.original); }} > {row.getVisibleCells().map((cell) => { return ( ); })} ); })}
{header.isPlaceholder ? null : (
{{ asc: '🔼 ', desc: '🔽 ', }[header.column.getIsSorted() as string] ?? null} {flexRender( header.column.columnDef.header, header.getContext() )}
)}
{flexRender( cell.column.columnDef.cell, cell.getContext() )}
Page
{table.getState().pagination.pageIndex + 1} of{" "} {table.getPageCount()}
| Go to page: { const page = e.target.value ? Number(e.target.value) - 1 : 0; table.setPageIndex(page); }} className="border p-1 rounded w-16" />
); }; // A debounced input react component function DebouncedInput({ value: initialValue, onChange, debounce = 50, ...props }: { value: string | number; onChange: (value: string | number) => void; debounce?: number; } & Omit, "onChange">) { const [value, setValue] = useState(initialValue); useEffect(() => { setValue(initialValue); }, [initialValue]); useEffect(() => { const timeout = setTimeout(() => { onChange(value); }, debounce); return () => clearTimeout(timeout); }, [value]); return ( setValue(e.target.value)} /> ); } 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.rank > 1; }; const fuzzySort: SortingFn = (rowA, rowB, columnId) => { let dir = 0; // Only sort by rank if the column has ranking information if (rowA.columnFiltersMeta[columnId]) { dir = compareItems( rowA.columnFiltersMeta[columnId]?.itemRank!, rowB.columnFiltersMeta[columnId]?.itemRank! ); } // Provide an alphanumeric fallback for when the item ranks are equal return dir === 0 ? sortingFns.alphanumeric(rowA, rowB, columnId) : dir; }; export default FoosTable;