From cc8d650aa463d33565bcc53a0df1e15195fd6203 Mon Sep 17 00:00:00 2001 From: enlineawork Date: Thu, 10 Sep 2026 19:54:19 -0300 Subject: [PATCH] feat: present inventory levels as dedicated sections --- web-v2/src/pages/AssetsPage.tsx | 61 ++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/web-v2/src/pages/AssetsPage.tsx b/web-v2/src/pages/AssetsPage.tsx index 25cd931..c4261d1 100644 --- a/web-v2/src/pages/AssetsPage.tsx +++ b/web-v2/src/pages/AssetsPage.tsx @@ -33,6 +33,40 @@ const quickViews = [ { key: 'out', label: 'Fuera de servicio' }, ] as const; +const structuredTypeCopy: Record = { + departamento: { + title: 'Departamentos', + description: 'Raíz territorial del Inventario. Cada Departamento contiene sus Áreas.', + }, + area: { + title: 'Áreas', + description: 'Áreas dentro de un Departamento, con sus Empresas operadoras vinculadas.', + }, + yacimiento: { + title: 'Yacimientos', + description: 'Yacimientos pertenecientes a un Área y utilizados para organizar sus Instalaciones.', + }, + instalacion: { + title: 'Instalaciones', + description: 'Instalaciones dentro de un Yacimiento, con clasificación técnica y contexto operativo.', + }, + subinstalacion: { + title: 'Subinstalaciones', + description: 'Subinstalaciones dependientes de una Instalación, último nivel de la estructura.', + }, +}; + +function structuredPresentation(type: AssetType | undefined) { + if (!type) return null; + if (type.operationalRole === 'COMPANY') { + return { + title: 'Empresas', + description: 'Maestro independiente de Empresas operadoras. Se vinculan a una o más Áreas.', + }; + } + return structuredTypeCopy[type.code.toLowerCase()] ?? null; +} + export function AssetsPage() { const [urlParams, setUrlParams] = useSearchParams(); const operationalContext = useOperationalContext(); @@ -58,6 +92,8 @@ export function AssetsPage() { const needsValidation = quick === 'validation' ? true : undefined; const hasGeometry = quick === 'location' ? false : undefined; const effectiveOperationalStatus = quick === 'out' ? 'OUT_OF_SERVICE' as AssetOperationalStatus : operationalStatus; + const selectedType = types.find((type) => type.id === typeId); + const selectedPresentation = structuredPresentation(selectedType); useEffect(() => { listAssetTypes().then((data) => setTypes(data.filter((type) => @@ -102,15 +138,22 @@ export function AssetsPage() { value > 1 ? next.set('page', String(value)) : next.delete('page'); setUrlParams(next); }; const advancedActive = Boolean(typeId || status || rawOperationalStatus); + const sectionTitle = view === 'list' && selectedPresentation ? selectedPresentation.title : 'Inventarios'; + const sectionDescription = view === 'list' && selectedPresentation + ? selectedPresentation.description + : 'Empresas y estructura territorial: Departamento → Área → Yacimiento → Instalación → Subinstalación.'; return
- INVENTARIOS -

Inventarios

-

Todos los registros: Departamento → Área → Yacimiento → Instalación → Subinstalación, más el maestro independiente de Empresas.

+ {selectedPresentation && view === 'list' ? 'INVENTARIOS · SECCIÓN' : 'INVENTARIOS'} +

{sectionTitle}

+

{sectionDescription}

+
+
+ {selectedPresentation && view === 'list' && Ver estructura} + Nuevo registro
- Nuevo registro
@@ -126,7 +169,7 @@ export function AssetsPage() { {view === 'list' && } {view === 'list' && (advancedOpen || advancedActive) &&
- + @@ -135,17 +178,17 @@ export function AssetsPage() { {error && {error}} {view === 'hierarchy' - ? + ? : loading ? : assets.length === 0 - ? + ? :
{meta.total} registro{meta.total === 1 ? '' : 's'}Página {meta.page} de {Math.max(meta.totalPages, 1)}
-
+
RegistroNivelUbicación / OperadoraEstadoActualizado
{assets.map((asset) => - +
RegistroSecciónUbicación / OperadoraEstadoActualizado
{asset.name}{asset.code}{asset.parent ? ` · en ${asset.parent.name}` : ''}
{asset.type.name}{asset.type.operationalRole === 'COMPANY' ? 'Empresa' : asset.type.name} {asset.operationalArea ? {asset.operationalArea.name}{asset.operatorCompany?.name ?? 'Sin operadora vigente'} : asset.operatorCompany ? {asset.operatorCompany.name} : {asset.parent?.name ?? 'Raíz / maestro independiente'}}
{assetStatusLabel(asset.informationStatus)}{assetOperationalStatusLabel(asset.operationalStatus)}
{formatDate(asset.updatedAt)}