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

166 lines
4.3 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 { getOptionProps, hasProp } from '../../_util/props-util';
import DateTable from './date/DateTable';
import MonthTable from './month/MonthTable';
2019-02-13 14:12:00 +00:00
import CalendarMixin, { getNowByCurrentStateValue } from './mixin/CalendarMixin';
2019-01-12 03:33:27 +00:00
import CommonMixin from './mixin/CommonMixin';
import CalendarHeader from './full-calendar/CalendarHeader';
import enUs from './locale/en_US';
2018-03-10 14:10:13 +00:00
const FullCalendar = {
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
defaultType: PropTypes.string.def('date'),
type: PropTypes.string,
fullscreen: PropTypes.bool.def(false),
monthCellRender: PropTypes.func,
dateCellRender: PropTypes.func,
showTypeSwitch: PropTypes.bool.def(true),
2018-03-12 14:13:59 +00:00
Select: PropTypes.object.isRequired,
2018-03-10 14:10:13 +00:00
headerComponents: PropTypes.array,
headerComponent: PropTypes.object, // The whole header component
headerRender: PropTypes.func,
showHeader: PropTypes.bool.def(true),
disabledDate: 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
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() {
let type;
2018-03-10 14:10:13 +00:00
if (hasProp(this, 'type')) {
2019-01-12 03:33:27 +00:00
type = this.type;
2018-03-10 14:10:13 +00:00
} else {
2019-01-12 03:33:27 +00:00
type = this.defaultType;
2018-03-10 14:10:13 +00:00
}
2019-01-23 14:47:44 +00:00
const props = this.$props;
2018-03-10 14:10:13 +00:00
return {
sType: type,
2019-01-23 14:47:44 +00:00
sValue: props.value || props.defaultValue || moment(),
sSelectedValue: props.selectedValue || props.defaultSelectedValue,
2019-01-12 03:33:27 +00:00
};
2018-03-10 14:10:13 +00:00
},
watch: {
2019-01-12 03:33:27 +00:00
type(val) {
2018-03-10 14:10:13 +00:00
this.setState({
sType: val,
2019-01-12 03:33:27 +00:00
});
2018-03-10 14:10:13 +00:00
},
2019-01-23 14:47:44 +00:00
value(val) {
const sValue = val || this.defaultValue || getNowByCurrentStateValue(this.sValue);
this.setState({
sValue,
});
},
selectedValue(val) {
this.setState({
sSelectedValue: val,
});
},
2018-03-10 14:10:13 +00:00
},
methods: {
2019-01-12 03:33:27 +00:00
onMonthSelect(value) {
2018-03-10 14:10:13 +00:00
this.onSelect(value, {
target: 'month',
2019-01-12 03:33:27 +00:00
});
2018-03-10 14:10:13 +00:00
},
2019-01-12 03:33:27 +00:00
setType(type) {
2018-03-10 14:10:13 +00:00
if (!hasProp(this, 'type')) {
this.setState({
sType: type,
2019-01-12 03:33:27 +00:00
});
2018-03-10 14:10:13 +00:00
}
2019-01-12 03:33:27 +00:00
this.__emit('typeChange', type);
2018-03-10 14:10:13 +00:00
},
},
2019-01-12 03:33:27 +00:00
render() {
const props = getOptionProps(this);
2018-03-10 14:10:13 +00:00
const {
locale,
prefixCls,
fullscreen,
showHeader,
headerComponent,
headerRender,
disabledDate,
2019-01-12 03:33:27 +00:00
} = props;
const { sValue: value, sType: type, $listeners } = this;
2018-03-10 14:10:13 +00:00
2019-01-12 03:33:27 +00:00
let header = null;
2018-03-10 14:10:13 +00:00
if (showHeader) {
if (headerRender) {
2019-01-12 03:33:27 +00:00
header = headerRender(value, type, locale);
2018-03-10 14:10:13 +00:00
} else {
2019-01-12 03:33:27 +00:00
const TheHeader = headerComponent || CalendarHeader;
2018-03-10 14:10:13 +00:00
const headerProps = {
props: {
...props,
prefixCls: `${prefixCls}-full`,
type,
value,
},
on: {
2018-03-12 14:13:59 +00:00
...$listeners,
2018-03-10 14:10:13 +00:00
typeChange: this.setType,
valueChange: this.setValue,
},
key: 'calendar-header',
2019-01-12 03:33:27 +00:00
};
header = <TheHeader {...headerProps} />;
2018-03-10 14:10:13 +00:00
}
}
2019-01-12 03:33:27 +00:00
const table =
type === 'date' ? (
<DateTable
dateRender={props.dateCellRender}
contentRender={props.dateCellContentRender}
locale={locale}
prefixCls={prefixCls}
onSelect={this.onSelect}
value={value}
disabledDate={disabledDate}
/>
) : (
<MonthTable
cellRender={props.monthCellRender}
contentRender={props.monthCellContentRender}
locale={locale}
onSelect={this.onMonthSelect}
prefixCls={`${prefixCls}-month-panel`}
value={value}
disabledDate={disabledDate}
/>
);
2018-03-10 14:10:13 +00:00
const children = [
header,
2019-01-12 03:33:27 +00:00
<div key="calendar-body" class={`${prefixCls}-calendar-body`}>
{table}
</div>,
];
2018-03-10 14:10:13 +00:00
2019-01-12 03:33:27 +00:00
const className = [`${prefixCls}-full`];
2018-03-10 14:10:13 +00:00
if (fullscreen) {
2019-01-12 03:33:27 +00:00
className.push(`${prefixCls}-fullscreen`);
2018-03-10 14:10:13 +00:00
}
return this.renderRoot({
children,
class: className.join(' '),
2019-01-12 03:33:27 +00:00
});
2018-03-10 14:10:13 +00:00
},
2019-01-12 03:33:27 +00:00
};
2018-03-19 02:16:27 +00:00
2019-01-12 03:33:27 +00:00
export default FullCalendar;