UNPKG

react-dates

Version:

A responsive and accessible date range picker component built with React

890 lines (708 loc) 28.2 kB
module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; Object.defineProperty(exports, "__esModule", { value: true }); 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 _react = __webpack_require__(1); var _react2 = _interopRequireDefault(_react); var _moment = __webpack_require__(6); var _moment2 = _interopRequireDefault(_moment); var _classnames = __webpack_require__(7); var _classnames2 = _interopRequireDefault(_classnames); var _reactPortal = __webpack_require__(28); var _reactPortal2 = _interopRequireDefault(_reactPortal); var _airbnbPropTypes = __webpack_require__(5); var _consolidatedEvents = __webpack_require__(18); var _isTouchDevice = __webpack_require__(26); var _isTouchDevice2 = _interopRequireDefault(_isTouchDevice); var _SingleDatePickerShape = __webpack_require__(58); var _SingleDatePickerShape2 = _interopRequireDefault(_SingleDatePickerShape); var _defaultPhrases = __webpack_require__(8); var _OutsideClickHandler = __webpack_require__(29); var _OutsideClickHandler2 = _interopRequireDefault(_OutsideClickHandler); var _toMomentObject = __webpack_require__(41); var _toMomentObject2 = _interopRequireDefault(_toMomentObject); var _toLocalizedDateString = __webpack_require__(42); var _toLocalizedDateString2 = _interopRequireDefault(_toLocalizedDateString); var _getResponsiveContainerStyles = __webpack_require__(30); var _getResponsiveContainerStyles2 = _interopRequireDefault(_getResponsiveContainerStyles); var _toISODateString = __webpack_require__(15); var _toISODateString2 = _interopRequireDefault(_toISODateString); var _SingleDatePickerInput = __webpack_require__(59); var _SingleDatePickerInput2 = _interopRequireDefault(_SingleDatePickerInput); var _DayPickerSingleDateController = __webpack_require__(60); var _DayPickerSingleDateController2 = _interopRequireDefault(_DayPickerSingleDateController); var _close = __webpack_require__(34); var _close2 = _interopRequireDefault(_close); var _isInclusivelyAfterDay = __webpack_require__(31); var _isInclusivelyAfterDay2 = _interopRequireDefault(_isInclusivelyAfterDay); var _constants = __webpack_require__(11); 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 === "undefined" ? "undefined" : _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 === "undefined" ? "undefined" : _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 propTypes = (0, _airbnbPropTypes.forbidExtraProps)(_SingleDatePickerShape2['default']); var defaultProps = { // required props for a functional interactive SingleDatePicker date: null, focused: false, // input related props id: 'date', placeholder: 'Date', disabled: false, required: false, readOnly: false, screenReaderInputMessage: '', showClearDate: false, showDefaultInputIcon: false, customInputIcon: null, customCloseIcon: null, // calendar presentation and interaction related props orientation: _constants.HORIZONTAL_ORIENTATION, anchorDirection: _constants.ANCHOR_LEFT, horizontalMargin: 0, withPortal: false, withFullScreenPortal: false, initialVisibleMonth: null, numberOfMonths: 2, keepOpenOnDateSelect: false, reopenPickerOnClearDate: false, renderCalendarInfo: null, hideKeyboardShortcutsPanel: false, daySize: _constants.DAY_SIZE, isRTL: false, // navigation related props navPrev: null, navNext: null, onPrevMonthClick: function () { function onPrevMonthClick() {} return onPrevMonthClick; }(), onNextMonthClick: function () { function onNextMonthClick() {} return onNextMonthClick; }(), onClose: function () { function onClose() {} return onClose; }(), // month presentation and interaction related props renderMonth: null, // day presentation and interaction related props renderDay: null, enableOutsideDays: false, isDayBlocked: function () { function isDayBlocked() { return false; } return isDayBlocked; }(), isOutsideRange: function () { function isOutsideRange(day) { return !(0, _isInclusivelyAfterDay2['default'])(day, (0, _moment2['default'])()); } return isOutsideRange; }(), isDayHighlighted: function () { function isDayHighlighted() {} return isDayHighlighted; }(), // internationalization props displayFormat: function () { function displayFormat() { return _moment2['default'].localeData().longDateFormat('L'); } return displayFormat; }(), monthFormat: 'MMMM YYYY', phrases: _defaultPhrases.SingleDatePickerPhrases }; var SingleDatePicker = function (_React$Component) { _inherits(SingleDatePicker, _React$Component); function SingleDatePicker(props) { _classCallCheck(this, SingleDatePicker); var _this = _possibleConstructorReturn(this, (SingleDatePicker.__proto__ || Object.getPrototypeOf(SingleDatePicker)).call(this, props)); _this.isTouchDevice = false; _this.state = { dayPickerContainerStyles: {}, isDayPickerFocused: false, isInputFocused: false }; _this.onDayPickerFocus = _this.onDayPickerFocus.bind(_this); _this.onDayPickerBlur = _this.onDayPickerBlur.bind(_this); _this.onChange = _this.onChange.bind(_this); _this.onFocus = _this.onFocus.bind(_this); _this.onClearFocus = _this.onClearFocus.bind(_this); _this.clearDate = _this.clearDate.bind(_this); _this.responsivizePickerPosition = _this.responsivizePickerPosition.bind(_this); return _this; } /* istanbul ignore next */ _createClass(SingleDatePicker, [{ key: 'componentDidMount', value: function () { function componentDidMount() { this.resizeHandle = (0, _consolidatedEvents.addEventListener)(window, 'resize', this.responsivizePickerPosition, { passive: true }); this.responsivizePickerPosition(); if (this.props.focused) { this.setState({ isInputFocused: true }); } this.isTouchDevice = (0, _isTouchDevice2['default'])(); } return componentDidMount; }() }, { key: 'componentDidUpdate', value: function () { function componentDidUpdate(prevProps) { if (!prevProps.focused && this.props.focused) { this.responsivizePickerPosition(); } } return componentDidUpdate; }() /* istanbul ignore next */ }, { key: 'componentWillUnmount', value: function () { function componentWillUnmount() { (0, _consolidatedEvents.removeEventListener)(this.resizeHandle); } return componentWillUnmount; }() }, { key: 'onChange', value: function () { function onChange(dateString) { var _props = this.props, isOutsideRange = _props.isOutsideRange, keepOpenOnDateSelect = _props.keepOpenOnDateSelect, onDateChange = _props.onDateChange, onFocusChange = _props.onFocusChange, onClose = _props.onClose; var newDate = (0, _toMomentObject2['default'])(dateString, this.getDisplayFormat()); var isValid = newDate && !isOutsideRange(newDate); if (isValid) { onDateChange(newDate); if (!keepOpenOnDateSelect) { onFocusChange({ focused: false }); onClose({ date: newDate }); } } else { onDateChange(null); } } return onChange; }() }, { key: 'onFocus', value: function () { function onFocus() { var _props2 = this.props, disabled = _props2.disabled, onFocusChange = _props2.onFocusChange, withPortal = _props2.withPortal, withFullScreenPortal = _props2.withFullScreenPortal; var moveFocusToDayPicker = withPortal || withFullScreenPortal || this.isTouchDevice; if (moveFocusToDayPicker) { this.onDayPickerFocus(); } else { this.onDayPickerBlur(); } if (!disabled) { onFocusChange({ focused: true }); } } return onFocus; }() }, { key: 'onClearFocus', value: function () { function onClearFocus() { var _props3 = this.props, startDate = _props3.startDate, endDate = _props3.endDate, focused = _props3.focused, onFocusChange = _props3.onFocusChange, onClose = _props3.onClose; if (!focused) return; this.setState({ isInputFocused: false, isDayPickerFocused: false }); onFocusChange({ focused: false }); onClose({ startDate: startDate, endDate: endDate }); } return onClearFocus; }() }, { key: 'onDayPickerFocus', value: function () { function onDayPickerFocus() { this.setState({ isInputFocused: false, isDayPickerFocused: true }); } return onDayPickerFocus; }() }, { key: 'onDayPickerBlur', value: function () { function onDayPickerBlur() { this.setState({ isInputFocused: true, isDayPickerFocused: false }); } return onDayPickerBlur; }() }, { key: 'getDateString', value: function () { function getDateString(date) { var displayFormat = this.getDisplayFormat(); if (date && displayFormat) { return date && date.format(displayFormat); } return (0, _toLocalizedDateString2['default'])(date); } return getDateString; }() }, { key: 'getDayPickerContainerClasses', value: function () { function getDayPickerContainerClasses() { var _props4 = this.props, orientation = _props4.orientation, withPortal = _props4.withPortal, withFullScreenPortal = _props4.withFullScreenPortal, anchorDirection = _props4.anchorDirection, isRTL = _props4.isRTL; var dayPickerClassName = (0, _classnames2['default'])('SingleDatePicker__picker', { 'SingleDatePicker__picker--direction-left': anchorDirection === _constants.ANCHOR_LEFT, 'SingleDatePicker__picker--direction-right': anchorDirection === _constants.ANCHOR_RIGHT, 'SingleDatePicker__picker--horizontal': orientation === _constants.HORIZONTAL_ORIENTATION, 'SingleDatePicker__picker--vertical': orientation === _constants.VERTICAL_ORIENTATION, 'SingleDatePicker__picker--portal': withPortal || withFullScreenPortal, 'SingleDatePicker__picker--full-screen-portal': withFullScreenPortal, 'SingleDatePicker__picker--rtl': isRTL }); return dayPickerClassName; } return getDayPickerContainerClasses; }() }, { key: 'getDisplayFormat', value: function () { function getDisplayFormat() { var displayFormat = this.props.displayFormat; return typeof displayFormat === 'string' ? displayFormat : displayFormat(); } return getDisplayFormat; }() }, { key: 'clearDate', value: function () { function clearDate() { var _props5 = this.props, onDateChange = _props5.onDateChange, reopenPickerOnClearDate = _props5.reopenPickerOnClearDate, onFocusChange = _props5.onFocusChange; onDateChange(null); if (reopenPickerOnClearDate) { onFocusChange({ focused: true }); } } return clearDate; }() /* istanbul ignore next */ }, { key: 'responsivizePickerPosition', value: function () { function responsivizePickerPosition() { var _props6 = this.props, anchorDirection = _props6.anchorDirection, horizontalMargin = _props6.horizontalMargin, withPortal = _props6.withPortal, withFullScreenPortal = _props6.withFullScreenPortal, focused = _props6.focused; var dayPickerContainerStyles = this.state.dayPickerContainerStyles; if (!focused) { return; } var isAnchoredLeft = anchorDirection === _constants.ANCHOR_LEFT; if (!withPortal && !withFullScreenPortal) { var containerRect = this.dayPickerContainer.getBoundingClientRect(); var currentOffset = dayPickerContainerStyles[anchorDirection] || 0; var containerEdge = isAnchoredLeft ? containerRect[_constants.ANCHOR_RIGHT] : containerRect[_constants.ANCHOR_LEFT]; this.setState({ dayPickerContainerStyles: (0, _getResponsiveContainerStyles2['default'])(anchorDirection, currentOffset, containerEdge, horizontalMargin) }); } } return responsivizePickerPosition; }() }, { key: 'maybeRenderDayPickerWithPortal', value: function () { function maybeRenderDayPickerWithPortal() { var _props7 = this.props, focused = _props7.focused, withPortal = _props7.withPortal, withFullScreenPortal = _props7.withFullScreenPortal; if (!focused) { return null; } if (withPortal || withFullScreenPortal) { return _react2['default'].createElement(_reactPortal2['default'], { isOpened: true }, this.renderDayPicker()); } return this.renderDayPicker(); } return maybeRenderDayPickerWithPortal; }() }, { key: 'renderDayPicker', value: function () { function renderDayPicker() { var _this2 = this; var _props8 = this.props, onDateChange = _props8.onDateChange, date = _props8.date, onFocusChange = _props8.onFocusChange, focused = _props8.focused, enableOutsideDays = _props8.enableOutsideDays, numberOfMonths = _props8.numberOfMonths, orientation = _props8.orientation, monthFormat = _props8.monthFormat, navPrev = _props8.navPrev, navNext = _props8.navNext, withPortal = _props8.withPortal, withFullScreenPortal = _props8.withFullScreenPortal, initialVisibleMonth = _props8.initialVisibleMonth, renderMonth = _props8.renderMonth, renderDay = _props8.renderDay, renderCalendarInfo = _props8.renderCalendarInfo, hideKeyboardShortcutsPanel = _props8.hideKeyboardShortcutsPanel, customCloseIcon = _props8.customCloseIcon, phrases = _props8.phrases, daySize = _props8.daySize, isRTL = _props8.isRTL, isOutsideRange = _props8.isOutsideRange, isDayBlocked = _props8.isDayBlocked, isDayHighlighted = _props8.isDayHighlighted; var _state = this.state, dayPickerContainerStyles = _state.dayPickerContainerStyles, isDayPickerFocused = _state.isDayPickerFocused; var onOutsideClick = !withFullScreenPortal && withPortal ? this.onClearFocus : undefined; var closeIcon = customCloseIcon || _react2['default'].createElement(_close2['default'], null); return _react2['default'].createElement('div', { // eslint-disable-line jsx-a11y/no-static-element-interactions ref: function () { function ref(_ref) { _this2.dayPickerContainer = _ref; } return ref; }(), className: this.getDayPickerContainerClasses(), style: dayPickerContainerStyles, onClick: onOutsideClick }, _react2['default'].createElement(_DayPickerSingleDateController2['default'], { date: date, onDateChange: onDateChange, onFocusChange: onFocusChange, orientation: orientation, enableOutsideDays: enableOutsideDays, numberOfMonths: numberOfMonths, monthFormat: monthFormat, withPortal: withPortal || withFullScreenPortal, focused: focused, hideKeyboardShortcutsPanel: hideKeyboardShortcutsPanel, initialVisibleMonth: initialVisibleMonth, navPrev: navPrev, navNext: navNext, renderMonth: renderMonth, renderDay: renderDay, renderCalendarInfo: renderCalendarInfo, isFocused: isDayPickerFocused, phrases: phrases, daySize: daySize, isRTL: isRTL, isOutsideRange: isOutsideRange, isDayBlocked: isDayBlocked, isDayHighlighted: isDayHighlighted }), withFullScreenPortal && _react2['default'].createElement('button', { 'aria-label': phrases.closeDatePicker, className: 'SingleDatePicker__close', type: 'button', onClick: this.onClearFocus }, _react2['default'].createElement('div', { className: 'SingleDatePicker__close-icon' }, closeIcon))); } return renderDayPicker; }() }, { key: 'render', value: function () { function render() { var _props9 = this.props, id = _props9.id, placeholder = _props9.placeholder, disabled = _props9.disabled, focused = _props9.focused, required = _props9.required, readOnly = _props9.readOnly, showClearDate = _props9.showClearDate, showDefaultInputIcon = _props9.showDefaultInputIcon, customInputIcon = _props9.customInputIcon, date = _props9.date, phrases = _props9.phrases, withPortal = _props9.withPortal, withFullScreenPortal = _props9.withFullScreenPortal, screenReaderInputMessage = _props9.screenReaderInputMessage, isRTL = _props9.isRTL; var isInputFocused = this.state.isInputFocused; var displayValue = this.getDateString(date); var inputValue = (0, _toISODateString2['default'])(date); var onOutsideClick = !withPortal && !withFullScreenPortal ? this.onClearFocus : undefined; return _react2['default'].createElement('div', { className: 'SingleDatePicker' }, _react2['default'].createElement(_OutsideClickHandler2['default'], { onOutsideClick: onOutsideClick }, _react2['default'].createElement(_SingleDatePickerInput2['default'], { id: id, placeholder: placeholder, focused: focused, isFocused: isInputFocused, disabled: disabled, required: required, readOnly: readOnly, showCaret: !withPortal && !withFullScreenPortal, onClearDate: this.clearDate, showClearDate: showClearDate, showDefaultInputIcon: showDefaultInputIcon, customInputIcon: customInputIcon, displayValue: displayValue, inputValue: inputValue, onChange: this.onChange, onFocus: this.onFocus, onKeyDownShiftTab: this.onClearFocus, onKeyDownTab: this.onClearFocus, onKeyDownArrowDown: this.onDayPickerFocus, screenReaderMessage: screenReaderInputMessage, phrases: phrases, isRTL: isRTL }), this.maybeRenderDayPickerWithPortal())); } return render; }() }]); return SingleDatePicker; }(_react2['default'].Component); exports['default'] = SingleDatePicker; SingleDatePicker.propTypes = propTypes; SingleDatePicker.defaultProps = defaultProps; /***/ }), /* 1 */ /***/ (function(module, exports) { module.exports = require("react"); /***/ }), /* 2 */, /* 3 */, /* 4 */, /* 5 */ /***/ (function(module, exports) { module.exports = require("airbnb-prop-types"); /***/ }), /* 6 */ /***/ (function(module, exports) { module.exports = require("moment"); /***/ }), /* 7 */ /***/ (function(module, exports) { module.exports = require("classnames"); /***/ }), /* 8 */ /***/ (function(module, exports) { module.exports = require("../defaultPhrases"); /***/ }), /* 9 */, /* 10 */, /* 11 */ /***/ (function(module, exports) { module.exports = require("../../constants"); /***/ }), /* 12 */, /* 13 */, /* 14 */, /* 15 */ /***/ (function(module, exports) { module.exports = require("../utils/toISODateString"); /***/ }), /* 16 */, /* 17 */, /* 18 */ /***/ (function(module, exports) { module.exports = require("consolidated-events"); /***/ }), /* 19 */, /* 20 */, /* 21 */, /* 22 */, /* 23 */, /* 24 */, /* 25 */, /* 26 */ /***/ (function(module, exports) { module.exports = require("is-touch-device"); /***/ }), /* 27 */, /* 28 */ /***/ (function(module, exports) { module.exports = require("react-portal"); /***/ }), /* 29 */ /***/ (function(module, exports) { module.exports = require("./OutsideClickHandler"); /***/ }), /* 30 */ /***/ (function(module, exports) { module.exports = require("../utils/getResponsiveContainerStyles"); /***/ }), /* 31 */ /***/ (function(module, exports) { module.exports = require("../utils/isInclusivelyAfterDay"); /***/ }), /* 32 */, /* 33 */, /* 34 */ /***/ (function(module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); 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 _react = __webpack_require__(1); var _react2 = _interopRequireDefault(_react); 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 SVG = function (_React$Component) { _inherits(SVG, _React$Component); function SVG() { _classCallCheck(this, SVG); return _possibleConstructorReturn(this, (SVG.__proto__ || Object.getPrototypeOf(SVG)).apply(this, arguments)); } _createClass(SVG, [{ key: "render", value: function () { function render() { return _react2["default"].createElement( "svg", _extends({ viewBox: "0 0 12 12" }, this.props), _react2["default"].createElement("path", { fillRule: "evenodd", d: "M11.53.47a.75.75 0 0 0-1.061 0l-4.47 4.47L1.529.47A.75.75 0 1 0 .468 1.531l4.47 4.47-4.47 4.47a.75.75 0 1 0 1.061 1.061l4.47-4.47 4.47 4.47a.75.75 0 1 0 1.061-1.061l-4.47-4.47 4.47-4.47a.75.75 0 0 0 0-1.061z" }) ); } return render; }() }]); return SVG; }(_react2["default"].Component); exports["default"] = SVG; /***/ }), /* 35 */, /* 36 */, /* 37 */, /* 38 */, /* 39 */, /* 40 */, /* 41 */ /***/ (function(module, exports) { module.exports = require("../utils/toMomentObject"); /***/ }), /* 42 */ /***/ (function(module, exports) { module.exports = require("../utils/toLocalizedDateString"); /***/ }), /* 43 */, /* 44 */, /* 45 */, /* 46 */, /* 47 */, /* 48 */, /* 49 */, /* 50 */, /* 51 */, /* 52 */, /* 53 */, /* 54 */, /* 55 */, /* 56 */, /* 57 */, /* 58 */ /***/ (function(module, exports) { module.exports = require("../shapes/SingleDatePickerShape"); /***/ }), /* 59 */ /***/ (function(module, exports) { module.exports = require("./SingleDatePickerInput"); /***/ }), /* 60 */ /***/ (function(module, exports) { module.exports = require("./DayPickerSingleDateController"); /***/ }) /******/ ]);