From dc0e1d9762f8ea2dc058181fd35142527740001d Mon Sep 17 00:00:00 2001 From: enlineawork Date: Wed, 9 Sep 2026 09:27:14 -0300 Subject: [PATCH] =?UTF-8?q?feat(f6):=20filtrar=20subinstalaciones=20por=20?= =?UTF-8?q?compatibilidad=20m=C3=BAltiple?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web-v2/src/pages/InventoryCreatePage.tsx | 91 ++++++------------------ 1 file changed, 21 insertions(+), 70 deletions(-) diff --git a/web-v2/src/pages/InventoryCreatePage.tsx b/web-v2/src/pages/InventoryCreatePage.tsx index c83a21e..fca1a07 100644 --- a/web-v2/src/pages/InventoryCreatePage.tsx +++ b/web-v2/src/pages/InventoryCreatePage.tsx @@ -26,24 +26,13 @@ const KINDS: Array<{ kind: InventoryStructureKind; label: string }> = [ { kind: 'SUBINSTALACION', label: 'Subinstalación' }, { kind: 'EMPRESA', label: 'Empresa' }, ]; - const childKindByParentType: Record = { - departamento: 'AREA', - area: 'YACIMIENTO', - yacimiento: 'INSTALACION', - instalacion: 'SUBINSTALACION', + departamento: 'AREA', area: 'YACIMIENTO', yacimiento: 'INSTALACION', instalacion: 'SUBINSTALACION', }; - const parentLabelByKind: Partial> = { - AREA:'Departamento', - YACIMIENTO:'Área', - INSTALACION:'Yacimiento', - SUBINSTALACION:'Instalación', + AREA:'Departamento', YACIMIENTO:'Área', INSTALACION:'Yacimiento', SUBINSTALACION:'Instalación', }; - -function kindLabel(kind: InventoryStructureKind) { - return KINDS.find((item) => item.kind===kind)?.label ?? kind; -} +function kindLabel(kind: InventoryStructureKind) { return KINDS.find((item) => item.kind===kind)?.label ?? kind; } export function InventoryCreatePage() { const navigate = useNavigate(); @@ -65,17 +54,14 @@ export function InventoryCreatePage() { const [error, setError] = useState(''); useEffect(() => { - getInventoryStructureOptions() - .then(async (loaded) => { - setOptions(loaded); - if (contextParentId) { - const parent = await getAsset(contextParentId); - const inferred = childKindByParentType[parent.type.code.toLowerCase()]; - if (inferred) { setKind(inferred); setParentId(parent.id); } - } - }) - .catch((requestError) => setError(errorMessage(requestError))) - .finally(() => setLoading(false)); + getInventoryStructureOptions().then(async (loaded) => { + setOptions(loaded); + if (contextParentId) { + const parent = await getAsset(contextParentId); + const inferred = childKindByParentType[parent.type.code.toLowerCase()]; + if (inferred) { setKind(inferred); setParentId(parent.id); } + } + }).catch((requestError) => setError(errorMessage(requestError))).finally(() => setLoading(false)); }, [contextParentId]); const requiresParent = Boolean(parentLabelByKind[kind]); @@ -85,12 +71,10 @@ export function InventoryCreatePage() { useEffect(() => { if (!requiresParent) { setParents([]); setParentId(''); return; } const timer = window.setTimeout(() => { - listInventoryStructureParents(kind,parentSearch) - .then((loaded) => { - setParents(loaded); - if (contextParentId && loaded.some((item) => item.id===contextParentId)) setParentId(contextParentId); - }) - .catch((requestError) => setError(errorMessage(requestError))); + listInventoryStructureParents(kind,parentSearch).then((loaded) => { + setParents(loaded); + if (contextParentId && loaded.some((item) => item.id===contextParentId)) setParentId(contextParentId); + }).catch((requestError) => setError(errorMessage(requestError))); },150); return () => window.clearTimeout(timer); }, [kind,parentSearch,contextParentId,requiresParent]); @@ -101,7 +85,7 @@ export function InventoryCreatePage() { if (kind==='INSTALACION') return options.installationFamilies; if (kind==='SUBINSTALACION') { const parentFamilyId=selectedParent?.inventoryFamily?.id; - return parentFamilyId ? options.subinstallationFamilies.filter((item)=>item.parentFamilyId===parentFamilyId) : []; + return parentFamilyId ? options.subinstallationFamilies.filter((item)=>item.parentFamilyIds.includes(parentFamilyId)) : []; } return []; },[options,kind,selectedParent]); @@ -111,7 +95,6 @@ export function InventoryCreatePage() { if (!familyId) { setFamilyFindings(null); return; } getInventoryFamilyFindings(familyId).then(setFamilyFindings).catch((requestError)=>setError(errorMessage(requestError))); },[familyId]); - useEffect(() => { if (!requiresFamily) setFamilyId(''); if (kind==='SUBINSTALACION' && familyId && !families.some((item)=>item.id===familyId)) setFamilyId(''); @@ -120,7 +103,6 @@ export function InventoryCreatePage() { const changeKind=(next:InventoryStructureKind) => { setKind(next); setParentId(''); setParentSearch(''); setFamilyId(''); setFamilyFindings(null); setError(''); }; - const save=async(event:FormEvent) => { event.preventDefault(); if (requiresParent && !parentId) { setError(`Seleccioná ${parentLabel}.`); return; } @@ -137,46 +119,15 @@ export function InventoryCreatePage() { }; if (loading) return ; - return
-
-
CARGA MANUAL

Nuevo registro

Elegí qué querés crear, dónde va y su nombre. El resto es opcional.

-
+
CARGA MANUAL

Nuevo registro

Para crear sólo necesitás ubicación, clasificación cuando corresponda y nombre. DH genera el código automáticamente.

{error && {error}} -
-
-

1. Tipo de registro

La estructura física es Departamento → Área → Yacimiento → Instalación → Subinstalación. Empresa es un maestro independiente.

- -
- - {requiresParent &&
-

2. Ubicación

Elegí el {parentLabel.toLowerCase()} al que pertenece.

- - -
} - - {requiresFamily &&
-

{requiresParent ? '3' : '2'}. Clasificación

Define qué tipo de elemento es y qué Hallazgos le corresponden.

- {kind==='SUBINSTALACION' && !selectedParent?.inventoryFamily - ? La Instalación elegida todavía no tiene clasificación. Asignala antes de crear una Subinstalación. - : } - {selectedFamily &&
{selectedFamily.name}{familyFindings ? `${familyFindings.count} Hallazgo${familyFindings.count===1?'':'s'} asociado${familyFindings.count===1?'':'s'}` : 'Cargando Hallazgos asociados…'}{familyFindings && familyFindings.items.length>0 &&
    {familyFindings.items.slice(0,6).map((item)=>
  • {item.title}
  • )}{familyFindings.items.length>6 &&
  • + {familyFindings.items.length-6} más
  • }
}
} -
} - -
-

{requiresFamily ? '4' : requiresParent ? '3' : '2'}. Identificación

Para comenzar sólo necesitamos un nombre claro.

- -
Datos opcionales
-
- - -
-