"use client"; import { ReactNode } from "react"; import { Button } from "./index"; import { ChevronLeftIcon, ChevronRightIcon } from "@heroicons/react/24/outline"; interface Column { header: string; accessor: keyof T | ((item: T) => ReactNode); className?: string; align?: 'left' | 'center' | 'right'; } interface DataTableProps { columns: Column[]; data: T[]; isLoading?: boolean; emptyMessage?: string; pagination?: { currentPage: number; totalPages: number; onPageChange: (page: number) => void; totalItems: number; }; onRowClick?: (item: T) => void; selectable?: boolean; selectedIds?: (string | number)[]; onSelectionChange?: (ids: (string | number)[]) => void; } export default function DataTable({ columns, data, isLoading = false, emptyMessage = "Nenhum resultado encontrado.", pagination, onRowClick, selectable = false, selectedIds = [], onSelectionChange }: DataTableProps) { const handleSelectAll = (e: React.ChangeEvent) => { if (!onSelectionChange) return; if (e.target.checked) { onSelectionChange(data.map(item => item.id)); } else { onSelectionChange([]); } }; const handleSelectItem = (id: string | number) => { if (!onSelectionChange) return; if (selectedIds.includes(id)) { onSelectionChange(selectedIds.filter(i => i !== id)); } else { onSelectionChange([...selectedIds, id]); } }; const isAllSelected = data.length > 0 && selectedIds.length === data.length; return (
{selectable && ( )} {columns.map((column, index) => ( ))} {isLoading ? ( Array.from({ length: 3 }).map((_, i) => ( {columns.map((_, j) => ( ))} )) ) : data.length === 0 ? ( ) : ( data.map((item) => { const isSelected = selectedIds.includes(item.id); return ( onRowClick?.(item)} className={`transition-colors group ${isSelected ? 'bg-brand-50/30 dark:bg-brand-500/5' : ''} ${onRowClick ? 'cursor-pointer hover:bg-zinc-50 dark:hover:bg-zinc-800/50' : 'hover:bg-zinc-50/50 dark:hover:bg-zinc-800/30'}`} > {selectable && ( )} {columns.map((column, index) => ( ))} ); }) )}
{column.header}
{emptyMessage}
e.stopPropagation()}>
handleSelectItem(item.id)} className="w-4 h-4 rounded border-zinc-300 text-brand-600 focus:ring-brand-500 cursor-pointer" />
{typeof column.accessor === 'function' ? column.accessor(item) : (item[column.accessor] as ReactNode)}
{pagination && (
Mostrando {data.length} de {pagination.totalItems} resultados
)}
); }