UNPKG

@alifd/next

Version:

A configurable component library for web built on React.

674 lines (673 loc) 41.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var react_1 = tslib_1.__importStar(require("react")); var prop_types_1 = tslib_1.__importDefault(require("prop-types")); var react_lifecycles_compat_1 = require("react-lifecycles-compat"); var classnames_1 = tslib_1.__importDefault(require("classnames")); var moment_1 = tslib_1.__importDefault(require("moment")); var config_provider_1 = tslib_1.__importDefault(require("../config-provider")); var overlay_1 = tslib_1.__importDefault(require("../overlay")); var input_1 = tslib_1.__importDefault(require("../input")); var icon_1 = tslib_1.__importDefault(require("../icon")); var calendar_1 = tslib_1.__importDefault(require("../calendar")); var range_calendar_1 = tslib_1.__importDefault(require("../calendar/range-calendar")); var panel_1 = tslib_1.__importDefault(require("../time-picker/panel")); var zh_cn_1 = tslib_1.__importDefault(require("../locale/zh-cn")); var util_1 = require("../util"); var util_2 = require("./util"); var panel_footer_1 = tslib_1.__importDefault(require("./module/panel-footer")); var Popup = overlay_1.default.Popup; function mapInputStateName(name) { return { startValue: 'startDateInputStr', endValue: 'endDateInputStr', startTime: 'startTimeInputStr', endTime: 'endTimeInputStr', }[name]; } function mapTimeToValue(name) { return { startTime: 'startValue', endTime: 'endValue', }[name]; } function getFormatValues(values, format) { if (!Array.isArray(values)) { return [null, null]; } return [(0, util_2.formatDateValue)(values[0], format), (0, util_2.formatDateValue)(values[1], format)]; } /** * DatePicker.RangePicker */ var RangePicker = /** @class */ (function (_super) { tslib_1.__extends(RangePicker, _super); function RangePicker(props) { var _this = _super.call(this, props) || this; _this.startDateInputRef = (0, react_1.createRef)(); _this.endDateInputRef = (0, react_1.createRef)(); _this.autoSwitchDateInput = false; _this.onValueChange = function (values, handler) { if (handler === void 0) { handler = 'onChange'; } var ret; if (!values.length || !_this.state.inputAsString) { ret = values; } else { ret = [ values[0] ? values[0].format(_this.state.dateTimeFormat) : null, values[1] ? values[1].format(_this.state.dateTimeFormat) : null, ]; } _this.props[handler](ret); }; _this.onSelectCalendarPanel = function (value, active) { var _a = _this.props, showTime = _a.showTime, resetTime = _a.resetTime; var _b = _this.state, prevActiveDateInput = _b.activeDateInput, prevStartValue = _b.startValue, prevEndValue = _b.endValue, timeFormat = _b.timeFormat; var newState = { activeDateInput: active || prevActiveDateInput, inputing: false, }; var newValue = value; switch (active || prevActiveDateInput) { case 'startValue': { if (!prevEndValue || _this.autoSwitchDateInput) { newState.activeDateInput = 'endValue'; } if (showTime) { if (!prevStartValue) { // 第一次选择,如果设置了时间默认值,则使用该默认时间 if (typeof showTime === 'object' && showTime.defaultValue) { var defaultTimeValue = (0, util_2.formatDateValue)(Array.isArray(showTime.defaultValue) ? showTime.defaultValue[0] : showTime.defaultValue, timeFormat); newValue = (0, util_2.resetValueTime)(value, defaultTimeValue); } } else if (!resetTime) { // 非第一次选择,如果开启了 resetTime,则记住之前选择的时间值 newValue = (0, util_2.resetValueTime)(value, prevStartValue); } } newState.startValue = newValue; // 如果起始日期大于结束日期 if (prevEndValue && newValue.valueOf() > prevEndValue.valueOf()) { // 将结束日期设置为起始日期 如果需要的话保留时间 newState.endValue = resetTime ? newValue : (0, util_2.resetValueTime)(value, prevEndValue); // 如果结束日期不大于起始日期则将结束日期设置为等于开始日期 if (newState.endValue.valueOf() < newState.startValue.valueOf()) { newState.endValue = (0, moment_1.default)(newState.startValue); } newState.activeDateInput = 'endValue'; } break; } case 'endValue': if (!prevStartValue || _this.autoSwitchDateInput) { newState.activeDateInput = 'startValue'; } if (showTime) { if (!prevEndValue) { // 第一次选择,如果设置了时间默认值,则使用该默认时间 if (typeof showTime === 'object' && showTime.defaultValue) { var defaultTimeValue = (0, util_2.formatDateValue)(Array.isArray(showTime.defaultValue) ? showTime.defaultValue[1] || showTime.defaultValue[0] : showTime.defaultValue, timeFormat); newValue = (0, util_2.resetValueTime)(value, defaultTimeValue); } } else if (!resetTime) { // 非第一次选择,如果开启了 resetTime ,则记住之前选择的时间值 newValue = (0, util_2.resetValueTime)(value, prevEndValue); } } newState.endValue = newValue; // 选择了一个比开始日期更小的结束日期,此时表示用户重新选择了 if (prevStartValue && newValue.valueOf() <= prevStartValue.valueOf()) { newState.startValue = resetTime ? value : (0, util_2.resetValueTime)(value, prevStartValue); newState.endValue = resetTime ? value : (0, util_2.resetValueTime)(value, prevEndValue); // 如果结束日期不大于起始日期则将结束日期设置为等于开始日期 if (newState.endValue.valueOf() < newState.startValue.valueOf()) { newState.endValue = (0, moment_1.default)(newState.startValue); } } break; } var newStartValue = 'startValue' in newState ? newState.startValue : prevStartValue; var newEndValue = 'endValue' in newState ? newState.endValue : prevEndValue; // 每当 input 发生了自动切换,则关闭自动切换 if (newState.activeDateInput !== prevActiveDateInput) { _this.autoSwitchDateInput = false; } // 受控状态选择不更新值 if ('value' in _this.props) { delete newState.startValue; delete newState.endValue; } _this.setState(newState); _this.onValueChange([newStartValue, newEndValue]); }; _this.clearRange = function () { _this.setState({ startDateInputStr: '', endDateInputStr: '', startTimeInputStr: '', endTimeInputStr: '', }); if (!('value' in _this.props)) { _this.setState({ startValue: null, endValue: null, }); } _this.onValueChange([]); }; _this.onDateInputChange = function (inputStr, e, eventType) { var _a; if (eventType === 'clear' || !inputStr) { e.stopPropagation(); _this.clearRange(); } else { var stateName = mapInputStateName(_this.state.activeDateInput); _this.setState((_a = {}, _a[stateName] = inputStr, _a.inputing = _this.state.activeDateInput, _a)); } }; _this.onDateInputBlur = function () { var _a; var resetTime = _this.props.resetTime; var activeDateInput = _this.state.activeDateInput; var stateName = mapInputStateName(activeDateInput); var dateInputStr = _this.state[stateName]; if (dateInputStr) { var _b = _this.props, format = _b.format, disabledDate = _b.disabledDate; var parsed = (0, moment_1.default)(dateInputStr, format, true); _this.setState((_a = {}, _a[stateName] = '', _a.inputing = false, _a)); if (parsed.isValid() && !disabledDate(parsed, 'date')) { var valueName = activeDateInput; var newValue = resetTime ? parsed : (0, util_2.resetValueTime)(parsed, _this.state[activeDateInput]); _this.handleChange(valueName, newValue); } } }; _this.onDateInputKeyDown = function (e) { var type = _this.props.type; var _a = _this.state, activeDateInput = _a.activeDateInput, format = _a.format; var stateName = mapInputStateName(activeDateInput); var dateInputStr = _this.state[stateName]; var dateStr = (0, util_2.onDateKeydown)(e, { format: format, value: _this.state[activeDateInput], dateInputStr: dateInputStr, }, type === 'date' ? 'day' : type); if (!dateStr) return; // @ts-expect-error 应该传入 e return _this.onDateInputChange(dateStr); }; _this.onFocusDateInput = function (type) { if (type !== _this.state.activeDateInput) { _this.setState({ activeDateInput: type, }); } if (_this.state.panel !== util_2.PANEL.DATE) { _this.setState({ panel: util_2.PANEL.DATE, }); } }; _this.onFocusTimeInput = function (type) { if (type !== _this.state.activeDateInput) { _this.setState({ activeDateInput: type, }); } if (_this.state.panel !== util_2.PANEL.TIME) { _this.setState({ panel: util_2.PANEL.TIME, }); } }; _this.onSelectStartTime = function (value) { if (!('value' in _this.props)) { _this.setState({ startValue: value, inputing: false, activeDateInput: 'startTime', }); } // @ts-expect-error 未考虑 startValue 为 null 的情况 if (value.valueOf() !== _this.state.startValue.valueOf()) { _this.onValueChange([value, _this.state.endValue]); } }; _this.onSelectEndTime = function (value) { if (!('value' in _this.props)) { _this.setState({ endValue: value, inputing: false, activeDateInput: 'endTime', }); } // @ts-expect-error 未考虑 endValue 为 null 的情况 if (value.valueOf() !== _this.state.endValue.valueOf()) { _this.onValueChange([_this.state.startValue, value]); } }; _this.onTimeInputChange = function (inputStr) { var _a; var stateName = mapInputStateName(_this.state.activeDateInput); _this.setState((_a = {}, _a[stateName] = inputStr, _a.inputing = _this.state.activeDateInput, _a)); }; _this.onTimeInputBlur = function () { var _a; var stateName = mapInputStateName(_this.state.activeDateInput); var timeInputStr = _this.state[stateName]; var parsed = (0, moment_1.default)(timeInputStr, _this.state.timeFormat, true); _this.setState((_a = {}, _a[stateName] = '', _a.inputing = false, _a)); if (parsed.isValid()) { var hour = parsed.hour(); var minute = parsed.minute(); var second = parsed.second(); var valueName = mapTimeToValue(_this.state.activeDateInput); // @ts-expect-error 未考虑 startValue 为 null 的情况 var newValue = _this.state[valueName] .clone() .hour(hour) .minute(minute) .second(second); _this.handleChange(valueName, newValue); } }; _this.onTimeInputKeyDown = function (e) { var showTime = _this.props.showTime; var _a = _this.state, activeDateInput = _a.activeDateInput, timeFormat = _a.timeFormat; var stateName = mapInputStateName(activeDateInput); var timeInputStr = _this.state[stateName]; var _b = typeof showTime === 'object' ? showTime : {}, disabledMinutes = _b.disabledMinutes, disabledSeconds = _b.disabledSeconds, _c = _b.hourStep, hourStep = _c === void 0 ? 1 : _c, _d = _b.minuteStep, minuteStep = _d === void 0 ? 1 : _d, _e = _b.secondStep, secondStep = _e === void 0 ? 1 : _e; var unit = 'second'; if (disabledSeconds) { unit = disabledMinutes ? 'hour' : 'minute'; } var timeStr = (0, util_2.onTimeKeydown)(e, { format: timeFormat, timeInputStr: timeInputStr, value: _this.state[activeDateInput.indexOf('start') ? 'startValue' : 'endValue'], steps: { hour: hourStep, minute: minuteStep, second: secondStep, }, }, unit); if (!timeStr) return; _this.onTimeInputChange(timeStr); }; _this.handleChange = function (valueName, newValue) { var _a; var values = ['startValue', 'endValue'].map(function (name) { return valueName === name ? newValue : _this.state[name]; }); // 判断起始时间是否大于结束时间 if (values[0] && values[1] && values[0].valueOf() > values[1].valueOf()) { return; } if (!('value' in _this.props)) { _this.setState((_a = {}, _a[valueName] = newValue, _a)); } _this.onValueChange(values); }; _this.onVisibleChange = function (visible, type) { if (!('visible' in _this.props)) { _this.setState({ visible: visible, }); } _this.props.onVisibleChange(visible, type); }; _this.changePanel = function (panel) { var _a = _this.state, startValue = _a.startValue, endValue = _a.endValue; _this.setState({ panel: panel, activeDateInput: panel === util_2.PANEL.DATE ? !!startValue && !endValue ? 'endValue' : 'startValue' : 'startTime', }); }; _this.onOk = function (value) { _this.onVisibleChange(false, 'okBtnClick'); _this.onValueChange(value || [_this.state.startValue, _this.state.endValue], 'onOk'); }; // 如果用户没有给定时间禁用逻辑,则给默认到禁用逻辑 _this.getDisabledTime = function (_a) { var startValue = _a.startValue, endValue = _a.endValue; var _b = (_this.props.showTime || {}), disabledHours = _b.disabledHours, disabledMinutes = _b.disabledMinutes, disabledSeconds = _b.disabledSeconds; var disabledTime = {}; if (startValue && endValue) { var isSameDay_1 = startValue.format('L') === endValue.format('L'); var newDisabledHours = (0, util_2.isFunction)(disabledHours) ? disabledHours : function (index) { if (isSameDay_1 && index < startValue.hour()) { return true; } }; var newDisabledMinutes = (0, util_2.isFunction)(disabledMinutes) ? disabledMinutes : function (index) { if (isSameDay_1 && startValue.hour() === endValue.hour() && index < startValue.minute()) { return true; } }; var newDisabledSeconds = (0, util_2.isFunction)(disabledSeconds) ? disabledSeconds : function (index) { if (isSameDay_1 && startValue.hour() === endValue.hour() && startValue.minute() === endValue.minute() && index < startValue.second()) { return true; } }; disabledTime = { disabledHours: newDisabledHours, disabledMinutes: newDisabledMinutes, disabledSeconds: newDisabledSeconds, }; } return disabledTime; }; _this.enableAutoSwitchDateInput = function () { _this.autoSwitchDateInput = true; }; _this.afterOpen = function () { // autoFocus 逻辑手动处理 switch (_this.state.activeDateInput) { case 'startValue': { if (_this.startDateInputRef.current) { _this.startDateInputRef.current.getInstance().focus(); } break; } case 'endValue': { if (_this.endDateInputRef.current) { _this.endDateInputRef.current.getInstance().focus(); } break; } } }; var _a = (0, util_2.getDateTimeFormat)(props.format, props.showTime, props.type), format = _a.format, timeFormat = _a.timeFormat, dateTimeFormat = _a.dateTimeFormat; var val = props.value || props.defaultValue; var values = getFormatValues(val, dateTimeFormat); _this.state = { visible: props.visible || props.defaultVisible, startValue: values[0], endValue: values[1], startDateInputStr: '', endDateInputStr: '', activeDateInput: 'startValue', startTimeInputStr: '', endTimeInputStr: '', inputing: false, // 当前是否处于输入状态 panel: util_2.PANEL.DATE, format: format, timeFormat: timeFormat, dateTimeFormat: dateTimeFormat, inputAsString: val && (typeof val[0] === 'string' || typeof val[1] === 'string'), }; return _this; } RangePicker.getDerivedStateFromProps = function (props) { var formatStates = (0, util_2.getDateTimeFormat)(props.format, props.showTime, props.type); var states = {}; if ('value' in props) { var values = getFormatValues(props.value, formatStates.dateTimeFormat); states.startValue = values[0]; states.endValue = values[1]; if (props.value && (typeof props.value[0] === 'string' || typeof props.value[1] === 'string')) { states.inputAsString = true; } if (props.value && (moment_1.default.isMoment(props.value[0]) || moment_1.default.isMoment(props.value[1]))) { states.inputAsString = false; } } if ('visible' in props) { states.visible = props.visible; } return tslib_1.__assign(tslib_1.__assign({}, states), formatStates); }; RangePicker.prototype.renderPreview = function (_a, others) { var _b = tslib_1.__read(_a, 2), startValue = _b[0], endValue = _b[1]; var _c = this.props, prefix = _c.prefix, className = _c.className, renderPreview = _c.renderPreview; var dateTimeFormat = this.state.dateTimeFormat; var previewCls = (0, classnames_1.default)(className, "".concat(prefix, "form-preview")); var startLabel = startValue ? startValue.format(dateTimeFormat) : ''; var endLabel = endValue ? endValue.format(dateTimeFormat) : ''; if (typeof renderPreview === 'function') { return (react_1.default.createElement("div", tslib_1.__assign({}, others, { className: previewCls }), renderPreview([startValue, endValue], this.props))); } return (react_1.default.createElement("p", tslib_1.__assign({}, others, { className: previewCls }), startLabel, " - ", endLabel)); }; RangePicker.prototype.render = function () { var _a, _b, _c, _d, _e, _f, _g, _h; var _this = this; var _j = this.props, prefix = _j.prefix, rtl = _j.rtl, type = _j.type, defaultVisibleMonth = _j.defaultVisibleMonth, onVisibleMonthChange = _j.onVisibleMonthChange, showTime = _j.showTime, disabledDate = _j.disabledDate, footerRender = _j.footerRender, label = _j.label, _k = _j.ranges, ranges = _k === void 0 ? {} : _k, // 兼容 0.x ranges 属性 inputState = _j.state, size = _j.size, disabled = _j.disabled, hasClear = _j.hasClear, popupTriggerType = _j.popupTriggerType, popupAlign = _j.popupAlign, popupContainer = _j.popupContainer, popupStyle = _j.popupStyle, popupClassName = _j.popupClassName, popupProps = _j.popupProps, popupComponent = _j.popupComponent, popupContent = _j.popupContent, followTrigger = _j.followTrigger, className = _j.className, locale = _j.locale, inputProps = _j.inputProps, dateCellRender = _j.dateCellRender, monthCellRender = _j.monthCellRender, yearCellRender = _j.yearCellRender, startDateInputAriaLabel = _j.startDateInputAriaLabel, startTimeInputAriaLabel = _j.startTimeInputAriaLabel, endDateInputAriaLabel = _j.endDateInputAriaLabel, endTimeInputAriaLabel = _j.endTimeInputAriaLabel, isPreview = _j.isPreview, disableChangeMode = _j.disableChangeMode, yearRange = _j.yearRange, placeholder = _j.placeholder, others = tslib_1.__rest(_j, ["prefix", "rtl", "type", "defaultVisibleMonth", "onVisibleMonthChange", "showTime", "disabledDate", "footerRender", "label", "ranges", "state", "size", "disabled", "hasClear", "popupTriggerType", "popupAlign", "popupContainer", "popupStyle", "popupClassName", "popupProps", "popupComponent", "popupContent", "followTrigger", "className", "locale", "inputProps", "dateCellRender", "monthCellRender", "yearCellRender", "startDateInputAriaLabel", "startTimeInputAriaLabel", "endDateInputAriaLabel", "endTimeInputAriaLabel", "isPreview", "disableChangeMode", "yearRange", "placeholder"]); var state = this.state; var classNames = (0, classnames_1.default)((_a = {}, _a["".concat(prefix, "range-picker")] = true, _a["".concat(prefix).concat(size)] = size, _a["".concat(prefix, "disabled")] = disabled, _a), className); var panelBodyClassName = (0, classnames_1.default)((_b = {}, _b["".concat(prefix, "range-picker-body")] = true, _b["".concat(prefix, "range-picker-body-show-time")] = showTime, _b)); var triggerCls = (0, classnames_1.default)((_c = {}, _c["".concat(prefix, "range-picker-trigger")] = true, _c["".concat(prefix, "error")] = inputState === 'error', _c)); var startDateInputCls = (0, classnames_1.default)((_d = {}, _d["".concat(prefix, "range-picker-panel-input-start-date")] = true, _d["".concat(prefix, "focus")] = state.activeDateInput === 'startValue', _d)); var endDateInputCls = (0, classnames_1.default)((_e = {}, _e["".concat(prefix, "range-picker-panel-input-end-date")] = true, _e["".concat(prefix, "focus")] = state.activeDateInput === 'endValue', _e)); if (rtl) { others.dir = 'rtl'; } if (isPreview) { return this.renderPreview([state.startValue, state.endValue], // @ts-expect-error 应为 propTypes util_1.obj.pickOthers(others, RangePicker.PropTypes)); } var startDateInputValue = state.inputing === 'startValue' ? state.startDateInputStr : (state.startValue && state.startValue.format(state.format)) || ''; var endDateInputValue = state.inputing === 'endValue' ? state.endDateInputStr : (state.endValue && state.endValue.format(state.format)) || ''; var startTriggerValue = startDateInputValue; var endTriggerValue = endDateInputValue; var sharedInputProps = tslib_1.__assign(tslib_1.__assign({}, inputProps), { size: size, disabled: disabled, onChange: this.onDateInputChange, onBlur: this.onDateInputBlur, onPressEnter: this.onDateInputBlur, onKeyDown: this.onDateInputKeyDown }); var startDateInput = (react_1.default.createElement(input_1.default, tslib_1.__assign({}, sharedInputProps, { "aria-label": startDateInputAriaLabel, placeholder: state.format, value: startDateInputValue, onFocus: function () { return _this.onFocusDateInput('startValue'); }, className: startDateInputCls, ref: this.startDateInputRef, onClick: util_1.func.makeChain(this.enableAutoSwitchDateInput, sharedInputProps.onClick) }))); var endDateInput = (react_1.default.createElement(input_1.default, tslib_1.__assign({}, sharedInputProps, { "aria-label": endDateInputAriaLabel, placeholder: state.format, value: endDateInputValue, onFocus: function () { return _this.onFocusDateInput('endValue'); }, className: endDateInputCls, ref: this.endDateInputRef, onClick: util_1.func.makeChain(this.enableAutoSwitchDateInput, sharedInputProps.onClick) }))); var shareCalendarProps = { showOtherMonth: true, dateCellRender: dateCellRender, monthCellRender: monthCellRender, yearCellRender: yearCellRender, format: state.format, defaultVisibleMonth: defaultVisibleMonth, onVisibleMonthChange: onVisibleMonthChange, }; var datePanel = type === 'date' ? (react_1.default.createElement(range_calendar_1.default, tslib_1.__assign({}, shareCalendarProps, { yearRange: yearRange, disableChangeMode: disableChangeMode, disabledDate: disabledDate, onSelect: this.onSelectCalendarPanel, startValue: state.startValue, endValue: state.endValue }))) : (react_1.default.createElement("div", { className: "".concat(prefix, "range-picker-panel-body") }, react_1.default.createElement(calendar_1.default, tslib_1.__assign({ shape: "panel", modes: type === 'month' ? ['month', 'year'] : ['year'] }, shareCalendarProps, { disabledDate: function (date) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } return ((state.endValue && date.isAfter(state.endValue, type)) || (disabledDate && disabledDate.apply(void 0, tslib_1.__spreadArray([date], tslib_1.__read(args), false)))); }, onSelect: function (value) { var selectedValue = value.clone().date(1).hour(0).minute(0).second(0); if (type === 'year') { selectedValue.month(0); } _this.onSelectCalendarPanel(selectedValue, 'startValue'); }, value: state.startValue })), react_1.default.createElement(calendar_1.default, tslib_1.__assign({ shape: "panel", modes: type === 'month' ? ['month', 'year'] : ['year'] }, shareCalendarProps, { disabledDate: function (date) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } return ((state.startValue && date.isBefore(state.startValue, type)) || (disabledDate && disabledDate.apply(void 0, tslib_1.__spreadArray([date], tslib_1.__read(args), false)))); }, onSelect: function (value) { var selectedValue = value.clone().hour(23).minute(59).second(59); if (type === 'year') { selectedValue.month(11).date(31); } else { selectedValue.date(selectedValue.daysInMonth()); } _this.onSelectCalendarPanel(selectedValue, 'endValue'); }, value: state.endValue })))); var startTimeInput = null; var endTimeInput = null; var timePanel = null; var panelFooter = footerRender(); if (showTime) { var startTimeInputValue = state.inputing === 'startTime' ? state.startTimeInputStr : (state.startValue && state.startValue.format(state.timeFormat)) || ''; var endTimeInputValue = state.inputing === 'endTime' ? state.endTimeInputStr : (state.endValue && state.endValue.format(state.timeFormat)) || ''; startTriggerValue = (state.startValue && state.startValue.format(state.dateTimeFormat)) || ''; endTriggerValue = (state.endValue && state.endValue.format(state.dateTimeFormat)) || ''; var sharedTimeInputProps = { size: size, placeholder: state.timeFormat, onFocus: this.onFocusTimeInput, onBlur: this.onTimeInputBlur, onPressEnter: this.onTimeInputBlur, onChange: this.onTimeInputChange, onKeyDown: this.onTimeInputKeyDown, }; var startTimeInputCls = (0, classnames_1.default)((_f = {}, _f["".concat(prefix, "range-picker-panel-input-start-time")] = true, _f["".concat(prefix, "focus")] = state.activeDateInput === 'startTime', _f)); startTimeInput = (react_1.default.createElement(input_1.default, tslib_1.__assign({}, sharedTimeInputProps, { value: startTimeInputValue, "aria-label": startTimeInputAriaLabel, disabled: disabled || !state.startValue, onFocus: function () { return _this.onFocusTimeInput('startTime'); }, className: startTimeInputCls }))); var endTimeInputCls = (0, classnames_1.default)((_g = {}, _g["".concat(prefix, "range-picker-panel-input-end-time")] = true, _g["".concat(prefix, "focus")] = state.activeDateInput === 'endTime', _g)); endTimeInput = (react_1.default.createElement(input_1.default, tslib_1.__assign({}, sharedTimeInputProps, { value: endTimeInputValue, "aria-label": endTimeInputAriaLabel, disabled: disabled || !state.endValue, onFocus: function () { return _this.onFocusTimeInput('endTime'); }, className: endTimeInputCls }))); var showSecond = state.timeFormat.indexOf('s') > -1; var showMinute = state.timeFormat.indexOf('m') > -1; var sharedTimePickerProps = tslib_1.__assign(tslib_1.__assign({}, showTime), { prefix: prefix, locale: locale, disabled: disabled, showSecond: showSecond, showMinute: showMinute }); var disabledTime = this.getDisabledTime(state); timePanel = (react_1.default.createElement("div", { className: "".concat(prefix, "range-picker-panel-time") }, react_1.default.createElement(panel_1.default, tslib_1.__assign({}, sharedTimePickerProps, { disabled: disabled || !state.startValue, className: "".concat(prefix, "range-picker-panel-time-start"), value: state.startValue, onSelect: this.onSelectStartTime })), react_1.default.createElement(panel_1.default, tslib_1.__assign({}, sharedTimePickerProps, disabledTime, { disabled: disabled || !state.endValue, className: "".concat(prefix, "range-picker-panel-time-end"), value: state.endValue, onSelect: this.onSelectEndTime })))); } panelFooter = panelFooter || (react_1.default.createElement(panel_footer_1.default, { prefix: prefix, value: state.startValue || state.endValue, ranges: Object.keys(ranges).map(function (key) { return ({ label: key, value: ranges[key], onChange: function (values) { _this.setState({ startValue: values[0], endValue: values[1], }); _this.onValueChange(values); }, }); }), disabledOk: !state.startValue || !state.endValue || state.startValue.valueOf() > state.endValue.valueOf(), locale: locale, panel: state.panel, onPanelChange: showTime ? this.changePanel : null, onOk: this.onOk })); var panelBody = (_h = {}, _h[util_2.PANEL.DATE] = datePanel, _h[util_2.PANEL.TIME] = timePanel, _h)[state.panel]; var allowClear = (state.startValue || state.endValue) && hasClear; var _l = tslib_1.__read(placeholder || [], 2), startPlaceholder = _l[0], endPlaceholder = _l[1]; if (typeof placeholder === 'string') { startPlaceholder = placeholder; endPlaceholder = placeholder; } var trigger = (react_1.default.createElement("div", { className: triggerCls }, react_1.default.createElement(input_1.default, tslib_1.__assign({}, sharedInputProps, { readOnly: true, role: "combobox", "aria-expanded": state.visible, label: label, placeholder: startPlaceholder || locale.startPlaceholder, value: startTriggerValue, hasBorder: false, className: "".concat(prefix, "range-picker-trigger-input"), onFocus: function () { return _this.onFocusDateInput('startValue'); } })), react_1.default.createElement("span", { className: "".concat(prefix, "range-picker-trigger-separator") }, "-"), react_1.default.createElement(input_1.default, tslib_1.__assign({}, sharedInputProps, { readOnly: true, role: "combobox", "aria-expanded": state.visible, placeholder: endPlaceholder || locale.endPlaceholder, value: endTriggerValue, hasBorder: false, className: "".concat(prefix, "range-picker-trigger-input"), onFocus: function () { return _this.onFocusDateInput('endValue'); }, // @ts-expect-error allowClear 应先进行 boolean 转换 hasClear: allowClear, hint: react_1.default.createElement(icon_1.default, { type: "calendar", className: "".concat(prefix, "date-picker-symbol-calendar-icon") }) })))); var PopupComponent = popupComponent ? popupComponent : Popup; return (react_1.default.createElement("div", tslib_1.__assign({}, util_1.obj.pickOthers(RangePicker.propTypes, others), { className: classNames }), react_1.default.createElement(PopupComponent, tslib_1.__assign({ align: popupAlign }, popupProps, { followTrigger: followTrigger, disabled: disabled, visible: state.visible, onVisibleChange: this.onVisibleChange, beforeOpen: util_1.func.makeChain(this.enableAutoSwitchDateInput, popupProps && popupProps.beforeOpen), afterOpen: util_1.func.makeChain(this.afterOpen, popupProps && popupProps.afterOpen), triggerType: popupTriggerType, container: popupContainer, style: popupStyle, className: popupClassName, trigger: trigger }), popupContent ? (popupContent) : (react_1.default.createElement("div", { dir: others.dir, className: panelBodyClassName }, react_1.default.createElement("div", { className: "".concat(prefix, "range-picker-panel-header") }, react_1.default.createElement("div", { className: "".concat(prefix, "range-picker-panel-input") }, startDateInput, startTimeInput, react_1.default.createElement("span", { className: "".concat(prefix, "range-picker-panel-input-separator") }, "-"), endDateInput, endTimeInput)), panelBody, panelFooter))))); }; RangePicker.displayName = 'RangePicker'; RangePicker.propTypes = tslib_1.__assign(tslib_1.__assign({}, config_provider_1.default.propTypes), { prefix: prop_types_1.default.string, rtl: prop_types_1.default.bool, type: prop_types_1.default.oneOf(['date', 'month', 'year']), defaultVisibleMonth: prop_types_1.default.func, onVisibleMonthChange: prop_types_1.default.func, value: prop_types_1.default.array, defaultValue: prop_types_1.default.array, format: prop_types_1.default.string, showTime: prop_types_1.default.oneOfType([prop_types_1.default.object, prop_types_1.default.bool]), resetTime: prop_types_1.default.bool, disabledDate: prop_types_1.default.func, footerRender: prop_types_1.default.func, onChange: prop_types_1.default.func, onOk: prop_types_1.default.func, label: prop_types_1.default.node, state: prop_types_1.default.oneOf(['error', 'loading', 'success']), size: prop_types_1.default.oneOf(['small', 'medium', 'large']), disabled: prop_types_1.default.bool, hasClear: prop_types_1.default.bool, visible: prop_types_1.default.bool, defaultVisible: prop_types_1.default.bool, onVisibleChange: prop_types_1.default.func, popupTriggerType: prop_types_1.default.oneOf(['click', 'hover']), popupAlign: prop_types_1.default.string, popupContainer: prop_types_1.default.any, popupStyle: prop_types_1.default.object, popupClassName: prop_types_1.default.string, popupProps: prop_types_1.default.object, followTrigger: prop_types_1.default.bool, inputProps: prop_types_1.default.object, dateCellRender: prop_types_1.default.func, monthCellRender: prop_types_1.default.func, yearCellRender: prop_types_1.default.func, startDateInputAriaLabel: prop_types_1.default.string, startTimeInputAriaLabel: prop_types_1.default.string, endDateInputAriaLabel: prop_types_1.default.string, endTimeInputAriaLabel: prop_types_1.default.string, isPreview: prop_types_1.default.bool, renderPreview: prop_types_1.default.func, disableChangeMode: prop_types_1.default.bool, yearRange: prop_types_1.default.arrayOf(prop_types_1.default.number), ranges: prop_types_1.default.object, locale: prop_types_1.default.object, className: prop_types_1.default.string, name: prop_types_1.default.string, popupComponent: prop_types_1.default.elementType, popupContent: prop_types_1.default.node, placeholder: prop_types_1.default.oneOfType([prop_types_1.default.arrayOf(prop_types_1.default.string), prop_types_1.default.string]) }); RangePicker.defaultProps = { prefix: 'next-', rtl: false, type: 'date', size: 'medium', showTime: false, resetTime: false, disabledDate: function () { return false; }, footerRender: function () { return null; }, hasClear: true, defaultVisible: false, popupTriggerType: 'click', popupAlign: 'tl tl', locale: zh_cn_1.default.DatePicker, disableChangeMode: false, onChange: util_1.func.noop, onOk: util_1.func.noop, onVisibleChange: util_1.func.noop, }; return RangePicker; }(react_1.Component)); exports.default = (0, react_lifecycles_compat_1.polyfill)(RangePicker);