import React from 'react'; import moment from 'moment'; import PropTypes from 'prop-types'; import MonthCalendar from 'rc-calendar/lib/MonthCalendar'; import RcDatePicker from 'rc-calendar/lib/Picker'; import classNames from 'classnames'; import omit from 'omit.js'; import assign from 'object-assign'; import Icon from '../icon'; import { getLocaleCode } from '../_util/getLocale'; import warning from '../_util/warning'; export interface PickerProps { value?: moment.Moment; prefixCls: string; } export default function createPicker(TheCalendar) { // use class typescript error const CalenderWrapper = React.createClass({ contextTypes: { antLocale: PropTypes.object, }, getDefaultProps() { return { prefixCls: 'ant-calendar', allowClear: true, showToday: true, }; }, getInitialState() { const props = this.props; const value = props.value || props.defaultValue; if (value && !moment.isMoment(value)) { throw new Error( 'The value/defaultValue of DatePicker or MonthPicker must be ' + 'a moment object after `antd@2.0`, see: http://u.ant.design/date-picker-value', ); } return { value, }; }, componentWillReceiveProps(nextProps: PickerProps) { if ('value' in nextProps) { this.setState({ value: nextProps.value, }); } }, clearSelection(e) { e.preventDefault(); e.stopPropagation(); this.handleChange(null); }, handleChange(value) { const props = this.props; if (!('value' in props)) { this.setState({ value }); } props.onChange(value, (value && value.format(props.format)) || ''); }, render() { const { value } = this.state; const props = omit(this.props, ['onChange']); const { prefixCls, locale } = props; const placeholder = ('placeholder' in props) ? props.placeholder : locale.lang.placeholder; const disabledTime = props.showTime ? props.disabledTime : null; const calendarClassName = classNames({ [`${prefixCls}-time`]: props.showTime, [`${prefixCls}-month`]: MonthCalendar === TheCalendar, }); let pickerChangeHandler: Object = {}; let calendarHandler: Object = {}; if (props.showTime) { calendarHandler = { // fix https://github.com/ant-design/ant-design/issues/1902 onSelect: this.handleChange, }; } else { pickerChangeHandler = { onChange: this.handleChange, }; } warning(!('onOK' in props), 'It should be `DatePicker[onOk]` or `MonthPicker[onOk]`, instead of `onOK`!'); const calendar = ( ); // default width for showTime const pickerStyle = {} as any; if (props.showTime) { pickerStyle.width = (props.style && props.style.width) || 154; } const clearIcon = (!props.disabled && props.allowClear && value) ? ( ) : null; const input = ({ value: inputValue }) => ( {clearIcon} ); const pickerValue = value; const localeCode = getLocaleCode(this.context); if (pickerValue && localeCode) { pickerValue.locale(localeCode); } return ( {input} ); }, }); return CalenderWrapper; }