--- 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 = '' AND metadata LIKE '%"row_id": ""%' LIMIT 1` (o el query exacto usado en 0011 para detectar promovidas). Cache simple: por window, mantener un `unordered_set 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).