UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 15.5 kB
{"version":3,"file":"useDragNode.mjs","sources":["../../../../../../../packages/components/tree/src/model/useDragNode.ts"],"sourcesContent":["import { provide, ref } from 'vue'\nimport { addClass, isFunction, removeClass } from '@element-plus/utils'\nimport { useNamespace } from '@element-plus/hooks'\n\nimport type { InjectionKey, Ref, SetupContext } from 'vue'\nimport type {\n AllowDragFunction,\n AllowDropFunction,\n FakeNode,\n NodeDropType,\n} from '../tree.type'\nimport type TreeStore from './tree-store'\nimport type Node from './node'\nimport type { treeEmits } from '../tree'\n\nexport interface TreeNode {\n node: Node\n $el?: HTMLElement\n}\n\ninterface DragOptions {\n event: DragEvent\n treeNode: TreeNode\n}\n\ninterface Props {\n props: {\n allowDrag?: AllowDragFunction\n allowDrop?: AllowDropFunction\n }\n ctx: SetupContext<typeof treeEmits>\n el$: Ref<HTMLElement | null>\n dropIndicator$: Ref<HTMLElement | null>\n store: Ref<TreeStore>\n}\n\nexport interface DragEvents {\n treeNodeDragStart: (options: DragOptions) => void\n treeNodeDragOver: (options: DragOptions) => void\n treeNodeDragEnd: (event: DragEvent) => void\n}\n\nexport const dragEventsKey: InjectionKey<DragEvents> = Symbol('dragEvents')\n\nexport function useDragNodeHandler({\n props,\n ctx,\n el$,\n dropIndicator$,\n store,\n}: Props) {\n const ns = useNamespace('tree')\n const dragState = ref<{\n allowDrop: boolean\n dropType: NodeDropType | null\n draggingNode: TreeNode | null\n showDropIndicator: boolean\n dropNode: TreeNode | null\n }>({\n showDropIndicator: false,\n draggingNode: null,\n dropNode: null,\n allowDrop: true,\n dropType: null,\n })\n\n const treeNodeDragStart = ({ event, treeNode }: DragOptions) => {\n if (!event.dataTransfer) return\n if (isFunction(props.allowDrag) && !props.allowDrag(treeNode.node)) {\n event.preventDefault()\n return false\n }\n event.dataTransfer.effectAllowed = 'move'\n\n // wrap in try catch to address IE's error when first param is 'text/plain'\n try {\n // setData is required for draggable to work in FireFox\n // the content has to be '' so dragging a node out of the tree won't open a new tab in FireFox\n event.dataTransfer.setData('text/plain', '')\n } catch {}\n dragState.value.draggingNode = treeNode\n ctx.emit('node-drag-start', treeNode.node, event)\n }\n\n const treeNodeDragOver = ({ event, treeNode }: DragOptions) => {\n if (!event.dataTransfer) return\n const dropNode = treeNode\n const oldDropNode = dragState.value.dropNode\n if (oldDropNode && oldDropNode.node.id !== dropNode.node.id) {\n removeClass(oldDropNode.$el!, ns.is('drop-inner'))\n }\n const draggingNode = dragState.value.draggingNode\n if (!draggingNode || !dropNode) return\n\n let dropPrev = true\n let dropInner = true\n let dropNext = true\n let userAllowDropInner = true\n if (isFunction(props.allowDrop)) {\n dropPrev = props.allowDrop(draggingNode.node, dropNode.node, 'prev')\n userAllowDropInner = dropInner = props.allowDrop(\n draggingNode.node,\n dropNode.node,\n 'inner'\n )\n dropNext = props.allowDrop(draggingNode.node, dropNode.node, 'next')\n }\n event.dataTransfer.dropEffect =\n dropInner || dropPrev || dropNext ? 'move' : 'none'\n if (\n (dropPrev || dropInner || dropNext) &&\n oldDropNode?.node.id !== dropNode.node.id\n ) {\n if (oldDropNode) {\n ctx.emit('node-drag-leave', draggingNode.node, oldDropNode.node, event)\n }\n ctx.emit('node-drag-enter', draggingNode.node, dropNode.node, event)\n }\n\n if (dropPrev || dropInner || dropNext) {\n dragState.value.dropNode = dropNode\n } else {\n // Reset dragState.value.dropNode to null when allowDrop is transfer from true to false.(For issue #14704)\n dragState.value.dropNode = null\n }\n\n if (dropNode.node.nextSibling === draggingNode.node) {\n dropNext = false\n }\n if (dropNode.node.previousSibling === draggingNode.node) {\n dropPrev = false\n }\n if (dropNode.node.contains(draggingNode.node, false)) {\n dropInner = false\n }\n if (\n draggingNode.node === dropNode.node ||\n draggingNode.node.contains(dropNode.node)\n ) {\n dropPrev = false\n dropInner = false\n dropNext = false\n }\n const dropEl = dropNode.$el!\n\n // find target node without children, just calc content node height\n const targetPosition = dropEl\n .querySelector(`.${ns.be('node', 'content')}`)!\n .getBoundingClientRect()\n const treePosition = el$.value!.getBoundingClientRect()\n const treeScrollTop = el$.value!.scrollTop\n let dropType: NodeDropType\n const prevPercent = dropPrev\n ? dropInner\n ? 0.25\n : dropNext\n ? 0.45\n : 1\n : Number.NEGATIVE_INFINITY\n const nextPercent = dropNext\n ? dropInner\n ? 0.75\n : dropPrev\n ? 0.55\n : 0\n : Number.POSITIVE_INFINITY\n\n let indicatorTop = -9999\n const distance = event.clientY - targetPosition.top\n if (distance < targetPosition.height * prevPercent) {\n dropType = 'before'\n } else if (distance > targetPosition.height * nextPercent) {\n dropType = 'after'\n } else if (dropInner) {\n dropType = 'inner'\n } else {\n dropType = 'none'\n }\n\n const iconPosition = dropEl\n .querySelector(`.${ns.be('node', 'expand-icon')}`)!\n .getBoundingClientRect()\n const dropIndicator = dropIndicator$.value\n if (dropType === 'before') {\n indicatorTop = iconPosition.top - treePosition.top + treeScrollTop\n } else if (dropType === 'after') {\n indicatorTop = iconPosition.bottom - treePosition.top + treeScrollTop\n }\n dropIndicator!.style.top = `${indicatorTop}px`\n dropIndicator!.style.left = `${iconPosition.right - treePosition.left}px`\n\n if (dropType === 'inner') {\n addClass(dropEl, ns.is('drop-inner'))\n } else {\n removeClass(dropEl, ns.is('drop-inner'))\n }\n\n dragState.value.showDropIndicator =\n dropType === 'before' || dropType === 'after'\n dragState.value.allowDrop =\n dragState.value.showDropIndicator || userAllowDropInner\n dragState.value.dropType = dropType\n ctx.emit('node-drag-over', draggingNode.node, dropNode.node, event)\n }\n\n const treeNodeDragEnd = (event: DragEvent) => {\n const { draggingNode, dropType, dropNode } = dragState.value\n event.preventDefault()\n\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1911486\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move'\n }\n\n if (draggingNode?.node.data && dropNode) {\n const draggingNodeCopy: FakeNode = { data: draggingNode.node.data }\n if (dropType !== 'none') {\n draggingNode.node.remove()\n }\n if (dropType === 'before') {\n dropNode.node.parent?.insertBefore(draggingNodeCopy, dropNode.node)\n } else if (dropType === 'after') {\n dropNode.node.parent?.insertAfter(draggingNodeCopy, dropNode.node)\n } else if (dropType === 'inner') {\n dropNode.node.insertChild(draggingNodeCopy)\n }\n if (dropType !== 'none') {\n store.value.registerNode(draggingNodeCopy as any)\n if (store.value.key) {\n //restore checkbox state after dragging\n draggingNode.node.eachNode((node) => {\n store.value.nodesMap[node.data[store.value.key]]?.setChecked(\n node.checked,\n !store.value.checkStrictly\n )\n })\n }\n }\n\n removeClass(dropNode.$el!, ns.is('drop-inner'))\n\n ctx.emit(\n 'node-drag-end',\n draggingNode.node,\n dropNode.node,\n dropType!,\n event\n )\n if (dropType !== 'none') {\n ctx.emit(\n 'node-drop',\n draggingNode.node,\n dropNode.node,\n dropType!,\n event\n )\n }\n }\n if (draggingNode && !dropNode) {\n ctx.emit('node-drag-end', draggingNode.node, null, dropType!, event)\n }\n\n dragState.value.showDropIndicator = false\n dragState.value.draggingNode = null\n dragState.value.dropNode = null\n dragState.value.allowDrop = true\n }\n\n provide(dragEventsKey, {\n treeNodeDragStart,\n treeNodeDragOver,\n treeNodeDragEnd,\n })\n\n return {\n dragState,\n }\n}\n"],"names":["_a"],"mappings":"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"}