Spaces:
Configuration error
Configuration error
import { Fragment } from "react"; | |
import { | |
ColumnDef, | |
flexRender, | |
getCoreRowModel, | |
getExpandedRowModel, | |
Row, | |
useReactTable, | |
} from "@tanstack/react-table"; | |
import { | |
Table, | |
TableHead, | |
TableHeaderCell, | |
TableBody, | |
TableRow, | |
TableCell, | |
} from "@tremor/react"; | |
interface DataTableProps<TData, TValue> { | |
data: TData[]; | |
columns: ColumnDef<TData, TValue>[]; | |
renderSubComponent: (props: { row: Row<TData> }) => React.ReactElement; | |
getRowCanExpand: (row: Row<TData>) => boolean; | |
isLoading?: boolean; | |
loadingMessage?: string; | |
noDataMessage?: string; | |
} | |
export function DataTable<TData, TValue>({ | |
data = [], | |
columns, | |
getRowCanExpand, | |
renderSubComponent, | |
isLoading = false, | |
loadingMessage = "🚅 Loading logs...", | |
noDataMessage = "No logs found", | |
}: DataTableProps<TData, TValue>) { | |
const table = useReactTable<TData>({ | |
data, | |
columns, | |
getRowCanExpand, | |
getRowId: (row: TData, index: number) => { | |
const _row: any = row as any; | |
return ( | |
_row?.request_id ?? | |
String(index) | |
); | |
}, | |
getCoreRowModel: getCoreRowModel(), | |
getExpandedRowModel: getExpandedRowModel(), | |
}); | |
return ( | |
<div className="rounded-lg custom-border"> | |
<Table className="[&_td]:py-0.5 [&_th]:py-1"> | |
<TableHead> | |
{table.getHeaderGroups().map((headerGroup) => ( | |
<TableRow key={headerGroup.id}> | |
{headerGroup.headers.map((header) => { | |
return ( | |
<TableHeaderCell key={header.id} className="py-1 h-8"> | |
{header.isPlaceholder ? null : ( | |
flexRender( | |
header.column.columnDef.header, | |
header.getContext() | |
) | |
)} | |
</TableHeaderCell> | |
); | |
})} | |
</TableRow> | |
))} | |
</TableHead> | |
<TableBody> | |
{isLoading ? | |
<TableRow> | |
<TableCell colSpan={columns.length} className="h-8 text-center"> | |
<div className="text-center text-gray-500"> | |
<p>{loadingMessage}</p> | |
</div> | |
</TableCell> | |
</TableRow> | |
: table.getRowModel().rows.length > 0 ? | |
table.getRowModel().rows.map((row) => ( | |
<Fragment key={row.id}> | |
<TableRow className="h-8"> | |
{row.getVisibleCells().map((cell) => ( | |
<TableCell | |
key={cell.id} | |
className="py-0.5 max-h-8 overflow-hidden text-ellipsis whitespace-nowrap" | |
> | |
{flexRender( | |
cell.column.columnDef.cell, | |
cell.getContext() | |
)} | |
</TableCell> | |
))} | |
</TableRow> | |
{row.getIsExpanded() && ( | |
<TableRow> | |
<TableCell colSpan={row.getVisibleCells().length}> | |
{renderSubComponent({ row })} | |
</TableCell> | |
</TableRow> | |
)} | |
</Fragment> | |
)) | |
: <TableRow> | |
<TableCell colSpan={columns.length} className="h-8 text-center"> | |
<div className="text-center text-gray-500"> | |
<p>{noDataMessage}</p> | |
</div> | |
</TableCell> | |
</TableRow> | |
} | |
</TableBody> | |
</Table> | |
</div> | |
); | |
} |