vxe-pc-ui
Version:
A vue based PC component library
1,199 lines (1,198 loc) • 41.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _vue = require("vue");
var _ui = require("../../ui");
var _util = require("../../date-picker/src/util");
var _dom = require("../..//ui/src/dom");
var _button = _interopRequireDefault(require("../../button/src/button"));
var _xeUtils = _interopRequireDefault(require("xe-utils"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _default = exports.default = (0, _vue.defineComponent)({
name: 'VxeCalendar',
props: {
modelValue: [String, Number, Date],
type: {
type: String,
default: 'date'
},
className: String,
size: {
type: String,
default: () => (0, _ui.getConfig)().calendar.size || (0, _ui.getConfig)().size
},
multiple: Boolean,
width: [String, Number],
height: [String, Number],
// date、week、month、quarter、year
minDate: {
type: [String, Number, Date],
default: () => (0, _ui.getConfig)().calendar.minDate
},
maxDate: {
type: [String, Number, Date],
default: () => (0, _ui.getConfig)().calendar.maxDate
},
startDay: {
type: [String, Number],
default: () => (0, _ui.getConfig)().calendar.startDay
},
labelFormat: String,
valueFormat: String,
festivalMethod: {
type: Function,
default: () => (0, _ui.getConfig)().calendar.festivalMethod
},
disabledMethod: {
type: Function,
default: () => (0, _ui.getConfig)().calendar.disabledMethod
},
// week
selectDay: {
type: [String, Number],
default: () => (0, _ui.getConfig)().calendar.selectDay
}
},
emits: ['update:modelValue', 'change', 'click', 'date-prev', 'date-today', 'date-next', 'view-change'],
setup(props, context) {
const {
emit
} = context;
const xID = _xeUtils.default.uniqueId();
const {
computeSize
} = (0, _ui.useSize)(props);
const reactData = (0, _vue.reactive)({
selectValue: props.modelValue,
inputValue: props.modelValue,
datePanelValue: null,
datePanelLabel: '',
datePanelType: 'day',
selectMonth: null,
currentDate: null
});
const internalData = {
yearSize: 12,
monthSize: 20,
quarterSize: 8
};
const refElem = (0, _vue.ref)();
const refMaps = {
refElem
};
const $xeCalendar = {
xID,
props,
context,
reactData,
internalData,
getRefMaps: () => refMaps
};
const computeCalendarStyle = (0, _vue.computed)(() => {
const {
height,
width
} = props;
const stys = {};
if (width) {
stys.width = (0, _dom.toCssUnit)(width);
}
if (height) {
stys.height = (0, _dom.toCssUnit)(height);
}
return stys;
});
const computeIsDisabled = (0, _vue.computed)(() => {
return false;
});
const computeIsCalendarType = (0, _vue.computed)(() => {
return ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1;
});
const computeDateStartTime = (0, _vue.computed)(() => {
return props.minDate ? _xeUtils.default.toStringDate(props.minDate) : null;
});
const computeDateEndTime = (0, _vue.computed)(() => {
return props.maxDate ? _xeUtils.default.toStringDate(props.maxDate) : null;
});
const computeSupportMultiples = (0, _vue.computed)(() => {
return ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1;
});
const computeDateListValue = (0, _vue.computed)(() => {
const {
multiple
} = props;
const {
selectValue
} = reactData;
const isCalendarType = computeIsCalendarType.value;
const dateValueFormat = computeDateValueFormat.value;
if (multiple && selectValue && isCalendarType) {
return _xeUtils.default.toValueString(selectValue).split(',').map(item => {
const date = parseDate(item, dateValueFormat);
if (_xeUtils.default.isValidDate(date)) {
return date;
}
return null;
});
}
return [];
});
const computeDateMultipleValue = (0, _vue.computed)(() => {
const dateListValue = computeDateListValue.value;
const dateValueFormat = computeDateValueFormat.value;
return dateListValue.map(date => _xeUtils.default.toDateString(date, dateValueFormat));
});
const computeDateMultipleLabel = (0, _vue.computed)(() => {
const dateListValue = computeDateListValue.value;
const dateLabelFormat = computeDateLabelFormat.value;
return dateListValue.map(date => _xeUtils.default.toDateString(date, dateLabelFormat)).join(', ');
});
const computeDateValueFormat = (0, _vue.computed)(() => {
const {
valueFormat
} = props;
if (valueFormat) {
return valueFormat;
}
return 'yyyy-MM-dd';
});
const computeDateValue = (0, _vue.computed)(() => {
const {
selectValue
} = reactData;
const isCalendarType = computeIsCalendarType.value;
const dateValueFormat = computeDateValueFormat.value;
let val = null;
if (selectValue && isCalendarType) {
const date = parseDate(selectValue, dateValueFormat);
if (_xeUtils.default.isValidDate(date)) {
val = date;
}
}
return val;
});
const computeIsDisabledPrevDateBtn = (0, _vue.computed)(() => {
const dateStartTime = computeDateStartTime.value;
const {
selectMonth
} = reactData;
if (selectMonth && dateStartTime) {
return selectMonth <= dateStartTime;
}
return false;
});
const computeIsDisabledNextDateBtn = (0, _vue.computed)(() => {
const dateEndTime = computeDateEndTime.value;
const {
selectMonth
} = reactData;
if (selectMonth && dateEndTime) {
return selectMonth >= dateEndTime;
}
return false;
});
const computeDateHMSTime = (0, _vue.computed)(() => {
const dateValue = computeDateValue.value;
return dateValue ? (dateValue.getHours() * 3600 + dateValue.getMinutes() * 60 + dateValue.getSeconds()) * 1000 : 0;
});
const computeDateLabelFormat = (0, _vue.computed)(() => {
const {
labelFormat
} = props;
const isCalendarType = computeIsCalendarType.value;
const dateValueFormat = computeDateValueFormat.value;
if (isCalendarType) {
return labelFormat || dateValueFormat || (0, _ui.getI18n)(`vxe.input.date.labelFormat.${props.type}`);
}
return null;
});
const computeYearList = (0, _vue.computed)(() => {
const {
selectMonth,
currentDate
} = reactData;
const {
yearSize
} = internalData;
const years = [];
if (selectMonth && currentDate) {
const currFullYear = currentDate.getFullYear();
const selectFullYear = selectMonth.getFullYear();
const startYearDate = new Date(selectFullYear - selectFullYear % yearSize, 0, 1);
for (let index = -4; index < yearSize + 4; index++) {
const date = _xeUtils.default.getWhatYear(startYearDate, index, 'first');
const itemFullYear = date.getFullYear();
years.push({
date,
isCurrent: true,
isPrev: index < 0,
isNow: currFullYear === itemFullYear,
isNext: index >= yearSize,
year: itemFullYear
});
}
}
return years;
});
const computeSelectDatePanelObj = (0, _vue.computed)(() => {
const isCalendarType = computeIsCalendarType.value;
let y = '';
let m = '';
if (isCalendarType) {
const {
datePanelType,
selectMonth
} = reactData;
const yearList = computeYearList.value;
let year = '';
let month;
if (selectMonth) {
year = selectMonth.getFullYear();
month = selectMonth.getMonth() + 1;
}
if (datePanelType === 'quarter' || datePanelType === 'month') {
y = `${year}`;
} else if (datePanelType === 'year') {
y = yearList.length ? `${yearList[0].year} - ${yearList[yearList.length - 1].year}` : '';
} else {
y = `${year}`;
m = month ? (0, _ui.getI18n)(`vxe.input.date.m${month}`) : '-';
}
}
return {
y,
m
};
});
const computeFirstDayOfWeek = (0, _vue.computed)(() => {
const {
startDay
} = props;
return _xeUtils.default.toNumber(startDay);
});
const computeWeekDatas = (0, _vue.computed)(() => {
const weeks = [];
const isCalendarType = computeIsCalendarType.value;
if (isCalendarType) {
let sWeek = computeFirstDayOfWeek.value;
weeks.push(sWeek);
for (let index = 0; index < 6; index++) {
if (sWeek >= 6) {
sWeek = 0;
} else {
sWeek++;
}
weeks.push(sWeek);
}
}
return weeks;
});
const computeDateHeaders = (0, _vue.computed)(() => {
const isCalendarType = computeIsCalendarType.value;
if (isCalendarType) {
const weekDatas = computeWeekDatas.value;
return weekDatas.map(day => {
return {
value: day,
label: (0, _ui.getI18n)(`vxe.input.date.weeks.w${day}`)
};
});
}
return [];
});
const computeWeekHeaders = (0, _vue.computed)(() => {
const isCalendarType = computeIsCalendarType.value;
if (isCalendarType) {
const dateHeaders = computeDateHeaders.value;
return [{
label: (0, _ui.getI18n)('vxe.input.date.weeks.w')
}].concat(dateHeaders);
}
return [];
});
const computeYearDatas = (0, _vue.computed)(() => {
const yearList = computeYearList.value;
return _xeUtils.default.chunk(yearList, 4);
});
const computeQuarterList = (0, _vue.computed)(() => {
const {
selectMonth,
currentDate
} = reactData;
const {
quarterSize
} = internalData;
const quarters = [];
if (selectMonth && currentDate) {
const currFullYear = currentDate.getFullYear();
const currQuarter = (0, _util.getDateQuarter)(currentDate);
const firstYear = _xeUtils.default.getWhatYear(selectMonth, 0, 'first');
const selFullYear = firstYear.getFullYear();
for (let index = -2; index < quarterSize - 2; index++) {
const date = _xeUtils.default.getWhatQuarter(firstYear, index);
const itemFullYear = date.getFullYear();
const itemQuarter = (0, _util.getDateQuarter)(date);
const isPrev = itemFullYear < selFullYear;
quarters.push({
date,
isPrev,
isCurrent: itemFullYear === selFullYear,
isNow: itemFullYear === currFullYear && itemQuarter === currQuarter,
isNext: !isPrev && itemFullYear > selFullYear,
quarter: itemQuarter
});
}
}
return quarters;
});
const computeQuarterDatas = (0, _vue.computed)(() => {
const quarterList = computeQuarterList.value;
return _xeUtils.default.chunk(quarterList, 2);
});
const computeMonthList = (0, _vue.computed)(() => {
const {
selectMonth,
currentDate
} = reactData;
const {
monthSize
} = internalData;
const months = [];
if (selectMonth && currentDate) {
const currFullYear = currentDate.getFullYear();
const currMonth = currentDate.getMonth();
const selFullYear = _xeUtils.default.getWhatYear(selectMonth, 0, 'first').getFullYear();
for (let index = -4; index < monthSize - 4; index++) {
const date = _xeUtils.default.getWhatYear(selectMonth, 0, index);
const itemFullYear = date.getFullYear();
const itemMonth = date.getMonth();
const isPrev = itemFullYear < selFullYear;
months.push({
date,
isPrev,
isCurrent: itemFullYear === selFullYear,
isNow: itemFullYear === currFullYear && itemMonth === currMonth,
isNext: !isPrev && itemFullYear > selFullYear,
month: itemMonth
});
}
}
return months;
});
const computeMonthDatas = (0, _vue.computed)(() => {
const monthList = computeMonthList.value;
return _xeUtils.default.chunk(monthList, 4);
});
const computeDayList = (0, _vue.computed)(() => {
const {
selectMonth,
currentDate
} = reactData;
const days = [];
if (selectMonth && currentDate) {
const dateHMSTime = computeDateHMSTime.value;
const weekDatas = computeWeekDatas.value;
const currFullYear = currentDate.getFullYear();
const currMonth = currentDate.getMonth();
const currDate = currentDate.getDate();
const selFullYear = selectMonth.getFullYear();
const selMonth = selectMonth.getMonth();
const selDay = selectMonth.getDay();
const prevOffsetDate = -weekDatas.indexOf(selDay);
const startDayDate = new Date(_xeUtils.default.getWhatDay(selectMonth, prevOffsetDate).getTime() + dateHMSTime);
for (let index = 0; index < 42; index++) {
const date = _xeUtils.default.getWhatDay(startDayDate, index);
const itemFullYear = date.getFullYear();
const itemMonth = date.getMonth();
const itemDate = date.getDate();
const isPrev = date < selectMonth;
days.push({
date,
isPrev,
isCurrent: itemFullYear === selFullYear && itemMonth === selMonth,
isNow: itemFullYear === currFullYear && itemMonth === currMonth && itemDate === currDate,
isNext: !isPrev && selMonth !== itemMonth,
label: itemDate
});
}
}
return days;
});
const computeDayDatas = (0, _vue.computed)(() => {
const dayList = computeDayList.value;
return _xeUtils.default.chunk(dayList, 7);
});
const computeWeekDates = (0, _vue.computed)(() => {
const dayDatas = computeDayDatas.value;
const firstDayOfWeek = computeFirstDayOfWeek.value;
return dayDatas.map(list => {
const firstItem = list[0];
const item = {
date: firstItem.date,
isWeekNumber: true,
isPrev: false,
isCurrent: false,
isNow: false,
isNext: false,
label: _xeUtils.default.getYearWeek(firstItem.date, firstDayOfWeek)
};
return [item].concat(list);
});
});
const parseDate = (value, format) => {
return _xeUtils.default.toStringDate(value, format);
};
const handleChange = (value, evnt) => {
reactData.inputValue = value;
emit('update:modelValue', value);
if (_xeUtils.default.toValueString(props.modelValue) !== value) {
dispatchEvent('change', {
value
}, evnt);
}
};
const dateParseValue = value => {
const {
type
} = props;
const dateLabelFormat = computeDateLabelFormat.value;
const dateValueFormat = computeDateValueFormat.value;
const firstDayOfWeek = computeFirstDayOfWeek.value;
let dValue = null;
let dLabel = '';
if (value) {
dValue = parseDate(value, dateValueFormat);
}
if (_xeUtils.default.isValidDate(dValue)) {
dLabel = _xeUtils.default.toDateString(dValue, dateLabelFormat, {
firstDay: firstDayOfWeek
});
// 由于年份和第几周是冲突的行为,所以需要特殊处理,判断是否跨年
if (dateLabelFormat && type === 'week') {
const firstWeekDate = _xeUtils.default.getWhatWeek(dValue, 0, firstDayOfWeek, firstDayOfWeek);
if (firstWeekDate.getFullYear() < dValue.getFullYear()) {
const yyIndex = dateLabelFormat.indexOf('yyyy');
if (yyIndex > -1) {
const yyNum = Number(dLabel.substring(yyIndex, yyIndex + 4));
if (yyNum && !isNaN(yyNum)) {
dLabel = dLabel.replace(`${yyNum}`, `${yyNum - 1}`);
}
}
}
}
} else {
dValue = null;
}
reactData.datePanelValue = dValue;
reactData.datePanelLabel = dLabel;
};
/**
* 值变化时处理
*/
const changeValue = () => {
const isCalendarType = computeIsCalendarType.value;
const {
inputValue
} = reactData;
if (isCalendarType) {
dateParseValue(inputValue);
reactData.inputValue = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel;
}
};
/**
* 检查初始值
*/
const initValue = () => {
const isCalendarType = computeIsCalendarType.value;
if (isCalendarType) {
changeValue();
}
};
const dateCheckMonth = date => {
const month = _xeUtils.default.getWhatMonth(date, 0, 'first');
if (!_xeUtils.default.isEqual(month, reactData.selectMonth)) {
reactData.selectMonth = month;
}
};
const dateChange = date => {
const {
modelValue,
multiple
} = props;
const dateValueFormat = computeDateValueFormat.value;
const firstDayOfWeek = computeFirstDayOfWeek.value;
if (props.type === 'week') {
const sWeek = _xeUtils.default.toNumber(props.selectDay);
date = _xeUtils.default.getWhatWeek(date, 0, sWeek, firstDayOfWeek);
}
const inpVal = _xeUtils.default.toDateString(date, dateValueFormat, {
firstDay: firstDayOfWeek
});
dateCheckMonth(date);
reactData.selectValue = date;
if (multiple) {
// 如果为多选
const dateMultipleValue = computeDateMultipleValue.value;
// 如果是日期类型
if (dateMultipleValue.some(val => _xeUtils.default.isEqual(val, inpVal))) {
handleChange(dateMultipleValue.filter(val => !_xeUtils.default.isEqual(val, inpVal)).join(','), {
type: 'update'
});
} else {
handleChange(dateMultipleValue.concat([inpVal]).join(','), {
type: 'update'
});
}
} else {
// 如果为单选
if (!_xeUtils.default.isEqual(modelValue, inpVal)) {
handleChange(inpVal, {
type: 'update'
});
}
}
};
const dateMonthHandle = (date, offsetMonth) => {
reactData.selectMonth = _xeUtils.default.getWhatMonth(date, offsetMonth, 'first');
};
const dateNowHandle = () => {
const currentDate = _xeUtils.default.getWhatDay(Date.now(), 0, 'first');
reactData.currentDate = currentDate;
dateMonthHandle(currentDate, 0);
};
const dateToggleYearTypeEvent = () => {
reactData.datePanelType = 'year';
};
const dateToggleMonthTypeEvent = evnt => {
let {
datePanelType
} = reactData;
if (datePanelType === 'month' || datePanelType === 'quarter') {
datePanelType = 'year';
} else {
datePanelType = 'month';
}
reactData.datePanelType = datePanelType;
changeViewEvent(evnt);
};
const datePrevEvent = evnt => {
const {
type
} = props;
const {
datePanelType,
selectMonth
} = reactData;
const {
yearSize
} = internalData;
const isDisabledPrevDateBtn = computeIsDisabledPrevDateBtn.value;
if (!isDisabledPrevDateBtn) {
if (type === 'year') {
reactData.selectMonth = _xeUtils.default.getWhatYear(selectMonth, -yearSize, 'first');
} else if (type === 'month' || type === 'quarter') {
if (datePanelType === 'year') {
reactData.selectMonth = _xeUtils.default.getWhatYear(selectMonth, -yearSize, 'first');
} else {
reactData.selectMonth = _xeUtils.default.getWhatYear(selectMonth, -1, 'first');
}
} else {
if (datePanelType === 'year') {
reactData.selectMonth = _xeUtils.default.getWhatYear(selectMonth, -yearSize, 'first');
} else if (datePanelType === 'month') {
reactData.selectMonth = _xeUtils.default.getWhatYear(selectMonth, -1, 'first');
} else {
reactData.selectMonth = _xeUtils.default.getWhatMonth(selectMonth, -1, 'first');
}
}
dispatchEvent('date-prev', {
type
}, evnt);
changeViewEvent(evnt);
}
};
const dateTodayMonthEvent = evnt => {
dateNowHandle();
if (!props.multiple) {
dateChange(reactData.currentDate);
}
dispatchEvent('date-today', {
type: props.type
}, evnt);
changeViewEvent(evnt);
};
const dateNextEvent = evnt => {
const {
type
} = props;
const {
datePanelType,
selectMonth
} = reactData;
const {
yearSize
} = internalData;
const isDisabledNextDateBtn = computeIsDisabledNextDateBtn.value;
if (!isDisabledNextDateBtn) {
if (type === 'year') {
reactData.selectMonth = _xeUtils.default.getWhatYear(selectMonth, yearSize, 'first');
} else if (type === 'month' || type === 'quarter') {
if (datePanelType === 'year') {
reactData.selectMonth = _xeUtils.default.getWhatYear(selectMonth, yearSize, 'first');
} else {
reactData.selectMonth = _xeUtils.default.getWhatYear(selectMonth, 1, 'first');
}
} else {
if (datePanelType === 'year') {
reactData.selectMonth = _xeUtils.default.getWhatYear(selectMonth, yearSize, 'first');
} else if (datePanelType === 'month') {
reactData.selectMonth = _xeUtils.default.getWhatYear(selectMonth, 1, 'first');
} else {
reactData.selectMonth = _xeUtils.default.getWhatMonth(selectMonth, 1, 'first');
}
}
dispatchEvent('date-next', {
type
}, evnt);
changeViewEvent(evnt);
}
};
const isDateDisabled = item => {
const {
disabledMethod
} = props;
const {
datePanelType
} = reactData;
return disabledMethod && disabledMethod({
type: datePanelType,
viewType: datePanelType,
date: item.date,
$calendar: $xeCalendar
});
};
const changeViewEvent = evnt => {
const {
datePanelType
} = reactData;
const yearDatas = computeYearDatas.value;
const quarterDatas = computeQuarterDatas.value;
const monthDatas = computeMonthDatas.value;
const weekDates = computeWeekDates.value;
const dayDatas = computeDayDatas.value;
const viewDates = [];
let dataList = [];
switch (datePanelType) {
case 'year':
dataList = yearDatas;
break;
case 'quarter':
dataList = quarterDatas;
break;
case 'month':
dataList = monthDatas;
break;
case 'week':
dataList = weekDates;
break;
case 'day':
dataList = dayDatas;
break;
}
dataList.forEach(rows => {
rows.forEach(item => {
viewDates.push(item.date);
});
});
dispatchEvent('view-change', {
viewType: datePanelType,
viewDates
}, evnt);
};
const dateSelectItem = date => {
const {
type
} = props;
const {
datePanelType
} = reactData;
if (type === 'month') {
if (datePanelType === 'year') {
reactData.datePanelType = 'month';
dateCheckMonth(date);
changeViewEvent(null);
} else {
dateChange(date);
}
} else if (type === 'year') {
dateChange(date);
} else if (type === 'quarter') {
if (datePanelType === 'year') {
reactData.datePanelType = 'quarter';
dateCheckMonth(date);
changeViewEvent(null);
} else {
dateChange(date);
}
} else {
if (datePanelType === 'month') {
reactData.datePanelType = type === 'week' ? type : 'day';
dateCheckMonth(date);
changeViewEvent(null);
} else if (datePanelType === 'year') {
reactData.datePanelType = 'month';
dateCheckMonth(date);
changeViewEvent(null);
} else {
dateChange(date);
}
}
};
const dateSelectEvent = item => {
if (!isDateDisabled(item)) {
dateSelectItem(item.date);
}
};
const dateMoveDay = offsetDay => {
if (!isDateDisabled({
date: offsetDay
})) {
const dayList = computeDayList.value;
if (!dayList.some(item => _xeUtils.default.isDateSame(item.date, offsetDay, 'yyyyMMdd'))) {
dateCheckMonth(offsetDay);
}
dateParseValue(offsetDay);
}
};
const dateMoveYear = offsetYear => {
if (!isDateDisabled({
date: offsetYear
})) {
const yearList = computeYearList.value;
if (!yearList.some(item => _xeUtils.default.isDateSame(item.date, offsetYear, 'yyyy'))) {
dateCheckMonth(offsetYear);
}
dateParseValue(offsetYear);
}
};
const dateMoveQuarter = offsetQuarter => {
if (!isDateDisabled({
date: offsetQuarter
})) {
const quarterList = computeQuarterList.value;
if (!quarterList.some(item => _xeUtils.default.isDateSame(item.date, offsetQuarter, 'yyyyq'))) {
dateCheckMonth(offsetQuarter);
}
dateParseValue(offsetQuarter);
}
};
const dateMoveMonth = offsetMonth => {
if (!isDateDisabled({
date: offsetMonth
})) {
const monthList = computeMonthList.value;
if (!monthList.some(item => _xeUtils.default.isDateSame(item.date, offsetMonth, 'yyyyMM'))) {
dateCheckMonth(offsetMonth);
}
dateParseValue(offsetMonth);
}
};
const dateMouseenterEvent = item => {
if (!isDateDisabled(item)) {
const {
datePanelType
} = reactData;
if (datePanelType === 'month') {
dateMoveMonth(item.date);
} else if (datePanelType === 'quarter') {
dateMoveQuarter(item.date);
} else if (datePanelType === 'year') {
dateMoveYear(item.date);
} else {
dateMoveDay(item.date);
}
}
};
const dateConfirmEvent = () => {};
const dateOpenPanel = () => {
const {
type
} = props;
const dateValue = computeDateValue.value;
if (['year', 'quarter', 'month', 'week'].indexOf(type) > -1) {
reactData.datePanelType = type;
} else {
reactData.datePanelType = 'day';
}
reactData.currentDate = _xeUtils.default.getWhatDay(Date.now(), 0, 'first');
if (dateValue) {
dateMonthHandle(dateValue, 0);
dateParseValue(dateValue);
} else {
dateNowHandle();
}
};
const renderDateLabel = (item, label) => {
const {
festivalMethod
} = props;
if (festivalMethod) {
const {
datePanelType
} = reactData;
const festivalRest = festivalMethod({
type: datePanelType,
viewType: datePanelType,
date: item.date,
$calendar: $xeCalendar
});
const festivalItem = festivalRest ? _xeUtils.default.isString(festivalRest) ? {
label: festivalRest
} : festivalRest : {};
const extraItem = festivalItem.extra ? _xeUtils.default.isString(festivalItem.extra) ? {
label: festivalItem.extra
} : festivalItem.extra : null;
const labels = [(0, _vue.h)('span', {
class: ['vxe-calendar--date-label', {
'is-notice': festivalItem.notice
}]
}, extraItem && extraItem.label ? [(0, _vue.h)('span', `${label || ''}`), (0, _vue.h)('span', {
class: ['vxe-calendar--date-label--extra', extraItem.important ? 'is-important' : '', extraItem.className],
style: extraItem.style
}, _xeUtils.default.toValueString(extraItem.label))] : [`${label || ''}`])];
const festivalLabel = festivalItem.label;
if (festivalLabel) {
// 默认最多支持3个节日重叠
const festivalLabels = _xeUtils.default.toValueString(festivalLabel).split(',');
labels.push((0, _vue.h)('span', {
class: ['vxe-calendar--date-festival', festivalItem.important ? 'is-important' : '', festivalItem.className],
style: festivalItem.style
}, [festivalLabels.length > 1 ? (0, _vue.h)('span', {
class: ['vxe-calendar--date-festival--overlap', `overlap--${festivalLabels.length}`]
}, festivalLabels.map(label => (0, _vue.h)('span', label.substring(0, 3)))) : (0, _vue.h)('span', {
class: 'vxe-calendar--date-festival--label'
}, festivalLabels[0].substring(0, 3))]));
}
return labels;
}
return `${label || ''}`;
};
const renderDateDayTable = () => {
const {
multiple
} = props;
const {
datePanelType,
datePanelValue
} = reactData;
const dateValue = computeDateValue.value;
const dateHeaders = computeDateHeaders.value;
const dayDatas = computeDayDatas.value;
const dateListValue = computeDateListValue.value;
const matchFormat = 'yyyyMMdd';
return [(0, _vue.h)('table', {
class: `vxe-calendar--date-${datePanelType}-view`,
cellspacing: 0,
cellpadding: 0,
border: 0
}, [(0, _vue.h)('tr', dateHeaders.map(item => {
return (0, _vue.h)('th', {
class: 'vxe-calendar--view-th'
}, item.label);
})), ...dayDatas.map(rows => {
return (0, _vue.h)('tr', rows.map(item => {
return (0, _vue.h)('td', {
class: ['vxe-calendar--view-td', {
'is--prev': item.isPrev,
'is--current': item.isCurrent,
'is--now': item.isNow,
'is--next': item.isNext,
'is--disabled': isDateDisabled(item),
'is--selected': multiple ? dateListValue.some(val => _xeUtils.default.isDateSame(val, item.date, matchFormat)) : _xeUtils.default.isDateSame(dateValue, item.date, matchFormat),
'is--hover': _xeUtils.default.isDateSame(datePanelValue, item.date, matchFormat)
}],
onClick: () => dateSelectEvent(item),
onMouseenter: () => dateMouseenterEvent(item)
}, renderDateLabel(item, item.label));
}));
})])];
};
const renderDateWeekTable = () => {
const {
multiple
} = props;
const {
datePanelType,
datePanelValue
} = reactData;
const dateValue = computeDateValue.value;
const weekHeaders = computeWeekHeaders.value;
const weekDates = computeWeekDates.value;
const dateListValue = computeDateListValue.value;
const matchFormat = 'yyyyMMdd';
return [(0, _vue.h)('table', {
class: `vxe-calendar--date-${datePanelType}-view`,
cellspacing: 0,
cellpadding: 0,
border: 0
}, [(0, _vue.h)('tr', weekHeaders.map(item => {
return (0, _vue.h)('td', {
class: 'vxe-calendar--view-th'
}, item.label);
})), ...weekDates.map(rows => {
const isSelected = multiple ? rows.some(item => dateListValue.some(val => _xeUtils.default.isDateSame(val, item.date, matchFormat))) : rows.some(item => _xeUtils.default.isDateSame(dateValue, item.date, matchFormat));
const isHover = rows.some(item => _xeUtils.default.isDateSame(datePanelValue, item.date, matchFormat));
return (0, _vue.h)('tr', rows.map(item => {
return (0, _vue.h)('td', {
class: ['vxe-calendar--view-td', {
'is--prev': item.isPrev,
'is--current': item.isCurrent,
'is--now': item.isNow,
'is--next': item.isNext,
'is--disabled': isDateDisabled(item),
'is--selected': isSelected,
'is--hover': isHover
}],
// event
onClick: () => dateSelectEvent(item),
onMouseenter: () => dateMouseenterEvent(item)
}, renderDateLabel(item, item.label));
}));
})])];
};
const renderDateMonthTable = () => {
const {
multiple
} = props;
const {
datePanelType,
datePanelValue
} = reactData;
const dateValue = computeDateValue.value;
const monthDatas = computeMonthDatas.value;
const dateListValue = computeDateListValue.value;
const matchFormat = 'yyyyMM';
return [(0, _vue.h)('table', {
class: `vxe-calendar--date-${datePanelType}-view`,
cellspacing: 0,
cellpadding: 0,
border: 0
}, [(0, _vue.h)('tbody', monthDatas.map(rows => {
return (0, _vue.h)('tr', rows.map(item => {
return (0, _vue.h)('td', {
class: ['vxe-calendar--view-td', {
'is--prev': item.isPrev,
'is--current': item.isCurrent,
'is--now': item.isNow,
'is--next': item.isNext,
'is--disabled': isDateDisabled(item),
'is--selected': multiple ? dateListValue.some(val => _xeUtils.default.isDateSame(val, item.date, matchFormat)) : _xeUtils.default.isDateSame(dateValue, item.date, matchFormat),
'is--hover': _xeUtils.default.isDateSame(datePanelValue, item.date, matchFormat)
}],
onClick: () => dateSelectEvent(item),
onMouseenter: () => dateMouseenterEvent(item)
}, renderDateLabel(item, (0, _ui.getI18n)(`vxe.input.date.months.m${item.month}`)));
}));
}))])];
};
const renderDateQuarterTable = () => {
const {
multiple
} = props;
const {
datePanelType,
datePanelValue
} = reactData;
const dateValue = computeDateValue.value;
const quarterDatas = computeQuarterDatas.value;
const dateListValue = computeDateListValue.value;
const matchFormat = 'yyyyq';
return [(0, _vue.h)('table', {
class: `vxe-calendar--date-${datePanelType}-view`,
cellspacing: 0,
cellpadding: 0,
border: 0
}, [(0, _vue.h)('tbody', quarterDatas.map(rows => {
return (0, _vue.h)('tr', rows.map(item => {
return (0, _vue.h)('td', {
class: ['vxe-calendar--view-td', {
'is--prev': item.isPrev,
'is--current': item.isCurrent,
'is--now': item.isNow,
'is--next': item.isNext,
'is--disabled': isDateDisabled(item),
'is--selected': multiple ? dateListValue.some(val => _xeUtils.default.isDateSame(val, item.date, matchFormat)) : _xeUtils.default.isDateSame(dateValue, item.date, matchFormat),
'is--hover': _xeUtils.default.isDateSame(datePanelValue, item.date, matchFormat)
}],
onClick: () => dateSelectEvent(item),
onMouseenter: () => dateMouseenterEvent(item)
}, renderDateLabel(item, (0, _ui.getI18n)(`vxe.input.date.quarters.q${item.quarter}`)));
}));
}))])];
};
const renderDateYearTable = () => {
const {
multiple
} = props;
const {
datePanelType,
datePanelValue
} = reactData;
const dateValue = computeDateValue.value;
const yearDatas = computeYearDatas.value;
const dateListValue = computeDateListValue.value;
const matchFormat = 'yyyy';
return [(0, _vue.h)('table', {
class: `vxe-calendar--date-${datePanelType}-view`,
cellspacing: 0,
cellpadding: 0,
border: 0
}, [(0, _vue.h)('tbody', yearDatas.map(rows => {
return (0, _vue.h)('tr', rows.map(item => {
return (0, _vue.h)('td', {
class: ['vxe-calendar--view-td', {
'is--prev': item.isPrev,
'is--current': item.isCurrent,
'is--now': item.isNow,
'is--next': item.isNext,
'is--disabled': isDateDisabled(item),
'is--selected': multiple ? dateListValue.some(val => _xeUtils.default.isDateSame(val, item.date, matchFormat)) : _xeUtils.default.isDateSame(dateValue, item.date, matchFormat),
'is--hover': _xeUtils.default.isDateSame(datePanelValue, item.date, matchFormat)
}],
onClick: () => dateSelectEvent(item),
onMouseenter: () => dateMouseenterEvent(item)
}, renderDateLabel(item, item.year));
}));
}))])];
};
const renderDateTable = () => {
const {
datePanelType
} = reactData;
switch (datePanelType) {
case 'week':
return renderDateWeekTable();
case 'month':
return renderDateMonthTable();
case 'quarter':
return renderDateQuarterTable();
case 'year':
return renderDateYearTable();
}
return renderDateDayTable();
};
const renderDatePanel = () => {
const {
multiple
} = props;
const {
datePanelType
} = reactData;
const isDisabledPrevDateBtn = computeIsDisabledPrevDateBtn.value;
const isDisabledNextDateBtn = computeIsDisabledNextDateBtn.value;
const selectDatePanelObj = computeSelectDatePanelObj.value;
return [(0, _vue.h)('div', {
class: 'vxe-calendar--header'
}, [(0, _vue.h)('div', {
class: 'vxe-calendar--type-wrapper'
}, [datePanelType === 'year' ? (0, _vue.h)(_button.default, {
class: 'vxe-calendar--date-picker-label',
disabled: datePanelType === 'year',
content: selectDatePanelObj.y
}) : (0, _vue.h)('span', {
class: 'vxe-calendar--date-picker-btns'
}, [(0, _vue.h)(_button.default, {
class: 'vxe-calendar--date-picker-btn',
content: selectDatePanelObj.y,
onClick: dateToggleYearTypeEvent
}), selectDatePanelObj.m ? (0, _vue.h)(_button.default, {
class: 'vxe-calendar--date-picker-btn',
content: selectDatePanelObj.m,
onClick: dateToggleMonthTypeEvent
}) : (0, _ui.renderEmptyElement)($xeCalendar)])]), (0, _vue.h)('div', {
class: 'vxe-calendar--btn-wrapper'
}, [(0, _vue.h)(_button.default, {
disabled: isDisabledPrevDateBtn,
icon: 'vxe-icon-caret-left',
onClick: datePrevEvent
}), (0, _vue.h)(_button.default, {
icon: 'vxe-icon-dot',
onClick: dateTodayMonthEvent
}), (0, _vue.h)(_button.default, {
disabled: isDisabledNextDateBtn,
icon: 'vxe-icon-caret-right',
onClick: dateNextEvent
}), multiple && computeSupportMultiples.value ? (0, _vue.h)('span', {
class: 'vxe-calendar--btn vxe-calendar--confirm-btn'
}, [(0, _vue.h)('button', {
class: 'vxe-calendar--confirm',
type: 'button',
onClick: dateConfirmEvent
}, (0, _ui.getI18n)('vxe.button.confirm'))]) : null])]), (0, _vue.h)('div', {
class: 'vxe-calendar--body'
}, renderDateTable())];
};
const dispatchEvent = (type, params, evnt) => {
emit(type, (0, _ui.createEvent)(evnt, {
$input: $xeCalendar
}, params));
};
const calendarMethods = {
dispatchEvent
};
Object.assign($xeCalendar, calendarMethods);
const renderVN = () => {
const {
className,
type
} = props;
const vSize = computeSize.value;
const isDisabled = computeIsDisabled.value;
const calendarStyle = computeCalendarStyle.value;
return (0, _vue.h)('div', {
ref: refElem,
class: ['vxe-calendar', `type--${type}`, className, {
[`size--${vSize}`]: vSize,
'is--disabled': isDisabled
}],
style: calendarStyle
}, [renderDatePanel()]);
};
$xeCalendar.renderVN = renderVN;
(0, _vue.watch)(() => props.modelValue, val => {
reactData.inputValue = val;
changeValue();
});
(0, _vue.watch)(() => props.type, () => {
// 切换类型是重置内置变量
Object.assign(reactData, {
selectValue: null,
inputValue: null,
datePanelValue: null,
datePanelLabel: '',
datePanelType: 'day',
selectMonth: null,
currentDate: null
});
initValue();
dateOpenPanel();
});
(0, _vue.watch)(computeDateLabelFormat, () => {
const isCalendarType = computeIsCalendarType.value;
if (isCalendarType) {
dateParseValue(reactData.datePanelValue);
reactData.inputValue = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel;
}
});
(0, _vue.onMounted)(() => {
dateOpenPanel();
});
initValue();
return $xeCalendar;
},
render() {
return this.renderVN();
}
});