Benjy Cui
9 years ago
2 changed files with 158 additions and 156 deletions
@ -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 ? (<TimePicker |
|||
prefixCls="ant-time-picker" |
|||
placeholder={locale.lang.timePlaceholder} |
|||
transitionName="slide-up" />) |
|||
: 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 = ( |
|||
<TheCalendar |
|||
disabledDate={props.disabledDate} |
|||
disabledTime={disabledTime} |
|||
locale={locale.lang} |
|||
timePicker={timePicker} |
|||
defaultValue={defaultCalendarValue} |
|||
dateInputPlaceholder={placeholder} |
|||
prefixCls="ant-calendar" |
|||
className={calendarClassName} |
|||
{...calendarHandler} /> |
|||
); |
|||
|
|||
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 ( |
|||
<span className={pickerClass} style={{ ...pickerStyle, ...props.style }}> |
|||
<RcDatePicker |
|||
transitionName={props.transitionName} |
|||
disabled={props.disabled} |
|||
calendar={calendar} |
|||
value={this.state.value} |
|||
prefixCls="ant-calendar-picker-container" |
|||
style={props.popupStyle} |
|||
align={props.align} |
|||
getCalendarContainer={props.getCalendarContainer} |
|||
onOpen={this.toggleOpen} |
|||
onClose={this.toggleOpen} |
|||
{...pickerChangeHandler} |
|||
> |
|||
{ |
|||
({ value }) => { |
|||
return ( |
|||
<span> |
|||
<input |
|||
disabled={props.disabled} |
|||
onChange={this.handleInputChange} |
|||
value={value && this.getFormatter().format(value)} |
|||
placeholder={placeholder} |
|||
className={inputClass} /> |
|||
<span className="ant-calendar-picker-icon" /> |
|||
</span> |
|||
); |
|||
} |
|||
} |
|||
</RcDatePicker> |
|||
</span> |
|||
); |
|||
} |
|||
}); |
|||
} |
Loading…
Reference in new issue