--- id: "0107c" title: "Partir modules/data_table/data_table.cpp (4777 LOC) en sub-funciones del registry" status: pendiente type: refactor domain: - cpp-stack - meta scope: module priority: alta depends: [] blocks: - "0107d" related: - "0107" - "0081" created: 2026-05-17 updated: 2026-05-17 tags: [modules, data-table, refactor, registry, viz] --- # 0107c — Partir `data_table.cpp` 4777 LOC Parte del issue principal [0107](0107-modules-standardization.md). ## Problema `modules/data_table/data_table.cpp` es un god-file de 4777 LOC con UI entera dentro: barra de chips, tabla grid, paneles de viz, drill-down, joins, panel Ask AI, button event sink, color rules, breadcrumb, tooltips. Imposible auditar consumidores parciales. Cada bloque deberia ser una funcion del registry con su `.md` propio (Ejemplo + Cuando usarla + Gotchas). ## Decision Partir en **6 sub-funciones** dentro de `cpp/functions/viz/` (no en `modules/data_table/` — son funciones del registry reutilizables). El modulo bundla las 6 + el entrypoint thin. | Sub-funcion | LOC objetivo | Responsabilidad | |---|---|---| | `data_table_chips_cpp_viz` | ~600 | Barra de chips superior: filtros activos, TQL preview, save/load query | | `data_table_grid_cpp_viz` | ~1200 | Render del grid: cells, sorting, freeze cols, declarative renderers (Badge/Progress/Duration/Icon/Button/Dots/CategoricalChip/ColorScale) | | `data_table_viz_panels_cpp_viz` | ~800 | Paneles de viz lateral: histograms, line, scatter, value-counts | | `data_table_drill_cpp_viz` | ~300 | Drill-down stack + breadcrumb | | `data_table_ai_panel_cpp_viz` | ~500 | Panel Ask AI: prompt, llamada a `llm_anthropic`, render respuesta, export | | `data_table_color_rules_cpp_viz` | ~400 | Editor de reglas de color por columna + aplicacion | Entrypoint `data_table.cpp` queda ~400 LOC: compone las 6 sub-funciones, gestiona `State`, dispatcher de eventos. ## Tareas - [ ] **3.1** Leer `data_table.cpp` end-to-end e identificar fronteras funcionales (comentario header de cada bloque sirve). - [ ] **3.2** `cpp/functions/viz/data_table_chips.cpp` + `.h` + `.md` (NEW). - [ ] **3.3** `cpp/functions/viz/data_table_grid.cpp` + `.h` + `.md` (NEW). - [ ] **3.4** `cpp/functions/viz/data_table_viz_panels.cpp` + `.h` + `.md` (NEW). - [ ] **3.5** `cpp/functions/viz/data_table_drill.cpp` + `.h` + `.md` (NEW). - [ ] **3.6** `cpp/functions/viz/data_table_ai_panel.cpp` + `.h` + `.md` (NEW). - [ ] **3.7** `cpp/functions/viz/data_table_color_rules.cpp` + `.h` + `.md` (NEW). - [ ] **3.8** Reducir `data_table.cpp` a entrypoint thin que llama las 6. - [ ] **3.9** `modules/data_table/CMakeLists.txt`: anadir las 6 sub-funciones a la static lib. - [ ] **3.10** `modules/data_table/module.md`: bump `version: 2.0.0` (breaking interno, API publica intacta) + extender `members:` con las 6 nuevas + entrada en `## Capability growth log`. - [ ] **3.11** Recompilar TODAS las apps que linkean `fn_module_data_table` (7 apps). - [ ] **3.12** Smoke manual de cada app: tabla renderiza, chips funcionan, viz panels OK, AI panel OK, drill OK, color rules OK. - [ ] **3.13** `primitives_gallery --capture` golden image antes vs despues — diff visual cero. ## Riesgos - **State struct**: hoy `data_table::State` es opaco interno del .cpp. Tras split, las 6 sub-funciones necesitan acceder a partes de el. Opciones: - (a) Mover `State` a `data_table_types.h` publico (mas exposicion pero claro). - (b) Definir `State` en `data_table.h` con sub-structs por sub-funcion (`State::chips_state`, `State::grid_state`, etc.) y cada sub-funcion recibe su sub-state. - **Recomendacion**: (b). Mantiene encapsulacion y cada sub-funcion tiene firma clara. - **API publica `data_table::render(...)` no cambia**. Es la regla dura. Si la firma debe cambiar, ya no es 0107c sino issue nuevo con migration plan. - **Tiempo de refactor**: 4777 LOC → 6 archivos requiere cuidado quirurgico. Lanzamos `fn-constructor` en paralelo. ## Notas - Las 6 sub-funciones son `purity: impure` (manipulan ImGui state global). - Cada `.md` con `tags: [viz, table, imgui, ui]` + `framework: imgui`. - El refactor lo hara un sub-agente fn-constructor lanzado en paralelo desde el flujo principal del issue 0107.