element-plus
Version:
A Component Library for Vue 3
1 lines • 8.59 kB
Source Map (JSON)
{"version":3,"file":"use-slide.mjs","names":[],"sources":["../../../../../../../packages/components/slider/src/composables/use-slide.ts"],"sourcesContent":["import { computed, nextTick, ref, shallowRef } from 'vue'\nimport {\n CHANGE_EVENT,\n INPUT_EVENT,\n UPDATE_MODEL_EVENT,\n} from '@element-plus/constants'\nimport { useFormDisabled, useFormItem } from '@element-plus/components/form'\n\nimport type { CSSProperties, Ref, SetupContext } from 'vue'\nimport type { Arrayable } from '@element-plus/utils'\nimport type { SliderEmits, SliderInitData, SliderProps } from '../slider'\nimport type { ButtonRefs, SliderButtonInstance } from '../button'\n\nexport const useSlide = (\n props: SliderProps,\n initData: SliderInitData,\n emit: SetupContext<SliderEmits>['emit']\n) => {\n const { formItem: elFormItem } = useFormItem()\n\n const slider = shallowRef<HTMLElement>()\n\n const firstButton = ref<SliderButtonInstance>()\n\n const secondButton = ref<SliderButtonInstance>()\n\n const buttonRefs: ButtonRefs = {\n firstButton,\n secondButton,\n }\n\n const sliderDisabled = useFormDisabled()\n\n const minValue = computed(() => {\n return Math.min(initData.firstValue, initData.secondValue)\n })\n\n const maxValue = computed(() => {\n return Math.max(initData.firstValue, initData.secondValue)\n })\n\n const barSize = computed(() => {\n return props.range\n ? `${\n (100 * (maxValue.value - minValue.value)) / (props.max - props.min)\n }%`\n : `${\n (100 * (initData.firstValue - props.min)) / (props.max - props.min)\n }%`\n })\n\n const barStart = computed(() => {\n return props.range\n ? `${(100 * (minValue.value - props.min)) / (props.max - props.min)}%`\n : '0%'\n })\n\n const runwayStyle = computed<CSSProperties>(() => {\n return props.vertical ? { height: props.height } : {}\n })\n\n const barStyle = computed<CSSProperties>(() => {\n return props.vertical\n ? {\n height: barSize.value,\n bottom: barStart.value,\n }\n : {\n width: barSize.value,\n left: barStart.value,\n }\n })\n\n const resetSize = () => {\n if (slider.value) {\n const rect = slider.value.getBoundingClientRect()\n initData.sliderSize = rect[props.vertical ? 'height' : 'width']\n }\n }\n\n const getButtonRefByPercent = (\n percent: number\n ): Ref<SliderButtonInstance | undefined> => {\n const targetValue = props.min + (percent * (props.max - props.min)) / 100\n if (!props.range) {\n return firstButton\n }\n let buttonRefName: 'firstButton' | 'secondButton'\n if (\n Math.abs(minValue.value - targetValue) <\n Math.abs(maxValue.value - targetValue)\n ) {\n buttonRefName =\n initData.firstValue < initData.secondValue\n ? 'firstButton'\n : 'secondButton'\n } else {\n buttonRefName =\n initData.firstValue > initData.secondValue\n ? 'firstButton'\n : 'secondButton'\n }\n return buttonRefs[buttonRefName]\n }\n\n const setPosition = (\n percent: number\n ): Ref<SliderButtonInstance | undefined> => {\n const buttonRef = getButtonRefByPercent(percent)\n buttonRef.value!.setPosition(percent)\n return buttonRef\n }\n\n const setFirstValue = (firstValue: number | undefined) => {\n initData.firstValue = firstValue ?? props.min\n _emit(\n props.range ? [minValue.value, maxValue.value] : (firstValue ?? props.min)\n )\n }\n\n const setSecondValue = (secondValue: number) => {\n initData.secondValue = secondValue\n\n if (props.range) {\n _emit([minValue.value, maxValue.value])\n }\n }\n\n const _emit = (val: Arrayable<number>) => {\n emit(UPDATE_MODEL_EVENT, val)\n emit(INPUT_EVENT, val)\n }\n\n const emitChange = async () => {\n await nextTick()\n emit(\n CHANGE_EVENT,\n props.range ? [minValue.value, maxValue.value] : props.modelValue\n )\n }\n\n const handleSliderPointerEvent = (\n event: MouseEvent | TouchEvent\n ): Ref<SliderButtonInstance | undefined> | undefined => {\n if (sliderDisabled.value || initData.dragging) return\n resetSize()\n let newPercent = 0\n if (props.vertical) {\n const clientY =\n (event as TouchEvent).touches?.item(0)?.clientY ??\n (event as MouseEvent).clientY\n const sliderOffsetBottom = slider.value!.getBoundingClientRect().bottom\n newPercent = ((sliderOffsetBottom - clientY) / initData.sliderSize) * 100\n } else {\n const clientX =\n (event as TouchEvent).touches?.item(0)?.clientX ??\n (event as MouseEvent).clientX\n const sliderOffsetLeft = slider.value!.getBoundingClientRect().left\n newPercent = ((clientX - sliderOffsetLeft) / initData.sliderSize) * 100\n }\n if (newPercent < 0 || newPercent > 100) return\n return setPosition(newPercent)\n }\n\n const onSliderWrapperPrevent = (event: TouchEvent) => {\n if (\n buttonRefs['firstButton'].value?.dragging ||\n buttonRefs['secondButton'].value?.dragging\n ) {\n event.preventDefault()\n }\n }\n\n const onSliderDown = async (event: MouseEvent | TouchEvent) => {\n const buttonRef = handleSliderPointerEvent(event)\n if (buttonRef) {\n await nextTick()\n buttonRef.value!.onButtonDown(event)\n }\n }\n\n const onSliderClick = (event: MouseEvent | TouchEvent) => {\n const buttonRef = handleSliderPointerEvent(event)\n if (buttonRef) {\n emitChange()\n }\n }\n\n const onSliderMarkerDown = (position: number) => {\n if (sliderDisabled.value || initData.dragging) return\n const buttonRef = setPosition(position)\n if (buttonRef) {\n emitChange()\n }\n }\n\n return {\n elFormItem,\n slider,\n firstButton,\n secondButton,\n sliderDisabled,\n minValue,\n maxValue,\n runwayStyle,\n barStyle,\n resetSize,\n setPosition,\n emitChange,\n onSliderWrapperPrevent,\n onSliderClick,\n onSliderDown,\n onSliderMarkerDown,\n setFirstValue,\n setSecondValue,\n }\n}\n"],"mappings":"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"}