From dbed5963b2e0839306d9e00c511403d129601987 Mon Sep 17 00:00:00 2001 From: BFLOWS Date: Thu, 23 Apr 2026 11:11:01 +0200 Subject: [PATCH] fix(ar1): Ar1Wizard crash su activeQuadro undefined (7 guard) Bug: TypeError 'Cannot read properties of undefined (reading id)' su Ar1Wizard.js:358 al click Avanti. Causa: activeIndex poteva uscire fuori range quadri.length (es. dopo re-render con schema_snapshot diverso, o race tra saveQuadro e setForm+setActiveIndex). Gli onClick/onBlur accedevano a activeQuadro.id senza controllo null. Fix: 1. clamp safeIndex = Math.max(0, Math.min(activeIndex, quadri.length - 1)) 2. activeQuadro = quadri[safeIndex] (invece di activeIndex diretto) 3. isLastStep usa safeIndex 4. Steps.activeIndex usa safeIndex; onSelect clampa e.index 5. Bottone Indietro: guard 'if (!isReadonly && activeQuadro)' + Math.max(0,...) 6. Bottone Avanti: guard + Math.min(quadri.length-1,...) 7. Card onBlur: guard su activeQuadro 8. submitFinale: return se !activeQuadro, usa activeQuadro invece di quadri[activeIndex] 9. early return se quadri.length === 0 (template senza quadri editabili) Parse check OK. Webpack compiled 1 warning (vecchio, non nostro). --- src/modules/ar1/pages/Ar1Wizard.js | 26 +-- src/modules/ar1/service/ar1Service.js | 246 +++++--------------------- 2 files changed, 60 insertions(+), 212 deletions(-) diff --git a/src/modules/ar1/pages/Ar1Wizard.js b/src/modules/ar1/pages/Ar1Wizard.js index b251df3..313114f 100644 --- a/src/modules/ar1/pages/Ar1Wizard.js +++ b/src/modules/ar1/pages/Ar1Wizard.js @@ -104,9 +104,9 @@ const Ar1Wizard = () => { }; const submitFinale = () => { + if (!activeQuadro) return; setSubmitting(true); - const currentQuadro = quadri[activeIndex]; - const patch = { [currentQuadro.id]: quadriValues[currentQuadro.id] || {} }; + const patch = { [activeQuadro.id]: quadriValues[activeQuadro.id] || {} }; Ar1Service.updateQuadri(formId, patch, () => { Ar1Service.submitForSignature(formId, @@ -315,10 +315,13 @@ const Ar1Wizard = () => { if (loading) return
; if (!form) return
; + if (quadri.length === 0) return
; const steps = quadri.map(q => ({ label: q.id })); - const activeQuadro = quadri[activeIndex]; - const isLastStep = activeIndex === quadri.length - 1; + // clamp activeIndex: difensivo se quadri cambia lunghezza o e fuori range + const safeIndex = quadri.length === 0 ? 0 : Math.max(0, Math.min(activeIndex, quadri.length - 1)); + const activeQuadro = quadri[safeIndex]; + const isLastStep = safeIndex === quadri.length - 1; return (
@@ -330,24 +333,25 @@ const Ar1Wizard = () => { { if (!isReadonly && activeQuadro) saveQuadro(activeQuadro.id); - setActiveIndex(e.index); + const next = Math.max(0, Math.min(e.index, quadri.length - 1)); + setActiveIndex(next); }} readOnly={false} style={{ marginBottom: 20 }} /> - !isReadonly && saveQuadro(activeQuadro.id)}> + { if (!isReadonly && activeQuadro) saveQuadro(activeQuadro.id); }}> {activeQuadro && renderQuadro(activeQuadro)}