llama1's picture
Upload 781 files
5da4770 verified
'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>
);
}