71 lines
2.1 KiB
Markdown
71 lines
2.1 KiB
Markdown
---
|
|
id: 0036e
|
|
title: Row click en NodeGroups enfoca la entidad en el viewport (kind-aware)
|
|
status: done
|
|
priority: medium
|
|
created: 2026-05-04
|
|
parent: 0036
|
|
depends_on: [0036b]
|
|
---
|
|
|
|
## Objetivo
|
|
|
|
Click sobre una fila en la NodeGroups window centra/selecciona la
|
|
entidad correspondiente en el viewport. Comportamiento ramificado por
|
|
kind:
|
|
|
|
- **kind = Group**: la fila ES una entidad. Click -> pan/zoom de la
|
|
camara hacia su posicion + select.
|
|
- **kind = Table** (DuckDB): la fila NO es entidad necesariamente.
|
|
Resolucion **opcion (c)**:
|
|
- Si ya existe una entidad promovida para ese row_id: click =
|
|
focus.
|
|
- Si no: click = no-op visual + texto disabled abajo del row tipo
|
|
"promote first to focus" como hint sutil. Sin auto-promote.
|
|
|
|
## Cambios
|
|
|
|
### Estado para focus
|
|
|
|
`AppState::want_focus_entity = true; AppState::focus_entity_id = id;`
|
|
Render loop consume el flag, recentra la camara al nodo, marca
|
|
`viewport.selected_node_idx = ...` y limpia el flag.
|
|
|
|
(Probablemente ya existe esta infra desde issue 0011 promote+open
|
|
inspector — reusar `app.want_focus_entity` / `app.focus_entity_id`.)
|
|
|
|
### Lookup de entidad para fila DuckDB
|
|
|
|
Para kind=Table, dado un row_id, comprobar si existe entity con
|
|
`SELECT id FROM entities WHERE source = '<table_id>' AND
|
|
metadata LIKE '%"row_id": "<row_id>"%' LIMIT 1` (o el query exacto
|
|
usado en 0011 para detectar promovidas).
|
|
|
|
Cache simple: por window, mantener un `unordered_set<string>
|
|
promoted_row_ids` que se rellena en cada paginacion. Asi el render
|
|
sabe sin query extra que filas tienen entidad lista para focus.
|
|
|
|
### Render
|
|
|
|
Hacer la fila completa clickable (Selectable o boton invisible
|
|
sobre la fila). Hover indica accion clara.
|
|
|
|
## Acceptance criteria
|
|
|
|
- Click en row de Group: el viewport recentra al nodo y lo
|
|
selecciona.
|
|
- Click en row Table promovida: focus como kind=Group.
|
|
- Click en row Table no promovida: no-op + hint visible.
|
|
- Tests:
|
|
- `test_node_groups_row_click_sets_focus_entity_for_group`
|
|
- `test_node_groups_row_click_noop_for_unpromoted_table_row`
|
|
|
|
## TBD
|
|
|
|
Branch `issue/0036e-row-click-focus`, merge `--no-ff` a master.
|
|
|
|
## Out of scope
|
|
|
|
- Multi-select (fase 2).
|
|
- Hover preview (fase 2).
|