"use client"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@openstatus/ui/components/ui/table"; import { type ColumnDef, type ColumnFiltersState, type Row, type SortingState, type VisibilityState, flexRender, getCoreRowModel, getExpandedRowModel, getFacetedRowModel, getFacetedUniqueValues, getFilteredRowModel, getSortedRowModel, useReactTable, } from "@tanstack/react-table"; import * as React from "react"; import { Fragment } from "react"; interface DataTableToolbarProps { table: import("@tanstack/react-table").Table; } // trimmed port of apps/dashboard data-table: no pagination/action bar — // play tools render a fixed, small set of rows interface DataTableProps { columns: ColumnDef[]; data: TData[]; rowComponent?: React.ComponentType<{ row: Row }>; toolbarComponent?: React.ComponentType>; onRowClick?: (row: Row) => void; defaultSorting?: SortingState; defaultColumnVisibility?: VisibilityState; defaultColumnFilters?: ColumnFiltersState; emptyState?: React.ReactNode; } export function DataTable({ columns, data, rowComponent, toolbarComponent, onRowClick, defaultSorting = [], defaultColumnVisibility = {}, defaultColumnFilters = [], emptyState = "No results.", }: DataTableProps) { const [columnVisibility, setColumnVisibility] = React.useState(defaultColumnVisibility); const [columnFilters, setColumnFilters] = React.useState(defaultColumnFilters); const [sorting, setSorting] = React.useState(defaultSorting); const table = useReactTable({ data, columns, state: { sorting, columnVisibility, columnFilters, }, onSortingChange: setSorting, onColumnFiltersChange: setColumnFilters, onColumnVisibilityChange: setColumnVisibility, getCoreRowModel: getCoreRowModel(), getFilteredRowModel: getFilteredRowModel(), getSortedRowModel: getSortedRowModel(), getFacetedRowModel: getFacetedRowModel(), getFacetedUniqueValues: getFacetedUniqueValues(), getExpandedRowModel: getExpandedRowModel(), getRowCanExpand: () => Boolean(rowComponent), }); return (
{toolbarComponent ? React.createElement(toolbarComponent, { table }) : null} {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) => ( onRowClick?.(row)} className="data-[state=selected]:bg-muted/50" > {row.getVisibleCells().map((cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext(), )} ))} {row.getIsExpanded() && ( {rowComponent ? React.createElement(rowComponent, { row }) : null} )} )) ) : ( {emptyState} )}
); }