UNPKG

13.8 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _extends2 = require('babel-runtime/helpers/extends');
6
7var _extends3 = _interopRequireDefault(_extends2);
8
9var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
10
11var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
12
13var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
14
15var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
16
17var _inherits2 = require('babel-runtime/helpers/inherits');
18
19var _inherits3 = _interopRequireDefault(_inherits2);
20
21var _react = require('react');
22
23var _react2 = _interopRequireDefault(_react);
24
25var _reactDom = require('react-dom');
26
27var _reactDom2 = _interopRequireDefault(_reactDom);
28
29var _propTypes = require('prop-types');
30
31var _propTypes2 = _interopRequireDefault(_propTypes);
32
33var _KeyCode = require('rc-util/lib/KeyCode');
34
35var _KeyCode2 = _interopRequireDefault(_KeyCode);
36
37var _reactLifecyclesCompat = require('react-lifecycles-compat');
38
39var _DateTable = require('./date/DateTable');
40
41var _DateTable2 = _interopRequireDefault(_DateTable);
42
43var _CalendarHeader = require('./calendar/CalendarHeader');
44
45var _CalendarHeader2 = _interopRequireDefault(_CalendarHeader);
46
47var _CalendarFooter = require('./calendar/CalendarFooter');
48
49var _CalendarFooter2 = _interopRequireDefault(_CalendarFooter);
50
51var _CalendarMixin = require('./mixin/CalendarMixin');
52
53var _CommonMixin = require('./mixin/CommonMixin');
54
55var _DateInput = require('./date/DateInput');
56
57var _DateInput2 = _interopRequireDefault(_DateInput);
58
59var _util = require('./util');
60
61var _toTime = require('./util/toTime');
62
63var _moment = require('moment');
64
65var _moment2 = _interopRequireDefault(_moment);
66
67function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
68
69function noop() {}
70
71var Calendar = function (_React$Component) {
72 (0, _inherits3['default'])(Calendar, _React$Component);
73
74 function Calendar(props) {
75 (0, _classCallCheck3['default'])(this, Calendar);
76
77 var _this = (0, _possibleConstructorReturn3['default'])(this, _React$Component.call(this, props));
78
79 _initialiseProps.call(_this);
80
81 _this.state = {
82 mode: _this.props.mode || 'date',
83 value: props.value || props.defaultValue || (0, _moment2['default'])(),
84 selectedValue: props.selectedValue || props.defaultSelectedValue
85 };
86 return _this;
87 }
88
89 Calendar.prototype.componentDidMount = function componentDidMount() {
90 if (this.props.showDateInput) {
91 this.saveFocusElement(_DateInput2['default'].getInstance());
92 }
93 };
94
95 Calendar.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, state) {
96 var value = nextProps.value,
97 selectedValue = nextProps.selectedValue;
98
99 var newState = {};
100
101 if ('mode' in nextProps && state.mode !== nextProps.mode) {
102 newState = { mode: nextProps.mode };
103 }
104 if ('value' in nextProps) {
105 newState.value = value || nextProps.defaultValue || (0, _CalendarMixin.getNowByCurrentStateValue)(state.value);
106 }
107 if ('selectedValue' in nextProps) {
108 newState.selectedValue = selectedValue;
109 }
110
111 return newState;
112 };
113
114 Calendar.prototype.render = function render() {
115 var props = this.props,
116 state = this.state;
117 var locale = props.locale,
118 prefixCls = props.prefixCls,
119 disabledDate = props.disabledDate,
120 dateInputPlaceholder = props.dateInputPlaceholder,
121 timePicker = props.timePicker,
122 disabledTime = props.disabledTime,
123 clearIcon = props.clearIcon,
124 renderFooter = props.renderFooter;
125 var value = state.value,
126 selectedValue = state.selectedValue,
127 mode = state.mode;
128
129 var showTimePicker = mode === 'time';
130 var disabledTimeConfig = showTimePicker && disabledTime && timePicker ? (0, _util.getTimeConfig)(selectedValue, disabledTime) : null;
131
132 var timePickerEle = null;
133
134 if (timePicker && showTimePicker) {
135 var timePickerProps = (0, _extends3['default'])({
136 showHour: true,
137 showSecond: true,
138 showMinute: true
139 }, timePicker.props, disabledTimeConfig, {
140 onChange: this.onDateInputChange,
141 value: selectedValue,
142 disabledTime: disabledTime
143 });
144
145 if (timePicker.props.defaultValue !== undefined) {
146 timePickerProps.defaultOpenValue = timePicker.props.defaultValue;
147 }
148
149 timePickerEle = _react2['default'].cloneElement(timePicker, timePickerProps);
150 }
151
152 var dateInputElement = props.showDateInput ? _react2['default'].createElement(_DateInput2['default'], {
153 format: this.getFormat(),
154 key: 'date-input',
155 value: value,
156 locale: locale,
157 placeholder: dateInputPlaceholder,
158 showClear: true,
159 disabledTime: disabledTime,
160 disabledDate: disabledDate,
161 onClear: this.onClear,
162 prefixCls: prefixCls,
163 selectedValue: selectedValue,
164 onChange: this.onDateInputChange,
165 onSelect: this.onDateInputSelect,
166 clearIcon: clearIcon
167 }) : null;
168
169 var children = [];
170 if (props.renderSidebar) {
171 children.push(props.renderSidebar());
172 }
173 children.push(_react2['default'].createElement(
174 'div',
175 { className: prefixCls + '-panel', key: 'panel' },
176 dateInputElement,
177 _react2['default'].createElement(
178 'div',
179 {
180 tabIndex: this.props.focusablePanel ? 0 : undefined,
181 className: prefixCls + '-date-panel'
182 },
183 _react2['default'].createElement(_CalendarHeader2['default'], {
184 locale: locale,
185 mode: mode,
186 value: value,
187 onValueChange: this.setValue,
188 onPanelChange: this.onPanelChange,
189 renderFooter: renderFooter,
190 showTimePicker: showTimePicker,
191 prefixCls: prefixCls
192 }),
193 timePicker && showTimePicker ? _react2['default'].createElement(
194 'div',
195 { className: prefixCls + '-time-picker' },
196 _react2['default'].createElement(
197 'div',
198 { className: prefixCls + '-time-picker-panel' },
199 timePickerEle
200 )
201 ) : null,
202 _react2['default'].createElement(
203 'div',
204 { className: prefixCls + '-body' },
205 _react2['default'].createElement(_DateTable2['default'], {
206 locale: locale,
207 value: value,
208 selectedValue: selectedValue,
209 prefixCls: prefixCls,
210 dateRender: props.dateRender,
211 onSelect: this.onDateTableSelect,
212 disabledDate: disabledDate,
213 showWeekNumber: props.showWeekNumber
214 })
215 ),
216 _react2['default'].createElement(_CalendarFooter2['default'], {
217 showOk: props.showOk,
218 mode: mode,
219 renderFooter: props.renderFooter,
220 locale: locale,
221 prefixCls: prefixCls,
222 showToday: props.showToday,
223 disabledTime: disabledTime,
224 showTimePicker: showTimePicker,
225 showDateInput: props.showDateInput,
226 timePicker: timePicker,
227 selectedValue: selectedValue,
228 value: value,
229 disabledDate: disabledDate,
230 okDisabled: props.showOk !== false && (!selectedValue || !this.isAllowedDate(selectedValue)),
231 onOk: this.onOk,
232 onSelect: this.onSelect,
233 onToday: this.onToday,
234 onOpenTimePicker: this.openTimePicker,
235 onCloseTimePicker: this.closeTimePicker
236 })
237 )
238 ));
239
240 return this.renderRoot({
241 children: children,
242 className: props.showWeekNumber ? prefixCls + '-week-number' : ''
243 });
244 };
245
246 return Calendar;
247}(_react2['default'].Component);
248
249Calendar.propTypes = (0, _extends3['default'])({}, _CalendarMixin.calendarMixinPropTypes, _CommonMixin.propType, {
250 prefixCls: _propTypes2['default'].string,
251 className: _propTypes2['default'].string,
252 style: _propTypes2['default'].object,
253 defaultValue: _propTypes2['default'].object,
254 value: _propTypes2['default'].object,
255 selectedValue: _propTypes2['default'].object,
256 defaultSelectedValue: _propTypes2['default'].object,
257 mode: _propTypes2['default'].oneOf(['time', 'date', 'month', 'year', 'decade']),
258 locale: _propTypes2['default'].object,
259 showDateInput: _propTypes2['default'].bool,
260 showWeekNumber: _propTypes2['default'].bool,
261 showToday: _propTypes2['default'].bool,
262 showOk: _propTypes2['default'].bool,
263 onSelect: _propTypes2['default'].func,
264 onOk: _propTypes2['default'].func,
265 onKeyDown: _propTypes2['default'].func,
266 timePicker: _propTypes2['default'].element,
267 dateInputPlaceholder: _propTypes2['default'].any,
268 onClear: _propTypes2['default'].func,
269 onChange: _propTypes2['default'].func,
270 onPanelChange: _propTypes2['default'].func,
271 disabledDate: _propTypes2['default'].func,
272 disabledTime: _propTypes2['default'].any,
273 dateRender: _propTypes2['default'].func,
274 renderFooter: _propTypes2['default'].func,
275 renderSidebar: _propTypes2['default'].func,
276 clearIcon: _propTypes2['default'].node,
277 focusablePanel: _propTypes2['default'].bool,
278 onBlur: _propTypes2['default'].func
279});
280Calendar.defaultProps = (0, _extends3['default'])({}, _CalendarMixin.calendarMixinDefaultProps, _CommonMixin.defaultProp, {
281 showToday: true,
282 showDateInput: true,
283 timePicker: null,
284 onOk: noop,
285 onPanelChange: noop,
286 focusablePanel: true
287});
288
289var _initialiseProps = function _initialiseProps() {
290 var _this2 = this;
291
292 this.onPanelChange = function (value, mode) {
293 var props = _this2.props,
294 state = _this2.state;
295
296 if (!('mode' in props)) {
297 _this2.setState({ mode: mode });
298 }
299 props.onPanelChange(value || state.value, mode);
300 };
301
302 this.onKeyDown = function (event) {
303 if (event.target.nodeName.toLowerCase() === 'input') {
304 return undefined;
305 }
306 var keyCode = event.keyCode;
307 // mac
308 var ctrlKey = event.ctrlKey || event.metaKey;
309 var disabledDate = _this2.props.disabledDate;
310 var value = _this2.state.value;
311
312 switch (keyCode) {
313 case _KeyCode2['default'].DOWN:
314 _this2.goTime(1, 'weeks');
315 event.preventDefault();
316 return 1;
317 case _KeyCode2['default'].UP:
318 _this2.goTime(-1, 'weeks');
319 event.preventDefault();
320 return 1;
321 case _KeyCode2['default'].LEFT:
322 if (ctrlKey) {
323 _this2.goTime(-1, 'years');
324 } else {
325 _this2.goTime(-1, 'days');
326 }
327 event.preventDefault();
328 return 1;
329 case _KeyCode2['default'].RIGHT:
330 if (ctrlKey) {
331 _this2.goTime(1, 'years');
332 } else {
333 _this2.goTime(1, 'days');
334 }
335 event.preventDefault();
336 return 1;
337 case _KeyCode2['default'].HOME:
338 _this2.setValue((0, _toTime.goStartMonth)(_this2.state.value));
339 event.preventDefault();
340 return 1;
341 case _KeyCode2['default'].END:
342 _this2.setValue((0, _toTime.goEndMonth)(_this2.state.value));
343 event.preventDefault();
344 return 1;
345 case _KeyCode2['default'].PAGE_DOWN:
346 _this2.goTime(1, 'month');
347 event.preventDefault();
348 return 1;
349 case _KeyCode2['default'].PAGE_UP:
350 _this2.goTime(-1, 'month');
351 event.preventDefault();
352 return 1;
353 case _KeyCode2['default'].ENTER:
354 if (!disabledDate || !disabledDate(value)) {
355 _this2.onSelect(value, {
356 source: 'keyboard'
357 });
358 }
359 event.preventDefault();
360 return 1;
361 default:
362 _this2.props.onKeyDown(event);
363 return 1;
364 }
365 };
366
367 this.onClear = function () {
368 _this2.onSelect(null);
369 _this2.props.onClear();
370 };
371
372 this.onOk = function () {
373 var selectedValue = _this2.state.selectedValue;
374
375 if (_this2.isAllowedDate(selectedValue)) {
376 _this2.props.onOk(selectedValue);
377 }
378 };
379
380 this.onDateInputChange = function (value) {
381 _this2.onSelect(value, {
382 source: 'dateInput'
383 });
384 };
385
386 this.onDateInputSelect = function (value) {
387 _this2.onSelect(value, {
388 source: 'dateInputSelect'
389 });
390 };
391
392 this.onDateTableSelect = function (value) {
393 var timePicker = _this2.props.timePicker;
394 var selectedValue = _this2.state.selectedValue;
395
396 if (!selectedValue && timePicker) {
397 var timePickerDefaultValue = timePicker.props.defaultValue;
398 if (timePickerDefaultValue) {
399 (0, _util.syncTime)(timePickerDefaultValue, value);
400 }
401 }
402 _this2.onSelect(value);
403 };
404
405 this.onToday = function () {
406 var value = _this2.state.value;
407
408 var now = (0, _util.getTodayTime)(value);
409 _this2.onSelect(now, {
410 source: 'todayButton'
411 });
412 };
413
414 this.onBlur = function (event) {
415 setTimeout(function () {
416 var dateInput = _DateInput2['default'].getInstance();
417 var rootInstance = _this2.rootInstance;
418
419 if (!rootInstance || rootInstance.contains(document.activeElement) || dateInput && dateInput.contains(document.activeElement)) {
420 // focused element is still part of Calendar
421 return;
422 }
423
424 if (_this2.props.onBlur) {
425 _this2.props.onBlur(event);
426 }
427 }, 0);
428 };
429
430 this.getRootDOMNode = function () {
431 return _reactDom2['default'].findDOMNode(_this2);
432 };
433
434 this.openTimePicker = function () {
435 _this2.onPanelChange(null, 'time');
436 };
437
438 this.closeTimePicker = function () {
439 _this2.onPanelChange(null, 'date');
440 };
441
442 this.goTime = function (direction, unit) {
443 _this2.setValue((0, _toTime.goTime)(_this2.state.value, direction, unit));
444 };
445};
446
447(0, _reactLifecyclesCompat.polyfill)(Calendar);
448
449exports['default'] = (0, _CalendarMixin.calendarMixinWrapper)((0, _CommonMixin.commonMixinWrapper)(Calendar));
450module.exports = exports['default'];
\No newline at end of file