1
0
mirror of https://github.com/beestat/app.git synced 2026-02-25 20:50:25 -05:00

Better date range clamping

This commit is contained in:
Jon Ziebell 2026-02-25 05:35:04 -05:00
parent 898e4e1c8d
commit eebe2e07e9
5 changed files with 116 additions and 30 deletions

64
js/beestat/date_range.js Normal file
View File

@ -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;
};

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -54,9 +54,10 @@ if($setting->get('environment') === 'dev' || $setting->get('environment') === 'd
echo '<script src="/js/beestat/crypto.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/floor_plan.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/address.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/affiliate.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/date.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/math.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/affiliate.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/date.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/date_range.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/math.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/platform.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/text_dimensions.js"></script>' . PHP_EOL;