diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html index 21d68984a..4d74c2559 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html @@ -4,7 +4,7 @@ class="align-items-center d-flex flex-grow-1 h5 mb-0 py-2 text-truncate" > Performance - @if (user?.subscription?.type === 'Basic') { + @if (user()?.subscription?.type === 'Basic') { } @@ -18,12 +18,12 @@ Compare with... - @for (symbolProfile of benchmarks; track symbolProfile) { + @for (symbolProfile of benchmarks(); track symbolProfile) { {{ symbolProfile.name }} @@ -41,7 +41,7 @@
- @if (isLoading) { + @if (isLoading()) {
diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts index 2ecefc311..d2dc9e1bb 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -22,12 +22,11 @@ import { ChangeDetectionStrategy, Component, type ElementRef, - EventEmitter, - Input, + input, OnChanges, OnDestroy, - Output, - ViewChild + output, + viewChild } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatSelectModule } from '@angular/material/select'; @@ -68,24 +67,25 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; templateUrl: './benchmark-comparator.component.html' }) export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { - @Input() benchmark: Partial; - @Input() benchmarkDataItems: LineChartItem[] = []; - @Input() benchmarks: Partial[]; - @Input() colorScheme: ColorScheme; - @Input() isLoading: boolean; - @Input() locale = getLocale(); - @Input() performanceDataItems: LineChartItem[]; - @Input() user: User; + public readonly benchmark = input>(); + public readonly benchmarkDataItems = input([]); + public readonly benchmarks = input[]>(); + public readonly colorScheme = input.required(); + public readonly isLoading = input(); + public readonly locale = input(getLocale()); + public readonly performanceDataItems = input.required(); + public readonly user = input(); - @Output() benchmarkChanged = new EventEmitter(); + public readonly benchmarkChanged = output(); - @ViewChild('chartCanvas') chartCanvas: ElementRef; - - public chart: Chart<'line'>; - public hasPermissionToAccessAdminControl: boolean; - public routerLinkAdminControlMarketData = + protected chart: Chart<'line'>; + protected hasPermissionToAccessAdminControl: boolean; + protected readonly routerLinkAdminControlMarketData = internalRoutes.adminControl.subRoutes.marketData.routerLink; + private readonly chartCanvas = + viewChild.required>('chartCanvas'); + public constructor() { Chart.register( annotationPlugin, @@ -104,27 +104,27 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { public ngOnChanges() { this.hasPermissionToAccessAdminControl = hasPermission( - this.user?.permissions, + this.user()?.permissions, permissions.accessAdminControl ); - if (this.performanceDataItems) { + if (this.performanceDataItems()) { this.initialize(); } } - public onChangeBenchmark(symbolProfileId: string) { - this.benchmarkChanged.next(symbolProfileId); - } - public ngOnDestroy() { this.chart?.destroy(); } + protected onChangeBenchmark(symbolProfileId: string) { + this.benchmarkChanged.emit(symbolProfileId); + } + private initialize() { const benchmarkDataValues: Record = {}; - for (const { date, value } of this.benchmarkDataItems) { + for (const { date, value } of this.benchmarkDataItems()) { benchmarkDataValues[date] = value; } @@ -134,8 +134,11 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { backgroundColor: `rgb(${primaryColorRgb.r}, ${primaryColorRgb.g}, ${primaryColorRgb.b})`, borderColor: `rgb(${primaryColorRgb.r}, ${primaryColorRgb.g}, ${primaryColorRgb.b})`, borderWidth: 2, - data: this.performanceDataItems.map(({ date, value }) => { - return { x: parseDate(date).getTime(), y: value * 100 }; + data: this.performanceDataItems().map(({ date, value }) => { + return { + x: parseDate(date)?.getTime() ?? null, + y: value * 100 + }; }), label: $localize`Portfolio` }, @@ -143,9 +146,9 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { backgroundColor: `rgb(${secondaryColorRgb.r}, ${secondaryColorRgb.g}, ${secondaryColorRgb.b})`, borderColor: `rgb(${secondaryColorRgb.r}, ${secondaryColorRgb.g}, ${secondaryColorRgb.b})`, borderWidth: 2, - data: this.performanceDataItems.map(({ date }) => { + data: this.performanceDataItems().map(({ date }) => { return { - x: parseDate(date).getTime(), + x: parseDate(date)?.getTime() ?? null, y: benchmarkDataValues[date] }; }), @@ -163,7 +166,7 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { this.chart.update(); } else { - this.chart = new Chart(this.chartCanvas.nativeElement, { + this.chart = new Chart<'line'>(this.chartCanvas().nativeElement, { data, options: { animation: false, @@ -172,7 +175,7 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { tension: 0 }, point: { - hoverBackgroundColor: getBackgroundColor(this.colorScheme), + hoverBackgroundColor: getBackgroundColor(this.colorScheme()), hoverRadius: 2, radius: 0 } @@ -183,7 +186,7 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { annotation: { annotations: { yAxis: { - borderColor: `rgba(${getTextColor(this.colorScheme)}, 0.1)`, + borderColor: `rgba(${getTextColor(this.colorScheme())}, 0.1)`, borderWidth: 1, scaleID: 'y', type: 'line', @@ -196,14 +199,14 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { }, tooltip: this.getTooltipPluginConfiguration(), verticalHoverLine: { - color: `rgba(${getTextColor(this.colorScheme)}, 0.1)` + color: `rgba(${getTextColor(this.colorScheme())}, 0.1)` } }, responsive: true, scales: { x: { border: { - color: `rgba(${getTextColor(this.colorScheme)}, 0.1)`, + color: `rgba(${getTextColor(this.colorScheme())}, 0.1)`, width: 1 }, display: true, @@ -212,7 +215,7 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { }, type: 'time', time: { - tooltipFormat: getDateFormatString(this.locale), + tooltipFormat: getDateFormatString(this.locale()), unit: 'year' } }, @@ -228,7 +231,7 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { tick.value === scale.max || tick.value === scale.min ) { - return `rgba(${getTextColor(this.colorScheme)}, 0.1)`; + return `rgba(${getTextColor(this.colorScheme())}, 0.1)`; } return 'transparent'; @@ -247,7 +250,7 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { } }, plugins: [ - getVerticalHoverLinePlugin(this.chartCanvas, this.colorScheme) + getVerticalHoverLinePlugin(this.chartCanvas(), this.colorScheme()) ], type: 'line' }); @@ -258,8 +261,8 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { private getTooltipPluginConfiguration(): Partial> { return { ...getTooltipOptions({ - colorScheme: this.colorScheme, - locale: this.locale, + colorScheme: this.colorScheme(), + locale: this.locale(), unit: '%' }), mode: 'index',