diff --git a/AGENTS.md b/AGENTS.md index 3773ee9..45b0889 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -57,6 +57,7 @@ Las fuentes normativas se consultan, no se duplican: - [Contratos HTTP](docs/arquitectura/contratos-http.md) - [Pruebas](docs/arquitectura/pruebas.md) - [Modelo DDD e identificadores](docs/arquitectura/modelo-ddd-e-identificadores.md) +- [Estructura web por entidades y operaciones](docs/estructura-web-por-entidades-y-operaciones.md) ## Seguridad y persistencia @@ -77,6 +78,8 @@ Las fuentes normativas se consultan, no se duplican: ## Frontend +Todo código web nuevo de módulos, entidades y operaciones debe seguir [la estructura web por entidades y operaciones](docs/estructura-web-por-entidades-y-operaciones.md): `modules//src/web///`, con ámbitos `shared` según sus consumidores e índices únicamente donde haya contenido exportable para otras unidades. Esta guía es la fuente normativa de la organización interna del frontend; no cambia las capas del servidor ni la implementación vendor. + React, TanStack Query, Tailwind y shadcn/ui (Base UI, estilo Vega). Los componentes compartidos viven en @repo/shadcn-ui. Incorporar TanStack Table y React Hook Form cuando haya consumidores. Estado remoto en TanStack Query; claves centralizadas e invalidación explícita después de mutaciones. No duplicar estado remoto ni usar efectos para derivar valores calculables durante render. @@ -317,4 +320,4 @@ Al finalizar: - Revisar el diff completo, no únicamente los ficheros editados individualmente. - Comprobar que no se hayan introducido duplicaciones, componentes excesivamente grandes, varios componentes relevantes por fichero, imports no usados, casts innecesarios ni efectos React evitables. -- Ejecutar las validaciones apropiadas para el alcance real del cambio. \ No newline at end of file +- Ejecutar las validaciones apropiadas para el alcance real del cambio. diff --git a/README.md b/README.md index 61b0538..9d119ec 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ Aplicación interna para soporte técnico a pequeñas empresas. - [Preparación y ejecución](docs/puesta-en-marcha.md) - [Modelo DDD e identificadores](docs/arquitectura/modelo-ddd-e-identificadores.md) - [Organización del código](docs/arquitectura/capas-del-servidor.md) +- [Organización web y guía para nuevas entidades y operaciones](docs/estructura-web-por-entidades-y-operaciones.md) - [Usuarios y acceso](docs/usuarios-y-acceso.md) - [Compañías, contactos y sedes](docs/companias-contactos-y-sedes.md) - [Personas y departamentos](docs/personas-y-departamentos.md) diff --git a/docs/arquitectura/capas-del-servidor.md b/docs/arquitectura/capas-del-servidor.md index ce30def..ae416b3 100644 --- a/docs/arquitectura/capas-del-servidor.md +++ b/docs/arquitectura/capas-del-servidor.md @@ -20,8 +20,8 @@ packages/ Los módulos funcionales seguirán esta estructura. Dentro de api, crear domain, application e infrastructure cuando existan responsabilidades que lo requieran. -Dentro de `web`, el código se organiza por entidad o área funcional y después por operación, -con ámbitos compartidos e índices explícitos según la +En módulos existentes y nuevos, el código de `web` debe organizarse por entidad o área +funcional y después por operación, con ámbitos compartidos e índices explícitos según la [estructura web por entidades y operaciones](../estructura-web-por-entidades-y-operaciones.md). La primera entrega solo comprueba la vida del proceso. No hay reglas de negocio, agregados, repositorios ni casos de uso artificiales para esta comprobación técnica. diff --git a/docs/arquitectura/composicion-de-modulos.md b/docs/arquitectura/composicion-de-modulos.md index c853e0a..36d9e88 100644 --- a/docs/arquitectura/composicion-de-modulos.md +++ b/docs/arquitectura/composicion-de-modulos.md @@ -14,5 +14,14 @@ Cuando sea necesario distinguir superficies: No exportar repositorios ni modelos ORM a otros módulos. No crear contratos públicos sin consumidores. +## Superficie web de los módulos + +Al crear un módulo con código de navegador o ampliar uno existente, aplicar la +[estructura web por entidades y operaciones](../estructura-web-por-entidades-y-operaciones.md). +`./client` apunta a `src/web/index.ts` cuando exista una API web pública con consumidores. +Ese índice compone contratos internos explícitos; no expone automáticamente todas las +entidades, operaciones o componentes del módulo. `./common` y `./module` mantienen sus +fronteras de contratos compartidos y composición del servidor. + En esta entrega core expone registerCoreRoutes mediante ./module, una frontera de composición del servidor. ./common expone contratos y ./client expone la página y recursos de traducción. No hay dependencias locales del ERP. diff --git a/docs/componentes-de-interfaz.md b/docs/componentes-de-interfaz.md index c193cc7..b4cdca5 100644 --- a/docs/componentes-de-interfaz.md +++ b/docs/componentes-de-interfaz.md @@ -33,6 +33,15 @@ Usar tokens semánticos como bg-background, text-foreground y border-border en v ## Añadir componentes +Para componentes propios de un módulo, consultar primero la +[estructura web por entidades y operaciones](estructura-web-por-entidades-y-operaciones.md) +y los componentes equivalentes existentes. Ubicar cada componente en la entidad y operación +responsables, o en su ámbito compartido cuando tenga varios consumidores reales. Los +componentes específicos de Metis Desk no pertenecen al paquete visual genérico. + +La incorporación de primitivas al paquete vendor requiere una instrucción explícita del +usuario según `AGENTS.md`. En ese caso, utilizar el procedimiento siguiente. + Desde la raíz del proyecto, dentro de WSL: ```bash diff --git a/docs/estructura-web-por-entidades-y-operaciones.md b/docs/estructura-web-por-entidades-y-operaciones.md index 8107ecf..d9a7724 100644 --- a/docs/estructura-web-por-entidades-y-operaciones.md +++ b/docs/estructura-web-por-entidades-y-operaciones.md @@ -1,8 +1,27 @@ # Estructura web por entidades y operaciones -El código de navegador de cada módulo se organiza primero por entidad o área funcional y, -dentro de ella, por las operaciones existentes. Esta estructura se aplica a `core`, `identity`, -`assets`, `resources` y `companies`. No modifica la composición del servidor ni los contratos HTTP. +Fuente normativa de la organización interna del código web de Metis Desk, referenciada +desde `AGENTS.md`. Todo módulo nuevo y toda entidad, operación o componente que se añada +a un módulo existente debe seguir esta estructura. Los módulos `core`, `identity`, `assets`, +`resources` y `companies` proporcionan ejemplos de su aplicación. + +## Regla de organización + +El orden obligatorio es módulo → entidad o área funcional → operación → responsabilidad: + +```text +modules//src/web//// +``` + +Por ejemplo, `web/tickets/create/ui/`, no `web/create/tickets/` ni un directorio global +`web/components/` para componentes de entidades distintas. Utilizar nombres en inglés y +kebab-case. Las áreas sin una entidad de negocio propia, como `dashboard` o `workspace`, +siguen el mismo orden con operaciones descriptivas como `view`. + +Esta regla organiza el código del navegador, no prescribe nuevas entidades DDD ni cambia +la estructura de `api` y `common`, la composición del servidor o los contratos HTTP. +No obliga a crear carpetas para todas las operaciones posibles ni todas las responsabilidades: +cada directorio debe contener una responsabilidad real de la implementación actual. ## Ubicación de las responsabilidades @@ -51,22 +70,30 @@ El árbol muestra las ubicaciones, no implica exportar todos los ficheros. Los propia no reciben directorios vacíos: por ejemplo, el editor común de alta y edición permanece en `tickets/shared/ui/`. -- `ui`: componentes y formularios existentes. Un componente principal por fichero, sin nuevas +- `ui`: componentes y formularios. Un componente principal por fichero, sin nuevas subdivisiones de JSX trivial. -- `api`: funciones de acceso HTTP y claves de consultas existentes. -- `controllers` y `hooks`: responsabilidades React ya separadas en el código original, como - `catalog/shared/controllers/use-catalog-save.ts` y - `work-environments/detail/hooks/use-environment-queries.ts`. -- `types` y `helpers`: contratos y cálculos existentes, próximos a sus consumidores. +- `api`: funciones de acceso HTTP y claves de consultas de su ámbito, sin dependencias de UI. +- `queries`: claves y configuración de TanStack Query cuando ya tengan una responsabilidad + separada, como `health/shared/queries/core.query-keys.ts`; no duplicarlas también en `api`. +- `controllers`: coordinación React de una operación cuando necesite una responsabilidad + propia, como `catalog/shared/controllers/use-catalog-save.ts`. +- `hooks`: comportamiento React reutilizable o una responsabilidad React identificable, + como `work-environments/detail/hooks/use-environment-queries.ts`. +- `types` y `helpers`: contratos locales y cálculos, próximos a sus consumidores. +- `schemas`, `adapters`, `entities` o `utils`: solo cuando existan validaciones de formulario, + adaptaciones, modelos de UI o utilidades concretas que requieran esos ficheros. No duplicar + DTOs ni schemas HTTP de `common`, trasladar entidades de dominio a `web` o crear cajones + de sastre genéricos. - `/shared`: código utilizado por varias operaciones de la misma entidad y pruebas que cubren conjuntamente esas operaciones. - `web/shared`: recursos de varias entidades del módulo, incluidas traducciones y componentes comunes. No sustituye a `common`, que sigue conteniendo contratos y schemas compartidos con el servidor. -No se han creado controllers, hooks, schemas ni adapters para trasladar lógica desde los -componentes. Esa auditoría queda para una tarea posterior. Las props y los schemas que ya -pertenecían a sus ficheros mantienen su contrato y ubicación relativa a la responsabilidad. +Crear únicamente los subdirectorios que la operación necesite. Una pantalla sencilla no +requiere un controller, hook o adapter artificial. Los elementos privados inseparables del +componente pueden permanecer junto a él; separar por responsabilidad, no por tamaño ni +para completar el árbol de un ejemplo. ## Entidades y ámbitos compartidos @@ -79,20 +106,34 @@ y `history`. Las operaciones particulares conservan nombres explícitos, como `c `processes` y `process-templates`; `interventions` e `intervention-templates`. Los componentes de dashboard y workspace siguen el mismo criterio funcional. +Un nuevo módulo conserva los niveles de entidad y operación aunque inicialmente contenga +una sola entidad. Para una entidad nueva, comprobar antes si pertenece a un módulo existente: +la estructura web no es un motivo para crear un paquete independiente. Para una operación +nueva, utilizar un nombre que describa su intención y no duplicar operaciones que ya cubran +el mismo comportamiento. + +Ubicar código privado de una operación dentro de ella. Promoverlo a `/shared` cuando +lo consuman varias operaciones de esa entidad, o a `web/shared` cuando lo consuman varias +entidades del módulo. No usar `shared` como ubicación por defecto ni anticipar reutilización. +Las traducciones siguen [su estándar](traducciones.md); los componentes visuales genéricos +compartidos siguen [componentes de interfaz](componentes-de-interfaz.md). + Los formularios y diálogos que sirven tanto para crear como para editar se mantienen en el `shared/ui` de su entidad. No se duplican ni se introducen wrappers de alta y edición sin comportamiento propio. Un diálogo de alta de tickets pertenece a `tickets/create`, aunque se abra desde una intervención; el consumidor no determina la identidad del componente. -Los clientes HTTP existentes que abarcan varias entidades permanecen en el ámbito compartido -adecuado: por ejemplo, `identity/shared/api/identity-api.ts` y -`assets/shared/api/inventory-api.ts`. Separar sus métodos o auditar su lógica excede esta -reorganización. Las funciones, firmas y claves de consultas no cambian. +Situar el acceso HTTP en el ámbito más específico que corresponda a sus consumidores: +`//api`, `/shared/api` o `web/shared/api`. Los clientes existentes +que abarcan varias entidades, como `identity/shared/api/identity-api.ts` y +`assets/shared/api/inventory-api.ts`, pueden permanecer compartidos. No dividir un cliente +ni alterar sus firmas, queries o contratos únicamente para reproducir el árbol de ejemplo. ## Índices y dependencias -Cada nivel con un contrato consumido desde otra unidad dispone de un `index.ts` que enumera -sus exportaciones. No se crean índices vacíos, exportaciones `*`, exportaciones de tests ni +Cada nivel debe tener un `index.ts` solo cuando contenga símbolos exportables para otras +unidades con consumidores reales. El índice enumera ese contrato, no todos los exports +de los ficheros internos. No se crean índices vacíos, exportaciones `*`, exportaciones de tests ni índices para detalles privados utilizados exclusivamente dentro de su propio directorio. Los tipos se reexportan mediante `export type`. @@ -102,9 +143,12 @@ imports directos específicos cuando un índice agregado añadiría un ciclo de por ejemplo en flujos de altas anidadas. No se amplía la API pública para resolver esas dependencias internas. -`web/index.ts` mantiene los símbolos públicos originales de `@metis//client` y -compone los índices internos. Las aplicaciones y otros módulos continúan utilizando ese -contrato público. Los antiguos caminos internos no tienen reexports de compatibilidad. +`web/index.ts` compone los índices internos y define los símbolos públicos de +`@metis//client` cuando haya consumidores externos. Las aplicaciones y otros módulos +utilizan ese contrato, no caminos internos del módulo. Al ampliar un módulo existente, +mantener sus contratos públicos salvo un cambio deliberado con revisión de consumidores. +No añadir reexports de compatibilidad para caminos internos antiguos cuando todos sus +consumidores puedan actualizarse de forma segura. ## Pruebas y mantenimiento @@ -112,6 +156,33 @@ Las pruebas existentes acompañan al ámbito que comprueban. Los scripts de cada referencian sus nuevas ubicaciones; los imports, traducciones y enlaces de documentación se actualizan junto con los movimientos. +Las pruebas nuevas específicas de una operación viven junto a la responsabilidad que +comprueban. Las que cubren varias operaciones se sitúan en el `shared` correspondiente. +No exportar tests desde los índices. Registrar los nuevos ficheros en el script del paquete +cuando utilice una enumeración explícita. + +## Lista de comprobación para nuevos desarrollos + +1. Consultar esta guía, las capas aplicables y las implementaciones equivalentes existentes. +2. Identificar módulo, entidad o área funcional y operación antes de crear ficheros. +3. Crear solo responsabilidades necesarias y elegir el ámbito compartido por sus consumidores. +4. Reutilizar formularios de alta/edición y primitivas visuales; separar modales significativos + en su propio `.tsx` sin trasladar todo su contenido al listado. +5. Definir índices explícitos únicamente donde haya contratos exportables a otras unidades; + comprobar imports de tipos, consumidores y ausencia de nuevos ciclos. +6. Mantener DTOs y schemas compartidos en `common`, traducciones es/en y acceso HTTP fuera + de la presentación; no introducir capas o dependencias para completar una estructura. +7. Añadir pruebas observables, actualizar scripts y enlaces, y revisar el diff completo. +8. Ejecutar comprobaciones dirigidas al paquete o las cinco validaciones globales cuando + el cambio sea transversal, según [pruebas](arquitectura/pruebas.md). + +## Alcance de la migración realizada + +La reorganización inicial trasladó ficheros y ajustó sus imports, sin cambiar comportamiento +ni contratos. No extrajo lógica nueva a controllers, hooks, schemas o adapters; esa auditoría +se aplazó por decisión del usuario. Esa limitación describe la migración, no exime al código +nuevo de las reglas de separación de responsabilidades de `AGENTS.md`. + Para futuros cambios, consultar también [componentes de interfaz](componentes-de-interfaz.md), [inventario de modales](inventario-de-modales.md), [patrón de listados](patron-de-listados-de-entidades.md) y [pruebas](arquitectura/pruebas.md). No trasladar una responsabilidad compartida a una diff --git a/docs/patron-de-listados-de-entidades.md b/docs/patron-de-listados-de-entidades.md index 112f40d..a03fc5f 100644 --- a/docs/patron-de-listados-de-entidades.md +++ b/docs/patron-de-listados-de-entidades.md @@ -2,6 +2,12 @@ Estándar de Metis Desk. Fuente funcional: patrón acordado con el usuario en esta conversación. La referencia de Activos conserva el estilo Vega, los tokens semánticos y la ficha lateral real de la aplicación. +Los listados nuevos y sus operaciones deben aplicar la +[estructura web por entidades y operaciones](estructura-web-por-entidades-y-operaciones.md). +El listado pertenece a `/list/ui`; sus altas, detalles e historiales a sus operaciones +respectivas. Los formularios y diálogos comunes de alta y edición pertenecen a +`/shared/ui`, no al fichero del listado ni a un directorio global de componentes. + ## Estructura obligatoria La pantalla se divide en cabecera, contenido y pie opcional. La cabecera muestra título y subtítulo breve a la izquierda y acciones globales a la derecha. El alta es la acción primaria, normalmente «+ Añadir [entidad]», y abre un modal; se conservan las etiquetas actuales cuando ya describen una operación concreta. Nunca mostrar el formulario junto al listado. @@ -42,41 +48,43 @@ Usar tabla semántica con nombre accesible, th con scope, controles etiquetados, Carga inicial y errores se presentan dentro del contenido sin afirmar que no hay registros. El vacío distingue ausencia de datos y búsqueda sin resultados. Mantener el mensaje y la recuperación de errores de cada consulta; no inventar resultados ni endpoints. Las recargas conservan datos y controles cuando la integración existente lo permite. -## Inventario previo a la migración +## Inventario de listados y ubicaciones actuales La aplicación navega por espacios y secciones en memoria, no mediante rutas URL independientes. Los componentes siguientes se alcanzan desde CompaniesWorkspace, CompanyDetail o IdentityWorkspace. -| Listado / ámbito | Componente actual | Aplicación | +| Listado / ámbito | Componente y ubicación actual | Aplicación | | --- | --- | --- | -| Compañías | companies/components/companies-page.tsx | Sí | -| Personas/contactos | companies/components/people-section.tsx, PeopleSection | Sí | -| Departamentos | companies/components/department-section.tsx | Sí | -| Sedes | companies/components/company-detail.tsx, SiteSection | Sí | -| Usuarios internos | identity/components/user-management.tsx | Sí | -| Activos | assets/inventory-page.tsx | Sí; conserva panel lateral | -| Puestos de trabajo | assets/workstations-page.tsx | Sí | -| Recursos, incluidas aplicaciones y licencias | resources/resources-page.tsx | Sí | -| Campos y plantillas de recursos, global/compañía | resources/catalog-page.tsx | Sí; dos secciones | -| Campos, plantillas y relaciones de activos, global/compañía | assets/catalog-page.tsx | Sí; tres secciones | -| Cuentas y accesos / catálogos informáticos | companies/access/access-workspace.tsx | Sí; cuenta, titularidad, grupo, pertenencia, autorización, necesidad, cobertura, entorno, sistema, tipo, permiso y plantilla | -| Perfiles de usuario | companies/profiles/work-profiles-page.tsx | Sí | -| Correo por perfil | companies/mail/mail-configurations-page.tsx | Sí, también entrada desde perfil | -| Carpetas por perfil | companies/folders/folder-mappings-page.tsx | Sí, también entrada desde perfil | -| Impresoras por perfil | companies/printers/printer-configurations-page.tsx | Sí, también entrada desde perfil | -| Aplicaciones por perfil | companies/applications/application-configurations-page.tsx | Sí, también entrada desde perfil | -| Certificados por perfil | companies/certificates/certificate-configurations-page.tsx | Sí, también entrada desde perfil | -| Teletrabajo | companies/telework/telework-authorizations-page.tsx | Sí, conserva ámbito de persona | -| Accesos remotos | companies/remote/remote-connections-page.tsx | Sí, conserva ámbito de persona | -| Procesos de personas | companies/processes/processes-page.tsx | Sí; su detalle es excepción | -| Plantillas de procesos | companies/processes/process-templates-page.tsx | Sí | -| Plantillas de intervención, global/compañía | companies/intervention-templates/templates-page.tsx | Sí | -| Tickets, global/compañía | companies/tickets/tickets-page.tsx | Sí | -| Intervenciones, global/compañía | companies/interventions/interventions-page.tsx | Sí | -| Marcas globales | assets/brands-page.tsx | Sí; EntityListHeader y EntityTable, filtro de estado y modales | -| Herramientas de asistencia | assets/support-tools.tsx | Sí; catálogo dentro de un modal | +| Compañías | [CompaniesPage](../modules/companies/src/web/companies/list/ui/companies-page.tsx) | Sí | +| Personas/contactos | [PeopleSection](../modules/companies/src/web/people/list/ui/people-section.tsx) | Sí | +| Departamentos | [DepartmentSection](../modules/companies/src/web/departments/list/ui/department-section.tsx) | Sí | +| Sedes | [SiteSection](../modules/companies/src/web/sites/list/ui/site-section.tsx) | Sí | +| Usuarios internos | [UserManagement](../modules/identity/src/web/users/list/ui/user-management.tsx) | Sí | +| Activos | [AssetInventoryPage](../modules/assets/src/web/assets/list/ui/inventory-page.tsx) | Sí; conserva panel lateral | +| Puestos de trabajo | [WorkstationsPage](../modules/assets/src/web/workstations/list/ui/workstations-page.tsx) | Sí | +| Recursos, incluidas aplicaciones y licencias | [ResourcesPage](../modules/resources/src/web/resources/list/ui/resources-page.tsx) | Sí | +| Campos y plantillas de recursos, global/compañía | [ResourceCatalogPage](../modules/resources/src/web/catalog/list/ui/catalog-page.tsx) | Sí; dos secciones | +| Campos, plantillas y relaciones de activos, global/compañía | [AssetCatalogPage](../modules/assets/src/web/catalog/list/ui/catalog-page.tsx) | Sí; tres secciones | +| Cuentas y accesos / catálogos informáticos | [AccessWorkspacePage](../modules/companies/src/web/access/list/ui/access-workspace.tsx) | Sí; cuenta, titularidad, grupo, pertenencia, autorización, necesidad, cobertura, entorno, sistema, tipo, permiso y plantilla | +| Perfiles de usuario | [WorkProfilesPage](../modules/companies/src/web/work-profiles/list/ui/work-profiles-page.tsx) | Sí | +| Correo por perfil | [MailConfigurationsPage](../modules/companies/src/web/mail-configurations/list/ui/mail-configurations-page.tsx) | Sí, también entrada desde perfil | +| Carpetas por perfil | [FolderMappingsPage](../modules/companies/src/web/folder-mappings/list/ui/folder-mappings-page.tsx) | Sí, también entrada desde perfil | +| Impresoras por perfil | [PrinterConfigurationsPage](../modules/companies/src/web/printer-configurations/list/ui/printer-configurations-page.tsx) | Sí, también entrada desde perfil | +| Aplicaciones por perfil | [ApplicationConfigurationsPage](../modules/companies/src/web/application-configurations/list/ui/application-configurations-page.tsx) | Sí, también entrada desde perfil | +| Certificados por perfil | [CertificateConfigurationsPage](../modules/companies/src/web/certificate-configurations/list/ui/certificate-configurations-page.tsx) | Sí, también entrada desde perfil | +| Teletrabajo | [TeleworkAuthorizationsPage](../modules/companies/src/web/telework-authorizations/list/ui/telework-authorizations-page.tsx) | Sí, conserva ámbito de persona | +| Accesos remotos | [RemoteConnectionsPage](../modules/companies/src/web/remote-connections/list/ui/remote-connections-page.tsx) | Sí, conserva ámbito de persona | +| Procesos de personas | [ProcessesPage](../modules/companies/src/web/processes/list/ui/processes-page.tsx) | Sí; su detalle es excepción | +| Plantillas de procesos | [ProcessTemplatesPage](../modules/companies/src/web/process-templates/list/ui/process-templates-page.tsx) | Sí | +| Plantillas de intervención, global/compañía | [InterventionTemplatesPage](../modules/companies/src/web/intervention-templates/list/ui/templates-page.tsx) | Sí | +| Tickets, global/compañía | [TicketsPage](../modules/companies/src/web/tickets/list/ui/tickets-page.tsx) | Sí | +| Intervenciones, global/compañía | [InterventionsPage](../modules/companies/src/web/interventions/list/ui/interventions-page.tsx) | Sí | +| Marcas globales | [BrandCatalogPage](../modules/assets/src/web/brands/list/ui/brands-page.tsx) | Sí; EntityListHeader y EntityTable, filtro de estado y modales | +| Herramientas de asistencia | [SupportTools](../modules/assets/src/web/support-tools/list/ui/support-tools.tsx) | Sí; catálogo dentro de un modal | | Asignaciones departamentales | PeopleSection → PersonDetails | Sublistado de ficha; conserva sus operaciones y adopta tabla común | -Rutas relativas anteriores bajo modules/[módulo]/src/web. No hay listados separados de equipos, software, incidencias o ubicaciones adicionales: corresponden a Activos, Recursos, Tickets o Sedes. +Los enlaces apuntan a las ubicaciones actuales bajo `modules//src/web//`. +No hay listados separados de equipos, software, incidencias o ubicaciones adicionales: +corresponden a Activos, Recursos, Tickets o Sedes. ## Excepciones justificadas diff --git a/modules/companies/src/web/workspace/view/ui/workspace-sidebar.tsx b/modules/companies/src/web/workspace/view/ui/workspace-sidebar.tsx index ae036ba..29f9149 100644 --- a/modules/companies/src/web/workspace/view/ui/workspace-sidebar.tsx +++ b/modules/companies/src/web/workspace/view/ui/workspace-sidebar.tsx @@ -77,9 +77,9 @@ export function WorkspaceSidebar({ [ ["home", "dashboard.title", HomeIcon], ["directory", "title", Building2Icon], - ["catalogs", "shell.catalogs", DatabaseIcon], ["tickets", "shell.tickets", TicketIcon], ["interventions", "shell.interventions", WrenchIcon], + ["catalogs", "shell.catalogs", DatabaseIcon], ] as const ).map(([area, label, Icon]) => ( + + + +