#49 feat: reemplazar cytoscape por vis-network con semantica de certeza en graficos de provenance
This commit is contained in:
12
AGENTS.md
12
AGENTS.md
@@ -17,7 +17,7 @@ src/
|
||||
│ ├── order/ # Componentes del resumen de pedido público
|
||||
│ ├── provenance/ # Provenance (público + admin): gráficos, sección y CRUD admin
|
||||
│ │ └── admin/ # Organizaciones, Proveedores, Geografía, SupplierLinkDialog
|
||||
│ └── graph/ # CytoscapeChart.vue (wrapper genérico de cytoscape)
|
||||
│ └── graph/ # VisChart.vue (wrapper genérico de vis-network)
|
||||
├── layouts/ # Layouts de página
|
||||
├── pages/ # Vistas (auto-routed desde文件名)
|
||||
│ └── admin/ # Páginas admin (products, organizations, suppliers, geography, ...)
|
||||
@@ -28,7 +28,6 @@ src/
|
||||
│ ├── api-implementation.js # Factory que selecciona implementación
|
||||
│ ├── auth.js # Manejo de auth (login, tokens JWT)
|
||||
│ ├── django-api.js # Implementación de API para Django
|
||||
│ ├── graph/ # Genérico de grafos: graph-layout.js (layout por columnas + cytoscape)
|
||||
│ └── http.js # Axios instance con interceptors
|
||||
├── stores/ # Pinia stores
|
||||
└── styles/ # SCSS settings
|
||||
@@ -97,7 +96,7 @@ No hay un estilo mayoritario. El código histórico está partido:
|
||||
- Tiene `ignorePatterns` masivo: `src/**` excepto los archivos nuevos de la tarea
|
||||
(`!src/components/order/**`, `!src/components/PublicOrderSummary.vue`,
|
||||
`!src/components/provenance/**`, `!src/components/graph/*.vue`,
|
||||
`!src/services/graph/*.js`, `!src/pages/pedido/**`)
|
||||
`!src/pages/pedido/**`)
|
||||
- **Los archivos nuevos deben seguir StandardJS** para quedar lint-eados:
|
||||
- 2 espacios (indent), sin semicolons, comillas simples
|
||||
- `function () {}` con espacio, `const f = (x) => x` (arrow-parens en args únicos NO)
|
||||
@@ -177,9 +176,8 @@ No hay un estilo mayoritario. El código histórico está partido:
|
||||
- Los gráficos se renderizan en el resumen público (`ProvenanceSection` dentro de `PublicOrderSummary.vue`) a partir de `product_provenance` embebido en el resumen (`GET /don_confiao/resumen_publico/<code>`). El backend NO genera los gráficos.
|
||||
- Payload: `[{ product: {id, name, catalogue_images[]}, suppliers: [{ supplier: {...}, organization|null, municipality|null, department|null, country|null }] }]`.
|
||||
- **Genérico reutilizable:**
|
||||
- `src/services/graph/graph-layout.js`: `computeColumnLayout` (layout por columnas puro) y `toCytoscapeElements` (adapta nodos/aristas a cytoscape, añade clase `has-image` si el nodo tiene imagen)
|
||||
- `src/components/graph/CytoscapeChart.vue`: wrapper de cytoscape.js (props `elements`, `styles` (map a `style` en cytoscape), `layout`, `height`; emite `select` con `node.data()`)
|
||||
- **Específico público** (`src/components/provenance/`): builders puros en `provenance-graph.js` (`buildSupplierOrganizationGraph`, `buildTerritoryGraph`, `hasAnySupplier`, `hasAnyTerritory`), los charts (que muestran "próximamente estará disponible" cuando no hay relaciones), `ProvenanceDetailModal.vue` y `ProvenanceSection.vue`
|
||||
- `src/components/graph/VisChart.vue`: wrapper de vis-network (props `nodes`, `edges`, `height`, `options`; import `import { DataSet, Network } from 'vis-network/standalone'`; emite `select` con el nodo). **OJO**: nodo con `image: null` → TypeError de vis; omitir la clave `image` si no hay foto
|
||||
- **Específico público** (`src/components/provenance/`): builders puros en `provenance-graph.js` (`buildSupplierOrganizationGraph`, `buildTerritoryGraph`, `hasAnySupplier`, `hasAnyTerritory`) y el adaptador vis `provenance-vis.js` (`toVisNodes`, `toVisEdges`, `chartOptions`). **Semántica de certeza**: arista con `certain: true` es continua (inequívoca) y `certain: false` es discontinua (dudosa); con varios proveedores por producto se inserta un nodo `junction:<productId>` (disyunción) con arista sólida hasta él y discontinua hacia cada proveedor; la duda se corta donde los proveedores coinciden (misma organización/municipio/departamento). Los charts (que muestran "próximamente estará disponible" cuando no hay relaciones), `ProvenanceDetailModal.vue` y `ProvenanceSection.vue`
|
||||
- **Admin CRUD** (`src/components/provenance/admin/`): `OrganizationsManagement.vue`, `SuppliersManagement.vue`, `GeographyManagement.vue` (tabs países/departamentos/municipios), `SupplierLinkDialog.vue` (vincula productos↔proveedores, abierto desde `ProductsManagement.vue`). Páginas en `src/pages/admin/{organizations,suppliers,geography}.vue`; rutas en `ADMIN_ROUTES` (`router/index.js`); ítems en `NavBar.vue`
|
||||
- **Endpoints provenance**: `/don_confiao/api/organizations/`, `/suppliers/`, `/countries/`, `/departments/`, `/municipalities/` (CRUD); vincular productos con `PATCH /don_confiao/api/products/<id>/` body `{"suppliers": [ids]}`; detalle de producto (con `suppliers`) via `GET /don_confiao/api/products/<id>/`
|
||||
- Los tests mockean cytoscape (`vi.mock('cytoscape', ...)`) y la API con `global.provide: { api }`
|
||||
- Los tests mockean `vis-network/standalone` (`vi.mock('vis-network/standalone', ...)`) o el propio `VisChart.vue`, y la API con `global.provide: { api }`
|
||||
|
||||
Reference in New Issue
Block a user