From d704cb6c7fff67ed11a5f56e960501c07c226522 Mon Sep 17 00:00:00 2001 From: master <> Date: Fri, 27 Mar 2026 17:12:32 +0200 Subject: [PATCH] Fix Deployments tab switching and approve/reject actions Root cause: stella-page-tabs used urlParam="tab" while the component also read the "view" query param via a manual queryParamMap subscriber. When stella-page-tabs wrote ?tab=X to the URL, the subscriber re-read the stale ?view= param and reset viewMode back, causing tabs to appear frozen and approve/reject button clicks to be swallowed by the stale state. Fix: - Change stella-page-tabs urlParam from "tab" to "view" so both the component and the tab widget use the same query parameter - Guard the manual subscriber to only update viewMode if it actually differs, preventing feedback loops Co-Authored-By: Claude Opus 4.6 (1M context) --- .../releases/releases-activity.component.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Web/StellaOps.Web/src/app/features/releases/releases-activity.component.ts b/src/Web/StellaOps.Web/src/app/features/releases/releases-activity.component.ts index 72ad94d7b..aa662675a 100644 --- a/src/Web/StellaOps.Web/src/app/features/releases/releases-activity.component.ts +++ b/src/Web/StellaOps.Web/src/app/features/releases/releases-activity.component.ts @@ -173,7 +173,7 @@ function deriveOutcomeIcon(status: string): string { @@ -714,12 +714,12 @@ export class ReleasesActivityComponent implements OnInit, OnDestroy { }); this.route.queryParamMap.subscribe((params) => { - const view = (params.get('view') ?? 'timeline').toLowerCase(); - if (view === 'timeline' || view === 'table' || view === 'correlations' || view === 'approvals') { - this.viewMode.set(view); - if (view === 'approvals') this.loadApprovals(); - } else { - this.viewMode.set('timeline'); + const view = (params.get('view') ?? '').toLowerCase(); + if (view && (view === 'timeline' || view === 'table' || view === 'correlations' || view === 'approvals')) { + if (this.viewMode() !== view) { + this.viewMode.set(view); + if (view === 'approvals') this.loadApprovals(); + } } if (params.get('status')) this.statusFilter.set(params.get('status')!);