hongluan-ui
Version:
Hongluan Component Library for Vue 3
1 lines • 14.3 kB
Source Map (JSON)
{"version":3,"file":"panel-time-range.mjs","sources":["../../../../../../../packages/components/time-picker/src/time-picker-com/panel-time-range.vue"],"sourcesContent":["<template>\n <div v-if=\"actualVisible\" :class=\"[namespace, 'range-picker']\">\n <div class=\"picker-body\">\n <div class=\"picker-cell is-left\">\n <div class=\"picker-header\">{{ t('hl.datepicker.startTime') }}</div>\n <div\n class=\"picker-content\"\n :class=\"{ 'has-seconds': showSeconds, 'is-arrow': arrowControl }\"\n >\n <time-spinner\n ref=\"minSpinner\"\n role=\"start\"\n :show-seconds=\"showSeconds\"\n :am-pm-mode=\"amPmMode\"\n :arrow-control=\"arrowControl\"\n :spinner-date=\"startTime\"\n :disabled-hours=\"disabledHours_\"\n :disabled-minutes=\"disabledMinutes_\"\n :disabled-seconds=\"disabledSeconds_\"\n @change=\"handleMinChange\"\n @set-option=\"onSetOption\"\n @select-range=\"setMinSelectionRange\"\n />\n </div>\n </div>\n <div class=\"picker-cell is-right\">\n <div class=\"picker-header\">{{ t('hl.datepicker.endTime') }}</div>\n <div\n class=\"picker-content\"\n :class=\"{ 'has-seconds': showSeconds, 'is-arrow': arrowControl }\"\n >\n <time-spinner\n ref=\"maxSpinner\"\n role=\"end\"\n :show-seconds=\"showSeconds\"\n :am-pm-mode=\"amPmMode\"\n :arrow-control=\"arrowControl\"\n :spinner-date=\"endTime\"\n :disabled-hours=\"disabledHours_\"\n :disabled-minutes=\"disabledMinutes_\"\n :disabled-seconds=\"disabledSeconds_\"\n @change=\"handleMaxChange\"\n @set-option=\"onSetOption\"\n @select-range=\"setMaxSelectionRange\"\n />\n </div>\n </div>\n </div>\n <div class=\"picker-footer\">\n <hl-button\n @click=\"handleCancel()\"\n >\n {{ t('hl.datepicker.cancel') }}\n </hl-button>\n <hl-button\n type=\"primary\"\n :disabled=\"btnConfirmDisabled\"\n @click=\"handleConfirm()\"\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, unref } from 'vue'\nimport dayjs from 'dayjs'\nimport { union } from 'lodash-unified'\nimport { useLocale, useNamespace } from '@hongluan-ui/hooks'\nimport { isArray } from '@hongluan-ui/utils'\nimport { EVENT_CODE } from '@hongluan-ui/constants'\nimport HlButton from '@hongluan-ui/components/button'\nimport { panelTimeRangeProps } from '../props/panel-time-range'\nimport { useTimePanel } from '../composables/use-time-panel'\nimport TimeSpinner from './basic-time-spinner.vue'\nimport {\n buildAvailableTimeSlotGetter,\n useOldValue,\n} from '../composables/use-time-picker'\n\nimport type { Dayjs } from 'dayjs'\n\nconst props = defineProps(panelTimeRangeProps)\nconst emit = defineEmits(['pick', 'select-range', 'set-picker-option'])\n\nconst makeSelectRange = (start: number, end: number) => {\n const result: number[] = []\n for (let i = start; i <= end; i++) {\n result.push(i)\n }\n return result\n}\n\nconst { namespace } = useNamespace('time-picker')\nconst { t, lang } = useLocale()\n\nconst pickerBase = inject('EP_PICKER_BASE') as any\nconst {\n arrowControl,\n disabledHours,\n disabledMinutes,\n disabledSeconds,\n defaultValue,\n} = pickerBase.props\n\nconst startTime = computed(() => props.parsedValue![0])\nconst endTime = computed(() => props.parsedValue![1])\nconst oldValue = useOldValue(props)\nconst handleCancel = () => {\n emit('pick', oldValue.value, false)\n}\nconst showSeconds = computed(() => {\n return props.format.includes('ss')\n})\nconst amPmMode = computed(() => {\n if (props.format.includes('A')) return 'A'\n if (props.format.includes('a')) return 'a'\n return ''\n})\n\nconst handleConfirm = (visible = false) => {\n emit('pick', [startTime.value, endTime.value], visible)\n}\n\nconst handleMinChange = (date: Dayjs) => {\n handleChange(date.millisecond(0), endTime.value)\n}\nconst handleMaxChange = (date: Dayjs) => {\n handleChange(startTime.value, date.millisecond(0))\n}\n\nconst isValidValue = (_date: Dayjs[]) => {\n const parsedDate = _date.map(_ => dayjs(_).locale(lang.value))\n const result = getRangeAvailableTime(parsedDate)\n return parsedDate[0].isSame(result[0]) && parsedDate[1].isSame(result[1])\n}\n\nconst handleChange = (start: Dayjs, end: Dayjs) => {\n // todo getRangeAvailableTime(_date).millisecond(0)\n emit('pick', [start, end], true)\n}\nconst btnConfirmDisabled = computed(() => {\n return startTime.value > endTime.value\n})\n\nconst selectionRange = ref([0, 2])\nconst setMinSelectionRange = (start: number, end: number) => {\n emit('select-range', start, end, 'min')\n selectionRange.value = [start, end]\n}\n\nconst offset = computed(() => (showSeconds.value ? 11 : 8))\nconst setMaxSelectionRange = (start: number, end: number) => {\n emit('select-range', start, end, 'max')\n const _offset = unref(offset)\n selectionRange.value = [start + _offset, end + _offset]\n}\n\nconst changeSelectionRange = (step: number) => {\n const list = showSeconds.value ? [0, 3, 6, 11, 14, 17] : [0, 3, 8, 11]\n const mapping = ['hours', 'minutes'].concat(\n showSeconds.value ? ['seconds'] : [],\n )\n const index = list.indexOf(selectionRange.value[0])\n const next = (index + step + list.length) % list.length\n const half = list.length / 2\n if (next < half) {\n timePickerOptions['start_emitSelectRange'](mapping[next])\n } else {\n timePickerOptions['end_emitSelectRange'](mapping[next - half])\n }\n}\n\nconst handleKeydown = (event: KeyboardEvent) => {\n const code = event.code\n\n const { left, right, up, down } = EVENT_CODE\n\n if ([left, right].includes(code)) {\n const step = code === left ? -1 : 1\n changeSelectionRange(step)\n event.preventDefault()\n return\n }\n\n if ([up, down].includes(code)) {\n const step = code === up ? -1 : 1\n const role = selectionRange.value[0] < offset.value ? 'start' : 'end'\n timePickerOptions[`${role}_scrollDown`](step)\n event.preventDefault()\n return\n }\n}\n\nconst disabledHours_ = (role: string, compare?: Dayjs) => {\n const defaultDisable = disabledHours ? disabledHours(role) : []\n const isStart = role === 'start'\n const compareDate = compare || (isStart ? endTime.value : startTime.value)\n const compareHour = compareDate.hour()\n const nextDisable = isStart\n ? makeSelectRange(compareHour + 1, 23)\n : makeSelectRange(0, compareHour - 1)\n return union(defaultDisable, nextDisable)\n}\nconst disabledMinutes_ = (hour: number, role: string, compare?: Dayjs) => {\n const defaultDisable = disabledMinutes ? disabledMinutes(hour, role) : []\n const isStart = role === 'start'\n const compareDate = compare || (isStart ? endTime.value : startTime.value)\n const compareHour = compareDate.hour()\n if (hour !== compareHour) {\n return defaultDisable\n }\n const compareMinute = compareDate.minute()\n const nextDisable = isStart\n ? makeSelectRange(compareMinute + 1, 59)\n : makeSelectRange(0, compareMinute - 1)\n return union(defaultDisable, nextDisable)\n}\nconst disabledSeconds_ = (\n hour: number,\n minute: number,\n role: string,\n compare?: Dayjs,\n) => {\n const defaultDisable = disabledSeconds\n ? disabledSeconds(hour, minute, role)\n : []\n const isStart = role === 'start'\n const compareDate = compare || (isStart ? endTime.value : startTime.value)\n const compareHour = compareDate.hour()\n const compareMinute = compareDate.minute()\n if (hour !== compareHour || minute !== compareMinute) {\n return defaultDisable\n }\n const compareSecond = compareDate.second()\n const nextDisable = isStart\n ? makeSelectRange(compareSecond + 1, 59)\n : makeSelectRange(0, compareSecond - 1)\n return union(defaultDisable, nextDisable)\n}\n\nconst getRangeAvailableTime = ([start, end]: Array<Dayjs>) => {\n return [\n getAvailableTime(start, 'start', true, end),\n getAvailableTime(end, 'end', false, start),\n ] as const\n}\n\nconst { getAvailableHours, getAvailableMinutes, getAvailableSeconds } =\n buildAvailableTimeSlotGetter(\n disabledHours_,\n disabledMinutes_,\n disabledSeconds_,\n )\n\nconst {\n timePickerOptions,\n\n getAvailableTime,\n onSetOption,\n} = useTimePanel({\n getAvailableHours,\n getAvailableMinutes,\n getAvailableSeconds,\n})\n\nconst parseUserInput = (days: Dayjs[] | Dayjs) => {\n if (!days) return null\n if (isArray(days)) {\n return days.map(d => dayjs(d, props.format).locale(lang.value))\n }\n return dayjs(days, props.format).locale(lang.value)\n}\n\nconst formatToString = (days: Dayjs[] | Dayjs) => {\n if (!days) return null\n if (isArray(days)) {\n return days.map(d => d.format(props.format))\n }\n return days.format(props.format)\n}\n\nconst getDefaultValue = () => {\n if (isArray(defaultValue)) {\n return defaultValue.map((d: Date) => dayjs(d).locale(lang.value))\n }\n const defaultDay = dayjs(defaultValue).locale(lang.value)\n return [defaultDay, defaultDay.add(60, 'm')]\n}\n\nemit('set-picker-option', ['formatToString', formatToString])\nemit('set-picker-option', ['parseUserInput', parseUserInput])\nemit('set-picker-option', ['isValidValue', isValidValue])\nemit('set-picker-option', ['handleKeydownInput', handleKeydown])\nemit('set-picker-option', ['getDefaultValue', getDefaultValue])\nemit('set-picker-option', ['getRangeAvailableTime', getRangeAvailableTime])\n</script>\n"],"names":[],"mappings":"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"}