diff --git a/angular.json b/angular.json index d1be5f41..62db393d 100644 --- a/angular.json +++ b/angular.json @@ -32,9 +32,7 @@ "src/assets/css/bulma-steps.min.css", "src/styles.css" ], - "scripts": [ - "./node_modules/plotly.js/dist/plotly.js" - ] + "scripts": [] }, "configurations": { "production": { diff --git a/docs/developers-guide.md b/docs/developers-guide.md index 1a0f8826..64fbf302 100644 --- a/docs/developers-guide.md +++ b/docs/developers-guide.md @@ -79,16 +79,15 @@ Set API base URL in `environments/environment.prod.ts`, you can always change it #### Core Library | Version | Latest Stable (? Y/n) | License ------------- | ------------- | -------------------- | ------------ - Angular | 8.2.12 | 8.2.12 | MIT - Angular CLI | 8.3.14 | 8.3.14 | MIT + Angular | 8.2.12 | 8.2.12 | MIT + Angular CLI | 8.3.14 | 8.3.14 | MIT TypeScript | 3.5.3 | 3.6.3 | Apache 2.0 rxjs | 6.5.2 | 6.5.2 | Apache 2.0 Bulma css | 0.7.5 | 0.7.5 | MIT - + #### Dev Library | Version | Latest Stable (? Y/n) | License ---------------- | ------------- | -------------------- | ------------ -chart.js | 2.8.0 | 2.8.0 | MIT core-js | 3.3.3 | 3.3.3 | MIT ng-sidebar | 8.0.0 | 8.0.0 | MIT moment | 2.24.0 | 2.24.0 | MIT diff --git a/package.json b/package.json index 975bb4af..953333e4 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,9 @@ "@ctrl/ngx-codemirror": "^2.2.0", "@ng-select/ng-select": "^3.3.0", "@ngx-progressbar/core": "^5.3.2", + "angular-plotly.js": "^1.4.2", "angular-tree-component": "~8.4.0", "animate.css": "^3.7.2", - "chart.js": "~2.8.0", "codemirror": "^5.49.2", "core-js": "^3.3.3", "jsonlint-mod": "^1.7.5", diff --git a/src/app/components/common/chart/chart.component.spec.ts b/src/app/components/common/chart/chart.component.spec.ts deleted file mode 100644 index 4bfa6113..00000000 --- a/src/app/components/common/chart/chart.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ChartComponent } from './chart.component'; - -describe('ChartComponent', () => { - let component: ChartComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ChartComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ChartComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/components/common/chart/chart.component.ts b/src/app/components/common/chart/chart.component.ts deleted file mode 100644 index 5fa64620..00000000 --- a/src/app/components/common/chart/chart.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, ElementRef, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { Chart } from 'chart.js'; - -@Component({ - selector: 'app-chart', - template: '', - styles: [':host { display: block; }'] -}) -export class ChartComponent implements OnInit, OnChanges, OnDestroy { - chart: any; - - @Input() type: string; - @Input() data: any; - @Input() options: any; - - constructor(private elementRef: ElementRef) { } - - ngOnInit() { } - - ngOnChanges() { - if (this.chart) { - this.chart.destroy(); - } - this.chart = new Chart(this.elementRef.nativeElement.querySelector('canvas'), { - type: this.type, - data: this.data, - options: this.options - }); - this.chart.update(0); - } - - ngOnDestroy() { - if (this.chart) { - this.chart.destroy(); - } - } -} diff --git a/src/app/components/common/chart/chart.module.ts b/src/app/components/common/chart/chart.module.ts deleted file mode 100644 index 0aae6f2f..00000000 --- a/src/app/components/common/chart/chart.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NgModule } from '@angular/core'; - -import { ChartComponent } from './chart.component'; - -@NgModule({ - declarations: [ ChartComponent ], - exports: [ ChartComponent ] -}) -export class ChartModule { - constructor() { } -} diff --git a/src/app/components/common/chart/index.ts b/src/app/components/common/chart/index.ts deleted file mode 100644 index db363ec4..00000000 --- a/src/app/components/common/chart/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './chart.component'; -export * from './chart.module'; diff --git a/src/app/components/core/asset-readings/assets.module.ts b/src/app/components/core/asset-readings/assets.module.ts index 87a78eef..cee8d0c8 100644 --- a/src/app/components/core/asset-readings/assets.module.ts +++ b/src/app/components/core/asset-readings/assets.module.ts @@ -6,12 +6,16 @@ import { RouterModule, Routes } from '@angular/router'; import { AuthCheckGuard } from '../../../guards'; import { PipesModule } from '../../../pipes/pipes.module'; import { AssetsService } from '../../../services'; -import { ChartModule } from '../../common/chart'; import { NumberInputDebounceModule } from '../../common/number-input-debounce/number-input-debounce.module'; import { PaginationModule } from '../../common/pagination/pagination.module'; import { ReadingsGraphComponent } from '../asset-readings/readings-graph/readings-graph.component'; import { AssetsComponent } from './assets/assets.component'; +import * as PlotlyJS from 'plotly.js/dist/plotly.js'; +import { PlotlyModule } from 'angular-plotly.js'; + +PlotlyModule.plotlyjs = PlotlyJS; + const routes: Routes = [ { path: '', @@ -31,7 +35,7 @@ const routes: Routes = [ CommonModule, RouterModule.forChild(routes), PipesModule, - ChartModule, + PlotlyModule, NumberInputDebounceModule, PaginationModule ], diff --git a/src/app/components/core/asset-readings/readings-graph/readings-graph.component.css b/src/app/components/core/asset-readings/readings-graph/readings-graph.component.css index 8b34da54..eef28e01 100644 --- a/src/app/components/core/asset-readings/readings-graph/readings-graph.component.css +++ b/src/app/components/core/asset-readings/readings-graph/readings-graph.component.css @@ -8,60 +8,10 @@ padding: 15px !important; } -.modal-card-body { - padding: 15px !important; -} - @media screen and (min-width: 769px) { .modal-card { width: 85%; } - :host ::ng-deep .chart-container canvas[style] { - height: calc(100vh - 181px) !important; - } - - :host ::ng-deep .svg-container { - height: calc(100vh - 181px) !important; - } -} - -@media screen and (max-width: 769px) { - .chart-container { - position: relative; - width: 736px; - height: 397px; - } - .summary { - width: 736px; - } -} - -.summary, -.summary .table { - background-color: #F8F9F9; - border-radius: 5px; -} - -.is-info { - background-color: #85C1E9 !important; -} - -table.is-borderless tr a { - padding-left: 0; -} - -table.is-borderless td, -table.is-borderless tr { - border: 0 !important; - vertical-align: middle; -} - -tbody { - line-height: 0.5; -} - -.data-table { - width: 100%; } .app-loading { diff --git a/src/app/components/core/asset-readings/readings-graph/readings-graph.component.html b/src/app/components/core/asset-readings/readings-graph/readings-graph.component.html index 3e177a27..d054417b 100644 --- a/src/app/components/core/asset-readings/readings-graph/readings-graph.component.html +++ b/src/app/components/core/asset-readings/readings-graph/readings-graph.component.html @@ -1,6 +1,6 @@ -
-
-
-
-
-
{{ statistic.description }}
-
- -
-
Total since startup: - {{ statistic.value | number }} -
+
+
+
+
+
+
+
{{ statistic.description }}
+
+
+   + + +
+ + +
+
Total since startup: + {{ statistic.value | number }} +
-
\ No newline at end of file +
diff --git a/src/app/components/core/dashboard/dashboard.component.ts b/src/app/components/core/dashboard/dashboard.component.ts index 11bbdb70..bb7c079c 100644 --- a/src/app/components/core/dashboard/dashboard.component.ts +++ b/src/app/components/core/dashboard/dashboard.component.ts @@ -3,7 +3,6 @@ import { map } from 'lodash'; import { interval, Subject } from 'rxjs'; import { takeWhile, takeUntil } from 'rxjs/operators'; -import { DateFormatterPipe } from '../../../pipes'; import { AlertService, PingService, StatisticsService } from '../../../services'; import { GRAPH_REFRESH_INTERVAL, STATS_HISTORY_TIME_FILTER } from '../../../utils'; @@ -17,7 +16,7 @@ export class DashboardComponent implements OnInit, OnDestroy { // Filtered array of received statistics data (having objects except key @FOGBENCH). statistics = []; - // Array of Statistics Keys (["BUFFERED", "DISCARDED", "PURGED", ....]) + // Array of Statistics Keys (['BUFFERED', 'DISCARDED', 'PURGED', ....]) statisticsKeys = []; selectedGraphsList = [] = @@ -27,19 +26,29 @@ export class DashboardComponent implements OnInit, OnDestroy { // Array of the graphs to show graphsToShow = []; - public chartOptions: object; - + public showSpinner = false; public refreshInterval = GRAPH_REFRESH_INTERVAL; public optedTime; DEFAULT_LIMIT = 20; private isAlive: boolean; + private REQUEST_TIMEOUT_INTERVAL = 5000; destroy$: Subject = new Subject(); + panning = false; + zoom = false; + config = { + doubleClick: false, + displaylogo: false, + displayModeBar: true, + modeBarButtonsToRemove: ['resetScale2d', 'hoverClosestCartesian', + 'hoverCompareCartesian', 'lasso2d', 'zoom2d', 'autoScale2d', 'pan2d', + 'zoomIn2d', 'zoomOut2d', 'toImage', 'toggleSpikelines', 'resetViews', 'resetViewMapbox'] + }; + constructor(private statisticsService: StatisticsService, private alertService: AlertService, - private dateFormatter: DateFormatterPipe, private ping: PingService) { this.isAlive = true; this.ping.refreshIntervalChanged @@ -53,6 +62,7 @@ export class DashboardComponent implements OnInit, OnDestroy { } ngOnInit() { + this.showLoadingSpinner(); // To check if data saved in valid format in local storage const optedGraphStorage = JSON.parse(localStorage.getItem('OPTED_GRAPHS')); if (optedGraphStorage != null && typeof (optedGraphStorage[0]) !== 'object') { @@ -121,34 +131,18 @@ export class DashboardComponent implements OnInit, OnDestroy { }); } - protected getChartOptions() { - this.chartOptions = { - legend: { - display: false - }, - scales: { - yAxes: [{ - ticks: { - beginAtZero: true - } - }] - } - }; - } - protected getChartValues(labels, data, color) { - this.getChartOptions(); return { - labels: labels, - datasets: [ - { - label: '', - data: data, - backgroundColor: color, - fill: false, - lineTension: 0 - } - ] + x: labels, + y: data, + type: 'scatter', + mode: 'lines', + marker: { + color: color + }, + modeBarButtons: [{ + displaylogo: false + }] }; } @@ -184,15 +178,16 @@ export class DashboardComponent implements OnInit, OnDestroy { let history_ts = map(data['statistics'], 'history_ts'); history_ts = history_ts.reverse(); history_ts.forEach(ts => { - ts = this.dateFormatter.transform(ts, 'HH:mm:ss'); labels.push(ts); }); this.graphsToShow = this.graphsToShow.filter(value => value !== undefined); this.graphsToShow.map(statistics => { if (statistics.key === dt.key) { - statistics.chartValue = this.getChartValues(labels, record, 'rgb(144,238,144)'); - statistics.chartType = 'line'; + statistics.chartValue = []; + const chartValue = this.getChartValues(labels, record, 'rgb(144,238,144)'); + statistics.chartValue.push(chartValue); statistics.limit = this.DEFAULT_LIMIT; + statistics.layout = this.setLayout(statistics.value); } }); }); @@ -207,6 +202,7 @@ export class DashboardComponent implements OnInit, OnDestroy { } public getStatisticsHistory(time = null): void { + this.showLoadingSpinner(); if (time == null) { localStorage.setItem('STATS_HISTORY_TIME_FILTER', STATS_HISTORY_TIME_FILTER); } else { @@ -222,20 +218,25 @@ export class DashboardComponent implements OnInit, OnDestroy { let history_ts = map(data['statistics'], 'history_ts'); history_ts = history_ts.reverse(); history_ts.forEach(ts => { - ts = this.dateFormatter.transform(ts, 'HH:mm:ss'); labels.push(ts); }); this.graphsToShow = this.graphsToShow.filter(value => value !== undefined); this.graphsToShow.map(statistics => { + statistics.chartValue = []; if (statistics.key === dt.key) { - statistics.chartValue = this.getChartValues(labels, record, 'rgb(144,238,144)'); - statistics.chartType = 'line'; + const chartValue = this.getChartValues(labels, record, 'rgb(144,238,144)'); + statistics.chartValue.push(chartValue); statistics.limit = this.DEFAULT_LIMIT; + statistics.layout = this.setLayout(statistics.value); } + setTimeout(() => { + this.hideLoadingSpinner(); + }, this.REQUEST_TIMEOUT_INTERVAL); }); }); }, error => { + this.hideLoadingSpinner(); if (error.status === 0) { console.log('service down', error); } else { @@ -244,6 +245,52 @@ export class DashboardComponent implements OnInit, OnDestroy { }); } + setLayout(value) { + const layout = { + showlegend: false, + font: { + size: 12 + }, + dragmode: 'false', + xaxis: { + fixedrange: true, + tickformat: '%H:%M:%S', + type: 'date', + title: { + font: { + size: 14, + color: '#7f7f7f' + } + } + }, + yaxis: { + fixedrange: true, + rangemode: 'nonnegative', + range: [0, 8] + }, + height: 300, + margin: { + l: 30, + r: 30, + b: 30, + t: 30, + pad: 5 + } + }; + if (value !== 0) { + layout.yaxis.range = []; + } + return layout; + } + + public showLoadingSpinner() { + this.showSpinner = true; + } + + public hideLoadingSpinner() { + this.showSpinner = false; + } + public toggleDropDown(id: string) { const activeDropDowns = Array.prototype.slice.call(document.querySelectorAll('.dropdown.is-active')); if (activeDropDowns.length > 0) { diff --git a/src/app/components/core/dashboard/dashboard.module.ts b/src/app/components/core/dashboard/dashboard.module.ts index 8e208381..bdbfce9b 100644 --- a/src/app/components/core/dashboard/dashboard.module.ts +++ b/src/app/components/core/dashboard/dashboard.module.ts @@ -5,8 +5,11 @@ import { FormsModule } from '@angular/forms'; import { DashboardComponent } from '.'; import { DateFormatterPipe } from '../../../pipes'; import { StatisticsService } from '../../../services'; -import { ChartModule } from '../../common/chart'; import { NumberInputDebounceModule } from '../../common/number-input-debounce/number-input-debounce.module'; +import * as PlotlyJS from 'plotly.js/dist/plotly.js'; +import { PlotlyModule } from 'angular-plotly.js'; + +PlotlyModule.plotlyjs = PlotlyJS; @NgModule({ declarations: [ @@ -16,7 +19,7 @@ import { NumberInputDebounceModule } from '../../common/number-input-debounce/nu FormsModule, CommonModule, NumberInputDebounceModule, - ChartModule, + PlotlyModule ], providers: [StatisticsService, DateFormatterPipe], exports: [] diff --git a/src/app/components/core/support/support.module.ts b/src/app/components/core/support/support.module.ts index b1fb059d..281c9592 100644 --- a/src/app/components/core/support/support.module.ts +++ b/src/app/components/core/support/support.module.ts @@ -4,7 +4,6 @@ import { FormsModule } from '@angular/forms'; import { DateFormatterPipe } from '../../../pipes'; import { StatisticsService } from '../../../services'; -import { ChartModule } from '../../common/chart'; import { NumberInputDebounceModule } from '../../common/number-input-debounce/number-input-debounce.module'; import { Routes, RouterModule } from '@angular/router'; import { AuthCheckGuard } from '../../../guards'; @@ -27,8 +26,7 @@ const routes: Routes = [ RouterModule.forChild(routes), FormsModule, CommonModule, - NumberInputDebounceModule, - ChartModule, + NumberInputDebounceModule ], providers: [StatisticsService, DateFormatterPipe], exports: [] diff --git a/src/app/services/assets.service.ts b/src/app/services/assets.service.ts index c26ff687..8f2f37de 100644 --- a/src/app/services/assets.service.ts +++ b/src/app/services/assets.service.ts @@ -37,11 +37,26 @@ export class AssetsService { if (+offset !== 0) { params = params.set('offset', offset.toString()); } - return this.http.get(this.GET_ASSET + '/' + assetCode, { params: params }).pipe( + return this.http.get(this.GET_ASSET + '/' + encodeURIComponent(assetCode), { params: params }).pipe( map(response => response), catchError(error => throwError(error))); } + public getAssetReadingsBucket(payload) { + let params = new HttpParams(); + if (payload.start !== 0) { + params = params.append('start', payload.start); + } + if (payload.len) { + params = params.append('length', payload.len); + } + + return this.http.get(`${this.GET_ASSET}/${encodeURIComponent(payload.assetCode)}/bucket/${payload.bucketSize}`, + { params: params }).pipe( + map(response => response), + catchError(error => throwError(error))); + } + /** * GET | /foglamp/asset/{assetCode} * @param assets Array of asset names with limits to pass diff --git a/src/app/utils.ts b/src/app/utils.ts index cb545f82..e825bf2e 100644 --- a/src/app/utils.ts +++ b/src/app/utils.ts @@ -4,10 +4,10 @@ export const GRAPH_REFRESH_INTERVAL = 5000; // milliseconds export const STATS_HISTORY_TIME_FILTER = '10'; // minutes export const ASSET_READINGS_TIME_FILTER = 600; // seconds export const COLOR_CODES = ['#3498DB', '#85C1E9', '#239B56', '#82E0AA', '#B03A2E', '#F1948A', '#FF8C00', '#FF0000', -'#FF5733', '#34AEDB', '#FF6C32', '#8595E9', '#239B87', '#FF9D00', '#82D8E0', '#C79217', '#C75817', -'#E058E5', '#A464A6', '#533754', '#1D081E', '#7C767C', '#937EE5', '#6442EC', '#5744A5', '#17112E', '#6B6A6E', '#251E40', -'#5E8DBC', '#115DA9', '#0A7AE9', '#0ACCE9', '#1F6975', '#043840', '#C0F1F9', '#C0F9F1', '#137366', '#073731', '#637F7B', -'#1EAC73', '#116644', '#DAF3E9', '#455F55', '#17A53D', '#09EE46', '#0C4B1D', '#272C28', '#9CBD16', '#D8FA4C', '#87954C', + '#FF5733', '#34AEDB', '#FF6C32', '#8595E9', '#239B87', '#FF9D00', '#82D8E0', '#C79217', '#C75817', + '#E058E5', '#A464A6', '#533754', '#1D081E', '#7C767C', '#937EE5', '#6442EC', '#5744A5', '#17112E', '#6B6A6E', '#251E40', + '#5E8DBC', '#115DA9', '#0A7AE9', '#0ACCE9', '#1F6975', '#043840', '#C0F1F9', '#C0F9F1', '#137366', '#073731', '#637F7B', + '#1EAC73', '#116644', '#DAF3E9', '#455F55', '#17A53D', '#09EE46', '#0C4B1D', '#272C28', '#9CBD16', '#D8FA4C', '#87954C', ]; export default class Utils { @@ -24,7 +24,6 @@ export default class Utils { public static leftPad(repeat_time: string) { if (repeat_time !== undefined) { // server sends time in xh:mm:ss format if x = 0 repeat_time = repeat_time.length === 7 ? repeat_time = '0' + repeat_time : repeat_time; - console.log('time', repeat_time); return repeat_time; } } @@ -80,7 +79,6 @@ export default class Utils { return true; } const totalSec = (+hh * 60 * 60) + (+mm * 60) + (+ss); - console.log('Total sec', totalSec); return totalSec < 0 || totalSec >= 86400; } @@ -88,4 +86,52 @@ export default class Utils { return Date.now(); } + public static getTimeWindow(index: number) { + const timeWindows = { + '1/100,000 secs': 0.00001, + '1/50,000 secs': 0.00002, + '1/20,000 secs': 0.00005, + '1/10,000 secs': 0.0001, + '1/5,000 secs': 0.0002, + '1/2,000 secs': 0.0005, + '1/1,000 secs': 0.001, + '1/500 secs': 0.002, + '1/200 secs': 0.005, + '1/100 secs': 0.01, + '1/50 secs': 0.02, + '1/20 secs': 0.05, + '1/10 secs': 0.1, + '1/5 secs': 0.2, + '1/2 secs': 0.5, + '1 secs': 1, + '2 secs': 2, + '5 secs': 5, + '10 secs': 10, + '30 secs': 30, + '1 min': 60, + '2 mins': 120, + '5 mins': 300, + '10 mins': 600, + '30 mins': 1800, + '1 hour': 3600, + '2 hours': 7200, + '3 hours': 10800, + '6 hours': 21600, + '12 hours': 43200, + '1 day': 86400, + '2 days': 172800, + '4 days': 345600, + '1 week': 604800, + '2 weeks': 1209600, + '1 month': 2592000, + '2 months': 5184000, + '6 months': 15552000, + '1 year': 31104000 + }; + const key = Object.keys(timeWindows)[index]; + const value = Object.values(timeWindows)[index]; + const size = Object.keys(timeWindows).length; + return { key, value, size }; + } + } diff --git a/src/main.ts b/src/main.ts index d0078e9c..f84efefd 100644 --- a/src/main.ts +++ b/src/main.ts @@ -23,9 +23,9 @@ window.jsonlint = jsonlint; if (environment.production) { enableProdMode(); - if (window) { - window.console.log = function () { }; - } + // if (window) { + // window.console.log = function () { }; + // } } platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/yarn.lock b/yarn.lock index 5f23b929..9de7ede4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1487,6 +1487,13 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= +angular-plotly.js@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/angular-plotly.js/-/angular-plotly.js-1.4.2.tgz#25a8d7adf3f0cbdf5e7d3bbe80d9909dc3cb7bc4" + integrity sha512-Je3MNs/2WOHc+/I73tZxg64QI2oeicWlYLoV8kEOxDnmmabskZyZjxdSkGZaxg14tdGiMoH1mru+D9mGZTQkiQ== + dependencies: + tslib "^1.9.0" + angular-tree-component@~8.4.0: version "8.4.0" resolved "https://registry.yarnpkg.com/angular-tree-component/-/angular-tree-component-8.4.0.tgz#1e36118e4a5c0e573764a2a58efd66ec793fdc20" @@ -2490,29 +2497,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chart.js@~2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.8.0.tgz#b703b10d0f4ec5079eaefdcd6ca32dc8f826e0e9" - integrity sha512-Di3wUL4BFvqI5FB5K26aQ+hvWh8wnP9A3DWGvXHVkO13D3DSnaSsdZx29cXlEsYKVkn1E2az+ZYFS4t0zi8x0w== - dependencies: - chartjs-color "^2.1.0" - moment "^2.10.2" - -chartjs-color-string@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz#1df096621c0e70720a64f4135ea171d051402f71" - integrity sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A== - dependencies: - color-name "^1.0.0" - -chartjs-color@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.3.0.tgz#0e7e1e8dba37eae8415fd3db38bf572007dd958f" - integrity sha512-hEvVheqczsoHD+fZ+tfPUE+1+RbV6b+eksp2LwAhwRTVXEjCSEavvk+Hg3H6SZfGlPh/UfmWKGIvZbtobOEm3g== - dependencies: - chartjs-color-string "^0.6.0" - color-convert "^0.5.3" - "chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0: version "3.2.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.2.2.tgz#a433973350021e09f2b853a2287781022c0dc935" @@ -2716,11 +2700,6 @@ color-alpha@^1.0.4: dependencies: color-parse "^1.3.8" -color-convert@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" - integrity sha1-vbbGnOZg+t/+CwAHzER+G59ygr0= - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -6993,7 +6972,7 @@ mobx@^3.6.2: resolved "https://registry.yarnpkg.com/mobx/-/mobx-3.6.2.tgz#fb9f5ff5090539a1ad54e75dc4c098b602693320" integrity sha512-Dq3boJFLpZEvuh5a/MbHLUIyN9XobKWIb0dBfkNOJffNkE3vtuY0C9kSDVpfH8BB0BPkVw8g22qCv7d05LEhKg== -moment@^2.10.2, moment@~2.24.0: +moment@~2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==