← back to Omega Watches 2
src/components/ui/DataTable.tsx
75 lines
'use client';
import { cn } from '@/lib/utils';
interface Column<T> {
key: string;
header: string;
render?: (row: T) => React.ReactNode;
className?: string;
}
interface DataTableProps<T> {
columns: Column<T>[];
data: T[];
onRowClick?: (row: T) => void;
emptyMessage?: string;
}
export default function DataTable<T extends Record<string, any>>({
columns,
data,
onRowClick,
emptyMessage = 'No data available',
}: DataTableProps<T>) {
if (!data?.length) {
return (
<div className="bg-navy-800/50 rounded-xl border border-navy-700 p-8 text-center">
<p className="text-navy-400">{emptyMessage}</p>
</div>
);
}
return (
<div className="bg-navy-800/50 rounded-xl border border-navy-700 overflow-hidden">
<div className="overflow-x-auto">
<table className="w-full">
<thead>
<tr className="border-b border-navy-700">
{columns.map((col) => (
<th
key={col.key}
className={cn(
'px-4 py-3 text-left text-xs uppercase tracking-wider text-navy-400 font-medium',
col.className
)}
>
{col.header}
</th>
))}
</tr>
</thead>
<tbody className="divide-y divide-navy-700/50">
{data.map((row, i) => (
<tr
key={i}
onClick={() => onRowClick?.(row)}
className={cn(
'hover:bg-navy-800/80 transition-colors',
onRowClick && 'cursor-pointer'
)}
>
{columns.map((col) => (
<td key={col.key} className={cn('px-4 py-3 text-sm text-navy-200', col.className)}>
{col.render ? col.render(row) : row[col.key]}
</td>
))}
</tr>
))}
</tbody>
</table>
</div>
</div>
);
}