]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/blob
6f4c74fa652f9e4a1fb8f32f6244e507e23e9964
[ceph-ci.git] /
1 import {
2   ChangeDetectionStrategy,
3   Component,
4   EventEmitter,
5   inject,
6   Input,
7   Output,
8   ViewEncapsulation
9 } from '@angular/core';
10 import {
11   SkeletonModule,
12   ButtonModule,
13   LinkModule,
14   TooltipModule,
15   TabsModule,
16   LayoutModule
17 } from 'carbon-components-angular';
18 import { ProductiveCardComponent } from '~/app/shared/components/productive-card/productive-card.component';
19 import { RouterModule } from '@angular/router';
20 import { ComponentsModule } from '~/app/shared/components/components.module';
21 import { SummaryService } from '~/app/shared/services/summary.service';
22 import { Summary } from '~/app/shared/models/summary.model';
23 import { combineLatest, Observable, of } from 'rxjs';
24 import { CommonModule } from '@angular/common';
25 import { PipesModule } from '~/app/shared/pipes/pipes.module';
26 import { UpgradeInfoInterface } from '~/app/shared/models/upgrade.interface';
27 import { UpgradeService } from '~/app/shared/api/upgrade.service';
28 import { catchError, filter, map, startWith } from 'rxjs/operators';
29 import { HealthCardVM } from '~/app/shared/models/overview';
30
31 type OverviewHealthData = {
32   summary: Summary;
33   upgrade: UpgradeInfoInterface;
34 };
35
36 type TabSection = 'system' | 'hardware' | 'resiliency';
37
38 @Component({
39   selector: 'cd-overview-health-card',
40   imports: [
41     CommonModule,
42     ProductiveCardComponent,
43     SkeletonModule,
44     ButtonModule,
45     RouterModule,
46     ComponentsModule,
47     LinkModule,
48     PipesModule,
49     TooltipModule,
50     TabsModule,
51     LayoutModule
52   ],
53   standalone: true,
54   templateUrl: './overview-health-card.component.html',
55   styleUrl: './overview-health-card.component.scss',
56   encapsulation: ViewEncapsulation.None,
57   changeDetection: ChangeDetectionStrategy.OnPush
58 })
59 export class OverviewHealthCardComponent {
60   private readonly summaryService = inject(SummaryService);
61   private readonly upgradeService = inject(UpgradeService);
62
63   @Input({ required: true }) vm!: HealthCardVM;
64   @Output() viewIncidents = new EventEmitter<void>();
65
66   activeSection: TabSection | null = null;
67
68   toggleSection(section: TabSection) {
69     this.activeSection = this.activeSection === section ? null : section;
70   }
71
72   readonly data$: Observable<OverviewHealthData> = combineLatest([
73     this.summaryService.summaryData$.pipe(filter((summary): summary is Summary => !!summary)),
74     this.upgradeService.listCached().pipe(
75       startWith(null as UpgradeInfoInterface),
76       catchError(() => of(null))
77     )
78   ]).pipe(map(([summary, upgrade]) => ({ summary, upgrade })));
79
80   onViewIncidentsClick() {
81     this.viewIncidents.emit();
82   }
83 }