00ber
added source code
f61d311
import { Component, OnInit, ViewChild } from '@angular/core';
import { UntypedFormControl, UntypedFormGroup } from '@angular/forms';
import { DashboardChartsData, IChartProps } from './dashboard-charts-data';
import { Predictions, PredictionsService } from "../../predictions.service"
import * as moment from 'moment';
import { Subject } from 'rxjs';
import { ChartjsComponent } from '@coreui/angular-chartjs';
export interface TableRow {
time: string;
predicted: number;
actual: number | null;
error: number | null;
}
@Component({
templateUrl: 'dashboard.component.html',
styleUrls: ['dashboard.component.scss']
})
export class DashboardComponent implements OnInit {
@ViewChild(ChartjsComponent, { static: true })
predChart!: ChartjsComponent;
constructor(private chartsData: DashboardChartsData, private predictionsApi: PredictionsService) {
}
public mainChart: IChartProps = {};
public chart: Array<IChartProps> = [];
public predicted: number[] = [];
public actual: number[] = [];
public tableRows$ = new Subject<TableRow[]>();
public endDate: moment.Moment = moment();
public startDate: moment.Moment = moment(this.endDate).subtract(30, "days");
public datesLabel: string = `${this.startDate.format("YYYY/MM/DD")} ~ ${this.endDate.format("YYYY/MM/DD")}`;
public selectedDate!: string;
ngOnInit(): void {
this.initCharts();
this.predictionsApi.$predictions.subscribe(data => {
this.predicted = Object.keys(data).map(k => data[k].predicted)
this.actual = Object.keys(data).map(k => data[k].actual).filter(i => !!i) as number[];
const tableRows = this.toTableRows(data);
this.tableRows$.next(tableRows)
this.chartsData.initMainChart(tableRows);
})
}
private getLabelText(label: string): string {
const hour = label.slice(0,2)
let hourValue = Number(hour);
const suffix = (hourValue >= 12) ? "pm" : "am";
if (hourValue > 12) {
hourValue = hourValue - 12;
}
let labelTxt = `${hourValue} ${suffix}`;
if (labelTxt == "0 am") {
labelTxt = "12 am";
}
return labelTxt
}
private toTableRows(predictions: Predictions): TableRow[] {
return Object.keys(predictions).map(datetime => {
const time = datetime.slice(-8)
const timeLabel = this.getLabelText(time);
let error = null;
const actual = predictions[datetime].actual;
const predicted = predictions[datetime].predicted;
if (!!actual) {
error = actual - predicted
}
return {
time: timeLabel,
predicted,
actual,
error
}
});
}
initCharts(): void {
this.mainChart = this.chartsData.mainChart;
}
changeSelectedDate(selectedDate: string): void {
this.selectedDate = selectedDate;
this.tableRows$.next([])
if(this.predChart.chart){
this.mainChart.data.datasets.forEach((ds: any) => {
ds.data = [];
})
this.predChart.chart.update()
}
this.predictionsApi.getPredictions(selectedDate)
}
}