import React, { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { ArrowLeft, Plus, Package } from 'lucide-react'; import { PecaForm } from '@/components/pecas/PecaForm'; import { PecasTable } from '@/components/pecas/PecasTable'; import { ComponentesPopup } from '@/components/pecas/ComponentesPopup'; import { RevisaoPecaModal } from '@/components/pecas/revisoes/RevisaoPecaModal'; import { PainelRevisoesOFModal } from '@/components/pecas/revisoes/PainelRevisoesOFModal'; import { usePecas, Peca } from '@/hooks/usePecas'; import { useRevisoes } from '@/hooks/useRevisoes'; import { toast } from 'sonner'; import { usePermissionControl } from '@/hooks/usePermissionControl'; import { StandardPageLayout } from '@/components/layout/StandardPageLayout'; export default function CadastroPecasFiltrado() { const { ofNumber } = useParams<{ ofNumber: string }>(); const navigate = useNavigate(); const ofSelecionada = ofNumber || ''; const { canCreate, canEdit, canDelete } = usePermissionControl(); const { pecas, loading, ofNumbers, savePeca, updatePeca, deletePeca, deletePecasBatch, importCSV, importPecas, undoLastImport, deleteLastImport, hasRecentImport, batchUpdatePecas, loadPecas } = usePecas(); const { revisoes: revisoesOF, carregarRevisoesOF } = useRevisoes(ofSelecionada); const [saving, setSaving] = useState(false); const [editingPeca, setEditingPeca] = useState(null); const [showForm, setShowForm] = useState(false); const [selectedPecaForPopup, setSelectedPecaForPopup] = useState(null); const [pecaParaRevisao, setPecaParaRevisao] = useState(null); const [showPainelRevisoes, setShowPainelRevisoes] = useState(false); // Filtrar peças pela OF selecionada const pecasFiltradas = pecas.filter(peca => peca.of_number === ofSelecionada); const handleSave = async (formData: any) => { if (!canCreate()) return false; setSaving(true); try { const pecaComOF = { ...formData, of_number: ofSelecionada }; const success = await savePeca(pecaComOF); if (success) { setShowForm(false); loadPecas(); } return success; } finally { setSaving(false); } }; const handleUpdate = async (id: string, formData: any) => { if (!canEdit()) return false; setSaving(true); try { const pecaComOF = { ...formData, of_number: ofSelecionada }; const success = await updatePeca(id, pecaComOF); if (success) { setEditingPeca(null); setShowForm(false); loadPecas(); } return success; } finally { setSaving(false); } }; const handleDelete = async (pecaId: string) => { if (!canDelete()) return; if (confirm('Tem certeza que deseja apagar esta peça e seus vínculos?')) { const success = await deletePeca(pecaId); if (success) { loadPecas(); } } }; const handleDeleteBatch = async (pecaIds: string[]) => { if (!canDelete()) return; const success = await deletePecasBatch(pecaIds); if (success) { loadPecas(); } }; const handleEdit = (peca: Peca) => { if (!canEdit()) return; setEditingPeca(peca); setShowForm(true); }; const handleCancelEdit = () => { setEditingPeca(null); setShowForm(false); }; const handleDeleteLastImport = async () => { if (!canDelete()) return; if (confirm('Tem certeza que deseja apagar todas as peças da última importação?')) { await deleteLastImport(); loadPecas(); } }; const handleOpenComponentPopup = (pecaId: string) => { const found = pecas.find(p => p.id === pecaId); if (found) { setSelectedPecaForPopup(found); } else { toast.error('Peça não encontrada'); } }; const handleImportPecas = async (pecasData: any[]) => { if (!canCreate()) { toast.error('Você não tem permissão para importar peças'); throw new Error('Sem permissão'); } try { const pecasComOF = pecasData.map(peca => ({ ...peca, of_number: ofSelecionada })); await importPecas(pecasComOF); loadPecas(); } catch (error) { throw error; } }; const handleImportCSV = async (file: File): Promise => { if (!canCreate()) { toast.error('Você não tem permissão para importar peças'); return false; } try { await importCSV(file); loadPecas(); return true; } catch (error) { return false; } }; const handleUndoLastImport = async () => { if (!canDelete()) return; if (confirm('Tem certeza que deseja desfazer a última importação?')) { await undoLastImport(); loadPecas(); } }; const handleBatchUpdatePecas = async (pecaIds: string[], updates: any) => { if (!canEdit()) return; await batchUpdatePecas(pecaIds, updates); loadPecas(); }; useEffect(() => { if (!ofSelecionada) { navigate('/seletor-of'); } else { carregarRevisoesOF(ofSelecionada); } }, [ofSelecionada, navigate, carregarRevisoesOF]); if (loading) { return (

Carregando peças da OF {ofSelecionada}...

); } const handleVoltar = () => { if (window.history.state && window.history.state.idx > 0) { navigate(-1); } else { navigate('/seletor-of'); } }; if (!ofSelecionada) { return null; } return ( {pecasFiltradas.length} peças {canCreate() && ( )} } >
{/* Form Card */} {showForm && canCreate() && ( {editingPeca ? 'Editar Peça' : 'Nova Peça'} )} {/* Table Card */} Peças da OF {ofSelecionada} setPecaParaRevisao(peca)} onOpenPainelRevisoes={() => setShowPainelRevisoes(true)} totalRevisoesOF={revisoesOF.length} hasRecentImport={hasRecentImport} canEdit={canEdit()} canDelete={canDelete()} ofNumber={ofSelecionada} /> {/* Modal de Gerenciamento de Componentes */} {selectedPecaForPopup && ( { setSelectedPecaForPopup(null); loadPecas(); }} peca={selectedPecaForPopup} /> )} {/* Modal de Gestão de Revisão da Peça */} {pecaParaRevisao && ( setPecaParaRevisao(null)} peca={pecaParaRevisao} onPecaAtualizada={() => { loadPecas(); carregarRevisoesOF(ofSelecionada); }} /> )} {/* Modal Painel Geral de Revisões da OF */} {showPainelRevisoes && ( setShowPainelRevisoes(false)} ofNumber={ofSelecionada} pecas={pecasFiltradas} onOpenRevisaoPeca={(peca) => setPecaParaRevisao(peca)} /> )}
); }