UNPKG

rsuite

Version:

A suite of react components

646 lines (516 loc) 20.9 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 _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose")); var _isUndefined2 = _interopRequireDefault(require("lodash/isUndefined")); var _get2 = _interopRequireDefault(require("lodash/get")); var React = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var _compose = _interopRequireDefault(require("recompose/compose")); var _compare_asc = _interopRequireDefault(require("date-fns/compare_asc")); var _end_of_month = _interopRequireDefault(require("date-fns/end_of_month")); var _start_of_month = _interopRequireDefault(require("date-fns/start_of_month")); var _end_of_week = _interopRequireDefault(require("date-fns/end_of_week")); var _start_of_week = _interopRequireDefault(require("date-fns/start_of_week")); var _end_of_iso_week = _interopRequireDefault(require("date-fns/end_of_iso_week")); var _start_of_iso_week = _interopRequireDefault(require("date-fns/start_of_iso_week")); var _add_months = _interopRequireDefault(require("date-fns/add_months")); var _is_same_month = _interopRequireDefault(require("date-fns/is_same_month")); var _is_same_day = _interopRequireDefault(require("date-fns/is_same_day")); var _is_after = _interopRequireDefault(require("date-fns/is_after")); var _is_before = _interopRequireDefault(require("date-fns/is_before")); var _add_days = _interopRequireDefault(require("date-fns/add_days")); var _format = _interopRequireDefault(require("date-fns/format")); var _IntlProvider = _interopRequireDefault(require("../IntlProvider")); var _Toolbar = _interopRequireDefault(require("./Toolbar")); var _DatePicker = _interopRequireDefault(require("./DatePicker")); var _utils = require("./utils"); var _utils2 = require("../utils"); var _Picker = require("../Picker"); var _constants = require("../constants"); var DateRangePicker = /*#__PURE__*/ function (_React$Component) { (0, _inheritsLoose2.default)(DateRangePicker, _React$Component); DateRangePicker.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) { var value = nextProps.value; if (typeof value === 'undefined') { return null; } if (value[0] && !(0, _is_same_day.default)(value[0], prevState.value[0]) || value[1] && !(0, _is_same_day.default)(value[1], prevState.value[1])) { return { value: value, selectValue: value, calendarDate: (0, _utils.getCalendarDate)(value) }; } return null; }; function DateRangePicker(props) { var _this; _this = _React$Component.call(this, props) || this; _this.menuContainerRef = void 0; _this.triggerRef = void 0; _this.getValue = function () { var value = _this.props.value; if (typeof value !== 'undefined') { return value; } return _this.state.value || []; }; _this.getWeekHoverRange = function (date) { var isoWeek = _this.props.isoWeek; if (isoWeek) { // set to the first day of this week according to ISO 8601, 12:00 am return [(0, _start_of_iso_week.default)(date), (0, _end_of_iso_week.default)(date)]; } return [(0, _start_of_week.default)(date), (0, _end_of_week.default)(date)]; }; _this.getMonthHoverRange = function (date) { return [(0, _start_of_month.default)(date), (0, _end_of_month.default)(date)]; }; _this.handleChangeCalendarDate = function (index, date) { var calendarDate = _this.state.calendarDate; calendarDate[index] = date; _this.setState({ calendarDate: calendarDate }); }; _this.handleCloseDropdown = function () { if (_this.triggerRef.current) { _this.triggerRef.current.hide(); } }; _this.handleOpenDropdown = function () { if (_this.triggerRef.current) { _this.triggerRef.current.show(); } }; _this.handleShortcutPageDate = function (value, closeOverlay, event) { _this.updateValue(event, value, closeOverlay); }; _this.handleOK = function (event) { var onOk = _this.props.onOk; _this.updateValue(event); onOk && onOk(_this.state.selectValue, event); }; _this.handleChangeSelectValue = function (date, event) { var _this$state = _this.state, selectValue = _this$state.selectValue, doneSelected = _this$state.doneSelected; var _this$props = _this.props, onSelect = _this$props.onSelect, oneTap = _this$props.oneTap; var nextValue = []; var nextHoverValue = _this.getHoverRange(date); if (doneSelected) { if (nextHoverValue.length) { nextValue = [nextHoverValue[0], nextHoverValue[1], date]; nextHoverValue = [nextHoverValue[0], nextHoverValue[1], date]; } else { nextValue = [date, undefined, date]; } } else { if (nextHoverValue.length) { nextValue = [selectValue[0], selectValue[1]]; } else { nextValue = [selectValue[0], date]; } if ((0, _is_after.default)(nextValue[0], nextValue[1])) { nextValue.reverse(); } nextValue[0] = (0, _utils.setTimingMargin)(nextValue[0]); nextValue[1] = (0, _utils.setTimingMargin)(nextValue[1]); _this.setState({ calendarDate: (0, _utils.getCalendarDate)(nextValue) }); } var nextState = { doneSelected: !doneSelected, selectValue: nextValue, hoverValue: nextHoverValue }; _this.setState(nextState, function () { // 如果是单击模式,并且是第一次点选,再触发一次点击 if (oneTap && !_this.state.doneSelected) { _this.handleChangeSelectValue(date, event); } // 如果是单击模式,并且是第二次点选,更新值,并关闭面板 if (oneTap && _this.state.doneSelected) { _this.updateValue(event); } onSelect && onSelect(date); }); }; _this.handleMouseMoveSelectValue = function (date) { var _this$state2 = _this.state, doneSelected = _this$state2.doneSelected, selectValue = _this$state2.selectValue, hoverValue = _this$state2.hoverValue, currentHoverDate = _this$state2.currentHoverDate; var hoverRange = _this.props.hoverRange; if (currentHoverDate && (0, _is_same_day.default)(date, currentHoverDate)) { return; } var nextHoverValue = _this.getHoverRange(date); if (doneSelected && !(0, _isUndefined2.default)(hoverRange)) { _this.setState({ currentHoverDate: date, hoverValue: nextHoverValue }); return; } else if (doneSelected) { return; } var nextValue = selectValue; if (!nextHoverValue.length) { nextValue[1] = date; } else if (hoverValue) { nextValue = [(0, _is_before.default)(nextHoverValue[0], hoverValue[0]) ? nextHoverValue[0] : hoverValue[0], (0, _is_after.default)(nextHoverValue[1], hoverValue[1]) ? nextHoverValue[1] : hoverValue[1], nextValue[2]]; } // If `nextValue[0]` is greater than `nextValue[1]` then reverse order if ((0, _is_after.default)(nextValue[0], nextValue[1])) { nextValue.reverse(); } _this.setState({ currentHoverDate: date, selectValue: nextValue }); }; _this.handleClean = function (event) { _this.setState({ calendarDate: (0, _utils.getCalendarDate)() }); _this.updateValue(event, []); }; _this.handleEnter = function () { var value = _this.getValue(); var calendarDate; if (value && value.length) { var startDate = value[0], endData = value[1]; calendarDate = [startDate, (0, _is_same_month.default)(startDate, endData) ? (0, _add_months.default)(endData, 1) : endData]; } else { calendarDate = (0, _utils.getCalendarDate)(_this.props.defaultCalendarValue); } _this.setState({ selectValue: value, calendarDate: calendarDate, active: true }); }; _this.handleEntered = function () { var onOpen = _this.props.onOpen; onOpen && onOpen(); }; _this.handleExit = function () { var onClose = _this.props.onClose; _this.setState({ active: false, doneSelected: true }); onClose && onClose(); }; _this.disabledOkButton = function () { var _this$state3 = _this.state, selectValue = _this$state3.selectValue, doneSelected = _this$state3.doneSelected; if (!selectValue[0] || !selectValue[1] || !doneSelected) { return true; } return _this.disabledByBetween(selectValue[0], selectValue[1], _utils.TYPE.TOOLBAR_BUTTON_OK); }; _this.disabledShortcutButton = function (value) { if (value === void 0) { value = []; } if (!value[0] || !value[1]) { return true; } return _this.disabledByBetween(value[0], value[1], _utils.TYPE.TOOLBAR_SHORTCUT); }; _this.handleDisabledDate = function (date, values, type) { var disabledDate = _this.props.disabledDate; var doneSelected = _this.state.doneSelected; if (disabledDate) { return disabledDate(date, values, doneSelected, type); } return false; }; _this.addPrefix = function (name) { return (0, _utils2.prefix)(_this.props.classPrefix)(name); }; var defaultValue = props.defaultValue, _value = props.value, defaultCalendarValue = props.defaultCalendarValue; var activeValue = _value || defaultValue || []; var _calendarDate = (0, _utils.getCalendarDate)(_value || defaultCalendarValue); _this.state = { value: activeValue, selectValue: activeValue, doneSelected: true, calendarDate: _calendarDate, hoverValue: [], currentHoverDate: null }; // for test _this.menuContainerRef = React.createRef(); _this.triggerRef = React.createRef(); return _this; } var _proto = DateRangePicker.prototype; _proto.getDateString = function getDateString(value) { var _this$props2 = this.props, placeholder = _this$props2.placeholder, formatType = _this$props2.format, renderValue = _this$props2.renderValue; var nextValue = value || this.getValue(); var startDate = (0, _get2.default)(nextValue, '0'); var endDate = (0, _get2.default)(nextValue, '1'); if (startDate && endDate) { var displayValue = [startDate, endDate].sort(_compare_asc.default); return renderValue ? renderValue(displayValue, formatType) : (0, _format.default)(displayValue[0], formatType) + " ~ " + (0, _format.default)(displayValue[1], formatType); } return placeholder || formatType + " ~ " + formatType; } // hover range presets ; _proto.getHoverRange = function getHoverRange(date) { var hoverRange = this.props.hoverRange; if (!hoverRange) { return []; } var hoverRangeFunc = hoverRange; if (hoverRange === 'week') { hoverRangeFunc = this.getWeekHoverRange; } if (hoverRangeFunc === 'month') { hoverRangeFunc = this.getMonthHoverRange; } if (typeof hoverRangeFunc !== 'function') { return []; } var hoverValues = hoverRangeFunc(date); var isHoverRangeValid = hoverValues instanceof Array && hoverValues.length === 2; if (!isHoverRangeValid) { return []; } if ((0, _is_after.default)(hoverValues[0], hoverValues[1])) { hoverValues.reverse(); } return hoverValues; }; _proto.resetPageDate = function resetPageDate() { var selectValue = this.getValue(); var calendarDate = (0, _utils.getCalendarDate)(selectValue); this.setState({ selectValue: selectValue, calendarDate: calendarDate }); } /** * Toolbar operation callback function */ ; _proto.updateValue = function updateValue(event, nextSelectValue, closeOverlay) { if (closeOverlay === void 0) { closeOverlay = true; } var _this$state4 = this.state, value = _this$state4.value, selectValue = _this$state4.selectValue; var onChange = this.props.onChange; var nextValue = !(0, _isUndefined2.default)(nextSelectValue) ? nextSelectValue : selectValue; this.setState({ selectValue: nextValue || [], value: nextValue }); if (onChange && (!(0, _is_same_day.default)(nextValue[0], value[0]) || !(0, _is_same_day.default)(nextValue[1], value[1]))) { onChange(nextValue, event); } // `closeOverlay` default value is `true` if (closeOverlay !== false) { this.handleCloseDropdown(); } }; _proto.disabledByBetween = function disabledByBetween(start, end, type) { var disabledDate = this.props.disabledDate; var _this$state5 = this.state, selectValue = _this$state5.selectValue, doneSelected = _this$state5.doneSelected; var selectStartDate = selectValue[0]; var selectEndDate = selectValue[1]; var nextSelectValue = [selectStartDate, selectEndDate]; // If the date is between the start and the end // the button is disabled while ((0, _is_before.default)(start, end) || (0, _is_same_day.default)(start, end)) { if (disabledDate && disabledDate(start, nextSelectValue, doneSelected, type)) { return true; } start = (0, _add_days.default)(start, 1); } return false; }; _proto.renderDropdownMenu = function renderDropdownMenu() { var _this$props3 = this.props, menuClassName = _this$props3.menuClassName, ranges = _this$props3.ranges, isoWeek = _this$props3.isoWeek, limitEndYear = _this$props3.limitEndYear, oneTap = _this$props3.oneTap, showWeekNumbers = _this$props3.showWeekNumbers; var _this$state6 = this.state, calendarDate = _this$state6.calendarDate, selectValue = _this$state6.selectValue, hoverValue = _this$state6.hoverValue, doneSelected = _this$state6.doneSelected; var classes = (0, _classnames.default)(this.addPrefix('daterange-menu'), menuClassName); var pickerProps = { isoWeek: isoWeek, doneSelected: doneSelected, hoverValue: hoverValue, calendarDate: calendarDate, limitEndYear: limitEndYear, showWeekNumbers: showWeekNumbers, value: selectValue, disabledDate: this.handleDisabledDate, onSelect: this.handleChangeSelectValue, onMouseMove: this.handleMouseMoveSelectValue, onChangeCalendarDate: this.handleChangeCalendarDate }; return React.createElement(_Picker.MenuWrapper, { className: classes, ref: this.menuContainerRef }, React.createElement("div", { className: this.addPrefix('daterange-panel') }, React.createElement("div", { className: this.addPrefix('daterange-content') }, React.createElement("div", { className: this.addPrefix('daterange-header') }, this.getDateString(selectValue)), React.createElement("div", { className: this.addPrefix('daterange-calendar-group') }, React.createElement(_DatePicker.default, (0, _extends2.default)({ index: 0 }, pickerProps)), React.createElement(_DatePicker.default, (0, _extends2.default)({ index: 1 }, pickerProps)))), React.createElement(_Toolbar.default, { ranges: ranges, selectValue: selectValue, disabledOkButton: this.disabledOkButton, disabledShortcutButton: this.disabledShortcutButton, onShortcut: this.handleShortcutPageDate, onOk: this.handleOK, hideOkButton: oneTap }))); }; _proto.render = function render() { var _this$props4 = this.props, disabled = _this$props4.disabled, cleanable = _this$props4.cleanable, locale = _this$props4.locale, toggleComponentClass = _this$props4.toggleComponentClass, style = _this$props4.style, onEntered = _this$props4.onEntered, onEnter = _this$props4.onEnter, onExited = _this$props4.onExited, onClean = _this$props4.onClean, rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props4, ["disabled", "cleanable", "locale", "toggleComponentClass", "style", "onEntered", "onEnter", "onExited", "onClean"]); var value = this.getValue(); var unhandled = (0, _utils2.getUnhandledProps)(DateRangePicker, rest); var hasValue = value && value.length > 1; var classes = (0, _Picker.getToggleWrapperClassName)('daterange', this.addPrefix, this.props, hasValue); return React.createElement(_IntlProvider.default, { locale: locale }, React.createElement("div", { className: classes, style: style }, React.createElement(_Picker.PickerToggleTrigger, { pickerProps: this.props, ref: this.triggerRef, onEnter: (0, _utils2.createChainedFunction)(this.handleEnter, onEnter), onEntered: (0, _utils2.createChainedFunction)(this.handleEntered, onEntered), onExit: (0, _utils2.createChainedFunction)(this.handleExit, onExited), speaker: this.renderDropdownMenu() }, React.createElement(_Picker.PickerToggle, (0, _extends2.default)({}, unhandled, { componentClass: toggleComponentClass, onClean: (0, _utils2.createChainedFunction)(this.handleClean, onClean), cleanable: cleanable && !disabled, hasValue: hasValue, active: this.state.active }), this.getDateString())))); }; return DateRangePicker; }(React.Component); DateRangePicker.propTypes = { appearance: _propTypes.default.oneOf(['default', 'subtle']), ranges: _propTypes.default.array, value: _propTypes.default.arrayOf(_propTypes.default.instanceOf(Date)), defaultValue: _propTypes.default.arrayOf(_propTypes.default.instanceOf(Date)), defaultCalendarValue: _propTypes.default.arrayOf(_propTypes.default.instanceOf(Date)), placeholder: _propTypes.default.node, format: _propTypes.default.string, disabled: _propTypes.default.bool, locale: _propTypes.default.object, hoverRange: _propTypes.default.oneOfType([_propTypes.default.oneOf(['week', 'month']), _propTypes.default.func]), cleanable: _propTypes.default.bool, isoWeek: _propTypes.default.bool, oneTap: _propTypes.default.bool, limitEndYear: _propTypes.default.number, className: _propTypes.default.string, menuClassName: _propTypes.default.string, classPrefix: _propTypes.default.string, container: _propTypes.default.oneOfType([_propTypes.default.node, _propTypes.default.func]), containerPadding: _propTypes.default.number, block: _propTypes.default.bool, toggleComponentClass: _propTypes.default.elementType, style: _propTypes.default.object, open: _propTypes.default.bool, defaultOpen: _propTypes.default.bool, placement: _propTypes.default.oneOf(_constants.PLACEMENT), preventOverflow: _propTypes.default.bool, showWeekNumbers: _propTypes.default.bool, onChange: _propTypes.default.func, onOk: _propTypes.default.func, disabledDate: _propTypes.default.func, onSelect: _propTypes.default.func, onOpen: _propTypes.default.func, onClose: _propTypes.default.func, onHide: _propTypes.default.func, onClean: _propTypes.default.func, onEnter: _propTypes.default.func, onEntering: _propTypes.default.func, onEntered: _propTypes.default.func, onExit: _propTypes.default.func, onExiting: _propTypes.default.func, onExited: _propTypes.default.func, renderValue: _propTypes.default.func }; DateRangePicker.defaultProps = { appearance: 'default', placement: 'bottomStart', limitEndYear: 1000, format: 'YYYY-MM-DD', placeholder: '', cleanable: true, locale: { sunday: 'Su', monday: 'Mo', tuesday: 'Tu', wednesday: 'We', thursday: 'Th', friday: 'Fr', saturday: 'Sa', ok: 'OK', today: 'Today', yesterday: 'Yesterday', last7Days: 'Last 7 Days', hours: 'Hours', minutes: 'Minutes', seconds: 'Seconds' } }; var enhance = (0, _compose.default)((0, _utils2.defaultProps)({ classPrefix: 'picker' }), (0, _utils2.withPickerMethods)()); var _default = enhance(DateRangePicker); exports.default = _default; module.exports = exports.default;