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;