"use client"; import type { ColumnDef, ColumnFiltersState, ExpandedState, PaginationState, Row, SortingState, VisibilityState, } from "@tanstack/react-table"; import { flexRender, getCoreRowModel, getExpandedRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from "@tanstack/react-table"; import * as React from "react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@openstatus/ui"; import { cn } from "@/lib/utils"; import { DataTablePagination } from "./data-table-pagination"; import { DataTableToolbar } from "./data-table-toolbar"; interface DataTableProps { columns: ColumnDef[]; data: TData[]; renderSubComponent(props: { row: Row }): React.ReactElement; getRowCanExpand(row: Row): boolean; autoResetExpanded?: boolean; defaultColumnFilters?: ColumnFiltersState; defaultPagination?: PaginationState; defaultVisibility?: VisibilityState; // allowedPeriods?: Period[]; REMIDNER: disabled unallowed periods } export function DataTable({ columns, data, renderSubComponent, getRowCanExpand, autoResetExpanded, defaultColumnFilters = [], defaultPagination = { pageIndex: 0, pageSize: 10 }, defaultVisibility = {}, }: DataTableProps) { const [sorting, setSorting] = React.useState([]); const [columnFilters, setColumnFilters] = React.useState(defaultColumnFilters); const [expanded, setExpanded] = React.useState({}); const [pagination, setPagination] = React.useState(defaultPagination); const [columnVisibility, setColumnVisibility] = React.useState(defaultVisibility); const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel(), onPaginationChange: setPagination, getPaginationRowModel: getPaginationRowModel(), onSortingChange: setSorting, getSortedRowModel: getSortedRowModel(), onColumnFiltersChange: setColumnFilters, getFilteredRowModel: getFilteredRowModel(), onExpandedChange: setExpanded, getExpandedRowModel: getExpandedRowModel(), onColumnVisibilityChange: setColumnVisibility, getRowCanExpand, autoResetExpanded, state: { sorting, columnFilters, expanded, pagination, columnVisibility, }, }); 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) => ( { if (!row.getCanExpand()) return; // REMINDER: this is a workaround for single row expansion if (!row.getIsExpanded()) table.resetExpanded(); row.toggleExpanded(); }} className={cn(row.getCanExpand() && "cursor-pointer")} > {row.getVisibleCells().map((cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext(), )} ))} {row.getIsExpanded() && ( {/* 2nd row is a custom 1 cell row */} {renderSubComponent({ row })} )} )) ) : ( No results. )}
); }