import { useState } from 'react'; import { ChevronLeft, ChevronRight, Search, Filter, MoreHorizontal, } from 'lucide-react'; import { clsx } from 'clsx'; interface Column { key: keyof T; title: string; render?: (value: any, item: T) => React.ReactNode; sortable?: boolean; width?: string; } interface DataTableProps { data: T[]; columns: Column[]; loading?: boolean; pagination?: { page: number; limit: number; total: number; onPageChange: (page: number) => void; onLimitChange: (limit: number) => void; }; searchable?: boolean; onSearch?: (query: string) => void; emptyMessage?: string; actions?: { render: (item: T) => React.ReactNode; }; } function DataTable({ data, columns, loading, pagination, searchable, onSearch, emptyMessage = 'No data available', actions, }: DataTableProps) { const [searchQuery, setSearchQuery] = useState(''); const [sortColumn, setSortColumn] = useState(null); const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc'); const handleSort = (column: Column) => { if (!column.sortable) return; const newDirection = sortColumn === column.key && sortDirection === 'asc' ? 'desc' : 'asc'; setSortColumn(column.key as string); setSortDirection(newDirection); }; const handleSearch = (query: string) => { setSearchQuery(query); onSearch?.(query); }; const totalPages = pagination ? Math.ceil(pagination.total / pagination.limit) : 1; const renderCellValue = (column: Column, item: T) => { const value = item[column.key]; if (column.render) { return column.render(value, item); } return value !== null && value !== undefined ? String(value) : '-'; }; return (
{/* Header */}
{searchable && (
handleSearch(e.target.value)} className="input-field pl-10" />
)}
{pagination && ( )}
{/* Table */}
{loading ? (
Loading...
) : data.length === 0 ? (
{emptyMessage}
) : ( {columns.map((column) => ( ))} {actions && } {data.map((item, index) => ( {columns.map((column) => ( ))} {actions && ( )} ))}
handleSort(column)} >
{column.title} {column.sortable && sortColumn === column.key && ( {sortDirection === 'asc' ? '↑' : '↓'} )}
{renderCellValue(column, item)} {actions.render(item)}
)}
{/* Pagination */} {pagination && totalPages > 1 && (

Showing{' '} {(pagination.page - 1) * pagination.limit + 1} {' '} to{' '} {Math.min(pagination.page * pagination.limit, pagination.total)} {' '} of{' '} {pagination.total} results

)}
); } export default DataTable;