bee-datepicker
Version:
DatePicker ui component for react
128 lines (123 loc) • 3.97 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import CalendarHeader from '../calendar/CalendarHeader';
import DateTable from '../date/DateTable';
import DateInput from '../date/DateInput';
import { getTimeConfig } from '../util/index';
export default class CalendarPart extends React.Component {
static propTypes = {
prefixCls: PropTypes.string,
value: PropTypes.any,
hoverValue: PropTypes.any,
selectedValue: PropTypes.any,
direction: PropTypes.any,
locale: PropTypes.any,
showDateInput: PropTypes.bool,
showTimePicker: PropTypes.bool,
format: PropTypes.any,
placeholder: PropTypes.any,
disabledDate: PropTypes.any,
timePicker: PropTypes.any,
disabledTime: PropTypes.any,
onInputChange: PropTypes.func,
onInputSelect: PropTypes.func,
timePickerDisabledTime: PropTypes.object,
enableNext: PropTypes.any,
enablePrev: PropTypes.any,
clearIcon: PropTypes.node,
}
render() {
const props = this.props;
const {
prefixCls,
value,
hoverValue,
selectedValue,
mode,
direction,
locale, format, placeholder,
disabledDate, timePicker, disabledTime,
timePickerDisabledTime, showTimePicker,
onInputChange, onInputSelect, enablePrev, enableNext,
clearIcon,renderError,inputTabIndex,
onInputBlur
} = props;
const shouldShowTimePicker = showTimePicker && timePicker;
const disabledTimeConfig = shouldShowTimePicker && disabledTime ?
getTimeConfig(selectedValue, disabledTime) : null;
const rangeClassName = `${prefixCls}-range`;
const newProps = {
locale,
value,
prefixCls,
showTimePicker,
};
const index = direction === 'left' ? 0 : 1;
const timePickerEle = shouldShowTimePicker &&
React.cloneElement(timePicker, {
showHour: true,
showMinute: true,
showSecond: true,
...timePicker.props,
...disabledTimeConfig,
...timePickerDisabledTime,
onChange: onInputChange,
defaultOpenValue: value,
value: selectedValue[index],
});
const dateInputElement = props.showDateInput &&
<DateInput
isRange={true}
format={format}
locale={locale}
prefixCls={prefixCls}
timePicker={timePicker}
disabledDate={disabledDate}
placeholder={placeholder}
disabledTime={disabledTime}
value={value}
showClear={false}
selectedValue={selectedValue[index]}
onChange={onInputChange}
onSelect={onInputSelect}
clearIcon={clearIcon}
renderError={renderError}
inputTabIndex={inputTabIndex}
onBlur={onInputBlur}
/>;
return (
<div
className={`${rangeClassName}-part ${rangeClassName}-${direction}`}
>
{dateInputElement}
<div style={{ outline: 'none' }} tabIndex={props.tabIndex} className={`${rangeClassName}-out`}>
<CalendarHeader
{...newProps}
mode={mode}
enableNext={enableNext}
enablePrev={enablePrev}
onValueChange={props.onValueChange}
onPanelChange={props.onPanelChange}
disabledMonth={props.disabledMonth}
/>
{showTimePicker ? <div className={`${prefixCls}-time-picker`}>
<div className={`${prefixCls}-time-picker-panel`}>
{timePickerEle}
</div>
</div> : null}
<div className={`${prefixCls}-body`}>
<DateTable
{...newProps}
hoverValue={hoverValue}
selectedValue={selectedValue}
dateRender={props.dateRender}
onSelect={props.onSelect}
onDayHover={props.onDayHover}
disabledDate={disabledDate}
showWeekNumber={props.showWeekNumber}
/>
</div>
</div>
</div>);
}
}