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

127 lines
3.9 KiB
Vue
Raw Normal View History

2019-01-23 14:47:44 +00:00
import moment from 'moment';
2019-01-12 03:33:27 +00:00
import PropTypes from '../../_util/vue-types';
import BaseMixin from '../../_util/BaseMixin';
import KeyCode from '../../_util/KeyCode';
import CalendarHeader from './calendar/CalendarHeader';
import CalendarFooter from './calendar/CalendarFooter';
import CalendarMixin from './mixin/CalendarMixin';
import CommonMixin from './mixin/CommonMixin';
import enUs from './locale/en_US';
2020-10-12 05:27:16 +00:00
import { defineComponent } from 'vue';
const MonthCalendar = defineComponent({
name: 'MonthCalendar',
2020-07-21 14:29:54 +00:00
inheritAttrs: false,
2018-03-10 14:10:13 +00:00
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,
visible: PropTypes.looseBool.def(true),
2018-03-12 14:13:59 +00:00
prefixCls: PropTypes.string.def('rc-calendar'),
2018-03-10 14:10:13 +00:00
monthCellRender: PropTypes.func,
2019-01-23 14:47:44 +00:00
value: PropTypes.object,
defaultValue: PropTypes.object,
selectedValue: PropTypes.object,
defaultSelectedValue: PropTypes.object,
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],
2019-01-12 03:33:27 +00:00
data() {
2019-01-23 14:47:44 +00:00
const props = this.$props;
2019-02-13 14:12:00 +00:00
return {
2019-01-23 14:47:44 +00:00
mode: 'month',
sValue: props.value || props.defaultValue || moment(),
sSelectedValue: props.selectedValue || props.defaultSelectedValue,
};
2018-03-10 14:10:13 +00:00
},
methods: {
2019-01-12 03:33:27 +00:00
onKeyDown(event) {
const keyCode = event.keyCode;
const ctrlKey = event.ctrlKey || event.metaKey;
const stateValue = this.sValue;
const { disabledDate } = this;
let value = stateValue;
2018-03-10 14:10:13 +00:00
switch (keyCode) {
case KeyCode.DOWN:
2019-01-12 03:33:27 +00:00
value = stateValue.clone();
value.add(3, 'months');
break;
2018-03-10 14:10:13 +00:00
case KeyCode.UP:
2019-01-12 03:33:27 +00:00
value = stateValue.clone();
value.add(-3, 'months');
break;
2018-03-10 14:10:13 +00:00
case KeyCode.LEFT:
2019-01-12 03:33:27 +00:00
value = stateValue.clone();
2018-03-10 14:10:13 +00:00
if (ctrlKey) {
2019-01-12 03:33:27 +00:00
value.add(-1, 'years');
2018-03-10 14:10:13 +00:00
} else {
2019-01-12 03:33:27 +00:00
value.add(-1, 'months');
2018-03-10 14:10:13 +00:00
}
2019-01-12 03:33:27 +00:00
break;
2018-03-10 14:10:13 +00:00
case KeyCode.RIGHT:
2019-01-12 03:33:27 +00:00
value = stateValue.clone();
2018-03-10 14:10:13 +00:00
if (ctrlKey) {
2019-01-12 03:33:27 +00:00
value.add(1, 'years');
2018-03-10 14:10:13 +00:00
} else {
2019-01-12 03:33:27 +00:00
value.add(1, 'months');
2018-03-10 14:10:13 +00:00
}
2019-01-12 03:33:27 +00:00
break;
2018-03-10 14:10:13 +00:00
case KeyCode.ENTER:
if (!disabledDate || !disabledDate(stateValue)) {
2019-01-12 03:33:27 +00:00
this.onSelect(stateValue);
2018-03-10 14:10:13 +00:00
}
2019-01-12 03:33:27 +00:00
event.preventDefault();
return 1;
2018-03-10 14:10:13 +00:00
default:
2019-01-12 03:33:27 +00:00
return undefined;
2018-03-10 14:10:13 +00:00
}
if (value !== stateValue) {
2019-01-12 03:33:27 +00:00
this.setValue(value);
event.preventDefault();
return 1;
2018-03-10 14:10:13 +00:00
}
},
2019-01-12 03:33:27 +00:00
handlePanelChange(_, mode) {
2018-03-10 14:10:13 +00:00
if (mode !== 'date') {
2019-01-12 03:33:27 +00:00
this.setState({ mode });
2018-03-10 14:10:13 +00:00
}
},
},
2019-01-12 03:33:27 +00:00
render() {
2020-07-21 14:29:54 +00:00
const { mode, sValue: value, $props: props, $slots } = this;
2019-01-12 03:33:27 +00:00
const { prefixCls, locale, disabledDate } = props;
2020-07-21 14:29:54 +00:00
const monthCellRender = this.monthCellRender || $slots.monthCellRender;
const monthCellContentRender = this.monthCellContentRender || $slots.monthCellContentRender;
const renderFooter = this.renderFooter || $slots.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>
2019-01-12 03:33:27 +00:00
<CalendarFooter prefixCls={prefixCls} renderFooter={renderFooter} />
2018-03-10 14:10:13 +00:00
</div>
2019-01-12 03:33:27 +00:00
);
2018-03-10 14:10:13 +00:00
return this.renderRoot({
class: `${props.prefixCls}-month-calendar`,
children,
2019-01-12 03:33:27 +00:00
});
2018-03-10 14:10:13 +00:00
},
2020-10-12 05:27:16 +00:00
});
2018-03-19 02:16:27 +00:00
2019-01-12 03:33:27 +00:00
export default MonthCalendar;