@extclp/vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 30.9 kB
Source Map (JSON)
{"version":3,"file":"date-panel.vue2.mjs","sources":["../../../components/date-picker/date-panel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Button } from '@/components/button'\nimport { CalendarPanel } from '@/components/calendar-panel'\nimport { Icon } from '@/components/icon'\nimport { ResizeObserver } from '@/components/resize-observer'\n\nimport { computed, onMounted, reactive, ref, watch } from 'vue'\n\nimport TimeWheel from './time-wheel.vue'\nimport { useIcons, useNameHelper } from '@vexip-ui/config'\nimport { callIfFunc, range as rangeNumbers, toDate } from '@vexip-ui/utils'\nimport { useRtl } from '@vexip-ui/hooks'\nimport { datePickerTypes } from './symbol'\n\nimport type { PropType } from 'vue'\nimport type { MonthIndex } from '@/components/calendar'\nimport type { LocaleConfig } from '@vexip-ui/config'\nimport type { Dateable } from '@vexip-ui/utils'\nimport type {\n DatePanelSlots,\n DatePickerType,\n DateShortcut,\n DateShortcutsPlacement,\n DateTimeType,\n DateType,\n DisabledTime,\n TimeType\n} from './symbol'\n\ndefineOptions({ name: 'DatePanel' })\n\nconst props = defineProps({\n type: {\n default: 'date' as DatePickerType,\n validator: (value: DatePickerType) => datePickerTypes.includes(value)\n },\n enabled: {\n type: Object as PropType<Record<DateTimeType, boolean>>,\n default: () => ({})\n },\n startValue: {\n type: Object as PropType<Record<DateTimeType, number>>,\n default: null\n },\n endValue: {\n type: Object as PropType<Record<DateTimeType, number>>,\n default: null\n },\n shortcuts: {\n type: Array as PropType<DateShortcut[]>,\n default: () => []\n },\n confirmText: {\n type: String,\n default: null\n },\n cancelText: {\n type: String,\n default: null\n },\n today: {\n type: [Number, String, Date] as PropType<Dateable>,\n default: () => new Date()\n },\n disabledDate: {\n type: Function as PropType<(date: Date) => boolean>,\n default: () => false\n },\n noAction: {\n type: Boolean,\n default: false\n },\n steps: {\n type: Array as PropType<number[]>,\n default: () => [1, 1, 1]\n },\n range: {\n type: Boolean,\n default: false\n },\n startActivated: {\n type: Object as PropType<Record<DateTimeType, boolean>>,\n default: () => ({})\n },\n endActivated: {\n type: Object as PropType<Record<DateTimeType, boolean>>,\n default: () => ({})\n },\n min: {\n type: [Number, String, Date] as PropType<Dateable>,\n default: null\n },\n max: {\n type: [Number, String, Date] as PropType<Dateable>,\n default: null\n },\n disabledTime: {\n type: Object as PropType<DisabledTime>,\n default: () => ({})\n },\n hasError: {\n type: Boolean,\n default: false\n },\n locale: {\n type: Object as PropType<LocaleConfig['calendar'] & LocaleConfig['datePicker']>,\n default: () => ({})\n },\n selectingType: {\n type: String as PropType<'start' | 'end'>,\n default: 'start'\n },\n weekStart: {\n type: Number,\n default: null\n },\n staticWheel: {\n type: Boolean,\n default: false\n },\n shortcutsPlacement: {\n type: String as PropType<DateShortcutsPlacement>,\n default: 'left'\n },\n labeledBy: {\n type: String,\n default: undefined\n }\n})\n\nconst emit = defineEmits([\n 'click',\n 'shortcut',\n 'toggle-col',\n 'change',\n 'cancel',\n 'confirm',\n 'hover',\n 'type-change',\n 'time-change'\n])\n\ndefineSlots<DatePanelSlots>()\n\nconst nh = useNameHelper('date-picker')\nconst icons = useIcons()\nconst { isRtl } = useRtl()\n\nconst today = toDate(props.today)\nconst monthRange = rangeNumbers(12, 1, 1)\n\nconst currentPanel = ref<DateType>(\n props.type === 'year' ? 'year' : props.type === 'month' ? 'month' : 'date'\n)\nconst calendarYear = ref(today.getFullYear())\nconst calendarMonth = ref(today.getMonth() + 1) // 1 ~ 12\nconst hoveredYear = ref(0) // 0 is no hover (falsy)\nconst hoveredMonth = ref(0) // 0 is no hover (falsy)\nconst yearRange = ref<number[]>([])\n\nconst shortcutsRect = reactive({ width: 0, height: 0 })\n\nconst panelStyle = computed(() => {\n const { width, height } = shortcutsRect\n\n switch (props.shortcutsPlacement) {\n case 'top':\n return { paddingTop: `${height}px` }\n case 'right':\n return { paddingRight: `${width}px` }\n case 'bottom':\n return { paddingBottom: `${height}px` }\n default:\n return { paddingLeft: `${width}px` }\n }\n})\nconst startActivated = computed(() => {\n const activated = props.startActivated\n\n return activated.year && activated.month && activated.date\n})\nconst endActivated = computed(() => {\n const activated = props.endActivated\n\n return activated.year && activated.month && activated.date\n})\nconst isDatetime = computed(() => {\n return props.type === 'datetime'\n})\nconst calendarValue = computed(() => {\n return props.range\n ? startActivated.value || endActivated.value\n ? [getStringValue('start'), getStringValue('end')]\n : ['', '']\n : startActivated.value\n ? getStringValue('start')\n : ''\n})\nconst weekDays = computed(() => {\n return [\n props.locale.week7,\n props.locale.week1,\n props.locale.week2,\n props.locale.week3,\n props.locale.week4,\n props.locale.week5,\n props.locale.week6\n ].map(week => week.slice(0, 2))\n})\n\nwatch(\n calendarYear,\n value => {\n yearRange.value = rangeNumbers(12, Math.floor(value / 10) * 10, 1)\n },\n { immediate: true }\n)\n\nonMounted(() => {\n refreshCalendar('start')\n})\n\ndefineExpose({ refreshCalendar })\n\nfunction getStringValue(type: 'start' | 'end') {\n const value = type === 'start' ? props.startValue : props.endValue\n\n return value ? `${value.year}-${value.month}-${value.date}` : ''\n}\n\nfunction getMonthLabel(index: number) {\n return props.locale[`month${index as MonthIndex}`]\n}\n\nfunction togglePanel(type: DateType) {\n currentPanel.value = type\n}\n\nfunction adjustCalendar(type: 'year' | 'month', amount: number) {\n if (type === 'year') {\n calendarYear.value += amount\n } else {\n // 月份存在进位\n calendarMonth.value += amount\n\n const date = new Date(calendarYear.value, calendarMonth.value - 1, 1)\n\n calendarYear.value = date.getFullYear()\n calendarMonth.value = date.getMonth() + 1\n }\n}\n\nfunction handleClick(event: MouseEvent) {\n emit('click', event)\n}\n\nfunction handleShortcut(index: number) {\n const { value, name } = props.shortcuts[index]\n\n emit('shortcut', name, callIfFunc(value))\n}\n\nfunction handleSelectDate(date: Date) {\n emitChange([date.getFullYear(), date.getMonth() + 1, date.getDate()])\n}\n\nfunction handleSelectYear(year: number) {\n if (isDisabledYear(year)) return\n\n calendarYear.value = year\n\n if (props.type !== 'year') {\n togglePanel('month')\n } else {\n emitChange([year, 1, 1])\n }\n}\n\nfunction handleSelectMonth(month: number) {\n if (isDisabledMonth(month)) return\n\n calendarMonth.value = month\n\n if (props.type !== 'month') {\n togglePanel('date')\n } else {\n emitChange([calendarYear.value, month, 1])\n }\n}\n\nfunction emitChange(values: number[]) {\n emit('change', values)\n}\n\nfunction handleStartTimeChange(type: TimeType, time: number) {\n emit('time-change', 'start', type, time)\n}\n\nfunction handleEndTimeChange(type: TimeType, time: number) {\n emit('time-change', 'end', type, time)\n}\n\nfunction handleDoublePrevClick() {\n if (currentPanel.value === 'year') {\n yearRange.value = rangeNumbers(12, yearRange.value[0] - 10, 1)\n } else {\n adjustCalendar('year', -1)\n }\n}\nfunction handleDoubleNextClick() {\n if (currentPanel.value === 'year') {\n yearRange.value = rangeNumbers(12, yearRange.value[10], 1)\n } else {\n adjustCalendar('year', 1)\n }\n}\n\nfunction handleCancel() {\n emit('cancel')\n}\n\nfunction handleConfirm() {\n emit('confirm')\n}\n\nfunction handleHoverDate(date: Date | null) {\n emit('hover', date)\n}\n\nfunction isSelectedYear(year: number) {\n if (!year) return false\n\n return (\n (props.startActivated.year && props.startValue.year === year) ||\n (props.endActivated.year && props.endValue.year === year)\n )\n}\n\nfunction isSelectedMonth(month: number) {\n if (!month) return false\n\n const monthYear = 100 * calendarYear.value + month\n\n return (\n (props.startActivated.month &&\n 100 * props.startValue.year + props.startValue.month === monthYear) ||\n (props.endActivated.month && 100 * props.endValue.year + props.endValue.month === monthYear)\n )\n}\n\nfunction isDisabledYear(year: number) {\n if (props.type === 'year') {\n return props.disabledDate(new Date(year, 0))\n }\n\n for (let i = 1; i <= 12; ++i) {\n if (!isDisabledMonth(i, year)) {\n return false\n }\n }\n\n return true\n}\n\nfunction isDisabledMonth(month: number, year = calendarYear.value) {\n if (props.type === 'year') return false\n\n if (props.type === 'month') {\n return props.disabledDate(new Date(year, month - 1))\n }\n\n const current = new Date(year, month - 1)\n const end = new Date(year, month, 0)\n const dayCount = end.getDate()\n\n for (let i = 1; i <= dayCount; ++i) {\n current.setDate(i)\n\n if (!props.disabledDate(current)) {\n return false\n }\n }\n\n return true\n}\n\nfunction handleYearHover(year: number) {\n hoveredYear.value = isDisabledYear(year) ? 0 : year\n}\n\nfunction handleMonthHover(month: number) {\n hoveredMonth.value = isDisabledMonth(month) ? 0 : month\n}\n\nfunction isYearInRange(year: number) {\n if (\n !props.range ||\n (!hoveredYear.value && !props.startActivated.year && !props.endActivated.year)\n ) {\n return false\n }\n\n // if (\n // (props.valueType === 'start' && !props.endActivated.year) ||\n // (props.valueType === 'end' && !props.startActivated.year)\n // ) {\n // return false\n // }\n\n const startYear = props.startValue.year\n const endYear = props.endValue.year\n\n let min: number\n let max: number\n\n if (!hoveredYear.value && props.startActivated.year && props.endActivated.year) {\n min = Math.min(startYear, endYear)\n max = Math.max(startYear, endYear)\n } else if (hoveredYear.value) {\n if (!props.startActivated.year && !props.endActivated.year) return false\n\n if (!props.startActivated.year || !props.endActivated.year) {\n const selectedYear = props.startActivated.year ? startYear : endYear\n\n min = Math.min(hoveredYear.value, selectedYear)\n max = Math.max(hoveredYear.value, selectedYear)\n } else {\n const minYear = Math.min(startYear, endYear)\n const maxYear = Math.max(startYear, endYear)\n\n min = Math.min(hoveredYear.value, minYear)\n max = Math.max(hoveredYear.value, maxYear)\n }\n } else {\n return false\n }\n\n return year >= min && year <= max\n}\n\nfunction isMonthInRange(month: number) {\n if (\n !props.range ||\n (!hoveredMonth.value && !props.startActivated.month && !props.endActivated.month)\n ) {\n return false\n }\n\n // if (\n // (props.valueType === 'start' && !props.endActivated.month) ||\n // (props.valueType === 'end' && !props.startActivated.month)\n // ) {\n // return false\n // }\n\n const startMonthYear = 100 * props.startValue.year + props.startValue.month\n const endMonthYear = 100 * props.endValue.year + props.endValue.month\n\n let min: number\n let max: number\n\n if (!hoveredMonth.value && props.startActivated.month && props.endActivated.month) {\n min = Math.min(startMonthYear, endMonthYear)\n max = Math.max(startMonthYear, endMonthYear)\n } else if (hoveredMonth.value) {\n if (!props.startActivated.month && !props.endActivated.month) return false\n\n const hoveredMonthYear = 100 * calendarYear.value + hoveredMonth.value\n\n if (!props.startActivated.month || !props.endActivated.month) {\n const selectedMonthYear = props.startActivated.month ? startMonthYear : endMonthYear\n\n min = Math.min(hoveredMonthYear, selectedMonthYear)\n max = Math.max(hoveredMonthYear, selectedMonthYear)\n } else {\n const minMonthYear = Math.min(startMonthYear, endMonthYear)\n const maxMonthYear = Math.max(startMonthYear, endMonthYear)\n\n min = Math.min(hoveredMonthYear, minMonthYear)\n max = Math.max(hoveredMonthYear, maxMonthYear)\n }\n } else {\n return false\n }\n\n const monthYear = 100 * calendarYear.value + month\n\n return monthYear >= min && monthYear <= max\n}\n\n// 重新计算日历页面\nfunction refreshCalendar(valueType: 'start' | 'end') {\n const today = toDate(props.today)\n\n if (valueType === 'start') {\n calendarYear.value = props.startActivated.year ? props.startValue.year : today.getFullYear()\n calendarMonth.value = props.startActivated.month ? props.startValue.month : today.getMonth() + 1\n } else {\n calendarYear.value = props.endActivated.year ? props.endValue.year : today.getFullYear()\n calendarMonth.value = props.endActivated.month ? props.endValue.month : today.getMonth() + 1\n }\n}\n\nfunction handleShortcutsResize(entry: ResizeObserverEntry) {\n const box = entry.borderBoxSize?.[0]\n\n if (box) {\n shortcutsRect.width = box.inlineSize\n shortcutsRect.height = box.blockSize\n } else {\n shortcutsRect.width = entry.contentRect.width\n shortcutsRect.height = entry.contentRect.height\n }\n}\n</script>\n\n<template>\n <div\n :class=\"{\n [nh.be('panel')]: true,\n [nh.bem('panel', 'vertical')]:\n shortcuts.length && (shortcutsPlacement === 'top' || shortcutsPlacement === 'bottom')\n }\"\n :aria-labelledby=\"labeledBy\"\n :style=\"panelStyle\"\n @click=\"handleClick\"\n >\n <ResizeObserver v-if=\"shortcuts.length\" :on-resize=\"handleShortcutsResize\">\n <div\n :class=\"[\n nh.be('list'),\n nh.bem('list', 'sub'),\n nh.be('shortcuts'),\n nh.bem('shortcuts', shortcutsPlacement)\n ]\"\n >\n <div\n v-for=\"(item, index) in shortcuts\"\n :key=\"index\"\n :class=\"nh.be('shortcut')\"\n :title=\"item.name\"\n @click=\"handleShortcut(index)\"\n >\n {{ item.name }}\n </div>\n </div>\n </ResizeObserver>\n <div :class=\"nh.be('list')\" role=\"application\">\n <div :class=\"nh.be('panel-body')\">\n <div :class=\"nh.be('date-panel')\">\n <div :class=\"nh.be('header')\">\n <div :class=\"[nh.be('arrow'), nh.be('prev-year')]\" @click=\"handleDoublePrevClick\">\n <Icon v-bind=\"isRtl ? icons.anglesRight : icons.anglesLeft\"></Icon>\n </div>\n <div\n v-show=\"currentPanel === 'date'\"\n :class=\"[nh.be('arrow'), nh.be('prev-month')]\"\n @click=\"adjustCalendar('month', -1)\"\n >\n <Icon v-bind=\"isRtl ? icons.angleRight : icons.angleLeft\"></Icon>\n </div>\n <div :class=\"nh.be('year-month')\">\n <slot\n name=\"title\"\n :panel=\"currentPanel\"\n :year-start=\"yearRange[0]\"\n :year=\"calendarYear\"\n :month=\"calendarMonth\"\n :toggle-panel=\"togglePanel\"\n >\n <div key=\"year\" :class=\"nh.be('year')\" @click.stop=\"togglePanel('year')\">\n <template v-if=\"currentPanel === 'year'\">\n {{ `${yearRange[0]}${locale.year} - ${yearRange[9]}${locale.year}` }}\n </template>\n <template v-else>\n {{ `${calendarYear}${locale.year}` }}\n </template>\n </div>\n <div\n v-show=\"currentPanel === 'date'\"\n :class=\"nh.be('month')\"\n @click.stop=\"togglePanel('month')\"\n >\n {{ getMonthLabel(calendarMonth) }}\n </div>\n </slot>\n </div>\n <div\n v-show=\"currentPanel === 'date'\"\n :class=\"[nh.be('arrow'), nh.be('next-month')]\"\n @click=\"adjustCalendar('month', 1)\"\n >\n <Icon v-bind=\"isRtl ? icons.angleLeft : icons.angleRight\"></Icon>\n </div>\n <div :class=\"[nh.be('arrow'), nh.be('next-year')]\" @click=\"handleDoubleNextClick\">\n <Icon v-bind=\"isRtl ? icons.anglesLeft : icons.anglesRight\"></Icon>\n </div>\n </div>\n <div :class=\"nh.be('calendar')\">\n <div\n v-if=\"currentPanel === 'year'\"\n :class=\"nh.be('year-panel')\"\n @mouseleave=\"hoveredYear = 0\"\n >\n <div\n v-for=\"(item, index) in yearRange\"\n :key=\"index\"\n :class=\"{\n [nh.be('year-item')]: true,\n [nh.bem('year-item', 'selected')]: isSelectedYear(item),\n [nh.bem('year-item', 'next')]: index > 9,\n [nh.bem('year-item', 'disabled')]: isDisabledYear(item),\n [nh.bem('year-item', 'in-range')]: isYearInRange(item)\n }\"\n @click.stop=\"handleSelectYear(item)\"\n @mouseenter=\"handleYearHover(item)\"\n >\n <div :class=\"nh.be('year-label')\">\n <slot\n name=\"year\"\n :year=\"item\"\n :selected=\"isSelectedYear(item)\"\n :is-next=\"index > 9\"\n :disabled=\"isDisabledYear(item)\"\n :in-range=\"isYearInRange(item)\"\n >\n <div :class=\"nh.be('year-label-inner')\">\n {{ item }}\n </div>\n </slot>\n </div>\n </div>\n </div>\n <div\n v-else-if=\"currentPanel === 'month'\"\n :class=\"nh.be('month-panel')\"\n @mouseleave=\"hoveredMonth = 0\"\n >\n <div\n v-for=\"index in monthRange\"\n :key=\"index\"\n :class=\"{\n [nh.be('month-item')]: true,\n [nh.bem('month-item', 'selected')]: isSelectedMonth(index),\n [nh.bem('month-item', 'disabled')]: isDisabledMonth(index),\n [nh.bem('month-item', 'in-range')]: isMonthInRange(index)\n }\"\n @click.stop=\"handleSelectMonth(index)\"\n @mouseenter=\"handleMonthHover(index)\"\n >\n <div :class=\"nh.be('month-label')\">\n <slot\n name=\"month\"\n :year=\"calendarYear\"\n :month=\"index\"\n :selected=\"isSelectedMonth(index)\"\n :disabled=\"isDisabledMonth(index)\"\n :in-range=\"isMonthInRange(index)\"\n >\n <div :class=\"nh.be('month-label-inner')\">\n {{ getMonthLabel(index) }}\n </div>\n </slot>\n </div>\n </div>\n </div>\n <CalendarPanel\n v-else\n inherit\n :value=\"calendarValue\"\n :year=\"calendarYear\"\n :month=\"calendarMonth\"\n :value-type=\"selectingType\"\n :disabled-date=\"disabledDate\"\n :range=\"range\"\n :min=\"min\"\n :max=\"max\"\n :week-start=\"weekStart\"\n :week-days=\"weekDays\"\n @select=\"handleSelectDate\"\n @hover=\"handleHoverDate\"\n >\n <template v-if=\"$slots.week\" #week=\"weekParams\">\n <slot name=\"week\" v-bind=\"weekParams\"></slot>\n </template>\n <template v-if=\"$slots.date\" #itemContent=\"itemParams\">\n <slot name=\"date\" v-bind=\"itemParams\"></slot>\n </template>\n </CalendarPanel>\n </div>\n </div>\n <div v-if=\"isDatetime\" :class=\"nh.be('time-panel')\">\n <div :class=\"[nh.be('header'), nh.bem('header', 'time')]\">\n <template v-if=\"range\">\n <div :class=\"nh.be('title')\">\n {{ locale.startTime }}\n </div>\n <div :class=\"nh.be('title')\">\n {{ locale.endTime }}\n </div>\n </template>\n </div>\n <div :class=\"nh.be('wheel')\">\n <TimeWheel\n :hour=\"startValue.hour\"\n :minute=\"startValue.minute\"\n :second=\"startValue.second\"\n :candidate=\"3\"\n :steps=\"steps\"\n :disabled-time=\"disabledTime\"\n :no-transition=\"staticWheel\"\n @change=\"handleStartTimeChange\"\n ></TimeWheel>\n <TimeWheel\n v-if=\"range\"\n :hour=\"endValue.hour\"\n :minute=\"endValue.minute\"\n :second=\"endValue.second\"\n :candidate=\"3\"\n :steps=\"steps\"\n :disabled-time=\"disabledTime\"\n :no-transition=\"staticWheel\"\n @change=\"handleEndTimeChange\"\n ></TimeWheel>\n </div>\n </div>\n </div>\n <div v-if=\"!noAction\" :class=\"nh.be('action')\">\n <Button\n inherit\n text\n size=\"small\"\n @click=\"handleCancel\"\n >\n {{ cancelText || locale.cancel }}\n </Button>\n <Button\n inherit\n type=\"primary\"\n size=\"small\"\n :disabled=\"hasError\"\n @click=\"handleConfirm\"\n >\n {{ confirmText || locale.confirm }}\n </Button>\n </div>\n </div>\n </div>\n</template>\n"],"names":["props","__props","emit","__emit","nh","useNameHelper","icons","useIcons","isRtl","useRtl","today","toDate","monthRange","rangeNumbers","currentPanel","ref","calendarYear","calendarMonth","hoveredYear","hoveredMonth","yearRange","shortcutsRect","reactive","panelStyle","computed","width","height","startActivated","activated","endActivated","isDatetime","calendarValue","getStringValue","weekDays","week","watch","value","onMounted","refreshCalendar","__expose","type","getMonthLabel","index","togglePanel","adjustCalendar","amount","date","handleClick","event","handleShortcut","name","callIfFunc","handleSelectDate","emitChange","handleSelectYear","year","isDisabledYear","handleSelectMonth","month","isDisabledMonth","values","handleStartTimeChange","time","handleEndTimeChange","handleDoublePrevClick","handleDoubleNextClick","handleCancel","handleConfirm","handleHoverDate","isSelectedYear","isSelectedMonth","monthYear","i","current","dayCount","handleYearHover","handleMonthHover","isYearInRange","startYear","endYear","min","max","selectedYear","minYear","maxYear","isMonthInRange","startMonthYear","endMonthYear","hoveredMonthYear","selectedMonthYear","minMonthYear","maxMonthYear","valueType","handleShortcutsResize","entry","box","_a"],"mappings":"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"}