hongluan-ui
Version:
Hongluan Component Library for Vue 3
1 lines • 8.21 kB
Source Map (JSON)
{"version":3,"file":"panel-time-pick.mjs","sources":["../../../../../../../packages/components/time-picker/src/time-picker-com/panel-time-pick.vue"],"sourcesContent":["<template>\n <transition :name=\"transitionName\">\n <div v-if=\"actualVisible || visible\" :class=\"[namespace]\">\n <div class=\"picker-body\">\n <div class=\"picker-content\" :class=\"{ 'has-seconds': showSeconds }\">\n <time-spinner\n ref=\"spinner\"\n :role=\"datetimeRole || 'start'\"\n :arrow-control=\"arrowControl\"\n :show-seconds=\"showSeconds\"\n :am-pm-mode=\"amPmMode\"\n :spinner-date=\"parsedValue\"\n :disabled-hours=\"disabledHours\"\n :disabled-minutes=\"disabledMinutes\"\n :disabled-seconds=\"disabledSeconds\"\n @change=\"handleChange\"\n @set-option=\"onSetOption\"\n @select-range=\"setSelectionRange\"\n />\n </div>\n </div>\n <div class=\"picker-footer\">\n <hl-button\n class=\"cancel\"\n @click=\"handleCancel\"\n >\n {{ t('hl.datepicker.cancel') }}\n </hl-button>\n <hl-button\n type=\"primary\"\n class=\"confirm\"\n @click=\"handleConfirm()\"\n >\n {{ t('hl.datepicker.confirm') }}\n </hl-button>\n </div>\n </div>\n </transition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, inject, ref } from 'vue'\nimport dayjs from 'dayjs'\nimport { EVENT_CODE } from '@hongluan-ui/constants'\nimport { useLocale, useNamespace } from '@hongluan-ui/hooks'\nimport { isUndefined } from '@hongluan-ui/utils'\nimport HlButton from '@hongluan-ui/components/button'\nimport { panelTimePickerProps } from '../props/panel-time-picker'\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(panelTimePickerProps)\nconst emit = defineEmits(['pick', 'select-range', 'set-picker-option'])\n\n// Injections\nconst pickerBase = inject('EP_PICKER_BASE') as any\nconst {\n arrowControl,\n disabledHours,\n disabledMinutes,\n disabledSeconds,\n defaultValue,\n} = pickerBase.props\nconst { getAvailableHours, getAvailableMinutes, getAvailableSeconds } =\n buildAvailableTimeSlotGetter(disabledHours, disabledMinutes, disabledSeconds)\n\nconst { namespace } = useNamespace('time-picker')\nconst { t, lang } = useLocale()\n// data\nconst selectionRange = ref([0, 2])\nconst oldValue = useOldValue(props)\n// computed\nconst transitionName = computed(() => {\n return isUndefined(props.actualVisible)\n ? `dropdown`\n : ''\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// method\nconst isValidValue = (_date: Dayjs) => {\n const parsedDate = dayjs(_date).locale(lang.value)\n const result = getRangeAvailableTime(parsedDate)\n return parsedDate.isSame(result)\n}\nconst handleCancel = () => {\n emit('pick', oldValue.value, false)\n}\nconst handleConfirm = (visible = false, first = false) => {\n if (first) return\n emit('pick', props.parsedValue, visible)\n}\nconst handleChange = (_date: Dayjs) => {\n // visible avoids edge cases, when use scrolls during panel closing animation\n if (!props.visible) {\n return\n }\n const result = getRangeAvailableTime(_date).millisecond(0)\n emit('pick', result, true)\n}\n\nconst setSelectionRange = (start: number, end: number) => {\n emit('select-range', start, end)\n selectionRange.value = [start, end]\n}\n\nconst changeSelectionRange = (step: number) => {\n const list = [0, 3].concat(showSeconds.value ? [6] : [])\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 timePickerOptions['start_emitSelectRange'](mapping[next])\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 timePickerOptions['start_scrollDown'](step)\n event.preventDefault()\n return\n }\n}\n\nconst { timePickerOptions, onSetOption, getAvailableTime } = useTimePanel({\n getAvailableHours,\n getAvailableMinutes,\n getAvailableSeconds,\n})\n\nconst getRangeAvailableTime = (date: Dayjs) => {\n return getAvailableTime(date, props.datetimeRole || '', true)\n}\n\nconst parseUserInput = (value: Dayjs) => {\n if (!value) return null\n return dayjs(value, props.format).locale(lang.value)\n}\n\nconst formatToString = (value: Dayjs) => {\n if (!value) return null\n return value.format(props.format)\n}\n\nconst getDefaultValue = () => {\n return dayjs(defaultValue).locale(lang.value)\n}\n\nemit('set-picker-option', ['isValidValue', isValidValue])\nemit('set-picker-option', ['formatToString', formatToString])\nemit('set-picker-option', ['parseUserInput', parseUserInput])\nemit('set-picker-option', ['handleKeydownInput', handleKeydown])\nemit('set-picker-option', ['getRangeAvailableTime', getRangeAvailableTime])\nemit('set-picker-option', ['getDefaultValue', getDefaultValue])\n</script>\n"],"names":[],"mappings":"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"}