"use client"; import { useState } from "react"; type Column = { key: keyof T | string; header: string; render?: (item: T) => React.ReactNode; className?: string; align?: "left" | "right" | "center"; }; type DataTableProps = { data: T[]; columns: Column[]; keyExtractor: (item: T) => string; emptyMessage?: string; onRowClick?: (item: T) => void; rowClassName?: string; paginate?: boolean; pageSize?: number; }; export default function DataTable({ data, columns, keyExtractor, emptyMessage = "No data found", onRowClick, rowClassName, paginate = false, pageSize = 50, }: DataTableProps) { const [page, setPage] = useState(0); const displayed = paginate ? data.slice(page * pageSize, (page + 1) * pageSize) : data; const totalPages = Math.ceil(data.length / pageSize); const alignClass = (align?: "left" | "right" | "center") => { switch (align) { case "right": return "text-right"; case "center": return "text-center"; default: return "text-left"; } }; return (
{columns.map((col) => ( ))} {displayed.length === 0 ? ( ) : ( displayed.map((item) => ( onRowClick?.(item)} > {columns.map((col) => ( ))} )) )}
{col.header}
{emptyMessage}
{col.render ? col.render(item) : String((item as Record)[col.key as string] ?? "")}
{paginate && totalPages > 1 && (
Page {page + 1} of {totalPages}
)}
); }