react-infinite-calendar
Version:
Infinite scrolling date-picker built with React, with localization, themes, keyboard support, and more.
258 lines (191 loc) • 7.54 kB
JavaScript
exports.__esModule = true;
exports.animate = exports.withImmutableProps = exports.scrollbarSize = exports.ScrollSpeed = exports.keyCodes = undefined;
var _withPropsOnChange2 = require('recompose/withPropsOnChange');
var _withPropsOnChange3 = _interopRequireDefault(_withPropsOnChange2);
exports.getMonth = getMonth;
exports.getWeek = getWeek;
exports.getWeeksInMonth = getWeeksInMonth;
exports.emptyFn = emptyFn;
exports.sanitizeDate = sanitizeDate;
exports.getDateString = getDateString;
exports.getMonthsForYear = getMonthsForYear;
exports.debounce = debounce;
exports.range = range;
var _animate = require('./animate');
Object.defineProperty(exports, 'animate', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_animate).default;
}
});
var _scrollbarSize = require('dom-helpers/util/scrollbarSize');
var _scrollbarSize2 = _interopRequireDefault(_scrollbarSize);
var _get_days_in_month = require('date-fns/get_days_in_month');
var _get_days_in_month2 = _interopRequireDefault(_get_days_in_month);
var _get_day = require('date-fns/get_day');
var _get_day2 = _interopRequireDefault(_get_day);
var _is_after = require('date-fns/is_after');
var _is_after2 = _interopRequireDefault(_is_after);
var _is_before = require('date-fns/is_before');
var _is_before2 = _interopRequireDefault(_is_before);
var _is_same_day = require('date-fns/is_same_day');
var _is_same_day2 = _interopRequireDefault(_is_same_day);
var _end_of_day = require('date-fns/end_of_day');
var _end_of_day2 = _interopRequireDefault(_end_of_day);
var _start_of_day = require('date-fns/start_of_day');
var _start_of_day2 = _interopRequireDefault(_start_of_day);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var keyCodes = exports.keyCodes = {
command: 91,
control: 17,
down: 40,
enter: 13,
escape: 27,
left: 37,
right: 39,
shift: 16,
up: 38
};
/**
* Given a year and a month, returns the rows for that month to be iterated over
* @param {Number} year - the year number
* @param {Number} month - the index of the month
* @param {Number} weekStartsOn - the index of the first day of the week (from 0 to 6)
* @return {Object} - Returns the first day of the month and the rows of that month
*/
function getMonth(year, month, weekStartsOn) {
var rows = [];
var monthDate = new Date(year, month, 1);
var daysInMonth = (0, _get_days_in_month2.default)(monthDate);
var weekEndsOn = getEndOfWeekIndex(weekStartsOn);
var dow = (0, _get_day2.default)(new Date(year, month, 1));
var week = 0;
for (var day = 1; day <= daysInMonth; day++) {
if (!rows[week]) {
rows[week] = [];
}
rows[week].push(day);
if (dow === weekEndsOn) {
week++;
}
dow = dow < 6 ? dow + 1 : 0;
}
return {
date: monthDate,
rows: rows
};
}
function getWeek(yearStart, date, weekStartsOn) {
var yearStartDate = typeof yearStart === 'number' ? new Date(yearStart, 0, 1) // 1st Jan of the Year
: yearStart;
return Math.ceil((Math.round((date - yearStartDate) / (60 * 60 * 24 * 1000)) + yearStartDate.getDay() + 1 - weekStartsOn) / 7);
}
/**
* Get the number of weeks in a given month to be able to calculate the height of that month
* @param {Number} year - the year number
* @param {Number} month - the index of the month
* @param {Number} weekStartsOn - the index of the first day of the week (from 0 to 6)
* @return {Number} - Returns the number of weeks for the given month
*/
function getWeeksInMonth(month) {
var year = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date().getFullYear();
var weekStartsOn = arguments[2];
var isLastDisplayedMonth = arguments[3];
var weekEndsOn = getEndOfWeekIndex(weekStartsOn);
var firstOfMonth = new Date(year, month, 1);
var firstWeekNumber = getWeek(year, firstOfMonth, weekStartsOn);
var lastOfMonth = new Date(year, month + 1, 0); // Last date of the Month
var lastWeekNumber = getWeek(year, lastOfMonth, weekStartsOn);
var rowCount = lastWeekNumber - firstWeekNumber;
// If the last week contains 7 days, we need to add an extra row
if (lastOfMonth.getDay() === weekEndsOn || isLastDisplayedMonth) {
rowCount++;
}
return rowCount;
}
/**
* Helper to find out what day the week ends on given the localized start of the week
* @param {Number} weekStartsOn - the index of the first day of the week (from 0 to 6)
* @return {Number} - Returns the index of the day the week ends on
*/
function getEndOfWeekIndex(weekStartsOn) {
var weekEndsOn = weekStartsOn === 0 ? 6 : weekStartsOn - 1;
return weekEndsOn;
}
var ScrollSpeed = exports.ScrollSpeed = function () {
function ScrollSpeed() {
var _this = this;
_classCallCheck(this, ScrollSpeed);
this.clear = function () {
_this.lastPosition = null;
_this.delta = 0;
};
}
ScrollSpeed.prototype.getScrollSpeed = function getScrollSpeed(scrollOffset) {
if (this.lastPosition != null) {
this.delta = scrollOffset - this.lastPosition;
}
this.lastPosition = scrollOffset;
clearTimeout(this._timeout);
this._timeout = setTimeout(this.clear, 50);
return this.delta;
};
return ScrollSpeed;
}();
var scrollbarSize = exports.scrollbarSize = (0, _scrollbarSize2.default)();
function emptyFn() {
/* no-op */
}
function sanitizeDate(date, _ref) {
var _ref$disabledDates = _ref.disabledDates,
disabledDates = _ref$disabledDates === undefined ? [] : _ref$disabledDates,
_ref$disabledDays = _ref.disabledDays,
disabledDays = _ref$disabledDays === undefined ? [] : _ref$disabledDays,
minDate = _ref.minDate,
maxDate = _ref.maxDate;
// Selected date should not be disabled or outside the selectable range
if (!date || disabledDates.some(function (disabledDate) {
return (0, _is_same_day2.default)(disabledDate, date);
}) || disabledDays && disabledDays.indexOf((0, _get_day2.default)(date)) !== -1 || minDate && (0, _is_before2.default)(date, (0, _start_of_day2.default)(minDate)) || maxDate && (0, _is_after2.default)(date, (0, _end_of_day2.default)(maxDate))) {
return null;
}
return date;
}
function getDateString(year, month, date) {
return year + '-' + ('0' + (month + 1)).slice(-2) + '-' + ('0' + date).slice(-2);
}
function getMonthsForYear(year) {
var day = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
return Array.apply(null, Array(12)).map(function (val, index) {
return new Date(year, index, day);
});
}
var withImmutableProps = exports.withImmutableProps = function withImmutableProps(props) {
return (0, _withPropsOnChange3.default)(function () {
return false;
}, props);
};
function debounce(callback, wait) {
var _this2 = this;
var timeout = null;
var callbackArgs = null;
var later = function later() {
return callback.apply(_this2, callbackArgs);
};
return function () {
callbackArgs = arguments;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
function range(start, stop) {
var step = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
var length = Math.max(Math.ceil((stop - start) / step), 0);
var range = Array(length);
for (var i = 0; i < length; i++, start += step) {
range[i] = start;
}
return range;
};
;