axiom-react-calendar
Version:
A component for picking dates or date periods for your React application.
109 lines (92 loc) • 3.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getTileClasses = exports.between = exports.doRangesOverlap = exports.isRangeWithinRange = exports.isValueWithinRange = exports.callIfDefined = exports.mergeFunctions = undefined;
var _dates = require('./dates');
/**
* Returns a function that, when called, calls all the functions
* passed to it, applying its arguments to them.
*
* @param {Function[]} functions
*/
var mergeFunctions = exports.mergeFunctions = function mergeFunctions() {
for (var _len = arguments.length, functions = Array(_len), _key = 0; _key < _len; _key++) {
functions[_key] = arguments[_key];
}
return function () {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
return functions.filter(Boolean).forEach(function (f) {
return f.apply(undefined, args);
});
};
};
/**
* Calls a function, if it's defined, with specified arguments
* @param {Function} fn
* @param {Object} args
*/
var callIfDefined = exports.callIfDefined = function callIfDefined(fn) {
for (var _len3 = arguments.length, args = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
args[_key3 - 1] = arguments[_key3];
}
if (fn && typeof fn === 'function') {
fn.apply(undefined, args);
}
};
var isValueWithinRange = exports.isValueWithinRange = function isValueWithinRange(value, range) {
return range[0] <= value && range[1] >= value;
};
var isRangeWithinRange = exports.isRangeWithinRange = function isRangeWithinRange(greaterRange, smallerRange) {
return greaterRange[0] <= smallerRange[0] && greaterRange[1] >= smallerRange[1];
};
var doRangesOverlap = exports.doRangesOverlap = function doRangesOverlap(range1, range2) {
return isValueWithinRange(range1[0], range2) || isValueWithinRange(range1[1], range2);
};
/**
* Returns a value no smaller than min and no larger than max.
*
* @param {*} value Value to return.
* @param {*} min Minimum return value.
* @param {*} max Maximum return value.
*/
var between = exports.between = function between(value, min, max) {
if (min && min > value) {
return min;
}
if (max && max < value) {
return max;
}
return value;
};
var getTileClasses = exports.getTileClasses = function getTileClasses() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
value = _ref.value,
valueType = _ref.valueType,
date = _ref.date,
dateType = _ref.dateType,
hover = _ref.hover;
var classes = ['react-calendar__tile'];
if (!value) {
return classes;
}
if (!date || !(value instanceof Array) && !valueType || !(date instanceof Array) && !dateType) {
throw new Error('getTileClasses(): Unable to get tile activity classes because one or more required arguments were not passed.');
}
var valueRange = value instanceof Array ? value : (0, _dates.getRange)(valueType, value);
var dateRange = date instanceof Array ? date : (0, _dates.getRange)(dateType, date);
if (isRangeWithinRange(valueRange, dateRange)) {
classes.push('react-calendar__tile--active');
} else if (doRangesOverlap(valueRange, dateRange)) {
classes.push('react-calendar__tile--hasActive');
} else if (hover && (
// Date before value
dateRange[1] < valueRange[0] && isRangeWithinRange([hover, valueRange[0]], dateRange) ||
// Date after value
dateRange[0] > valueRange[1] && isRangeWithinRange([valueRange[1], hover], dateRange))) {
classes.push('react-calendar__tile--hover');
}
return classes;
};