UNPKG

14.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, _initialiseProps;
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 _moment = require('moment');
38
39var _moment2 = _interopRequireDefault(_moment);
40
41var _classnames2 = require('classnames');
42
43var _classnames3 = _interopRequireDefault(_classnames2);
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 _cardHeader = require('./head/card-header');
56
57var _cardHeader2 = _interopRequireDefault(_cardHeader);
58
59var _datePanelHeader = require('./head/date-panel-header');
60
61var _datePanelHeader2 = _interopRequireDefault(_datePanelHeader);
62
63var _monthPanelHeader = require('./head/month-panel-header');
64
65var _monthPanelHeader2 = _interopRequireDefault(_monthPanelHeader);
66
67var _yearPanelHeader = require('./head/year-panel-header');
68
69var _yearPanelHeader2 = _interopRequireDefault(_yearPanelHeader);
70
71var _dateTable = require('./table/date-table');
72
73var _dateTable2 = _interopRequireDefault(_dateTable);
74
75var _monthTable = require('./table/month-table');
76
77var _monthTable2 = _interopRequireDefault(_monthTable);
78
79var _yearTable = require('./table/year-table');
80
81var _yearTable2 = _interopRequireDefault(_yearTable);
82
83var _utils = require('./utils');
84
85function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
86
87var isValueChanged = function isValueChanged(value, oldVlaue) {
88 if (value && oldVlaue) {
89 if (!_moment2.default.isMoment(value)) {
90 value = (0, _moment2.default)(value);
91 }
92 if (!_moment2.default.isMoment(oldVlaue)) {
93 oldVlaue = (0, _moment2.default)(oldVlaue);
94 }
95 return value.valueOf() !== oldVlaue.valueOf();
96 } else {
97 return value !== oldVlaue;
98 }
99};
100
101/** Calendar */
102var Calendar = (_temp = _class = function (_Component) {
103 (0, _inherits3.default)(Calendar, _Component);
104
105 function Calendar(props, context) {
106 (0, _classCallCheck3.default)(this, Calendar);
107
108 var _this = (0, _possibleConstructorReturn3.default)(this, _Component.call(this, props, context));
109
110 _initialiseProps.call(_this);
111
112 var value = (0, _utils.formatDateValue)(props.value || props.defaultValue);
113 var visibleMonth = (0, _utils.getVisibleMonth)(props.defaultVisibleMonth, value);
114
115 _this.MODES = props.modes;
116 _this.today = (0, _moment2.default)();
117 _this.state = {
118 value: value,
119 mode: props.mode || _this.MODES[0],
120 MODES: _this.MODES,
121 visibleMonth: visibleMonth
122 };
123 return _this;
124 }
125
126 Calendar.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {
127 var st = {};
128 if ('value' in props) {
129 var value = (0, _utils.formatDateValue)(props.value);
130 if (value && isValueChanged(props.value, state.value)) {
131 st.visibleMonth = value;
132 }
133 st.value = value;
134 }
135
136 if (props.mode && state.MODES.indexOf(props.mode) > -1) {
137 st.mode = props.mode;
138 }
139
140 return st;
141 };
142
143 /**
144 * 根据日期偏移量设置当前展示的月份
145 * @param {Number} offset 日期偏移的数量
146 * @param {String} type 日期偏移的类型 days, months, years
147 */
148 Calendar.prototype.changeVisibleMonthByOffset = function changeVisibleMonthByOffset(offset, type) {
149 var cloneValue = this.state.visibleMonth.clone();
150 cloneValue.add(offset, type);
151 this.changeVisibleMonth(cloneValue, 'buttonClick');
152 };
153
154 Calendar.prototype.render = function render() {
155 var _classnames, _tables, _panelHeaders;
156
157 var _props = this.props,
158 prefix = _props.prefix,
159 rtl = _props.rtl,
160 className = _props.className,
161 shape = _props.shape,
162 showOtherMonth = _props.showOtherMonth,
163 format = _props.format,
164 locale = _props.locale,
165 dateCellRender = _props.dateCellRender,
166 monthCellRender = _props.monthCellRender,
167 yearCellRender = _props.yearCellRender,
168 disabledDate = _props.disabledDate,
169 yearRange = _props.yearRange,
170 disableChangeMode = _props.disableChangeMode,
171 others = (0, _objectWithoutProperties3.default)(_props, ['prefix', 'rtl', 'className', 'shape', 'showOtherMonth', 'format', 'locale', 'dateCellRender', 'monthCellRender', 'yearCellRender', 'disabledDate', 'yearRange', 'disableChangeMode']);
172
173 var state = this.state;
174
175 var classNames = (0, _classnames3.default)((_classnames = {}, _classnames[prefix + 'calendar'] = true, _classnames[prefix + 'calendar-' + shape] = shape, _classnames), className);
176
177 if (rtl) {
178 others.dir = 'rtl';
179 }
180
181 var visibleMonth = state.visibleMonth;
182
183 // reset moment locale
184 if (locale.momentLocale) {
185 state.value && state.value.locale(locale.momentLocale);
186 visibleMonth.locale(locale.momentLocale);
187 }
188
189 var localeData = (0, _utils.getLocaleData)(locale.format || {}, visibleMonth.localeData());
190
191 var headerProps = {
192 prefix: prefix,
193 value: state.value,
194 mode: state.mode,
195 disableChangeMode: disableChangeMode,
196 yearRange: yearRange,
197 locale: locale,
198 rtl: rtl,
199 visibleMonth: visibleMonth,
200 momentLocale: localeData,
201 changeMode: this.changeMode,
202 changeVisibleMonth: this.changeVisibleMonth,
203 goNextDecade: this.goNextDecade,
204 goNextYear: this.goNextYear,
205 goNextMonth: this.goNextMonth,
206 goPrevDecade: this.goPrevDecade,
207 goPrevYear: this.goPrevYear,
208 goPrevMonth: this.goPrevMonth
209 };
210
211 var tableProps = {
212 prefix: prefix,
213 visibleMonth: visibleMonth,
214 showOtherMonth: showOtherMonth,
215 value: state.value,
216 mode: state.mode,
217 locale: locale,
218 dateCellRender: dateCellRender,
219 monthCellRender: monthCellRender,
220 yearCellRender: yearCellRender,
221 disabledDate: disabledDate,
222 momentLocale: localeData,
223 today: this.today,
224 goPrevDecade: this.goPrevDecade,
225 goNextDecade: this.goNextDecade
226 };
227
228 var tables = (_tables = {}, _tables[_utils.CALENDAR_MODE_DATE] = _react2.default.createElement(_dateTable2.default, (0, _extends3.default)({ format: format }, tableProps, { onSelectDate: this.onSelectCell })), _tables[_utils.CALENDAR_MODE_MONTH] = _react2.default.createElement(_monthTable2.default, (0, _extends3.default)({}, tableProps, { onSelectMonth: this.onSelectCell })), _tables[_utils.CALENDAR_MODE_YEAR] = _react2.default.createElement(_yearTable2.default, (0, _extends3.default)({}, tableProps, { rtl: rtl, onSelectYear: this.onSelectCell })), _tables);
229
230 var panelHeaders = (_panelHeaders = {}, _panelHeaders[_utils.CALENDAR_MODE_DATE] = _react2.default.createElement(_datePanelHeader2.default, headerProps), _panelHeaders[_utils.CALENDAR_MODE_MONTH] = _react2.default.createElement(_monthPanelHeader2.default, headerProps), _panelHeaders[_utils.CALENDAR_MODE_YEAR] = _react2.default.createElement(_yearPanelHeader2.default, headerProps), _panelHeaders);
231
232 return _react2.default.createElement(
233 'div',
234 (0, _extends3.default)({}, _util.obj.pickOthers(Calendar.propTypes, others), { className: classNames }),
235 shape === 'panel' ? panelHeaders[state.mode] : _react2.default.createElement(_cardHeader2.default, headerProps),
236 tables[state.mode]
237 );
238 };
239
240 return Calendar;
241}(_react.Component), _class.propTypes = (0, _extends3.default)({}, _configProvider2.default.propTypes, {
242 prefix: _propTypes2.default.string,
243 rtl: _propTypes2.default.bool,
244 /**
245 * 默认选中的日期(moment 对象)
246 */
247 defaultValue: _utils.checkMomentObj,
248 /**
249 * 选中的日期值 (moment 对象)
250 */
251 value: _utils.checkMomentObj,
252 /**
253 * 面板模式
254 */
255 mode: _propTypes2.default.oneOf(_utils.CALENDAR_MODES), // 生成 API 文档需要手动改回 ['date', 'month', 'year']
256 // 面板可变化的模式列表,仅初始化时接收一次
257 modes: _propTypes2.default.array,
258 // 禁用更改面板模式,采用 dropdown 的方式切换显示日期 (暂不正式对外透出)
259 disableChangeMode: _propTypes2.default.bool,
260 // 日期值的格式(用于日期title显示的格式)
261 format: _propTypes2.default.string,
262 /**
263 * 是否展示非本月的日期
264 */
265 showOtherMonth: _propTypes2.default.bool,
266 /**
267 * 默认展示的月份
268 */
269 defaultVisibleMonth: _propTypes2.default.func,
270 /**
271 * 展现形态
272 */
273 shape: _propTypes2.default.oneOf(['card', 'fullscreen', 'panel']),
274 /**
275 * 选择日期单元格时的回调
276 * @param {Object} value 对应的日期值 (moment 对象)
277 */
278 onSelect: _propTypes2.default.func,
279 /**
280 * 面板模式变化时的回调
281 * @param {String} mode 对应面板模式 date month year
282 */
283 onModeChange: _propTypes2.default.func,
284 /**
285 * 展现的月份变化时的回调
286 * @param {Object} value 显示的月份 (moment 对象)
287 * @param {String} reason 触发月份改变原因
288 */
289 onVisibleMonthChange: _propTypes2.default.func,
290 /**
291 * 自定义样式类
292 */
293 className: _propTypes2.default.string,
294 /**
295 * 自定义日期渲染函数
296 * @param {Object} value 日期值(moment对象)
297 * @returns {ReactNode}
298 */
299 dateCellRender: _propTypes2.default.func,
300 /**
301 * 自定义月份渲染函数
302 * @param {Object} calendarDate 对应 Calendar 返回的自定义日期对象
303 * @returns {ReactNode}
304 */
305 monthCellRender: _propTypes2.default.func,
306 yearCellRender: _propTypes2.default.func, // 兼容 0.x yearCellRender
307 /**
308 * 年份范围,[START_YEAR, END_YEAR] (只在shape 为 ‘card’, 'fullscreen' 下生效)
309 */
310 yearRange: _propTypes2.default.arrayOf(_propTypes2.default.number),
311 /**
312 * 不可选择的日期
313 * @param {Object} calendarDate 对应 Calendar 返回的自定义日期对象
314 * @param {String} view 当前视图类型,year: 年, month: 月, date: 日
315 * @returns {Boolean}
316 */
317 disabledDate: _propTypes2.default.func,
318 /**
319 * 国际化配置
320 */
321 locale: _propTypes2.default.object
322}), _class.defaultProps = {
323 prefix: 'next-',
324 rtl: false,
325 shape: 'fullscreen',
326 modes: _utils.CALENDAR_MODES,
327 disableChangeMode: false,
328 format: 'YYYY-MM-DD',
329 onSelect: _util.func.noop,
330 onVisibleMonthChange: _util.func.noop,
331 onModeChange: _util.func.noop,
332 dateCellRender: function dateCellRender(value) {
333 return value.date();
334 },
335 locale: _zhCn2.default.Calendar,
336 showOtherMonth: true
337}, _initialiseProps = function _initialiseProps() {
338 var _this2 = this;
339
340 this.onSelectCell = function (date, nextMode) {
341 var visibleMonth = _this2.state.visibleMonth;
342 var _props2 = _this2.props,
343 shape = _props2.shape,
344 showOtherMonth = _props2.showOtherMonth;
345
346 // 点击其他月份日期不生效
347
348 if (!showOtherMonth && !(0, _utils.isSameYearMonth)(visibleMonth, date)) {
349 return;
350 }
351
352 _this2.changeVisibleMonth(date, 'cellClick');
353
354 // 当用户所在的面板为初始化面板时,则选择动作为触发 onSelect 回调
355 if (_this2.state.mode === _this2.MODES[0]) {
356 _this2.props.onSelect(date);
357 }
358
359 if (shape === 'panel') {
360 _this2.changeMode(nextMode);
361 }
362 };
363
364 this.changeMode = function (nextMode) {
365 if (nextMode && _this2.MODES.indexOf(nextMode) > -1 && nextMode !== _this2.state.mode) {
366 _this2.setState({ mode: nextMode });
367 _this2.props.onModeChange(nextMode);
368 }
369 };
370
371 this.changeVisibleMonth = function (date, reason) {
372 if (!(0, _utils.isSameYearMonth)(date, _this2.state.visibleMonth)) {
373 _this2.setState({ visibleMonth: date });
374 _this2.props.onVisibleMonthChange(date, reason);
375 }
376 };
377
378 this.goPrevDecade = function () {
379 _this2.changeVisibleMonthByOffset(-10, 'years');
380 };
381
382 this.goNextDecade = function () {
383 _this2.changeVisibleMonthByOffset(10, 'years');
384 };
385
386 this.goPrevYear = function () {
387 _this2.changeVisibleMonthByOffset(-1, 'years');
388 };
389
390 this.goNextYear = function () {
391 _this2.changeVisibleMonthByOffset(1, 'years');
392 };
393
394 this.goPrevMonth = function () {
395 _this2.changeVisibleMonthByOffset(-1, 'months');
396 };
397
398 this.goNextMonth = function () {
399 _this2.changeVisibleMonthByOffset(1, 'months');
400 };
401}, _temp);
402Calendar.displayName = 'Calendar';
403exports.default = (0, _reactLifecyclesCompat.polyfill)(Calendar);
404module.exports = exports['default'];
\No newline at end of file