From 4a786911cbbfd64aa0fe0d44750f847a1a5bc113 Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Sun, 17 May 2026 00:07:04 +0200 Subject: [PATCH] docs(flows): DoD obligatorio con user-facing surface + abrir issues 0100-0103 (taxonomia, frontmatter migration, dev_console, work dashboard) Co-Authored-By: Claude Opus 4.7 (1M context) --- CMakeLists.txt | 6 +++--- app.md | 4 ++++ tabs.cpp | 52 ++++++++++++++++++++++++++++++-------------------- 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 839e594..f17f045 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,10 +9,10 @@ add_imgui_app(dag_engine_ui ) target_include_directories(dag_engine_ui PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -# fn_table_viz: provides data_table::render(), viz_render, TQL engine, Lua, LLM. +# fn_module_data_table: provides data_table::render(), viz_render, TQL engine, Lua, LLM. # Guard keeps the app compilable in builds where vendor/lua is absent. -if(TARGET fn_table_viz) - target_link_libraries(dag_engine_ui PRIVATE fn_table_viz) +if(TARGET fn_module_data_table) + target_link_libraries(dag_engine_ui PRIVATE fn_module_data_table) endif() if(WIN32) diff --git a/app.md b/app.md index 0be1774..93a064e 100644 --- a/app.md +++ b/app.md @@ -19,10 +19,14 @@ uses_functions: - llm_anthropic_cpp_core - empty_state_cpp_core uses_types: [] +uses_modules: [data_table_cpp] framework: "imgui" entry_point: "main.cpp" dir_path: "apps/dag_engine_ui" repo_url: "https://gitea.organic-machine.com/dataforge/dag_engine_ui" +icon: + phosphor: "tree-structure" + accent: "#7c3aed" e2e_checks: - id: build_cmake cmd: "cmake --build cpp/build -j --target dag_engine_ui" diff --git a/tabs.cpp b/tabs.cpp index 245a077..07492d9 100644 --- a/tabs.cpp +++ b/tabs.cpp @@ -1,5 +1,5 @@ #include "tabs.h" -#include "viz/data_table.h" +#include "data_table/data_table.h" #include "core/data_table_types.h" #include "core/icons_tabler.h" #include "core/empty_state.h" @@ -127,7 +127,7 @@ void draw_dag_list(const std::string& api_url, ti.rows = static_cast(dags.size()); ti.cols = static_cast(ti.headers.size()); - // BadgeRule set: shared by Status (Badge) and Recent (Dots). + // BadgeRule set: shared by Recent (Dots). auto run_status_badges = [](){ std::vector rules; rules.push_back({"success", "#22c55e", ""}); // verde @@ -137,14 +137,24 @@ void draw_dag_list(const std::string& api_url, rules.push_back({"cancelled", "#6b7280", ""}); // gris return rules; }; + // ChipRule set: Status (CategoricalChip — dot izquierda + texto, siempre visible). + auto run_status_chips = [](){ + std::vector rules; + rules.push_back({"success", "#22c55e"}); + rules.push_back({"failed", "#ef4444"}); + rules.push_back({"running", "#eab308"}); + rules.push_back({"pending", "#94a3b8"}); + rules.push_back({"cancelled", "#6b7280"}); + return rules; + }; // ColumnSpec per column. ti.column_specs.resize(ti.cols); for (int i = 0; i < ti.cols; i++) ti.column_specs[i].id = ti.headers[i]; - // idx 2 — "Status": Badge renderer for the single last-run status string. - ti.column_specs[2].renderer = data_table::CellRenderer::Badge; - ti.column_specs[2].badges = run_status_badges(); + // idx 2 — "Status": CategoricalChip (dot izquierda + texto, always visible). + ti.column_specs[2].renderer = data_table::CellRenderer::CategoricalChip; + ti.column_specs[2].chips = run_status_chips(); // idx 3 — "Recent": Dots renderer — each dot = one of the last 5 runs. ti.column_specs[3].renderer = data_table::CellRenderer::Dots; @@ -953,29 +963,29 @@ void draw_all_runs(const std::string& /*api_url*/, ti.rows = static_cast(sorted.size()); ti.cols = static_cast(ti.headers.size()); - auto status_badges = [](){ - std::vector rules; - rules.push_back({"success", "#22c55e", ""}); - rules.push_back({"failed", "#ef4444", ""}); - rules.push_back({"running", "#eab308", ""}); - rules.push_back({"pending", "#94a3b8", ""}); - rules.push_back({"cancelled", "#6b7280", ""}); + auto status_chips = [](){ + std::vector rules; + rules.push_back({"success", "#22c55e"}); + rules.push_back({"failed", "#ef4444"}); + rules.push_back({"running", "#eab308"}); + rules.push_back({"pending", "#94a3b8"}); + rules.push_back({"cancelled", "#6b7280"}); return rules; }; - auto trigger_badges = [](){ - std::vector rules; - rules.push_back({"manual", "#3b82f6", ""}); - rules.push_back({"cron", "#a855f7", ""}); - rules.push_back({"api", "#06b6d4", ""}); + auto trigger_chips = [](){ + std::vector rules; + rules.push_back({"manual", "#3b82f6"}); + rules.push_back({"cron", "#a855f7"}); + rules.push_back({"api", "#06b6d4"}); return rules; }; ti.column_specs.resize(ti.cols); for (int i = 0; i < ti.cols; i++) ti.column_specs[i].id = ti.headers[i]; - ti.column_specs[2].renderer = data_table::CellRenderer::Badge; - ti.column_specs[2].badges = status_badges(); - ti.column_specs[3].renderer = data_table::CellRenderer::Badge; - ti.column_specs[3].badges = trigger_badges(); + ti.column_specs[2].renderer = data_table::CellRenderer::CategoricalChip; + ti.column_specs[2].chips = status_chips(); + ti.column_specs[3].renderer = data_table::CellRenderer::CategoricalChip; + ti.column_specs[3].chips = trigger_chips(); // Helper: duracion humana entre started_at y finished_at (best-effort). auto duration_str = [](const std::string& s, const std::string& f) -> std::string {