import moment from 'moment';
import PropTypes from '../../_util/vue-types';
import BaseMixin from '../../_util/BaseMixin';
import { getOptionProps, hasProp } from '../../_util/props-util';
import DateTable from './date/DateTable';
import MonthTable from './month/MonthTable';
import CalendarMixin, { getNowByCurrentStateValue } from './mixin/CalendarMixin';
import CommonMixin from './mixin/CommonMixin';
import CalendarHeader from './full-calendar/CalendarHeader';
import enUs from './locale/en_US';
const FullCalendar = {
props: {
locale: PropTypes.object.def(enUs),
format: PropTypes.string,
visible: PropTypes.bool.def(true),
prefixCls: PropTypes.string.def('rc-calendar'),
defaultType: PropTypes.string.def('date'),
type: PropTypes.string,
fullscreen: PropTypes.bool.def(false),
monthCellRender: PropTypes.func,
dateCellRender: PropTypes.func,
showTypeSwitch: PropTypes.bool.def(true),
Select: PropTypes.object.isRequired,
headerComponents: PropTypes.array,
headerComponent: PropTypes.object, // The whole header component
headerRender: PropTypes.func,
showHeader: PropTypes.bool.def(true),
disabledDate: PropTypes.func,
value: PropTypes.object,
defaultValue: PropTypes.object,
selectedValue: PropTypes.object,
defaultSelectedValue: PropTypes.object,
renderFooter: PropTypes.func.def(() => null),
renderSidebar: PropTypes.func.def(() => null),
},
mixins: [BaseMixin, CommonMixin, CalendarMixin],
data() {
let type;
if (hasProp(this, 'type')) {
type = this.type;
} else {
type = this.defaultType;
}
const props = this.$props;
return {
sType: type,
sValue: props.value || props.defaultValue || moment(),
sSelectedValue: props.selectedValue || props.defaultSelectedValue,
};
},
watch: {
type(val) {
this.setState({
sType: val,
});
},
value(val) {
const sValue = val || this.defaultValue || getNowByCurrentStateValue(this.sValue);
this.setState({
sValue,
});
},
selectedValue(val) {
this.setState({
sSelectedValue: val,
});
},
},
methods: {
onMonthSelect(value) {
this.onSelect(value, {
target: 'month',
});
},
setType(type) {
if (!hasProp(this, 'type')) {
this.setState({
sType: type,
});
}
this.__emit('typeChange', type);
},
},
render() {
const props = getOptionProps(this);
const {
locale,
prefixCls,
fullscreen,
showHeader,
headerComponent,
headerRender,
disabledDate,
} = props;
const { sValue: value, sType: type, $listeners } = this;
let header = null;
if (showHeader) {
if (headerRender) {
header = headerRender(value, type, locale);
} else {
const TheHeader = headerComponent || CalendarHeader;
const headerProps = {
props: {
...props,
prefixCls: `${prefixCls}-full`,
type,
value,
},
on: {
...$listeners,
typeChange: this.setType,
valueChange: this.setValue,
},
key: 'calendar-header',
};
header =