@fesjs/fes-design
Version:
fes-design for PC
385 lines (380 loc) • 15 kB
JavaScript
import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
import { defineComponent, computed, ref, watch, resolveComponent, openBlock, createElementBlock, normalizeClass, createVNode, mergeProps, createCommentVNode, createElementVNode, withModifiers, withDirectives, vShow, toDisplayString, Fragment, renderList } from 'vue';
import { format, isValid } from 'date-fns';
import { LeftOutlined, RightOutlined, DoubleLeftOutlined, DoubleRightOutlined } from '../icon';
import TimePicker from '../time-picker';
import InputInner from '../input/inputInner.js';
import getPrefixCls from '../_util/getPrefixCls';
import { useLocale } from '../config-provider/useLocale';
import { getDefaultTime, transformDateToTimestamp, strictParse, parseDate } from './helper';
import { RANGE_POSITION, COMMON_PROPS, YEAR_COUNT } from './const';
import { useCurrentDate, useSelectedDates, useYear, useMonth, useDay, useQuarter, useTime } from './useCalendar';
import { pickerFactory } from './pickerHandler';
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
const prefixCls = getPrefixCls('date-picker-calendar');
const MONTHS_NAMES = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
const calendarProps = _objectSpread(_objectSpread({}, COMMON_PROPS), {}, {
rangePosition: {
type: String
},
modelValue: Array,
activeDate: Number,
selectedStatus: Number,
disabledDate: {
type: Function
}
});
function useDateInput(_ref) {
let {
props,
selectedDates,
updateSelectedDates,
updateCurrentDate,
picker
} = _ref;
const inputDate = ref();
let cacheValidInputDate = '';
const currentIndex = computed(() => {
if (picker.value.isRange && props.rangePosition === RANGE_POSITION.RIGHT) {
return 1;
}
return 0;
});
const getDateStr = i => {
return selectedDates.value[i] ? format(transformDateToTimestamp(selectedDates.value[i]), 'yyyy-MM-dd') : '';
};
watch(selectedDates, () => {
cacheValidInputDate = getDateStr(currentIndex.value);
inputDate.value = cacheValidInputDate;
}, {
immediate: true
});
const handleDateInput = val => {
var _props$disabledDate;
inputDate.value = val;
const date = strictParse(val, 'yyyy-MM-dd', new Date());
const anotherDate = selectedDates.value[(currentIndex.value + 1) % 2];
if (isValid(date) && !((_props$disabledDate = props.disabledDate) !== null && _props$disabledDate !== void 0 && _props$disabledDate.call(props, date, 'yyyy-MM-dd', anotherDate && new Date(transformDateToTimestamp(anotherDate))))) {
const dateObj = parseDate(date);
cacheValidInputDate = val;
// 在同一面板,不更新 current date
if (anotherDate && !(anotherDate.year === dateObj.year && anotherDate.month === dateObj.month)) {
updateCurrentDate(dateObj);
}
updateSelectedDates(_objectSpread(_objectSpread({}, selectedDates.value[currentIndex.value]), {}, {
year: dateObj.year,
month: dateObj.month,
day: dateObj.day
}), currentIndex.value, {
isDateInput: true
});
}
};
const handleDateInputBlur = () => {
if (inputDate.value !== cacheValidInputDate) {
inputDate.value = cacheValidInputDate;
}
};
return {
inputDate,
handleDateInput,
handleDateInputBlur
};
}
var script = defineComponent({
name: 'FCalendar',
components: {
LeftOutlined,
RightOutlined,
DoubleLeftOutlined,
DoubleRightOutlined,
InputInner,
TimePicker
},
props: calendarProps,
emits: ['change', 'selectedDay', 'update:activeDate'],
setup(props, _ref2) {
let {
emit
} = _ref2;
const pickerRef = computed(() => {
return pickerFactory(props.type);
});
const {
currentDate,
updateCurrentDate
} = useCurrentDate(props, emit);
const {
selectedDates,
updateSelectedDates
} = useSelectedDates(props, emit, pickerRef);
const {
t
} = useLocale();
const activeIndex = computed(() => {
if (pickerRef.value.isRange) {
return props.rangePosition === RANGE_POSITION.LEFT ? 0 : 1;
}
return 0;
});
const {
inputDate,
handleDateInput,
handleDateInputBlur
} = useDateInput({
props,
selectedDates,
updateSelectedDates,
updateCurrentDate,
picker: pickerRef
});
const {
years,
yearStart,
yearEnd,
selectYear,
isYearSelect,
yearCls
} = useYear({
props,
selectedDates,
updateSelectedDates,
activeIndex,
currentDate,
updateCurrentDate
});
const {
isMonthSelect,
selectMonth,
monthToNext,
monthToPre,
monthCls
} = useMonth({
props,
selectedDates,
updateSelectedDates,
activeIndex,
currentDate,
updateCurrentDate,
picker: pickerRef
});
const {
days,
isDaySelect,
weekNames,
dayCls
} = useDay({
props,
selectedDates,
currentDate,
picker: pickerRef
});
const {
isQuarterSelect,
quarterList,
selectQuarter,
quarterCls
} = useQuarter(props, selectedDates, updateSelectedDates, activeIndex, currentDate);
const {
currentTime,
changeTime,
innerDisabledTime
} = useTime({
props,
selectedDates,
updateSelectedDates,
activeIndex,
picker: pickerRef
});
const selectedDay = info => {
var _selectedDates$value$;
if (info.next) {
monthToNext();
}
if (info.pre) {
monthToPre();
}
let time;
if (((_selectedDates$value$ = selectedDates.value[activeIndex.value]) === null || _selectedDates$value$ === void 0 ? void 0 : _selectedDates$value$.hour) == null) {
time = getDefaultTime(props.defaultTime, props.rangePosition, pickerRef.value.hasTime);
}
updateSelectedDates(_objectSpread({
year: info.year,
month: info.month,
day: info.day
}, time), activeIndex.value);
};
const yearToPre = () => {
if (isYearSelect.value) {
updateCurrentDate({
year: currentDate.year - YEAR_COUNT
});
} else {
updateCurrentDate({
year: currentDate.year - 1
});
}
};
const yearToNext = () => {
if (isYearSelect.value) {
updateCurrentDate({
year: currentDate.year + YEAR_COUNT
});
} else {
updateCurrentDate({
year: currentDate.year + 1
});
}
};
const isNotDisabled = e => e.target.className.indexOf(`${prefixCls}-date-disabled`) === -1;
const visibleLeftSingleArrow = computed(() => !isYearSelect.value && !isMonthSelect.value && !isQuarterSelect.value);
const visibleRightSingleArrow = computed(() => !isYearSelect.value && !isMonthSelect.value && !isQuarterSelect.value);
return {
prefixCls,
pickerRef,
currentDate,
MONTHS_NAMES,
inputDate,
handleDateInput,
handleDateInputBlur,
years,
yearStart,
yearEnd,
selectYear,
isYearSelect,
yearCls,
isMonthSelect,
selectMonth,
monthCls,
weekNames,
isDaySelect,
days,
isQuarterSelect,
quarterList,
selectQuarter,
quarterCls,
dayCls,
monthToNext,
monthToPre,
isNotDisabled,
selectedDay,
currentTime,
changeTime,
innerDisabledTime,
yearToPre,
yearToNext,
t,
visibleLeftSingleArrow,
visibleRightSingleArrow
};
}
});
const _hoisted_1 = ["onClick"];
const _hoisted_2 = ["onClick"];
const _hoisted_3 = ["onClick"];
const _hoisted_4 = ["onClick"];
function render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_InputInner = resolveComponent("InputInner");
const _component_TimePicker = resolveComponent("TimePicker");
const _component_DoubleLeftOutlined = resolveComponent("DoubleLeftOutlined");
const _component_LeftOutlined = resolveComponent("LeftOutlined");
const _component_RightOutlined = resolveComponent("RightOutlined");
const _component_DoubleRightOutlined = resolveComponent("DoubleRightOutlined");
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.prefixCls)
}, [_ctx.pickerRef.hasTime ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(`${_ctx.prefixCls}-input`)
}, [createVNode(_component_InputInner, {
modelValue: _ctx.inputDate,
class: normalizeClass(`${_ctx.prefixCls}-input-date`),
placeholder: _ctx.t('datePicker.selectDate'),
onInput: _ctx.handleDateInput,
onBlur: _ctx.handleDateInputBlur
}, null, 8 /* PROPS */, ["modelValue", "class", "placeholder", "onInput", "onBlur"]), createVNode(_component_TimePicker, mergeProps({
inputClass: `${_ctx.prefixCls}-input-time`,
modelValue: _ctx.currentTime
}, _ctx.innerDisabledTime, {
showSuffix: false,
clearable: false,
hourStep: _ctx.hourStep,
minuteStep: _ctx.minuteStep,
secondStep: _ctx.secondStep,
appendToContainer: false,
placeholder: _ctx.t('datePicker.selectTime'),
onChange: _ctx.changeTime
}), null, 16 /* FULL_PROPS */, ["inputClass", "modelValue", "hourStep", "minuteStep", "secondStep", "placeholder", "onChange"])], 2 /* CLASS */)) : createCommentVNode("v-if", true), createElementVNode("div", {
class: normalizeClass(`${_ctx.prefixCls}-head`),
onMousedown: _cache[0] || (_cache[0] = withModifiers(() => {}, ["prevent"]))
}, [createElementVNode("div", {
class: normalizeClass(`${_ctx.prefixCls}-head-left`)
}, [createVNode(_component_DoubleLeftOutlined, {
class: normalizeClass(`${_ctx.prefixCls}-icon`),
onClick: _ctx.yearToPre
}, null, 8 /* PROPS */, ["class", "onClick"]), withDirectives(createVNode(_component_LeftOutlined, {
class: normalizeClass(`${_ctx.prefixCls}-icon`),
onClick: _ctx.monthToPre
}, null, 8 /* PROPS */, ["class", "onClick"]), [[vShow, _ctx.visibleLeftSingleArrow]])], 2 /* CLASS */), createElementVNode("div", {
class: normalizeClass(`${_ctx.prefixCls}-head-middle`)
}, [createElementVNode("span", {
class: normalizeClass(`${_ctx.prefixCls}-head-middle-item`)
}, toDisplayString(_ctx.currentDate.year) + toDisplayString(_ctx.t('datePicker.year')), 3 /* TEXT, CLASS */), withDirectives(createElementVNode("span", {
class: normalizeClass(`${_ctx.prefixCls}-head-middle-item`)
}, toDisplayString(_ctx.t(`datePicker.month${_ctx.currentDate.month + 1}`)), 3 /* TEXT, CLASS */), [[vShow, !_ctx.isYearSelect && !_ctx.isMonthSelect && !_ctx.isQuarterSelect]])], 2 /* CLASS */), createElementVNode("div", {
class: normalizeClass(`${_ctx.prefixCls}-head-right`)
}, [withDirectives(createVNode(_component_RightOutlined, {
class: normalizeClass(`${_ctx.prefixCls}-icon`),
onClick: _ctx.monthToNext
}, null, 8 /* PROPS */, ["class", "onClick"]), [[vShow, _ctx.visibleRightSingleArrow]]), createVNode(_component_DoubleRightOutlined, {
class: normalizeClass(`${_ctx.prefixCls}-icon`),
onClick: _ctx.yearToNext
}, null, 8 /* PROPS */, ["class", "onClick"])], 2 /* CLASS */)], 34 /* CLASS, NEED_HYDRATION */), createElementVNode("div", {
class: normalizeClass(`${_ctx.prefixCls}-body`),
onMousedown: _cache[1] || (_cache[1] = withModifiers(() => {}, ["prevent"]))
}, [_ctx.isDaySelect ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(`${_ctx.prefixCls}-days`)
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.weekNames, weekName => {
return openBlock(), createElementBlock("span", {
key: weekName,
class: normalizeClass(`${_ctx.prefixCls}-week`)
}, toDisplayString(weekName), 3 /* TEXT, CLASS */);
}), 128 /* KEYED_FRAGMENT */)), (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.days, (item, i) => {
return openBlock(), createElementBlock("span", {
key: i,
class: normalizeClass(_ctx.dayCls(item)),
onClick: $event => _ctx.isNotDisabled($event) && _ctx.selectedDay(item)
}, toDisplayString(item.day), 11 /* TEXT, CLASS, PROPS */, _hoisted_1);
}), 128 /* KEYED_FRAGMENT */))], 2 /* CLASS */)) : createCommentVNode("v-if", true), _ctx.isMonthSelect ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(`${_ctx.prefixCls}-months`)
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.MONTHS_NAMES, (monthName, i) => {
return openBlock(), createElementBlock("span", {
key: i,
class: normalizeClass(_ctx.monthCls(i)),
onClick: $event => _ctx.isNotDisabled($event) && _ctx.selectMonth(i)
}, toDisplayString(_ctx.t(`datePicker.months.${monthName}`)), 11 /* TEXT, CLASS, PROPS */, _hoisted_2);
}), 128 /* KEYED_FRAGMENT */))], 2 /* CLASS */)) : createCommentVNode("v-if", true), _ctx.isYearSelect ? (openBlock(), createElementBlock("div", {
key: 2,
class: normalizeClass(`${_ctx.prefixCls}-years`)
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.years, (year, index) => {
return openBlock(), createElementBlock("span", {
key: index,
class: normalizeClass(_ctx.yearCls(year)),
onClick: $event => _ctx.isNotDisabled($event) && _ctx.selectYear(year)
}, toDisplayString(year), 11 /* TEXT, CLASS, PROPS */, _hoisted_3);
}), 128 /* KEYED_FRAGMENT */))], 2 /* CLASS */)) : createCommentVNode("v-if", true), _ctx.isQuarterSelect ? (openBlock(), createElementBlock("div", {
key: 3,
class: normalizeClass(`${_ctx.prefixCls}-quarters`)
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.quarterList, item => {
return openBlock(), createElementBlock("span", {
key: item.value,
class: normalizeClass(_ctx.quarterCls(item)),
onClick: $event => _ctx.isNotDisabled($event) && _ctx.selectQuarter(item)
}, toDisplayString(_ctx.t(`datePicker.quarters.${item.name}`)), 11 /* TEXT, CLASS, PROPS */, _hoisted_4);
}), 128 /* KEYED_FRAGMENT */))], 2 /* CLASS */)) : createCommentVNode("v-if", true)], 34 /* CLASS, NEED_HYDRATION */)], 2 /* CLASS */);
}
script.render = render;
script.__file = "components/date-picker/calendar.vue";
export { script as default };