import PropTypes from '../../../_util/vue-types' import BaseMixin from '../../../_util/BaseMixin' import { getOptionProps } from '../../../_util/props-util' import MonthPanel from '../month/MonthPanel' import YearPanel from '../year/YearPanel' import DecadePanel from '../decade/DecadePanel' function noop () {} function goMonth (direction) { const next = this.value.clone() next.add(direction, 'months') this.__emit('valueChange', next) } function goYear (direction) { const next = this.value.clone() next.add(direction, 'years') this.__emit('valueChange', next) } function showIf (condition, el) { return condition ? el : null } const CalendarHeader = { mixins: [BaseMixin], props: { prefixCls: PropTypes.string, value: PropTypes.object, // onValueChange: PropTypes.func, showTimePicker: PropTypes.bool, // onPanelChange: PropTypes.func, locale: PropTypes.object, enablePrev: PropTypes.any.def(1), enableNext: PropTypes.any.def(1), disabledMonth: PropTypes.func, mode: PropTypes.any, monthCellRender: PropTypes.func, monthCellContentRender: PropTypes.func, }, data () { this.nextMonth = goMonth.bind(this, 1) this.previousMonth = goMonth.bind(this, -1) this.nextYear = goYear.bind(this, 1) this.previousYear = goYear.bind(this, -1) return { yearPanelReferer: null, } }, methods: { onMonthSelect (value) { this.__emit('panelChange', value, 'date') if (this.$listeners.monthSelect) { this.__emit('monthSelect', value) } else { this.__emit('valueChange', value) } }, onYearSelect (value) { const referer = this.yearPanelReferer this.setState({ yearPanelReferer: null }) this.__emit('panelChange', value, referer) this.__emit('valueChange', value) }, onDecadeSelect (value) { this.__emit('panelChange', value, 'year') this.__emit('valueChange', value) }, monthYearElement (showTimePicker) { const props = this.$props const prefixCls = props.prefixCls const locale = props.locale const value = props.value const localeData = value.localeData() const monthBeforeYear = locale.monthBeforeYear const selectClassName = `${prefixCls}-${monthBeforeYear ? 'my-select' : 'ym-select'}` const year = ( this.showYearPanel('date')} title={locale.yearSelect} > {value.format(locale.yearFormat)} ) const month = ( {locale.monthFormat ? value.format(locale.monthFormat) : localeData.monthsShort(value)} ) let day if (showTimePicker) { day = ( {value.format(locale.dayFormat)} ) } let my = [] if (monthBeforeYear) { my = [month, day, year] } else { my = [year, month, day] } return ( {my} ) }, showMonthPanel () { // null means that users' interaction doesn't change value this.__emit('panelChange', null, 'month') }, showYearPanel (referer) { this.setState({ yearPanelReferer: referer }) this.__emit('panelChange', null, 'year') }, showDecadePanel () { this.__emit('panelChange', null, 'decade') }, }, render () { const props = getOptionProps(this) const { prefixCls, locale, mode, value, showTimePicker, enableNext, enablePrev, disabledMonth, } = props let panel = null if (mode === 'month') { panel = ( this.showYearPanel('month')} disabledDate={disabledMonth} cellRender={props.monthCellRender} contentRender={props.monthCellContentRender} /> ) } if (mode === 'year') { panel = ( ) } if (mode === 'decade') { panel = ( ) } return () }, } export default CalendarHeader