// Adapted from Kibo UI (MIT), with owned React/CSS APIs. See THIRD_PARTY_NOTICES.md. "use client"; import { useState, type ComponentProps } from "react"; import { useReactTable, getCoreRowModel, getSortedRowModel, getFilteredRowModel, getPaginationRowModel, flexRender, type ColumnDef, type SortingState, } from "./_ynrlib/table.js"; export type { ColumnDef } from "./_ynrlib/table.js"; export type DataTableProps = ComponentProps<"div"> & { data: T[]; columns: ColumnDef[]; caption: string; pageSize?: number; searchLabel?: string; }; export function DataTable({ data, columns, caption, pageSize = 10, searchLabel = "Filter rows", className = "", ...props }: DataTableProps) { const [sorting, setSorting] = useState([]); const [filter, setFilter] = useState(""); const table = useReactTable({ data, columns, state: { sorting, globalFilter: filter }, onSortingChange: setSorting, onGlobalFilterChange: setFilter, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), getPaginationRowModel: getPaginationRowModel(), initialState: { pagination: { pageSize: Math.max(1, pageSize) } }, }); return (
{table.getHeaderGroups().map((group) => ( {group.headers.map((header) => ( ))} ))} {table.getRowModel().rows.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( ))} )) ) : ( )}
{caption}
{header.isPlaceholder ? null : header.column.getCanSort() ? ( ) : ( flexRender( header.column.columnDef.header, header.getContext(), ) )}
{flexRender( cell.column.columnDef.cell, cell.getContext(), )}
No results.
Page {table.getState().pagination.pageIndex + 1} of{" "} {Math.max(1, table.getPageCount())}
); }