UNPKG

45.7 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _typeof2 = require('babel-runtime/helpers/typeof');
6
7var _typeof3 = _interopRequireDefault(_typeof2);
8
9var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
10
11var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
12
13var _extends2 = require('babel-runtime/helpers/extends');
14
15var _extends3 = _interopRequireDefault(_extends2);
16
17var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
18
19var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
20
21var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
22
23var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
24
25var _inherits2 = require('babel-runtime/helpers/inherits');
26
27var _inherits3 = _interopRequireDefault(_inherits2);
28
29var _class, _temp, _initialiseProps;
30
31var _react = require('react');
32
33var _react2 = _interopRequireDefault(_react);
34
35var _propTypes = require('prop-types');
36
37var _propTypes2 = _interopRequireDefault(_propTypes);
38
39var _reactLifecyclesCompat = require('react-lifecycles-compat');
40
41var _classnames8 = require('classnames');
42
43var _classnames9 = _interopRequireDefault(_classnames8);
44
45var _moment = require('moment');
46
47var _moment2 = _interopRequireDefault(_moment);
48
49var _configProvider = require('../config-provider');
50
51var _configProvider2 = _interopRequireDefault(_configProvider);
52
53var _overlay = require('../overlay');
54
55var _overlay2 = _interopRequireDefault(_overlay);
56
57var _input = require('../input');
58
59var _input2 = _interopRequireDefault(_input);
60
61var _icon = require('../icon');
62
63var _icon2 = _interopRequireDefault(_icon);
64
65var _calendar = require('../calendar');
66
67var _calendar2 = _interopRequireDefault(_calendar);
68
69var _rangeCalendar = require('../calendar/range-calendar');
70
71var _rangeCalendar2 = _interopRequireDefault(_rangeCalendar);
72
73var _panel = require('../time-picker/panel');
74
75var _panel2 = _interopRequireDefault(_panel);
76
77var _zhCn = require('../locale/zh-cn');
78
79var _zhCn2 = _interopRequireDefault(_zhCn);
80
81var _util = require('../util');
82
83var _util2 = require('./util');
84
85var _panelFooter = require('./module/panel-footer');
86
87var _panelFooter2 = _interopRequireDefault(_panelFooter);
88
89function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
90
91var Popup = _overlay2.default.Popup;
92
93
94function mapInputStateName(name) {
95 return {
96 startValue: 'startDateInputStr',
97 endValue: 'endDateInputStr',
98 startTime: 'startTimeInputStr',
99 endTime: 'endTimeInputStr'
100 }[name];
101}
102
103function mapTimeToValue(name) {
104 return {
105 startTime: 'startValue',
106 endTime: 'endValue'
107 }[name];
108}
109
110function getFormatValues(values, format) {
111 if (!Array.isArray(values)) {
112 return [null, null];
113 }
114 return [(0, _util2.formatDateValue)(values[0], format), (0, _util2.formatDateValue)(values[1], format)];
115}
116
117/**
118 * DatePicker.RangePicker
119 */
120var RangePicker = (_temp = _class = function (_Component) {
121 (0, _inherits3.default)(RangePicker, _Component);
122
123 function RangePicker(props, context) {
124 (0, _classCallCheck3.default)(this, RangePicker);
125
126 var _this = (0, _possibleConstructorReturn3.default)(this, _Component.call(this, props, context));
127
128 _initialiseProps.call(_this);
129
130 var _getDateTimeFormat = (0, _util2.getDateTimeFormat)(props.format, props.showTime, props.type),
131 format = _getDateTimeFormat.format,
132 timeFormat = _getDateTimeFormat.timeFormat,
133 dateTimeFormat = _getDateTimeFormat.dateTimeFormat;
134
135 var val = props.value || props.defaultValue;
136 var values = getFormatValues(val, dateTimeFormat);
137
138 _this.state = {
139 visible: props.visible || props.defaultVisible,
140 startValue: values[0],
141 endValue: values[1],
142 startDateInputStr: '',
143 endDateInputStr: '',
144 activeDateInput: 'startValue',
145 startTimeInputStr: '',
146 endTimeInputStr: '',
147 inputing: false, // 当前是否处于输入状态
148 panel: _util2.PANEL.DATE,
149 format: format,
150 timeFormat: timeFormat,
151 dateTimeFormat: dateTimeFormat,
152 inputAsString: val && (typeof val[0] === 'string' || typeof val[1] === 'string')
153 };
154 return _this;
155 }
156
157 RangePicker.getDerivedStateFromProps = function getDerivedStateFromProps(props) {
158 var formatStates = (0, _util2.getDateTimeFormat)(props.format, props.showTime, props.type);
159 var states = {};
160
161 if ('value' in props) {
162 var values = getFormatValues(props.value, formatStates.dateTimeFormat);
163 states.startValue = values[0];
164 states.endValue = values[1];
165 states.inputAsString = props.value && (typeof props.value[0] === 'string' || typeof props.value[1] === 'string');
166 }
167
168 if ('visible' in props) {
169 states.visible = props.visible;
170 }
171
172 return (0, _extends3.default)({}, states, formatStates);
173 };
174
175 // 如果用户没有给定时间禁用逻辑,则给默认到禁用逻辑
176
177
178 RangePicker.prototype.renderPreview = function renderPreview(_ref, others) {
179 var startValue = _ref[0],
180 endValue = _ref[1];
181 var _props = this.props,
182 prefix = _props.prefix,
183 className = _props.className,
184 renderPreview = _props.renderPreview;
185 var dateTimeFormat = this.state.dateTimeFormat;
186
187
188 var previewCls = (0, _classnames9.default)(className, prefix + 'form-preview');
189 var startLabel = startValue ? startValue.format(dateTimeFormat) : '';
190 var endLabel = endValue ? endValue.format(dateTimeFormat) : '';
191
192 if (typeof renderPreview === 'function') {
193 return _react2.default.createElement(
194 'div',
195 (0, _extends3.default)({}, others, { className: previewCls }),
196 renderPreview([startValue, endValue], this.props)
197 );
198 }
199
200 return _react2.default.createElement(
201 'p',
202 (0, _extends3.default)({}, others, { className: previewCls }),
203 startLabel,
204 ' - ',
205 endLabel
206 );
207 };
208
209 RangePicker.prototype.render = function render() {
210 var _classnames,
211 _classnames2,
212 _classnames3,
213 _classnames4,
214 _classnames5,
215 _this2 = this,
216 _PANEL$DATE$PANEL$TIM;
217
218 var _props2 = this.props,
219 prefix = _props2.prefix,
220 rtl = _props2.rtl,
221 type = _props2.type,
222 defaultVisibleMonth = _props2.defaultVisibleMonth,
223 onVisibleMonthChange = _props2.onVisibleMonthChange,
224 showTime = _props2.showTime,
225 _disabledDate = _props2.disabledDate,
226 footerRender = _props2.footerRender,
227 label = _props2.label,
228 _props2$ranges = _props2.ranges,
229 ranges = _props2$ranges === undefined ? {} : _props2$ranges,
230 inputState = _props2.state,
231 size = _props2.size,
232 disabled = _props2.disabled,
233 hasClear = _props2.hasClear,
234 popupTriggerType = _props2.popupTriggerType,
235 popupAlign = _props2.popupAlign,
236 popupContainer = _props2.popupContainer,
237 popupStyle = _props2.popupStyle,
238 popupClassName = _props2.popupClassName,
239 popupProps = _props2.popupProps,
240 popupComponent = _props2.popupComponent,
241 popupContent = _props2.popupContent,
242 followTrigger = _props2.followTrigger,
243 className = _props2.className,
244 locale = _props2.locale,
245 inputProps = _props2.inputProps,
246 dateCellRender = _props2.dateCellRender,
247 monthCellRender = _props2.monthCellRender,
248 yearCellRender = _props2.yearCellRender,
249 startDateInputAriaLabel = _props2.startDateInputAriaLabel,
250 startTimeInputAriaLabel = _props2.startTimeInputAriaLabel,
251 endDateInputAriaLabel = _props2.endDateInputAriaLabel,
252 endTimeInputAriaLabel = _props2.endTimeInputAriaLabel,
253 isPreview = _props2.isPreview,
254 disableChangeMode = _props2.disableChangeMode,
255 yearRange = _props2.yearRange,
256 placeholder = _props2.placeholder,
257 others = (0, _objectWithoutProperties3.default)(_props2, ['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']);
258
259
260 var state = this.state;
261
262 var classNames = (0, _classnames9.default)((_classnames = {}, _classnames[prefix + 'range-picker'] = true, _classnames['' + prefix + size] = size, _classnames[prefix + 'disabled'] = disabled, _classnames), className);
263
264 var panelBodyClassName = (0, _classnames9.default)((_classnames2 = {}, _classnames2[prefix + 'range-picker-body'] = true, _classnames2[prefix + 'range-picker-body-show-time'] = showTime, _classnames2));
265
266 var triggerCls = (0, _classnames9.default)((_classnames3 = {}, _classnames3[prefix + 'range-picker-trigger'] = true, _classnames3[prefix + 'error'] = inputState === 'error', _classnames3));
267
268 var startDateInputCls = (0, _classnames9.default)((_classnames4 = {}, _classnames4[prefix + 'range-picker-panel-input-start-date'] = true, _classnames4[prefix + 'focus'] = state.activeDateInput === 'startValue', _classnames4));
269
270 var endDateInputCls = (0, _classnames9.default)((_classnames5 = {}, _classnames5[prefix + 'range-picker-panel-input-end-date'] = true, _classnames5[prefix + 'focus'] = state.activeDateInput === 'endValue', _classnames5));
271
272 if (rtl) {
273 others.dir = 'rtl';
274 }
275
276 if (isPreview) {
277 return this.renderPreview([state.startValue, state.endValue], _util.obj.pickOthers(others, RangePicker.PropTypes));
278 }
279
280 var startDateInputValue = state.inputing === 'startValue' ? state.startDateInputStr : state.startValue && state.startValue.format(state.format) || '';
281 var endDateInputValue = state.inputing === 'endValue' ? state.endDateInputStr : state.endValue && state.endValue.format(state.format) || '';
282
283 var startTriggerValue = startDateInputValue;
284 var endTriggerValue = endDateInputValue;
285
286 var sharedInputProps = (0, _extends3.default)({}, inputProps, {
287 size: size,
288 disabled: disabled,
289 onChange: this.onDateInputChange,
290 onBlur: this.onDateInputBlur,
291 onPressEnter: this.onDateInputBlur,
292 onKeyDown: this.onDateInputKeyDown
293 });
294
295 var startDateInput = _react2.default.createElement(_input2.default, (0, _extends3.default)({}, sharedInputProps, {
296 'aria-label': startDateInputAriaLabel,
297 placeholder: state.format,
298 value: startDateInputValue,
299 onFocus: function onFocus() {
300 return _this2.onFocusDateInput('startValue');
301 },
302 className: startDateInputCls
303 }));
304
305 var endDateInput = _react2.default.createElement(_input2.default, (0, _extends3.default)({}, sharedInputProps, {
306 'aria-label': endDateInputAriaLabel,
307 placeholder: state.format,
308 value: endDateInputValue,
309 onFocus: function onFocus() {
310 return _this2.onFocusDateInput('endValue');
311 },
312 className: endDateInputCls
313 }));
314
315 var shareCalendarProps = {
316 showOtherMonth: true,
317 dateCellRender: dateCellRender,
318 monthCellRender: monthCellRender,
319 yearCellRender: yearCellRender,
320 format: state.format,
321 defaultVisibleMonth: defaultVisibleMonth,
322 onVisibleMonthChange: onVisibleMonthChange
323 };
324
325 var datePanel = type === 'date' ? _react2.default.createElement(_rangeCalendar2.default, (0, _extends3.default)({}, shareCalendarProps, {
326 yearRange: yearRange,
327 disableChangeMode: disableChangeMode,
328 disabledDate: _disabledDate,
329 onSelect: this.onSelectCalendarPanel,
330 startValue: state.startValue,
331 endValue: state.endValue
332 })) : _react2.default.createElement(
333 'div',
334 { className: prefix + 'range-picker-panel-body' },
335 _react2.default.createElement(_calendar2.default, (0, _extends3.default)({
336 shape: 'panel',
337 modes: type === 'month' ? ['month', 'year'] : ['year']
338 }, (0, _extends3.default)({}, shareCalendarProps), {
339 disabledDate: function disabledDate(date) {
340 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
341 args[_key - 1] = arguments[_key];
342 }
343
344 return state.endValue && date.isAfter(state.endValue, type) || _disabledDate && _disabledDate.apply(undefined, [date].concat(args));
345 },
346 onSelect: function onSelect(value) {
347 var selectedValue = value.clone().date(1).hour(0).minute(0).second(0);
348 if (type === 'year') {
349 selectedValue.month(0);
350 }
351 _this2.onSelectCalendarPanel(selectedValue, 'startValue');
352 },
353 value: state.startValue
354 })),
355 _react2.default.createElement(_calendar2.default, (0, _extends3.default)({
356 shape: 'panel',
357 modes: type === 'month' ? ['month', 'year'] : ['year']
358 }, shareCalendarProps, {
359 disabledDate: function disabledDate(date) {
360 for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
361 args[_key2 - 1] = arguments[_key2];
362 }
363
364 return state.startValue && date.isBefore(state.startValue, type) || _disabledDate && _disabledDate.apply(undefined, [date].concat(args));
365 },
366 onSelect: function onSelect(value) {
367 var selectedValue = value.clone().hour(23).minute(59).second(59);
368 if (type === 'year') {
369 selectedValue.month(11).date(31);
370 } else {
371 selectedValue.date(selectedValue.daysInMonth());
372 }
373 _this2.onSelectCalendarPanel(selectedValue, 'endValue');
374 },
375 value: state.endValue
376 }))
377 );
378
379 var startTimeInput = null;
380 var endTimeInput = null;
381 var timePanel = null;
382 var panelFooter = footerRender();
383
384 if (showTime) {
385 var _classnames6, _classnames7;
386
387 var startTimeInputValue = state.inputing === 'startTime' ? state.startTimeInputStr : state.startValue && state.startValue.format(state.timeFormat) || '';
388 var endTimeInputValue = state.inputing === 'endTime' ? state.endTimeInputStr : state.endValue && state.endValue.format(state.timeFormat) || '';
389
390 startTriggerValue = state.startValue && state.startValue.format(state.dateTimeFormat) || '';
391 endTriggerValue = state.endValue && state.endValue.format(state.dateTimeFormat) || '';
392
393 var sharedTimeInputProps = {
394 size: size,
395 placeholder: state.timeFormat,
396 onFocus: this.onFocusTimeInput,
397 onBlur: this.onTimeInputBlur,
398 onPressEnter: this.onTimeInputBlur,
399 onChange: this.onTimeInputChange,
400 onKeyDown: this.onTimeInputKeyDown
401 };
402
403 var startTimeInputCls = (0, _classnames9.default)((_classnames6 = {}, _classnames6[prefix + 'range-picker-panel-input-start-time'] = true, _classnames6[prefix + 'focus'] = state.activeDateInput === 'startTime', _classnames6));
404
405 startTimeInput = _react2.default.createElement(_input2.default, (0, _extends3.default)({}, sharedTimeInputProps, {
406 value: startTimeInputValue,
407 'aria-label': startTimeInputAriaLabel,
408 disabled: disabled || !state.startValue,
409 onFocus: function onFocus() {
410 return _this2.onFocusTimeInput('startTime');
411 },
412 className: startTimeInputCls
413 }));
414
415 var endTimeInputCls = (0, _classnames9.default)((_classnames7 = {}, _classnames7[prefix + 'range-picker-panel-input-end-time'] = true, _classnames7[prefix + 'focus'] = state.activeDateInput === 'endTime', _classnames7));
416
417 endTimeInput = _react2.default.createElement(_input2.default, (0, _extends3.default)({}, sharedTimeInputProps, {
418 value: endTimeInputValue,
419 'aria-label': endTimeInputAriaLabel,
420 disabled: disabled || !state.endValue,
421 onFocus: function onFocus() {
422 return _this2.onFocusTimeInput('endTime');
423 },
424 className: endTimeInputCls
425 }));
426
427 var showSecond = state.timeFormat.indexOf('s') > -1;
428 var showMinute = state.timeFormat.indexOf('m') > -1;
429
430 var sharedTimePickerProps = (0, _extends3.default)({}, showTime, {
431 prefix: prefix,
432 locale: locale,
433 disabled: disabled,
434 showSecond: showSecond,
435 showMinute: showMinute
436 });
437
438 var disabledTime = this.getDisabledTime(state);
439
440 timePanel = _react2.default.createElement(
441 'div',
442 { className: prefix + 'range-picker-panel-time' },
443 _react2.default.createElement(_panel2.default, (0, _extends3.default)({}, sharedTimePickerProps, {
444 disabled: disabled || !state.startValue,
445 className: prefix + 'range-picker-panel-time-start',
446 value: state.startValue,
447 onSelect: this.onSelectStartTime
448 })),
449 _react2.default.createElement(_panel2.default, (0, _extends3.default)({}, sharedTimePickerProps, disabledTime, {
450 disabled: disabled || !state.endValue,
451 className: prefix + 'range-picker-panel-time-end',
452 value: state.endValue,
453 onSelect: this.onSelectEndTime
454 }))
455 );
456 }
457
458 panelFooter = panelFooter || _react2.default.createElement(_panelFooter2.default, {
459 prefix: prefix,
460 value: state.startValue || state.endValue,
461 ranges: Object.keys(ranges).map(function (key) {
462 return {
463 label: key,
464 value: ranges[key],
465 onChange: function onChange(values) {
466 _this2.setState({
467 startValue: values[0],
468 endValue: values[1]
469 });
470 _this2.onValueChange(values);
471 }
472 };
473 }),
474 disabledOk: !state.startValue || !state.endValue || state.startValue.valueOf() > state.endValue.valueOf(),
475 locale: locale,
476 panel: state.panel,
477 onPanelChange: showTime ? this.changePanel : null,
478 onOk: this.onOk
479 });
480
481 var panelBody = (_PANEL$DATE$PANEL$TIM = {}, _PANEL$DATE$PANEL$TIM[_util2.PANEL.DATE] = datePanel, _PANEL$DATE$PANEL$TIM[_util2.PANEL.TIME] = timePanel, _PANEL$DATE$PANEL$TIM)[state.panel];
482
483 var allowClear = state.startValue && state.endValue && hasClear;
484
485 var _ref2 = placeholder || [],
486 startPlaceholder = _ref2[0],
487 endPlaceholder = _ref2[1];
488
489 if (typeof placeholder === 'string') {
490 startPlaceholder = placeholder;
491 endPlaceholder = placeholder;
492 }
493
494 var trigger = _react2.default.createElement(
495 'div',
496 { className: triggerCls },
497 _react2.default.createElement(_input2.default, (0, _extends3.default)({}, sharedInputProps, {
498 readOnly: true,
499 role: 'combobox',
500 'aria-expanded': state.visible,
501 label: label,
502 placeholder: startPlaceholder || locale.startPlaceholder,
503 value: startTriggerValue,
504 hasBorder: false,
505 className: prefix + 'range-picker-trigger-input',
506 onFocus: function onFocus() {
507 return _this2.onFocusDateInput('startValue');
508 }
509 })),
510 _react2.default.createElement(
511 'span',
512 { className: prefix + 'range-picker-trigger-separator' },
513 '-'
514 ),
515 _react2.default.createElement(_input2.default, (0, _extends3.default)({}, sharedInputProps, {
516 readOnly: true,
517 role: 'combobox',
518 'aria-expanded': state.visible,
519 placeholder: endPlaceholder || locale.endPlaceholder,
520 value: endTriggerValue,
521 hasBorder: false,
522 className: prefix + 'range-picker-trigger-input',
523 onFocus: function onFocus() {
524 return _this2.onFocusDateInput('endValue');
525 },
526 hasClear: allowClear,
527 hint: _react2.default.createElement(_icon2.default, { type: 'calendar', className: prefix + 'date-picker-symbol-calendar-icon' })
528 }))
529 );
530
531 var PopupComponent = popupComponent ? popupComponent : Popup;
532
533 return _react2.default.createElement(
534 'div',
535 (0, _extends3.default)({}, _util.obj.pickOthers(RangePicker.propTypes, others), { className: classNames }),
536 _react2.default.createElement(
537 PopupComponent,
538 (0, _extends3.default)({
539 autoFocus: true,
540 align: popupAlign
541 }, popupProps, {
542 followTrigger: followTrigger,
543 disabled: disabled,
544 visible: state.visible,
545 onVisibleChange: this.onVisibleChange,
546 triggerType: popupTriggerType,
547 container: popupContainer,
548 style: popupStyle,
549 className: popupClassName,
550 trigger: trigger
551 }),
552 popupContent ? popupContent : _react2.default.createElement(
553 'div',
554 { dir: others.dir, className: panelBodyClassName },
555 _react2.default.createElement(
556 'div',
557 { className: prefix + 'range-picker-panel-header' },
558 _react2.default.createElement(
559 'div',
560 { className: prefix + 'range-picker-panel-input' },
561 startDateInput,
562 startTimeInput,
563 _react2.default.createElement(
564 'span',
565 { className: prefix + 'range-picker-panel-input-separator' },
566 '-'
567 ),
568 endDateInput,
569 endTimeInput
570 )
571 ),
572 panelBody,
573 panelFooter
574 )
575 )
576 );
577 };
578
579 return RangePicker;
580}(_react.Component), _class.propTypes = (0, _extends3.default)({}, _configProvider2.default.propTypes, {
581 prefix: _propTypes2.default.string,
582 rtl: _propTypes2.default.bool,
583 /**
584 * 日期范围类型
585 */
586 type: _propTypes2.default.oneOf(['date', 'month', 'year']),
587 /**
588 * 默认展示的起始月份
589 * @return {MomentObject} 返回包含指定月份的 moment 对象实例
590 */
591 defaultVisibleMonth: _propTypes2.default.func,
592 onVisibleMonthChange: _propTypes2.default.func,
593 /**
594 * 日期范围值数组 [moment, moment]
595 */
596 value: _propTypes2.default.array,
597 /**
598 * 初始的日期范围值数组 [moment, moment]
599 */
600 defaultValue: _propTypes2.default.array,
601 /**
602 * 日期格式
603 */
604 format: _propTypes2.default.string,
605 /**
606 * 是否使用时间控件,支持传入 TimePicker 的属性
607 */
608 showTime: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.bool]),
609 /**
610 * 每次选择是否重置时间(仅在 showTime 开启时有效)
611 */
612 resetTime: _propTypes2.default.bool,
613 /**
614 * 禁用日期函数
615 * @param {MomentObject} 日期值
616 * @param {String} view 当前视图类型,year: 年, month: 月, date: 日
617 * @return {Boolean} 是否禁用
618 */
619 disabledDate: _propTypes2.default.func,
620 /**
621 * 自定义面板页脚
622 * @return {Node} 自定义的面板页脚组件
623 */
624 footerRender: _propTypes2.default.func,
625 /**
626 * 日期范围值改变时的回调 [ MomentObject|String, MomentObject|String ]
627 * @param {Array<MomentObject|String>} value 日期值
628 */
629 onChange: _propTypes2.default.func,
630 /**
631 * 点击确认按钮时的回调 返回开始时间和结束时间`[ MomentObject|String, MomentObject|String ]`
632 * @return {Array} 日期范围
633 */
634 onOk: _propTypes2.default.func,
635 /**
636 * 输入框内置标签
637 */
638 label: _propTypes2.default.node,
639 /**
640 * 输入框状态
641 */
642 state: _propTypes2.default.oneOf(['error', 'loading', 'success']),
643 /**
644 * 输入框尺寸
645 */
646 size: _propTypes2.default.oneOf(['small', 'medium', 'large']),
647 /**
648 * 是否禁用
649 */
650 disabled: _propTypes2.default.bool,
651 /**
652 * 是否显示清空按钮
653 */
654 hasClear: _propTypes2.default.bool,
655 /**
656 * 弹层显示状态
657 */
658 visible: _propTypes2.default.bool,
659 /**
660 * 弹层默认是否显示
661 */
662 defaultVisible: _propTypes2.default.bool,
663 /**
664 * 弹层展示状态变化时的回调
665 * @param {Boolean} visible 弹层是否显示
666 * @param {String} type 触发弹层显示和隐藏的来源 okBtnClick 表示由确认按钮触发; fromTrigger 表示由trigger的点击触发; docClick 表示由document的点击触发
667 */
668 onVisibleChange: _propTypes2.default.func,
669 /**
670 * 弹层触发方式
671 */
672 popupTriggerType: _propTypes2.default.oneOf(['click', 'hover']),
673 /**
674 * 弹层对齐方式, 具体含义见 OverLay文档
675 */
676 popupAlign: _propTypes2.default.string,
677 /**
678 * 弹层容器
679 * @param {Element} target 目标元素
680 * @return {Element} 弹层的容器元素
681 */
682 popupContainer: _propTypes2.default.any,
683 /**
684 * 弹层自定义样式
685 */
686 popupStyle: _propTypes2.default.object,
687 /**
688 * 弹层自定义样式类
689 */
690 popupClassName: _propTypes2.default.string,
691 /**
692 * 弹层其他属性
693 */
694 popupProps: _propTypes2.default.object,
695 /**
696 * 是否跟随滚动
697 */
698 followTrigger: _propTypes2.default.bool,
699 /**
700 * 输入框其他属性
701 */
702 inputProps: _propTypes2.default.object,
703 /**
704 * 自定义日期单元格渲染
705 */
706 dateCellRender: _propTypes2.default.func,
707 /**
708 * 自定义月份渲染函数
709 * @param {Object} calendarDate 对应 Calendar 返回的自定义日期对象
710 * @returns {ReactNode}
711 */
712 monthCellRender: _propTypes2.default.func,
713 yearCellRender: _propTypes2.default.func, // 兼容 0.x yearCellRender
714 /**
715 * 开始日期输入框的 aria-label 属性
716 */
717 startDateInputAriaLabel: _propTypes2.default.string,
718 /**
719 * 开始时间输入框的 aria-label 属性
720 */
721 startTimeInputAriaLabel: _propTypes2.default.string,
722 /**
723 * 结束日期输入框的 aria-label 属性
724 */
725 endDateInputAriaLabel: _propTypes2.default.string,
726 /**
727 * 结束时间输入框的 aria-label 属性
728 */
729 endTimeInputAriaLabel: _propTypes2.default.string,
730 /**
731 * 是否为预览态
732 */
733 isPreview: _propTypes2.default.bool,
734 /**
735 * 预览态模式下渲染的内容
736 * @param {Array<MomentObject, MomentObject>} value 日期区间
737 */
738 renderPreview: _propTypes2.default.func,
739 disableChangeMode: _propTypes2.default.bool,
740 yearRange: _propTypes2.default.arrayOf(_propTypes2.default.number),
741 ranges: _propTypes2.default.object, // 兼容0.x版本
742 locale: _propTypes2.default.object,
743 className: _propTypes2.default.string,
744 name: _propTypes2.default.string,
745 popupComponent: _propTypes2.default.elementType,
746 popupContent: _propTypes2.default.node,
747 placeholder: _propTypes2.default.oneOfType([_propTypes2.default.arrayOf(_propTypes2.default.string), _propTypes2.default.string])
748}), _class.defaultProps = {
749 prefix: 'next-',
750 rtl: false,
751 type: 'date',
752 size: 'medium',
753 showTime: false,
754 resetTime: false,
755 disabledDate: function disabledDate() {
756 return false;
757 },
758 footerRender: function footerRender() {
759 return null;
760 },
761 hasClear: true,
762 defaultVisible: false,
763 popupTriggerType: 'click',
764 popupAlign: 'tl tl',
765 locale: _zhCn2.default.DatePicker,
766 disableChangeMode: false,
767 onChange: _util.func.noop,
768 onOk: _util.func.noop,
769 onVisibleChange: _util.func.noop
770}, _initialiseProps = function _initialiseProps() {
771 var _this3 = this;
772
773 this.onValueChange = function (values) {
774 var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'onChange';
775
776 var ret = void 0;
777 if (!values.length || !_this3.state.inputAsString) {
778 ret = values;
779 } else {
780 ret = [values[0] ? values[0].format(_this3.state.dateTimeFormat) : null, values[1] ? values[1].format(_this3.state.dateTimeFormat) : null];
781 }
782 _this3.props[handler](ret);
783 };
784
785 this.onSelectCalendarPanel = function (value, active) {
786 var _props3 = _this3.props,
787 showTime = _props3.showTime,
788 resetTime = _props3.resetTime;
789 var _state = _this3.state,
790 prevActiveDateInput = _state.activeDateInput,
791 prevStartValue = _state.startValue,
792 prevEndValue = _state.endValue,
793 timeFormat = _state.timeFormat;
794
795
796 var newState = {
797 activeDateInput: active || prevActiveDateInput,
798 inputing: false
799 };
800
801 var newValue = value;
802
803 switch (active || prevActiveDateInput) {
804 case 'startValue':
805 {
806 if (!prevEndValue || value.valueOf() <= prevEndValue.valueOf()) {
807 newState.activeDateInput = 'endValue';
808 }
809
810 if (showTime) {
811 if (!prevStartValue) {
812 // 第一次选择,如果设置了时间默认值,则使用该默认时间
813 if (showTime.defaultValue) {
814 var defaultTimeValue = (0, _util2.formatDateValue)(Array.isArray(showTime.defaultValue) ? showTime.defaultValue[0] : showTime.defaultValue, timeFormat);
815 newValue = (0, _util2.resetValueTime)(value, defaultTimeValue);
816 }
817 } else if (!resetTime) {
818 // 非第一次选择,如果开启了 resetTime ,则记住之前选择的时间值
819 newValue = (0, _util2.resetValueTime)(value, prevStartValue);
820 }
821 }
822
823 newState.startValue = newValue;
824
825 // 如果起始日期大于结束日期
826 if (prevEndValue && newValue.valueOf() > prevEndValue.valueOf()) {
827 // 将结束日期设置为起始日期 如果需要的话保留时间
828 newState.endValue = resetTime ? newValue : (0, _util2.resetValueTime)(value, prevEndValue);
829
830 // 如果结束日期不大于起始日期则将结束日期设置为等于开始日期
831 if (newState.endValue.valueOf() < newState.startValue.valueOf()) {
832 newState.endValue = (0, _moment2.default)(newState.startValue);
833 }
834 newState.activeDateInput = 'endValue';
835 }
836 break;
837 }
838
839 case 'endValue':
840 if (!prevStartValue) {
841 newState.activeDateInput = 'startValue';
842 }
843
844 if (showTime) {
845 if (!prevEndValue) {
846 // 第一次选择,如果设置了时间默认值,则使用该默认时间
847 if (showTime.defaultValue) {
848 var _defaultTimeValue = (0, _util2.formatDateValue)(Array.isArray(showTime.defaultValue) ? showTime.defaultValue[1] || showTime.defaultValue[0] : showTime.defaultValue, timeFormat);
849 newValue = (0, _util2.resetValueTime)(value, _defaultTimeValue);
850 }
851 } else if (!resetTime) {
852 // 非第一次选择,如果开启了 resetTime ,则记住之前选择的时间值
853 newValue = (0, _util2.resetValueTime)(value, prevEndValue);
854 }
855 }
856
857 newState.endValue = newValue;
858
859 // 选择了一个比开始日期更小的结束日期,此时表示用户重新选择了
860 if (prevStartValue && newValue.valueOf() <= prevStartValue.valueOf()) {
861 newState.startValue = resetTime ? value : (0, _util2.resetValueTime)(value, prevStartValue);
862 newState.endValue = resetTime ? value : (0, _util2.resetValueTime)(value, prevEndValue);
863
864 // 如果结束日期不大于起始日期则将结束日期设置为等于开始日期
865 if (newState.endValue.valueOf() < newState.startValue.valueOf()) {
866 newState.endValue = (0, _moment2.default)(newState.startValue);
867 }
868 }
869 break;
870 }
871
872 var newStartValue = 'startValue' in newState ? newState.startValue : prevStartValue;
873 var newEndValue = 'endValue' in newState ? newState.endValue : prevEndValue;
874
875 // 受控状态选择不更新值
876 if ('value' in _this3.props) {
877 delete newState.startValue;
878 delete newState.endValue;
879 }
880
881 _this3.setState(newState);
882
883 _this3.onValueChange([newStartValue, newEndValue]);
884 };
885
886 this.clearRange = function () {
887 _this3.setState({
888 startDateInputStr: '',
889 endDateInputStr: '',
890 startTimeInputStr: '',
891 endTimeInputStr: ''
892 });
893
894 if (!('value' in _this3.props)) {
895 _this3.setState({
896 startValue: null,
897 endValue: null
898 });
899 }
900
901 _this3.onValueChange([]);
902 };
903
904 this.onDateInputChange = function (inputStr, e, eventType) {
905 if (eventType === 'clear' || !inputStr) {
906 e.stopPropagation();
907 _this3.clearRange();
908 } else {
909 var _this3$setState;
910
911 var stateName = mapInputStateName(_this3.state.activeDateInput);
912 _this3.setState((_this3$setState = {}, _this3$setState[stateName] = inputStr, _this3$setState.inputing = _this3.state.activeDateInput, _this3$setState));
913 }
914 };
915
916 this.onDateInputBlur = function () {
917 var resetTime = _this3.props.resetTime;
918 var activeDateInput = _this3.state.activeDateInput;
919
920 var stateName = mapInputStateName(activeDateInput);
921 var dateInputStr = _this3.state[stateName];
922
923 if (dateInputStr) {
924 var _this3$setState2;
925
926 var _props4 = _this3.props,
927 format = _props4.format,
928 disabledDate = _props4.disabledDate;
929
930 var parsed = (0, _moment2.default)(dateInputStr, format, true);
931
932 _this3.setState((_this3$setState2 = {}, _this3$setState2[stateName] = '', _this3$setState2.inputing = false, _this3$setState2));
933
934 if (parsed.isValid() && !disabledDate(parsed, 'date')) {
935 var valueName = activeDateInput;
936 var newValue = resetTime ? parsed : (0, _util2.resetValueTime)(parsed, _this3.state[activeDateInput]);
937
938 _this3.handleChange(valueName, newValue);
939 }
940 }
941 };
942
943 this.onDateInputKeyDown = function (e) {
944 var type = _this3.props.type;
945 var _state2 = _this3.state,
946 activeDateInput = _state2.activeDateInput,
947 format = _state2.format;
948
949 var stateName = mapInputStateName(activeDateInput);
950 var dateInputStr = _this3.state[stateName];
951 var dateStr = (0, _util2.onDateKeydown)(e, {
952 format: format,
953 value: _this3.state[activeDateInput],
954 dateInputStr: dateInputStr
955 }, type === 'date' ? 'day' : type);
956 if (!dateStr) return;
957
958 return _this3.onDateInputChange(dateStr);
959 };
960
961 this.onFocusDateInput = function (type) {
962 if (type !== _this3.state.activeDateInput) {
963 _this3.setState({
964 activeDateInput: type
965 });
966 }
967 if (_this3.state.panel !== _util2.PANEL.DATE) {
968 _this3.setState({
969 panel: _util2.PANEL.DATE
970 });
971 }
972 };
973
974 this.onFocusTimeInput = function (type) {
975 if (type !== _this3.state.activeDateInput) {
976 _this3.setState({
977 activeDateInput: type
978 });
979 }
980
981 if (_this3.state.panel !== _util2.PANEL.TIME) {
982 _this3.setState({
983 panel: _util2.PANEL.TIME
984 });
985 }
986 };
987
988 this.onSelectStartTime = function (value) {
989 if (!('value' in _this3.props)) {
990 _this3.setState({
991 startValue: value,
992 inputing: false,
993 activeDateInput: 'startTime'
994 });
995 }
996
997 if (value.valueOf() !== _this3.state.startValue.valueOf()) {
998 _this3.onValueChange([value, _this3.state.endValue]);
999 }
1000 };
1001
1002 this.onSelectEndTime = function (value) {
1003 if (!('value' in _this3.props)) {
1004 _this3.setState({
1005 endValue: value,
1006 inputing: false,
1007 activeDateInput: 'endTime'
1008 });
1009 }
1010 if (value.valueOf() !== _this3.state.endValue.valueOf()) {
1011 _this3.onValueChange([_this3.state.startValue, value]);
1012 }
1013 };
1014
1015 this.onTimeInputChange = function (inputStr) {
1016 var _this3$setState3;
1017
1018 var stateName = mapInputStateName(_this3.state.activeDateInput);
1019 _this3.setState((_this3$setState3 = {}, _this3$setState3[stateName] = inputStr, _this3$setState3.inputing = _this3.state.activeDateInput, _this3$setState3));
1020 };
1021
1022 this.onTimeInputBlur = function () {
1023 var _this3$setState4;
1024
1025 var stateName = mapInputStateName(_this3.state.activeDateInput);
1026 var timeInputStr = _this3.state[stateName];
1027
1028 var parsed = (0, _moment2.default)(timeInputStr, _this3.state.timeFormat, true);
1029
1030 _this3.setState((_this3$setState4 = {}, _this3$setState4[stateName] = '', _this3$setState4.inputing = false, _this3$setState4));
1031
1032 if (parsed.isValid()) {
1033 var hour = parsed.hour();
1034 var minute = parsed.minute();
1035 var second = parsed.second();
1036 var valueName = mapTimeToValue(_this3.state.activeDateInput);
1037 var newValue = _this3.state[valueName].clone().hour(hour).minute(minute).second(second);
1038
1039 _this3.handleChange(valueName, newValue);
1040 }
1041 };
1042
1043 this.onTimeInputKeyDown = function (e) {
1044 var showTime = _this3.props.showTime;
1045 var _state3 = _this3.state,
1046 activeDateInput = _state3.activeDateInput,
1047 timeFormat = _state3.timeFormat;
1048
1049 var stateName = mapInputStateName(activeDateInput);
1050 var timeInputStr = _this3.state[stateName];
1051
1052 var _ref3 = (typeof showTime === 'undefined' ? 'undefined' : (0, _typeof3.default)(showTime)) === 'object' ? showTime : {},
1053 disabledMinutes = _ref3.disabledMinutes,
1054 disabledSeconds = _ref3.disabledSeconds,
1055 _ref3$hourStep = _ref3.hourStep,
1056 hourStep = _ref3$hourStep === undefined ? 1 : _ref3$hourStep,
1057 _ref3$minuteStep = _ref3.minuteStep,
1058 minuteStep = _ref3$minuteStep === undefined ? 1 : _ref3$minuteStep,
1059 _ref3$secondStep = _ref3.secondStep,
1060 secondStep = _ref3$secondStep === undefined ? 1 : _ref3$secondStep;
1061
1062 var unit = 'second';
1063
1064 if (disabledSeconds) {
1065 unit = disabledMinutes ? 'hour' : 'minute';
1066 }
1067
1068 var timeStr = (0, _util2.onTimeKeydown)(e, {
1069 format: timeFormat,
1070 timeInputStr: timeInputStr,
1071 value: _this3.state[activeDateInput.indexOf('start') ? 'startValue' : 'endValue'],
1072 steps: {
1073 hour: hourStep,
1074 minute: minuteStep,
1075 second: secondStep
1076 }
1077 }, unit);
1078
1079 if (!timeStr) return;
1080
1081 _this3.onTimeInputChange(timeStr);
1082 };
1083
1084 this.handleChange = function (valueName, newValue) {
1085 var values = ['startValue', 'endValue'].map(function (name) {
1086 return valueName === name ? newValue : _this3.state[name];
1087 });
1088
1089 // 判断起始时间是否大于结束时间
1090 if (values[0] && values[1] && values[0].valueOf() > values[1].valueOf()) {
1091 return;
1092 }
1093
1094 if (!('value' in _this3.props)) {
1095 var _this3$setState5;
1096
1097 _this3.setState((_this3$setState5 = {}, _this3$setState5[valueName] = newValue, _this3$setState5));
1098 }
1099
1100 _this3.onValueChange(values);
1101 };
1102
1103 this.onVisibleChange = function (visible, type) {
1104 if (!('visible' in _this3.props)) {
1105 _this3.setState({
1106 visible: visible
1107 });
1108 }
1109 _this3.props.onVisibleChange(visible, type);
1110 };
1111
1112 this.changePanel = function (panel) {
1113 var _state4 = _this3.state,
1114 startValue = _state4.startValue,
1115 endValue = _state4.endValue;
1116
1117 _this3.setState({
1118 panel: panel,
1119 activeDateInput: panel === _util2.PANEL.DATE ? !!startValue && !endValue ? 'endValue' : 'startValue' : 'startTime'
1120 });
1121 };
1122
1123 this.onOk = function (value) {
1124 _this3.onVisibleChange(false, 'okBtnClick');
1125 _this3.onValueChange(value || [_this3.state.startValue, _this3.state.endValue], 'onOk');
1126 };
1127
1128 this.getDisabledTime = function (_ref4) {
1129 var startValue = _ref4.startValue,
1130 endValue = _ref4.endValue;
1131
1132 var _ref5 = _this3.props.showTime || {},
1133 disabledHours = _ref5.disabledHours,
1134 disabledMinutes = _ref5.disabledMinutes,
1135 disabledSeconds = _ref5.disabledSeconds;
1136
1137 var disabledTime = {};
1138
1139 if (startValue && endValue) {
1140 var isSameDay = startValue.format('L') === endValue.format('L');
1141 var newDisabledHours = (0, _util2.isFunction)(disabledHours) ? disabledHours : function (index) {
1142 if (isSameDay && index < startValue.hour()) {
1143 return true;
1144 }
1145 };
1146
1147 var newDisabledMinutes = (0, _util2.isFunction)(disabledMinutes) ? disabledMinutes : function (index) {
1148 if (isSameDay && startValue.hour() === endValue.hour() && index < startValue.minute()) {
1149 return true;
1150 }
1151 };
1152
1153 var newDisabledSeconds = (0, _util2.isFunction)(disabledSeconds) ? disabledSeconds : function (index) {
1154 if (isSameDay && startValue.hour() === endValue.hour() && startValue.minute() === endValue.minute() && index < startValue.second()) {
1155 return true;
1156 }
1157 };
1158 disabledTime = {
1159 disabledHours: newDisabledHours,
1160 disabledMinutes: newDisabledMinutes,
1161 disabledSeconds: newDisabledSeconds
1162 };
1163 }
1164
1165 return disabledTime;
1166 };
1167}, _temp);
1168RangePicker.displayName = 'RangePicker';
1169exports.default = (0, _reactLifecyclesCompat.polyfill)(RangePicker);
1170module.exports = exports['default'];
\No newline at end of file