'use client' import { ColumnDef, flexRender, getCoreRowModel, useReactTable, SortingState, getSortedRowModel } from '@tanstack/react-table' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table' import { useState } from 'react' interface DataTableProps { columns: ColumnDef[] data: TData[] className?: string onRowClick?: (rowData: TData) => void getRowId?: (row: TData) => string } export function DataTable({ columns, data, className, onRowClick, getRowId }: DataTableProps) { const [sorting, setSorting] = useState([]) const table = useReactTable({ data, columns, state: { sorting }, onSortingChange: setSorting, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getRowId: getRowId || ((row: any) => row.id?.toString() || Math.random().toString()), }) const handleRowClick = (row: TData) => { if (onRowClick) { onRowClick(row) } } return (
{table.getHeaderGroups().map(headerGroup => ( {headerGroup.headers.map(header => ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext() )} ))} ))} {table.getRowModel().rows.length ? ( table.getRowModel().rows.map(row => ( handleRowClick(row.original)} className={onRowClick ? "cursor-pointer hover:bg-accent/50 transition-colors" : ""} data-state={row.getIsSelected() ? "selected" : ""} > {row.getVisibleCells().map(cell => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( No results )}
) }