import { AfterViewInit, Component, ElementRef, Input, OnChanges, OnDestroy, SimpleChanges, ViewChild, } from '@angular/core'; import { Chart } from 'chart.js/auto'; import { PluginNodata } from './plugin-nodata'; import { PluginMoreColors } from './plugin-more-colors'; import { ChartConfig } from './chart-config'; import { ChartConfigService } from './services/chart-config.service'; import { DatasetService } from './services/dataset.service'; import { LabelService } from './services/label.service'; import { OptionsService } from './services/options.service'; import { ScaleService } from './services/scale.service'; @Component({ selector: 'fbi-chart', standalone: true, imports: [], templateUrl: './chart.component.html', styleUrl: './chart.component.scss', providers: [ ChartConfigService, DatasetService, LabelService, OptionsService, ScaleService, ], }) export class ChartComponent implements OnChanges, AfterViewInit, OnDestroy { @ViewChild('chart') canvas!: ElementRef; @Input() config!: ChartConfig; @Input() data!: Record[]; private chart: any = undefined; constructor(private chartConfigService: ChartConfigService) {} ngAfterViewInit(): void { this.initChart(); } ngOnChanges(changes: SimpleChanges): void { this.initChart(); } ngOnDestroy(): void { this.chart?.destroy?.(); } private initChart() { if (!this.canvas?.nativeElement) return; this.chart?.destroy?.(); const config = this.chartConfigService.chart(this.config, this.data); console.log(config); config.plugins = [PluginNodata.config(), PluginMoreColors.config()]; this.chart = new Chart(this.canvas.nativeElement, config); } }