'use client'; import { useState } from 'react'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Search, ArrowUpDown, ArrowUp, ArrowDown, Loader2 } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; import { Skeleton } from '@/components/ui/skeleton'; interface Column { key: string; label: string; sortable?: boolean; render?: (value: any, row: any) => React.ReactNode; } interface DataTableProps { columns: Column[]; data: any[]; totalCount: number; page: number; pageSize: number; onPageChange: (page: number) => void; onSort?: (column: string, direction: 'asc' | 'desc') => void; onSearch?: (query: string) => void; onRowClick?: (row: any) => void; isLoading?: boolean; } export default function DataTable({ columns, data, totalCount, page, pageSize, onPageChange, onSort, onSearch, onRowClick, isLoading = false, }: DataTableProps) { const [searchQuery, setSearchQuery] = useState(''); const [sortColumn, setSortColumn] = useState(null); const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc'); const totalPages = Math.ceil(totalCount / pageSize); const handleSort = (columnKey: string) => { if (!onSort) return; const newDirection = sortColumn === columnKey && sortDirection === 'asc' ? 'desc' : 'asc'; setSortColumn(columnKey); setSortDirection(newDirection); onSort(columnKey, newDirection); }; const handleSearch = () => { if (onSearch) { onSearch(searchQuery); } }; return (
{/* Search Bar */} {onSearch && (
setSearchQuery(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSearch()} className="pl-10" />
)} {/* Table */}
{columns.map((column) => ( {column.sortable ? ( ) : ( column.label )} ))} {isLoading ? ( Array.from({ length: 5 }).map((_, index) => ( {columns.map((column) => ( ))} )) ) : data.length === 0 ? (

No data found

Try adjusting your search or filters

) : ( data.map((row, index) => ( onRowClick?.(row)} > {columns.map((column) => ( {column.render ? column.render(row[column.key], row) : row[column.key]} ))} )) )}
{/* Pagination */}
Showing {Math.min((page - 1) * pageSize + 1, totalCount)} to{' '} {Math.min(page * pageSize, totalCount)} of{' '} {totalCount} results
Page {page} of {totalPages || 1}
); }