UNPKG

tdesign-vue-next

Version:
540 lines (536 loc) 21.2 kB
/** * tdesign v1.15.2 * (c) 2025 tdesign * @license MIT */ import { defineComponent, computed, watch, createVNode, mergeProps, isVNode } from 'vue'; import _defineProperty from '@babel/runtime/helpers/defineProperty'; import _slicedToArray from '@babel/runtime/helpers/slicedToArray'; import dayjs from 'dayjs'; import { isFunction, isArray, remove } from 'lodash-es'; import props from './props.js'; import { createMonthCellsData, createYearCellsData } from './utils/index.js'; import '@babel/runtime/helpers/toConsumableArray'; import '@babel/runtime/helpers/typeof'; import '../_chunks/dep-e604a5ce.js'; import { a as useContent } from '../_chunks/dep-1d44782f.js'; import { useConfig } from '../config-provider/hooks/useConfig.js'; import '../_chunks/dep-7324137b.js'; import { useState } from './hooks/useState.js'; import { useCalendarClass } from './hooks/useCalendarClass.js'; import { userController } from './hooks/useController.js'; import { useColHeaders } from './hooks/useColHeaders.js'; import { LAST_MONTH_OF_YEAR, DEFAULT_YEAR_CELL_NUMINROW, MIN_YEAR, FIRST_MONTH_OF_YEAR, COMPONENT_NAME } from './consts/index.js'; import { Select } from '../select/index.js'; import { RadioGroup, RadioButton } from '../radio/index.js'; import { Button } from '../button/index.js'; import { CheckTag } from '../tag/index.js'; import CalendarCellItem from './calendar-cell.js'; import '../_chunks/dep-7fac49fa.js'; import '../_chunks/dep-1f7ad104.js'; import '../_chunks/dep-6c13cc0e.js'; import '../config-provider/utils/context.js'; import '../_chunks/dep-3b49fbbe.js'; import '@babel/runtime/helpers/createClass'; import '@babel/runtime/helpers/classCallCheck'; import '../_chunks/dep-79c44a11.js'; import '../select/select.js'; import '@babel/runtime/helpers/objectWithoutProperties'; import '@babel/runtime/helpers/asyncToGenerator'; import '@babel/runtime/regenerator'; import '../common-components/fake-arrow.js'; import '../select-input/index.js'; import '../select-input/select-input.js'; import '../popup/index.js'; import '../popup/popup.js'; import '@popperjs/core'; import '../_chunks/dep-b9ab7399.js'; import '../_chunks/dep-3ba91e12.js'; import '../_chunks/dep-34e44a4e.js'; import '../popup/container.js'; import '../popup/props.js'; import '../_chunks/dep-82e44120.js'; import '../_chunks/dep-37a2e7c8.js'; import '../select-input/props.js'; import '../select-input/hooks/useMultiple.js'; import '../tag-input/index.js'; import '../tag-input/tag-input.js'; import 'tdesign-icons-vue-next'; import '../input/index.js'; import '../input/input.js'; import '../input/props.js'; import '../_chunks/dep-5360ac56.js'; import '../_chunks/dep-2ac22271.js'; import '../_chunks/dep-41ae8479.js'; import '../input/hooks/useInput.js'; import '../form/consts/index.js'; import '../input/hooks/useLengthLimit.js'; import '../_chunks/dep-0ffe4637.js'; import '../_chunks/dep-a72765fe.js'; import '../input/hooks/useInputEventHandler.js'; import '../input/hooks/useInputWidth.js'; import '../input/input-group.js'; import '../input/input-group-props.js'; import '../tag-input/props.js'; import '../_chunks/dep-b7083c88.js'; import '../tag-input/hooks/useDragSorter.js'; import '../tag-input/hooks/useHover.js'; import '../tag-input/hooks/useTagScroll.js'; import '../tag-input/hooks/useTagList.js'; import '../tag/tag.js'; import 'tinycolor2'; import '../tag/props.js'; import '../tag/check-tag.js'; import '../tag/check-tag-props.js'; import '../_chunks/dep-01e48141.js'; import '../tag/check-tag-group.js'; import '../tag/check-tag-group-props.js'; import '../loading/index.js'; import '../loading/directive.js'; import '../loading/plugin.js'; import '../_chunks/dep-199af351.js'; import '../loading/icon/gradient.js'; import '../loading/props.js'; import '../select-input/hooks/useOverlayInnerStyle.js'; import '../select-input/hooks/useSingle.js'; import '../select/components/select-panel.js'; import '../select/option.js'; import '../select/option-props.js'; import '../checkbox/index.js'; import '../checkbox/checkbox.js'; import '../checkbox/props.js'; import '../_chunks/dep-7b209207.js'; import '../checkbox/consts/index.js'; import '../checkbox/hooks/useCheckboxLazyLoad.js'; import '../_chunks/dep-6f34ddfa.js'; import '../checkbox/hooks/useKeyboardEvent.js'; import '../checkbox/group.js'; import '../checkbox/checkbox-group-props.js'; import '../_chunks/dep-0f8c45fe.js'; import '../select/utils/index.js'; import '../select/consts/index.js'; import '../select/option-group.js'; import '../select/option-group-props.js'; import '../select/props.js'; import '../select/hooks/usePanelVirtualScroll.js'; import '../select/hooks/useKeyboardControl.js'; import '../select/hooks/useSelectOptions.js'; import '../radio/radio.js'; import '../radio/props.js'; import '../radio/consts/index.js'; import '../radio/group.js'; import '../radio/radio-group-props.js'; import '../radio/radio-button.js'; import '../radio/hooks/useKeyboard.js'; import '../watermark/hooks/index.js'; import '../button/button.js'; import '../button/props.js'; 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; } function _isSlot(s) { return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !isVNode(s); } var _Calendar = defineComponent({ name: "TCalendar", props: props, setup: function setup(props2, _ref) { var slots = _ref.slots; var renderContent = useContent(); var _useConfig = useConfig(COMPONENT_NAME), t = _useConfig.t, globalConfig = _useConfig.globalConfig; var _useState = useState(props2), state = _useState.state, toToday = _useState.toToday, checkDayVisible = _useState.checkDayVisible; var cls = useCalendarClass(props2, state); var _useColHeaders = useColHeaders(props2, state), cellColHeaders = _useColHeaders.cellColHeaders; var controller = userController(props2, state); var rangeFromTo = computed(function () { if (!props2.range || props2.range.length < 2) { return null; } var _props2$range = _slicedToArray(props2.range, 2), v1 = _props2$range[0], v2 = _props2$range[1]; if (dayjs(v1).isBefore(dayjs(v2))) { return { from: v1, to: v2 }; } return { from: v2, to: v1 }; }); function checkMonthAndYearSelectedDisabled(year, month) { var disabled = false; if (rangeFromTo.value && rangeFromTo.value.from && rangeFromTo.value.to) { var beginYear = dayjs(rangeFromTo.value.from).year(); var endYear = dayjs(rangeFromTo.value.to).year(); if (year === beginYear) { var beginMon = parseInt(dayjs(rangeFromTo.value.from).format("M"), 10); disabled = month < beginMon; } else if (year === endYear) { var endMon = parseInt(dayjs(rangeFromTo.value.to).format("M"), 10); disabled = month > endMon; } } return disabled; } function adjustMonth() { var _rangeFromTo$value, _rangeFromTo$value2; if ((_rangeFromTo$value = rangeFromTo.value) !== null && _rangeFromTo$value !== void 0 && _rangeFromTo$value.from && (_rangeFromTo$value2 = rangeFromTo.value) !== null && _rangeFromTo$value2 !== void 0 && _rangeFromTo$value2.to) { var beginYear = dayjs(rangeFromTo.value.from).year(); var endYear = dayjs(rangeFromTo.value.to).year(); var beginMon = parseInt(dayjs(rangeFromTo.value.from).format("M"), 10); if (checkMonthAndYearSelectedDisabled(state.curSelectedYear, state.curSelectedMonth)) { state.curSelectedMonth = state.curSelectedYear === beginYear ? beginMon : state.curSelectedYear === endYear ? 1 : state.curSelectedMonth; } } } watch(function () { return { year: "".concat(state.curSelectedYear), month: "".concat(state.curSelectedMonth) }; }, function (v) { isFunction(props2.onMonthChange) && props2.onMonthChange(_objectSpread({}, v)); controller.emitControllerChange(); }); var dateSelect = { yearSelectOptionList: computed(function () { var re = []; var begin = state.curSelectedYear - 10; var end = state.curSelectedYear + 10; if (rangeFromTo.value && rangeFromTo.value.from && rangeFromTo.value.to) { begin = dayjs(rangeFromTo.value.from).year(); end = dayjs(rangeFromTo.value.to).year(); } if (begin < MIN_YEAR) { begin = MIN_YEAR; } if (end < MIN_YEAR) { end = MIN_YEAR; } for (var i = begin; i <= end; i++) { re.push({ value: i, label: t(globalConfig.value.yearSelection, { year: i }), disabled: false }); } return re; }), isYearSelectVisible: computed(function () { return controller.checkControllerVisible("year"); }), isYearSelectDisabled: computed(function () { return controller.checkControllerDisabled("year", "selectProps"); }), monthSelectOptionList: computed(function () { adjustMonth(); var re = []; for (var i = FIRST_MONTH_OF_YEAR; i <= LAST_MONTH_OF_YEAR; i++) { var disabled = checkMonthAndYearSelectedDisabled(state.curSelectedYear, i); re.push({ value: i, label: t(globalConfig.value.monthSelection, { month: i }), disabled: disabled }); } return re; }), isMonthSelectVisible: computed(function () { return state.curSelectedMode === "month" && controller.checkControllerVisible("month"); }), isMonthSelectDisabled: computed(function () { return controller.checkControllerDisabled("month", "selectProps"); }) }; var modeSelect = { optionList: computed(function () { return [{ value: "month", label: t(globalConfig.value.monthRadio) }, { value: "year", label: t(globalConfig.value.yearRadio) }]; }), isVisible: computed(function () { return controller.checkControllerVisible("mode"); }), isDisabled: computed(function () { return controller.checkControllerDisabled("mode", "radioGroupProps"); }) }; var weekendBtn = { text: computed(function () { return state.isShowWeekend ? t(globalConfig.value.hideWeekend) : t(globalConfig.value.showWeekend); }), vBind: computed(function () { var c = controller.configData.value.weekend; return state.isShowWeekend ? c.hideWeekendButtonProps : c.showWeekendButtonProps; }), isVisible: computed(function () { return props2.theme === "full" && controller.checkControllerVisible("current") && controller.checkControllerVisible("weekend"); }), isDisabled: computed(function () { var p = state.isShowWeekend ? "hideWeekendButtonProps" : "showWeekendButtonProps"; return controller.checkControllerDisabled("weekend", p); }) }; var currentBtn = { text: computed(function () { return state.curSelectedMode === "month" ? t(globalConfig.value.today) : t(globalConfig.value.thisMonth); }), vBind: computed(function () { var c = controller.configData.value.current; return state.curSelectedMode === "month" ? c.currentDayButtonProps : c.currentMonthButtonProps; }), isVisible: computed(function () { return props2.theme === "full" && controller.checkControllerVisible("current"); }), isDisabled: computed(function () { var p = state.curSelectedMode === "month" ? "currentDayButtonProps" : "currentMonthButtonProps"; return controller.checkControllerDisabled("current", p); }) }; var renderControl = function renderControl() { var _slot; return createVNode("div", { "class": cls.control.value }, [createVNode("div", { "class": cls.title.value }, [renderContent("head", void 0, { params: _objectSpread({}, controller.options.value) })]), createVNode("div", { "class": cls.controlSection.value }, [dateSelect.isYearSelectVisible.value && createVNode("div", { "class": cls.controlSectionCell.value }, [createVNode(Select, mergeProps({ "modelValue": state.curSelectedYear, "onUpdate:modelValue": function onUpdateModelValue($event) { return state.curSelectedYear = $event; }, "size": state.controlSize, "autoWidth": true }, controller.configData.value.year.selectProps, { "disabled": dateSelect.isYearSelectDisabled.value, "options": dateSelect.yearSelectOptionList.value }), null)]), dateSelect.isMonthSelectVisible.value && createVNode("div", { "class": cls.controlSectionCell.value }, [createVNode(Select, mergeProps({ "autoWidth": true, "modelValue": state.curSelectedMonth, "onUpdate:modelValue": function onUpdateModelValue($event) { return state.curSelectedMonth = $event; }, "size": state.controlSize }, controller.configData.value.month.selectProps, { "disabled": dateSelect.isMonthSelectDisabled.value, "options": dateSelect.monthSelectOptionList.value }), null)]), modeSelect.isVisible.value && createVNode("div", { "class": cls.controlSectionCell.value, "style": "height: auto" }, [createVNode(RadioGroup, mergeProps({ "modelValue": state.curSelectedMode, "onUpdate:modelValue": function onUpdateModelValue($event) { return state.curSelectedMode = $event; }, "variant": "default-filled", "size": state.controlSize }, controller.configData.value.mode.radioGroupProps, { "disabled": modeSelect.isDisabled.value, "onChange": controller.emitControllerChange }), _isSlot(_slot = modeSelect.optionList.value.map(function (item) { return createVNode(RadioButton, { "key": item.value, "value": item.value }, { "default": function _default() { return [item.label]; } }); })) ? _slot : { "default": function _default() { return [_slot]; } })]), weekendBtn.isVisible.value && createVNode("div", { "class": cls.controlSectionCell.value }, [createVNode(CheckTag, mergeProps({ "class": cls.controlTag.value, "theme": state.isShowWeekend ? "default" : "primary", "size": "large" }, weekendBtn.vBind.value, { "disabled": weekendBtn.isDisabled.value, "onClick": function onClick() { state.isShowWeekend = !state.isShowWeekend; controller.emitControllerChange(); } }), { "default": function _default() { return [weekendBtn.text.value]; } })]), currentBtn.isVisible.value && createVNode("div", { "class": cls.controlSectionCell.value }, [createVNode(Button, mergeProps({ "size": state.controlSize }, currentBtn.vBind.value, { "disabled": currentBtn.isDisabled.value, "onClick": function onClick() { toToday(); } }), { "default": function _default() { return [currentBtn.text.value]; } })])])]); }; var cellClickEmit = function cellClickEmit(eventPropsName, e, cellData) { if (isFunction(props2[eventPropsName])) { var options = { cell: _objectSpread(_objectSpread({}, cellData), controller.options.value), e: e }; props2[eventPropsName](options); } }; var clickCell = function clickCell(e, cellData) { var d = dayjs(cellData.date); if (props2.multiple) { if (state.curDateList.find(function (item) { return item.isSame(d); })) { state.curDateList = remove(state.curDateList, function (item) { return !item.isSame(d); }); } else { state.curDateList.push(d); } } else { state.curDate = d; } cellClickEmit("onCellClick", e, cellData); }; var doubleClickCell = function doubleClickCell(e, cellData) { cellClickEmit("onCellDoubleClick", e, cellData); }; var rightClickCell = function rightClickCell(e, cellData) { if (props2.preventCellContextmenu) { e.preventDefault(); } cellClickEmit("onCellRightClick", e, cellData); }; var monthCellsData = computed(function () { var daysArr = createMonthCellsData(props2, state); return daysArr; }); var renderMonthBody = function renderMonthBody() { return createVNode("table", { "class": cls.table.value }, [createVNode("thead", { "class": cls.tableHead.value }, [createVNode("tr", { "class": cls.tableHeadRow.value }, [cellColHeaders.value.map(function (item, index) { return checkDayVisible(item.num) && createVNode("th", { "class": cls.tableHeadCell.value }, [isArray(props2.week) ? props2.week[index] : renderContent("week", void 0, { defaultNode: createVNode("span", null, [item.display]), params: { day: item.num } })]); })])]), createVNode("tbody", { "class": cls.tableBody.value }, [monthCellsData.value.map(function (week, weekIndex) { return createVNode("tr", { "class": cls.tableBodyRow.value }, [week.map(function (item, itemIndex) { return (state.isShowWeekend || item.day < 6) && createVNode(CalendarCellItem, { "key": "d-".concat(weekIndex, "-").concat(itemIndex), "item": item, "theme": props2.theme, "t": t, "global": globalConfig.value, "cell": props2.cell, "cellAppend": props2.cellAppend, "fillWithZero": props2.fillWithZero, "onClick": function onClick(e) { return clickCell(e, item); }, "onDblclick": function onDblclick(e) { return doubleClickCell(e, item); }, "onRightclick": function onRightclick(e) { return rightClickCell(e, item); } }, _objectSpread({}, slots)); })]); })])]); }; var yearCellsData = computed(function () { var re = []; var monthsArr = createYearCellsData(props2, state); var rowCount = Math.ceil(monthsArr.length / DEFAULT_YEAR_CELL_NUMINROW); var index = 0; for (var i = 1; i <= rowCount; i++) { var row = []; for (var j = 1; j <= DEFAULT_YEAR_CELL_NUMINROW; j++) { row.push(monthsArr[index]); index += 1; } re.push(row); } return re; }); var renderYearBody = function renderYearBody() { return createVNode("table", { "class": cls.table.value }, [createVNode("tbody", { "class": cls.tableBody.value }, [yearCellsData.value.map(function (cell, cellIndex) { return createVNode("tr", { "class": cls.tableBodyRow.value }, [cell.map(function (item, itemIndex) { return createVNode(CalendarCellItem, { "key": "m-".concat(cellIndex, "-").concat(itemIndex), "item": item, "theme": props2.theme, "t": t, "global": globalConfig.value, "cell": props2.cell, "cellAppend": props2.cellAppend, "fillWithZero": props2.fillWithZero, "onClick": function onClick(e) { return clickCell(e, item); }, "onDblclick": function onDblclick(e) { return doubleClickCell(e, item); }, "onRightclick": function onRightclick(e) { return rightClickCell(e, item); } }, _objectSpread({}, slots)); })]); })])]); }; return function () { return createVNode("div", { "class": cls.body.value }, [controller.visible.value && renderControl(), createVNode("div", { "class": cls.panel.value }, [state.curSelectedMode === "month" ? renderMonthBody() : renderYearBody()])]); }; } }); export { _Calendar as default }; //# sourceMappingURL=calendar.js.map