Descripción
Segunda entrega (PR 2/3) del plan de modernización del import de Visio, aprobado en s220.
El usuario ahora accede a una interfaz visual completa para importar y personalizar stencils desde ficheros modernos Visio (.vsdx / .vsd) sin abandone la página: el modal muestra progreso en tiempo real (spinner + polling asíncrono), previsualizaciones de cada shape, edición inline de nombres y asignación de categorías por shape (en lugar de una sola categoría global).
Lo que cambia
Frontend (UI)
Modal de import mejorado (static/js/editor/import_export.js):
- Aceptación de
.vsdxy.vsdademás de.vssx/.vdx/.vss/.svg. - Polling asíncrono: cuando el backend responde
status=processing, el modal entra en espera (spinner) y consultaGET /api/racks/visio/session/{id}cada 2.5 segundos hasta 4 minutos máximo. Si el usuario cierra el modal o arranca otra importación, la espera se cancela limpiamente. - Grid del preview v2:
- Cada fila muestra miniatura del shape (SVG convertido o icono extraído;
.vssdiferidos indican “No preview”). - Nombre editable inline (input de texto, sin interferir con la selección de la fila).
- Categoría por shape (input editable; vacío = categoría general del modal).
- La fila completa selecciona/deselecciona; los inputs no la interfieren.
- Cada fila muestra miniatura del shape (SVG convertido o icono extraído;
Estilos (static/css/components.css):
.import-item-preview: 48×40 px, flex-center, fondo#f5f5f5, borde fino..import-item-name-input,.import-item-category-input: inputs editable con padding/font-size estándar..import-processing+.import-processing-spinner: placeholder con spinner rotatorio (animación 0.8s) y texto explicativo.
Internacionalización:
- Nuevos strings EN con
t():- “Category (optional)”
- “Category for this stencil”
- “Category for this stencil. Empty = the category name above.”
- “Converting Visio file… Large files can take a few minutes.”
- “Conversion failed”
- “Conversion timed out. Try again with a smaller file.”
- “Stencil name”
- “Imported %(count)s stencils into %(categories)s categories”
- Catálogo ES actualizado a mano (entrada quirúrgica v1.49.1 +
compilemessagesverificado).
Backend (API)
Endpoint POST /api/racks/visio/confirm (racks/api/library_files.py):
- Cambio de contrato: ya no espera
category_nameglobal (o lo ignora). Cada master en la listamastersviaja con su propiocategory. - Respuesta ampliada: cada stencil importado en
imported[]ahora incluye el campocategoryindividual. - El frontend agrupa por categoría sin recargar la página — cada shape puede ir a su propia carpeta.
Fix inmediato: reset del input Visio tras análisis, para permitir reelegir el mismo fichero si el polling fue abortado (cierre modal).
Tests
test_confirm_per_shape_categories (tests/api/test_visio_import_v2.py):
- Verifica que
confirmresponde concategorypor item. - Stencils se crean en sus categorías respectivas (Cisco, APC, etc.), no en una sola.
- Área Visio: 13/13 tests en Docker.
Arquitectura del flujo
Usuario sube .vsdx
↓
POST /api/visio/analyze (formData)
↓
Backend inicia worker async → responde { session_id, status="processing", ... }
↓
Frontend renderiza spinner + inicia polling
↓
GET /api/racks/visio/session/{id} cada 2.5s
↓
Cuando status=done, renderiza grid con previews + inputs editable
↓
Usuario edita nombres y categorías, confirma
↓
POST /api/racks/visio/confirm (masters con category por item)
↓
Backend crea stencils en sus carpetas, responde { imported: [..., {id, name, category, ...}] }
↓
Frontend agrupa por category y añade al panel sin recargar
Límites conocidos
- Conversión por página: un SVG por página del dibujo. El troceo fino por shape individual es una posible v2.
- QA con ficheros reales: Cisco/APC/Schneider se valida en la tercera entrega (PR 3), que es puro QA con ficheros de verdad.
Cambios en dependencias
Ninguno. JavaScript vanilla (como el resto del editor), CSS puro, Django i18n estándar.
Impacto usuario
✅ El botón de importar ahora soporta .vsdx y .vsd (formatos modernos de Visio de Microsoft Office).
✅ Progreso visual mientras el servidor convierte ficheros grandes (spinner + estimación de tiempo).
✅ Previsualización de shapes con miniaturas extraídas automáticamente.
✅ Renombrado inline antes de importar (sin recargar la página).
✅ Categoría por shape — cada stencil puede ir a su propia carpeta, o dejar vacío para usar la categoría general.
Notas de desarrollo
- Polling asincrónico: implementado con
async/await+setTimeout. Reemplazo de la llamada síncrona anterior (v1.52.0 solo analizaba.vssx/.vdx/.vss). - Session ID: UUID generado en el backend, viaja en la respuesta de
analyzey en cada consulta de estado. - Sanitización: el SVG de cada master sigue siendo sanitizado antes de persistir (herencia de v1.52.0 PR 1/3).
- i18n quirúrgico: strings nuevos SOLO en este commit; reutilización de strings existentes donde fue posible.
Véase también
- [[feature—stencils—visio-v2-motor-backend]]
- [[concept—saas—multi-tenancy]]
- [[entity—racks—endpoint—confirm-visio-import]]
- [[entity—racks—endpoint—analyze-visio]]
- [[entity—racks—model—stencil]]