2 ChangeDetectionStrategy,
9 } from '@angular/core';
10 import { SkeletonModule, ButtonModule, LinkModule, TooltipModule } from 'carbon-components-angular';
11 import { ProductiveCardComponent } from '~/app/shared/components/productive-card/productive-card.component';
12 import { RouterModule } from '@angular/router';
13 import { ComponentsModule } from '~/app/shared/components/components.module';
14 import { SummaryService } from '~/app/shared/services/summary.service';
15 import { Summary } from '~/app/shared/models/summary.model';
16 import { combineLatest, Observable, of, ReplaySubject } from 'rxjs';
17 import { CommonModule } from '@angular/common';
18 import { PipesModule } from '~/app/shared/pipes/pipes.module';
19 import { UpgradeInfoInterface } from '~/app/shared/models/upgrade.interface';
20 import { UpgradeService } from '~/app/shared/api/upgrade.service';
21 import { catchError, filter, map, startWith } from 'rxjs/operators';
22 import { HealthIconMap, HealthStatus } from '~/app/shared/models/overview';
24 type OverviewHealthData = {
26 upgrade: UpgradeInfoInterface;
27 currentHealth: Health;
36 const WarnAndErrMessage = $localize`There are active alerts and unresolved health warnings.`;
38 const HealthMap: Record<HealthStatus, Health> = {
40 message: $localize`All core services are running normally`,
41 icon: HealthIconMap['HEALTH_OK'],
42 title: $localize`Healthy`
45 message: WarnAndErrMessage,
46 icon: HealthIconMap['HEALTH_WARN'],
47 title: $localize`Warning`
50 message: WarnAndErrMessage,
51 icon: HealthIconMap['HEALTH_ERR'],
52 title: $localize`Critical`
57 selector: 'cd-overview-health-card',
60 ProductiveCardComponent,
70 templateUrl: './overview-health-card.component.html',
71 styleUrl: './overview-health-card.component.scss',
72 encapsulation: ViewEncapsulation.None,
73 changeDetection: ChangeDetectionStrategy.OnPush
75 export class OverviewHealthCardComponent {
76 private readonly summaryService = inject(SummaryService);
77 private readonly upgradeService = inject(UpgradeService);
79 @Input() fsid!: string;
81 set status(value: HealthStatus) {
82 this.health$.next(value);
84 @Input() incidents!: number;
85 @Output() viewIncidents = new EventEmitter<void>();
87 private health$ = new ReplaySubject<HealthStatus>(1);
89 readonly data$: Observable<OverviewHealthData> = combineLatest([
90 this.summaryService.summaryData$.pipe(filter((summary): summary is Summary => !!summary)),
91 this.upgradeService.listCached().pipe(
92 startWith(null as UpgradeInfoInterface),
93 catchError(() => of(null))
97 map(([summary, upgrade, health]) => ({ summary, upgrade, currentHealth: HealthMap?.[health] }))
100 onViewIncidentsClick() {
101 this.viewIncidents.emit();