Pobedit4 / client /src /components /ui /data-table.tsx
Karmashek's picture
Upload 128 files
fc1eb7c verified
import * as React from "react";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table";
interface DataTableProps<TData> {
data: TData[];
columns: {
accessorKey: keyof TData | ((row: TData) => any);
header: string;
cell?: (row: TData) => React.ReactNode;
}[];
onRowClick?: (row: TData) => void;
className?: string;
}
export function DataTable<TData>({
data,
columns,
onRowClick,
className,
}: DataTableProps<TData>) {
return (
<div className={`w-full overflow-auto ${className}`}>
<Table>
<TableHeader>
<TableRow>
{columns.map((column, i) => (
<TableHead key={i} className="text-xs font-medium text-gray-500 uppercase tracking-wider">
{column.header}
</TableHead>
))}
</TableRow>
</TableHeader>
<TableBody>
{data.length === 0 ? (
<TableRow>
<TableCell colSpan={columns.length} className="text-center py-6 text-sm text-gray-500">
No data available
</TableCell>
</TableRow>
) : (
data.map((row, i) => (
<TableRow
key={i}
onClick={() => onRowClick?.(row)}
className={onRowClick ? "cursor-pointer hover:bg-gray-50" : ""}
>
{columns.map((column, j) => (
<TableCell key={j} className="whitespace-nowrap">
{column.cell ? (
column.cell(row)
) : (
<div className="text-sm text-gray-900">
{typeof column.accessorKey === "function"
? column.accessorKey(row)
: row[column.accessorKey] !== undefined
? String(row[column.accessorKey])
: ""}
</div>
)}
</TableCell>
))}
</TableRow>
))
)}
</TableBody>
</Table>
</div>
);
}