RangePicker.jsx 4.3 KB
Newer Older
B
Benjy Cui 已提交
1 2 3
import React from 'react';
import GregorianCalendar from 'gregorian-calendar';
import RangeCalendar from 'rc-calendar/lib/RangeCalendar';
A
afc163 已提交
4 5
import DatePicker from 'rc-calendar/lib/Picker';
import TimePicker from 'rc-time-picker';
B
Benjy Cui 已提交
6 7 8 9 10 11 12
import classNames from 'classnames';
import PickerMixin from './PickerMixin';

export default React.createClass({
  getDefaultProps() {
    return {
      defaultValue: [],
A
afc163 已提交
13
      format: 'yyyy-MM-dd',
B
Benjy Cui 已提交
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
      startPlaceholder: '开始时间',
      endPlaceholder: '结束时间',
      transitionName: 'slide-up',
      popupStyle: {},
      onChange() {
      },  // onChange 可用于 Validator
      locale: {},
      align: {
        offset: [0, -9],
      },
      open: false
    };
  },
  getInitialState() {
    const {value, defaultValue} = this.props;
    const start = (value && value[0]) || defaultValue[0];
    const end = (value && value[1]) || defaultValue[1];
    return {
      value: [
        this.parseDateFromValue(start),
        this.parseDateFromValue(end)
      ]
    };
  },
  mixins: [ PickerMixin ],
  componentWillReceiveProps(nextProps) {
    if ('value' in nextProps) {
      const start = this.parseDateFromValue(nextProps.value[0]);
      const end = this.parseDateFromValue(nextProps.value[1]);
      this.setState({
        value: [start, end]
      });
    }
  },
  handleChange(value) {
A
afc163 已提交
49 50 51
    if (!('value' in this.props)) {
      this.setState({ value });
    }
B
Benjy Cui 已提交
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
    const startTime = value[0] ? new Date(value[0].getTime()) : null;
    const endTime = value[1] ? new Date(value[1].getTime()) : null;
    this.props.onChange([startTime, endTime]);
  },
  render() {
    const locale = this.getLocale();
    // 以下两行代码
    // 给没有初始值的日期选择框提供本地化信息
    // 否则会以周日开始排
    let defaultCalendarValue = new GregorianCalendar(locale);
    defaultCalendarValue.setTime(Date.now());

    const {disabledDate, showTime, size, startPlaceholder, endPlaceholder,
           transitionName, disabled, popupStyle, align, style} = this.props;
    const state = this.state;

A
afc163 已提交
68 69 70 71 72 73 74 75 76 77 78 79 80
    const timePicker = showTime
      ? <TimePicker prefixCls="ant-time-picker"
          placeholder={locale.lang.timePlaceholder}
          transitionName="slide-up" />
      : null;

    const calendarClassName = classNames({
      ['ant-calendar-time']: this.props.showTime,
    });

    const calendar = <RangeCalendar prefixCls="ant-calendar"
                        className={calendarClassName}
                        timePicker={timePicker}
B
Benjy Cui 已提交
81 82 83
                        disabledDate={disabledDate}
                        locale={locale.lang}
                        defaultValue={defaultCalendarValue}
A
afc163 已提交
84
                        showClear />;
B
Benjy Cui 已提交
85 86 87 88 89 90 91

    const pickerClass = classNames({
      'ant-calendar-picker': true,
      'ant-calendar-picker-open': state.open
    });

    const pickerInputClass = classNames({
A
afc163 已提交
92
      'ant-calendar-range-picker': true,
B
Benjy Cui 已提交
93 94
      'ant-input': true,
      'ant-input-lg': size === 'large',
A
afc163 已提交
95
      'ant-input-sm': size === 'small',
B
Benjy Cui 已提交
96 97
    });

A
afc163 已提交
98 99
    return (<span className={pickerClass} style={style}>
      <DatePicker
B
Benjy Cui 已提交
100 101 102 103 104 105 106 107 108 109 110 111 112 113
        transitionName={transitionName}
        disabled={disabled}
        calendar={calendar}
        value={state.value}
        prefixCls="ant-calendar-picker-container"
        style={popupStyle}
        align={align}
        onOpen={this.toggleOpen}
        onClose={this.toggleOpen}
        onChange={this.handleChange}>
        {
          ({value}) => {
            const start = value[0];
            const end = value[1];
A
afc163 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
            return (
              <span className={pickerInputClass} disabled={disabled}>
                <input disabled={disabled}
                  onChange={this.handleInputChange}
                  value={start && this.getFormatter().format(start)}
                  placeholder={startPlaceholder}
                  className="ant-calendar-range-picker-input" />
                <span> ~ </span>
                <input disabled={disabled}
                  onChange={this.handleInputChange}
                  value={end && this.getFormatter().format(end)}
                  placeholder={endPlaceholder}
                  className="ant-calendar-range-picker-input" />
                <span className="ant-calendar-picker-icon" />
              </span>
            );
B
Benjy Cui 已提交
130 131
          }
        }
A
afc163 已提交
132
      </DatePicker>
B
Benjy Cui 已提交
133 134 135
    </span>);
  }
});