@@ -139,9 +137,10 @@ import { FreshAuthService } from '../../../core/auth/fresh-auth.service';
}
`]
})
-export class TenantsListComponent implements OnInit {
+export class TenantsListComponent implements OnInit, OnDestroy {
private readonly api = inject(ConsoleAdminApiService);
private readonly freshAuth = inject(FreshAuthService);
+ private readonly pageAction = inject(PageActionService);
tenants: Tenant[] = [];
loading = true;
@@ -149,9 +148,14 @@ export class TenantsListComponent implements OnInit {
canWrite = false; // TODO: Check authority:tenants.write scope
ngOnInit(): void {
+ this.pageAction.set({ label: 'Add Tenant', action: () => this.createTenant() });
this.loadTenants();
}
+ ngOnDestroy(): void {
+ this.pageAction.clear();
+ }
+
private loadTenants(): void {
this.loading = true;
this.error = null;
diff --git a/src/Web/StellaOps.Web/src/app/features/console-admin/users/users-list.component.ts b/src/Web/StellaOps.Web/src/app/features/console-admin/users/users-list.component.ts
index 680f5ed6c..90e02e9ee 100644
--- a/src/Web/StellaOps.Web/src/app/features/console-admin/users/users-list.component.ts
+++ b/src/Web/StellaOps.Web/src/app/features/console-admin/users/users-list.component.ts
@@ -1,4 +1,4 @@
-import { Component, OnInit, inject } from '@angular/core';
+import { Component, OnInit, OnDestroy, inject } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { ConsoleAdminApiService, User } from '../services/console-admin-api.service';
@@ -6,6 +6,7 @@ import { FreshAuthService } from '../../../core/auth/fresh-auth.service';
import { AUTH_SERVICE, AuthService } from '../../../core/auth/auth.service';
import { StellaOpsScopes } from '../../../core/auth/scopes';
import { InlineCodeComponent } from '../../../shared/ui/inline-code/inline-code.component';
+import { PageActionService } from '../../../core/services/page-action.service';
@Component({
selector: 'app-users-list',
@@ -14,12 +15,6 @@ import { InlineCodeComponent } from '../../../shared/ui/inline-code/inline-code.
@if (error) {
@@ -360,10 +355,11 @@ import { InlineCodeComponent } from '../../../shared/ui/inline-code/inline-code.
}
`]
})
-export class UsersListComponent implements OnInit {
+export class UsersListComponent implements OnInit, OnDestroy {
private readonly api = inject(ConsoleAdminApiService);
private readonly freshAuth = inject(FreshAuthService);
private readonly auth = inject(AUTH_SERVICE);
+ private readonly pageAction = inject(PageActionService);
users: User[] = [];
isLoading = false;
@@ -385,9 +381,14 @@ export class UsersListComponent implements OnInit {
}
ngOnInit(): void {
+ this.pageAction.set({ label: 'Add User', action: () => this.showCreateForm() });
this.loadUsers();
}
+ ngOnDestroy(): void {
+ this.pageAction.clear();
+ }
+
loadUsers(): void {
this.isLoading = true;
this.error = null;
diff --git a/src/Web/StellaOps.Web/src/app/features/dashboard-v3/dashboard-v3.component.ts b/src/Web/StellaOps.Web/src/app/features/dashboard-v3/dashboard-v3.component.ts
index 9f1383dc2..34f94618e 100644
--- a/src/Web/StellaOps.Web/src/app/features/dashboard-v3/dashboard-v3.component.ts
+++ b/src/Web/StellaOps.Web/src/app/features/dashboard-v3/dashboard-v3.component.ts
@@ -14,6 +14,7 @@ import {
signal,
OnInit,
AfterViewInit,
+ OnDestroy,
ViewChild,
ElementRef,
NgZone,
@@ -43,6 +44,7 @@ import {
AUTH_SERVICE,
type AuthService,
} from '../../core/auth/auth.service';
+import { PageActionService } from '../../core/services/page-action.service';
interface EnvironmentCard {
id: string;
@@ -90,13 +92,6 @@ interface PendingAction {
Mission Board
{{ tenantLabel() }}
-
@if (!contextReady()) {
@@ -1358,12 +1353,13 @@ interface PendingAction {
}
`],
})
-export class DashboardV3Component implements OnInit, AfterViewInit {
+export class DashboardV3Component implements OnInit, AfterViewInit, OnDestroy {
private readonly context = inject(PlatformContextStore);
private readonly vulnApi = inject
(VULNERABILITY_API);
private readonly sourceApi = inject(SourceManagementApi);
private readonly authService = inject(AUTH_SERVICE) as AuthService;
private readonly ngZone = inject(NgZone);
+ private readonly pageAction = inject(PageActionService);
// -- Scroll refs and signals ------------------------------------------------
@ViewChild('pipelineScroll') pipelineScrollRef?: ElementRef;
@@ -1434,10 +1430,15 @@ export class DashboardV3Component implements OnInit, AfterViewInit {
}
ngOnInit(): void {
+ this.pageAction.set({ label: 'Refresh', action: () => this.refresh() });
this.loadVulnerabilityStats();
this.loadFeedStatus();
}
+ ngOnDestroy(): void {
+ this.pageAction.clear();
+ }
+
ngAfterViewInit(): void {
// Check scroll arrows at multiple intervals to catch async data rendering
const checkScroll = () => {
diff --git a/src/Web/StellaOps.Web/src/app/features/doctor/doctor-dashboard.component.html b/src/Web/StellaOps.Web/src/app/features/doctor/doctor-dashboard.component.html
index 387966bc4..0870c2b75 100644
--- a/src/Web/StellaOps.Web/src/app/features/doctor/doctor-dashboard.component.html
+++ b/src/Web/StellaOps.Web/src/app/features/doctor/doctor-dashboard.component.html
@@ -19,13 +19,6 @@
Quick
-
diff --git a/src/Web/StellaOps.Web/src/app/features/notify/notify-panel.component.ts b/src/Web/StellaOps.Web/src/app/features/notify/notify-panel.component.ts
index 1845d38e2..ca8ee19ef 100644
--- a/src/Web/StellaOps.Web/src/app/features/notify/notify-panel.component.ts
+++ b/src/Web/StellaOps.Web/src/app/features/notify/notify-panel.component.ts
@@ -2,6 +2,7 @@ import { CommonModule } from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
+ OnDestroy,
OnInit,
computed,
inject,
@@ -15,6 +16,7 @@ import {
import { RouterLink } from '@angular/router';
import { firstValueFrom } from 'rxjs';
+import { PageActionService } from '../../core/services/page-action.service';
import {
NOTIFY_API,
NotifyApi,
@@ -70,7 +72,8 @@ type DeliveryFilter =
styleUrls: ['./notify-panel.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
-export class NotifyPanelComponent implements OnInit {
+export class NotifyPanelComponent implements OnInit, OnDestroy {
+ private readonly pageAction = inject(PageActionService);
private readonly api = inject