hongluan-ui
Version:
Hongluan Component Library for Vue 3
1 lines • 32.7 kB
Source Map (JSON)
{"version":3,"file":"panel-date-range.mjs","sources":["../../../../../../../packages/components/date-picker/src/date-picker-com/panel-date-range.vue"],"sourcesContent":["<template>\n <div\n class=\"range-picker\"\n :class=\"[{\n 'has-sidebar': $slots.sidebar || hasShortcuts,\n 'has-time': showTime\n }, namespace + '-date-picker']\"\n >\n <div class=\"picker-wrapper\">\n <slot name=\"sidebar\" :class=\"['picker-sidebar', namespace + '-group', 'vertical']\"></slot>\n <hl-group v-if=\"hasShortcuts\" :class=\"['picker-sidebar']\" dir=\"vertical\">\n <hl-group v-for=\"(shortcut, key) in shortcuts\" :key=\"key\" class=\"p-x-sm p-y-xxs hover:text-hover cursor-pointer\" @click=\"handleShortcutClick(shortcut)\">\n {{ shortcut.text }}\n </hl-group>\n </hl-group>\n <div class=\"picker-body\">\n <div v-if=\"showTime\" class=\"picker-body-header-wrapper\">\n <hl-group class=\"picker-time-header\" deep-merge indent full>\n <hl-input\n size=\"sm\"\n :disabled=\"rangeState.selecting\"\n :placeholder=\"t('hl.datepicker.startDate')\"\n :validate-event=\"false\"\n :model-value=\"minVisibleDate\"\n @input=\"val => handleDateInput(val, 'min')\"\n @change=\"val => handleDateChange(val, 'min')\"\n >\n <template #prefix>\n <hl-icon>\n <system-calendar />\n </hl-icon>\n </template>\n </hl-input>\n <div\n v-clickoutside=\"handleMinTimeClose\"\n >\n <hl-input\n size=\"sm\"\n :disabled=\"rangeState.selecting\"\n :placeholder=\"t('hl.datepicker.startTime')\"\n :model-value=\"minVisibleTime\"\n :validate-event=\"false\"\n @focus=\"minTimePickerVisible = true\"\n @input=\"val => handleTimeInput(val, 'min')\"\n @change=\"val => handleTimeChange(val, 'min')\"\n >\n <template #prefix>\n <hl-icon>\n <system-clock />\n </hl-icon>\n </template>\n </hl-input>\n <time-pick-panel\n :visible=\"minTimePickerVisible\"\n :format=\"timeFormat\"\n datetime-role=\"start\"\n :parsed-value=\"leftDate\"\n @pick=\"handleMinTimePick\"\n />\n </div>\n </hl-group>\n <hl-button\n size=\"sm\"\n class=\"range-separator\"\n />\n <hl-group class=\"picker-time-header is-right\" deep-merge indent full>\n <hl-input\n size=\"sm\"\n :disabled=\"rangeState.selecting\"\n :placeholder=\"t('hl.datepicker.endDate')\"\n :model-value=\"maxVisibleDate\"\n :readonly=\"!minDate\"\n :validate-event=\"false\"\n @input=\"val => handleDateInput(val, 'max')\"\n @change=\"val => handleDateChange(val, 'max')\"\n >\n <template #prefix>\n <hl-icon>\n <system-calendar />\n </hl-icon>\n </template>\n </hl-input>\n <div\n v-clickoutside=\"handleMaxTimeClose\"\n >\n <hl-input\n size=\"sm\"\n :disabled=\"rangeState.selecting\"\n :placeholder=\"t('hl.datepicker.endTime')\"\n :model-value=\"maxVisibleTime\"\n :readonly=\"!minDate\"\n :validate-event=\"false\"\n @focus=\"minDate && (maxTimePickerVisible = true)\"\n @input=\"val => handleTimeInput(val, 'max')\"\n @change=\"val => handleTimeChange(val, 'max')\"\n >\n <template #prefix>\n <hl-icon>\n <system-clock />\n </hl-icon>\n </template>\n </hl-input>\n <time-pick-panel\n datetime-role=\"end\"\n :visible=\"maxTimePickerVisible\"\n :format=\"timeFormat\"\n :parsed-value=\"rightDate\"\n @pick=\"handleMaxTimePick\"\n />\n </div>\n </hl-group>\n </div>\n <div class=\"picker-body-content is-left\">\n <hl-group class=\"picker-body-header\" full>\n <div class=\"static\">\n <hl-button\n type=\"link\"\n size=\"sm\"\n class=\"prev-year\"\n :aria-label=\"t(`hl.datepicker.prevYear`)\"\n equal\n @click=\"leftPrevYear\"\n >\n <slot name=\"prev-year\">\n <hl-icon>\n <system-double-arrow-left />\n </hl-icon>\n </slot>\n </hl-button>\n <hl-button\n type=\"link\"\n size=\"sm\"\n class=\"prev-month\"\n :aria-label=\"t(`hl.datepicker.prevMonth`)\"\n equal\n @click=\"leftPrevMonth\"\n >\n <slot name=\"prev-month\">\n <hl-icon>\n <system-arrow-left />\n </hl-icon>\n </slot>\n </hl-button>\n </div>\n <div class=\"header-label\">\n <hl-button type=\"link\">\n {{ leftLabel }}\n </hl-button>\n </div>\n <div class=\"static\">\n <hl-button\n v-if=\"unlinkPanels\"\n type=\"link\"\n size=\"sm\"\n :disabled=\"!enableMonthArrow\"\n :class=\"{ 'is-disabled': !enableMonthArrow }\"\n class=\"group-item next-month\"\n :aria-label=\"t(`hl.datepicker.nextMonth`)\"\n equal\n @click=\"leftNextMonth\"\n >\n <slot name=\"next-month\">\n <hl-icon>\n <system-arrow-right />\n </hl-icon>\n </slot>\n </hl-button>\n <hl-button\n v-if=\"unlinkPanels\"\n type=\"link\"\n size=\"sm\"\n :disabled=\"!enableYearArrow\"\n :class=\"{ 'is-disabled': !enableYearArrow }\"\n class=\"group-item next-year\"\n :aria-label=\"t(`hl.datepicker.nextYear`)\"\n equal\n @click=\"leftNextYear\"\n >\n <slot name=\"next-year\">\n <hl-icon>\n <system-double-arrow-right />\n </hl-icon>\n </slot>\n </hl-button>\n </div>\n </hl-group>\n <date-table\n selection-mode=\"range\"\n :date=\"leftDate\"\n :min-date=\"minDate\"\n :max-date=\"maxDate\"\n :range-state=\"rangeState\"\n :disabled-date=\"disabledDate\"\n :cell-class-name=\"cellClassName\"\n @changerange=\"handleChangeRange\"\n @pick=\"handleRangePick\"\n @select=\"onSelect\"\n />\n </div>\n <div class=\"picker-body-content is-right\">\n <hl-group class=\"picker-body-header\" full>\n <div class=\"static\">\n <hl-button\n v-if=\"unlinkPanels\"\n size=\"sm\"\n :disabled=\"!enableYearArrow\"\n :class=\"{ 'is-disabled': !enableYearArrow }\"\n class=\"prev-year\"\n :aria-label=\"t(`hl.datepicker.prevYear`)\"\n equal\n @click=\"rightPrevYear\"\n >\n <slot name=\"prev-year\">\n <hl-icon>\n <system-double-arrow-left />\n </hl-icon>\n </slot>\n </hl-button>\n <hl-button\n v-if=\"unlinkPanels\"\n size=\"sm\"\n :disabled=\"!enableMonthArrow\"\n :class=\"{ 'is-disabled': !enableMonthArrow }\"\n class=\"prev-month\"\n :aria-label=\"t(`hl.datepicker.prevMonth`)\"\n equal\n @click=\"rightPrevMonth\"\n >\n <slot name=\"prev-month\">\n <hl-icon>\n <system-arrow-left />\n </hl-icon>\n </slot>\n </hl-button>\n </div>\n <div class=\"header-label\">\n <hl-button>\n {{ rightLabel }}\n </hl-button>\n </div>\n <div class=\"static\">\n <hl-button\n size=\"sm\"\n class=\"next-month\"\n :aria-label=\"t(`hl.datepicker.nextMonth`)\"\n equal\n @click=\"rightNextMonth\"\n >\n <slot name=\"next-month\">\n <hl-icon>\n <system-arrow-right />\n </hl-icon>\n </slot>\n </hl-button>\n <hl-button\n size=\"sm\"\n class=\"next-year\"\n :aria-label=\"t(`hl.datepicker.nextYear`)\"\n equal\n @click=\"rightNextYear\"\n >\n <slot name=\"next-year\">\n <hl-icon>\n <system-double-arrow-right />\n </hl-icon>\n </slot>\n </hl-button>\n </div>\n </hl-group>\n <date-table\n selection-mode=\"range\"\n :date=\"rightDate\"\n :min-date=\"minDate\"\n :max-date=\"maxDate\"\n :range-state=\"rangeState\"\n :disabled-date=\"disabledDate\"\n :cell-class-name=\"cellClassName\"\n @changerange=\"handleChangeRange\"\n @pick=\"handleRangePick\"\n @select=\"onSelect\"\n />\n </div>\n </div>\n </div>\n <div v-if=\"showTime\" class=\"picker-footer\">\n <hl-button\n v-if=\"clearable\"\n class=\"\"\n @click=\"handleClear\"\n >\n {{ t('hl.datepicker.clear') }}\n </hl-button>\n <hl-button\n type=\"primary\"\n class=\"\"\n :disabled=\"btnDisabled\"\n @click=\"handleRangeConfirm(false)\"\n >\n {{ t('hl.datepicker.confirm') }}\n </hl-button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, inject, ref, toRef, unref, watch } from 'vue'\nimport dayjs from 'dayjs'\nimport { ClickOutside as vClickoutside } from '@hongluan-ui/directives'\nimport { isArray } from '@hongluan-ui/utils'\nimport { useLocale, useNamespace } from '@hongluan-ui/hooks'\nimport HlInput from '@hongluan-ui/components/input'\nimport HlButton from '@hongluan-ui/components/button'\nimport HlGroup from '@hongluan-ui/components/group'\nimport HlIcon from '@hongluan-ui/components/icon'\nimport { SystemClock, SystemCalendar, SystemArrowLeft, SystemArrowRight, SystemDoubleArrowLeft, SystemDoubleArrowRight } from '@hongluan-ui/components/system-icon'\nimport {\n TimePickPanel,\n extractDateFormat,\n extractTimeFormat,\n} from '@hongluan-ui/components/time-picker'\nimport { panelDateRangeProps } from '../props/panel-date-range'\nimport { useRangePicker } from '../composables/use-range-picker'\nimport { getDefaultValue, isValidRange } from '../utils'\nimport DateTable from './basic-date-table.vue'\n\nimport type { Dayjs } from 'dayjs'\n\ntype ChangeType = 'min' | 'max'\ntype UserInput = {\n min: string | null\n max: string | null\n}\n\nconst props = defineProps(panelDateRangeProps)\nconst emit = defineEmits([\n 'pick',\n 'set-picker-option',\n 'calendar-change',\n 'panel-change',\n])\n\nconst unit = 'month'\n// FIXME: fix the type for ep picker\nconst pickerBase = inject('EP_PICKER_BASE') as any\nconst { disabledDate, cellClassName, defaultTime, clearable } = pickerBase.props\nconst format = toRef(pickerBase.props, 'format')\nconst shortcuts = toRef(pickerBase.props, 'shortcuts')\nconst defaultValue = toRef(pickerBase.props, 'defaultValue')\nconst { lang } = useLocale()\nconst leftDate = ref<Dayjs>(dayjs().locale(lang.value))\nconst rightDate = ref<Dayjs>(dayjs().locale(lang.value).add(1, unit))\n\nconst { namespace } = useNamespace()\nconst {\n minDate,\n maxDate,\n rangeState,\n\n handleChangeRange,\n handleRangeConfirm,\n handleShortcutClick,\n onSelect,\n onReset,\n t,\n} = useRangePicker(props, {\n defaultValue,\n leftDate,\n rightDate,\n unit,\n onParsedValueChanged,\n})\n\nwatch(\n () => props.visible,\n visible => {\n if (!visible && rangeState.value.selecting) {\n onReset(props.parsedValue)\n onSelect(false)\n }\n },\n)\n\nconst dateUserInput = ref<UserInput>({\n min: null,\n max: null,\n})\n\nconst timeUserInput = ref<UserInput>({\n min: null,\n max: null,\n})\n\nconst leftLabel = computed(() => {\n return `${leftDate.value.year()} ${t('hl.datepicker.year')} ${t(\n `hl.datepicker.month${leftDate.value.month() + 1}`,\n )}`\n})\n\nconst rightLabel = computed(() => {\n return `${rightDate.value.year()} ${t('hl.datepicker.year')} ${t(\n `hl.datepicker.month${rightDate.value.month() + 1}`,\n )}`\n})\n\nconst leftYear = computed(() => {\n return leftDate.value.year()\n})\n\nconst leftMonth = computed(() => {\n return leftDate.value.month()\n})\n\nconst rightYear = computed(() => {\n return rightDate.value.year()\n})\n\nconst rightMonth = computed(() => {\n return rightDate.value.month()\n})\n\nconst hasShortcuts = computed(() => !!shortcuts.value.length)\n\nconst minVisibleDate = computed(() => {\n if (dateUserInput.value.min !== null) return dateUserInput.value.min\n if (minDate.value) return minDate.value.format(dateFormat.value)\n return ''\n})\n\nconst maxVisibleDate = computed(() => {\n if (dateUserInput.value.max !== null) return dateUserInput.value.max\n if (maxDate.value || minDate.value)\n return (maxDate.value || minDate.value)!.format(dateFormat.value)\n return ''\n})\n\nconst minVisibleTime = computed(() => {\n if (timeUserInput.value.min !== null) return timeUserInput.value.min\n if (minDate.value) return minDate.value.format(timeFormat.value)\n return ''\n})\n\nconst maxVisibleTime = computed(() => {\n if (timeUserInput.value.max !== null) return timeUserInput.value.max\n if (maxDate.value || minDate.value)\n return (maxDate.value || minDate.value)!.format(timeFormat.value)\n return ''\n})\n\nconst timeFormat = computed(() => {\n return props.timeFormat || extractTimeFormat(format.value)\n})\n\nconst dateFormat = computed(() => {\n return props.dateFormat || extractDateFormat(format.value)\n})\n\nconst isValidValue = (date: [Dayjs, Dayjs]) => {\n return (\n isValidRange(date) &&\n (disabledDate\n ? !disabledDate(date[0].toDate()) && !disabledDate(date[1].toDate())\n : true)\n )\n}\n\nconst leftPrevYear = () => {\n leftDate.value = leftDate.value.subtract(1, 'year')\n if (!props.unlinkPanels) {\n rightDate.value = leftDate.value.add(1, 'month')\n }\n handlePanelChange('year')\n}\n\nconst leftPrevMonth = () => {\n leftDate.value = leftDate.value.subtract(1, 'month')\n if (!props.unlinkPanels) {\n rightDate.value = leftDate.value.add(1, 'month')\n }\n handlePanelChange('month')\n}\n\nconst rightNextYear = () => {\n if (!props.unlinkPanels) {\n leftDate.value = leftDate.value.add(1, 'year')\n rightDate.value = leftDate.value.add(1, 'month')\n } else {\n rightDate.value = rightDate.value.add(1, 'year')\n }\n handlePanelChange('year')\n}\n\nconst rightNextMonth = () => {\n if (!props.unlinkPanels) {\n leftDate.value = leftDate.value.add(1, 'month')\n rightDate.value = leftDate.value.add(1, 'month')\n } else {\n rightDate.value = rightDate.value.add(1, 'month')\n }\n handlePanelChange('month')\n}\n\nconst leftNextYear = () => {\n leftDate.value = leftDate.value.add(1, 'year')\n handlePanelChange('year')\n}\n\nconst leftNextMonth = () => {\n leftDate.value = leftDate.value.add(1, 'month')\n handlePanelChange('month')\n}\n\nconst rightPrevYear = () => {\n rightDate.value = rightDate.value.subtract(1, 'year')\n handlePanelChange('year')\n}\n\nconst rightPrevMonth = () => {\n rightDate.value = rightDate.value.subtract(1, 'month')\n handlePanelChange('month')\n}\n\nconst handlePanelChange = (mode: 'month' | 'year') => {\n emit(\n 'panel-change',\n [leftDate.value.toDate(), rightDate.value.toDate()],\n mode,\n )\n}\n\nconst enableMonthArrow = computed(() => {\n const nextMonth = (leftMonth.value + 1) % 12\n const yearOffset = leftMonth.value + 1 >= 12 ? 1 : 0\n return (\n props.unlinkPanels &&\n new Date(leftYear.value + yearOffset, nextMonth) <\n new Date(rightYear.value, rightMonth.value)\n )\n})\n\nconst enableYearArrow = computed(() => {\n return (\n props.unlinkPanels &&\n rightYear.value * 12 +\n rightMonth.value -\n (leftYear.value * 12 + leftMonth.value + 1) >=\n 12\n )\n})\n\nconst btnDisabled = computed(() => {\n return !(\n minDate.value &&\n maxDate.value &&\n !rangeState.value.selecting &&\n isValidRange([minDate.value, maxDate.value])\n )\n})\n\nconst showTime = computed(\n () => props.type === 'datetime' || props.type === 'datetimerange',\n)\n\nconst formatEmit = (emitDayjs: Dayjs | null, index?: number) => {\n if (!emitDayjs) return\n if (defaultTime) {\n const defaultTimeD = dayjs(\n defaultTime[index as number] || defaultTime,\n ).locale(lang.value)\n return defaultTimeD\n .year(emitDayjs.year())\n .month(emitDayjs.month())\n .date(emitDayjs.date())\n }\n return emitDayjs\n}\n\nconst handleRangePick = (\n val: {\n minDate: Dayjs\n maxDate: Dayjs | null\n },\n close = true,\n) => {\n const min_ = val.minDate\n const max_ = val.maxDate\n const minDate_ = formatEmit(min_, 0)\n const maxDate_ = formatEmit(max_, 1)\n\n if (maxDate.value === maxDate_ && minDate.value === minDate_) {\n return\n }\n emit('calendar-change', [min_.toDate(), max_ && max_.toDate()])\n maxDate.value = maxDate_\n minDate.value = minDate_\n\n if (!close || showTime.value) return\n handleRangeConfirm()\n}\n\nconst minTimePickerVisible = ref(false)\nconst maxTimePickerVisible = ref(false)\n\nconst handleMinTimeClose = () => {\n minTimePickerVisible.value = false\n}\n\nconst handleMaxTimeClose = () => {\n maxTimePickerVisible.value = false\n}\n\nconst handleDateInput = (value: string | null, type: ChangeType) => {\n dateUserInput.value[type] = value\n const parsedValueD = dayjs(value, dateFormat.value).locale(lang.value)\n\n if (parsedValueD.isValid()) {\n if (disabledDate && disabledDate(parsedValueD.toDate())) {\n return\n }\n if (type === 'min') {\n leftDate.value = parsedValueD\n minDate.value = (minDate.value || leftDate.value)\n .year(parsedValueD.year())\n .month(parsedValueD.month())\n .date(parsedValueD.date())\n if (\n !props.unlinkPanels &&\n (!maxDate.value || maxDate.value.isBefore(minDate.value))\n ) {\n rightDate.value = parsedValueD.add(1, 'month')\n maxDate.value = minDate.value.add(1, 'month')\n }\n } else {\n rightDate.value = parsedValueD\n maxDate.value = (maxDate.value || rightDate.value)\n .year(parsedValueD.year())\n .month(parsedValueD.month())\n .date(parsedValueD.date())\n if (\n !props.unlinkPanels &&\n (!minDate.value || minDate.value.isAfter(maxDate.value))\n ) {\n leftDate.value = parsedValueD.subtract(1, 'month')\n minDate.value = maxDate.value.subtract(1, 'month')\n }\n }\n }\n}\n\nconst handleDateChange = (_: unknown, type: ChangeType) => {\n dateUserInput.value[type] = null\n}\n\nconst handleTimeInput = (value: string | null, type: ChangeType) => {\n timeUserInput.value[type] = value\n const parsedValueD = dayjs(value, timeFormat.value).locale(lang.value)\n\n if (parsedValueD.isValid()) {\n if (type === 'min') {\n minTimePickerVisible.value = true\n minDate.value = (minDate.value || leftDate.value)\n .hour(parsedValueD.hour())\n .minute(parsedValueD.minute())\n .second(parsedValueD.second())\n } else {\n maxTimePickerVisible.value = true\n maxDate.value = (maxDate.value || rightDate.value)\n .hour(parsedValueD.hour())\n .minute(parsedValueD.minute())\n .second(parsedValueD.second())\n rightDate.value = maxDate.value\n }\n }\n}\n\nconst handleTimeChange = (value: string | null, type: ChangeType) => {\n timeUserInput.value[type] = null\n if (type === 'min') {\n leftDate.value = minDate.value!\n minTimePickerVisible.value = false\n if (!maxDate.value || maxDate.value.isBefore(minDate.value)) {\n maxDate.value = minDate.value\n }\n } else {\n rightDate.value = maxDate.value!\n maxTimePickerVisible.value = false\n if (maxDate.value && maxDate.value.isBefore(minDate.value)) {\n minDate.value = maxDate.value\n }\n }\n}\n\nconst handleMinTimePick = (value: Dayjs, visible: boolean, first: boolean) => {\n if (timeUserInput.value.min) return\n if (value) {\n leftDate.value = value\n minDate.value = (minDate.value || leftDate.value)\n .hour(value.hour())\n .minute(value.minute())\n .second(value.second())\n }\n\n if (!first) {\n minTimePickerVisible.value = visible\n }\n\n if (!maxDate.value || maxDate.value.isBefore(minDate.value)) {\n maxDate.value = minDate.value\n rightDate.value = value\n }\n}\n\nconst handleMaxTimePick = (\n value: Dayjs | null,\n visible: boolean,\n first: boolean,\n) => {\n if (timeUserInput.value.max) return\n if (value) {\n rightDate.value = value\n maxDate.value = (maxDate.value || rightDate.value)\n .hour(value.hour())\n .minute(value.minute())\n .second(value.second())\n }\n\n if (!first) {\n maxTimePickerVisible.value = visible\n }\n\n if (maxDate.value && maxDate.value.isBefore(minDate.value)) {\n minDate.value = maxDate.value\n }\n}\n\nconst handleClear = () => {\n leftDate.value = getDefaultValue(unref(defaultValue), {\n lang: unref(lang),\n unit: 'month',\n unlinkPanels: props.unlinkPanels,\n })[0]\n rightDate.value = leftDate.value.add(1, 'month')\n maxDate.value = undefined\n minDate.value = undefined\n emit('pick', null)\n}\n\nconst formatToString = (value: Dayjs | Dayjs[]) => {\n return isArray(value)\n ? value.map(_ => _.format(format.value))\n : value.format(format.value)\n}\n\nconst parseUserInput = (value: Dayjs | Dayjs[]) => {\n return isArray(value)\n ? value.map(_ => dayjs(_, format.value).locale(lang.value))\n : dayjs(value, format.value).locale(lang.value)\n}\n\nfunction onParsedValueChanged(\n minDate: Dayjs | undefined,\n maxDate: Dayjs | undefined,\n) {\n if (props.unlinkPanels && maxDate) {\n const minDateYear = minDate?.year() || 0\n const minDateMonth = minDate?.month() || 0\n const maxDateYear = maxDate.year()\n const maxDateMonth = maxDate.month()\n rightDate.value =\n minDateYear === maxDateYear && minDateMonth === maxDateMonth\n ? maxDate.add(1, unit)\n : maxDate\n } else {\n rightDate.value = leftDate.value.add(1, unit)\n if (maxDate) {\n rightDate.value = rightDate.value\n .hour(maxDate.hour())\n .minute(maxDate.minute())\n .second(maxDate.second())\n }\n }\n}\n\nemit('set-picker-option', ['isValidValue', isValidValue])\nemit('set-picker-option', ['parseUserInput', parseUserInput])\nemit('set-picker-option', ['formatToString', formatToString])\nemit('set-picker-option', ['handleClear', handleClear])\n</script>\n"],"names":[],"mappings":"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"}