1 import { AfterViewInit, Component, Input, OnChanges, 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, PluginServiceGlobalRegistrationAndOptions } from 'ng2-charts';
8 import { DimlessPipe } from '~/app/shared/pipes/dimless.pipe';
9 import { NumberFormatterService } from '~/app/shared/services/number-formatter.service';
12 selector: 'cd-dashboard-area-chart',
13 templateUrl: './dashboard-area-chart.component.html',
14 styleUrls: ['./dashboard-area-chart.component.scss']
16 export class DashboardAreaChartComponent implements OnChanges, AfterViewInit {
17 @ViewChild(BaseChartDirective) chart: BaseChartDirective;
26 data: Array<[number, string]>;
28 data2?: Array<[number, string]>;
34 decimals?: number = 1;
36 currentDataUnits: string;
38 currentDataUnits2?: string;
39 currentData2?: number;
40 maxConvertedValue?: number;
41 maxConvertedValueUnits?: string;
43 chartDataUnits: string;
48 data: [{ x: 0, y: 0 }],
50 pointBackgroundColor: this.cssHelper.propertyValue('chart-color-strong-blue'),
51 backgroundColor: this.cssHelper.propertyValue('chart-color-translucent-blue'),
52 borderColor: this.cssHelper.propertyValue('chart-color-strong-blue'),
59 pointBackgroundColor: this.cssHelper.propertyValue('chart-color-orange'),
60 backgroundColor: this.cssHelper.propertyValue('chart-color-translucent-yellow'),
61 borderColor: this.cssHelper.propertyValue('chart-color-orange'),
69 maintainAspectRatio: false,
81 custom: function (tooltipModel: { x: number; y: number }) {
87 backgroundColor: this.cssHelper.propertyValue('chart-color-tooltip-background'),
89 title: function (tooltipItem: any): any {
90 return tooltipItem[0].xLabel;
92 label: (tooltipItems: any, data: any) => {
95 data.datasets[tooltipItems.datasetIndex].label +
116 tooltipFormat: 'DD/MM/YYYY - HH:mm:ss'
128 callback: (value: any) => {
132 return this.fillString(this.convertUnits(value));
141 borderColor: this.cssHelper.propertyValue('chart-color-slight-dark-gray'),
147 public chartAreaBorderPlugin: PluginServiceGlobalRegistrationAndOptions[] = [
149 beforeDraw(chart: Chart) {
150 if (!chart.options.plugins.borderArea) {
155 chartArea: { left, top, right, bottom }
158 ctx.strokeStyle = chart.options.plugins.chartAreaBorder.borderColor;
159 ctx.lineWidth = chart.options.plugins.chartAreaBorder.borderWidth;
160 ctx.setLineDash(chart.options.plugins.chartAreaBorder.borderDash || []);
161 ctx.lineDashOffset = chart.options.plugins.chartAreaBorder.borderDashOffset;
162 ctx.strokeRect(left, top, right - left - 1, bottom);
169 private cssHelper: CssHelper,
170 private dimlessBinary: DimlessBinaryPipe,
171 private dimlessBinaryPerSecond: DimlessBinaryPerSecondPipe,
172 private dimlessPipe: DimlessPipe,
173 private formatter: FormatterService,
174 private numberFormatter: NumberFormatterService
177 ngOnChanges(): void {
178 this.updateChartData();
181 ngAfterViewInit(): void {
182 this.updateChartData();
185 private updateChartData(): void {
186 this.chartData.dataset[0].label = this.label;
187 this.chartData.dataset[1].label = this.label2;
188 this.setChartTicks();
190 this.chartData.dataset[0].data = this.formatData(this.data);
191 [this.currentData, this.currentDataUnits] = this.convertUnits(
192 this.data[this.data.length - 1][1]
194 [this.maxConvertedValue, this.maxConvertedValueUnits] = this.convertUnits(
199 this.chartData.dataset[1].data = this.formatData(this.data2);
200 [this.currentData2, this.currentDataUnits2] = this.convertUnits(
201 this.data2[this.data2.length - 1][1]
205 this.chart.chart.update();
209 private formatData(array: Array<any>): any {
210 let formattedData = {};
211 formattedData = array.map((data: any) => ({
213 y: Number(this.convertToChartDataUnits(data[1]).replace(/[^\d,.]+/g, ''))
215 return formattedData;
218 private convertToChartDataUnits(data: any): any {
219 let dataWithUnits: string = '';
220 if (this.chartDataUnits !== null) {
221 if (this.dataUnits === 'B') {
222 dataWithUnits = this.numberFormatter.formatBytesFromTo(
228 } else if (this.dataUnits === 'B/s') {
229 dataWithUnits = this.numberFormatter.formatBytesPerSecondFromTo(
235 } else if (this.dataUnits === 'ms') {
236 dataWithUnits = this.numberFormatter.formatSecondsFromTo(
243 dataWithUnits = this.numberFormatter.formatUnitlessFromTo(
251 return dataWithUnits;
254 private convertUnits(data: any): any {
255 let dataWithUnits: string = '';
256 if (this.dataUnits === 'B') {
257 dataWithUnits = this.dimlessBinary.transform(data, this.decimals);
258 } else if (this.dataUnits === 'B/s') {
259 dataWithUnits = this.dimlessBinaryPerSecond.transform(data, this.decimals);
260 } else if (this.dataUnits === 'ms') {
261 dataWithUnits = this.formatter.format_number(data, 1000, ['ms', 's'], this.decimals);
263 dataWithUnits = this.dimlessPipe.transform(data, this.decimals);
265 return dataWithUnits;
268 private fillString(str: string): string {
269 let maxNumberOfChar: number = 8;
270 let numberOfChars: number = str.length;
271 if (str.length < 4) {
272 maxNumberOfChar = 11;
274 for (; numberOfChars < maxNumberOfChar; numberOfChars++) {
275 str = '\u00A0' + str;
277 return str + '\u00A0\u00A0';
280 private setChartTicks() {
286 let maxValueDataUnits = '';
290 let maxValueData = Math.max(...this.data.map((values: any) => values[1]));
292 let maxValueData2 = Math.max(...this.data2.map((values: any) => values[1]));
293 maxValue = Math.max(maxValueData, maxValueData2);
295 maxValue = maxValueData;
297 [maxValue, maxValueDataUnits] = this.convertUnits(maxValue).split(' ');
300 const yAxesTicks = this.chart.chart.options.scales.yAxes[0].ticks;
301 yAxesTicks.suggestedMax = maxValue * extraRoom;
302 yAxesTicks.suggestedMin = 0;
303 yAxesTicks.callback = (value: any) => {
307 if (!maxValueDataUnits) {
308 return this.fillString(`${value}`);
310 return this.fillString(`${value} ${maxValueDataUnits}`);
312 this.chartDataUnits = maxValueDataUnits || '';
313 this.chart.chart.update();