ant-design-vue/components/vc-calendar/src/MonthCalendar.jsx

120 lines
3.5 KiB
React
Raw Normal View History

2018-03-19 02:16:27 +00:00
2018-03-10 14:10:13 +00:00
import PropTypes from '@/components/_util/vue-types'
import BaseMixin from '@/components/_util/BaseMixin'
import KeyCode from '@/components/_util/KeyCode'
import CalendarHeader from './calendar/CalendarHeader'
import CalendarFooter from './calendar/CalendarFooter'
import CalendarMixin from './mixin/CalendarMixin'
import CommonMixin from './mixin/CommonMixin'
2018-03-12 14:13:59 +00:00
import enUs from './locale/en_US'
2018-03-10 14:10:13 +00:00
const MonthCalendar = {
props: {
2018-03-12 14:13:59 +00:00
locale: PropTypes.object.def(enUs),
2018-03-17 13:38:29 +00:00
format: PropTypes.string,
2018-03-12 14:13:59 +00:00
visible: PropTypes.bool.def(true),
prefixCls: PropTypes.string.def('rc-calendar'),
2018-03-10 14:10:13 +00:00
monthCellRender: PropTypes.func,
dateCellRender: PropTypes.func,
2018-03-12 14:13:59 +00:00
disabledDate: PropTypes.func,
monthCellContentRender: PropTypes.func,
renderFooter: PropTypes.func.def(() => null),
renderSidebar: PropTypes.func.def(() => null),
2018-03-10 14:10:13 +00:00
},
mixins: [BaseMixin, CommonMixin, CalendarMixin],
data () {
return { mode: 'month' }
},
methods: {
onKeyDown (event) {
const keyCode = event.keyCode
const ctrlKey = event.ctrlKey || event.metaKey
const stateValue = this.sValue
const { disabledDate } = this
let value = stateValue
switch (keyCode) {
case KeyCode.DOWN:
value = stateValue.clone()
value.add(3, 'months')
break
case KeyCode.UP:
value = stateValue.clone()
value.add(-3, 'months')
break
case KeyCode.LEFT:
value = stateValue.clone()
if (ctrlKey) {
value.add(-1, 'years')
} else {
value.add(-1, 'months')
}
break
case KeyCode.RIGHT:
value = stateValue.clone()
if (ctrlKey) {
value.add(1, 'years')
} else {
value.add(1, 'months')
}
break
case KeyCode.ENTER:
if (!disabledDate || !disabledDate(stateValue)) {
this.onSelect(stateValue)
}
event.preventDefault()
return 1
default:
return undefined
}
if (value !== stateValue) {
this.setValue(value)
event.preventDefault()
return 1
}
},
handlePanelChange (_, mode) {
if (mode !== 'date') {
this.setState({ mode })
}
},
},
render () {
2018-03-17 13:38:29 +00:00
const { mode, sValue: value, $props: props, $scopedSlots } = this
const { prefixCls, locale, disabledDate } = props
const monthCellRender = this.monthCellRender || $scopedSlots.monthCellRender
const monthCellContentRender = this.monthCellContentRender || $scopedSlots.monthCellContentRender
const renderFooter = this.renderFooter || $scopedSlots.renderFooter
2018-03-10 14:10:13 +00:00
const children = (
2018-03-12 14:13:59 +00:00
<div class={`${prefixCls}-month-calendar-content`}>
<div class={`${prefixCls}-month-header-wrap`}>
2018-03-10 14:10:13 +00:00
<CalendarHeader
2018-03-12 14:13:59 +00:00
prefixCls={prefixCls}
2018-03-10 14:10:13 +00:00
mode={mode}
value={value}
2018-03-12 14:13:59 +00:00
locale={locale}
disabledMonth={disabledDate}
monthCellRender={monthCellRender}
monthCellContentRender={monthCellContentRender}
2018-03-10 14:10:13 +00:00
onMonthSelect={this.onSelect}
onValueChange={this.setValue}
onPanelChange={this.handlePanelChange}
/>
</div>
<CalendarFooter
2018-03-12 14:13:59 +00:00
prefixCls={prefixCls}
renderFooter={renderFooter}
2018-03-10 14:10:13 +00:00
/>
</div>
)
return this.renderRoot({
class: `${props.prefixCls}-month-calendar`,
children,
})
},
}
export default MonthCalendar
2018-03-19 02:16:27 +00:00