UNPKG

shineout

Version:

Shein 前端组件库

370 lines (305 loc) 18 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _styles = require("./styles"); var _utils = _interopRequireDefault(require("./utils")); var _paramUtils = _interopRequireDefault(require("./paramUtils")); var _Icon = _interopRequireDefault(require("./Icon")); var _locale = require("../locale"); var _component = require("../component"); var _Time = _interopRequireDefault(require("./Time")); var _is = require("../utils/is"); var minStr = 'YYYY-MM-DD 00:00:00'; var maxStr = 'YYYY-MM-DD 23:59:59'; var Day = /*#__PURE__*/ function (_PureComponent) { (0, _inheritsLoose2.default)(Day, _PureComponent); function Day(props) { var _this; _this = _PureComponent.call(this, props) || this; (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleNextMonth", void 0); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handlePrevMonth", void 0); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleNextYear", void 0); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handlePrevYear", void 0); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleMonthMode", void 0); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleYearMode", void 0); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleWeekLeave", void 0); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "cachedDays", void 0); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "cachedDate", void 0); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "today", void 0); _this.state = { hover: null }; _this.handleNextMonth = _this.handleMonth.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 1); _this.handlePrevMonth = _this.handleMonth.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), -1); _this.handleNextYear = _this.handleMonth.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 12); _this.handlePrevYear = _this.handleMonth.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), -12); _this.handleMonthMode = _this.handleModeChange.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'month'); _this.handleYearMode = _this.handleModeChange.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'year'); _this.handleWeekLeave = _this.handleWeek.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), null); _this.handleTimeChange = _this.handleTimeChange.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); _this.handleDisabled = _this.handleDisabled.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); _this.formatWithDefaultTime = _this.formatWithDefaultTime.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); props.disabledRegister(_this.handleDisabled, 'day', props.index); return _this; } var _proto = Day.prototype; _proto.getOptions = function getOptions() { var timeZone = this.props.timeZone; return { timeZone: timeZone, weekStartsOn: (0, _locale.getLocale)('startOfWeek') }; }; _proto.getDays = function getDays() { var current = this.props.current; if (!current) return this.cachedDays; var date = _utils.default.clearHMS(current, this.getOptions()); if (this.cachedDate && _utils.default.isSameMonth(this.cachedDate, date, this.getOptions()) && this.cachedDays) { return this.cachedDays; } this.cachedDays = _utils.default.getDaysOfMonth(date, this.getOptions()); this.cachedDate = date; return this.cachedDays; }; _proto.formatWithDefaultTime = function formatWithDefaultTime(i) { var idx = 0; var _this$props = this.props, current = _this$props.current, defaultTime = _this$props.defaultTime, index = _this$props.index; if (typeof index === 'number') idx = index; if (typeof i === 'number') idx = i; if (!defaultTime[idx]) return current; return _utils.default.cloneTime(current, defaultTime[idx], _utils.default.TIME_FORMAT, this.getOptions()); }; _proto.handleDayDoubleClick = function handleDayDoubleClick(date) { var _this$props2 = this.props, type = _this$props2.type, defaultTime = _this$props2.defaultTime, index = _this$props2.index; // range & datetime & deafultTime if (type !== 'datetime' || !defaultTime.length || index === undefined) return; this.handleDayClick(date, 0); this.handleDayClick(date, 1); }; _proto.handleDayClick = function handleDayClick(date, sync) { var _this$props3 = this.props, type = _this$props3.type, allowSingle = _this$props3.allowSingle, rangeDate = _this$props3.rangeDate, min = _this$props3.min, max = _this$props3.max, index = _this$props3.index, value = _this$props3.value, onChangeSync = _this$props3.onChangeSync; var current = index === sync && value || this.formatWithDefaultTime(sync); var onChange = typeof sync === 'number' && onChangeSync ? onChangeSync.bind(this.props, sync) : this.props.onChange; if (type === 'week') { onChange.apply(void 0, _paramUtils.default.weekHandleChangeParams(date, true, true)); } else { var newDate = _utils.default.setTime(_utils.default.toDate(date), current, this.getOptions()); // only can select day with the same day of min/max if (min && _utils.default.compareAsc(newDate, min) < 0) newDate = _utils.default.setTime(newDate, min, this.getOptions()); if (max && _utils.default.compareAsc(newDate, max) > 0) newDate = _utils.default.setTime(newDate, max, this.getOptions()); if (allowSingle && (0, _is.isArray)(rangeDate) && index !== undefined && rangeDate[index] && _utils.default.clearHMS(newDate, this.getOptions()).getTime() === _utils.default.clearHMS(rangeDate[index], this.getOptions()).getTime()) newDate = ''; onChange.apply(void 0, _paramUtils.default.dayHandleChangeParams(newDate, true, type !== 'datetime')); } }; _proto.handleTimeChange = function handleTimeChange(time) { var _this$props4; if (this.props.onChange) (_this$props4 = this.props).onChange.apply(_this$props4, _paramUtils.default.timeHandleChangeParams(time, true, false)); }; _proto.handleWeek = function handleWeek(hover) { this.setState({ hover: hover }); }; _proto.handleMonth = function handleMonth(month) { var _this$props5 = this.props, current = _this$props5.current, onChange = _this$props5.onChange; // warning: month === 12 || month === -12, this is statement is year mode. if (month === -12 || month === 12) { onChange.apply(void 0, _paramUtils.default.yearHandleChangeParams(_utils.default.addMonths(current, month, this.getOptions()))); return; } onChange.apply(void 0, _paramUtils.default.monthHandleChangeParams(_utils.default.addMonths(current, month, this.getOptions()))); }; _proto.handleModeChange = function handleModeChange(mode) { this.props.onModeChange(mode); }; _proto.handleDayHover = function handleDayHover(date) { var onDayHover = this.props.onDayHover; if (onDayHover) onDayHover(date); }; _proto.handleDisabled = function handleDisabled(date, minDate, maxDate) { var _this$props6 = this.props, index = _this$props6.index, disabled = _this$props6.disabled, range = _this$props6.range, rangeTemp = _this$props6.rangeTemp, min = _this$props6.min, max = _this$props6.max, type = _this$props6.type; var minD = minDate || min && _utils.default.toDate(_utils.default.format(min, minStr, this.getOptions()), this.getOptions()); var maxD = maxDate || max && _utils.default.toDate(_utils.default.format(max, maxStr, this.getOptions()), this.getOptions()); var isDisabled = disabled && typeof disabled === 'function' ? disabled(date) : false; // only for single, single picker don't has index if (index === undefined && !isDisabled) { if (type === 'week') { if (minD && _utils.default.compareWeek(date, minD, 0, this.getOptions()) < 0) isDisabled = true; if (maxD && _utils.default.compareWeek(date, maxD, 0, this.getOptions()) > 0) isDisabled = true; } else if (minD && _utils.default.compareAsc(date, minD) < 0 || maxD && _utils.default.compareAsc(date, maxD) > 0) isDisabled = true; } if (!isDisabled && index === 1 && rangeTemp) { if (type === 'week') { if (typeof range === 'number' && _utils.default.compareWeek(date, _utils.default.addSeconds(rangeTemp, range, this.getOptions()), 0, this.getOptions()) > 0 || _utils.default.compareWeek(date, _utils.default.clearHMS(rangeTemp, this.getOptions()), 0, this.getOptions()) < 0) { isDisabled = true; } } else if (typeof range === 'number' && _utils.default.compareAsc(date, _utils.default.addSeconds(rangeTemp, range, this.getOptions())) > 0 || _utils.default.compareAsc(date, _utils.default.clearHMS(rangeTemp, this.getOptions())) < 0 || min && _utils.default.compareAsc(date, _utils.default.clearHMS(min, this.getOptions())) < 0 || _utils.default.compareAsc(date, max) > 0) { isDisabled = true; } // if (utils.compareAsc(date, min) < 0) isDisabled = true } if (!isDisabled && index === 0) { if (type === 'week') { if (min && _utils.default.compareWeek(date, _utils.default.clearHMS(min, this.getOptions()), 0, this.getOptions()) < 0 || max && _utils.default.compareWeek(date, max, 0, this.getOptions()) > 0) { isDisabled = true; } } else if (min && _utils.default.compareAsc(date, _utils.default.clearHMS(min, this.getOptions())) < 0 || _utils.default.compareAsc(date, max) > 0) { isDisabled = true; } } return isDisabled; }; _proto.renderDay = function renderDay(date, minD, maxD) { var _this$props7 = this.props, current = _this$props7.current, value = _this$props7.value, index = _this$props7.index, type = _this$props7.type, rangeDate = _this$props7.rangeDate; var hover = this.state.hover; var isDisabled = this.handleDisabled(date, minD, maxD); var classList = [_utils.default.isSameDay(date, this.today, this.getOptions()) && 'today', _utils.default.compareMonth(current, date, 0, this.getOptions()) !== 0 && 'other-month', isDisabled && 'disabled']; var hoverClass; var hoverProps = {}; var weekStart = (0, _locale.getLocale)('startOfWeek'); var weekEnd = weekStart ? 0 : 6; var day = _utils.default.getDateInfo(date, 'day', this.getOptions()); if (type === 'week') { hoverProps.onMouseEnter = this.handleWeek.bind(this, date); hoverProps.onMouseLeave = this.handleWeekLeave; if (_utils.default.isSameWeek(date, value, this.getOptions())) { hoverClass = (0, _styles.datepickerClass)('active', day === weekStart && 'hover-start', day === weekEnd && 'hover-end'); } else if (hover && _utils.default.isSameWeek(date, hover, this.getOptions())) { hoverClass = (0, _styles.datepickerClass)('hover', day === weekStart && 'hover-start', day === weekEnd && 'hover-end'); } } else if (rangeDate && _utils.default.compareMonth(current, date, 0, this.getOptions()) === 0 && index !== undefined) { hoverProps.onMouseEnter = this.handleDayHover.bind(this, date); classList.push(_utils.default.isSameDay(date, rangeDate[index], this.getOptions()) && 'active'); hoverClass = (0, _styles.datepickerClass)(_utils.default.compareDay(rangeDate[0], date, 0, this.getOptions()) <= 0 && _utils.default.compareDay(rangeDate[1], date, 0, this.getOptions()) >= 0 && 'hover', // Datetime Picker range end datetime classname #330 _utils.default.isSameDay(rangeDate[index], date, this.getOptions()) && "hover-" + (index === 0 ? 'start' : 'end') + " active"); } else if (value) { classList.push(_utils.default.isSameDay(date, value, this.getOptions()) && 'active'); } return _react.default.createElement("div", (0, _extends2.default)({ key: date.getTime(), className: hoverClass, onClick: isDisabled ? undefined : this.handleDayClick.bind(this, date, undefined), onDoubleClick: isDisabled ? undefined : this.handleDayDoubleClick.bind(this, date, undefined) }, hoverProps), _react.default.createElement("span", { className: _styles.datepickerClass.apply(void 0, classList) }, _utils.default.getDateInfo(date, 'date', this.getOptions()))); }; _proto.renderTimepicker = function renderTimepicker() { var _this$props8 = this.props, rangeDate = _this$props8.rangeDate, index = _this$props8.index, showTimePicker = _this$props8.showTimePicker; if (this.props.type !== 'datetime') return undefined; if (!showTimePicker) return undefined; var format = this.props.format; if (/^[X|x]$/.test(_utils.default.compatibleFmt(format))) { format = 'HH:mm:ss'; } else { var match = format.match(/[H|h].*/); // eslint-disable-next-line if (match) format = match[0]; } var value = rangeDate && index !== undefined ? _utils.default.toDateWithFormat(rangeDate[index], format, undefined, this.getOptions()) : this.props.value; if (!value) return undefined; return _react.default.createElement("div", { className: (0, _styles.datepickerClass)('datetime') }, _react.default.createElement(_Icon.default, { name: "Clock", className: "clock" }), _react.default.createElement(_Time.default, (0, _extends2.default)({}, this.props, { format: format, value: value, onChange: this.handleTimeChange })), _react.default.createElement("span", null, _utils.default.format(value, format, this.getOptions()))); }; _proto.render = function render() { var _this2 = this; var _this$props9 = this.props, current = _this$props9.current, min = _this$props9.min, index = _this$props9.index, max = _this$props9.max; var days = this.getDays(); this.today = _utils.default.newDate(undefined, this.getOptions()); var minDate = min && _utils.default.toDate(_utils.default.format(min, minStr, this.getOptions()), this.getOptions()); var maxDate = max && _utils.default.toDate(_utils.default.format(max, maxStr, this.getOptions()), this.getOptions()); return _react.default.createElement("div", { className: (0, _styles.datepickerClass)('day-picker') }, _react.default.createElement("div", { className: (0, _styles.datepickerClass)('title') }, index !== undefined && (0, _locale.getLocale)('pickerTitle')[index]), _react.default.createElement("div", { className: (0, _styles.datepickerClass)('header') }, _react.default.createElement(_Icon.default, { name: "AngleDoubleLeft", className: "left", disabled: !!(min && _utils.default.compareYear(current, min, 1, this.getOptions()) === -1), onClick: this.handlePrevYear }), _react.default.createElement(_Icon.default, { name: "AngleLeft", className: "left", disabled: !!(min && _utils.default.compareMonth(current, min, 0, this.getOptions()) <= 0), onClick: this.handlePrevMonth }), _react.default.createElement("span", { className: (0, _styles.datepickerClass)('ym') }, _react.default.createElement("span", { onClick: this.handleYearMode }, _utils.default.getDateInfo(current, 'year', this.getOptions())), _react.default.createElement("span", { onClick: this.handleMonthMode }, (0, _locale.getLocale)('monthValues.short')[_utils.default.getDateInfo(current, 'month', this.getOptions())])), _react.default.createElement(_Icon.default, { name: "AngleRight", className: "right", onClick: this.handleNextMonth }), _react.default.createElement(_Icon.default, { onClick: this.handleNextYear, name: "AngleDoubleRight", className: "right" })), _react.default.createElement("div", { className: (0, _styles.datepickerClass)('week') }, (0, _locale.getLocale)('weekdayValues.narrow').map(function (w) { return _react.default.createElement("span", { key: w }, w); })), _react.default.createElement("div", { className: (0, _styles.datepickerClass)('list') }, days.map(function (d) { return _this2.renderDay(d, minDate, maxDate); })), _react.default.createElement("div", { style: { flex: 1 } }), this.renderTimepicker()); }; return Day; }(_component.PureComponent); var _default = Day; exports.default = _default;