docs: actualizar la documentación sobre la estructura web y organización de módulos
This commit is contained in:
parent
d116fef653
commit
f5dd8fdf31
@ -57,6 +57,7 @@ Las fuentes normativas se consultan, no se duplican:
|
|||||||
- [Contratos HTTP](docs/arquitectura/contratos-http.md)
|
- [Contratos HTTP](docs/arquitectura/contratos-http.md)
|
||||||
- [Pruebas](docs/arquitectura/pruebas.md)
|
- [Pruebas](docs/arquitectura/pruebas.md)
|
||||||
- [Modelo DDD e identificadores](docs/arquitectura/modelo-ddd-e-identificadores.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
|
## Seguridad y persistencia
|
||||||
|
|
||||||
@ -77,6 +78,8 @@ Las fuentes normativas se consultan, no se duplican:
|
|||||||
|
|
||||||
## Frontend
|
## 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/<module>/src/web/<entity>/<operation>/`, 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.
|
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.
|
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.
|
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.
|
- 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.
|
- 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.
|
- Ejecutar las validaciones apropiadas para el alcance real del cambio.
|
||||||
|
|||||||
@ -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)
|
- [Preparación y ejecución](docs/puesta-en-marcha.md)
|
||||||
- [Modelo DDD e identificadores](docs/arquitectura/modelo-ddd-e-identificadores.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 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)
|
- [Usuarios y acceso](docs/usuarios-y-acceso.md)
|
||||||
- [Compañías, contactos y sedes](docs/companias-contactos-y-sedes.md)
|
- [Compañías, contactos y sedes](docs/companias-contactos-y-sedes.md)
|
||||||
- [Personas y departamentos](docs/personas-y-departamentos.md)
|
- [Personas y departamentos](docs/personas-y-departamentos.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.
|
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,
|
En módulos existentes y nuevos, el código de `web` debe organizarse por entidad o área
|
||||||
con ámbitos compartidos e índices explícitos según la
|
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).
|
[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.
|
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.
|
||||||
|
|||||||
@ -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.
|
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.
|
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.
|
./common expone contratos y ./client expone la página y recursos de traducción. No hay dependencias locales del ERP.
|
||||||
|
|||||||
@ -33,6 +33,15 @@ Usar tokens semánticos como bg-background, text-foreground y border-border en v
|
|||||||
|
|
||||||
## Añadir componentes
|
## 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:
|
Desde la raíz del proyecto, dentro de WSL:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@ -1,8 +1,27 @@
|
|||||||
# Estructura web por entidades y operaciones
|
# Estructura web por entidades y operaciones
|
||||||
|
|
||||||
El código de navegador de cada módulo se organiza primero por entidad o área funcional y,
|
Fuente normativa de la organización interna del código web de Metis Desk, referenciada
|
||||||
dentro de ella, por las operaciones existentes. Esta estructura se aplica a `core`, `identity`,
|
desde `AGENTS.md`. Todo módulo nuevo y toda entidad, operación o componente que se añada
|
||||||
`assets`, `resources` y `companies`. No modifica la composición del servidor ni los contratos HTTP.
|
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/<module>/src/web/<entity>/<operation>/<responsibility>/
|
||||||
|
```
|
||||||
|
|
||||||
|
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
|
## 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
|
propia no reciben directorios vacíos: por ejemplo, el editor común de alta y edición permanece
|
||||||
en `tickets/shared/ui/`.
|
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.
|
subdivisiones de JSX trivial.
|
||||||
- `api`: funciones de acceso HTTP y claves de consultas existentes.
|
- `api`: funciones de acceso HTTP y claves de consultas de su ámbito, sin dependencias de UI.
|
||||||
- `controllers` y `hooks`: responsabilidades React ya separadas en el código original, como
|
- `queries`: claves y configuración de TanStack Query cuando ya tengan una responsabilidad
|
||||||
`catalog/shared/controllers/use-catalog-save.ts` y
|
separada, como `health/shared/queries/core.query-keys.ts`; no duplicarlas también en `api`.
|
||||||
`work-environments/detail/hooks/use-environment-queries.ts`.
|
- `controllers`: coordinación React de una operación cuando necesite una responsabilidad
|
||||||
- `types` y `helpers`: contratos y cálculos existentes, próximos a sus consumidores.
|
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.
|
||||||
- `<entity>/shared`: código utilizado por varias operaciones de la misma entidad y pruebas
|
- `<entity>/shared`: código utilizado por varias operaciones de la misma entidad y pruebas
|
||||||
que cubren conjuntamente esas operaciones.
|
que cubren conjuntamente esas operaciones.
|
||||||
- `web/shared`: recursos de varias entidades del módulo, incluidas traducciones y componentes
|
- `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
|
comunes. No sustituye a `common`, que sigue conteniendo contratos y schemas compartidos con
|
||||||
el servidor.
|
el servidor.
|
||||||
|
|
||||||
No se han creado controllers, hooks, schemas ni adapters para trasladar lógica desde los
|
Crear únicamente los subdirectorios que la operación necesite. Una pantalla sencilla no
|
||||||
componentes. Esa auditoría queda para una tarea posterior. Las props y los schemas que ya
|
requiere un controller, hook o adapter artificial. Los elementos privados inseparables del
|
||||||
pertenecían a sus ficheros mantienen su contrato y ubicación relativa a la responsabilidad.
|
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
|
## 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`.
|
`processes` y `process-templates`; `interventions` e `intervention-templates`.
|
||||||
Los componentes de dashboard y workspace siguen el mismo criterio funcional.
|
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 `<entity>/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
|
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
|
`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
|
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.
|
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
|
Situar el acceso HTTP en el ámbito más específico que corresponda a sus consumidores:
|
||||||
adecuado: por ejemplo, `identity/shared/api/identity-api.ts` y
|
`<entity>/<operation>/api`, `<entity>/shared/api` o `web/shared/api`. Los clientes existentes
|
||||||
`assets/shared/api/inventory-api.ts`. Separar sus métodos o auditar su lógica excede esta
|
que abarcan varias entidades, como `identity/shared/api/identity-api.ts` y
|
||||||
reorganización. Las funciones, firmas y claves de consultas no cambian.
|
`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
|
## Índices y dependencias
|
||||||
|
|
||||||
Cada nivel con un contrato consumido desde otra unidad dispone de un `index.ts` que enumera
|
Cada nivel debe tener un `index.ts` solo cuando contenga símbolos exportables para otras
|
||||||
sus exportaciones. No se crean índices vacíos, exportaciones `*`, exportaciones de tests ni
|
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.
|
índices para detalles privados utilizados exclusivamente dentro de su propio directorio.
|
||||||
Los tipos se reexportan mediante `export type`.
|
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
|
por ejemplo en flujos de altas anidadas. No se amplía la API pública para resolver esas
|
||||||
dependencias internas.
|
dependencias internas.
|
||||||
|
|
||||||
`web/index.ts` mantiene los símbolos públicos originales de `@metis/<module>/client` y
|
`web/index.ts` compone los índices internos y define los símbolos públicos de
|
||||||
compone los índices internos. Las aplicaciones y otros módulos continúan utilizando ese
|
`@metis/<module>/client` cuando haya consumidores externos. Las aplicaciones y otros módulos
|
||||||
contrato público. Los antiguos caminos internos no tienen reexports de compatibilidad.
|
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
|
## 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
|
referencian sus nuevas ubicaciones; los imports, traducciones y enlaces de documentación
|
||||||
se actualizan junto con los movimientos.
|
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),
|
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)
|
[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
|
y [pruebas](arquitectura/pruebas.md). No trasladar una responsabilidad compartida a una
|
||||||
|
|||||||
@ -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.
|
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 `<entity>/list/ui`; sus altas, detalles e historiales a sus operaciones
|
||||||
|
respectivas. Los formularios y diálogos comunes de alta y edición pertenecen a
|
||||||
|
`<entity>/shared/ui`, no al fichero del listado ni a un directorio global de componentes.
|
||||||
|
|
||||||
## Estructura obligatoria
|
## 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.
|
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.
|
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.
|
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í |
|
| Compañías | [CompaniesPage](../modules/companies/src/web/companies/list/ui/companies-page.tsx) | Sí |
|
||||||
| Personas/contactos | companies/components/people-section.tsx, PeopleSection | Sí |
|
| Personas/contactos | [PeopleSection](../modules/companies/src/web/people/list/ui/people-section.tsx) | Sí |
|
||||||
| Departamentos | companies/components/department-section.tsx | Sí |
|
| Departamentos | [DepartmentSection](../modules/companies/src/web/departments/list/ui/department-section.tsx) | Sí |
|
||||||
| Sedes | companies/components/company-detail.tsx, SiteSection | Sí |
|
| Sedes | [SiteSection](../modules/companies/src/web/sites/list/ui/site-section.tsx) | Sí |
|
||||||
| Usuarios internos | identity/components/user-management.tsx | Sí |
|
| Usuarios internos | [UserManagement](../modules/identity/src/web/users/list/ui/user-management.tsx) | Sí |
|
||||||
| Activos | assets/inventory-page.tsx | Sí; conserva panel lateral |
|
| Activos | [AssetInventoryPage](../modules/assets/src/web/assets/list/ui/inventory-page.tsx) | Sí; conserva panel lateral |
|
||||||
| Puestos de trabajo | assets/workstations-page.tsx | Sí |
|
| Puestos de trabajo | [WorkstationsPage](../modules/assets/src/web/workstations/list/ui/workstations-page.tsx) | Sí |
|
||||||
| Recursos, incluidas aplicaciones y licencias | resources/resources-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 | resources/catalog-page.tsx | Sí; dos secciones |
|
| 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 | assets/catalog-page.tsx | Sí; tres 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 | companies/access/access-workspace.tsx | Sí; cuenta, titularidad, grupo, pertenencia, autorización, necesidad, cobertura, entorno, sistema, tipo, permiso y plantilla |
|
| 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 | companies/profiles/work-profiles-page.tsx | Sí |
|
| Perfiles de usuario | [WorkProfilesPage](../modules/companies/src/web/work-profiles/list/ui/work-profiles-page.tsx) | Sí |
|
||||||
| Correo por perfil | companies/mail/mail-configurations-page.tsx | Sí, también entrada desde perfil |
|
| 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 | companies/folders/folder-mappings-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 | companies/printers/printer-configurations-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 | companies/applications/application-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 | companies/certificates/certificate-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 | companies/telework/telework-authorizations-page.tsx | Sí, conserva ámbito de persona |
|
| Teletrabajo | [TeleworkAuthorizationsPage](../modules/companies/src/web/telework-authorizations/list/ui/telework-authorizations-page.tsx) | Sí, conserva ámbito de persona |
|
||||||
| Accesos remotos | companies/remote/remote-connections-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 | companies/processes/processes-page.tsx | Sí; su detalle es excepción |
|
| Procesos de personas | [ProcessesPage](../modules/companies/src/web/processes/list/ui/processes-page.tsx) | Sí; su detalle es excepción |
|
||||||
| Plantillas de procesos | companies/processes/process-templates-page.tsx | Sí |
|
| Plantillas de procesos | [ProcessTemplatesPage](../modules/companies/src/web/process-templates/list/ui/process-templates-page.tsx) | Sí |
|
||||||
| Plantillas de intervención, global/compañía | companies/intervention-templates/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 | companies/tickets/tickets-page.tsx | Sí |
|
| Tickets, global/compañía | [TicketsPage](../modules/companies/src/web/tickets/list/ui/tickets-page.tsx) | Sí |
|
||||||
| Intervenciones, global/compañía | companies/interventions/interventions-page.tsx | Sí |
|
| Intervenciones, global/compañía | [InterventionsPage](../modules/companies/src/web/interventions/list/ui/interventions-page.tsx) | Sí |
|
||||||
| Marcas globales | assets/brands-page.tsx | Sí; EntityListHeader y EntityTable, filtro de estado y modales |
|
| 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 | assets/support-tools.tsx | Sí; catálogo dentro de un modal |
|
| 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 |
|
| 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/<module>/src/web/<entity>/`.
|
||||||
|
No hay listados separados de equipos, software, incidencias o ubicaciones adicionales:
|
||||||
|
corresponden a Activos, Recursos, Tickets o Sedes.
|
||||||
|
|
||||||
## Excepciones justificadas
|
## Excepciones justificadas
|
||||||
|
|
||||||
|
|||||||
@ -77,9 +77,9 @@ export function WorkspaceSidebar({
|
|||||||
[
|
[
|
||||||
["home", "dashboard.title", HomeIcon],
|
["home", "dashboard.title", HomeIcon],
|
||||||
["directory", "title", Building2Icon],
|
["directory", "title", Building2Icon],
|
||||||
["catalogs", "shell.catalogs", DatabaseIcon],
|
|
||||||
["tickets", "shell.tickets", TicketIcon],
|
["tickets", "shell.tickets", TicketIcon],
|
||||||
["interventions", "shell.interventions", WrenchIcon],
|
["interventions", "shell.interventions", WrenchIcon],
|
||||||
|
["catalogs", "shell.catalogs", DatabaseIcon],
|
||||||
] as const
|
] as const
|
||||||
).map(([area, label, Icon]) => (
|
).map(([area, label, Icon]) => (
|
||||||
<WorkspaceNavigationButton
|
<WorkspaceNavigationButton
|
||||||
@ -115,6 +115,7 @@ export function WorkspaceSidebar({
|
|||||||
<KeyRoundIcon aria-hidden="true" className="size-[18px]" />
|
<KeyRoundIcon aria-hidden="true" className="size-[18px]" />
|
||||||
<span>{accessTranslation("catalogTitle")}</span>
|
<span>{accessTranslation("catalogTitle")}</span>
|
||||||
</WorkspaceNavigationButton>
|
</WorkspaceNavigationButton>
|
||||||
|
|
||||||
<WorkspaceNavigationButton
|
<WorkspaceNavigationButton
|
||||||
aria-label={assetTranslation("title")}
|
aria-label={assetTranslation("title")}
|
||||||
aria-pressed={catalog === "assets"}
|
aria-pressed={catalog === "assets"}
|
||||||
@ -125,6 +126,7 @@ export function WorkspaceSidebar({
|
|||||||
<BoxIcon aria-hidden="true" className="size-[18px]" />
|
<BoxIcon aria-hidden="true" className="size-[18px]" />
|
||||||
<span>{assetTranslation("title")}</span>
|
<span>{assetTranslation("title")}</span>
|
||||||
</WorkspaceNavigationButton>
|
</WorkspaceNavigationButton>
|
||||||
|
|
||||||
<WorkspaceNavigationButton
|
<WorkspaceNavigationButton
|
||||||
aria-label={t("interventionTemplates.title")}
|
aria-label={t("interventionTemplates.title")}
|
||||||
aria-pressed={catalog === "intervention-templates"}
|
aria-pressed={catalog === "intervention-templates"}
|
||||||
@ -135,6 +137,7 @@ export function WorkspaceSidebar({
|
|||||||
<LayoutTemplateIcon aria-hidden="true" className="size-[18px]" />
|
<LayoutTemplateIcon aria-hidden="true" className="size-[18px]" />
|
||||||
<span>{t("interventionTemplates.title")}</span>
|
<span>{t("interventionTemplates.title")}</span>
|
||||||
</WorkspaceNavigationButton>
|
</WorkspaceNavigationButton>
|
||||||
|
|
||||||
<WorkspaceNavigationButton
|
<WorkspaceNavigationButton
|
||||||
aria-label={assetTranslation("brands.title")}
|
aria-label={assetTranslation("brands.title")}
|
||||||
aria-pressed={catalog === "brands"}
|
aria-pressed={catalog === "brands"}
|
||||||
@ -145,6 +148,7 @@ export function WorkspaceSidebar({
|
|||||||
<LayersIcon aria-hidden="true" className="size-[18px]" />
|
<LayersIcon aria-hidden="true" className="size-[18px]" />
|
||||||
<span>{assetTranslation("brands.title")}</span>
|
<span>{assetTranslation("brands.title")}</span>
|
||||||
</WorkspaceNavigationButton>
|
</WorkspaceNavigationButton>
|
||||||
|
|
||||||
<WorkspaceNavigationButton
|
<WorkspaceNavigationButton
|
||||||
aria-label={resourceTranslation("title")}
|
aria-label={resourceTranslation("title")}
|
||||||
aria-pressed={catalog === "resources"}
|
aria-pressed={catalog === "resources"}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user