diff --git a/.claude/skills/coding-standards/SKILL.md b/.claude/skills/coding-standards/SKILL.md index 31286926..e58bf328 100644 --- a/.claude/skills/coding-standards/SKILL.md +++ b/.claude/skills/coding-standards/SKILL.md @@ -23,7 +23,7 @@ Write a comment only when the code cannot say it itself. Before adding one, chec - repeating what a guard clause or an early return already shows - "what changed", "added for issue N", "new in 2.4" — that is git history -Match the surrounding density rather than your own taste: the JS modules run one short lowercase line per top-level function and few inside bodies. `filter.js` sits near 6% comment lines — a new block far above the file's ratio is a signal to cut, not a new house style. Do not restyle existing comments while you are there. +Match the surrounding density rather than your own taste: the JS modules run one short lowercase line per top-level function and few inside bodies. `filter/pipeline.js` sits near 6% comment lines — a new block far above the file's ratio is a signal to cut, not a new house style. Do not restyle existing comments while you are there. Robot `[Documentation]` is API documentation, not a comment: it renders in `log.html`. Write it for a keyword whose contract or trap is invisible at the call site; skip it when the name already says everything (`Open Compare Page`). @@ -41,7 +41,8 @@ Robot `[Documentation]` is API documentation, not a comment: it renders in `log. ## CSS -- Files: `css/base.css`, `colors.css`, `components.css`, `dark.css` — concatenated in sorted order at generation time. +- Files: `css/base.css`, `colors.css`, `components/01-…08-*.css`, `dark.css` — concatenated in **path order** at generation time, + so the numbered prefixes inside `css/components/` are the cascade order. Renaming one reorders the stylesheet. - Reuse existing Bootstrap/DataTables class conventions, keep selectors shallow, prefer CSS variables for theme values. ## Docs @@ -79,11 +80,27 @@ ES `import`/`export` syntax in source, but the Python `DependencyProcessor` stri ``` main.js startup entry; imports and calls all setup functions common.js shared utilities (format_duration, add_alert, path helpers, …) -filter.js filter pipeline + filter profiles localstorage.js settings persistence, merge_deep / merge_view / merge_layout layout.js GridStack setup, customize/save layout, undo/redo snapshots menu.js tab/page switching (update_menu) -eventlisteners.js wires every modal/filter/settings listener on load +filter/ + pipeline.js filter_data + every apply_*/filter_* run filter, setup_filtered_data_and_filters + section_selects.js the per-section suite/test/tag/keyword/compare selects + modal_options.js fills the filter modal's option lists (runs, tags, dates, metadata, versions, custom) + suite_path.js suite path navigator and its run/data filters + availability.js per-option run counts and greying out (issue #296) + controls.js filter indicators, checkbox handlers, every clear_* function + profiles.js filter profile capture/compare/apply/storage/edit mode + profile_merge.js merge_two_profiles ("largest horizon" rules) +eventlisteners/ + filter_modal.js wires the filter modal + merge_profiles.js wires the merge-profiles dialogue + settings_modal.js wires the settings modal (toggles, theme colours, branding, JSON config) + confirm_modal.js confirm_action promise wrapper + section_filters.js wires the per-section filters and the overview switches + graph_view_buttons.js fullscreen, graph type buttons, show/hide, per-graph toggles + collapsables.js collapse icons + overview_listeners.js run card version links and the overview "sort by" selects statwidgets.js custom stat widgets (CRUD, render, modal) linkwidgets.js custom link widgets (same pattern) customsections.js user-defined dashboard sections diff --git a/.claude/skills/dashboard-graphs/SKILL.md b/.claude/skills/dashboard-graphs/SKILL.md index 6e0bc9ed..21945e7c 100644 --- a/.claude/skills/dashboard-graphs/SKILL.md +++ b/.claude/skills/dashboard-graphs/SKILL.md @@ -91,9 +91,9 @@ Steps: 3. **`js/graph_creation/
.js`** — `build__config()` calling `get_graph_config(type, data, title, xTitle, yTitle)`, then the one-liners `create_*` (`create_chart(id, build_fn)`) and `update_*` (`update_chart`). Respect `settings.graphTypes.GraphType` for each view option and `inFullscreen && inFullscreenGraph.includes(key)` for larger limits. Export both. 4. **`js/graph_creation/all.js`** — import and call `create_*` in `create_dashboard_graphs()` and `update_*` in `update_dashboard_graphs()` inside the right section block. 5. **`js/variables/information.js`** — add `key` to `graphKeys` (generates Fullscreen/Close/Move/Show/Hide tooltips) and one `"Graph": "…"` tooltip per view option. -6. **`js/variables/settings.js`** — nothing for plain graphs (types and show/hide lists are derived). Only add a `settings.switch.*` entry if the graph gets its own toggle (e.g. `ignoreSkips`), wired in `eventlisteners.js` and persisted via `set_local_storage_item`. +6. **`js/variables/settings.js`** — nothing for plain graphs (types and show/hide lists are derived). Only add a `settings.switch.*` entry if the graph gets its own toggle (e.g. `ignoreSkips`), wired in `eventlisteners/graph_view_buttons.js` and persisted via `set_local_storage_item`. 7. **Template** — nothing; sections already exist (`#runStatisticsSection` … `#runDataHidden`). Compare/Table graphs are the exception and have their own markup patterns in `graphmetadata.js` (`_tableHtml`). -8. **CSS** — only for a new `viewOptionClassMap` icon class (`css/components.css`). +8. **CSS** — only for a new `viewOptionClassMap` icon class (`css/components/06-graphs.css`). 9. **Tests** — reference screenshot for the section changes: regenerate `dashboard_output/
/base
Section.png` in Docker; add a JS unit test for the `graph_data` function. 10. **Docs** — row in the section table of `docs/graphs-tables.md` (Graph Name / Views / Views Description / Notes). diff --git a/.claude/skills/filtering-and-settings/SKILL.md b/.claude/skills/filtering-and-settings/SKILL.md index c7ded237..f1db98df 100644 --- a/.claude/skills/filtering-and-settings/SKILL.md +++ b/.claude/skills/filtering-and-settings/SKILL.md @@ -12,7 +12,7 @@ The dashboard front-end has three tightly coupled systems: 2. **Filtering** — a multi-stage pipeline that produces `filteredRuns/Suites/Tests/Keywords` from the raw decoded data 3. **Layout** — GridStack-based drag-and-drop positioning + section ordering, also persisted in `settings` -Key files: `js/variables/settings.js`, `js/variables/globals.js`, `js/filter.js`, `js/localstorage.js`, `js/eventlisteners.js`, `js/layout.js` +Key files: `js/variables/settings.js`, `js/variables/globals.js`, `js/filter/` (8 modules), `js/localstorage.js`, `js/eventlisteners/` (8 modules), `js/layout.js` --- @@ -58,7 +58,7 @@ All graph-level toggle switches (the controls directly on individual graphs, not - `update_switch_local_storage(key, state, firstLoad)` — for checkbox switches (overview toggles, suite paths); on `firstLoad=true`, reads from `settings` and sets the DOM element - Direct `set_local_storage_item("switch.*", value)` calls — for graph-specific switches like `ignoreSkips`, `onlyLastRunSuite`, `heatmapStatus`, etc. -- Data-driven initialization loops in `eventlisteners.js` — arrays of `[elementId, settingsKey]` pairs that restore checkbox/select states on load and wire change listeners that persist to localStorage +- Data-driven initialization loops in `eventlisteners/graph_view_buttons.js` — arrays of `[elementId, settingsKey]` pairs that restore checkbox/select states on load and wire change listeners that persist to localStorage ### Deep Merge Behavior (`merge_deep`) @@ -80,7 +80,7 @@ In `localstorage.js`: if the placeholder string was not replaced (i.e. the strin --- -## Filtering Pipeline (`js/filter.js`) +## Filtering Pipeline (`js/filter/pipeline.js`) `setup_filtered_data_and_filters()` is called when the filter modal closes, when navigating from the overview page, and on initial load. Stages, in order: @@ -129,7 +129,7 @@ settings.filterProfiles = { ``` A profile need not contain all keys — only the keys that were checked when the profile was saved. -### Key functions (`filter.js`) +### Key functions (`js/filter/`) | Function | What it does | |---|---| | `capture_current_filters()` | Reads all filter DOM controls → plain profile object | @@ -178,7 +178,7 @@ Key mutable globals used across modules: | Global | Description | |---|---| -| `filteredRuns`, `filteredSuites`, `filteredTests`, `filteredKeywords` | Current filtered data arrays (reassigned by `filter.js` after each filter pass) | +| `filteredRuns`, `filteredSuites`, `filteredTests`, `filteredKeywords` | Current filtered data arrays (reassigned by `filter/pipeline.js` after each filter pass) | | `filteredAmount` | Total count before amount-slicing (shown as "showing X of N runs") | | `gridUnified`, `gridRun`, `gridSuite`, `gridTest`, `gridKeyword`, `gridCompare` | GridStack instances per section | | `gridEditMode` | Boolean: layout editor is active | @@ -221,7 +221,7 @@ In normal mode, hidden graphs are rendered to a `#[section]DataHidden` container --- -## Event Wiring (`js/eventlisteners.js`) +## Event Wiring (`js/eventlisteners/`) `setup_filter_modal()` — wires all filter modal controls. The Bootstrap `hidden.bs.modal` event triggers `setup_filtered_data_and_filters()` + `update_dashboard_graphs()` (with a loading overlay and double `requestAnimationFrame` to let the DOM settle before rendering). diff --git a/.claude/skills/js-bundling/SKILL.md b/.claude/skills/js-bundling/SKILL.md index 03997ac6..07e195e6 100644 --- a/.claude/skills/js-bundling/SKILL.md +++ b/.claude/skills/js-bundling/SKILL.md @@ -60,7 +60,7 @@ This block replaces `` in `templates/dashboard.ht ## How CSS Is Bundled -`DependencyProcessor._inline_css_files()` reads all `.css` files under `robotframework_dashboard/css/` in sorted order (`base.css`, `colors.css`, `components.css`, `dark.css`) and concatenates them into a single `