import { useState } from 'react'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Search, ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react'; import { cn } from '@/lib/utils'; export interface Column { key: string; header: string; cell: (item: T) => React.ReactNode; sortable?: boolean; className?: string; } interface DataTableProps { data: T[]; columns: Column[]; searchPlaceholder?: string; searchKey?: keyof T; onRowClick?: (item: T) => void; isLoading?: boolean; emptyMessage?: string; pageSize?: number; } export function DataTable({ data, columns, searchPlaceholder = 'Pesquisar...', searchKey, onRowClick, isLoading = false, emptyMessage = 'Nenhum registro encontrado', pageSize: initialPageSize = 10, }: DataTableProps) { const [search, setSearch] = useState(''); const [currentPage, setCurrentPage] = useState(1); const [pageSize, setPageSize] = useState(initialPageSize); const filteredData = searchKey ? data.filter((item) => String(item[searchKey]) .toLowerCase() .includes(search.toLowerCase()) ) : data; const totalPages = Math.ceil(filteredData.length / pageSize); const startIndex = (currentPage - 1) * pageSize; const paginatedData = filteredData.slice(startIndex, startIndex + pageSize); const handlePageChange = (page: number) => { setCurrentPage(Math.min(Math.max(1, page), totalPages)); }; if (isLoading) { return (

Carregando dados...

); } return (
{/* Search and filters */}
{ setSearch(e.target.value); setCurrentPage(1); }} className="pl-9" />
{filteredData.length} registros
{/* Table */}
{columns.map((column) => ( {column.header} ))} {paginatedData.length === 0 ? ( {emptyMessage} ) : ( paginatedData.map((item) => ( onRowClick?.(item)} > {columns.map((column) => ( {column.cell(item)} ))} )) )}
{/* Pagination */} {filteredData.length > 0 && (
Linhas por página:
Página {currentPage} de {totalPages}
)}
); }