import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@repo/shadcn-ui/components/table"; import type { Table as TableModel } from "@tanstack/react-table"; import type { EntityColumn } from "./entity-list"; export function EntityTableContent({ table, columns, title, loading, unavailable, message, rowClassName, onSort, }: { table: TableModel; columns: readonly EntityColumn[]; title: string; loading: boolean; unavailable: boolean; message: string; rowClassName: ((item: T) => string) | undefined; onSort: () => void; }) { const visibleColumns = [ ...table.getCenterVisibleLeafColumns(), ...table.getRightVisibleLeafColumns(), ]; const total = table.getFilteredRowModel().rows.length; return ( {visibleColumns.map((column) => { const direction = column.getIsSorted(); return ( {column.getCanSort() ? ( ) : ( String(column.columnDef.header) )} ); })} {loading || unavailable ? ( {message} ) : ( table.getRowModel().rows.map((row) => ( {visibleColumns.map((column) => ( {columns.find((item) => item.id === column.id)?.render(row.original)} ))} )) )} {!(loading || unavailable || total) && ( {message} )}
); } function entityColumnClass(pinned: boolean, header: boolean) { if (pinned) { return header ? "sticky right-0 z-20 w-20 min-w-20 bg-card pr-4 text-right" : "sticky right-0 z-10 h-10 w-20 min-w-20 bg-card px-3 py-3 pr-4 text-right whitespace-nowrap group-hover/entity-row:bg-[color-mix(in_oklch,var(--muted)_50%,var(--card))] group-has-aria-expanded/entity-row:bg-[color-mix(in_oklch,var(--muted)_50%,var(--card))]"; } return header ? "first:min-w-40 bg-background font-medium" : "h-14 first:min-w-40 max-w-lg whitespace-normal break-words px-3 py-3"; }