1
0
mirror of https://github.com/beestat/app.git synced 2025-07-09 03:04:07 -04:00

Fixed #18 - Aggregate runtime - grouping by week causes odd spacing for months.

I did a terrible job of group by week; fixing it.
This commit is contained in:
Jon Ziebell 2019-06-20 21:37:19 -04:00
parent b02374a71b
commit 19ea51f121
2 changed files with 50 additions and 10 deletions

View File

@ -328,15 +328,26 @@ class ecobee_runtime_thermostat extends cora\crud {
$select = [];
$group_by_order_by = [];
switch($group_by) {
case 'week':
/**
* Week is a special case. If grouping by week, month, year, you can
* get one week listed twice if it spans across months. So the month
* group by is undesirable in this case.
*
* The second argument of 3 to the yearweek() function will cause
* MySQL to return the ISO 8601 week of the year.
*
* https://stackoverflow.com/a/11804076
*/
$select[] = 'yearweek(`timestamp`, 3) `yearweek`';
$group_by_order_by[] = 'yearweek(`timestamp`, 3)';
break;
case 'hour':
$select[] = 'hour(`timestamp`) `hour`';
$group_by_order_by[] = 'hour(`timestamp`)';
case 'day':
$select[] = 'day(`timestamp`) `day`';
$group_by_order_by[] = 'day(`timestamp`)';
case 'week':
$select[] = 'week(`timestamp`) `week`';
$group_by_order_by[] = 'week(`timestamp`)';
case 'month':
$select[] = 'month(`timestamp`) `month`';
$group_by_order_by[] = 'month(`timestamp`)';
@ -397,6 +408,12 @@ class ecobee_runtime_thermostat extends cora\crud {
}
}
if(isset($row['yearweek']) === true) {
$row['year'] = (int) substr($row['yearweek'], 0, 4);
$row['week'] = (int) substr($row['yearweek'], 4);
unset($row['yearweek']);
}
$return[] = $row;
}

View File

@ -70,9 +70,20 @@ beestat.component.card.aggregate_runtime.prototype.decorate_contents_ = function
var date_parts = this.value.match(/(?:h(\d+))?(?:d(\d+))?(?:w(\d+))?(?:m(\d+))?(?:y(\d+))?/);
var hour = moment(date_parts[1], 'H').format('ha');
var day = date_parts[2];
var week = date_parts[3];
var month = moment(date_parts[4], 'M').format('MMM');
var year = date_parts[5];
var year;
var week;
if (beestat.setting('aggregate_runtime_group_by') === 'week') {
// ISO 8601 week of the year.
var yearweek_m = moment().isoWeek(date_parts[3])
.year(date_parts[5])
.day('Monday');
week = yearweek_m.format('MMM D');
year = yearweek_m.format('YYYY');
} else {
year = date_parts[5];
}
var label_parts = [];
switch (beestat.setting('aggregate_runtime_group_by')) {
@ -86,8 +97,8 @@ beestat.component.card.aggregate_runtime.prototype.decorate_contents_ = function
}
break;
case 'week':
if (month !== current_month) {
label_parts.push(month);
if (week !== current_week) {
label_parts.push(week);
}
if (year !== current_year) {
label_parts.push(year);
@ -211,9 +222,20 @@ beestat.component.card.aggregate_runtime.prototype.decorate_contents_ = function
var date_parts = this.x.match(/(?:h(\d+))?(?:d(\d+))?(?:w(\d+))?(?:m(\d+))?(?:y(\d+))?/);
var hour = moment(date_parts[1], 'H').format('ha');
var day = date_parts[2];
var week = date_parts[3];
var month = moment(date_parts[4], 'M').format('MMM');
var year = date_parts[5];
var year;
var week;
if (beestat.setting('aggregate_runtime_group_by') === 'week') {
// ISO 8601 week of the year.
var yearweek_m = moment().isoWeek(date_parts[3])
.year(date_parts[5])
.day('Monday');
week = yearweek_m.format('MMM D');
year = yearweek_m.format('YYYY');
} else {
year = date_parts[5];
}
var label_parts = [];
switch (beestat.setting('aggregate_runtime_group_by')) {
@ -225,7 +247,8 @@ beestat.component.card.aggregate_runtime.prototype.decorate_contents_ = function
label_parts.push(year);
break;
case 'week':
label_parts.push(month);
label_parts.push('Week of');
label_parts.push(week + ',');
label_parts.push(year);
break;
case 'day':