| 'use client'; | |
| import * as React from 'react'; | |
| import { | |
| Table, | |
| TableBody, | |
| TableCell, | |
| TableHead, | |
| TableHeader, | |
| TableRow, | |
| } from '@/components/ui/table'; | |
| import { Button } from '@/components/ui/button'; | |
| import { cn } from '@/lib/utils'; | |
| export interface DataTableColumn<T> { | |
| id: string; | |
| header: string; | |
| accessorKey?: keyof T; | |
| cell?: (item: T) => React.ReactNode; | |
| className?: string; | |
| headerClassName?: string; | |
| width?: string; | |
| } | |
| export interface DataTableProps<T> { | |
| columns: DataTableColumn<T>[]; | |
| data: T[]; | |
| className?: string; | |
| emptyMessage?: string; | |
| onRowClick?: (item: T) => void; | |
| } | |
| export function DataTable<T>({ | |
| columns, | |
| data, | |
| className, | |
| emptyMessage = 'No data available', | |
| onRowClick, | |
| }: DataTableProps<T>) { | |
| return ( | |
| <div className={cn('rounded-md border', className)}> | |
| <Table> | |
| <TableHeader> | |
| <TableRow> | |
| {columns.map((column) => ( | |
| <TableHead | |
| key={column.id} | |
| className={cn(column.headerClassName, column.width, 'text-muted-foreground font-semibold')} | |
| > | |
| {column.header} | |
| </TableHead> | |
| ))} | |
| </TableRow> | |
| </TableHeader> | |
| <TableBody> | |
| {data.length === 0 ? ( | |
| <TableRow> | |
| <TableCell colSpan={columns.length} className="text-center py-8 text-muted-foreground"> | |
| {emptyMessage} | |
| </TableCell> | |
| </TableRow> | |
| ) : ( | |
| data.map((item, index) => ( | |
| <TableRow | |
| key={index} | |
| className={cn( | |
| onRowClick && 'cursor-pointer hover:bg-muted/50', | |
| )} | |
| onClick={() => onRowClick?.(item)} | |
| > | |
| {columns.map((column) => ( | |
| <TableCell | |
| key={column.id} | |
| className={cn(column.className, column.width)} | |
| > | |
| {column.cell | |
| ? column.cell(item) | |
| : column.accessorKey | |
| ? String(item[column.accessorKey] || '') | |
| : '' | |
| } | |
| </TableCell> | |
| ))} | |
| </TableRow> | |
| )) | |
| )} | |
| </TableBody> | |
| </Table> | |
| </div> | |
| ); | |
| } |