2 ChangeDetectionStrategy,
7 } from '@angular/core';
8 import { SkeletonModule, ButtonModule, LinkModule } from 'carbon-components-angular';
9 import { ProductiveCardComponent } from '~/app/shared/components/productive-card/productive-card.component';
10 import { RouterModule } from '@angular/router';
11 import { ComponentsModule } from '~/app/shared/components/components.module';
12 import { SummaryService } from '~/app/shared/services/summary.service';
13 import { Summary } from '~/app/shared/models/summary.model';
14 import { combineLatest, Observable, of, ReplaySubject } from 'rxjs';
15 import { CommonModule } from '@angular/common';
16 import { PipesModule } from '~/app/shared/pipes/pipes.module';
17 import { UpgradeInfoInterface } from '~/app/shared/models/upgrade.interface';
18 import { UpgradeService } from '~/app/shared/api/upgrade.service';
19 import { catchError, filter, map, startWith } from 'rxjs/operators';
21 type OverviewHealthData = {
23 upgrade: UpgradeInfoInterface;
24 currentHealth: Health;
33 type HealthStatus = 'HEALTH_OK' | 'HEALTH_WARN' | 'HEALTH_ERR';
34 const WarnAndErrMessage = $localize`There are active alerts and unresolved health warnings.`;
36 const HealthMap: Record<HealthStatus, Health> = {
38 message: $localize`All core services are running normally`,
40 title: $localize`Healthy`
43 message: WarnAndErrMessage,
44 icon: 'warningAltFilled',
45 title: $localize`Warning`
48 message: WarnAndErrMessage,
50 title: $localize`Critical`
55 selector: 'cd-overview-health-card',
58 ProductiveCardComponent,
67 templateUrl: './overview-health-card.component.html',
68 styleUrl: './overview-health-card.component.scss',
69 encapsulation: ViewEncapsulation.None,
70 changeDetection: ChangeDetectionStrategy.OnPush
72 export class OverviewHealthCardComponent {
73 @Input() fsid!: string;
75 set health(value: HealthStatus) {
76 this.health$.next(value);
78 private health$ = new ReplaySubject<HealthStatus>(1);
80 private readonly summaryService = inject(SummaryService);
81 private readonly upgradeService = inject(UpgradeService);
83 readonly data$: Observable<OverviewHealthData> = combineLatest([
84 this.summaryService.summaryData$.pipe(filter((summary): summary is Summary => !!summary)),
86 this.upgradeService.listCached().pipe(
87 startWith(null as UpgradeInfoInterface),
88 catchError(() => of(null))
92 map(([summary, upgrade, health]) => ({ summary, upgrade, currentHealth: HealthMap?.[health] }))