376 lines
30 KiB
Markdown
376 lines
30 KiB
Markdown
|
|
# Ficha de carpeta compartida
|
||
|
|
|
||
|
|
Los apartados iniciales documentan la iteración v1. La [iteración v2](#iteración-uiux-v2--refinamiento-visual-responsive-y-accesibilidad) recoge el refinamiento posterior y actualiza sus resultados y límites.
|
||
|
|
|
||
|
|
## Auditoría y adaptación del mockup
|
||
|
|
|
||
|
|
La tarea principal es reconocer y gestionar el activo que publica una carpeta SMB.
|
||
|
|
La ficha existente usa `ResourceSelectionPanel` y `ResourceDetailDialog`; no existe
|
||
|
|
una página independiente que justifique otro layout global. Se conserva este patrón y
|
||
|
|
se añade una extensión específica de detalle, compuesta desde Companies. El resto de
|
||
|
|
plantillas continúa utilizando su detalle genérico.
|
||
|
|
|
||
|
|
Antes del cambio, las características y revisiones del recurso precedían a una tabla de
|
||
|
|
publicaciones. La relación principal quedaba relegada y el historial exigía desplegar
|
||
|
|
otra tabla. El editor no mostraba el recurso y publicador actual al trasladar o cerrar.
|
||
|
|
|
||
|
|
Assets es propietario de las publicaciones. Se reutilizan sus consultas tipadas,
|
||
|
|
resúmenes, selector remoto, comandos `publish` / `transfer` / `end`, periodos UUID,
|
||
|
|
cursores e invalidaciones. Resources conserva la ficha y su dirección. La relación
|
||
|
|
admite cero o un publicador vigente por recurso y varios periodos anteriores.
|
||
|
|
|
||
|
|
La estructura del mockup se adapta a Inter, tokens semánticos, iconos Tabler y acciones
|
||
|
|
primarias rojas. Publicación a ancho completo; datos e historial en dos columnas cuando
|
||
|
|
el contenedor alcanza 900 px; navegación contextual debajo. En el panel lateral y en
|
||
|
|
móvil se apilan en el mismo orden. No se introduce una paleta alternativa ni vendor.
|
||
|
|
|
||
|
|
## Límites de los datos reales
|
||
|
|
|
||
|
|
- Los resúmenes exponen nombre, plantilla y estado del activo. No incluyen icono por
|
||
|
|
plantilla ni sistema operativo: se usa un icono genérico de activo, sin inventar roles.
|
||
|
|
- Los campos de la ficha proceden de su especificación real: UNC, servidor y descripción,
|
||
|
|
además de campos personalizados como Ruta de acceso si ya existen. No se añade un campo
|
||
|
|
local inexistente a todas las instalaciones ni se alteran valores.
|
||
|
|
- No hay un contrato que certifique la correspondencia entre host UNC y activo. Se indica
|
||
|
|
«Correspondencia no verificada», sin diagnosticar errores por comparar nombres.
|
||
|
|
- Los actores del historial llegan como UUID, no como nombres de usuario. Se presentan
|
||
|
|
identificados como UUID. Cada alta/traslado y cierre muestra su fecha real.
|
||
|
|
- Se conserva el orden de registro ascendente y la paginación del contrato; no se invierte
|
||
|
|
solo una página para aparentar un orden descendente global. El activo anterior se
|
||
|
|
muestra cuando su periodo y resumen están disponibles en esa página.
|
||
|
|
- Hay navegación real a necesidades, concesiones, permisos, cuentas y grupos filtrados por
|
||
|
|
recurso. No hay consulta directa de puestos ni relación específica con accesos remotos:
|
||
|
|
se omiten los contadores y filas ficticias del mockup. Registrar una publicación no
|
||
|
|
configura SMB ni determina disponibilidad o permisos efectivos.
|
||
|
|
- La política vigente permite las operaciones a operadores autenticados; no hay un rol
|
||
|
|
independiente de solo lectura para esta relación. La composición respeta la capacidad
|
||
|
|
de gestión recibida, oculta las acciones en solo lectura y ante denegaciones o datos
|
||
|
|
obsoletos. No se introduce otro modelo de permisos.
|
||
|
|
|
||
|
|
## Composición y responsabilidades
|
||
|
|
|
||
|
|
`ResourcesPage.detailContent` recibe recurso, datos actuales y capacidad de gestión.
|
||
|
|
`CompanyNetworkShareDetail` compone `NetworkShareResourceDetail`, pasando los datos y la
|
||
|
|
navegación mediante props y children. Assets conserva la coordinación de publicaciones,
|
||
|
|
la tarjeta del publicador, el historial y el editor contextual. No se añade dependencia
|
||
|
|
Resources → Assets, endpoints, migraciones ni modificaciones del dominio.
|
||
|
|
|
||
|
|
La ausencia de publicación vigente y una publicación finalizada tienen presentaciones
|
||
|
|
distintas cuando el historial permite distinguirlas. La carga mantiene geometría mediante
|
||
|
|
skeleton; el error ofrece reintento y las denegaciones retiran los datos de caché. Trasladar
|
||
|
|
y finalizar capturan el UUID del periodo iniciado; un conflicto no cambia el comando por
|
||
|
|
otro silenciosamente. El cierre explica que solo finaliza la asociación documental.
|
||
|
|
|
||
|
|
## Comparación con la referencia
|
||
|
|
|
||
|
|
| Referencia | Adaptación implementada |
|
||
|
|
| --- | --- |
|
||
|
|
| Cabecera con carpeta, nombre, subtítulo y acciones | Cabecera y toolbar de la ficha existente, con menú de ciclo de vida y edición |
|
||
|
|
| Publicación dominante a ancho completo | Tarjeta con publicador real, plantilla, estado, UNC copiable y acciones |
|
||
|
|
| Botones azules e iconos ilustrados | Acciones rojas y SVG Tabler del sistema de Metis |
|
||
|
|
| Datos e historial en paralelo | Dos columnas desde 900 px del contenedor; una columna en panel y móvil |
|
||
|
|
| Indicador de coincidencia del servidor | Estado neutral: no existe verificación técnica de aliases/DFS/clústeres |
|
||
|
|
| Timeline con nombres y fechas | Fechas y UUID de responsables reales, nombres de activos obtenidos por resúmenes autorizados |
|
||
|
|
| Contadores de puestos y accesos remotos | Se omiten; se ofrece la navegación contextual respaldada por AccessWorkspace |
|
||
|
|
| Estado vacío mostrado junto al ejemplo activo | Estado alternativo real, no una tarjeta de demostración simultánea |
|
||
|
|
|
||
|
|
## Skills y revisión
|
||
|
|
|
||
|
|
`frontend-design` guía la jerarquía y la comparación con el mockup, subordinada a DESIGN.md.
|
||
|
|
`ux-design-review` estructura la revisión de usabilidad, textos, estados y accesibilidad en
|
||
|
|
uso; sus auditores especializados y su política externa no están instalados, por lo que
|
||
|
|
no se atribuyen auditorías automáticas. Faltan, entre otros, `ux-heuristics-audit`,
|
||
|
|
`ux-microcopy-audit`, `ux-accessibility-audit` y `ux-mobile-responsiveness-audit`.
|
||
|
|
`shadcn` guía composición Base UI y reutilización.
|
||
|
|
`vercel-composition-patterns` respalda la extensión por composición y la separación de
|
||
|
|
las interacciones modales. `vercel-react-best-practices` mantiene los datos remotos en
|
||
|
|
TanStack Query y el avance de acciones en callbacks, sin efectos derivados. `rdx-solid`
|
||
|
|
guía ownership, contratos e implementación proporcional. No se añaden dependencias.
|
||
|
|
|
||
|
|
La revisión visual detectó y corrigió recorte del grupo de acciones a 320 px y falta de
|
||
|
|
espacio para el cuerpo con títulos largos al ampliar el texto al 400 %. Las medidas se
|
||
|
|
aplican a las primitivas propias compartidas, sin modificar vendor ni el shell global.
|
||
|
|
|
||
|
|
## Verificación final — 26 de octubre de 2026
|
||
|
|
|
||
|
|
La ejecución final de `python3 scripts/visual-audit.py --network-share-detail --check`
|
||
|
|
completa **28 comprobaciones**, genera **14 capturas** y ejecuta **31/31 pruebas MariaDB**
|
||
|
|
de publicaciones, SMB y accesos en la misma instalación desechable. El proceso retira
|
||
|
|
sus servicios y su sesión al terminar. Datos utilizados: 15 compañías; en la principal,
|
||
|
|
50 personas, 51 activos, 50 perfiles, 50 puestos y 67 recursos. El recurso auditado llega
|
||
|
|
a 21 periodos históricos antes de la última publicación.
|
||
|
|
|
||
|
|
| Control ejecutado | Resultado |
|
||
|
|
| --- | --- |
|
||
|
|
| Asignación, traslado y cierre reales | Correctos; se conservan datos y revisiones del recurso salvo cambios explícitos de estado de la prueba |
|
||
|
|
| Cancelación y foco | Sin escritura; vuelve al botón Cambiar activo |
|
||
|
|
| Conflicto concurrente | Se cierra el periodo en el servidor mientras el diálogo conserva su UUID; el traslado devuelve conflicto real y permite revisar |
|
||
|
|
| Historial y navegación | Eventos persistidos, dos páginas reales, navegación al activo y foco al consultar historial |
|
||
|
|
| Carga, vacío, finalizada, errores y denegación | Estados diferenciados; reintento de ambas consultas; no se muestran datos de publicación de caché tras 403 |
|
||
|
|
| Recurso inactivo | Conserva la publicación y permite finalizarla; no ofrece un traslado |
|
||
|
|
| Solo lectura | Prueba de render es/en con capacidad de gestión deshabilitada; conserva datos y enlaces, sin acciones de escritura |
|
||
|
|
| Responsive | 320, 390, 768, 1024 y 1440 px, sin desbordamientos en texto y acciones de la ficha |
|
||
|
|
| Tema y contraste | Claro y oscuro; 60 nodos de texto medidos por tema. Mínimos 4,53:1 y 4,55:1, respectivamente |
|
||
|
|
| Texto ampliado | 200 % y 400 %; cuerpo desplazable con al menos dos líneas de altura. No equivale a zoom real del navegador |
|
||
|
|
| Movimiento reducido | Skeleton sin animación bajo `prefers-reduced-motion: reduce` |
|
||
|
|
| Teclado | Apertura de asignación, menú, Escape y retorno de foco; copia UNC con anuncio de éxito |
|
||
|
|
| Typechecks dirigidos | Resources, Assets, Companies, RDX UI y web correctos |
|
||
|
|
| Regresiones nativas con `--test-isolation=none` | Resources 124/124, Assets 153/153, RDX UI 83/83; Companies 310/312 |
|
||
|
|
| Pruebas específicas de ficha/publicación | 9/9 |
|
||
|
|
| `python3 scripts/visual-audit.test.py` | 10/10 |
|
||
|
|
| Biome y ESLint dirigidos a los archivos del cambio | Correctos; sintaxis Python y `git diff --check`, correctos |
|
||
|
|
| `pnpm build` | Correcto; aviso de tamaño de chunks existente |
|
||
|
|
| `pnpm typecheck` global | Bloqueado por TS2375 en `packages/shadcn-ui/src/components/calendar.tsx:165`; vendor intacto |
|
||
|
|
| `pnpm test` global | Dos fallos conocidos de textos de personas en `companies-page.test.tsx` (expectativas «Personas (1)» y texto de acceso a Metis) |
|
||
|
|
| `pnpm lint` / `pnpm check` globales | 15 y 173 errores, respectivamente, en archivos ajenos al cambio; ejemplos de skills y código de fotos de personas, entre otros |
|
||
|
|
|
||
|
|
Las mediciones de contraste excluyen controles deshabilitados y elementos ocultos. No
|
||
|
|
certifican WCAG de toda la aplicación ni contraste no textual. Se corrigieron dos acciones
|
||
|
|
en tema oscuro utilizando `text-background` sobre el primario y `text-foreground` en la
|
||
|
|
acción sensible, sin cambiar tokens ni vendor. El hover conserva el fondo primario y usa
|
||
|
|
sombra para no reducir el contraste de texto.
|
||
|
|
|
||
|
|
### Evidencias reales
|
||
|
|
|
||
|
|
Directorio local excluido de Git: `.artifacts/playwright/authenticated-xmi_nn0a/`.
|
||
|
|
`share-detail-report.json` contiene escenarios, geometría y hashes de las capturas;
|
||
|
|
`share-detail-integration.log` contiene las 31 pruebas de integración.
|
||
|
|
|
||
|
|
- [Escritorio, 1440 px](../.artifacts/playwright/authenticated-xmi_nn0a/share-detail-light-1440.png).
|
||
|
|
- [Móvil, 320 px](../.artifacts/playwright/authenticated-xmi_nn0a/share-detail-light-320.png) y
|
||
|
|
[390 px](../.artifacts/playwright/authenticated-xmi_nn0a/share-detail-light-390.png).
|
||
|
|
- [Datos e historial](../.artifacts/playwright/authenticated-xmi_nn0a/share-detail-data-history.png) y
|
||
|
|
[navegación inferior](../.artifacts/playwright/authenticated-xmi_nn0a/share-detail-usage.png).
|
||
|
|
- [Tema oscuro](../.artifacts/playwright/authenticated-xmi_nn0a/share-detail-dark.png).
|
||
|
|
- [Carga](../.artifacts/playwright/authenticated-xmi_nn0a/share-detail-loading.png),
|
||
|
|
[vacío](../.artifacts/playwright/authenticated-xmi_nn0a/share-detail-empty.png),
|
||
|
|
[conflicto](../.artifacts/playwright/authenticated-xmi_nn0a/share-detail-conflict.png) y
|
||
|
|
[confirmación de cierre](../.artifacts/playwright/authenticated-xmi_nn0a/share-detail-end-confirmation.png).
|
||
|
|
|
||
|
|
Las capturas se inspeccionaron frente a la estructura del mockup, sin comparación de píxeles:
|
||
|
|
se conserva la jerarquía, con las adaptaciones de tema, modal, datos y cardinalidad indicadas.
|
||
|
|
|
||
|
|
## Dictamen y pendientes
|
||
|
|
|
||
|
|
**Implementado** dentro del modelo vigente: ficha integrada, relación visible y gestionable,
|
||
|
|
datos, historial real, estados y navegación respaldada por los contratos existentes.
|
||
|
|
|
||
|
|
No se incorporan las capacidades que el dominio no proporciona: verificación técnica del
|
||
|
|
servidor, nombres de actores, sistema operativo del publicador, contadores de puestos o
|
||
|
|
accesos remotos y un nuevo rol de solo lectura. La Ruta de acceso se presenta si pertenece
|
||
|
|
a la especificación real del recurso; no se crea un campo ficticio. El zoom real del navegador
|
||
|
|
y una auditoría completa con tecnología asistiva no se han ejecutado. Se mantienen los
|
||
|
|
fallos globales ajenos descritos. No se despliega ni se modifica infraestructura o producción.
|
||
|
|
|
||
|
|
## Inventario de archivos
|
||
|
|
|
||
|
|
- [modules/assets/src/common/locales/en.json](../modules/assets/src/common/locales/en.json).
|
||
|
|
- [modules/assets/src/common/locales/es.json](../modules/assets/src/common/locales/es.json).
|
||
|
|
- [modules/assets/src/web/index.ts](../modules/assets/src/web/index.ts).
|
||
|
|
- [modules/assets/src/web/network-share-publications/detail/controllers/use-resource-publication.ts](../modules/assets/src/web/network-share-publications/detail/controllers/use-resource-publication.ts).
|
||
|
|
- [modules/assets/src/web/network-share-publications/detail/helpers/publication-events.ts](../modules/assets/src/web/network-share-publications/detail/helpers/publication-events.ts).
|
||
|
|
- [modules/assets/src/web/network-share-publications/detail/ui/network-share-resource-detail.tsx](../modules/assets/src/web/network-share-publications/detail/ui/network-share-resource-detail.tsx).
|
||
|
|
- [modules/assets/src/web/network-share-publications/detail/ui/publication-history.tsx](../modules/assets/src/web/network-share-publications/detail/ui/publication-history.tsx).
|
||
|
|
- [modules/assets/src/web/network-share-publications/detail/ui/published-share-asset.tsx](../modules/assets/src/web/network-share-publications/detail/ui/published-share-asset.tsx).
|
||
|
|
- [modules/assets/src/web/network-share-publications/detail/ui/resource-publication-card.tsx](../modules/assets/src/web/network-share-publications/detail/ui/resource-publication-card.tsx).
|
||
|
|
- [modules/assets/src/web/network-share-publications/detail/ui/unpublished-share.tsx](../modules/assets/src/web/network-share-publications/detail/ui/unpublished-share.tsx).
|
||
|
|
- [modules/assets/src/web/network-share-publications/manage/ui/publication-editor.tsx](../modules/assets/src/web/network-share-publications/manage/ui/publication-editor.tsx).
|
||
|
|
- [modules/assets/src/web/network-share-publications/manage/ui/publication-operation-summary.tsx](../modules/assets/src/web/network-share-publications/manage/ui/publication-operation-summary.tsx).
|
||
|
|
- [modules/assets/src/web/network-share-publications/shared/network-share-ui.test.tsx](../modules/assets/src/web/network-share-publications/shared/network-share-ui.test.tsx).
|
||
|
|
- [modules/companies/src/common/locales/en.json](../modules/companies/src/common/locales/en.json).
|
||
|
|
- [modules/companies/src/common/locales/es.json](../modules/companies/src/common/locales/es.json).
|
||
|
|
- [modules/companies/src/web/resources/detail/ui/company-network-share-detail.tsx](../modules/companies/src/web/resources/detail/ui/company-network-share-detail.tsx).
|
||
|
|
- [modules/companies/src/web/resources/list/ui/company-resources.tsx](../modules/companies/src/web/resources/list/ui/company-resources.tsx).
|
||
|
|
- [modules/resources/src/common/locales/en.json](../modules/resources/src/common/locales/en.json).
|
||
|
|
- [modules/resources/src/common/locales/es.json](../modules/resources/src/common/locales/es.json).
|
||
|
|
- [modules/resources/src/web/index.ts](../modules/resources/src/web/index.ts).
|
||
|
|
- [modules/resources/src/web/resources/detail/ui/resource-detail-actions.tsx](../modules/resources/src/web/resources/detail/ui/resource-detail-actions.tsx).
|
||
|
|
- [modules/resources/src/web/resources/detail/ui/resource-detail-dialog.tsx](../modules/resources/src/web/resources/detail/ui/resource-detail-dialog.tsx).
|
||
|
|
- [modules/resources/src/web/resources/detail/ui/resource-detail.tsx](../modules/resources/src/web/resources/detail/ui/resource-detail.tsx).
|
||
|
|
- [modules/resources/src/web/resources/detail/ui/resource-revision-history.tsx](../modules/resources/src/web/resources/detail/ui/resource-revision-history.tsx).
|
||
|
|
- [modules/resources/src/web/resources/detail/ui/resource-selection-panel.tsx](../modules/resources/src/web/resources/detail/ui/resource-selection-panel.tsx).
|
||
|
|
- [modules/resources/src/web/resources/list/types/resources-page-props.ts](../modules/resources/src/web/resources/list/types/resources-page-props.ts).
|
||
|
|
- [modules/resources/src/web/resources/list/ui/resources-page.tsx](../modules/resources/src/web/resources/list/ui/resources-page.tsx).
|
||
|
|
- [packages/rdx-ui/src/components/detail-panel.tsx](../packages/rdx-ui/src/components/detail-panel.tsx).
|
||
|
|
- [packages/rdx-ui/src/components/form-dialog.tsx](../packages/rdx-ui/src/components/form-dialog.tsx).
|
||
|
|
- [scripts/network-share-detail-ui-audit.py](../scripts/network-share-detail-ui-audit.py).
|
||
|
|
- [scripts/visual-audit.py](../scripts/visual-audit.py).
|
||
|
|
|
||
|
|
Documentación: este informe y [componentes de interfaz](componentes-de-interfaz.md).
|
||
|
|
|
||
|
|
## Iteración UI/UX v2 — Refinamiento visual, responsive y accesibilidad
|
||
|
|
|
||
|
|
### Auditoría previa y alcance
|
||
|
|
|
||
|
|
Se releyeron AGENTS.md, DESIGN.md, los patrones de diálogos, estructura web y pruebas,
|
||
|
|
este informe completo y los seis SKILL.md prioritarios. Se contrastaron las fichas de
|
||
|
|
puestos, las APIs instaladas de Button/Collapsible y las capturas v1. Se mantiene la
|
||
|
|
composición y la semántica SMB de la primera iteración.
|
||
|
|
|
||
|
|
La línea base se repitió **antes de modificar el código v2**:
|
||
|
|
`.artifacts/playwright/authenticated-qe_17tcw/` contiene 28 comprobaciones de navegador,
|
||
|
|
14 capturas y 31/31 pruebas MariaDB. Suites: Resources 124/124, Assets 153/153,
|
||
|
|
RDX UI 83/83 y Companies 310/312. Los dos fallos de Companies ya estaban presentes.
|
||
|
|
|
||
|
|
Problemas pendientes observados: cabecera de cinco líneas a 320 px, icono/publicador
|
||
|
|
apilados con mucha altura, cuatro acciones con peso parecido, repetición prominente
|
||
|
|
de UNC y UUID como metadato principal del historial. Ya estaban resueltos la relación
|
||
|
|
explícita, sus comandos y estados, el conflicto concurrente, la paginación real, los
|
||
|
|
estados vacíos y la distinción entre actividad del recurso y vigencia de publicación.
|
||
|
|
|
||
|
|
`frontend-design` orientó densidad y jerarquía; `ux-design-review`, la revisión de
|
||
|
|
estados, navegación y accesibilidad; `shadcn`, la expansión con Base UI; composición
|
||
|
|
React, las unidades de título y detalle técnico; buenas prácticas React, el uso de
|
||
|
|
TanStack Query y del ResizeObserver solo para medir recorte real; `rdx-solid`, el
|
||
|
|
alcance local y la preservación de contratos. Los auditores especializados ausentes
|
||
|
|
siguen sin instalarse ni ejecutarse; se hicieron las comprobaciones disponibles con
|
||
|
|
Playwright MCP. No se modifica vendor ni se añaden dependencias.
|
||
|
|
|
||
|
|
### Matriz de seguimiento
|
||
|
|
|
||
|
|
| ID | Problema | Cambio aplicado | Prueba y evidencia | Resultado |
|
||
|
|
| --- | --- | --- | --- | --- |
|
||
|
|
| M01 | Densidad móvil y título largo | Nombre visible hasta tres líneas en móvil/dos desde sm; token corporativo `text-base` (14 px) en móvil y `text-lg` (18 px) en escritorio, completo en el árbol accesible y expandible por teclado cuando se recorta; identidad del activo en rejilla compacta | Cinco anchos; expansión con Espacio, contracción con Enter; cierre visible; capturas light-320/light-390; texto 200/400 % | Verificado en navegador; teclado virtual no reproducido |
|
||
|
|
| M02 | Acciones con peso similar | Asignar/Cambiar como primarias; Ver ficha e Historial discretas, con nombres accesibles completos; Finalizar conserva etiqueta y variante sensible compacta | Capturas móvil/escritorio, confirmación documental, cancelación sin escritura y foco restaurado | Verificado; no se duplican operaciones ni se añade menú |
|
||
|
|
| M03 | UUID dominante | Activo y responsable conocido primero; UUID de actor, periodo y predecesor disponibles mediante Collapsible accesible | Capturas history-expanded y history-expanded-mobile; apertura por Espacio; relación aria-controls/panel; prueba es/en de responsable no resuelto | Verificado; nombres parciales solo de revisiones ya autorizadas |
|
||
|
|
| M04 | UNC fragmentada y redundante | Bloque principal completo y seleccionable, oportunidades de salto sin introducir caracteres; atributo secundario compacto; copia por icono con anuncio sin altura adicional | Comparación literal de DOM y portapapeles con UNC larga Unicode; error simulado y recuperación; prueba de segmentos repetidos | Verificado; copia conserva la cadena original |
|
||
|
|
| M05 | Separación y metadatos | Padding móvil menor, datos compactos, separación uniforme y orden publicación/datos/historial/navegación | Capturas en cinco anchos; dos columnas solo con espacio de contenedor; estados vacío/carga/finalizada/inactivo y solo lectura | Verificado; sin modificación adicional de las primitivas compartidas |
|
||
|
|
| M06 | Posibles regresiones de contraste | Tokens existentes, primario conserva fondo en hover, contornos de foco opacos locales | Mediciones de texto claro/oscuro y hover; muestras de iconos interactivos y foco; capturas dark y dark-mobile | Verificado en las muestras: texto ≥4,53:1 claro / ≥4,75:1 oscuro; foco ≥4,65:1 / ≥4,75:1; iconos ≥14,52:1 |
|
||
|
|
| M07 | Teclado y feedback | Expansiones accesibles, nombres de iconos, anuncios de asignación/traslado/finalización y copia; error de copia visible | Enter/Espacio/Escape/Tab/Shift+Tab, menú, retorno de foco, error/reintento, conflicto real, movimiento reducido y ampliación de texto | Verificado en Chromium; lector de pantalla, zoom real y teclado virtual pendientes |
|
||
|
|
| M08 | Riesgo de cambiar dominio o permisos | Presentación y helpers UI; se reutilizan consultas, comandos, periodos e invalidaciones | 31/31 MariaDB; 403 sin datos anteriores ni escritura; recurso inactivo, conflicto, 21 periodos con cursor, navegación real | Verificado; sin cambios de backend ni operaciones sobre servidores SMB |
|
||
|
|
|
||
|
|
### Identidad del responsable
|
||
|
|
|
||
|
|
El contrato de publicaciones sigue proporcionando UUID. El directorio de usuarios exige
|
||
|
|
privilegios adicionales y no se utiliza. `ResourceDTO.history` ya contiene pares
|
||
|
|
`actorId`/`actorName` autorizados al cargar esta misma ficha. Companies aporta únicamente
|
||
|
|
los nombres que difieren del identificador; Assets recibe un `ReadonlyMap` opcional.
|
||
|
|
No se lanzan consultas adicionales, no se supone que todos los responsables estén en las
|
||
|
|
revisiones y no se inventan nombres. Sin coincidencia, el UUID continúa accesible en
|
||
|
|
«Detalles técnicos». Los identificadores no sustituyen la identidad de los periodos.
|
||
|
|
|
||
|
|
### Comparación visual y evidencias
|
||
|
|
|
||
|
|
Antes: [móvil 320](../.artifacts/playwright/authenticated-qe_17tcw/share-detail-light-320.png),
|
||
|
|
[móvil 390](../.artifacts/playwright/authenticated-qe_17tcw/share-detail-light-390.png),
|
||
|
|
[escritorio](../.artifacts/playwright/authenticated-qe_17tcw/share-detail-light-1440.png) y
|
||
|
|
[oscuro](../.artifacts/playwright/authenticated-qe_17tcw/share-detail-dark.png).
|
||
|
|
|
||
|
|
Después: [móvil 320](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-light-320.png),
|
||
|
|
[móvil 390](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-light-390.png),
|
||
|
|
[768](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-light-768.png),
|
||
|
|
[1024](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-light-1024.png),
|
||
|
|
[escritorio](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-light-1440.png),
|
||
|
|
[oscuro](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-dark.png) y
|
||
|
|
[oscuro móvil](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-dark-mobile.png).
|
||
|
|
|
||
|
|
Estados adicionales: [detalle técnico](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-history-expanded.png),
|
||
|
|
[detalle técnico móvil](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-history-expanded-mobile.png),
|
||
|
|
[detalle técnico oscuro](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-history-expanded-dark.png),
|
||
|
|
[traslado](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-transfer.png),
|
||
|
|
[traslado móvil](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-transfer-mobile.png),
|
||
|
|
[vacío](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-empty.png),
|
||
|
|
[carga](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-loading.png),
|
||
|
|
[conflicto](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-conflict.png),
|
||
|
|
[confirmación](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-end-confirmation.png),
|
||
|
|
[texto 200 %](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-text-200.png) y
|
||
|
|
[texto 400 %](../.artifacts/playwright/authenticated-wavl8cyb/share-detail-text-400.png).
|
||
|
|
|
||
|
|
La inspección visual compara la estructura con el mockup original de la conversación:
|
||
|
|
se conservan publicador dominante, UNC, datos e historial; se mantienen los tokens,
|
||
|
|
iconos y colores corporativos y se omiten sus contadores ficticios. A 320 px la acción
|
||
|
|
Cambiar activo aparece en el área visible antes del pie, donde v1 todavía mostraba la
|
||
|
|
continuación de la tarjeta. A 390 px comienza a verse Datos del recurso. En escritorio
|
||
|
|
la tarjeta conserva identidad/UNC en horizontal y permite leer el evento sin UUID
|
||
|
|
expuestos inicialmente. No se afirma una mejora de CLS ni rendimiento.
|
||
|
|
|
||
|
|
### Resultados de pruebas
|
||
|
|
|
||
|
|
La ejecución final `python3 scripts/visual-audit.py --network-share-detail --check`
|
||
|
|
terminó correctamente: **33 entradas de verificación y 20 capturas**. Son **32
|
||
|
|
comprobaciones de navegador y una entrada de integración con 31/31 pruebas MariaDB**.
|
||
|
|
El contador histórico de 28 entradas incluía igualmente la integración; el incremento
|
||
|
|
es de cinco comprobaciones explícitas, sin retirar las regresiones anteriores.
|
||
|
|
Se probaron 320, 390, 768, 1024 y 1440 px, claro/oscuro, hover primario/secundario/sensible,
|
||
|
|
texto 200/400 %, movimiento reducido, título largo y UNC Unicode. No hubo desbordamiento
|
||
|
|
en las medidas de la ficha. Antes de medir cada ancho se esperan fotogramas y
|
||
|
|
animaciones finitas del diálogo, sin pausas arbitrarias.
|
||
|
|
|
||
|
|
`share-detail-report.json` registra escenarios, medidas y hashes de las capturas;
|
||
|
|
`share-detail-integration.log`, las pruebas SQL. Datos exclusivamente sintéticos en
|
||
|
|
`metis_desk_test`: **15 compañías; 50 personas, 51 activos, 50 perfiles, 50 puestos y
|
||
|
|
67 recursos** en la principal; 21 periodos antes de la publicación final. El usuario
|
||
|
|
de navegador es ordinario. La instalación y la sesión se retiran al terminar.
|
||
|
|
|
||
|
|
Las ocho mediciones de texto (dos temas y tres variantes hover por tema) comprobaron
|
||
|
|
60 nodos cada una, con mínimos **4,53:1 claro y 4,75:1 oscuro**. El contorno de foco
|
||
|
|
medido es sólido, de 2 px: **4,65:1 y 4,75:1**. Los tres iconos interactivos muestreados
|
||
|
|
por tema superan **14,52:1**. Las muestras se comparan con 4,5:1 para texto normal,
|
||
|
|
3:1 para texto grande y 3:1 para las muestras pertinentes no textuales.
|
||
|
|
|
||
|
|
| Verificación ejecutada | Resultado v2 |
|
||
|
|
| --- | --- |
|
||
|
|
| Resources, suite completa con `--test-isolation=none` | 125/125; +1 prueba de conservación literal de UNC |
|
||
|
|
| Assets, suite completa con `--test-isolation=none` | 154/154; +1 prueba de nombres autorizados y UUID no resueltos |
|
||
|
|
| RDX UI, suite completa | 83/83 |
|
||
|
|
| Companies, suite completa | 310/312; los mismos dos fallos de textos de la línea base |
|
||
|
|
| Pruebas dirigidas Resources + publicación | 23/23, incluidas 10/10 de publicación |
|
||
|
|
| TypeScript dirigido | Resources, Assets, Companies, RDX UI y apps/web correctos |
|
||
|
|
| Biome dirigido | 34 archivos correctos |
|
||
|
|
| ESLint dirigido | Sin errores; los JSON se verifican con Biome |
|
||
|
|
| Pruebas del lanzador de auditoría | `python3 scripts/visual-audit.test.py`: 10/10 |
|
||
|
|
| Sintaxis Python y `git diff --check` | Correctos |
|
||
|
|
| `pnpm build` | Correcto; mantiene el aviso de tamaño de chunks |
|
||
|
|
| `pnpm typecheck` global | TS2375 preexistente en calendar.tsx:165 del vendor |
|
||
|
|
| `pnpm test` global | Fallan las dos expectativas preexistentes de Companies |
|
||
|
|
| `pnpm lint` / `pnpm check` globales | 15/173 errores ajenos, los mismos que en v1 |
|
||
|
|
|
||
|
|
Los logs técnicos dirigidos se guardaron en `/tmp/metis-share-v2-final-*` y los globales
|
||
|
|
en `/tmp/metis-share-v2-global-*`; son evidencia local temporal. El directorio de
|
||
|
|
capturas está excluido de Git y no contiene sesión ni credenciales tras la limpieza.
|
||
|
|
|
||
|
|
Las primeras ejecuciones v2 detectaron tres errores del guion de auditoría: localizar
|
||
|
|
el botón por su etiqueta anterior después de expandirlo, seleccionar dos anuncios
|
||
|
|
como si fueran uno y referenciar una variable Python desde la evaluación del navegador.
|
||
|
|
Se corrigieron y se repitió la instalación aislada. La medición de foco detectó además
|
||
|
|
que `outline-none` de la primitiva anulaba el estilo del contorno: se declaró
|
||
|
|
`outline-solid` localmente y se volvió a verificar. La etiqueta visible «Ver ficha»
|
||
|
|
queda incluida literalmente en el nombre accesible «Ver ficha del activo». No se silencian como resultados
|
||
|
|
satisfactorios. Las pruebas nuevas protegen conservación de caracteres y ausencia de
|
||
|
|
nombres inventados. No se detectó una regresión funcional SMB en el recorrido final.
|
||
|
|
|
||
|
|
### Archivos de esta iteración
|
||
|
|
|
||
|
|
- Resources: nuevo `network-share-resource-title.tsx`; consumidores
|
||
|
|
`resource-detail-dialog.tsx` y `resource-selection-panel.tsx`; `network-share-address.tsx`,
|
||
|
|
su reinicio por dirección en `resource-detail.tsx` y `resources.test.tsx`.
|
||
|
|
- Assets: `published-share-asset.tsx`, `resource-publication-card.tsx`,
|
||
|
|
`network-share-resource-detail.tsx`, `publication-history.tsx`; nuevo
|
||
|
|
`publication-event-details.tsx`; tipo derivado en `publication-events.ts`, anuncios
|
||
|
|
en `use-resource-publication.ts` y prueba en `network-share-ui.test.tsx`.
|
||
|
|
- Companies: `company-network-share-detail.tsx`, aportación de nombres ya autorizados.
|
||
|
|
- Traducciones es/en de Assets y Resources; alias Tabler en `packages/rdx-ui/src/lib/icons.ts`.
|
||
|
|
- Auditoría reproducible en `scripts/network-share-detail-ui-audit.py`; este informe y
|
||
|
|
`docs/componentes-de-interfaz.md`.
|
||
|
|
|
||
|
|
Las modificaciones anteriores de `DetailPanel` y `FormDialog` pertenecen a v1: v2 no
|
||
|
|
cambia su implementación ni contratos. Tampoco modifica backend, schemas, endpoints,
|
||
|
|
migraciones, revisiones, transacciones, permisos ni estrategia de invalidación.
|
||
|
|
|
||
|
|
### Límites y dictamen v2
|
||
|
|
|
||
|
|
No se ejecutó un lector de pantalla real, zoom del navegador ni teclado virtual.
|
||
|
|
La ampliación CSS del texto al 200/400 % no sustituye esos escenarios. Las medidas
|
||
|
|
muestrales de contraste y la inspección de atributos accesibles no certifican WCAG de
|
||
|
|
toda la aplicación. Los separadores decorativos y controles deshabilitados se distinguen
|
||
|
|
de controles activos; no se exige a los primeros el contraste de un control interactivo.
|
||
|
|
La copia se probó en Chromium del contenedor mediante permisos de portapapeles limitados
|
||
|
|
al origen desechable. No hay operaciones reales sobre SMB ni producción.
|
||
|
|
|
||
|
|
**Implementada y verificada en el alcance solicitado.** Se mejora la densidad móvil,
|
||
|
|
la consulta de nombres y rutas, la jerarquía de acciones y la lectura del historial,
|
||
|
|
con trazabilidad técnica accesible. Se corrige el contorno de foco y se conserva el
|
||
|
|
contraste de texto. Las pruebas no detectan regresiones SMB. Permanecen los fallos
|
||
|
|
globales preexistentes y las comprobaciones con tecnología asistiva indicadas; no se
|
||
|
|
presentan como aprobadas.
|