SDNR align ODLUX
[ccsdk/features.git] / sdnr / wt / odlux / apps / performanceHistoryApp / src / components / performanceData.tsx
1 import * as React from 'react';
2
3 import { withRouter, RouteComponentProps } from 'react-router-dom';
4
5 import { MaterialTable, ColumnType, ColumnModel, MaterialTableCtorType } from '../../../../framework/src/components/material-table';
6 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
7 import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect';
8 import { PerformanceDataType } from '../models/performanceDataType';
9 import { IDataSet, IDataSetsObject } from '../models/chartTypes';
10 import { createPerformanceData15minProperties, createPerformanceData15minActions } from '../handlers/performanceData15minHandler';
11 import { createPerformanceData24hoursProperties, createPerformanceData24hoursActions } from '../handlers/performanceData24hoursHandler';
12 import { lineChart, sortDataByTimeStamp } from '../utils/chartUtils';
13 import { addColumnLabels } from '../utils/tableUtils';
14
15 const mapProps = (state: IApplicationStoreState) => ({
16   performanceData15minProperties: createPerformanceData15minProperties(state),
17   performanceData24hoursProperties: createPerformanceData24hoursProperties(state)
18 });
19
20 const mapDisp = (dispatcher: IDispatcher) => ({
21   performanceData15minActions: createPerformanceData15minActions(dispatcher.dispatch),
22   performanceData24hoursActions: createPerformanceData24hoursActions(dispatcher.dispatch)
23 });
24
25 type PerformanceDataComponentProps = RouteComponentProps & Connect<typeof mapProps, typeof mapDisp> & {
26   selectedTimePeriod: string
27 };
28
29 const PerformanceDataTable = MaterialTable as MaterialTableCtorType<PerformanceDataType>;
30
31 /**
32  * The Component which gets the performance data from the database based on the selected time period.
33  */
34 class PerformanceDataComponent extends React.Component<PerformanceDataComponentProps>{
35   render(): JSX.Element {
36     const properties = this.props.selectedTimePeriod === "15min"
37       ? this.props.performanceData15minProperties
38       : this.props.performanceData24hoursProperties;
39     const actions = this.props.selectedTimePeriod === "15min"
40       ? this.props.performanceData15minActions
41       : this.props.performanceData24hoursActions;
42
43     const chartPagedData = this.getChartDataValues(properties.rows);
44     const performanceColumns: ColumnModel<PerformanceDataType>[] = [
45       { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text },
46       { property: "scanner-id", title: "Scanner ID", type: ColumnType.text },
47       { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true },
48       {
49         property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => {
50           const suspectIntervalFlag = rowData["suspect-interval-flag"].toString();
51           return <div >{suspectIntervalFlag} </div>
52         }
53       }
54     ];
55
56     chartPagedData.datasets.forEach(ds => {
57       performanceColumns.push(addColumnLabels<PerformanceDataType>(ds.name, ds.columnLabel));
58     });
59     return (
60       <>
61         {lineChart(chartPagedData)}
62         <PerformanceDataTable idProperty={"_id"} columns={performanceColumns} {...properties} {...actions} />
63       </>
64     );
65   };
66
67   /**
68    * This function gets the performance values for PerformanceData according on the chartjs dataset structure 
69    * which is to be sent to the chart.
70    */
71   private getChartDataValues = (rows: PerformanceDataType[]): IDataSetsObject => {
72     const _rows = [...rows];
73     sortDataByTimeStamp(_rows);
74
75     const datasets: IDataSet[] = [{
76       name: "es",
77       label: "es",
78       borderColor: '#0e17f3de',
79       bezierCurve: false,
80       lineTension: 0,
81       fill: false,
82       data: [],
83       columnLabel: "ES"
84     }, {
85       name: "ses",
86       label: "ses",
87       borderColor: '#08edb6de',
88       bezierCurve: false,
89       lineTension: 0,
90       fill: false,
91       data: [],
92       columnLabel: "SES"
93     }, {
94       name: "unavailability",
95       label: "unavailability",
96       borderColor: '#b308edde',
97       bezierCurve: false,
98       lineTension: 0,
99       fill: false,
100       data: [],
101       columnLabel: "Unavailability"
102     }];
103
104     _rows.forEach(row => {
105       datasets.forEach(ds => {
106         ds.data.push({
107           x: row["time-stamp"],
108           y: row[ds.name as keyof PerformanceDataType] as string
109         });
110       });
111     });
112     return {
113       datasets: datasets
114     };
115   }
116 }
117
118 const PerformanceData = withRouter(connect(mapProps, mapDisp)(PerformanceDataComponent));
119 export default PerformanceData;