UNPKG

16.3 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _extends2 = require('babel-runtime/helpers/extends');
6
7var _extends3 = _interopRequireDefault(_extends2);
8
9var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
10
11var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
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;
26
27var _react = require('react');
28
29var _react2 = _interopRequireDefault(_react);
30
31var _propTypes = require('prop-types');
32
33var _propTypes2 = _interopRequireDefault(_propTypes);
34
35var _reactLifecyclesCompat = require('react-lifecycles-compat');
36
37var _classnames2 = require('classnames');
38
39var _classnames3 = _interopRequireDefault(_classnames2);
40
41var _moment = require('moment');
42
43var _moment2 = _interopRequireDefault(_moment);
44
45var _configProvider = require('../config-provider');
46
47var _configProvider2 = _interopRequireDefault(_configProvider);
48
49var _zhCn = require('../locale/zh-cn');
50
51var _zhCn2 = _interopRequireDefault(_zhCn);
52
53var _util = require('../util');
54
55var _rangePanelHeader = require('./head/range-panel-header');
56
57var _rangePanelHeader2 = _interopRequireDefault(_rangePanelHeader);
58
59var _monthPanelHeader = require('./head/month-panel-header');
60
61var _monthPanelHeader2 = _interopRequireDefault(_monthPanelHeader);
62
63var _yearPanelHeader = require('./head/year-panel-header');
64
65var _yearPanelHeader2 = _interopRequireDefault(_yearPanelHeader);
66
67var _dateTable = require('./table/date-table');
68
69var _dateTable2 = _interopRequireDefault(_dateTable);
70
71var _monthTable = require('./table/month-table');
72
73var _monthTable2 = _interopRequireDefault(_monthTable);
74
75var _yearTable = require('./table/year-table');
76
77var _yearTable2 = _interopRequireDefault(_yearTable);
78
79var _utils = require('./utils');
80
81function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
82
83var RangeCalendar = (_temp = _class = function (_React$Component) {
84 (0, _inherits3.default)(RangeCalendar, _React$Component);
85
86 function RangeCalendar(props, context) {
87 (0, _classCallCheck3.default)(this, RangeCalendar);
88
89 var _this = (0, _possibleConstructorReturn3.default)(this, _React$Component.call(this, props, context));
90
91 _this.onSelectCell = function (date, nextMode) {
92 if (_this.state.mode === _utils.CALENDAR_MODE_DATE) {
93 _this.props.onSelect(date);
94 } else {
95 _this.changeVisibleMonth(date, 'cellClick');
96 }
97
98 _this.changeMode(nextMode);
99 };
100
101 _this.changeMode = function (mode, activePanel) {
102 var _this$state = _this.state,
103 lastMode = _this$state.lastMode,
104 lastPanelType = _this$state.lastPanelType;
105
106
107 var state = {
108 lastMode: mode,
109 // rangePicker的panel下,选 year -> month ,从当前函数的activePanel传来的数据已经拿不到 start end panel的状态了,需要根据 lastMode 来判断
110 lastPanelType: lastMode === 'year' ? lastPanelType : activePanel
111 };
112 if (typeof mode === 'string' && mode !== _this.state.mode) {
113 state.mode = mode;
114 }
115 if (activePanel && activePanel !== _this.state.activePanel) {
116 state.activePanel = activePanel;
117 }
118
119 _this.setState(state);
120 };
121
122 _this.changeVisibleMonth = function (date, reason) {
123 var lastPanelType = _this.state.lastPanelType;
124
125 if (!(0, _utils.isSameYearMonth)(date, _this.state.startVisibleMonth)) {
126 var startVisibleMonth = lastPanelType === 'end' ? date.clone().add(-1, 'month') : date;
127 _this.setState({ startVisibleMonth: startVisibleMonth });
128 _this.props.onVisibleMonthChange(startVisibleMonth, reason);
129 }
130 };
131
132 _this.changeVisibleMonthByOffset = function (offset, type) {
133 var offsetDate = _this.state.startVisibleMonth.clone().add(offset, type);
134 _this.changeVisibleMonth(offsetDate, 'buttonClick');
135 };
136
137 _this.goPrevDecade = function () {
138 _this.changeVisibleMonthByOffset(-10, 'years');
139 };
140
141 _this.goNextDecade = function () {
142 _this.changeVisibleMonthByOffset(10, 'years');
143 };
144
145 _this.goPrevYear = function () {
146 _this.changeVisibleMonthByOffset(-1, 'years');
147 };
148
149 _this.goNextYear = function () {
150 _this.changeVisibleMonthByOffset(1, 'years');
151 };
152
153 _this.goPrevMonth = function () {
154 _this.changeVisibleMonthByOffset(-1, 'months');
155 };
156
157 _this.goNextMonth = function () {
158 _this.changeVisibleMonthByOffset(1, 'months');
159 };
160
161 var startValue = (0, _utils.formatDateValue)(props.startValue || props.defaultStartValue);
162 var endValue = (0, _utils.formatDateValue)(props.endValue || props.defaultEndValue);
163 var visibleMonth = (0, _utils.getVisibleMonth)(props.defaultVisibleMonth, startValue);
164
165 _this.state = {
166 startValue: startValue,
167 endValue: endValue,
168 mode: props.mode,
169 prevMode: props.mode,
170 startVisibleMonth: visibleMonth,
171 activePanel: undefined,
172 lastMode: undefined,
173 lastPanelType: 'start' // enum, 包括 start end
174 };
175 _this.today = (0, _moment2.default)();
176 return _this;
177 }
178
179 RangeCalendar.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {
180 var st = {};
181 if ('startValue' in props) {
182 var startValue = (0, _utils.formatDateValue)(props.startValue);
183 st.startValue = startValue;
184 if (startValue && !startValue.isSame(state.startValue, 'day')) {
185 st.startVisibleMonth = startValue;
186 }
187 }
188
189 if ('endValue' in props) {
190 st.endValue = (0, _utils.formatDateValue)(props.endValue);
191 }
192
193 if ('mode' in props && state.prevMode !== props.mode) {
194 st.prevMode = props.mode;
195 st.mode = props.mode;
196 }
197
198 return st;
199 };
200
201 /**
202 * 根据日期偏移量设置当前展示的月份
203 * @param {Number} offset 日期偏移量
204 * @param {String} type 日期偏移类型 days, months, years
205 */
206
207
208 RangeCalendar.prototype.render = function render() {
209 var _classnames;
210
211 var _props = this.props,
212 prefix = _props.prefix,
213 rtl = _props.rtl,
214 dateCellRender = _props.dateCellRender,
215 monthCellRender = _props.monthCellRender,
216 yearCellRender = _props.yearCellRender,
217 className = _props.className,
218 format = _props.format,
219 locale = _props.locale,
220 showOtherMonth = _props.showOtherMonth,
221 disabledDate = _props.disabledDate,
222 disableChangeMode = _props.disableChangeMode,
223 yearRange = _props.yearRange,
224 others = (0, _objectWithoutProperties3.default)(_props, ['prefix', 'rtl', 'dateCellRender', 'monthCellRender', 'yearCellRender', 'className', 'format', 'locale', 'showOtherMonth', 'disabledDate', 'disableChangeMode', 'yearRange']);
225 var _state = this.state,
226 startValue = _state.startValue,
227 endValue = _state.endValue,
228 mode = _state.mode,
229 startVisibleMonth = _state.startVisibleMonth,
230 activePanel = _state.activePanel;
231
232 // reset moment locale
233
234 if (locale.momentLocale) {
235 startValue && startValue.locale(locale.momentLocale);
236 endValue && endValue.locale(locale.momentLocale);
237 startVisibleMonth.locale(locale.momentLocale);
238 }
239
240 if (rtl) {
241 others.dir = 'rtl';
242 }
243 var localeData = (0, _utils.getLocaleData)(locale.format || {}, startVisibleMonth.localeData());
244
245 var endVisibleMonth = startVisibleMonth.clone().add(1, 'months');
246
247 var headerProps = {
248 prefix: prefix,
249 rtl: rtl,
250 mode: mode,
251 locale: locale,
252 momentLocale: localeData,
253 startVisibleMonth: startVisibleMonth,
254 endVisibleMonth: endVisibleMonth,
255 changeVisibleMonth: this.changeVisibleMonth,
256 changeMode: this.changeMode,
257 yearRange: yearRange,
258 disableChangeMode: disableChangeMode
259 };
260
261 var tableProps = {
262 prefix: prefix,
263 value: startValue,
264 startValue: startValue,
265 endValue: endValue,
266 mode: mode,
267 locale: locale,
268 momentLocale: localeData,
269 showOtherMonth: showOtherMonth,
270 today: this.today,
271 disabledDate: disabledDate,
272 dateCellRender: dateCellRender,
273 monthCellRender: monthCellRender,
274 yearCellRender: yearCellRender,
275 changeMode: this.changeMode,
276 changeVisibleMonth: this.changeVisibleMonth
277 };
278
279 var visibleMonths = {
280 start: startVisibleMonth,
281 end: endVisibleMonth
282 };
283
284 var visibleMonth = visibleMonths[activePanel];
285
286 var header = void 0;
287 var table = void 0;
288
289 switch (mode) {
290 case _utils.CALENDAR_MODE_DATE:
291 {
292 table = [_react2.default.createElement(
293 'div',
294 { className: prefix + 'calendar-body-left', key: 'left-panel' },
295 _react2.default.createElement(_dateTable2.default, (0, _extends3.default)({
296 format: format
297 }, tableProps, {
298 visibleMonth: startVisibleMonth,
299 onSelectDate: this.onSelectCell
300 }))
301 ), _react2.default.createElement(
302 'div',
303 { className: prefix + 'calendar-body-right', key: 'right-panel' },
304 _react2.default.createElement(_dateTable2.default, (0, _extends3.default)({
305 format: format
306 }, tableProps, {
307 visibleMonth: endVisibleMonth,
308 onSelectDate: this.onSelectCell
309 }))
310 )];
311 header = _react2.default.createElement(_rangePanelHeader2.default, (0, _extends3.default)({}, headerProps, {
312 goPrevYear: this.goPrevYear,
313 goPrevMonth: this.goPrevMonth,
314 goNextYear: this.goNextYear,
315 goNextMonth: this.goNextMonth
316 }));
317 break;
318 }
319 case _utils.CALENDAR_MODE_MONTH:
320 {
321 table = _react2.default.createElement(_monthTable2.default, (0, _extends3.default)({}, tableProps, { visibleMonth: visibleMonth, onSelectMonth: this.onSelectCell }));
322 header = _react2.default.createElement(_monthPanelHeader2.default, (0, _extends3.default)({}, headerProps, {
323 visibleMonth: visibleMonth,
324 goPrevYear: this.goPrevYear,
325 goNextYear: this.goNextYear
326 }));
327 break;
328 }
329 case _utils.CALENDAR_MODE_YEAR:
330 {
331 table = _react2.default.createElement(_yearTable2.default, (0, _extends3.default)({}, tableProps, {
332 rtl: rtl,
333 visibleMonth: visibleMonth,
334 onSelectYear: this.onSelectCell,
335 goPrevDecade: this.goPrevDecade,
336 goNextDecade: this.goNextDecade
337 }));
338 header = _react2.default.createElement(_yearPanelHeader2.default, (0, _extends3.default)({}, headerProps, {
339 visibleMonth: visibleMonth,
340 goPrevDecade: this.goPrevDecade,
341 goNextDecade: this.goNextDecade
342 }));
343 break;
344 }
345 }
346
347 var classNames = (0, _classnames3.default)((_classnames = {}, _classnames[prefix + 'calendar'] = true, _classnames[prefix + 'calendar-range'] = true, _classnames), className);
348
349 return _react2.default.createElement(
350 'div',
351 (0, _extends3.default)({}, _util.obj.pickOthers(RangeCalendar.propTypes, others), { className: classNames }),
352 header,
353 _react2.default.createElement(
354 'div',
355 { className: prefix + 'calendar-body' },
356 table
357 )
358 );
359 };
360
361 return RangeCalendar;
362}(_react2.default.Component), _class.propTypes = (0, _extends3.default)({}, _configProvider2.default.propTypes, {
363 /**
364 * 样式前缀
365 */
366 prefix: _propTypes2.default.string,
367 rtl: _propTypes2.default.bool,
368 /**
369 * 默认的开始日期
370 */
371 defaultStartValue: _utils.checkMomentObj,
372 /**
373 * 默认的结束日期
374 */
375 defaultEndValue: _utils.checkMomentObj,
376 /**
377 * 开始日期(moment 对象)
378 */
379 startValue: _utils.checkMomentObj,
380 /**
381 * 结束日期(moment 对象)
382 */
383 endValue: _utils.checkMomentObj,
384 // 面板模式
385 mode: _propTypes2.default.oneOf(_utils.CALENDAR_MODES),
386 // 禁用更改面板模式,采用 dropdown 的方式切换显示日期 (暂不正式对外透出)
387 disableChangeMode: _propTypes2.default.bool,
388 // 日期值的格式(用于日期title显示的格式)
389 format: _propTypes2.default.string,
390 yearRange: _propTypes2.default.arrayOf(_propTypes2.default.number),
391 /**
392 * 是否显示非本月的日期
393 */
394 showOtherMonth: _propTypes2.default.bool,
395 /**
396 * 模板展示的月份(起始月份)
397 */
398 defaultVisibleMonth: _propTypes2.default.func,
399 /**
400 * 展现的月份变化时的回调
401 * @param {Object} value 显示的月份 (moment 对象)
402 * @param {String} reason 触发月份改变原因
403 */
404 onVisibleMonthChange: _propTypes2.default.func,
405 /**
406 * 不可选择的日期
407 * @param {Object} calendarDate 对应 Calendar 返回的自定义日期对象
408 * @param {String} view 当前视图类型,year: 年, month: 月, date: 日
409 * @returns {Boolean}
410 */
411 disabledDate: _propTypes2.default.func,
412 /**
413 * 选择日期单元格时的回调
414 * @param {Object} value 对应的日期值 (moment 对象)
415 */
416 onSelect: _propTypes2.default.func,
417 /**
418 * 自定义日期单元格渲染
419 */
420 dateCellRender: _propTypes2.default.func,
421 /**
422 * 自定义月份渲染函数
423 * @param {Object} calendarDate 对应 Calendar 返回的自定义日期对象
424 * @returns {ReactNode}
425 */
426 monthCellRender: _propTypes2.default.func,
427 yearCellRender: _propTypes2.default.func, // 兼容 0.x yearCellRender
428 locale: _propTypes2.default.object,
429 className: _propTypes2.default.string
430}), _class.defaultProps = {
431 prefix: 'next-',
432 rtl: false,
433 mode: _utils.CALENDAR_MODE_DATE,
434 disableChangeMode: false,
435 format: 'YYYY-MM-DD',
436 dateCellRender: function dateCellRender(value) {
437 return value.date();
438 },
439 onSelect: _util.func.noop,
440 onVisibleMonthChange: _util.func.noop,
441 locale: _zhCn2.default.Calendar,
442 showOtherMonth: false
443}, _temp);
444RangeCalendar.displayName = 'RangeCalendar';
445exports.default = _configProvider2.default.config((0, _reactLifecyclesCompat.polyfill)(RangeCalendar), {
446 componentName: 'Calendar'
447});
448module.exports = exports['default'];
\No newline at end of file