1 import { Component, Input, OnChanges, SimpleChanges, ViewChild } from '@angular/core';
3 import { CssHelper } from '~/app/shared/classes/css-helper';
4 import { DimlessBinaryPipe } from '~/app/shared/pipes/dimless-binary.pipe';
5 import { DimlessBinaryPerSecondPipe } from '~/app/shared/pipes/dimless-binary-per-second.pipe';
6 import { FormatterService } from '~/app/shared/services/formatter.service';
7 import { BaseChartDirective } from 'ng2-charts';
8 import { DimlessPipe } from '~/app/shared/pipes/dimless.pipe';
9 import { NumberFormatterService } from '~/app/shared/services/number-formatter.service';
10 import 'chartjs-adapter-moment';
13 selector: 'cd-dashboard-area-chart',
14 templateUrl: './dashboard-area-chart.component.html',
15 styleUrls: ['./dashboard-area-chart.component.scss']
17 export class DashboardAreaChartComponent implements OnChanges {
18 @ViewChild(BaseChartDirective) chart: BaseChartDirective;
27 data: Array<[number, string]>;
29 data2?: Array<[number, string]>;
35 decimals?: number = 1;
37 currentDataUnits: string;
39 currentDataUnits2?: string;
40 currentData2?: number;
41 maxConvertedValue?: number;
42 maxConvertedValueUnits?: string;
44 chartDataUnits: string;
48 public chartAreaBorderPlugin: any[] = [
50 beforeDraw(chart: any) {
51 if (!chart.options.plugins.borderArea) {
56 chartArea: { left, top, width, height }
59 ctx.strokeStyle = chart.options.plugins.chartAreaBorder.borderColor;
60 ctx.lineWidth = chart.options.plugins.chartAreaBorder.borderWidth;
61 ctx.setLineDash(chart.options.plugins.chartAreaBorder.borderDash || []);
62 ctx.lineDashOffset = chart.options.plugins.chartAreaBorder.borderDashOffset;
63 ctx.strokeRect(left, top, width, height);
70 private cssHelper: CssHelper,
71 private dimlessBinary: DimlessBinaryPipe,
72 private dimlessBinaryPerSecond: DimlessBinaryPerSecondPipe,
73 private dimlessPipe: DimlessPipe,
74 private formatter: FormatterService,
75 private numberFormatter: NumberFormatterService
81 data: [{ x: 0, y: 0 }],
83 pointBackgroundColor: this.cssHelper.propertyValue('chart-color-strong-blue'),
84 backgroundColor: this.cssHelper.propertyValue('chart-color-translucent-blue'),
85 borderColor: this.cssHelper.propertyValue('chart-color-strong-blue'),
95 pointBackgroundColor: this.cssHelper.propertyValue('chart-color-orange'),
96 backgroundColor: this.cssHelper.propertyValue('chart-color-translucent-yellow'),
97 borderColor: this.cssHelper.propertyValue('chart-color-orange'),
113 external: function (tooltipModel: any) {
114 tooltipModel.tooltip.x = 10;
115 tooltipModel.tooltip.y = 0;
119 backgroundColor: this.cssHelper.propertyValue('chart-color-tooltip-background'),
121 title: function (tooltipItem: any): any {
122 return tooltipItem[0].xLabel;
124 label: (context: any) => {
127 context.dataset.label +
129 context.formattedValue +
138 borderColor: this.cssHelper.propertyValue('chart-color-slight-dark-gray'),
143 maintainAspectRatio: false,
161 tooltipFormat: 'DD/MM/YYYY - HH:mm:ss'
165 afterFit: (scaleInstance: any) => (scaleInstance.width = 100),
178 ngOnChanges(changes: SimpleChanges): void {
179 this.updateChartData(changes);
182 private updateChartData(changes: SimpleChanges): void {
183 this.chartData.dataset[0].label = this.label;
184 this.chartData.dataset[1].label = this.label2;
185 this.setChartTicks();
186 if (changes.data && changes.data.currentValue) {
187 this.data = changes.data.currentValue;
188 this.chartData.dataset[0].data = this.formatData(this.data);
189 [this.currentData, this.currentDataUnits] = this.convertUnits(
190 this.data[this.data.length - 1][1]
192 [this.maxConvertedValue, this.maxConvertedValueUnits] = this.convertUnits(
196 if (changes.data2 && changes.data2.currentValue) {
197 this.data2 = changes.data2.currentValue;
198 this.chartData.dataset[1].data = this.formatData(this.data2);
199 [this.currentData2, this.currentDataUnits2] = this.convertUnits(
200 this.data2[this.data2.length - 1][1]
204 this.chart.chart.update();
208 private formatData(array: Array<any>): any {
209 let formattedData = {};
210 formattedData = array.map((data: any) => ({
212 y: Number(this.convertToChartDataUnits(data[1]).replace(/[^\d,.]+/g, ''))
214 return formattedData;
217 private convertToChartDataUnits(data: any): any {
218 let dataWithUnits: string = '';
219 if (this.chartDataUnits !== null) {
220 if (this.dataUnits === 'B') {
221 dataWithUnits = this.numberFormatter.formatBytesFromTo(
227 } else if (this.dataUnits === 'B/s') {
228 dataWithUnits = this.numberFormatter.formatBytesPerSecondFromTo(
234 } else if (this.dataUnits === 'ms') {
235 dataWithUnits = this.numberFormatter.formatSecondsFromTo(
242 dataWithUnits = this.numberFormatter.formatUnitlessFromTo(
250 return dataWithUnits;
253 private convertUnits(data: any): any {
254 let dataWithUnits: string = '';
255 if (this.dataUnits === 'B') {
256 dataWithUnits = this.dimlessBinary.transform(data, this.decimals);
257 } else if (this.dataUnits === 'B/s') {
258 dataWithUnits = this.dimlessBinaryPerSecond.transform(data, this.decimals);
259 } else if (this.dataUnits === 'ms') {
260 dataWithUnits = this.formatter.format_number(data, 1000, ['ms', 's'], this.decimals);
262 dataWithUnits = this.dimlessPipe.transform(data, this.decimals);
264 return dataWithUnits;
267 private setChartTicks() {
269 this.chartDataUnits = '';
274 let maxValueDataUnits = '';
277 let maxValueData = Math.max(...this.data.map((values: any) => values[1]));
279 let maxValueData2 = Math.max(...this.data2.map((values: any) => values[1]));
280 maxValue = Math.max(maxValueData, maxValueData2);
282 maxValue = maxValueData;
284 [maxValue, maxValueDataUnits] = this.convertUnits(maxValue).split(' ');
287 const yAxesTicks = this.chart.chart.options.scales.y;
288 yAxesTicks.ticks.callback = (value: any) => {
292 if (!maxValueDataUnits) {
295 return `${value} ${maxValueDataUnits}`;
297 this.chartDataUnits = maxValueDataUnits || '';
298 this.chart.chart.update();