import React from 'react'; import { Table, TableBody, TableHeader } from '@/components/ui/table'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Package, FileText, AlertTriangle } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Peca } from '@/hooks/usePecas'; import { usePecasTable } from '@/hooks/usePecasTable'; import { TableFilters } from './table/TableFilters'; import { TableActions } from './table/TableActions'; import { TableHeaderSortable } from './table/TableHeaderSortable'; import { PDFGenerator } from './table/PDFGenerator'; import { BatchEditButton } from './table/BatchEditButton'; import { TableRow as PecaTableRow } from './table/TableRow'; import { EmptyState } from './table/EmptyState'; import { toast } from 'sonner'; interface PecasTableProps { pecas: Peca[]; onOpenComponentPopup: (pecaId: string) => void; onDeletePeca?: (pecaId: string) => void; onDeletePecasBatch?: (pecaIds: string[]) => Promise; onEditPeca?: (peca: Peca) => void; onDeleteLastImport?: () => void; onBatchUpdatePecas?: (pecaIds: string[], updates: any) => Promise; onOpenRevisaoPeca?: (peca: Peca) => void; onOpenPainelRevisoes?: () => void; totalRevisoesOF?: number; hasRecentImport: boolean; canEdit?: boolean; canDelete?: boolean; ofNumber?: string; } export function PecasTable({ pecas, onOpenComponentPopup, onDeletePeca, onDeletePecasBatch, onEditPeca, onDeleteLastImport, onBatchUpdatePecas, onOpenRevisaoPeca, onOpenPainelRevisoes, totalRevisoesOF, hasRecentImport, canEdit = true, canDelete = true, ofNumber = '' }: PecasTableProps) { const { ofFilter, setOfFilter, faseFilter, setFaseFilter, pecaFilter, setPecaFilter, descricaoFilter, setDescricaoFilter, priorityFilter, setPriorityFilter, semComponentesFilter, setSemComponentesFilter, sortField, sortOrder, handleSort, filteredAndSortedPecas, selectedPecas, selectAll, handleSelectAll, handleSelectPeca, searchPecasByComponent, pesoTotal } = usePecasTable(pecas); const handleExportCSV = () => { const selectedPecasArray = Array.from(selectedPecas); const pecasToExport = pecas.filter(peca => selectedPecasArray.includes(peca.id)); if (pecasToExport.length === 0) { toast.error('Nenhuma peça selecionada para exportar.'); return; } const csvContent = "data:text/csv;charset=utf-8," + [ Object.keys(pecasToExport[0]).join(','), ...pecasToExport.map(peca => Object.values(peca).join(',')) ].join('\n'); const encodedUri = encodeURI(csvContent); const link = document.createElement("a"); link.setAttribute("href", encodedUri); link.setAttribute("download", "pecas.csv"); document.body.appendChild(link); link.click(); document.body.removeChild(link); }; const handleDeleteSelected = async () => { if (!canDelete || (!onDeletePecasBatch && !onDeletePeca)) { toast.error('Você não tem permissão para excluir peças'); return; } if (window.confirm(`Tem certeza que deseja excluir ${selectedPecas.size} peças selecionadas e seus vínculos?`)) { try { const pecaIdsArray = Array.from(selectedPecas); if (onDeletePecasBatch) { await onDeletePecasBatch(pecaIdsArray); } else if (onDeletePeca) { for (const pecaId of pecaIdsArray) { await onDeletePeca(pecaId); } toast.success('Peças excluídas com sucesso!'); } } catch (error) { console.error('Erro ao excluir peças:', error); } } }; const handleBatchUpdate = async (updates: any) => { if (!canEdit || !onBatchUpdatePecas) { toast.error('Você não tem permissão para editar peças'); throw new Error('Sem permissão'); } const selectedPecasArray = Array.from(selectedPecas); await onBatchUpdatePecas(selectedPecasArray, updates); }; const handleEditPeca = (peca: Peca) => { if (!onEditPeca) { return; } onEditPeca(peca); }; const handleDeletePeca = (pecaId: string) => { if (!canDelete || !onDeletePeca) { toast.error('Você não tem permissão para excluir peças'); return; } onDeletePeca(pecaId); }; const hasActiveFilters = Boolean(ofFilter || faseFilter || pecaFilter || descricaoFilter || priorityFilter !== 'all' || semComponentesFilter !== 'all'); return (
{})} />
{onOpenPainelRevisoes && ( )} {canEdit && onBatchUpdatePecas && ( )}
{filteredAndSortedPecas.length === 0 ? ( ) : (
{filteredAndSortedPecas.map((peca) => ( handleSelectPeca(peca.id, checked)} onEdit={() => handleEditPeca(peca)} onDelete={() => handleDeletePeca(peca.id)} onOpenComponentPopup={() => onOpenComponentPopup(peca.id)} onOpenRevisao={() => onOpenRevisaoPeca?.(peca)} /> ))}
)}
); }