UNPKG

wix-style-react

Version:
492 lines (390 loc) • 17.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = undefined; var _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; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _class, _temp; var _Calendar = require('./Calendar.scss'); var _Calendar2 = _interopRequireDefault(_Calendar); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _DayPicker = require('react-day-picker/DayPicker'); var _DayPicker2 = _interopRequireDefault(_DayPicker); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _add_months = require('date-fns/add_months'); var _add_months2 = _interopRequireDefault(_add_months); var _sub_months = require('date-fns/sub_months'); var _sub_months2 = _interopRequireDefault(_sub_months); var _start_of_month = require('date-fns/start_of_month'); var _start_of_month2 = _interopRequireDefault(_start_of_month); var _parse = require('date-fns/parse'); var _parse2 = _interopRequireDefault(_parse); var _is_same_day = require('date-fns/is_same_day'); var _is_same_day2 = _interopRequireDefault(_is_same_day); var _utils = require('./utils'); var _WixComponent2 = require('../BaseComponents/WixComponent'); var _WixComponent3 = _interopRequireDefault(_WixComponent2); var _LocaleUtils = require('../LocaleUtils'); var _LocaleUtils2 = _interopRequireDefault(_LocaleUtils); var _DatePickerHead = require('./DatePickerHead'); var _DatePickerHead2 = _interopRequireDefault(_DatePickerHead); 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"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Calendar = (_temp = _class = function (_WixComponent) { _inherits(Calendar, _WixComponent); function Calendar(props) { _classCallCheck(this, Calendar); var _this = _possibleConstructorReturn(this, (Calendar.__proto__ || Object.getPrototypeOf(Calendar)).call(this, props)); _this._setMonth = function (month) { _this.setState({ month: month }); }; _this._handleDayClick = function (value) { var modifiers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var event = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; _this._preventActionEventDefault(event); var propsValue = _this.props.value || {}; var _this$props = _this.props, onChange = _this$props.onChange, shouldCloseOnSelect = _this$props.shouldCloseOnSelect; if (_this.props.selectionMode === 'range') { if (!propsValue.from && !propsValue.to || propsValue.from && propsValue.to) { onChange({ from: value }, modifiers); } else { var anchor = propsValue.from || propsValue.to; var newVal = anchor < value ? { from: anchor, to: value } : { from: value, to: anchor }; onChange(newVal, modifiers); shouldCloseOnSelect && _this.props.onClose(event); } } else { onChange(value, modifiers); shouldCloseOnSelect && _this.props.onClose(event); } }; _this._preventActionEventDefault = function () { var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; // We should not prevent "TAB"/"ESC" key if (event && (!event.keyCode || !_this.keyHandlers[event.keyCode])) { event.preventDefault(); } }; _this._createCaptionElement = function (month) { var _this$props2 = _this.props, locale = _this$props2.locale, showMonthDropdown = _this$props2.showMonthDropdown, showYearDropdown = _this$props2.showYearDropdown; var localeUtils = (0, _LocaleUtils2.default)(locale); return _react2.default.createElement(_DatePickerHead2.default, { date: month, showYearDropdown: showYearDropdown, showMonthDropdown: showMonthDropdown, localeUtils: localeUtils, onChange: _this._setMonth, onLeftArrowClick: function onLeftArrowClick() { return _this._setMonth((0, _start_of_month2.default)((0, _add_months2.default)(month, -1))); }, onRightArrowClick: function onRightArrowClick() { return _this._setMonth((0, _start_of_month2.default)((0, _add_months2.default)(month, 1))); } }); }; _this._createDayPickerProps = function () { var _this$props3 = _this.props, locale = _this$props3.locale, filterDate = _this$props3.filterDate, excludePastDates = _this$props3.excludePastDates, numOfMonths = _this$props3.numOfMonths; var value = Calendar.parseValue(_this.props.value); var month = _this.state.month; var localeUtils = (0, _LocaleUtils2.default)(locale); var _ref = value || {}, from = _ref.from, to = _ref.to; var singleDay = !from && !to && value; var firstOfMonth = [new Date(month.getFullYear(), month.getMonth(), 1), new Date(month.getFullYear(), month.getMonth() + 1, 1)]; var lastOfMonth = [new Date(month.getFullYear(), month.getMonth() + 1, 0), new Date(month.getFullYear(), month.getMonth() + 2, 0)]; var captionElement = _this._createCaptionElement(month); var selectedDays = _this._getSelectedDays(value); return { disabledDays: excludePastDates ? { before: new Date() } : function (date) { return !filterDate(date); }, initialMonth: month, initialYear: month, selectedDays: selectedDays, month: month, year: month, firstDayOfWeek: 1, locale: typeof locale === 'string' ? locale : '', fixedWeeks: true, onKeyDown: _this._handleKeyDown, onDayClick: _this._handleDayClick, localeUtils: localeUtils, navbarElement: function navbarElement() { return null; }, captionElement: captionElement, onCaptionClick: _this._preventActionEventDefault, onDayKeyDown: _this._handleDayKeyDown, numberOfMonths: numOfMonths, className: numOfMonths > 1 ? _Calendar2.default.TwoMonths : '', modifiers: { start: from, end: to, firstOfMonth: firstOfMonth, lastOfMonth: lastOfMonth, singleDay: singleDay }, renderDay: Calendar.renderDay }; }; _this._handleKeyDown = function (event) { var keyHandler = _this.keyHandlers[event.keyCode]; keyHandler && keyHandler(event); }; _this.keyHandlers = { // escape 27: _this.props.onClose, // tab 9: _this.props.onClose }; _this._focusSelectedDay = function (dayPickerRef) { if (dayPickerRef) { _this.dayPickerRef = dayPickerRef; var selectedDay = _this.dayPickerRef.dayPicker.querySelector('.DayPicker-Day--selected'); if (selectedDay) { selectedDay.classList.add('DayPicker-Day--unfocused'); selectedDay.focus(); } } }; _this._handleDayKeyDown = function (_value) { var _modifiers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var event = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; _this._preventActionEventDefault(event); var unfocusedDay = _this.dayPickerRef.dayPicker.querySelector('.DayPicker-Day--unfocused'); if (unfocusedDay) { unfocusedDay.classList.remove('DayPicker-Day--unfocused'); } }; var initialMonth = Calendar.getUpdatedMonth(props.value, props.numOfMonths); _this.state = { month: initialMonth || new Date() }; return _this; } _createClass(Calendar, [{ key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { if (nextProps.value !== this.props.value) { var month = Calendar.getUpdatedMonth(nextProps.value, nextProps.numOfMonths, this.state.month); if (month) { this.setState({ month: month }); } } } }, { key: '_getSelectedDays', value: function _getSelectedDays(value) { var _ref2 = value || {}, from = _ref2.from, to = _ref2.to; if (from && to) { return { from: from, to: to }; } else if (from) { return { after: prevDay(from) }; } else if (to) { return { before: nextDay(to) }; } else { // Single day OR empty value return value; } } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', { className: (0, _classnames2.default)(_Calendar2.default.calendar, this.props.className), onClick: this._preventActionEventDefault }, _react2.default.createElement(_DayPicker2.default, _extends({ ref: this._focusSelectedDay }, this._createDayPickerProps())) ); } }], [{ key: 'areValuesEqual', value: function areValuesEqual() { var value1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var value2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (!Boolean(value1) && !Boolean(value2)) { return true; } if (Calendar.isRangeValue(value1) && Calendar.isRangeValue(value2)) { return (0, _is_same_day2.default)(value1.from, value2.from) && (0, _is_same_day2.default)(value1.to, value2.to); } return (0, _is_same_day2.default)(value1, value2); } }, { key: 'renderDay', value: function renderDay(day, modifiers) { var relevantModifiers = ['start', 'end', 'selected']; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = relevantModifiers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var modifier = _step.value; if (modifier in modifiers) { return _react2.default.createElement( 'div', { className: _Calendar2.default.dayCircle, 'data-date': day.getFullYear() + '-' + day.getMonth() + '-' + day.getDate() }, day.getDate() ); } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return _react2.default.createElement( 'div', { 'data-date': day.getFullYear() + '-' + day.getMonth() + '-' + day.getDate() }, day.getDate() ); } /** Return a value in which all string-dates are parsed into Date objects */ }, { key: 'isSingleDay', value: function isSingleDay(value) { return value instanceof Date; } }, { key: 'isRangeValue', value: function isRangeValue(value) { return Boolean(value.from || value.to); } }]); return Calendar; }(_WixComponent3.default), _class.displayName = 'Calendar', _class.defaultProps = { locale: 'en', className: '', filterDate: function filterDate() { return true; }, shouldCloseOnSelect: true, onClose: function onClose() {} }, _class.optionalParse = function (dateOrString) { return typeof dateOrString === 'string' ? (0, _parse2.default)(dateOrString) : dateOrString; }, _class.parseValue = function (value) { if (!value) { return new Date(); } if (typeof value === 'string') { return (0, _parse2.default)(value); } else if (value instanceof Date) { return value; } else { return { from: Calendar.optionalParse(value.from), to: Calendar.optionalParse(value.to) }; } }, _class.getUpdatedMonth = function (nextPropsValue, numOfMonths, currentMonthDate) { var nextValue = Calendar.parseValue(nextPropsValue); if (!currentMonthDate) { return Calendar.isSingleDay(nextValue) ? nextValue : nextValue.from || nextValue.to; } var view = new _utils.CalendarView(currentMonthDate, numOfMonths); if (Calendar.isSingleDay(nextValue)) { if (!view.isContained(nextValue)) { return nextValue; } } else { var from = nextValue.from, to = nextValue.to; if (from && view.isAfterView(from)) { // F--- => F--- // VVVVV => VVVVV return from; } else if (to && view.isBeforeView(to)) { if (view.isRangeFits(from, to)) { // F-T => F-T // VVVVV => VVVVV return from; } else { // F-----T => F-----T // VVVVV => VVVVV return (0, _sub_months2.default)(to, numOfMonths - 1); } } else if (from && view.isBeforeView(from) && to && view.isAfterView(to)) { // F-------T => F-------T // VVVVV => VVVVV return from; // choose the 'from' anchor arbitrarly } } /* * We only changed the month if the day (or range.edges) are outside the view. * This is to avoid changing the month right after a user clicks on the calendar. */ return null; }, _temp); exports.default = Calendar; Calendar.propTypes = { /** Display multiple months, currently allowing only 1 or 2 */ numOfMonths: _propTypes2.default.oneOf([1, 2]), className: _propTypes2.default.string, /** Callback function called with a Date or a Range whenever the user selects a day in the calendar */ onChange: _propTypes2.default.func.isRequired, /** Callback function called whenever user press escape or click outside of the element or a date is selected and `shouldCloseOnSelect` is set. Receives an event as first argument */ onClose: _propTypes2.default.func, /** Past dates are unselectable */ excludePastDates: _propTypes2.default.bool, /** Only the truthy dates are selectable */ filterDate: _propTypes2.default.func, /** The selected date */ value: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.instanceOf(Date), _propTypes2.default.shape({ from: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.instanceOf(Date)]), to: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.instanceOf(Date)]) })]), /** Whether the user should be able to select a date range, or just a single day */ selectionMode: _propTypes2.default.oneOf(['day', 'range']), /** Display a selectable yearDropdown */ showYearDropdown: _propTypes2.default.bool, /** Display a selectable monthDropdown */ showMonthDropdown: _propTypes2.default.bool, /** should the calendar close on day selection */ shouldCloseOnSelect: _propTypes2.default.bool, /** DatePicker instance locale */ locale: _propTypes2.default.oneOfType([_propTypes2.default.oneOf(['en', 'es', 'pt', 'fr', 'de', 'pl', 'it', 'ru', 'ja', 'ko', 'tr', 'sv', 'no', 'nl', 'da']), _propTypes2.default.shape({ distanceInWords: _propTypes2.default.object, format: _propTypes2.default.object })]) }; function nextDay(date) { var day = new Date(date); day.setDate(day.getDate() + 1); return day; } function prevDay(date) { var day = new Date(date); day.setDate(day.getDate() - 1); return day; }