import * as React from 'react'; import { PureComponent } from 'react'; import cx from 'classnames'; import isDate from 'zent/es/utils/isDate'; import { I18nReceiver as Receiver } from '../i18n'; import { TIME_BEGIN, commonProps } from './constants'; import DatePicker from './DatePicker'; import { DatePickers } from './common/types'; import noop from 'lodash-es/noop'; // type const START = 'start'; const END = 'end'; function compatibleInterface(prop) { if (!prop) return []; if (Array.isArray(prop)) return prop; return typeof prop === 'string' || isDate(prop) ? [prop, prop] : prop; } export interface IDateRangePickerProps extends DatePickers.ICommonProps { showTime?: boolean; disabledTime?: (type: DatePickers.RangeType) => DatePickers.IDisabledTime; } export class DateRangePicker extends PureComponent { static defaultProps = { ...commonProps, disabledDate: noop, placeholder: ['', ''], format: 'YYYY-MM-DD', value: [], openPanel: [], defaultTime: [TIME_BEGIN, TIME_BEGIN], disabledTime: () => undefined, }; onChange = (type: DatePickers.RangeType) => { return val => { const { onChange, value } = this.props; const ret = value ? value.slice() : []; if (type === START) { ret.length === 2 ? ret.splice(0, 1, val) : ret.splice(0, 1, val, ''); } else { ret.length === 0 ? ret.splice(1, 1, '', val) : ret.splice(1, 1, val); } onChange(ret as any); }; }; renderPicker() { const { className, defaultTime, defaultValue, disabledDate, onChange, onClick, onClose, onOpen, openPanel, placeholder, value, disabledTime, ...pickerProps } = this.props; // 兼容老 api ,支持传入字符串 const timeArr = compatibleInterface(defaultTime); const defaultValueArr = compatibleInterface(defaultValue); const rangePicker = (
{i18n => ( onClick && onClick(val, START)} onOpen={() => onOpen && onOpen(START)} onClose={() => onClose && onClose(START)} onChange={this.onChange(START)} disabledDate={val => disabledDate(val, START)} disabledTime={() => disabledTime(START)} /> )} {i18n => {i18n.to}} {i18n => ( onClick && onClick(val, END)} onOpen={() => onOpen && onOpen(END)} onClose={() => onClose && onClose(END)} onChange={this.onChange(END)} disabledDate={val => disabledDate(val, END)} disabledTime={() => disabledTime(END)} /> )}
); return rangePicker; } render() { const { prefix, className } = this.props; const prefixCls = cx( `${prefix}-datetime-picker`, `${prefix}-daterange-picker`, className ); return
{this.renderPicker()}
; } } export default DateRangePicker;