deno.land / x / netzo@0.5.16 / components / blocks / table / table.tsx
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174import type { ComponentChildren } from "preact";import { useState } from "preact/hooks";import { type ColumnFiltersState, type ColumnPinningState, type ColumnSort, flexRender, getCoreRowModel, getFacetedRowModel, getFacetedUniqueValues, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, RowData, type RowSelectionState, type SortingState, type Table as TTable, type TableOptions, useReactTable, type VisibilityState,} from "../../../deps/@tanstack/react-table.ts";import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow,} from "../../table.tsx";import { cn } from "../../utils.ts";import type { TableFilter } from "./table-filters.tsx";import type { TableSearch } from "./table-search.tsx";
export * from "../../../deps/@tanstack/react-table.ts";export * from "./table-actions.tsx";export * from "./table-column-cell.tsx";export * from "./table-column-header.tsx";export * from "./table-filters.tsx";export * from "./table-pagination.tsx";export * from "./table-row-actions.tsx";export * from "./table-search.tsx";export * from "./table-view-options.tsx";
declare module "../../../deps/@tanstack/react-table.ts" { interface TableMeta<TData extends RowData> { search?: TableSearch; sorting?: ColumnSort[]; filters?: TableFilter<TData, unknown>[]; // actions: create?: (value: TData) => TData | Promise<TData>; update?: (value: TData) => TData | Promise<TData>; remove?: (value: TData) => TData | Promise<TData>; duplicate?: (value: TData) => TData | Promise<TData>; [k: string]: unknown; }}
export function useTable<TData = unknown>( options: TableOptions<TData>,): TTable<TData> { const [ rowSelection, setRowSelection, ] = useState<RowSelectionState>(options?.initialState?.rowSelection ?? {}); const [ columnVisibility, setColumnVisibility, ] = useState<VisibilityState>(options?.initialState?.columnVisibility ?? {}); const [ columnFilters, setColumnFilters, ] = useState<ColumnFiltersState>(options?.initialState?.columnFilters ?? []); const [ columnPinning, setColumnPinning, ] = useState<ColumnPinningState>({ left: [], right: [], ...options?.initialState?.columnPinning, }); const [ sorting, setSorting, ] = useState<SortingState>(options?.initialState?.sorting ?? []);
const table = useReactTable<TData>({ ...options, data: options.data, columns: options.columns, state: { columnVisibility, rowSelection, columnFilters, columnPinning, sorting, }, enableRowSelection: true, onRowSelectionChange: setRowSelection, onSortingChange: setSorting, onColumnFiltersChange: setColumnFilters, onColumnVisibilityChange: setColumnVisibility, onColumnPinningChange: setColumnPinning, getCoreRowModel: getCoreRowModel(), getFilteredRowModel: getFilteredRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel(), getFacetedRowModel: getFacetedRowModel(), getFacetedUniqueValues: getFacetedUniqueValues(), initialState: { pagination: { pageSize: 25 }, ...options.initialState, }, meta: options?.meta, });
return table;}
export function TableView<TData = unknown>({ table, children }: { table: TTable<TData>; children?: (table: TTable<TData>) => ComponentChildren;}) { if (children) return children(table); return ( <Table> <TableHeader> {table.getHeaderGroups().map((headerGroup) => ( <TableRow key={headerGroup.id}> {headerGroup.headers.map((header) => { return ( <TableHead key={header.id} colSpan={header.colSpan} className="text-center border-r" > {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext(), )} </TableHead> ); })} </TableRow> ))} </TableHeader> <TableBody> {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( <TableRow key={row.id} data-state={row.getIsSelected() && "selected"} className="hover:bg-#dddddd/50 data-[state=selected]:bg-#dddddd dark:hover:bg-#333333/50 dark:data-[state=selected]:bg-#333333" > {row.getVisibleCells().map((cell) => ( <TableCell key={cell.id} className={cn("py-1")}> {flexRender(cell.column.columnDef.cell, cell.getContext())} </TableCell> ))} </TableRow> )) ) : ( <TableRow> <TableCell className="h-24 text-center col-span-full"> No results. </TableCell> </TableRow> )} </TableBody> </Table> );}
Version Info