{"version":3,"file":"useDragNode.mjs","sources":["../../../../../../../packages/components/tree/src/model/useDragNode.ts"],"sourcesContent":["// @ts-nocheck\nimport { provide, ref } from 'vue'\nimport { addClass, removeClass } from '@bigin/utils'\nimport { useNamespace } from '@bigin/hooks'\nimport type { InjectionKey } from 'vue'\nimport type Node from './node'\nimport type { NodeDropType } from '../tree.type'\n\ninterface TreeNode {\n  node: Node\n  $el?: HTMLElement\n}\n\ninterface DragOptions {\n  event: DragEvent\n  treeNode: TreeNode\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({ props, ctx, el$, dropIndicator$, store }) {\n  const ns = useNamespace('tree')\n  const dragState = ref({\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 (\n      typeof props.allowDrag === 'function' &&\n      !props.allowDrag(treeNode.node)\n    ) {\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    const dropNode = treeNode\n    const oldDropNode = dragState.value.dropNode\n    if (oldDropNode && oldDropNode !== dropNode) {\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 (typeof props.allowDrop === 'function') {\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 ((dropPrev || dropInner || dropNext) && oldDropNode !== dropNode) {\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    }\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\n    const targetPosition = dropNode.$el.getBoundingClientRect()\n    const treePosition = el$.value.getBoundingClientRect()\n\n    let dropType: NodeDropType\n    const prevPercent = dropPrev ? (dropInner ? 0.25 : dropNext ? 0.45 : 1) : -1\n    const nextPercent = dropNext ? (dropInner ? 0.75 : dropPrev ? 0.55 : 0) : 1\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 = dropNode.$el\n      .querySelector(`.${ns.be('node', 'expand-icon')}`)\n      .getBoundingClientRect()\n    const dropIndicator = dropIndicator$.value\n    if (dropType === 'before') {\n      indicatorTop = iconPosition.top - treePosition.top\n    } else if (dropType === 'after') {\n      indicatorTop = iconPosition.bottom - treePosition.top\n    }\n    dropIndicator.style.top = `${indicatorTop}px`\n    dropIndicator.style.left = `${iconPosition.right - treePosition.left}px`\n\n    if (dropType === 'inner') {\n      addClass(dropNode.$el, ns.is('drop-inner'))\n    } else {\n      removeClass(dropNode.$el, 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    event.dataTransfer.dropEffect = 'move'\n\n    if (draggingNode && dropNode) {\n      const draggingNodeCopy = { 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)\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('node-drop', draggingNode.node, dropNode.node, dropType, event)\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":[],"mappings":"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"}