UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 7.23 kB
{"version":3,"file":"useResize.mjs","names":[],"sources":["../../../../../../../packages/components/splitter/src/hooks/useResize.ts"],"sourcesContent":["import { computed, ref, watch } from 'vue'\nimport { getPct, getPx, isPct, isPx } from './useSize'\nimport { NOOP } from '@element-plus/utils'\n\nimport type { ComputedRef, Ref } from 'vue'\nimport type { PanelItemState } from '../type'\n\nexport function useResize(\n panels: Ref<PanelItemState[]>,\n containerSize: ComputedRef<number>,\n pxSizes: ComputedRef<number[]>,\n lazy: Ref<boolean>\n) {\n const ptg2px = (ptg: number) => ptg * containerSize.value || 0\n\n function getLimitSize(\n str: string | number | undefined,\n defaultLimit: number\n ) {\n if (isPct(str)) {\n return ptg2px(getPct(str))\n } else if (isPx(str)) {\n return getPx(str)\n }\n return str ?? defaultLimit\n }\n\n const lazyOffset = ref(0)\n const movingIndex = ref<{\n index: number\n confirmed: boolean\n } | null>(null)\n\n let cachePxSizes: number[] = []\n let updatePanelSizes = NOOP\n\n const limitSizes = computed(() =>\n panels.value.map((item) => [item.min, item.max])\n )\n\n watch(lazy, () => {\n if (lazyOffset.value) {\n const mouseup = new MouseEvent('mouseup', { bubbles: true })\n window.dispatchEvent(mouseup)\n }\n })\n\n const onMoveStart = (index: number) => {\n lazyOffset.value = 0\n movingIndex.value = { index, confirmed: false }\n cachePxSizes = pxSizes.value\n }\n\n const onMoving = (index: number, offset: number) => {\n let confirmedIndex: number | null = null\n\n // When overlapping, find the nearest draggable index\n if ((!movingIndex.value || !movingIndex.value.confirmed) && offset !== 0) {\n if (offset > 0) {\n confirmedIndex = index\n movingIndex.value = { index, confirmed: true }\n } else {\n for (let i = index; i >= 0; i -= 1) {\n if (cachePxSizes[i]! > 0) {\n confirmedIndex = i\n movingIndex.value = { index: i, confirmed: true }\n break\n }\n }\n }\n }\n const mergedIndex = confirmedIndex ?? movingIndex.value?.index ?? index\n\n const numSizes = [...cachePxSizes]\n const nextIndex = mergedIndex + 1\n\n // Handle the maximum and minimum edge cases\n const startMinSize = getLimitSize(limitSizes.value[mergedIndex]![0], 0)\n const endMinSize = getLimitSize(limitSizes.value[nextIndex]![0], 0)\n const startMaxSize = getLimitSize(\n limitSizes.value[mergedIndex]![1],\n containerSize.value || 0\n )\n const endMaxSize = getLimitSize(\n limitSizes.value[nextIndex]![1],\n containerSize.value || 0\n )\n\n let mergedOffset = offset\n\n if (numSizes[mergedIndex]! + mergedOffset < startMinSize) {\n mergedOffset = startMinSize - numSizes[mergedIndex]!\n }\n if (numSizes[nextIndex]! - mergedOffset < endMinSize) {\n mergedOffset = numSizes[nextIndex]! - endMinSize\n }\n if (numSizes[mergedIndex]! + mergedOffset > startMaxSize) {\n mergedOffset = startMaxSize - numSizes[mergedIndex]!\n }\n if (numSizes[nextIndex]! - mergedOffset > endMaxSize) {\n mergedOffset = numSizes[nextIndex]! - endMaxSize\n }\n\n numSizes[mergedIndex]! += mergedOffset\n numSizes[nextIndex]! -= mergedOffset\n lazyOffset.value = mergedOffset\n\n updatePanelSizes = () => {\n panels.value.forEach((panel, index) => {\n panel.size = numSizes[index]\n })\n updatePanelSizes = NOOP\n }\n\n if (!lazy.value) {\n updatePanelSizes()\n }\n }\n\n const onMoveEnd = () => {\n if (lazy.value) {\n updatePanelSizes()\n }\n\n lazyOffset.value = 0\n movingIndex.value = null\n cachePxSizes = []\n }\n\n const cacheCollapsedSize: number[] = []\n const onCollapse = (index: number, type: 'start' | 'end') => {\n if (!cacheCollapsedSize.length) {\n cacheCollapsedSize.push(...pxSizes.value)\n }\n\n const currentSizes = pxSizes.value\n\n const currentIndex = type === 'start' ? index : index + 1\n const targetIndex = type === 'start' ? index + 1 : index\n\n const currentSize = currentSizes[currentIndex]\n const targetSize = currentSizes[targetIndex]\n\n if (currentSize !== 0 && targetSize !== 0) {\n currentSizes[currentIndex] = 0\n currentSizes[targetIndex]! += currentSize\n cacheCollapsedSize[index] = currentSize\n } else {\n const totalSize = currentSize + targetSize\n\n const targetCacheCollapsedSize = cacheCollapsedSize[index]\n const currentCacheCollapsedSize = totalSize - targetCacheCollapsedSize\n\n currentSizes[targetIndex] = targetCacheCollapsedSize\n currentSizes[currentIndex] = currentCacheCollapsedSize\n }\n\n panels.value.forEach((panel, index) => {\n panel.size = currentSizes[index]\n })\n }\n\n return {\n lazyOffset,\n onMoveStart,\n onMoving,\n onMoveEnd,\n movingIndex,\n onCollapse,\n }\n}\n"],"mappings":"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"}