UNPKG

17.3 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
6
7var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
8
9var _extends2 = require('babel-runtime/helpers/extends');
10
11var _extends3 = _interopRequireDefault(_extends2);
12
13var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
14
15var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
16
17var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
18
19var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
20
21var _inherits2 = require('babel-runtime/helpers/inherits');
22
23var _inherits3 = _interopRequireDefault(_inherits2);
24
25var _class, _temp, _initialiseProps;
26
27var _react = require('react');
28
29var _react2 = _interopRequireDefault(_react);
30
31var _propTypes = require('prop-types');
32
33var _propTypes2 = _interopRequireDefault(_propTypes);
34
35var _classnames2 = require('classnames');
36
37var _classnames3 = _interopRequireDefault(_classnames2);
38
39var _moment = require('moment');
40
41var _moment2 = _interopRequireDefault(_moment);
42
43var _reactLifecyclesCompat = require('react-lifecycles-compat');
44
45var _overlay = require('../overlay');
46
47var _overlay2 = _interopRequireDefault(_overlay);
48
49var _input = require('../input');
50
51var _input2 = _interopRequireDefault(_input);
52
53var _icon = require('../icon');
54
55var _icon2 = _interopRequireDefault(_icon);
56
57var _calendar = require('../calendar');
58
59var _calendar2 = _interopRequireDefault(_calendar);
60
61var _configProvider = require('../config-provider');
62
63var _configProvider2 = _interopRequireDefault(_configProvider);
64
65var _zhCn = require('../locale/zh-cn');
66
67var _zhCn2 = _interopRequireDefault(_zhCn);
68
69var _util = require('../util');
70
71var _util2 = require('./util');
72
73function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
74
75var Popup = _overlay2.default.Popup;
76
77/**
78 * DatePicker.WeekPicker
79 */
80
81var WeekPicker = (_temp = _class = function (_Component) {
82 (0, _inherits3.default)(WeekPicker, _Component);
83
84 function WeekPicker(props, context) {
85 (0, _classCallCheck3.default)(this, WeekPicker);
86
87 var _this = (0, _possibleConstructorReturn3.default)(this, _Component.call(this, props, context));
88
89 _initialiseProps.call(_this);
90
91 var value = (0, _util2.formatDateValue)(props.value || props.defaultValue, props.format);
92
93 _this.state = {
94 value: value,
95 visible: props.visible || props.defaultVisible
96 };
97 return _this;
98 }
99
100 WeekPicker.getDerivedStateFromProps = function getDerivedStateFromProps(props) {
101 var st = {};
102 if ('value' in props) {
103 st.value = (0, _util2.formatDateValue)(props.value, props.format);
104 }
105
106 if ('visible' in props) {
107 st.visible = props.visible;
108 }
109
110 return st;
111 };
112
113 WeekPicker.prototype.renderPreview = function renderPreview(others) {
114 var _props = this.props,
115 prefix = _props.prefix,
116 format = _props.format,
117 className = _props.className,
118 renderPreview = _props.renderPreview;
119 var value = this.state.value;
120
121 var previewCls = (0, _classnames3.default)(className, prefix + 'form-preview');
122
123 var label = value ? value.format(format) : '';
124
125 if (typeof renderPreview === 'function') {
126 return _react2.default.createElement(
127 'div',
128 (0, _extends3.default)({}, others, { className: previewCls }),
129 renderPreview(value, this.props)
130 );
131 }
132
133 return _react2.default.createElement(
134 'p',
135 (0, _extends3.default)({}, others, { className: previewCls }),
136 label
137 );
138 };
139
140 WeekPicker.prototype.render = function render() {
141 var _props2 = this.props,
142 prefix = _props2.prefix,
143 rtl = _props2.rtl,
144 locale = _props2.locale,
145 label = _props2.label,
146 state = _props2.state,
147 format = _props2.format,
148 defaultVisibleMonth = _props2.defaultVisibleMonth,
149 onVisibleMonthChange = _props2.onVisibleMonthChange,
150 disabledDate = _props2.disabledDate,
151 footerRender = _props2.footerRender,
152 placeholder = _props2.placeholder,
153 size = _props2.size,
154 disabled = _props2.disabled,
155 hasClear = _props2.hasClear,
156 popupTriggerType = _props2.popupTriggerType,
157 popupAlign = _props2.popupAlign,
158 popupContainer = _props2.popupContainer,
159 popupStyle = _props2.popupStyle,
160 popupClassName = _props2.popupClassName,
161 popupProps = _props2.popupProps,
162 popupComponent = _props2.popupComponent,
163 popupContent = _props2.popupContent,
164 followTrigger = _props2.followTrigger,
165 className = _props2.className,
166 inputProps = _props2.inputProps,
167 monthCellRender = _props2.monthCellRender,
168 yearCellRender = _props2.yearCellRender,
169 isPreview = _props2.isPreview,
170 others = (0, _objectWithoutProperties3.default)(_props2, ['prefix', 'rtl', 'locale', 'label', 'state', 'format', 'defaultVisibleMonth', 'onVisibleMonthChange', 'disabledDate', 'footerRender', 'placeholder', 'size', 'disabled', 'hasClear', 'popupTriggerType', 'popupAlign', 'popupContainer', 'popupStyle', 'popupClassName', 'popupProps', 'popupComponent', 'popupContent', 'followTrigger', 'className', 'inputProps', 'monthCellRender', 'yearCellRender', 'isPreview']);
171 var _state = this.state,
172 visible = _state.visible,
173 value = _state.value;
174
175
176 var sharedInputProps = (0, _extends3.default)({}, inputProps, {
177 size: size,
178 disabled: disabled,
179 onChange: this.onDateInputChange,
180 onKeyDown: this.onKeyDown
181 });
182
183 if (rtl) {
184 others.dir = 'rtl';
185 }
186
187 if (isPreview) {
188 return this.renderPreview(_util.obj.pickOthers(others, WeekPicker.PropTypes));
189 }
190
191 var trigger = _react2.default.createElement(
192 'div',
193 { className: prefix + 'week-picker-trigger' },
194 _react2.default.createElement(_input2.default, (0, _extends3.default)({}, sharedInputProps, {
195 label: label,
196 state: state,
197 value: value ? value.format(format) : '',
198 role: 'combobox',
199 'aria-expanded': visible,
200 readOnly: true,
201 placeholder: placeholder || locale.weekPlaceholder,
202 hint: _react2.default.createElement(_icon2.default, { type: 'calendar', className: prefix + 'date-picker-symbol-calendar-icon' }),
203 hasClear: value && hasClear,
204 className: prefix + 'week-picker-input'
205 }))
206 );
207
208 var PopupComponent = popupComponent ? popupComponent : Popup;
209
210 return _react2.default.createElement(
211 'div',
212 (0, _extends3.default)({}, _util.obj.pickOthers(WeekPicker.propTypes, others), {
213 className: (0, _classnames3.default)(prefix + 'week-picker', className)
214 }),
215 _react2.default.createElement(
216 PopupComponent,
217 (0, _extends3.default)({
218 align: popupAlign
219 }, popupProps, {
220 followTrigger: followTrigger,
221 disabled: disabled,
222 visible: visible,
223 onVisibleChange: this.onVisibleChange,
224 triggerType: popupTriggerType,
225 container: popupContainer,
226 style: popupStyle,
227 className: popupClassName,
228 trigger: trigger
229 }),
230 popupContent ? popupContent : _react2.default.createElement(
231 'div',
232 { dir: others.dir, className: prefix + 'week-picker-body' },
233 _react2.default.createElement(_calendar2.default, {
234 shape: 'panel',
235 value: value,
236 format: format,
237 className: prefix + 'calendar-week',
238 dateCellRender: this.dateRender,
239 monthCellRender: monthCellRender,
240 yearCellRender: yearCellRender,
241 onSelect: this.onSelectCalendarPanel,
242 defaultVisibleMonth: defaultVisibleMonth,
243 onVisibleMonthChange: onVisibleMonthChange,
244 disabledDate: disabledDate
245 }),
246 footerRender()
247 )
248 )
249 );
250 };
251
252 return WeekPicker;
253}(_react.Component), _class.propTypes = (0, _extends3.default)({}, _configProvider2.default.propTypes, {
254 prefix: _propTypes2.default.string,
255 rtl: _propTypes2.default.bool,
256 /**
257 * 输入框内置标签
258 */
259 label: _propTypes2.default.node,
260 /**
261 * 输入框状态
262 */
263 state: _propTypes2.default.oneOf(['success', 'loading', 'error']),
264 /**
265 * 输入提示
266 */
267 placeholder: _propTypes2.default.string,
268 /**
269 * 默认展现的月
270 * @return {MomentObject} 返回包含指定月份的 moment 对象实例
271 */
272 defaultVisibleMonth: _propTypes2.default.func,
273 onVisibleMonthChange: _propTypes2.default.func,
274 /**
275 * 日期值(受控)moment 对象
276 */
277 value: _util2.checkDateValue,
278 /**
279 * 初始日期值,moment 对象
280 */
281 defaultValue: _util2.checkDateValue,
282 /**
283 * 日期值的格式(用于限定用户输入和展示)
284 */
285 format: _propTypes2.default.string,
286 /**
287 * 禁用日期函数
288 * @param {MomentObject} 日期值
289 * @param {String} view 当前视图类型,year: 年, month: 月, date: 日
290 * @return {Boolean} 是否禁用
291 */
292 disabledDate: _propTypes2.default.func,
293 /**
294 * 自定义面板页脚
295 * @return {Node} 自定义的面板页脚组件
296 */
297 footerRender: _propTypes2.default.func,
298 /**
299 * 日期值改变时的回调
300 * @param {MomentObject|String} value 日期值
301 */
302 onChange: _propTypes2.default.func,
303 /**
304 * 输入框尺寸
305 */
306 size: _propTypes2.default.oneOf(['small', 'medium', 'large']),
307 /**
308 * 是否禁用
309 */
310 disabled: _propTypes2.default.bool,
311 /**
312 * 是否显示清空按钮
313 */
314 hasClear: _propTypes2.default.bool,
315 /**
316 * 弹层显示状态
317 */
318 visible: _propTypes2.default.bool,
319 /**
320 * 弹层默认是否显示
321 */
322 defaultVisible: _propTypes2.default.bool,
323 /**
324 * 弹层展示状态变化时的回调
325 * @param {Boolean} visible 弹层是否显示
326 * @param {String} type 触发弹层显示和隐藏的来源 calendarSelect 表示由日期表盘的选择触发; okBtnClick 表示由确认按钮触发; fromTrigger 表示由trigger的点击触发; docClick 表示由document的点击触发
327 */
328 onVisibleChange: _propTypes2.default.func,
329 /**
330 * 弹层触发方式
331 */
332 popupTriggerType: _propTypes2.default.oneOf(['click', 'hover']),
333 /**
334 * 弹层对齐方式,具体含义见 OverLay文档
335 */
336 popupAlign: _propTypes2.default.string,
337 /**
338 * 弹层容器
339 * @param {Element} target 目标元素
340 * @return {Element} 弹层的容器元素
341 */
342 popupContainer: _propTypes2.default.any,
343 /**
344 * 弹层自定义样式
345 */
346 popupStyle: _propTypes2.default.object,
347 /**
348 * 弹层自定义样式类
349 */
350 popupClassName: _propTypes2.default.string,
351 /**
352 * 弹层其他属性
353 */
354 popupProps: _propTypes2.default.object,
355 /**
356 * 是否跟随滚动
357 */
358 followTrigger: _propTypes2.default.bool,
359 /**
360 * 输入框其他属性
361 */
362 inputProps: _propTypes2.default.object,
363 /**
364 * 自定义日期渲染函数
365 * @param {Object} value 日期值(moment对象)
366 * @returns {ReactNode}
367 */
368 dateCellRender: _propTypes2.default.func,
369 /**
370 * 自定义月份渲染函数
371 * @param {Object} calendarDate 对应 Calendar 返回的自定义日期对象
372 * @returns {ReactNode}
373 */
374 monthCellRender: _propTypes2.default.func,
375 /**
376 * 是否为预览态
377 */
378 isPreview: _propTypes2.default.bool,
379 /**
380 * 预览态模式下渲染的内容
381 * @param {MomentObject} value 年份
382 */
383 renderPreview: _propTypes2.default.func,
384 yearCellRender: _propTypes2.default.func, // 兼容 0.x yearCellRender
385 locale: _propTypes2.default.object,
386 className: _propTypes2.default.string,
387 name: _propTypes2.default.string,
388 popupComponent: _propTypes2.default.elementType,
389 popupContent: _propTypes2.default.node
390}), _class.defaultProps = {
391 prefix: 'next-',
392 rtl: false,
393 format: 'GGGG-Wo',
394 size: 'medium',
395 disabledDate: function disabledDate() {
396 return false;
397 },
398 footerRender: function footerRender() {
399 return null;
400 },
401 hasClear: true,
402 popupTriggerType: 'click',
403 popupAlign: 'tl tl',
404 locale: _zhCn2.default.DatePicker,
405 defaultVisible: false,
406 onChange: _util.func.noop,
407 onVisibleChange: _util.func.noop
408}, _initialiseProps = function _initialiseProps() {
409 var _this2 = this;
410
411 this.handleChange = function (newValue, prevValue) {
412 if (!('value' in _this2.props)) {
413 _this2.setState({
414 value: newValue
415 });
416 }
417
418 var newValueOf = newValue ? newValue.valueOf() : null;
419 var preValueOf = prevValue ? prevValue.valueOf() : null;
420
421 if (newValueOf !== preValueOf) {
422 _this2.props.onChange(newValue);
423 }
424 };
425
426 this.onDateInputChange = function (value, e, eventType) {
427 if (eventType === 'clear' || !value) {
428 e.stopPropagation();
429 _this2.handleChange(null, _this2.state.value);
430 }
431 };
432
433 this.onKeyDown = function (e) {
434 if ([_util.KEYCODE.UP, _util.KEYCODE.DOWN, _util.KEYCODE.PAGE_UP, _util.KEYCODE.PAGE_DOWN].indexOf(e.keyCode) === -1) {
435 return;
436 }
437
438 if (e.altKey && [_util.KEYCODE.PAGE_UP, _util.KEYCODE.PAGE_DOWN].indexOf(e.keyCode) === -1 || e.controlKey || e.shiftKey) {
439 return;
440 }
441
442 var date = _this2.state.value;
443
444 if (date && date.isValid()) {
445 var stepUnit = e.altKey ? 'year' : 'month';
446 switch (e.keyCode) {
447 case _util.KEYCODE.UP:
448 date.subtract(1, 'w');
449 break;
450 case _util.KEYCODE.DOWN:
451 date.add(1, 'w');
452 break;
453 case _util.KEYCODE.PAGE_UP:
454 date.subtract(1, stepUnit);
455 break;
456 case _util.KEYCODE.PAGE_DOWN:
457 date.add(1, stepUnit);
458 break;
459 }
460 } else {
461 date = (0, _moment2.default)();
462 }
463
464 e.preventDefault();
465
466 _this2.handleChange(date, _this2.state.value);
467 };
468
469 this.onVisibleChange = function (visible, type) {
470 if (!('visible' in _this2.props)) {
471 _this2.setState({
472 visible: visible
473 });
474 }
475 _this2.props.onVisibleChange(visible, type);
476 };
477
478 this.onSelectCalendarPanel = function (value) {
479 _this2.handleChange(value, _this2.state.value);
480 _this2.onVisibleChange(false, 'calendarSelect');
481 };
482
483 this.dateRender = function (value) {
484 var _props3 = _this2.props,
485 prefix = _props3.prefix,
486 dateCellRender = _props3.dateCellRender;
487
488 var selectedValue = _this2.state.value;
489 var content = dateCellRender && typeof dateCellRender === 'function' ? dateCellRender(value) : value.dates();
490 if (selectedValue && selectedValue.years() === value.years() && selectedValue.weeks() === value.weeks()) {
491 var _classnames;
492
493 var firstDay = _moment2.default.localeData().firstDayOfWeek();
494 var endDay = firstDay - 1 < 0 ? 6 : firstDay - 1;
495 return _react2.default.createElement(
496 'div',
497 {
498 className: (0, _classnames3.default)(prefix + 'calendar-week-active-date', (_classnames = {}, _classnames[prefix + 'calendar-week-active-start'] = value.days() === _moment2.default.localeData().firstDayOfWeek(), _classnames[prefix + 'calendar-week-active-end'] = value.days() === endDay, _classnames))
499 },
500 _react2.default.createElement(
501 'span',
502 null,
503 content
504 )
505 );
506 }
507
508 return content;
509 };
510}, _temp);
511WeekPicker.displayName = 'WeekPicker';
512exports.default = (0, _reactLifecyclesCompat.polyfill)(WeekPicker);
513module.exports = exports['default'];
\No newline at end of file