ant-design/components/date-picker/RangePicker.jsx
afc163 43d8c0a4a2 Fix DatePicker onChange and onOk when showTime
onChange should be triggered at clicking ok button
when showTime is true. You can use onChange replace onOk
anytime.

This commit revert a05b4e6, which break the behavious above.

close #2399, also fix #2120
2016-07-15 16:26:14 +08:00

158 lines
4.9 KiB
JavaScript

import React from 'react';
import GregorianCalendar from 'gregorian-calendar';
import RangeCalendar from 'rc-calendar/lib/RangeCalendar';
import RcDatePicker from 'rc-calendar/lib/Picker';
import classNames from 'classnames';
import Icon from '../icon';
export default class RangePicker extends React.Component {
static defaultProps = {
defaultValue: [],
}
constructor(props) {
super(props);
const { value, defaultValue, parseDateFromValue } = this.props;
const start = (value && value[0]) || defaultValue[0];
const end = (value && value[1]) || defaultValue[1];
this.state = {
value: [
parseDateFromValue(start),
parseDateFromValue(end),
],
};
}
componentWillReceiveProps(nextProps) {
if ('value' in nextProps) {
const value = nextProps.value || [];
const start = nextProps.parseDateFromValue(value[0]);
const end = nextProps.parseDateFromValue(value[1]);
this.setState({
value: [start, end],
});
}
}
clearSelection = (e) => {
e.preventDefault();
e.stopPropagation();
this.setState({ value: [] });
this.handleChange([]);
}
handleChange = (value) => {
const props = this.props;
if (!('value' in props)) {
this.setState({ value });
}
const startDate = value[0] ? new Date(value[0].getTime()) : null;
const endDate = value[1] ? new Date(value[1].getTime()) : null;
const startDateString = value[0] ? props.getFormatter().format(value[0]) : '';
const endDateString = value[1] ? props.getFormatter().format(value[1]) : '';
props.onChange([startDate, endDate], [startDateString, endDateString]);
}
render() {
const props = this.props;
const locale = props.locale;
// 以下两行代码
// 给没有初始值的日期选择框提供本地化信息
// 否则会以周日开始排
let defaultCalendarValue = new GregorianCalendar(locale);
defaultCalendarValue.setTime(Date.now());
const { disabledDate, showTime, getCalendarContainer,
transitionName, disabled, popupStyle, align, style, onOk } = this.props;
const state = this.state;
const calendarClassName = classNames({
'ant-calendar-time': showTime,
});
// 需要选择时间时,点击 ok 时才触发 onChange
let pickerChangeHandler = {
onChange: this.handleChange,
};
let calendarHandler = {
onOk: this.handleChange,
};
if (props.timePicker) {
pickerChangeHandler = {};
} else {
calendarHandler = {};
}
const startPlaceholder = ('startPlaceholder' in this.props)
? props.startPlaceholder : locale.lang.rangePlaceholder[0];
const endPlaceholder = ('endPlaceholder' in props)
? props.endPlaceholder : locale.lang.rangePlaceholder[1];
const calendar = (
<RangeCalendar
prefixCls="ant-calendar"
className={calendarClassName}
timePicker={props.timePicker}
disabledDate={disabledDate}
dateInputPlaceholder={[startPlaceholder, endPlaceholder]}
locale={locale.lang}
onOk={onOk}
defaultValue={[defaultCalendarValue, defaultCalendarValue]}
{...calendarHandler}
/>
);
const clearIcon = (!props.disabled && state.value && (state.value[0] || state.value[1]))
? <Icon
type="cross-circle"
className="ant-calendar-picker-clear"
onClick={this.clearSelection}
/> : null;
return (<span className={props.pickerClass} style={style}>
<RcDatePicker
formatter={props.getFormatter()}
transitionName={transitionName}
disabled={disabled}
calendar={calendar}
value={state.value}
prefixCls="ant-calendar-picker-container"
style={popupStyle}
align={align}
getCalendarContainer={getCalendarContainer}
onOpen={props.toggleOpen}
onClose={props.toggleOpen}
{...pickerChangeHandler}
>
{
({ value }) => {
const start = value[0];
const end = value[1];
return (
<span className={props.pickerInputClass} disabled={disabled}>
<input
disabled={disabled}
readOnly
value={start ? props.getFormatter().format(start) : ''}
placeholder={startPlaceholder}
className="ant-calendar-range-picker-input"
/>
<span className="ant-calendar-range-picker-separator"> ~ </span>
<input
disabled={disabled}
readOnly
value={end ? props.getFormatter().format(end) : ''}
placeholder={endPlaceholder}
className="ant-calendar-range-picker-input"
/>
{clearIcon}
<span className="ant-calendar-picker-icon" />
</span>
);
}
}
</RcDatePicker>
</span>);
}
}