in src/UXClient/Utils/Utils.ts [881:949]
static cullValuesOutOfRange (availabilityDistribution: any, minDateString: string, maxDateString: string) {
const dateZero = '0000-01-01T00:00:00Z';
let minDateValue = new Date(minDateString).valueOf();
let maxDateValue = new Date(maxDateString).valueOf();
if (new Date(availabilityDistribution.range.from).valueOf() < minDateValue ||
new Date(availabilityDistribution.range.to).valueOf() > maxDateValue) {
let inRangeValues = {};
let outOfRangeValues = {};
let highestNotOverMaxString = dateZero;
let highestNotOverMaxValue = (new Date(highestNotOverMaxString)).valueOf();
let lowestAboveMinValue = Infinity;
Object.keys(availabilityDistribution.distribution).forEach((bucketKey: string) => {
let bucketValue = (new Date(bucketKey)).valueOf();
if (bucketValue > maxDateValue || bucketValue < minDateValue) {
outOfRangeValues[bucketKey] = availabilityDistribution.distribution[bucketKey];
} else {
inRangeValues[bucketKey] = availabilityDistribution.distribution[bucketKey];
if (bucketValue > highestNotOverMaxValue) {
highestNotOverMaxValue = bucketValue;
highestNotOverMaxString = bucketKey;
}
if (bucketValue < lowestAboveMinValue) {
lowestAboveMinValue = bucketValue
}
}
});
const bucketSize = this.parseTimeInput(availabilityDistribution.intervalSize);
if (highestNotOverMaxString !== dateZero) { // a value exists
let nowMillis = new Date().valueOf();
if(highestNotOverMaxValue < nowMillis && (highestNotOverMaxValue + bucketSize) > nowMillis){
// the new end value was before now, but after adding bucket size, its after now
// so we set it to now to avoid setting it to a date in the future
availabilityDistribution.range.to = new Date(nowMillis).toISOString();
}
else{
availabilityDistribution.range.to = new Date(highestNotOverMaxValue + bucketSize).toISOString();
}
} else {
let rangeToValue: number = (new Date(availabilityDistribution.range.to)).valueOf();
if (minDateValue > rangeToValue) { // entire window is to the right of distribution range
availabilityDistribution.range.to = maxDateString;
} else {
let toValue = Math.min(maxDateValue + bucketSize, (new Date(availabilityDistribution.range.to)).valueOf()); //clamped to maxDateString passed in
availabilityDistribution.range.to = (new Date(toValue)).toISOString();
}
}
if (lowestAboveMinValue !== Infinity) { // a value exists
availabilityDistribution.range.from = (new Date(lowestAboveMinValue)).toISOString();
} else {
let rangeFromValue: number = (new Date(availabilityDistribution.range.from)).valueOf();
if (maxDateValue < (new Date(availabilityDistribution.range.from)).valueOf()) { // entire window is to the left of distribution range
availabilityDistribution.range.from = minDateString;
} else {
let fromValue = Math.max(minDateValue, rangeFromValue); // clamped to minDateString passed in
availabilityDistribution.range.from = (new Date(fromValue)).toISOString();
}
}
availabilityDistribution.distribution = inRangeValues;
return[availabilityDistribution, outOfRangeValues];
}
return [availabilityDistribution, {}];
}