UNPKG

antd

Version:

An enterprise-class UI design language and React-based implementation

233 lines (218 loc) 8.67 kB
import _extends from 'babel-runtime/helpers/extends'; import _slicedToArray from 'babel-runtime/helpers/slicedToArray'; import _classCallCheck from 'babel-runtime/helpers/classCallCheck'; import _createClass from 'babel-runtime/helpers/createClass'; import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn'; import _inherits from 'babel-runtime/helpers/inherits'; import * as React from 'react'; import * as PropTypes from 'prop-types'; import * as moment from 'moment'; import FullCalendar from 'rc-calendar/es/FullCalendar'; import LocaleReceiver from '../locale-provider/LocaleReceiver'; import { PREFIX_CLS } from './Constants'; import Header from './Header'; import interopDefault from '../_util/interopDefault'; import enUS from './locale/en_US'; function noop() { return null; } function zerofixed(v) { if (v < 10) { return '0' + v; } return '' + v; } var Calendar = function (_React$Component) { _inherits(Calendar, _React$Component); function Calendar(props) { _classCallCheck(this, Calendar); var _this = _possibleConstructorReturn(this, (Calendar.__proto__ || Object.getPrototypeOf(Calendar)).call(this, props)); _this.monthCellRender = function (value) { var _this$props = _this.props, prefixCls = _this$props.prefixCls, _this$props$monthCell = _this$props.monthCellRender, monthCellRender = _this$props$monthCell === undefined ? noop : _this$props$monthCell; return React.createElement( 'div', { className: prefixCls + '-month' }, React.createElement( 'div', { className: prefixCls + '-value' }, value.localeData().monthsShort(value) ), React.createElement( 'div', { className: prefixCls + '-content' }, monthCellRender(value) ) ); }; _this.dateCellRender = function (value) { var _this$props2 = _this.props, prefixCls = _this$props2.prefixCls, _this$props2$dateCell = _this$props2.dateCellRender, dateCellRender = _this$props2$dateCell === undefined ? noop : _this$props2$dateCell; return React.createElement( 'div', { className: prefixCls + '-date' }, React.createElement( 'div', { className: prefixCls + '-value' }, zerofixed(value.date()) ), React.createElement( 'div', { className: prefixCls + '-content' }, dateCellRender(value) ) ); }; _this.setValue = function (value, way) { if (!('value' in _this.props)) { _this.setState({ value: value }); } if (way === 'select') { if (_this.props.onSelect) { _this.props.onSelect(value); } } else if (way === 'changePanel') { _this.onPanelChange(value, _this.state.mode); } }; _this.setType = function (type) { var mode = type === 'date' ? 'month' : 'year'; if (_this.state.mode !== mode) { _this.setState({ mode: mode }); _this.onPanelChange(_this.state.value, mode); } }; _this.onHeaderValueChange = function (value) { _this.setValue(value, 'changePanel'); }; _this.onHeaderTypeChange = function (type) { _this.setType(type); }; _this.onSelect = function (value) { _this.setValue(value, 'select'); }; _this.getDateRange = function (validRange, disabledDate) { return function (current) { if (!current) { return false; } var _validRange = _slicedToArray(validRange, 2), startDate = _validRange[0], endDate = _validRange[1]; var inRange = !current.isBetween(startDate, endDate, 'days', '[]'); if (disabledDate) { return disabledDate(current) || inRange; } return inRange; }; }; _this.renderCalendar = function (locale, localeCode) { var state = _this.state, props = _this.props; var value = state.value, mode = state.mode; if (value && localeCode) { value.locale(localeCode); } var prefixCls = props.prefixCls, style = props.style, className = props.className, fullscreen = props.fullscreen, dateFullCellRender = props.dateFullCellRender, monthFullCellRender = props.monthFullCellRender; var type = mode === 'year' ? 'month' : 'date'; var cls = className || ''; if (fullscreen) { cls += ' ' + prefixCls + '-fullscreen'; } var monthCellRender = monthFullCellRender || _this.monthCellRender; var dateCellRender = dateFullCellRender || _this.dateCellRender; var disabledDate = props.disabledDate; if (props.validRange) { disabledDate = _this.getDateRange(props.validRange, disabledDate); } return React.createElement( 'div', { className: cls, style: style }, React.createElement(Header, { fullscreen: fullscreen, type: type, value: value, locale: locale.lang, prefixCls: prefixCls, onTypeChange: _this.onHeaderTypeChange, onValueChange: _this.onHeaderValueChange, validRange: props.validRange }), React.createElement(FullCalendar, _extends({}, props, { disabledDate: disabledDate, Select: noop, locale: locale.lang, type: type, prefixCls: prefixCls, showHeader: false, value: value, monthCellRender: monthCellRender, dateCellRender: dateCellRender, onSelect: _this.onSelect })) ); }; var value = props.value || props.defaultValue || interopDefault(moment)(); if (!interopDefault(moment).isMoment(value)) { throw new Error('The value/defaultValue of Calendar must be a moment object after `antd@2.0`, ' + 'see: https://u.ant.design/calendar-value'); } _this.state = { value: value, mode: props.mode }; return _this; } _createClass(Calendar, [{ key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { if ('value' in nextProps) { this.setState({ value: nextProps.value }); } if ('mode' in nextProps && nextProps.mode !== this.props.mode) { this.setState({ mode: nextProps.mode }); } } }, { key: 'onPanelChange', value: function onPanelChange(value, mode) { var _props = this.props, onPanelChange = _props.onPanelChange, onChange = _props.onChange; if (onPanelChange) { onPanelChange(value, mode); } if (onChange && value !== this.state.value) { onChange(value); } } }, { key: 'render', value: function render() { return React.createElement( LocaleReceiver, { componentName: 'Calendar', defaultLocale: enUS }, this.renderCalendar ); } }]); return Calendar; }(React.Component); export default Calendar; Calendar.defaultProps = { locale: {}, fullscreen: true, prefixCls: PREFIX_CLS, mode: 'month', onSelect: noop, onPanelChange: noop, onChange: noop }; Calendar.propTypes = { monthCellRender: PropTypes.func, dateCellRender: PropTypes.func, monthFullCellRender: PropTypes.func, dateFullCellRender: PropTypes.func, fullscreen: PropTypes.bool, locale: PropTypes.object, prefixCls: PropTypes.string, className: PropTypes.string, style: PropTypes.object, onPanelChange: PropTypes.func, value: PropTypes.object, onSelect: PropTypes.func, onChange: PropTypes.func };