ice-frontend-react-mobx
Version:
ICE Frontend REACT+MobX
128 lines (117 loc) • 3.81 kB
JavaScript
const debug = require('debug')('ice:reports:capacity'); // eslint-disable-line no-unused-vars
import React, { Component } from 'react';
import { Card, Dropdown } from 'react-toolbox';
import { api } from '../../../common/helpers/Api';
import ZoneCapacity from '../../../components/Reports/Capacity/ZoneCapacity';
import TrendChart from '../../../components/Dataviz/TrendChart';
import SubNav from '../../../components/SubNav/SubNav';
const timeRangeConstants = {
'day': {
range: '24',
interval: '5'
},
'week': {
range: '168',
interval: '60'
},
'month': {
range: '720',
interval: '60'
},
'3months': {
range: '2160',
interval: '60'
}
};
const timeRangeOptions = [
{value: 'day', label: '1 day (5m interval)'},
{value: 'week', label: '1 week (1h interval)'},
{value: 'month', label: '1 month (1h interval)'},
{value: '3months', label: '3 months (1h interval)'}
];
export default class Capacity extends Component {
constructor (props) {
super(props);
this.state = {
chartData: null,
timeSelected: 'day', // Default range
loading: null
};
}
componentDidMount () {
this.loadReport(this.props.params.id, this.state.timeSelected);
}
handleTimeChange = (valSelected) => {
this.loadReport(this.props.params.id, valSelected);
};
// timerange in hours and interval in min.
loadReport (id, rangeSelected) {
let timerangeObj = timeRangeConstants[rangeSelected];
let timerange = timerangeObj.range;
let interval = timerangeObj.interval;
return api.zones.sensorSummary(id, timerange + 'h', interval + 'm').then((report) => {
debug('got report!', report);
let chartData = [].concat(report);
if (chartData.length === 0) {
// we have no chart data, leave null and show alternate view
return;
}
let emptyDataPoint = {
'outputPowerW': 0,
'battAvgSocProp': 0,
'powerLimitW': 0,
'outputPower1W': 0,
'outputPower2W': 0,
'outputPower3W': 0
};
let timeStep = interval * 60 * 1000; // in milliseconds
let noOfDataPoints = (timerange * 60) / interval; // e.g. 288 data points for 24 hrs with 5 min. interval. (24 * 60) / 5
if (chartData.length < noOfDataPoints) {
while (chartData.length < noOfDataPoints) {
let timestamp = chartData[0].timestamp - timeStep;
let dataPoint = Object.assign({}, emptyDataPoint);
dataPoint.timestamp = timestamp;
chartData.unshift(dataPoint);
}
}
debug('Chart Data:', chartData);
this.setState({
timeSelected: rangeSelected,
chartData: chartData
});
}).catch((error) => {
debug('error getting report:', error);
});
}
renderChart () {
if (this.state.loading) {
return <div>Loading.</div>;
} else if (this.state.chartData && this.state.chartData.length && this.state.chartData.length > 0) {
return <TrendChart sensorSummaryData={this.state.chartData} />;
} else {
return <div>No Trend Data Found</div>;
}
}
render () {
debug('Capacity:', this.props);
return (
<div>
<SubNav title='Zone Capacity Report' />
<div style={{margin: '60px 10px 10px 10px'}}>
<Card style={{width: '90%', margin: '0 auto'}}>
<ZoneCapacity zoneId={this.props.params.id} />
<div style={{padding: '10px'}}>
<Dropdown
onChange={this.handleTimeChange.bind(this)}
source={timeRangeOptions}
value={this.state.timeSelected}
label='Pick a time range'
/>
{this.renderChart()}
</div>
</Card>
</div>
</div>
);
}
}