* fix(web): simplify inventory administration menu * fix(web): remove legacy imports and function catalog routes * fix(web): remove redundant inspections lifecycle legend * feat(inventory): distinguish physical instances from structural records * fix(dashboard): align inventory and act follow-up metrics * fix(web): align dashboard summary contract * fix(web): clarify dashboard act and report concepts * feat(inventory): mark field-created records as real instances * feat(inventory): map physical instance flag on asset entity * fix(inventory): keep field yacimientos structural * feat(inventory): classify future concrete instances at database level * fix(inventory): count only installation and subinstallation instances * feat(inventory): add authoritative F5 source snapshot * feat(inventory): preload authoritative territory model * feat(inventory): preload authoritative technical catalog * fix(findings): use only authoritative F5 family catalog * fix(inventory): preserve non-hierarchical operator snapshot compatibility * feat(inventory): add inventory-only asset filter * feat(inventory): add inventory-only tree filter * feat(inventory): add inventory browser query contract * feat(inventory): add area-owned inventory browser * feat(inventory): expose area-owned inventory browser * refactor(inventory): remove function catalog and add inventory browser * fix(inventory): make operator relation temporal and non-owning * feat(web): add inventory browser API client * feat(inventory): extend inventory browser filters * feat(inventory): add real inventory list endpoint logic * feat(inventory): expose real inventory list * feat(web): add real inventory list client * refactor(web): make inventory hierarchy area-owned * fix(web): show only real inventory instances * fix(web): style act follow-up tabs and F5 inventory context * fix(web): load F5 flow styles * fix(inventory): apply area-owned operational guard on F5 up * fix(inventory): treat company on asset as non-owning creation snapshot * fix(inventory): resolve field inventory by area hierarchy, not company ownership * fix(inventory): preserve custom catalog and apply authoritative universal findings * fix(inventory): harden authoritative catalog migration checks * fix(inventory): make authoritative territory preload safely reversible * feat(inventory): allow independent company master creation * fix(inventory): make guided creation area-owned and support companies * feat(web): expose independent company master in inventory setup * feat(web): create companies independently from physical inventory hierarchy * fix(inventory): merge by physical area and preserve sealed documents * test(inventory): lock F5 authoritative model and merge invariants * feat(inventory): add family administration DTOs * feat(inventory): administer installation and subinstallation classifications * feat(inventory): expose family classification administration * feat(web): add inventory classification administration API * fix(web): configure finding applicability by inventory classification * fix(web): redefine inventory configuration around hierarchy classifications and columns * chore(release): identify F5 inventory model * chore(release): bump API for F5 inventory model * test(release): expect F5 health metadata * chore(release): align WEB package with F5 inventory cut * chore(release): expose F5 WEB phase * test(dashboard): expect inspector activity and act follow-up metrics * test(dashboard): route F5 summary query mocks explicitly * ci: rehearse all migrations on clean PostGIS before merge * ci: prove F5 migrations revert and reapply cleanly * test(f5): align operational navigation contract * test(f5): align operator lifecycle with area-owned inventory * test(f5): make merge compatibility area-based * test(f5): distinguish literal and normalized yacimiento counts * test(f5): model normalized yacimiento collision explicitly * ci(f5): bootstrap historical admin prerequisite in clean migration rehearsal * ci(f5): bypass irreversible historical reset in clean rehearsal * fix(f5): make territory SQL parameter types explicit * fix(f5): guarantee canonical inventory hierarchy before territory preload * ci(f5): include canonical hierarchy migration in rollback gate * fix(f5): type relation backup markers explicitly * fix(f5): make catalog SQL text parameter types explicit
90 lines
7.1 KiB
TypeScript
90 lines
7.1 KiB
TypeScript
import { lazy, Suspense } from 'react';
|
|
import { Navigate, Route, Routes } from 'react-router';
|
|
import { PermissionRoute, ProtectedRoute } from '../auth/ProtectedRoute';
|
|
import { AppLayout } from '../layout/AppLayout';
|
|
import { OperationalContextProvider } from '../context/OperationalContext';
|
|
import { AuditPage } from '../pages/AuditPage';
|
|
import { ChangePasswordPage } from '../pages/ChangePasswordPage';
|
|
import { CompanySignaturePage } from '../pages/CompanySignaturePage';
|
|
import { DashboardPage } from '../pages/DashboardPage';
|
|
import { LoginPage } from '../pages/LoginPage';
|
|
import { NewUserPage } from '../pages/NewUserPage';
|
|
import { RolesPage } from '../pages/RolesPage';
|
|
import { AccessDeniedPage, NotFoundPage } from '../pages/SystemPages';
|
|
import { UserDetailPage } from '../pages/UserDetailPage';
|
|
import { UsersPage } from '../pages/UsersPage';
|
|
import { AssetsPage } from '../pages/AssetsPage';
|
|
import { AssetEditorPage } from '../pages/AssetEditorPage';
|
|
import { InventoryCreatePage } from '../pages/InventoryCreatePage';
|
|
import { FieldDiscoveriesPage } from '../pages/FieldDiscoveriesPage';
|
|
import { AssetTypesPage } from '../pages/AssetTypesPage';
|
|
import { HistoryPage } from '../pages/HistoryPage';
|
|
import { TemporalAssetsPage } from '../pages/TemporalAssetsPage';
|
|
import { InspectionVisitsPage } from '../pages/InspectionVisitsPage';
|
|
import { InspectionVisitEditorF4Page } from '../pages/InspectionVisitEditorF4Page';
|
|
import { InspectionActEditorPage } from '../pages/InspectionActEditorPage';
|
|
import { FindingCatalogPage } from '../pages/FindingCatalogPage';
|
|
import { FindingDetailPage } from '../pages/FindingDetailPage';
|
|
import { FindingsPage } from '../pages/FindingsPage';
|
|
import { ActsPage } from '../pages/ActsPage';
|
|
import { ReportsPage } from '../pages/ReportsPage';
|
|
import { ReportDetailPage } from '../pages/ReportDetailPage';
|
|
import { VerificationPlanningPage } from '../pages/VerificationPlanningPage';
|
|
import { ActAdministrationPage } from '../pages/ActAdministrationPage';
|
|
import { ActAdministrationDetailPage } from '../pages/ActAdministrationDetailPage';
|
|
import { FieldBriefingsPage } from '../pages/FieldBriefingsPage';
|
|
|
|
const MapPage = lazy(() => import('../pages/MapPage').then((module) => ({ default: module.MapPage })));
|
|
const DocumentDeliveryPage = lazy(() => import('../pages/DocumentDeliveryPage').then((module) => ({ default: module.DocumentDeliveryPage })));
|
|
|
|
export function App() {
|
|
return <Suspense fallback={<div className="loading-block"><span className="spinner" />Cargando módulo…</div>}><Routes>
|
|
<Route path="/login" element={<LoginPage />} />
|
|
<Route path="/firma-acta" element={<CompanySignaturePage />} />
|
|
<Route element={<ProtectedRoute />}>
|
|
<Route path="/change-password" element={<ChangePasswordPage />} />
|
|
<Route element={<OperationalContextProvider><AppLayout /></OperationalContextProvider>}>
|
|
<Route element={<PermissionRoute permission="dashboard.read" />}><Route index element={<DashboardPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="assets.read" />}><Route path="/mapa" element={<MapPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="assets.read" />}>
|
|
<Route path="/inventarios" element={<AssetsPage />} />
|
|
<Route path="/inventarios/:id" element={<AssetEditorPage />} />
|
|
<Route path="/activos" element={<Navigate to="/inventarios" replace />} />
|
|
<Route path="/activos/:id" element={<AssetEditorPage />} />
|
|
</Route>
|
|
<Route element={<PermissionRoute permission="assets.change_status" />}><Route path="/inventarios/revision-campo" element={<FieldDiscoveriesPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="assets.create" />}><Route path="/inventarios/nuevo" element={<InventoryCreatePage />} /><Route path="/activos/nuevo" element={<Navigate to="/inventarios/nuevo" replace />} /></Route>
|
|
<Route path="/planificacion" element={<Navigate to="/inspecciones?status=PLANNED" replace />} />
|
|
<Route element={<PermissionRoute permission="inspections.read" />}>
|
|
<Route path="/inspecciones" element={<InspectionVisitsPage />} />
|
|
<Route path="/inspecciones/:id" element={<InspectionVisitEditorF4Page />} />
|
|
<Route path="/preparacion-campo" element={<FieldBriefingsPage />} />
|
|
</Route>
|
|
<Route element={<PermissionRoute permission="inspections.manage" />}><Route path="/inspecciones/nueva" element={<InspectionVisitEditorF4Page />} /></Route>
|
|
<Route element={<PermissionRoute permission="inspection_acts.read" />}>
|
|
<Route path="/inspecciones/actas/:actId" element={<InspectionActEditorPage />} />
|
|
<Route path="/inspecciones/actas/nueva" element={<InspectionActEditorPage />} />
|
|
</Route>
|
|
<Route element={<PermissionRoute permission="inspection_findings.read" />}><Route path="/hallazgos" element={<FindingsPage />} /><Route path="/hallazgos/:id" element={<FindingDetailPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="inspection_verifications.plan" />}><Route path="/hallazgos/planificacion" element={<VerificationPlanningPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="inspection_acts.read" />}><Route path="/actas" element={<ActsPage />} /><Route path="/seguimiento-actas" element={<ActAdministrationPage />} /><Route path="/seguimiento-actas/:actId" element={<ActAdministrationDetailPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="inspection_reports.read" />}><Route path="/informes" element={<ReportsPage />} /><Route path="/informes/:id" element={<ReportDetailPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="assets.read_history" />}><Route path="/historial" element={<HistoryPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="assets.read_temporal" />}><Route path="/consulta-temporal" element={<TemporalAssetsPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="users.read" />}>
|
|
<Route path="/admin/users" element={<UsersPage />} />
|
|
<Route path="/admin/users/:id" element={<UserDetailPage />} />
|
|
</Route>
|
|
<Route element={<PermissionRoute permission="users.create" />}><Route path="/admin/users/new" element={<NewUserPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="roles.read" />}><Route path="/admin/roles" element={<RolesPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="audit.read" />}><Route path="/admin/audit" element={<AuditPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="asset_types.read" />}><Route path="/admin/asset-types" element={<AssetTypesPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="finding_catalog.manage" />}><Route path="/admin/finding-catalog" element={<FindingCatalogPage />} /></Route>
|
|
<Route element={<PermissionRoute permission="document_delivery.read" />}><Route path="/admin/document-delivery" element={<DocumentDeliveryPage />} /></Route>
|
|
<Route path="/sin-acceso" element={<AccessDeniedPage />} />
|
|
<Route path="*" element={<NotFoundPage />} />
|
|
</Route>
|
|
</Route>
|
|
</Routes></Suspense>;
|
|
}
|