112 lines
12 KiB
Markdown
112 lines
12 KiB
Markdown
|
|
# Patrón de listados de entidades
|
||
|
|
|
||
|
|
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.
|
||
|
|
|
||
|
|
## 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.
|
||
|
|
|
||
|
|
El contenido contiene una tabla y cuatro bandas, en este orden:
|
||
|
|
|
||
|
|
1. Búsqueda rápida a la izquierda y filtros propios de la entidad a la derecha. El texto indica los campos buscables. Cuando hay criterios aplicados, Limpiar filtros restaura los valores iniciales de la pantalla; no cambia el ámbito de compañía ni el perfil desde el que se ha navegado.
|
||
|
|
2. Información «Mostrando X-Y de N [entidades]» a la izquierda; Columnas y Ordenar por a la derecha. Estos controles cambian la representación, no los filtros ni los datos.
|
||
|
|
3. Cabeceras y filas de la tabla, con densidad uniforme. Los estados vacíos siguen dentro de esta banda.
|
||
|
|
4. Información del mismo rango repetida a la izquierda; anterior, páginas, siguiente y elementos por página a la derecha.
|
||
|
|
|
||
|
|
El pie opcional está fuera de la tabla y solo aparece cuando existe contenido complementario útil. No añadir estadísticas ni decoración sin una necesidad funcional.
|
||
|
|
|
||
|
|
## Reglas de interacción
|
||
|
|
|
||
|
|
- Búsqueda y filtros se combinan; filtrar o cambiar tamaño de página vuelve a la primera página. Si una actualización reduce resultados, se ajusta la página para no mostrar un rango inexistente.
|
||
|
|
- Contar los resultados filtrados antes de paginar. Cero resultados se expresa como 0-0 de 0. La ordenación actúa sobre todos los resultados filtrados antes de paginar y mantiene un orden estable para empates.
|
||
|
|
- Columnas configurables mediante controles con etiquetas; identificación y acciones no se ocultan. No se pierde acceso a una acción por ocultar otra columna. La configuración es local a la vista y no se guarda en datos de negocio.
|
||
|
|
- Solo ofrecer ordenación para valores con significado comparable. Cabeceras ordenables son botones accesibles y expresan aria-sort. Permitir recuperar el orden inicial, respetando los órdenes existentes, por ejemplo última actualización en tickets e intervenciones.
|
||
|
|
- El identificador principal abre la ficha existente si hay una. Usar enlace si existe una ruta real; botón si abre diálogo, detalle en memoria o panel. No inventar rutas.
|
||
|
|
- Representar estados mediante indicador visual y texto, nunca solo color. Mantener los avisos de revisión e información contextual.
|
||
|
|
- Las relaciones son navegables cuando el destino ya ofrece navegación adecuada; no introducir enlaces ficticios ni nuevas rutas.
|
||
|
|
- Acciones de fila al final, con el menú contextual accesible y las restricciones existentes. No convertir acciones de negocio en acciones masivas.
|
||
|
|
- Selección múltiple solo cuando una operación real la necesita. No añadir casillas sin consumidor. Mantener separada la selección del activo para su panel lateral.
|
||
|
|
- Cancelar un modal conserva búsqueda, filtros, página y selección de la lista. Las actualizaciones continúan invalidando las consultas actuales.
|
||
|
|
|
||
|
|
## Común y específico
|
||
|
|
|
||
|
|
Común: distribución, cabecera, cuatro bandas, márgenes, altura base de filas, búsqueda, limpieza, contador, columnas, ordenación, paginación, accesibilidad y estados.
|
||
|
|
|
||
|
|
Específico: título, subtítulo, ámbito, alta y acciones globales, campos buscables, filtros, columnas, formatos, acciones de fila, avisos y destino de ficha. Las columnas conservan la información funcional de cada pantalla. Licencias y aplicaciones continúan dentro del listado Recursos; no crear pantallas para entidades que no existen.
|
||
|
|
|
||
|
|
## Responsive, accesibilidad y estados
|
||
|
|
|
||
|
|
Cabecera y bandas se apilan en anchuras pequeñas. Los filtros ajustan sus controles, la tabla permite desplazamiento horizontal dentro de su contenedor y las celdas largas pueden partir texto. Mantener la navegación del espacio de compañía y el panel de activos en escritorio, con la ficha modal móvil existente.
|
||
|
|
|
||
|
|
Usar tabla semántica con nombre accesible, th con scope, controles etiquetados, foco visible, acciones por teclado y página actual con aria-current. Los elementos decorativos se ocultan al lector. Los menús y modales conservan manejo de foco de Base UI. No depender del color para comunicar información.
|
||
|
|
|
||
|
|
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
|
||
|
|
|
||
|
|
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 |
|
||
|
|
| --- | --- | --- |
|
||
|
|
| 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í |
|
||
|
|
| Herramientas de asistencia | assets/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.
|
||
|
|
|
||
|
|
## Excepciones justificadas
|
||
|
|
|
||
|
|
No son pantallas de listado sencillo: HomePage (estado técnico), WorkEnvironmentPage (resumen de preparación), fichas CompanyDetail/PersonDetails/AssetDetail/ResourceDetail/TicketDetail/InterventionDetail, historiales y revisiones, pasos/instrucciones de plantillas, tareas de ProcessDetail y selectores de formularios.
|
||
|
|
|
||
|
|
AssetRelationships, AssetSupport, MailboxRelations y TicketInterventions son bloques contextuales de ficha, sin gestión independiente de un conjunto; mantienen su presentación contextual. CompanyInventory es un adaptador de consultas, no un listado adicional. Las barras laterales, navegación, formulario de acceso y cambio de contraseña tampoco adoptan el patrón.
|
||
|
|
|
||
|
|
Las instrucciones/historiales que antes estaban expandidos dentro de catálogos se mantienen accesibles desde cada fila; no desaparecen por pasar a tabla.
|
||
|
|
|
||
|
|
## Implementación y verificación
|
||
|
|
|
||
|
|
Se reutilizan Table, Button, Input, SelectWithAction, Dialog y los tokens existentes de @repo/shadcn-ui. Las consultas, DTO, endpoints, permisos y mutaciones permanecen en sus módulos. Los componentes comunes no conocen entidades ni invocan API.
|
||
|
|
|
||
|
|
La validación debe incluir tipos, estilo, pruebas y compilación, además de interacción real para búsqueda/limpieza, columnas, ordenación, cambios de página/tamaño, apertura/cancelación de fichas y panel de activos. Verificar español e inglés y una anchura móvil.
|
||
|
|
|
||
|
|
### Migración realizada
|
||
|
|
|
||
|
|
Se han adaptado las 25 familias de listados del inventario y el sublistado de asignaciones departamentales. Los catálogos y accesos reutilizan sus componentes para las distintas secciones y ámbitos; no son nuevas rutas ni nuevas entidades. El inventario conserva la ficha lateral y su modal móvil. Las fichas, historiales y bloques contextuales de las excepciones mantienen su función.
|
||
|
|
|
||
|
|
Componentes compartidos: EntityListHeader y EntityTable; EntityTableConfiguration para columnas y orden; EntityTableContent para tabla semántica; EntityListPagination, EntityRowActions, EntityAction y EntityStatus para controles. useEntityTable concentra filtros locales, ordenación estable, columnas visibles y paginación. entity-list.ts contiene textos es/en y cálculo de rangos. No se añade selección masiva sin una operación que la consuma.
|
||
|
|
|
||
|
|
La primera columna tiene anchura mínima para evitar nombres ilegibles. El desplazamiento horizontal permanece dentro de la tabla. El panel de activos ajusta su contenido y sus botones a la anchura disponible.
|
||
|
|
|
||
|
|
### Verificación de la entrega (7 de octubre de 2026)
|
||
|
|
|
||
|
|
- pnpm typecheck: correcto, 10 tareas.
|
||
|
|
- pnpm test: correcto, 195 pruebas, incluidas HTTP/MariaDB en la base de pruebas; 9 tareas. Las nuevas pruebas cubren límites de paginación, rangos repetidos, búsqueda local/controlada, traducción y distinción de carga/error/vacío.
|
||
|
|
- pnpm build: correcto, 2 tareas. Se mantiene el aviso de tamaño del paquete web.
|
||
|
|
- pnpm lint y pnpm check: ejecutados; siguen fallando por problemas previos ajenos a la migración. La comprobación específica de todos los archivos de código modificados y nuevos es correcta. No se han añadido supresiones.
|
||
|
|
- Navegador: revisadas todas las familias de pantallas y las secciones de cuentas/accesos; búsqueda, filtros específicos y limpieza, columnas bloqueadas/configurables, ordenación y recuperación del orden inicial, segunda página, tamaño de página y opción vacía.
|
||
|
|
- Navegación comprobada a persona, ticket y activo; edición/copia en modal y cancelación sin guardar. Las definiciones de serie no ofrecen edición y las plantillas globales no ofrecen edición desde una compañía.
|
||
|
|
- Español/inglés y anchura móvil de 390 px comprobados; el activo abre la ficha modal en móvil. En escritorio la página no presenta desbordamiento horizontal; la tabla conserva su propio desplazamiento.
|
||
|
|
- No se han creado ni alterado registros de negocio durante la revisión del navegador.
|