UNPKG

material-date-range-picker

Version:

React components, that implements material design pickers for material-ui v1

237 lines (187 loc) 7.65 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = void 0; var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _taggedTemplateLiteralLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteralLoose")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _downshift = _interopRequireDefault(require("downshift")); var _dateFns = require("date-fns"); var _TextField = _interopRequireDefault(require("@material-ui/core/TextField")); var _kalendaryo = _interopRequireDefault(require("kalendaryo")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _Calendar = _interopRequireDefault(require("./Calendar")); function _templateObject() { var data = (0, _taggedTemplateLiteralLoose2.default)(["\n position: relative;\n * {\n box-sizing: border-box;\n }\n"]); _templateObject = function _templateObject() { return data; }; return data; } var Wrapper = _styledComponents.default.div(_templateObject()); var itemToString = function itemToString(dateFormat) { return function (_temp) { var _ref = _temp === void 0 ? {} : _temp, fromDate = _ref.fromDate, toDate = _ref.toDate; return "" + (fromDate ? "From: " + (0, _dateFns.format)(fromDate, dateFormat) + (toDate ? ' ' : '') : '') + (toDate ? "To: " + (0, _dateFns.format)(toDate, dateFormat) : ''); }; }; function stateReducer(state, changes) { // this prevents the menu from being closed when the user // selects an item with a keyboard or mouse switch (changes.type) { case _downshift.default.stateChangeTypes.keyDownEnter: case _downshift.default.stateChangeTypes.clickItem: return (0, _extends2.default)({}, changes, { isOpen: state.isOpen, highlightedIndex: state.highlightedIndex }); default: return changes; } } var renderCalendar = function renderCalendar(props) { return _react.default.createElement(_Calendar.default, props); }; var DateRangePicker = /*#__PURE__*/ function (_PureComponent) { (0, _inheritsLoose2.default)(DateRangePicker, _PureComponent); function DateRangePicker() { var _this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _PureComponent.call.apply(_PureComponent, [this].concat(args)) || this; _this.setDateRange = function (selectedDate, stateAndHelpers) { var _this$props = _this.props, fromDate = _this$props.fromDate, toDate = _this$props.toDate; if (!fromDate && toDate && (0, _dateFns.isAfter)(selectedDate, toDate)) { _this.props.onChange({ fromDate: toDate, toDate: selectedDate }); return; } // Reset the state if the selected date is equal if (toDate && (0, _dateFns.isSameDay)(selectedDate, toDate)) { _this.props.onChange({ toDate: null }); return; } if (fromDate && (0, _dateFns.isSameDay)(selectedDate, fromDate)) { _this.props.onChange({ fromDate: null }); return; } // Set the starting date to the selected date // if the starting date is empty if (!fromDate) { _this.props.onChange({ fromDate: selectedDate }); return; } // Set the ending date to the selected date if the start date // is given and the selected date is after the start date if (fromDate && (0, _dateFns.isAfter)(selectedDate, fromDate)) { _this.props.onChange({ toDate: selectedDate }); } // Set the starting date to the selected date if the // starting date is given and the selected date is // before the ending date else if (toDate && fromDate && (0, _dateFns.isBefore)(selectedDate, fromDate)) { _this.props.onChange({ fromDate: selectedDate }); } // Set the starting date to the selected date // and the ending date to the last starting date // if the starting date is given and the selected date is before this starting date else if (fromDate && (0, _dateFns.isBefore)(selectedDate, fromDate)) { _this.props.onChange({ fromDate: selectedDate, toDate: fromDate }); } // Both dates are selected if we get here if (_this.props.closeDialogOnSelection) { stateAndHelpers.closeMenu(); } }; _this.clearDateRange = function () { return _this.props.onChange({ fromDate: null, toDate: null }); }; return _this; } var _proto = DateRangePicker.prototype; _proto.render = function render() { var _this2 = this; var _this$props2 = this.props, fromDate = _this$props2.fromDate, toDate = _this$props2.toDate, dateFormat = _this$props2.dateFormat; return _react.default.createElement(_downshift.default, (0, _extends2.default)({ stateReducer: stateReducer, selectedItem: { fromDate: fromDate, toDate: toDate }, itemToString: itemToString(dateFormat), onSelect: this.setDateRange }, this.props), function (_ref2) { var getInputProps = _ref2.getInputProps, getLabelProps = _ref2.getLabelProps, selectedItem = _ref2.selectedItem, downshiftProps = (0, _objectWithoutPropertiesLoose2.default)(_ref2, ["getInputProps", "getLabelProps", "selectedItem"]); return _react.default.createElement("div", { className: _this2.props.className }, _react.default.createElement(_TextField.default, { id: "date-range", label: "Date range", InputLabelProps: getLabelProps({ shrink: downshiftProps.isOpen || !!fromDate || !!toDate }), placeholder: "From:", fullWidth: true, InputProps: getInputProps({ readOnly: true, onClick: downshiftProps.openMenu, onFocus: downshiftProps.openMenu }) }), downshiftProps.isOpen ? _react.default.createElement(Wrapper, null, _react.default.createElement(_kalendaryo.default, (0, _extends2.default)({}, downshiftProps, { startCurrentDateAt: selectedItem.fromDate || selectedItem.toDate, fromDate: selectedItem.fromDate, toDate: selectedItem.toDate, clearDateRange: _this2.clearDateRange, startWeekAt: 1, defaultFormat: dateFormat, render: renderCalendar }))) : null); }); }; return DateRangePicker; }(_react.PureComponent); process.env.NODE_ENV !== "production" ? DateRangePicker.propTypes = { fromDate: _propTypes.default.instanceOf(Date), toDate: _propTypes.default.instanceOf(Date), onChange: _propTypes.default.func.isRequired, className: _propTypes.default.string, dateFormat: _propTypes.default.string, closeDialogOnSelection: _propTypes.default.bool } : void 0; DateRangePicker.defaultProps = { fromDate: null, toDate: null, className: '', dateFormat: 'YYYY-MM-DD' }; var _default = DateRangePicker; exports.default = _default;