You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

0 lines
8.5 KiB

1 month ago
  1. {"ast":null,"code":"import { onMounted, watchEffect, onBeforeUnmount } from 'vue';\nimport { addUnit } from '../../utils/dom/style.mjs';\nconst useDraggable = (targetRef, dragRef, draggable, overflow) => {\n let transform = {\n offsetX: 0,\n offsetY: 0\n };\n const onMousedown = e => {\n const downX = e.clientX;\n const downY = e.clientY;\n const {\n offsetX,\n offsetY\n } = transform;\n const targetRect = targetRef.value.getBoundingClientRect();\n const targetLeft = targetRect.left;\n const targetTop = targetRect.top;\n const targetWidth = targetRect.width;\n const targetHeight = targetRect.height;\n const clientWidth = document.documentElement.clientWidth;\n const clientHeight = document.documentElement.clientHeight;\n const minLeft = -targetLeft + offsetX;\n const minTop = -targetTop + offsetY;\n const maxLeft = clientWidth - targetLeft - targetWidth + offsetX;\n const maxTop = clientHeight - targetTop - targetHeight + offsetY;\n const onMousemove = e2 => {\n let moveX = offsetX + e2.clientX - downX;\n let moveY = offsetY + e2.clientY - downY;\n if (!(overflow == null ? void 0 : overflow.value)) {\n moveX = Math.min(Math.max(moveX, minLeft), maxLeft);\n moveY = Math.min(Math.max(moveY, minTop), maxTop);\n }\n transform = {\n offsetX: moveX,\n offsetY: moveY\n };\n if (targetRef.value) {\n targetRef.value.style.transform = `translate(${addUnit(moveX)}, ${addUnit(moveY)})`;\n }\n };\n const onMouseup = () => {\n document.removeEventListener(\"mousemove\", onMousemove);\n document.removeEventListener(\"mouseup\", onMouseup);\n };\n document.addEventListener(\"mousemove\", onMousemove);\n document.addEventListener(\"mouseup\", onMouseup);\n };\n const onDraggable = () => {\n if (dragRef.value && targetRef.value) {\n dragRef.value.addEventListener(\"mousedown\", onMousedown);\n }\n };\n const offDraggable = () => {\n if (dragRef.value && targetRef.value) {\n dragRef.value.removeEventListener(\"mousedown\", onMousedown);\n }\n };\n const resetPosition = () => {\n transform = {\n offsetX: 0,\n offsetY: 0\n };\n if (targetRef.value) {\n targetRef.value.style.transform = \"none\";\n }\n };\n onMounted(() => {\n watchEffect(() => {\n if (draggable.value) {\n onDraggable();\n } else {\n offDraggable();\n }\n });\n });\n onBeforeUnmount(() => {\n offDraggable();\n });\n return {\n resetPosition\n };\n};\nexport { useDraggable };","map":{"version":3,"names":["useDraggable","targetRef","dragRef","draggable","overflow","transform","offsetX","offsetY","onMousedown","e","downX","clientX","downY","clientY","targetRect","value","getBoundingClientRect","targetLeft","left","targetTop","top","targetWidth","width","targetHeight","height","clientWidth","document","documentElement","clientHeight","minLeft","minTop","maxLeft","maxTop","onMousemove","e2","moveX","moveY","Math","min","max","style","addUnit","onMouseup","removeEventListener","addEventListener","onDraggable","offDraggable","resetPosition","onMounted","watchEffect","onBeforeUnmount"],"sources":["../../../../../packages/hooks/use-draggable/index.ts"],"sourcesContent":["import { onBeforeUnmount, onMounted, watchEffect } from 'vue'\nimport { addUnit } from '@element-plus/utils'\nimport type { ComputedRef, Ref } from 'vue'\n\nexport const useDraggable = (\n targetRef: Ref<HTMLElement | undefined>,\n dragRef: Ref<HTMLElement | undefined>,\n draggable: ComputedRef<boolean>,\n overflow?: ComputedRef<boolean>\n) => {\n let transform = {\n offsetX: 0,\n offsetY: 0,\n }\n\n const onMousedown = (e: MouseEvent) => {\n const downX = e.clientX\n const downY = e.clientY\n const { offsetX, offsetY } = transform\n\n const targetRect = targetRef.value!.getBoundingClientRect()\n const targetLeft = targetRect.left\n const targetTop = targetRect.top\n const targetWidth = targetRect.width\n const targ