feat: adicionar gestao de revisoes simples e criticas de pecas com integracao a apontamentos

This commit is contained in:
Marcos Reifonas
2026-10-07 22:48:50 -03:00
parent 8755852fbd
commit c239dffdee
9 changed files with 1715 additions and 4 deletions
+30
View File
@@ -9,6 +9,9 @@ import { usePecasP4Listener } from '@/hooks/usePecasP4Listener';
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 { useRevisoes } from '@/hooks/useRevisoes';
import { Package, Plus, RefreshCw } from 'lucide-react';
import { usePermissionControl } from '@/hooks/usePermissionControl';
@@ -39,6 +42,8 @@ export default function CadastroPecas() {
const [editingPeca, setEditingPeca] = useState<Peca | null>(null);
const [showForm, setShowForm] = useState(false);
const [selectedPecaForPopup, setSelectedPecaForPopup] = useState<Peca | null>(null);
const [pecaParaRevisao, setPecaParaRevisao] = useState<Peca | null>(null);
const [showPainelRevisoes, setShowPainelRevisoes] = useState(false);
const handleSave = async (formData: any) => {
if (!canCreate()) return false;
@@ -242,6 +247,8 @@ export default function CadastroPecas() {
onDeletePecasBatch={canDelete() ? handleDeleteBatch : undefined}
onEditPeca={canEdit() ? handleEdit : undefined}
onDeleteLastImport={canDelete() ? handleDeleteLastImport : undefined}
onOpenRevisaoPeca={(p) => setPecaParaRevisao(p)}
onOpenPainelRevisoes={() => setShowPainelRevisoes(true)}
hasRecentImport={hasRecentImport}
canEdit={canEdit()}
canDelete={canDelete()}
@@ -260,6 +267,29 @@ export default function CadastroPecas() {
peca={selectedPecaForPopup}
/>
)}
{/* Modal de Gestão de Revisão da Peça */}
{pecaParaRevisao && (
<RevisaoPecaModal
isOpen={!!pecaParaRevisao}
onClose={() => setPecaParaRevisao(null)}
peca={pecaParaRevisao}
onPecaAtualizada={() => {
loadPecas();
}}
/>
)}
{/* Modal Painel Geral de Revisões */}
{showPainelRevisoes && (
<PainelRevisoesOFModal
isOpen={showPainelRevisoes}
onClose={() => setShowPainelRevisoes(false)}
ofNumber={pecas[0]?.of_number || ''}
pecas={pecas}
onOpenRevisaoPeca={(peca) => setPecaParaRevisao(peca)}
/>
)}
</div>
</div>
);
+37 -1
View File
@@ -7,7 +7,10 @@ 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';
@@ -34,11 +37,15 @@ export default function CadastroPecasFiltrado() {
batchUpdatePecas,
loadPecas
} = usePecas();
const { revisoes: revisoesOF, carregarRevisoesOF } = useRevisoes(ofSelecionada);
const [saving, setSaving] = useState(false);
const [editingPeca, setEditingPeca] = useState<Peca | null>(null);
const [showForm, setShowForm] = useState(false);
const [selectedPecaForPopup, setSelectedPecaForPopup] = useState<Peca | null>(null);
const [pecaParaRevisao, setPecaParaRevisao] = useState<Peca | null>(null);
const [showPainelRevisoes, setShowPainelRevisoes] = useState(false);
// Filtrar peças pela OF selecionada
const pecasFiltradas = pecas.filter(peca => peca.of_number === ofSelecionada);
@@ -170,8 +177,10 @@ export default function CadastroPecasFiltrado() {
useEffect(() => {
if (!ofSelecionada) {
navigate('/seletor-of');
} else {
carregarRevisoesOF(ofSelecionada);
}
}, [ofSelecionada, navigate]);
}, [ofSelecionada, navigate, carregarRevisoesOF]);
if (loading) {
return (
@@ -269,6 +278,9 @@ export default function CadastroPecasFiltrado() {
onEditPeca={canEdit() ? handleEdit : undefined}
onDeleteLastImport={canDelete() ? handleDeleteLastImport : undefined}
onBatchUpdatePecas={canEdit() ? handleBatchUpdatePecas : undefined}
onOpenRevisaoPeca={(peca) => setPecaParaRevisao(peca)}
onOpenPainelRevisoes={() => setShowPainelRevisoes(true)}
totalRevisoesOF={revisoesOF.length}
hasRecentImport={hasRecentImport}
canEdit={canEdit()}
canDelete={canDelete()}
@@ -288,6 +300,30 @@ export default function CadastroPecasFiltrado() {
peca={selectedPecaForPopup}
/>
)}
{/* Modal de Gestão de Revisão da Peça */}
{pecaParaRevisao && (
<RevisaoPecaModal
isOpen={!!pecaParaRevisao}
onClose={() => setPecaParaRevisao(null)}
peca={pecaParaRevisao}
onPecaAtualizada={() => {
loadPecas();
carregarRevisoesOF(ofSelecionada);
}}
/>
)}
{/* Modal Painel Geral de Revisões da OF */}
{showPainelRevisoes && (
<PainelRevisoesOFModal
isOpen={showPainelRevisoes}
onClose={() => setShowPainelRevisoes(false)}
ofNumber={ofSelecionada}
pecas={pecasFiltradas}
onOpenRevisaoPeca={(peca) => setPecaParaRevisao(peca)}
/>
)}
</div>
</StandardPageLayout>
);