react-infinite-calendar
Version:
Infinite scrolling date-picker built with React, with localization, themes, keyboard support, and more.
128 lines (97 loc) • 4.24 kB
JavaScript
;
exports.__esModule = true;
exports.withMultipleDates = exports.enhanceDay = undefined;
var _withState2 = require('recompose/withState');
var _withState3 = _interopRequireDefault(_withState2);
var _withPropsOnChange2 = require('recompose/withPropsOnChange');
var _withPropsOnChange3 = _interopRequireDefault(_withPropsOnChange2);
var _withProps2 = require('recompose/withProps');
var _withProps3 = _interopRequireDefault(_withProps2);
var _compose2 = require('recompose/compose');
var _compose3 = _interopRequireDefault(_compose2);
exports.defaultMultipleDateInterpolation = defaultMultipleDateInterpolation;
var _ = require('./');
var _utils = require('../utils');
var _withMultipleDates = require('../Header/withMultipleDates');
var _withMultipleDates2 = _interopRequireDefault(_withMultipleDates);
var _format = require('date-fns/format');
var _format2 = _interopRequireDefault(_format);
var _parse = require('date-fns/parse');
var _parse2 = _interopRequireDefault(_parse);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
// Enhance Day component to display selected state based on an array of selected dates
var enhanceDay = exports.enhanceDay = (0, _withPropsOnChange3.default)(['selected'], function (props) {
return {
isSelected: props.selected.indexOf(props.date) !== -1
};
});
// Enhance year component
var enhanceYears = (0, _withProps3.default)(function (_ref) {
var displayDate = _ref.displayDate;
return {
selected: displayDate ? (0, _parse2.default)(displayDate) : null
};
});
// Enhancer to handle selecting and displaying multiple dates
var withMultipleDates = (0, _compose3.default)(_.withDefaultProps, (0, _withState3.default)('scrollDate', 'setScrollDate', getInitialDate), (0, _withState3.default)('displayDate', 'setDisplayDate', getInitialDate), (0, _utils.withImmutableProps)(function (_ref2) {
var DayComponent = _ref2.DayComponent,
HeaderComponent = _ref2.HeaderComponent,
YearsComponent = _ref2.YearsComponent;
return {
DayComponent: enhanceDay(DayComponent),
HeaderComponent: (0, _withMultipleDates2.default)(HeaderComponent),
YearsComponent: enhanceYears(YearsComponent)
};
}), (0, _withProps3.default)(function (_ref3) {
var displayDate = _ref3.displayDate,
onSelect = _ref3.onSelect,
setDisplayDate = _ref3.setDisplayDate,
scrollToDate = _ref3.scrollToDate,
props = _objectWithoutProperties(_ref3, ['displayDate', 'onSelect', 'setDisplayDate', 'scrollToDate']);
return {
passThrough: {
Day: {
onClick: function onClick(date) {
return handleSelect(date, { onSelect: onSelect, setDisplayDate: setDisplayDate });
}
},
Header: {
setDisplayDate: setDisplayDate
},
Years: {
displayDate: displayDate,
onSelect: function onSelect(year, e, callback) {
return handleYearSelect(year, callback);
},
selected: displayDate
}
},
selected: props.selected.filter(function (date) {
return (0, _utils.sanitizeDate)(date, props);
}).map(function (date) {
return (0, _format2.default)(date, 'YYYY-MM-DD');
})
};
}));
exports.withMultipleDates = withMultipleDates;
function handleSelect(date, _ref4) {
var onSelect = _ref4.onSelect,
setDisplayDate = _ref4.setDisplayDate;
onSelect(date);
setDisplayDate(date);
}
function handleYearSelect(date, callback) {
callback((0, _parse2.default)(date));
}
function getInitialDate(_ref5) {
var selected = _ref5.selected;
return selected.length ? selected[0] : new Date();
}
function defaultMultipleDateInterpolation(date, selected) {
var selectedMap = selected.map(function (date) {
return (0, _format2.default)(date, 'YYYY-MM-DD');
});
var index = selectedMap.indexOf((0, _format2.default)(date, 'YYYY-MM-DD'));
return index === -1 ? [].concat(selected, [date]) : [].concat(selected.slice(0, index), selected.slice(index + 1));
}