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 = { name: 'CalendarHeader', inheritAttrs: false, mixins: [BaseMixin], props: { prefixCls: PropTypes.string, value: PropTypes.object, // onValueChange: PropTypes.func, showTimePicker: PropTypes.looseBool, // 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, renderFooter: 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.$attrs.onMonthSelect) { 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); }, changeYear(direction) { if (direction > 0) { this.nextYear(); } else { this.previousYear(); } }, 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 timeClassName = showTimePicker ? ` ${prefixCls}-time-status` : ''; const year = ( this.showYearPanel('date')} title={showTimePicker ? null : 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, renderFooter, } = props; let panel = null; if (mode === 'month') { panel = ( this.showYearPanel('month')} disabledDate={disabledMonth} cellRender={props.monthCellRender} contentRender={props.monthCellContentRender} renderFooter={renderFooter} changeYear={this.changeYear} /> ); } if (mode === 'year') { panel = ( ); } if (mode === 'decade') { panel = ( ); } return ( ); }, }; export default CalendarHeader;