From ae9a9fab910331830628689867f16f5a508399bd Mon Sep 17 00:00:00 2001 From: master <> Date: Fri, 27 Mar 2026 17:44:34 +0200 Subject: [PATCH] Simplify Deployments tabs and fix duplicate Version button MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deployments page: - Remove redundant context chips (US East, Development, 24h) — topbar already shows these - Rename Timeline tab → Pipeline with appropriate icon - Remove Table tab (raw data table, low value vs Pipeline view) - Remove Correlations tab (deployment correlations belong in Pipeline view) - Keep only Pipeline + Approvals tabs Releases Versions tab: - Fix duplicate "New Version" button — ReleaseListComponent now accepts [embedded]="true" to suppress its pageAction when rendered inside the unified Releases page (which already has "New Release" page action) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../release-list/release-list.component.ts | 8 ++- .../releases/releases-activity.component.ts | 70 ++----------------- .../releases-unified-page.component.ts | 2 +- 3 files changed, 11 insertions(+), 69 deletions(-) diff --git a/src/Web/StellaOps.Web/src/app/features/release-orchestrator/releases/release-list/release-list.component.ts b/src/Web/StellaOps.Web/src/app/features/release-orchestrator/releases/release-list/release-list.component.ts index 746c595b0..04b5f1963 100644 --- a/src/Web/StellaOps.Web/src/app/features/release-orchestrator/releases/release-list/release-list.component.ts +++ b/src/Web/StellaOps.Web/src/app/features/release-orchestrator/releases/release-list/release-list.component.ts @@ -1,5 +1,5 @@ // Filter bar adoption: SPRINT_20260308_015_FE (FE-OFB-003) -import { Component, OnInit, OnDestroy, inject, signal, computed } from '@angular/core'; +import { Component, Input, OnInit, OnDestroy, inject, signal, computed } from '@angular/core'; import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { PlatformContextStore } from '../../../../core/context/platform-context.store'; @@ -758,6 +758,8 @@ import { PageActionOutletComponent } from '../../../../shared/components/page-ac `], }) export class ReleaseListComponent implements OnInit, OnDestroy { + /** When true, suppresses page action (used when embedded as a tab inside another page). */ + @Input() embedded = false; private readonly dateFmt = inject(DateFormatService); private readonly pageAction = inject(PageActionService); @@ -831,7 +833,9 @@ export class ReleaseListComponent implements OnInit, OnDestroy { }); ngOnInit(): void { - this.pageAction.set({ label: 'New Version', route: '/releases/versions/new' }); + if (!this.embedded) { + this.pageAction.set({ label: 'New Version', route: '/releases/versions/new' }); + } this.context.initialize(); this.route.queryParamMap.subscribe((params) => { this.applyingFromQuery = true; 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 aa662675a..5459e70b5 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 @@ -18,9 +18,7 @@ import { ConfirmDialogComponent } from '../../shared/components/confirm-dialog/c import { ModalComponent } from '../../shared/components/modal/modal.component'; const VIEW_MODE_TABS: StellaPageTab[] = [ - { id: 'timeline', label: 'Timeline', icon: 'M12 12m-10 0a10 10 0 1 0 20 0 10 10 0 1 0-20 0|||M12 6v6l4 2' }, - { id: 'table', label: 'Table', icon: 'M8 6h13|||M8 12h13|||M8 18h13|||M3 6h.01|||M3 12h.01|||M3 18h.01' }, - { id: 'correlations', label: 'Correlations', icon: 'M22 12h-4l-3 9L9 3l-3 9H2' }, + { id: 'timeline', label: 'Pipeline', icon: 'M22 12h-4l-3 9L9 3l-3 9H2' }, { id: 'approvals', label: 'Approvals', icon: 'M9 11l3 3L22 4|||M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11' }, ]; import { StellaPageTabsComponent, StellaPageTab } from '../../shared/components/stella-page-tabs/stella-page-tabs.component'; @@ -72,12 +70,6 @@ function deriveOutcomeIcon(status: string): string {

Deployment runs, approvals, and promotion activity.

-
- {{ context.regionSummary() }} - {{ context.environmentSummary() }} - {{ context.timeWindow() }} -
- @if (pendingApprovals().length > 0 && viewMode() !== 'approvals') {
@@ -304,60 +296,6 @@ function deriveOutcomeIcon(status: string): string {
} - @case ('correlations') { -
- @for (cluster of correlationClusters(); track cluster.key) { -
-

{{ cluster.key }}

-

{{ cluster.count }} events · {{ cluster.releases }} release version(s)

-

{{ cluster.environments }}

-
- } @empty { - - } -
- } - @default { - - - - - - - - - - - - - - - @for (row of pagedRows(); track row.activityId) { - - - - - - - - - - - } @empty { - - } - -
RunRelease VersionLaneOutcomeEnvironmentNeeds ApprovalData IntegrityWhen
{{ row.activityId }}{{ row.releaseName }}{{ deriveLane(row) }}{{ deriveOutcome(row) }}{{ row.targetRegion || '-' }}/{{ row.targetEnvironment || '-' }}{{ deriveNeedsApproval(row) ? 'yes' : 'no' }}{{ deriveDataIntegrity(row) }}{{ formatDate(row.occurredAt) }}
No runs match the active filters.
-
- -
- } } } } @@ -547,7 +485,7 @@ export class ReleasesActivityComponent implements OnInit, OnDestroy { readonly loading = signal(false); readonly error = signal(null); readonly rows = signal([]); - readonly viewMode = signal<'timeline' | 'table' | 'correlations' | 'approvals'>('timeline'); + readonly viewMode = signal<'timeline' | 'approvals'>('timeline'); // ── Pending approvals card lane ────────────────────────────────── @ViewChild('apcScroll') apcScrollRef?: ElementRef; @@ -715,7 +653,7 @@ export class ReleasesActivityComponent implements OnInit, OnDestroy { this.route.queryParamMap.subscribe((params) => { const view = (params.get('view') ?? '').toLowerCase(); - if (view && (view === 'timeline' || view === 'table' || view === 'correlations' || view === 'approvals')) { + if (view && (view === 'timeline' || view === 'approvals')) { if (this.viewMode() !== view) { this.viewMode.set(view); if (view === 'approvals') this.loadApprovals(); @@ -792,7 +730,7 @@ export class ReleasesActivityComponent implements OnInit, OnDestroy { } onTabChange(tab: string): void { - this.viewMode.set(tab as 'timeline' | 'table' | 'correlations' | 'approvals'); + this.viewMode.set(tab as 'timeline' | 'approvals'); if (tab === 'approvals') this.loadApprovals(); this.applyFilters(); } 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 9d02a3587..e129eae38 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 @@ -258,7 +258,7 @@ export interface PipelineRelease { } @if (activeTab() === 'versions') { - + } `,