UNPKG

repick-core

Version:

574 lines (523 loc) 17.6 kB
import compareAsc from 'date-fns/compareAsc'; import format from 'date-fns/format'; import isValid from 'date-fns/isValid'; import startOfToday from 'date-fns/startOfToday'; import parseDate from 'date-fns/parse'; import isSameDay from 'date-fns/isSameDay'; import addDays from 'date-fns/addDays'; import addMonths from 'date-fns/addMonths'; import getDate from 'date-fns/getDate'; import getWeek from 'date-fns/getWeek'; import isSameMonth from 'date-fns/isSameMonth'; import startOfMonth from 'date-fns/startOfMonth'; import startOfWeek from 'date-fns/startOfWeek'; import subMonths from 'date-fns/subMonths'; import isAfter from 'date-fns/isAfter'; import isBefore from 'date-fns/isBefore'; import setDay from 'date-fns/setDay'; import addYears from 'date-fns/addYears'; import subDays from 'date-fns/subDays'; import subYears from 'date-fns/subYears'; import isWithinInterval from 'date-fns/isWithinInterval'; var actionBlur = 'Blur'; var actionCloseCalendar = 'CloseCalendar'; var actionDateClick = 'DateClick'; var actionEndOfWeek = 'EndOfWeek'; var actionInputBlur = 'InputBlur'; var actionInputChange = 'InputChange'; var actionInputFocus = 'InputFocus'; var actionInputKeyArrowDown = 'InputKeyArrowDown'; var actionInputKeyEnter = 'InputKeyEnter'; var actionKeyArrowDown = 'KeyArrowDown'; var actionKeyArrowLeft = 'KeyArrowLeft'; var actionKeyArrowRight = 'KeyArrowRight'; var actionKeyArrowUp = 'KeyArrowUp'; var actionKeyEnd = 'KeyEnd'; var actionKeyEnter = 'KeyEnter'; var actionKeyEscape = 'KeyEscape'; var actionKeyHome = 'KeyHome'; var actionKeyPageDown = 'KeyPageDown'; var actionKeyPageUp = 'KeyPageUp'; var actionKeyShiftPageDown = 'KeyShiftPageDown'; var actionKeyShiftPageUp = 'KeyShiftPageUp'; var actionNextDay = 'NextDay'; var actionNextMonth = 'NextMonth'; var actionNextWeek = 'NextWeek'; var actionNextYear = 'NextYear'; var actionOpenCalendar = 'OpenCalendar'; var actionPrevDay = 'PrevDay'; var actionPrevMonth = 'PrevMonth'; var actionPrevWeek = 'PrevWeek'; var actionPrevYear = 'PrevYear'; var actionSelectDate = 'SelectDate'; var actionSelectHighlighted = 'SelectHighlighted'; var actionStartOfWeek = 'StartOfWeek'; function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var defaultOptions = { allowInput: false, format: 'yyyy-MM-dd', monthCount: 1, weekStartsOn: 0 }; var arrayGenerate = function arrayGenerate(arrayLength, fn) { return Array.apply(null, Array(arrayLength)).map(function (_, i) { return fn(i); }); }; var wrap = function wrap(min, max) { return function (x) { var d = max - min; return ((x - min) % d + d) % d + min; }; }; var wrapWeekDay = /*#__PURE__*/wrap(0, 7); function keyToAction(key) { switch (key) { case 'ArrowLeft': { return { type: actionKeyArrowLeft }; } case 'ArrowRight': { return { type: actionKeyArrowRight }; } case 'ArrowUp': { return { type: actionKeyArrowUp }; } case 'ArrowDown': { return { type: actionKeyArrowDown }; } case 'PageDown': { return { type: actionKeyPageDown }; } case 'PageUp': { return { type: actionKeyPageUp }; } case 'Home': { return { type: actionKeyHome }; } case 'End': { return { type: actionKeyEnd }; } case 'Enter': { return { type: actionKeyEnter }; } } return null; } function buildWeekdays(options) { if (options === void 0) { options = {}; } var date = new Date(); return Array.apply(null, Array(7)).map(function (_, i) { var day = setDay(date, wrapWeekDay(i + (options.weekStartsOn || 0))); return { "long": format(day, 'iiii', { locale: options.locale }), "short": format(day, 'iii', { locale: options.locale }) }; }); } function sort(compareFn, array) { var result = [].concat(array); result.sort(compareFn); return result; } function arrayIncludes(compareFn, array, value) { return array.findIndex(function (x) { return compareFn(x, value); }) !== -1; } function toggleValue(compareFn, orig, value) { var index = orig.findIndex(function (x) { return compareFn(x, value); }); var result = [].concat(orig); if (index >= 0) { result.splice(index, 1); } else { result.push(value); } return result; } function compareUndefined(compareFn) { return function (a, b) { return a !== undefined && b !== undefined ? compareFn(a, b) : 0; }; } function assertNever(x) { throw new Error('Unexpected object: ' + x); } var emptyFn = function emptyFn(e) { return function () { return e; }; }; var dateIsSelectable = function dateIsSelectable(_ref, date) { var enabledDates = _ref.enabledDates, disabledDates = _ref.disabledDates, minDate = _ref.minDate, filterDates = _ref.filterDates, maxDate = _ref.maxDate; return !(!!filterDates && typeof filterDates === 'function' && filterDates(date) || !!enabledDates && !arrayIncludes(isSameDay, enabledDates, date) || !!disabledDates && arrayIncludes(isSameDay, disabledDates, date) || !!minDate && isAfter(minDate, date) || !!maxDate && isBefore(maxDate, date)); }; var objectCopyPartial = function objectCopyPartial(keys, obj) { return keys.reduce(function (res, key) { if (obj[key] !== undefined) { res[key] = obj[key]; } return res; }, {}); }; function buildCalendarDay(isSelected, extraFn) { return function (state, currentMonth, date, options) { if (options === void 0) { options = {}; } var prevMonth = subMonths(currentMonth, 1); var nextMonth = addMonths(currentMonth, 1); return _extends({ date: date, day: getDate(date), nextMonth: isSameMonth(nextMonth, date), prevMonth: isSameMonth(prevMonth, date), selected: isSelected(state.selected, date), highlighted: isSameDay(state.highlighted, date), disabled: !dateIsSelectable(options, date), today: isSameDay(new Date(), date) }, extraFn(state, date)); }; } function buildContext(buildCalendarDay) { return function (state, options) { if (options === void 0) { options = {}; } var highlighted = state.highlighted; var months = arrayGenerate(options.monthCount || 1, function (monthIndex) { var firstDayOfMonth = startOfMonth(addMonths(highlighted, monthIndex)); var firstWeekOfMonth = startOfWeek(firstDayOfMonth, { weekStartsOn: options.weekStartsOn }); var weeks = arrayGenerate(6, function (weekIndex) { return { weekNumber: getWeek(addDays(firstWeekOfMonth, weekIndex * 7), { weekStartsOn: options.weekStartsOn }), year: highlighted.getFullYear(), days: arrayGenerate(7, function (dayIndex) { return buildCalendarDay(state, firstDayOfMonth, addDays(firstWeekOfMonth, weekIndex * 7 + dayIndex), options); }) }; }); var days = weeks.reduce(function (x, week) { return [].concat(x, week.days); }, []); return { month: firstDayOfMonth.getMonth() + 1, monthLong: format(firstDayOfMonth, 'MMMM', { locale: options.locale }), monthShort: format(firstDayOfMonth, 'MMM', { locale: options.locale }), year: firstDayOfMonth.getFullYear(), weeks: weeks, days: days }; }); var weeks = months.reduce(function (x, month) { return [].concat(x, month.weeks); }, []); var days = weeks.reduce(function (x, week) { return [].concat(x, week.days); }, []); return { isOpen: state.isOpen, inputValue: state.inputValue, highlighted: highlighted || null, month: highlighted.getMonth() + 1, monthLong: format(highlighted, 'MMMM', { locale: options.locale }), monthShort: format(highlighted, 'MMM', { locale: options.locale }), year: highlighted.getFullYear(), weekdays: buildWeekdays(options), selected: state.selected, months: months, weeks: weeks, days: days }; }; } function createReducer(selectDate, defaultFormatter, defaultParser) { return function reducer(state, action, argOptions) { var options = _extends({}, defaultOptions, argOptions); var formatter = options.formatter || defaultFormatter; var parser = options.parser || defaultParser; function reduceSelected(state, date) { if (!dateIsSelectable(options, date)) { return {}; } var _selectDate = selectDate(state.selected, date), selected = _selectDate[0], shouldClose = _selectDate[1]; return { selected: selected, highlighted: date, isOpen: !shouldClose && state.isOpen, inputValue: formatter(selected, options.format) }; } switch (action.type) { case actionInputFocus: case actionInputKeyArrowDown: case actionOpenCalendar: { return { isOpen: true }; } case actionBlur: case actionInputBlur: case actionKeyEscape: case actionCloseCalendar: { return { isOpen: false }; } case actionInputChange: { var parsedDate = parser(action.value, options.format); var highlighted = parsedDate ? Array.isArray(parsedDate) ? parsedDate[0] : parsedDate : state.highlighted; return { highlighted: highlighted, inputValue: action.value }; } case actionInputKeyEnter: { var _parsedDate = parser(state.inputValue, options.format); var _highlighted = _parsedDate ? Array.isArray(_parsedDate) ? _parsedDate[0] : _parsedDate : state.highlighted; var selected = _parsedDate ? _parsedDate : state.selected; return { highlighted: _highlighted, selected: selected, inputValue: formatter(selected, options.format) }; } case actionDateClick: case actionSelectDate: { var date = action.date instanceof Date ? action.date : new Date(action.date); return reduceSelected(state, date); } case actionKeyEnter: case actionSelectHighlighted: { return reduceSelected(state, state.highlighted); } case actionKeyArrowLeft: case actionPrevDay: { return { highlighted: subDays(state.highlighted, 1) }; } case actionKeyArrowRight: case actionNextDay: { return { highlighted: addDays(state.highlighted, 1) }; } case actionKeyArrowUp: case actionPrevWeek: { return { highlighted: subDays(state.highlighted, 7) }; } case actionKeyArrowDown: case actionNextWeek: { return { highlighted: addDays(state.highlighted, 7) }; } case actionKeyPageDown: case actionPrevMonth: { return { highlighted: subMonths(state.highlighted, 1) }; } case actionKeyPageUp: case actionNextMonth: { return { highlighted: addMonths(state.highlighted, 1) }; } case actionKeyHome: case actionStartOfWeek: { return { highlighted: setDay(state.highlighted, options.weekStartsOn || 0, { locale: options.locale, weekStartsOn: options.weekStartsOn }) }; } case actionKeyEnd: case actionEndOfWeek: { return { highlighted: setDay(state.highlighted, wrapWeekDay(options.weekStartsOn + 6), { locale: options.locale, weekStartsOn: options.weekStartsOn }) }; } case actionKeyShiftPageDown: case actionPrevYear: { return { highlighted: subYears(state.highlighted, 1) }; } case actionKeyShiftPageUp: case actionNextYear: { return { highlighted: addYears(state.highlighted, 1) }; } default: { var _ = action; return _; } } }; } var selectDateMulti = function selectDateMulti(selected, date) { return [selected !== null ? sort(compareAsc, toggleValue(isSameDay, selected, date)) : [date], false]; }; var isSelectedMulti = function isSelectedMulti(selected, date) { return !!selected && selected.findIndex(function (x) { return isSameDay(x, date); }) >= 0; }; var formatMulti = function formatMulti(selected, format$1) { return selected ? selected.map(function (date) { return format(date, format$1); }).join(', ') : ''; }; var parseMulti = function parseMulti(dateString, format) { var baseDate = startOfToday(); var parsedDate = dateString.split(/,/).map(function (x) { return parseDate(x, format, baseDate); }); return parsedDate.every(isValid) ? parsedDate : false; }; var reducerMulti = /*#__PURE__*/createReducer(selectDateMulti, formatMulti, parseMulti); var buildCalendarContextDayMulti = /*#__PURE__*/buildCalendarDay(isSelectedMulti, function () { return {}; }); var buildContextMulti = /*#__PURE__*/buildContext(buildCalendarContextDayMulti); var selectDateRange = function selectDateRange(selected, date) { return selected === null || isSameDay(selected[0], date) || selected.length === 2 ? [[date], false] : [sort(compareAsc, [].concat(selected, [date])), true]; }; var formatRange = function formatRange(selected, format$1) { return selected ? selected[1] !== undefined ? format(selected[0], format$1) + ' - ' + format(selected[1], format$1) : format(selected[0], format$1) : ''; }; var parseRange = function parseRange(dateString, format) { var baseDate = startOfToday(); var parsedDate = dateString.split('-').map(function (x) { return parseDate(x, format, baseDate); }); return parsedDate.length <= 2 && parsedDate.every(isValid) ? parsedDate : false; }; var reducerRange = /*#__PURE__*/createReducer(selectDateRange, formatRange, parseRange); var isSelectedRange = function isSelectedRange(selected, date) { return !!selected && (selected[1] !== undefined ? isWithinInterval(date, { start: selected[0], end: selected[1] }) : isSameDay(date, selected[0])); }; var buildCalendarDayRangeExtra = function buildCalendarDayRangeExtra(state, date) { return { rangeStart: !!state.selected && isSameDay(date, state.selected[0]), rangeEnd: !!state.selected && !!state.selected[1] && isSameDay(date, state.selected[1]) }; }; var buildCalendarDayRange = /*#__PURE__*/buildCalendarDay(isSelectedRange, buildCalendarDayRangeExtra); var buildContextRange = /*#__PURE__*/buildContext(buildCalendarDayRange); var selectDateSingle = function selectDateSingle(selected, date) { return [selected !== null && isSameDay(selected, date) ? null : date, true]; }; var formatSingle = function formatSingle(selected, format$1) { return selected ? format(selected, format$1) : ''; }; var parseSingle = function parseSingle(dateString, format) { var parsedDate = parseDate(dateString, format, startOfToday()); return isValid(parsedDate) ? parsedDate : false; }; var reducerSingle = /*#__PURE__*/createReducer(selectDateSingle, formatSingle, parseSingle); var isSelectedSingle = function isSelectedSingle(selected, date) { return !!selected && isSameDay(selected, date); }; var buildCalendarDaySingle = /*#__PURE__*/buildCalendarDay(function (selected, date) { return !!selected && isSameDay(selected, date); }, function () { return {}; }); var buildContextSingle = /*#__PURE__*/buildContext(buildCalendarDaySingle); export { actionBlur, actionCloseCalendar, actionDateClick, actionEndOfWeek, actionInputBlur, actionInputChange, actionInputFocus, actionInputKeyArrowDown, actionInputKeyEnter, actionKeyArrowDown, actionKeyArrowLeft, actionKeyArrowRight, actionKeyArrowUp, actionKeyEnd, actionKeyEnter, actionKeyEscape, actionKeyHome, actionKeyPageDown, actionKeyPageUp, actionKeyShiftPageDown, actionKeyShiftPageUp, actionNextDay, actionNextMonth, actionNextWeek, actionNextYear, actionOpenCalendar, actionPrevDay, actionPrevMonth, actionPrevWeek, actionPrevYear, actionSelectDate, actionSelectHighlighted, actionStartOfWeek, arrayGenerate, arrayIncludes, assertNever, buildCalendarDayRange, buildCalendarDayRangeExtra, buildCalendarDaySingle, buildContextMulti, buildContextRange, buildContextSingle, buildWeekdays, compareUndefined, dateIsSelectable, defaultOptions, emptyFn, formatMulti, formatRange, formatSingle, isSelectedMulti, isSelectedRange, isSelectedSingle, keyToAction, objectCopyPartial, parseMulti, parseRange, parseSingle, reducerMulti, reducerRange, reducerSingle, selectDateMulti, selectDateRange, selectDateSingle, sort, toggleValue, wrap, wrapWeekDay }; //# sourceMappingURL=repick-core.esm.js.map