ttk-app-core
Version:
enterprise develop framework
160 lines (144 loc) • 5.29 kB
JavaScript
import React from 'react'
import { DatePicker } from 'antd'
import classNames from 'classnames'
import moment from 'moment'
import { transformMomentDate } from '../../../utils/date/index'
const MonthPicker = DatePicker.MonthPicker
class DateRangeMonthPicker extends React.Component{
constructor(props){
super(props)
this.state = {
preValue: props.value && props.value[0] ? props.value[0] : null,
nextValue: props.value && props.value[1] ? props.value[1] : null,
visible: false
}
}
componentWillReceiveProps(nextProps){
this.setState({
preValue: nextProps.value && nextProps.value[0] ? nextProps.value[0] : null,
nextValue: nextProps.value && nextProps.value[1] ? nextProps.value[1] : null,
})
}
transformDateToNum=(date)=>{
if (!date) {
return 0
}
let time = date
if( typeof date == 'string' ){
try{
time = transformMomentDate(date)
}catch(err){
time = moment()
}
}
return parseInt(`${time.year()}${time.month() < 10 ? `0${time.month()}` : `${time.month()}`}`)
}
dateWindowChange = (type, status) => {
if( type == 'next' ){
this.setState({
visible: status
})
}
if( type == 'next' && status == false ){
// 采用异步是因为datePicker的onchange事件晚于onOpenChange触发
setTimeout(()=>{
this.update()
}, 0)
}
}
dateChange = (type, value) => {
// 针对setstate设置this.state是异步的,因为update需要取值
this.state[type] = value
this.setState({
[type]: value,
visible: type == 'nextValue' ? false : true
})
if( type == 'preValue' ){
const preNum = this.transformDateToNum(value)
const { nextValue } = this.state
const nextNum = this.transformDateToNum(nextValue)
if( nextNum < preNum ){
this.setState({
nextValue: value
})
}
}
}
nextClick=()=>{
this.setState({
visible: true
})
}
update = () => {
const { preValue, nextValue } = this.state
if( this.props.onChange ){
this.props.onChange([ preValue, nextValue ])
}
if( this.props.onPanelChange ){
this.props.onPanelChange([ preValue, nextValue ])
}
}
// transformDateToNum = (date) => {
// let time = date
// if (typeof date == 'string') {
// time = moment(new Date(date))
// }
// return parseInt(`${time.year()}${time.month() < 10 ? `0${time.month()}` : `${time.month()}`}`)
// }
disabledStartDate = (currentValue) => {
const { startEnableDate } = this.props
const { nextValue } = this.state
if( !nextValue && !startEnableDate ){
return false
}
if( !startEnableDate ) {
return this.transformDateToNum(nextValue) < this.transformDateToNum(currentValue)
}else{
return this.transformDateToNum(currentValue) < this.transformDateToNum(startEnableDate)
}
return false
}
disabledEndDate = (currentValue) => {
const { endEnableDate } = this.props
const { preValue } = this.state
if( !preValue && !endEnableDate ){
return false
}
if( !endEnableDate ) {
return this.transformDateToNum(preValue) > this.transformDateToNum(currentValue)
}else{
return this.transformDateToNum(preValue) > this.transformDateToNum(currentValue) || this.transformDateToNum(currentValue) > this.transformDateToNum(endEnableDate)
}
return false
}
render(){
const { preValue, nextValue, visible } = this.state
const props = this.props
let className = classNames({
'mk-dateRangeMonthPicker': true,
[props.className]: !!props.className
})
return (
<div className={className}>
<MonthPicker
{ ...props }
disabledDate={ props.disabledStartDate ? props.disabledStartDate : this.disabledStartDate }
value={ preValue }
onOpenChange={(status) => this.dateWindowChange('pre', status)}
onChange={ (value) => this.dateChange('preValue', value) }
/>
<span style={{padding: '0 3px', lineHeight: '30px'}}>-</span>
<MonthPicker
{...props}
disabledDate={ props.disabledEndDate ? props.disabledEndDate : this.disabledEndDate}
onClick={ this.nextClick }
value={ nextValue }
open={ visible }
onOpenChange={(status) => this.dateWindowChange('next', status)}
onChange={ (value) => this.dateChange('nextValue', value) }
/>
</div>
)
}
}
export default DateRangeMonthPicker