diff --git a/packages/components/date-picker/src/composables/use-range-picker.ts b/packages/components/date-picker/src/composables/use-range-picker.ts index 7b3e82797c..69ca237436 100644 --- a/packages/components/date-picker/src/composables/use-range-picker.ts +++ b/packages/components/date-picker/src/composables/use-range-picker.ts @@ -1,35 +1,15 @@ -import { - getCurrentInstance, - inject, - ref, - unref, - useAttrs, - useSlots, - watch, -} from 'vue' -import dayjs from 'dayjs' -import { isArray, isFunction } from '@element-plus/utils' +import { getCurrentInstance, inject, ref, unref, watch } from 'vue' +import { isArray } from '@element-plus/utils' import { ROOT_PICKER_INJECTION_KEY } from '@element-plus/tokens' import { useLocale, useNamespace } from '@element-plus/hooks' - import { getDefaultValue, isValidRange } from '../utils' +import { useShortcut } from './use-shortcut' -import type { Ref, SetupContext } from 'vue' +import type { Ref } from 'vue' import type { Dayjs } from 'dayjs' -import type { - PanelRangeSharedProps, - RangePickerSharedEmits, - RangeState, -} from '../props/shared' +import type { PanelRangeSharedProps, RangeState } from '../props/shared' import type { DefaultValue } from '../utils' -// FIXME: extract this to `date-picker.ts` -type Shortcut = { - text: string - value: [Date, Date] | (() => [Date, Date]) - onClick?: (ctx: Omit, 'expose'>) => void -} - type UseRangePickerProps = { onParsedValueChanged: ( minDate: Dayjs | undefined, @@ -53,12 +33,11 @@ export const useRangePicker = ( }: UseRangePickerProps ) => { const { emit } = getCurrentInstance()! - const attrs = useAttrs() - const slots = useSlots() const { pickerNs } = inject(ROOT_PICKER_INJECTION_KEY)! const drpNs = useNamespace('date-range-picker') const { t, lang } = useLocale() + const handleShortcutClick = useShortcut(lang) const minDate = ref() const maxDate = ref() const rangeState = ref({ @@ -86,27 +65,6 @@ export const useRangePicker = ( } } - const handleShortcutClick = (shortcut: Shortcut) => { - const shortcutValues = isFunction(shortcut.value) - ? shortcut.value() - : shortcut.value - - if (shortcutValues) { - emit('pick', [ - dayjs(shortcutValues[0]).locale(lang.value), - dayjs(shortcutValues[1]).locale(lang.value), - ]) - return - } - if (shortcut.onClick) { - shortcut.onClick({ - attrs, - slots, - emit, - }) - } - } - const restoreDefault = () => { const [start, end] = getDefaultValue(unref(defaultValue), { lang: unref(lang), diff --git a/packages/components/date-picker/src/composables/use-shortcut.ts b/packages/components/date-picker/src/composables/use-shortcut.ts new file mode 100644 index 0000000000..1ad03de8c3 --- /dev/null +++ b/packages/components/date-picker/src/composables/use-shortcut.ts @@ -0,0 +1,43 @@ +import { getCurrentInstance, useAttrs, useSlots } from 'vue' +import dayjs from 'dayjs' +import { isFunction } from '@element-plus/utils' + +import type { SetupContext } from 'vue' +import type { useLocale } from '@element-plus/hooks' +import type { RangePickerSharedEmits } from '../props/shared' + +// FIXME: extract this to `date-picker.ts` +export type Shortcut = { + text: string + value: [Date, Date] | (() => [Date, Date]) + onClick?: (ctx: Omit, 'expose'>) => void +} + +export const useShortcut = (lang: ReturnType['lang']) => { + const { emit } = getCurrentInstance()! + const attrs = useAttrs() + const slots = useSlots() + + const handleShortcutClick = (shortcut: Shortcut) => { + const shortcutValues = isFunction(shortcut.value) + ? shortcut.value() + : shortcut.value + + if (shortcutValues) { + emit('pick', [ + dayjs(shortcutValues[0]).locale(lang.value), + dayjs(shortcutValues[1]).locale(lang.value), + ]) + return + } + if (shortcut.onClick) { + shortcut.onClick({ + attrs, + slots, + emit, + }) + } + } + + return handleShortcutClick +} diff --git a/packages/components/date-picker/src/date-picker-com/panel-date-pick.vue b/packages/components/date-picker/src/date-picker-com/panel-date-pick.vue index 0def7899f2..177d23936c 100644 --- a/packages/components/date-picker/src/date-picker-com/panel-date-pick.vue +++ b/packages/components/date-picker/src/date-picker-com/panel-date-pick.vue @@ -183,7 +183,16 @@