|
import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table' |
|
|
|
import { |
|
Table, |
|
TableBody, |
|
TableCell, |
|
TableHead, |
|
TableHeader, |
|
TableRow |
|
} from '@/components/ui/Table' |
|
|
|
interface DataTableProps<TData, TValue> { |
|
columns: ColumnDef<TData, TValue>[] |
|
data: TData[] |
|
} |
|
|
|
export default function DataTable<TData, TValue>({ columns, data }: DataTableProps<TData, TValue>) { |
|
const table = useReactTable({ |
|
data, |
|
columns, |
|
getCoreRowModel: getCoreRowModel() |
|
}) |
|
|
|
return ( |
|
<div className="rounded-md border"> |
|
<Table> |
|
<TableHeader> |
|
{table.getHeaderGroups().map((headerGroup) => ( |
|
<TableRow key={headerGroup.id}> |
|
{headerGroup.headers.map((header) => { |
|
return ( |
|
<TableHead key={header.id}> |
|
{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'}> |
|
{row.getVisibleCells().map((cell) => ( |
|
<TableCell key={cell.id}> |
|
{flexRender(cell.column.columnDef.cell, cell.getContext())} |
|
</TableCell> |
|
))} |
|
</TableRow> |
|
)) |
|
) : ( |
|
<TableRow> |
|
<TableCell colSpan={columns.length} className="h-24 text-center"> |
|
No results. |
|
</TableCell> |
|
</TableRow> |
|
)} |
|
</TableBody> |
|
</Table> |
|
</div> |
|
) |
|
} |
|
|