From 27690ed9a6eb463beb3306011c394b77f04be596 Mon Sep 17 00:00:00 2001 From: master <> Date: Fri, 27 Mar 2026 18:40:39 +0200 Subject: [PATCH] Dynamic subtitle and create button for Release Control tabs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Title: "Release Control" (encompasses both tabs) - Subtitle changes per tab: - Releases tab: "Promotion pipeline with gate status, risk posture, and evidence for every release." - Versions tab: "Sealed digest-first version catalog across standard and hotfix lanes." - Create button changes per tab: - Releases tab: "New Release" → /releases/new - Versions tab: "New Version" → /releases/versions/new - Uses Angular effect() to reactively update pageAction when activeTab changes Co-Authored-By: Claude Opus 4.6 (1M context) --- .../releases-unified-page.component.ts | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/Web/StellaOps.Web/src/app/features/releases/releases-unified-page.component.ts b/src/Web/StellaOps.Web/src/app/features/releases/releases-unified-page.component.ts index 56e673c8a..353d3056b 100644 --- a/src/Web/StellaOps.Web/src/app/features/releases/releases-unified-page.component.ts +++ b/src/Web/StellaOps.Web/src/app/features/releases/releases-unified-page.component.ts @@ -8,7 +8,7 @@ * Tab 2 "Approvals": embeds the existing ApprovalQueueComponent. */ -import { Component, ChangeDetectionStrategy, OnInit, OnDestroy, ViewChild, inject, signal, computed } from '@angular/core'; +import { Component, ChangeDetectionStrategy, OnInit, OnDestroy, ViewChild, effect, inject, signal, computed } from '@angular/core'; import { PageActionService } from '../../core/services/page-action.service'; import { PageActionOutletComponent } from '../../shared/components/page-action-outlet/page-action-outlet.component'; import { UpperCasePipe, SlicePipe } from '@angular/common'; @@ -74,8 +74,8 @@ export interface PipelineRelease {
-

Releases

-

Versions, deployments, approvals, and promotion pipeline.

+

Release Control

+

{{ activeSubtitle() }}

@@ -397,6 +397,24 @@ export class ReleasesUnifiedPageComponent implements OnInit, OnDestroy { readonly releaseTabs = RELEASE_TABS; readonly activeTab = signal(this.route.snapshot.queryParamMap.get('tab') || 'releases'); + readonly activeSubtitle = computed(() => + this.activeTab() === 'versions' + ? 'Sealed digest-first version catalog across standard and hotfix lanes.' + : 'Promotion pipeline with gate status, risk posture, and evidence for every release.' + ); + + constructor() { + // Update page action when tab changes + effect(() => { + const tab = this.activeTab(); + if (tab === 'versions') { + this.pageAction.set({ label: 'New Version', route: '/releases/versions/new' }); + } else { + this.pageAction.set({ label: 'New Release', route: '/releases/new' }); + } + }); + } + // Approve dialog readonly pendingApproveRelease = signal(null); @ViewChild('approveConfirm') approveConfirmRef!: ConfirmDialogComponent; @@ -426,7 +444,6 @@ export class ReleasesUnifiedPageComponent implements OnInit, OnDestroy { } ngOnInit(): void { - this.pageAction.set({ label: 'New Release', route: '/releases/new' }); this.context.initialize(); this.store.loadReleases({}); }