diff --git a/js/beestat/date_range.js b/js/beestat/date_range.js new file mode 100644 index 0000000..1c35109 --- /dev/null +++ b/js/beestat/date_range.js @@ -0,0 +1,64 @@ +/** + * Date range helpers. + */ +beestat.date_range = {}; + +/** + * Clamp a detail range object for dynamic/static detail charts. + * + * @param {object} range + * @param {object} options + * + * @return {object} + */ +beestat.date_range.clamp = function(range, options) { + var max_dynamic_days = options.max_dynamic_days; + var max_static_days = options.max_static_days; + var now_m = options.now ? moment(options.now) : moment(); + + var clamped = { + 'type': range.type === 'static' ? 'static' : 'dynamic', + 'dynamic': parseInt(range.dynamic, 10), + 'static_begin': range.static_begin, + 'static_end': range.static_end + }; + + if (isNaN(clamped.dynamic) === true || clamped.dynamic < 1) { + clamped.dynamic = 1; + } else if (clamped.dynamic > max_dynamic_days) { + clamped.dynamic = max_dynamic_days; + } + + var static_end_m = moment(clamped.static_end); + if (static_end_m.isValid() === false) { + static_end_m = now_m.clone(); + } + + var static_begin_m = moment(clamped.static_begin); + if (static_begin_m.isValid() === false) { + static_begin_m = static_end_m.clone().subtract(max_static_days - 1, 'day'); + } + + if (static_begin_m.isAfter(static_end_m) === true) { + var temp = static_begin_m.clone(); + static_begin_m = static_end_m.clone(); + static_end_m = temp; + } + + var diff = Math.abs(static_end_m.diff(static_begin_m, 'day')) + 1; + if (diff > max_static_days) { + static_end_m = static_begin_m.clone().add(max_static_days - 1, 'day'); + } + + clamped.static_begin = static_begin_m.format('M/D/YYYY'); + clamped.static_end = static_end_m.format('M/D/YYYY'); + + clamped.changed = ( + clamped.type !== range.type || + clamped.dynamic !== range.dynamic || + clamped.static_begin !== range.static_begin || + clamped.static_end !== range.static_end + ); + + return clamped; +}; diff --git a/js/component/modal/air_quality_detail_custom.js b/js/component/modal/air_quality_detail_custom.js index 61e190d..b07ec5b 100644 --- a/js/component/modal/air_quality_detail_custom.js +++ b/js/component/modal/air_quality_detail_custom.js @@ -322,16 +322,23 @@ beestat.component.modal.air_quality_detail_custom.prototype.get_buttons_ = funct .set_text_color('#fff') .set_text('Save') .addEventListener('click', function() { - // Bit of a rig to fix the odd situation where somehow people are - // getting these values set to more than 30 days. - var air_quality_detail_range_static_begin_m = moment(self.state_.air_quality_detail_range_static_begin); - var air_quality_detail_range_static_end_m = moment(self.state_.air_quality_detail_range_static_end); + var range = beestat.date_range.clamp( + { + 'type': self.state_.air_quality_detail_range_type, + 'dynamic': self.state_.air_quality_detail_range_dynamic, + 'static_begin': self.state_.air_quality_detail_range_static_begin, + 'static_end': self.state_.air_quality_detail_range_static_end + }, + { + 'max_dynamic_days': 7, + 'max_static_days': 7 + } + ); - var diff = Math.abs(air_quality_detail_range_static_begin_m.diff(air_quality_detail_range_static_end_m, 'day')) + 1; - if (diff > 30) { - air_quality_detail_range_static_end_m = air_quality_detail_range_static_begin_m.clone().add(29, 'days'); - self.state_.air_quality_detail_range_static_end = air_quality_detail_range_static_end_m.format('M/D/YYYY'); - } + self.state_.air_quality_detail_range_type = range.type; + self.state_.air_quality_detail_range_dynamic = range.dynamic; + self.state_.air_quality_detail_range_static_begin = range.static_begin; + self.state_.air_quality_detail_range_static_end = range.static_end; this .set_background_color(beestat.style.color.gray.base) diff --git a/js/component/modal/runtime_sensor_detail_custom.js b/js/component/modal/runtime_sensor_detail_custom.js index e5fa65c..b7b1472 100644 --- a/js/component/modal/runtime_sensor_detail_custom.js +++ b/js/component/modal/runtime_sensor_detail_custom.js @@ -322,16 +322,23 @@ beestat.component.modal.runtime_sensor_detail_custom.prototype.get_buttons_ = fu .set_text_color('#fff') .set_text('Save') .addEventListener('click', function() { - // Bit of a rig to fix the odd situation where somehow people are - // getting these values set to more than 30 days. - var runtime_sensor_detail_range_static_begin_m = moment(self.state_.runtime_sensor_detail_range_static_begin); - var runtime_sensor_detail_range_static_end_m = moment(self.state_.runtime_sensor_detail_range_static_end); + var range = beestat.date_range.clamp( + { + 'type': self.state_.runtime_sensor_detail_range_type, + 'dynamic': self.state_.runtime_sensor_detail_range_dynamic, + 'static_begin': self.state_.runtime_sensor_detail_range_static_begin, + 'static_end': self.state_.runtime_sensor_detail_range_static_end + }, + { + 'max_dynamic_days': 7, + 'max_static_days': 7 + } + ); - var diff = Math.abs(runtime_sensor_detail_range_static_begin_m.diff(runtime_sensor_detail_range_static_end_m, 'day')) + 1; - if (diff > 30) { - runtime_sensor_detail_range_static_end_m = runtime_sensor_detail_range_static_begin_m.clone().add(29, 'days'); - self.state_.runtime_sensor_detail_range_static_end = runtime_sensor_detail_range_static_end_m.format('M/D/YYYY'); - } + self.state_.runtime_sensor_detail_range_type = range.type; + self.state_.runtime_sensor_detail_range_dynamic = range.dynamic; + self.state_.runtime_sensor_detail_range_static_begin = range.static_begin; + self.state_.runtime_sensor_detail_range_static_end = range.static_end; this .set_background_color(beestat.style.color.gray.base) diff --git a/js/component/modal/runtime_thermostat_detail_custom.js b/js/component/modal/runtime_thermostat_detail_custom.js index f330956..7253d1a 100644 --- a/js/component/modal/runtime_thermostat_detail_custom.js +++ b/js/component/modal/runtime_thermostat_detail_custom.js @@ -322,16 +322,23 @@ beestat.component.modal.runtime_thermostat_detail_custom.prototype.get_buttons_ .set_text_color('#fff') .set_text('Save') .addEventListener('click', function() { - // Bit of a rig to fix the odd situation where somehow people are - // getting these values set to more than 30 days. - var runtime_thermostat_detail_range_static_begin_m = moment(self.state_.runtime_thermostat_detail_range_static_begin); - var runtime_thermostat_detail_range_static_end_m = moment(self.state_.runtime_thermostat_detail_range_static_end); + var range = beestat.date_range.clamp( + { + 'type': self.state_.runtime_thermostat_detail_range_type, + 'dynamic': self.state_.runtime_thermostat_detail_range_dynamic, + 'static_begin': self.state_.runtime_thermostat_detail_range_static_begin, + 'static_end': self.state_.runtime_thermostat_detail_range_static_end + }, + { + 'max_dynamic_days': 30, + 'max_static_days': 30 + } + ); - var diff = Math.abs(runtime_thermostat_detail_range_static_begin_m.diff(runtime_thermostat_detail_range_static_end_m, 'day')) + 1; - if (diff > 30) { - runtime_thermostat_detail_range_static_end_m = runtime_thermostat_detail_range_static_begin_m.clone().add(29, 'days'); - self.state_.runtime_thermostat_detail_range_static_end = runtime_thermostat_detail_range_static_end_m.format('M/D/YYYY'); - } + self.state_.runtime_thermostat_detail_range_type = range.type; + self.state_.runtime_thermostat_detail_range_dynamic = range.dynamic; + self.state_.runtime_thermostat_detail_range_static_begin = range.static_begin; + self.state_.runtime_thermostat_detail_range_static_end = range.static_end; this .set_background_color(beestat.style.color.gray.base) diff --git a/js/js.php b/js/js.php index 449b366..153e028 100755 --- a/js/js.php +++ b/js/js.php @@ -54,9 +54,10 @@ if($setting->get('environment') === 'dev' || $setting->get('environment') === 'd echo '' . PHP_EOL; echo '' . PHP_EOL; echo '' . PHP_EOL; - echo '' . PHP_EOL; - echo '' . PHP_EOL; - echo '' . PHP_EOL; + echo '' . PHP_EOL; + echo '' . PHP_EOL; + echo '' . PHP_EOL; + echo '' . PHP_EOL; echo '' . PHP_EOL; echo '' . PHP_EOL;