d3da1416f3
- AppState anade `group_expanded` (unordered_map<string,bool>) en RAM,
default vacio = todos los grupos colapsados al arranque. Sin
persistencia entre sesiones (fase 1).
- `apply_group_filter(GraphData*, db_path, expanded)` consulta
entities (id, group_id, type_ref) de operations.db, marca como
ocultos los nodos cuyo group_id apunta a un grupo no expandido,
compacta `g->nodes` y re-mapea indices de aristas.
- Aristas:
* Cross-edge (un extremo oculto, otro fuera): se redirige el
extremo oculto al nodo del grupo. Sin dedup (issue 0035 dec. 5).
* Internas (ambos extremos en el mismo grupo colapsado): se ocultan.
* Inter-grupo (ambos en grupos colapsados distintos): dedup por
par no ordenado (group_a, group_b) + rel_type, una linea por par.
* Orfanas (group_id apunta a un grupo no presente en grafo): el
nodo se oculta y sus aristas se descartan.
- Centralizado: el filtro corre en `reload_graph()` cuando se le
pasa `group_expanded`, y en `load_input()` tras el load inicial.
Cubre las 4 rutas de carga del app (toolbar reload, mutaciones,
inspector save, primera carga / switch project).
- Idempotente sobre un grafo ya filtrado y robusto frente a BDs sin
columna `group_id` (schema antiguo) — no toca el grafo.
Smoke test manual con 3 BDs sintéticas:
- Grupo + 2 children + edges cruzadas/internas: nodes 5→3, edges
4→3 (internal hidden, cross redirected).
- 2 grupos con 4 cross-edges entre ellos: edges 4→1 (dedup).
- group_id huerfano: nodo oculto + arista descartada.
Build clean en Windows. Tests verdes:
- WSL pytest: 32 passed.
- Windows pytest: 21 passed + 11 skipped.
Refs: issues/0035b-renderer-hides-grouped-children.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2.4 KiB
2.4 KiB
id, title, status, priority, created, parent, depends_on
| id | title | status | priority | created | parent | depends_on | |
|---|---|---|---|---|---|---|---|
| 0035b | Renderer oculta hijos de grupos colapsados + dedup de aristas grupo-a-grupo | done | high | 2026-05-03 | 0035 |
|
Objetivo
El renderer aprende a esconder entidades cuyo group_id apunta a un
grupo colapsado, y a deduplicar aristas que cruzan dos grupos
colapsados a una sola linea por par de grupos. Sin este paso, los
grupos creados por enrichers (0035c) seguirian mostrando todos sus
hijos en el canvas.
Cambios
- Estado de expansion en RAM:
unordered_map<entity_id, bool>en AppState (group_expanded). Default: vacio (todos los grupos colapsados al arranque). No persiste entre sesiones (fase 1). - Filtro al cargar el grafo (
graph_load_from_operationso wrapper en el app): tras leer entities de la BD, descartar las que tengangroup_id != NULLy cuyo grupo padre no este expandido. Las aristas cuyos extremos esten descartados tambien se omiten. - Deduplicacion de aristas inter-grupo: cuando ambos extremos de
una arista caen dentro de grupos colapsados (incluso el mismo),
colapsamos el conjunto a UNA linea por par
(group_a, group_b). Sin peso visual, sin grosor variable. Solo deduplicacion topologica. - Centralizar el filtro: aplicarlo dentro del loader (no en cada caller). Hoy el grafo se recarga desde toolbar reload, dirty_counter de jobs, chat mutations marker, switch project — el filtro debe funcionar en TODAS estas rutas.
Acceptance criteria
- Insertando manualmente en BD un
Group+ un Url congroup_idque apunte a el, recargar el grafo muestra solo el cuadrado, no el Url. - Si el Url tiene una arista a un Domain externo, la arista no se dibuja al Url oculto pero SI se dibuja al cuadrado del grupo.
- Si dos Urls dentro del mismo grupo tienen aristas a un Domain externo, se dibuja UNA sola arista del grupo al Domain (dedup).
- Con
group_expanded[id] = true(manualmente seteado a efectos de test, no hay UI todavia), los hijos vuelven a aparecer y las aristas se dibujan a su extremo real. - Tests pytest verdes.
TBD
Branch issue/0035b-renderer-hides-grouped-children en el sub-repo,
merge --no-ff a master con tests verdes.
Out of scope
- UI para expandir/colapsar grupo (drilling se hace via tableview en 0035d, no expandiendo en canvas).
- Layouts internos del grupo expandido (fase 3).
- Agregacion de aristas con peso visual (fase 3).