"use client"; import { useState } from "react"; import { Search } from "lucide-react"; export interface Column { header: string; accessor: (row: T, index: number) => React.ReactNode; className?: string; } interface DataTableProps { data: T[]; columns: Column[]; searchPlaceholder?: string; searchFilter?: (row: T, query: string) => boolean; isLoading?: boolean; getRowClassName?: (row: T) => string; } export function DataTable({ data, columns, searchPlaceholder = "Search...", searchFilter, isLoading, getRowClassName }: DataTableProps) { const [query, setQuery] = useState(""); const filteredData = searchFilter ? data.filter(row => searchFilter(row, query)) : data; return (
{searchFilter && (
setQuery(e.target.value)} className="w-full max-w-sm rounded-lg border border-border bg-card/30 backdrop-blur-sm pl-9 pr-4 py-2.5 text-sm text-white placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary/50 focus:bg-card/50 transition-all shadow-sm" />
)}
{columns.map((col, i) => ( ))} {isLoading ? ( ) : filteredData.length === 0 ? ( ) : ( filteredData.map((row, i) => ( {columns.map((col, j) => ( ))} )) )}
{col.header}
Loading data...
No data found {query && Try adjusting your search query}
{col.accessor(row, i)}
); }