- Added `removeAccessAccount` function to handle account deletion in the database, ensuring no external references exist. - Created `deleteAccount` API function to facilitate account deletion requests from the client. - Developed `AccountDeleteDialog` component for user confirmation before account deletion, integrating with the delete API. - Introduced resource image handling with validation for PNG uploads, including UI components for image selection and preview. - Implemented resource icon template evolution logic to maintain icon bindings without overwriting existing fields. - Added scripts for auditing account deletion and usage checks, ensuring robust testing of the new features.
7.9 KiB
Iconos PNG de recursos
El campo global de serie field:icon, «Icono», es de tipo image. Aplicación,
Sistema operativo y Licencia de software lo incluyen como característica opcional.
Se añade una sola vez a las plantillas existentes, conservando sus UUID, campos,
orden, secciones y personalizaciones. Los reinicios no reponen un binding retirado.
El icono de producto es independiente del icono vectorial de la plantilla.
Selección y validación
El selector compartido admite PNG estáticos de hasta 512 × 512 píxeles y 2 MiB. Mantiene las proporciones y permite previsualizar, sustituir y quitar la imagen. Una selección inválida conserva el valor anterior y bloquea el envío hasta corregirla o retirarla. La lectura pendiente también bloquea el envío. La ayuda, el estado y los errores están disponibles en español e inglés.
El contrato compartido valida firma PNG, dimensiones, integridad CRC de los chunks, datos de imagen, final del contenedor y ausencia de animación. El servidor decodifica además los píxeles con Sharp, con límite de dimensiones. No basta la extensión del archivo ni el MIME declarado. Las rutas JSON de recursos admiten hasta 3 MiB; las demás conservan su límite de 64 KiB.
Las fichas, revisiones y columnas de características muestran la imagen, sin imprimir base64. Los listados de aplicaciones y SO muestran el icono junto al nombre. La ausencia se representa con «—». El soporte blanco del icono mantiene visibles los logotipos oscuros también con el tema oscuro.
Persistencia e historial
La imagen viaja como una URI data:image/png;base64,..., validada, dentro de la
característica. Se conserva como valor escalar valueType=image en las tablas
relacionales resource_characteristics y resource_revision_characteristics.
No se almacena JSON ni se crean URLs remotas dependientes de terceros.
migrateResourceImages amplía explícitamente sus columnas textValue a MEDIUMTEXT
de forma idempotente. Las especificaciones y revisiones admiten el nuevo tipo.
Las escrituras normales conservan UUID e historial; repetir un guardado idéntico
no añade revisiones.
Carga inicial de los catálogos locales
Las imágenes y su procedencia se conservan en
apps/server/data/resource-icons/manifest.json.
Cada entrada identifica producto o familia, archivo PNG, URL de origen y SHA-256.
Se incluyen 40 aplicaciones y las familias Windows 7, Windows 8.1/10/Server,
Windows 11 y macOS. Las versiones y ediciones de una misma familia comparten logo.
Los iconos de menor tamaño mantienen su resolución original; ninguno supera 512 px
por dimensión.
Fuentes: Dashboard Icons, fijado al
commit 83f32e08257b66fbd971ac8d7645f5b38d52e85d,
Simple Icons 13.21.0,
PowerToys y las páginas oficiales de
Chaos/Enscape, voidtools, WinSCP, WinRAR, Nitro y TeamViewer. Se conservan las marcas
de sus titulares para identificar los productos. Dashboard Icons utiliza Apache-2.0
y Simple Icons CC0; sus licencias no sustituyen los derechos sobre las marcas.
Desde la raíz, previsualizar sin escribir:
pnpm --filter @metis/server exec node --env-file=../../.env --import tsx src/import-resource-icons.ts
Para aplicar la carga solicitada, añadir --apply al comando. Este comando comprueba
archivos, huellas y PNG antes de escribir. Requiere un administrador inicial activo,
registra sus revisiones, prepara las plantillas y amplía las especificaciones antiguas
solo con el campo Icono, preservando sus valores anteriores. Conserva iconos existentes
y es reejecutable. No cambia flags de administración o asociación del servidor.
Las pruebas con persistencia y la auditoría Playwright utilizan exclusivamente una
instalación desechable de metis_desk_test; la carga de los catálogos locales es la
operación de datos solicitada, independiente de esas pruebas.
Verificación de esta entrega
- Catálogo local: 40/40 aplicaciones y 38/38 SO con PNG; Icono opcional en las tres plantillas. Segunda ejecución: 0 guardados y 78 iconos conservados.
- Resources: 126 pruebas correctas. PNG/HTTP: 3 pruebas correctas, incluyendo límites, corrupción, animación y rechazo de píxeles no decodificables.
- Integración SO/HTTP/MariaDB: 12 pruebas correctas sobre base desechable; incluye guardado y lectura de un PNG de 512 px, historial e idempotencia.
- Playwright MCP: recorridos de SO y aplicaciones correctos, con carga y retirada por teclado, archivos inválidos, conservación del valor anterior, fichas, búsqueda, paginación y tamaños estrechos/amplios. Cada recorrido utiliza 15 compañías y una principal con al menos 50 personas, activos, recursos, perfiles y puestos; cada catálogo global dispone de 51 productos sintéticos.
- Compilación y typecheck dirigido de Resources, Server y Web correctos. Los archivos modificados de esta implementación pasan Biome y las reglas de espaciado.
pnpm typecheckgeneral se detiene enpackages/shadcn-ui/src/components/calendar.tsxpor el tipo opcional delocale.pnpm lintypnpm checkgenerales detectan incidencias ajenas al cambio.pnpm test, ejecutado con MariaDB desechable, se detiene en dos aserciones decompanies-page.test.tsx: «Personas (1)» y «Esta persona no tiene acceso a Metis Desk». No se han modificado esas áreas.
Skills consultadas: rdx-solid, ux-inputs-and-forms, shadcn y
vercel-react-best-practices. Han orientado el uso de contratos y persistencia
existentes, la conservación del valor ante errores, las etiquetas y ayuda
accesibles y la lectura de archivos desde el evento de selección. Los auditores
especializados mencionados por la skill de formularios no están instalados;
se han realizado las comprobaciones disponibles directamente con Playwright MCP.
Ampliación a todos los listados — 27 de octubre de 2026
El icono se representa junto al nombre en catálogos globales y de compañía, inventario local de SO y aplicaciones, selectores, instalaciones, SO actuales, configuraciones e historiales de aplicaciones, entornos y resúmenes de puestos, mapa de software y sugerencias de coincidencias. El nombre permanece como etiqueta accesible y el adorno no interfiere con el clic de fila, el foco ni la selección. Las referencias públicas incorporan el PNG para los dos ámbitos; no se infiere una imagen por coincidencia de nombre y no se modifican los datos de las compañías.
Verificación de esta ampliación:
- 128 pruebas de Resources y 84 de rdx-ui correctas.
- 14 pruebas de integración HTTP/MariaDB correctas, incluyendo PNG global/local, resolución de SO local y exclusión de referencias de otra compañía.
- Playwright MCP: PNG decodificado en el catálogo global de aplicaciones y SO,
catálogo combinado de compañía, SO local, selector mixto, instalaciones y resumen
del puesto. Se mantienen recorridos de búsqueda, paginación, teclado, selección,
responsive y gates cerrados, con 15 compañías y los volúmenes sintéticos del
procedimiento. Evidencias locales sin sesión en
.artifacts/playwright/authenticated-9qcb5enx,authenticated-cpta18j4yauthenticated-y722zwbl. - Compilación y comprobaciones dirigidas de tipos y formato correctas.
pnpm testmantiene dos fallos decompanies-page.test.tsx; las otras 311 pruebas de Companies pasan.pnpm typecheckgeneral mantiene el error de vendor descrito anteriormente.pnpm lintypnpm checksiguen señalando incidencias fuera de los archivos de esta ampliación.
Skills: ux-tables como principal, complementada por shadcn,
vercel-react-best-practices y rdx-solid: imagen compacta junto a la identidad,
composición compartida, etiquetas de texto conservadas y datos procedentes de las
consultas existentes. No se han instalado los auditores especializados ausentes.