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 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,
// locale: PropTypes.object,
// onTypeChange: PropTypes.func,
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,
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
}
return {
sType: type,
}
},
watch: {
type (val) {
this.setState({
sType: 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 = (