Repository navigation
Execution Dashboard Modernized
Modernization of the Execution Dashboard landing pane
(lib/execute/execDashboard.php) — GitHub issue
#1496, ASIDE menu
entry completed in #1499.
The legacy Smarty screen is replaced by a standalone Dashio page
(gui/templates/execute/execDashboard.html) backed by a plain-PHP REST BFF
(api/execdashboard/index.php). Since #1499 the ASIDE Execute sub-menu
shows an Execution Dashboard entry (first Execute item, label
href_exec_dashboard in labels.aside.tpl + all 19 locale/*/strings.txt,
gated testplan_execute OR exec_ro_access exactly like Execute Tests) that
opens the modern dashboard as the Execute landing pane, with a Dashboard
toolbar button on execTest.html to jump back.
Path: Execute → Execution Dashboard
URL: gui/templates/execute/execDashboard.html?testPlanID=<id>&buildID=<id>&platformID=<id>
BFF API: api/execdashboard/index.php
Right: testplan_execute OR exec_ro_access on the OWNING test project
(read); testplan_execute for POST ?action=context (write).


- What the screen does
- REST API Reference
- Legacy parity notes (context resolution)
- i18n Keys
- Security
- Testing
| Feature | Legacy behavior | Modern implementation |
|---|---|---|
| Context toolbar | project prefix + test plan / build / platform labels | identical header with prefix badge, plan name and project; Build and Platform selectors reload the context |
| Build selector | active + open builds (testplan::get_builds) |
same list; each row now carries is_open, closed builds are suffixed (Build is closed) and selectable (read-only review affordance) |
| Closed-build notice | legacy $isOpen ? '' : 'warning' banner |
amber closed-build banner shown when the resolved build is_open == 0
|
| Platform selector |
tc_platforms list |
same; first linked platform preselected; select change reloads |
| Notes panels | tplan/build/platform notes box | collapsible notes cards (tplan/build/platform) rendered as raw HTML when notes_type != 'none' (CKEditor), text otherwise; headers localized |
| Design custom fields |
get_linked_cfields_at_design on plan/build nodes |
server-rendered html_table_of_custom_field_keys_values tables for the test plan and the build (CF must be show_on_design=1, enable_on_design=1, show_on_execution=1, active project linkage) |
| REST arguments recap | hidden traceability box listing testPlanID/buildID/platformID
|
REST parameters card with the three values + Copy to clipboard button (toast on success; legacy execution_mode REST-args are absent, right param triple is shown instead) |
| Continue to Execute Tests | legacy paging into execTest.php
|
Continue to Execute Tests button navigates to execTest.html?tplan_id=&tproject_id=
|
| Refresh | GUI refresh re-running the pane | toolbar Refresh re-runs the BFF init with the current selectors |

All routes require an authenticated session; without testplan_execute /
exec_ro_access on the owning test project callers get
403 {"status":"error","code":"common.forbidden", …}.
| Method & path | Purpose | Failure modes |
|---|---|---|
GET ?action=init[&testPlanID&buildID&platformID] |
context (tproject/plan/build/platform), notes + cfields HTML, selector lists (platforms, builds with is_open), grants, REST param triplet, REST base URL | 401 anon, 403 no rights, 400 missing/mismatched context |
POST ?action=context (testplan_id, build_id, platform_id) |
persist the execution context into the session execution_mode cache (and _stored_setting_* keys), legacy-style |
401 anon, 403 no testplan_execute, 400 invalid ids |
- The resolved context follows the legacy precedence chain: explicit
parameter (
testPlanID/buildID/platformID) → session cache pairs found inexecution_modewhosesetting_testplan == $tplanId(build and platform chains scanned independently) → legacy{$tplanId}_stored_setting_build/_stored_setting_platformkeys → defaults (maxactive=1+open=1build, first platform linked to the plan). - The plan "id" is ephemeral: the BFF maps
testPlanID→tplan_idvia thetestplan_id-prefixed session keys (same membership the legacy portal used); explicittplan_idis also accepted. - Build/platform/tplan objects come from the 2.0.1 schema:
testplanshas nonamecolumn (title lives innodes_hierarchy),buildsistestproject_id-scoped (notestplan_id), so membership checks use the resolved owning project. - Plan and build CKEditor notes are served as HTML (
notes_type='ckeditor'bygetWebEditorCfg()), platform notes asnotes_type='platform'— the client chooses raw-HTML vs text rendering accordingly. -
POST ?action=contextwrites the same three session entries the legacy dashboard wrote (execution_modebuild/platform chains keyed bysetting_testplan), plus the_stored_setting_*fallbacks, soexecTest.htmland subsequent dashboard loads resolve the current context.
All labels/messages use the client-side TLi18n module with keys prefixed
edb. (21 keys: edb.title, edb.project, edb.testPlan, edb.build,
edb.platform, edb.buildClosed, edb.buildClosedMsg, edb.refresh,
edb.copyRest, edb.copyRestOk, edb.continueExecute, edb.restArgs,
edb.notes, edb.tplanNotes, edb.buildNotes, edb.platformNotes,
edb.customFields, edb.noBuilds, edb.isOpen, edb.reload,
edb.noCfields) plus footers.execDashboard and exe.dashboard,
defined in ALL locale bundles (gui/templates/i18n/*.json: de, en, es,
fr, it, ja, pt, ro, ru, zh).
The server-side ASIDE label href_exec_dashboard ("Execution Dashboard") is
defined in gui/templates/dashio/labels/labels.aside.tpl and in all 19
locale/*/strings.txt (translated per locale); the 2.0.1 client bundles do not
serve that menu (it renders server-side via Smarty, legacy layout).
- Session-based auth on every route (401 when not logged in).
-
testplan_executeORexec_ro_accesschecked server-side on the OWNING test project (403); the context-persist route requirestestplan_execute. - Forged/invalid plan, build or platform ids are rejected with 400/404 JSON (membership against the owning project); no direct SQL values interpolated unsanitized.
- Notes/cfields HTML served by the legacy renderers with the standard escaping.
Suite #1496 in tmp/TLU_Test_Cases.md: covers BFF init (explicit params,
default resolution, closed build, platform list), context persist, closed-build
banner, cfields tables (plan + build), notes panels, Copy REST parameters,
Continue-to-Execute navigation from the dashboard and back (Dashboard toolbar
button), refresh, i18n key presence in all 10 bundles and Event Viewer hygiene
(PASS, see the suite for recorded results).
Suite #1499: ASIDE entry rendering (EN + RO), menu click → dashboard load,
Continue/Toolbar round-trip, guest denial (menu hidden + BFF 403 + graceful
degradation), $TLS_href_exec_dashboard in all 19 strings.txt (php -l
clean) and Event Viewer hygiene (9/9 PASS).
Fixture builder: php tmp/fixtures_1496.php (idempotent) — creates project
ESX1496 (tproject_id=1), plan ESX1496-Plan (tplan_id=2), open build 1 +
closed build 2, platforms ESX1496-Win (1, linked) / ESX1496-Mac (2, unlinked)
and custom field ESX1496-CF with a plan value (Pre-prod) and a build value
(Build-Edge).
Bugfix Issue #1487's commit 8ef9694d3 (2025-era frmWorkArea header-subtitle
contrast fix) was applied on top of the pre-thanksgiving tree and accidentally
regressed the execDashboard link machinery: $actions->execDashboard in
lib/functions/common.php, the ASIDE sub-item in gui/templates/dashio/aside.tpl
and the href_exec_dashboard label in labels.aside.tpl + all 19
locale/*/strings.txt vanished. The umbrella restore for that collateral damage
(#1507) brought back the BFF + HTML screen files but NOT the Execute-menu wiring,
so the dashboard was again unreachable from the ASIDE (parity gap in the
"every ASIDE screen modernized" ledger).
Restored (Refs #1511): the common.php link switch block (in the tplan>0 branch,
right after executeTest, before execExport), the labels.aside.tpl lang_get
list entry and the Execute → Execution Dashboard sub-item (first Execute
entry, gated testplan_execute OR exec_ro_access AND non-null uri). Verified in
browser (admin: ASIDE click → execDashboard.html?tproject_id=1000&tplan_id=1002,
BFF init 200, build 1003 / platform message / REST triple, Continue round-trip
into execTest.html?tplan_id=1002&tproject_id=1000, EN→RO locale switch shows the
full RO translation; <no rights> user: BFF 403 execute tests on this plan +
graceful permission notice; anon: BFF 401 / POST CSRF 403). Event Viewer clean
(0 ERROR/WARNING). Suite #1511 in tmp/TLU_Test_Cases.md 27/27 PASS.
