From 6157d210893eb51c54eff1155503a56d8a917209 Mon Sep 17 00:00:00 2001 From: Benjy Cui Date: Wed, 30 Mar 2016 09:50:44 +0800 Subject: [PATCH] refactor: DatePicker --- components/date-picker/createPicker.jsx | 157 ++++++++++++++++++++++++ components/date-picker/index.jsx | 157 +----------------------- 2 files changed, 158 insertions(+), 156 deletions(-) create mode 100644 components/date-picker/createPicker.jsx diff --git a/components/date-picker/createPicker.jsx b/components/date-picker/createPicker.jsx new file mode 100644 index 0000000000..c48e62b537 --- /dev/null +++ b/components/date-picker/createPicker.jsx @@ -0,0 +1,157 @@ +import React from 'react'; +import MonthCalendar from 'rc-calendar/lib/MonthCalendar'; +import RcDatePicker from 'rc-calendar/lib/Picker'; +import GregorianCalendar from 'gregorian-calendar'; +import TimePicker from 'rc-time-picker'; +import classNames from 'classnames'; +import PickerMixin from './PickerMixin'; + +export default function createPicker(TheCalendar, defaultFormat) { + return React.createClass({ + getDefaultProps() { + return { + format: defaultFormat || 'yyyy-MM-dd', + transitionName: 'slide-up', + popupStyle: {}, + onChange() { + }, + onOk() { + }, + locale: {}, + align: { + offset: [0, -9], + }, + open: false, + }; + }, + getInitialState() { + return { + value: this.parseDateFromValue(this.props.value || this.props.defaultValue) + }; + }, + mixins: [PickerMixin], + componentWillReceiveProps(nextProps) { + if ('value' in nextProps) { + this.setState({ + value: this.parseDateFromValue(nextProps.value) + }); + } + }, + handleChange(value) { + if (!('value' in this.props)) { + this.setState({ value }); + } + const timeValue = value ? new Date(value.getTime()) : null; + this.props.onChange(timeValue, value ? this.getFormatter().format(value) : ''); + }, + render() { + const props = this.props; + const locale = this.getLocale(); + // 以下两行代码 + // 给没有初始值的日期选择框提供本地化信息 + // 否则会以周日开始排 + let defaultCalendarValue = new GregorianCalendar(locale); + defaultCalendarValue.setTime(Date.now()); + + const placeholder = ('placeholder' in props) + ? props.placeholder : locale.lang.placeholder; + + const timePicker = props.showTime ? () + : null; + + const disabledTime = props.showTime ? props.disabledTime : null; + + const calendarClassName = classNames({ + ['ant-calendar-time']: props.showTime, + ['ant-calendar-month']: MonthCalendar === TheCalendar, + }); + + let pickerChangeHandler = { + onChange: this.handleChange, + }; + + let calendarHandler = { + onOk: this.handleChange, + }; + + if (props.showTime) { + pickerChangeHandler.onChange = (value) => { + // Click clear button + if (value === null) { + this.handleChange(value); + } + }; + } else { + calendarHandler = {}; + } + + const calendar = ( + + ); + + const pickerClass = classNames({ + 'ant-calendar-picker': true, + 'ant-calendar-picker-open': this.state.open, + }); + + const inputClass = classNames({ + 'ant-calendar-picker-input': true, + 'ant-input': true, + 'ant-input-lg': props.size === 'large', + 'ant-input-sm': props.size === 'small', + }); + + // default width for showTime + const pickerStyle = {}; + if (props.showTime) { + pickerStyle.width = 180; + } + + return ( + + + { + ({ value }) => { + return ( + + + + + ); + } + } + + + ); + } + }); +} diff --git a/components/date-picker/index.jsx b/components/date-picker/index.jsx index 5c311f55f9..5323aaf746 100644 --- a/components/date-picker/index.jsx +++ b/components/date-picker/index.jsx @@ -1,163 +1,8 @@ -import React from 'react'; import RcCalendar from 'rc-calendar'; import MonthCalendar from 'rc-calendar/lib/MonthCalendar'; -import RcDatePicker from 'rc-calendar/lib/Picker'; -import GregorianCalendar from 'gregorian-calendar'; +import createPicker from './createPicker'; import RangePicker from './RangePicker'; -import PickerMixin from './PickerMixin'; import Calendar from './Calendar'; -import TimePicker from 'rc-time-picker'; -import classNames from 'classnames'; - -function createPicker(TheCalendar, defaultFormat) { - return React.createClass({ - getDefaultProps() { - return { - format: defaultFormat || 'yyyy-MM-dd', - transitionName: 'slide-up', - popupStyle: {}, - onChange() { - }, - onOk() { - }, - locale: {}, - align: { - offset: [0, -9], - }, - open: false, - }; - }, - getInitialState() { - return { - value: this.parseDateFromValue(this.props.value || this.props.defaultValue) - }; - }, - mixins: [PickerMixin], - componentWillReceiveProps(nextProps) { - if ('value' in nextProps) { - this.setState({ - value: this.parseDateFromValue(nextProps.value) - }); - } - }, - handleChange(value) { - if (!('value' in this.props)) { - this.setState({ value }); - } - const timeValue = value ? new Date(value.getTime()) : null; - this.props.onChange(timeValue, value ? this.getFormatter().format(value) : ''); - }, - render() { - const props = this.props; - const locale = this.getLocale(); - // 以下两行代码 - // 给没有初始值的日期选择框提供本地化信息 - // 否则会以周日开始排 - let defaultCalendarValue = new GregorianCalendar(locale); - defaultCalendarValue.setTime(Date.now()); - - const placeholder = ('placeholder' in props) - ? props.placeholder : locale.lang.placeholder; - - const timePicker = props.showTime ? () - : null; - - const disabledTime = props.showTime ? props.disabledTime : null; - - const calendarClassName = classNames({ - ['ant-calendar-time']: props.showTime, - ['ant-calendar-month']: MonthCalendar === TheCalendar, - }); - - let pickerChangeHandler = { - onChange: this.handleChange, - }; - - let calendarHandler = { - onOk: this.handleChange, - }; - - if (props.showTime) { - pickerChangeHandler.onChange = (value) => { - // Click clear button - if (value === null) { - this.handleChange(value); - } - }; - } else { - calendarHandler = {}; - } - - const calendar = ( - - ); - - const pickerClass = classNames({ - 'ant-calendar-picker': true, - 'ant-calendar-picker-open': this.state.open, - }); - - const inputClass = classNames({ - 'ant-calendar-picker-input': true, - 'ant-input': true, - 'ant-input-lg': props.size === 'large', - 'ant-input-sm': props.size === 'small', - }); - - // default width for showTime - const pickerStyle = {}; - if (props.showTime) { - pickerStyle.width = 180; - } - - return ( - - - { - ({ value }) => { - return ( - - - - - ); - } - } - - - ); - } - }); -} const DatePicker = createPicker(RcCalendar); const MonthPicker = createPicker(MonthCalendar, 'yyyy-MM');