2016-11-26 15:39:29 +01:00
|
|
|
'use strict';
|
|
|
|
|
2018-05-03 10:54:22 +02:00
|
|
|
import { h, Component } from 'preact';
|
2016-12-05 21:55:25 +01:00
|
|
|
import * as numbers from '../lib/numbers.js';
|
2016-12-08 12:27:19 +01:00
|
|
|
import Client from '../lib/client.js';
|
2018-05-01 16:06:17 +02:00
|
|
|
import { bind } from 'decko';
|
|
|
|
|
|
|
|
function getSundayOfCurrentWeek(d){
|
|
|
|
var day = d.getDay();
|
|
|
|
return new Date(d.getFullYear(), d.getMonth(), d.getDate() + (day == 0?0:7)-day );
|
|
|
|
}
|
|
|
|
|
2016-11-26 17:40:37 +01:00
|
|
|
const dayInSeconds = 60 * 60 * 24;
|
2016-11-26 15:39:29 +01:00
|
|
|
|
|
|
|
class CountWidget extends Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props)
|
|
|
|
|
|
|
|
this.state = {
|
2018-05-01 16:06:17 +02:00
|
|
|
value: '-',
|
2018-05-01 19:45:52 +02:00
|
|
|
loading: false,
|
|
|
|
before: props.before,
|
|
|
|
after: props.after,
|
2016-11-26 15:39:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-01 19:45:52 +02:00
|
|
|
componentDidMount() {
|
|
|
|
this.fetchData();
|
2016-11-26 15:39:29 +01:00
|
|
|
}
|
|
|
|
|
2018-05-01 19:45:52 +02:00
|
|
|
componentWillReceiveProps(newProps, prevState) {
|
2018-05-02 14:52:52 +02:00
|
|
|
if(newProps.before == prevState.before && newProps.after == prevState.after) {
|
|
|
|
return;
|
|
|
|
}
|
2018-05-01 16:06:17 +02:00
|
|
|
|
2018-05-02 14:52:52 +02:00
|
|
|
this.setState({
|
|
|
|
before: newProps.before,
|
|
|
|
after: newProps.after,
|
2018-05-04 11:05:55 +02:00
|
|
|
value: '-',
|
2018-05-02 14:52:52 +02:00
|
|
|
});
|
|
|
|
this.fetchData();
|
2018-05-01 19:45:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@bind
|
|
|
|
fetchData() {
|
2016-12-10 18:19:44 +01:00
|
|
|
this.setState({ loading: true })
|
2018-05-04 11:05:55 +02:00
|
|
|
let before = this.state.before;
|
|
|
|
let after = this.state.after;
|
2016-11-26 17:40:37 +01:00
|
|
|
|
2018-05-07 16:05:53 +02:00
|
|
|
Client.request(`${this.props.endpoint}?before=${before}&after=${after}`)
|
2018-05-01 16:06:17 +02:00
|
|
|
.then((d) => {
|
2018-05-04 11:05:55 +02:00
|
|
|
// request finished; check if timestamp range is still the one user wants to see
|
|
|
|
if( this.state.before != before || this.state.after != after ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-05-04 15:43:05 +02:00
|
|
|
switch(this.props.format) {
|
|
|
|
case "percentage":
|
|
|
|
d = d + "%";
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
case "number":
|
|
|
|
d = numbers.formatWithComma(d)
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "duration":
|
|
|
|
d = numbers.formatDuration(d)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2018-05-01 16:06:17 +02:00
|
|
|
this.setState({
|
|
|
|
loading: false,
|
2018-05-04 15:43:05 +02:00
|
|
|
value: d,
|
2018-05-01 16:06:17 +02:00
|
|
|
})
|
|
|
|
})
|
2016-11-26 17:40:37 +01:00
|
|
|
}
|
2016-11-26 15:39:29 +01:00
|
|
|
|
2018-05-01 16:06:17 +02:00
|
|
|
render(props, state) {
|
2016-11-26 17:40:37 +01:00
|
|
|
return (
|
2018-05-04 11:05:55 +02:00
|
|
|
<div class={"totals-detail " + ( state.loading ? "loading" : '')}>
|
2018-05-01 16:06:17 +02:00
|
|
|
<div class="total-heading">{props.title}</div>
|
|
|
|
<div class="total-numbers">{state.value}</div>
|
2016-11-26 15:39:29 +01:00
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default CountWidget
|