{"version":3,"file":"tree-node.vue2.mjs","sources":["../../../components/tree/tree-node.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Checkbox } from '@/components/checkbox'\nimport { Icon } from '@/components/icon'\nimport { Renderer } from '@/components/renderer'\n\nimport { computed, inject, nextTick, onBeforeUnmount, reactive, ref, watch } from 'vue'\n\nimport { useIcons, useNameHelper } from '@vexip-ui/config'\nimport { useModifier, useRtl } from '@vexip-ui/hooks'\nimport { decide, isNull } from '@vexip-ui/utils'\nimport { TREE_STATE } from './symbol'\n\nimport type { PropType } from 'vue'\nimport type { TreeNodeProps } from './symbol'\n\ndefineOptions({ name: 'TreeNode', inheritAttrs: false })\n\nconst props = defineProps({\n  node: {\n    type: Object as PropType<TreeNodeProps>,\n    default: () => ({})\n  }\n})\n\nconst treeState = inject(TREE_STATE)!\n\nconst nh = useNameHelper('tree')\nconst icons = useIcons()\n\nconst { isRtl } = useRtl()\n\nconst wrapper = ref<HTMLElement>()\nconst arrowEl = ref<HTMLElement>()\n\nconst parentState = computed(() => {\n  return props.node.parent ? treeState.nodeStates.get(props.node.parent) : undefined\n})\n\nuseModifier({\n  target: wrapper,\n  passive: false,\n  onKeyDown: (event, modifier) => {\n    if (treeState.expanding) return\n\n    decide(\n      [\n        [\n          () => modifier.up || modifier.down,\n          () => treeState.handleHittingChange(modifier.up ? 'up' : 'down')\n        ],\n        [\n          () => modifier.left || modifier.right,\n          () => {\n            const hasChild = props.node.children?.length > 0\n\n            if (modifier.right && props.node.expanded && hasChild) {\n              treeState.handleHittingChange('down')\n            } else if (modifier.left && (!props.node.expanded || !hasChild)) {\n              treeState.handleNodeHitting(parentState.value?.el)\n            } else {\n              toggleExpanded(modifier.right)\n            }\n          }\n        ],\n        [() => hasCheckbox.value && modifier.space, handleToggleCheck],\n        [() => modifier.enter, handleToggleSelect]\n      ],\n      {\n        beforeMatchAny: () => {\n          event.preventDefault()\n          event.stopPropagation()\n        },\n        afterMatchAny: modifier.resetAll\n      }\n    )\n  }\n})\n\nconst loaded = ref(!treeState.boundAsyncLoad || props.node.loaded)\nconst loadFail = ref(treeState.boundAsyncLoad && props.node.loadFail)\nconst dragging = ref(false)\nconst isDragOver = ref(false)\nconst focused = ref(false)\n\nconst isDisabled = computed(() => {\n  return (!treeState.noCascaded && parentState.value?.disabled) || props.node.disabled\n})\nconst isReadonly = computed(() => {\n  return (!treeState.noCascaded && parentState.value?.readonly) || props.node.readonly\n})\n// const depth = computed(() => parentState.depth + 1)\nconst secondary = computed(\n  () => !props.node.matched && (props.node.childMatched || props.node.upperMatched)\n)\nconst hasLinkLine = computed(() => !!treeState.linkLine && props.node.depth > 0)\nconst className = computed(() => {\n  return {\n    [nh.be('node')]: true,\n    [nh.bem('node', 'last')]: props.node.last,\n    [nh.bem('node', 'focused')]: focused.value,\n    [nh.bem('node', 'selected')]: props.node.selected,\n    [nh.bem('node', 'expanded')]: props.node.expanded,\n    [nh.bem('node', 'disabled')]: isDisabled.value,\n    [nh.bem('node', 'readonly')]: isReadonly.value,\n    [nh.bem('node', 'secondary')]: secondary.value,\n    [nh.bem('node', 'dragging')]: dragging.value,\n    [nh.bem('node', 'drag-over')]: isDragOver.value,\n    [nh.bem('node', 'link-line')]: hasLinkLine.value,\n    [nh.bem('node', 'no-arrow')]: !hasArrow.value,\n    [nh.bem('node', 'is-floor')]: treeState.floorSelect && props.node.children?.length,\n    [nh.bem('node', 'loaded')]: loaded.value,\n    [nh.bem('node', 'load-fail')]: loadFail.value\n  }\n})\nconst isLeaf = computed(() => {\n  const isLeaf = props.node.isLeaf\n\n  let leafSign: boolean | 'auto' = 'auto'\n  let asyncLoad = false\n\n  if (isNull(isLeaf) || isLeaf === 'auto') {\n    leafSign = 'auto'\n    asyncLoad = treeState.boundAsyncLoad\n  } else {\n    leafSign = isLeaf\n  }\n\n  return leafSign === 'auto'\n    ? !(props.node.children?.length || (asyncLoad && !loaded.value))\n    : !!leafSign\n})\nconst hasArrow = computed(() => {\n  return isNull(props.node.arrow) || props.node.arrow === 'auto'\n    ? treeState.arrow === 'auto'\n      ? !isLeaf.value\n      : treeState.arrow\n    : props.node.arrow\n})\nconst hasCheckbox = computed(() => {\n  const checkbox = props.node.checkbox\n\n  return isNull(checkbox) ? treeState.checkbox : checkbox\n})\n// const renderer = computed(() => treeState.renderer)\nconst suffixCheckbox = computed(() => treeState.suffixCheckbox)\nconst nodeState = reactive({\n  el: wrapper,\n  depth: computed(() => props.node.depth),\n  disabled: isDisabled,\n  readonly: isReadonly\n})\n\nwatch([() => treeState.boundAsyncLoad, () => props.node.loaded], values => {\n  loaded.value = !values[0] || values[1]\n})\nwatch([() => treeState.boundAsyncLoad, () => props.node.loadFail], values => {\n  loadFail.value = !values[0] || values[1]\n})\nwatch(\n  () => props.node.id,\n  (value, prev) => {\n    treeState.nodeStates.delete(prev)\n    treeState.nodeStates.set(value, nodeState)\n  }\n)\n\ntreeState.nodeStates.set(props.node.id, nodeState)\n\nlet dragTimer: ReturnType<typeof setTimeout>\n\nonBeforeUnmount(() => {\n  clearTimeout(dragTimer)\n  treeState.nodeStates.set(props.node.id, nodeState)\n})\n\n// function updateVisible() {\n//   treeState.updateVisibleNodeEls()\n// }\n\nfunction setValue<T = unknown>(key: keyof TreeNodeProps, value: T) {\n  ;(props.node as any)[key] = value\n}\n\nfunction handleClick() {\n  treeState.handleNodeClick(props.node)\n\n  if (treeState.blockEffect) {\n    handleLabelClick()\n  }\n}\n\nfunction handleToggleCheck(able = !props.node.checked) {\n  if (isDisabled.value || props.node.checkDisabled) return\n\n  setValue('checked', able)\n  setValue('partial', false)\n\n  nextTick(() => {\n    treeState.computeCheckedState(props.node, able)\n  })\n}\n\nasync function toggleExpanded(able = !props.node.expanded) {\n  if (\n    treeState.expanding ||\n    props.node.loading ||\n    isDisabled.value ||\n    props.node.expandDisabled ||\n    isLeaf.value\n  ) {\n    return\n  }\n\n  if (able && treeState.boundAsyncLoad && !loaded.value) {\n    setValue('loading', true)\n\n    const result = await treeState.handleAsyncLoad(props.node)\n\n    asyncLoadCallback(result)\n  } else {\n    setValue('expanded', able)\n\n    if (able) {\n      treeState.handleNodeExpand(props.node)\n    } else {\n      treeState.handleNodeReduce(props.node)\n    }\n  }\n}\n\nasync function handleToggleSelect(able = !props.node.selected) {\n  if (isDisabled.value || props.node.selectDisabled) return\n\n  if (treeState.floorSelect) {\n    await toggleExpanded()\n    return\n  }\n\n  setValue('selected', !isReadonly.value && able)\n\n  if (isReadonly.value || able) {\n    treeState.handleNodeSelect(props.node)\n  } else {\n    treeState.handleNodeCancel(props.node)\n  }\n}\n\nfunction handleLabelClick() {\n  treeState.handleLabelClick(props.node)\n  handleToggleSelect()\n}\n\nfunction asyncLoadCallback(success = true) {\n  setValue('loading', false)\n  setValue('expanded', success !== false)\n\n  if (success !== false) {\n    setValue('loaded', true)\n    setValue('loadFail', false)\n\n    if (props.node.children?.length) {\n      treeState.handleNodeExpand(props.node)\n    } else {\n      setValue('arrow', false)\n    }\n  } else {\n    setValue('loadFail', true)\n  }\n}\n\nfunction getNodeState() {\n  return {\n    el: wrapper.value,\n    arrow: arrowEl.value,\n    node: props.node\n  }\n}\n\nfunction handleDragStart() {\n  if (!treeState.draggable) return\n\n  dragging.value = true\n  treeState.handleNodeDragStart(getNodeState())\n}\n\nfunction handleDragOver(event: DragEvent) {\n  if (!treeState.draggable || !treeState.dragging) return\n\n  clearTimeout(dragTimer)\n  event.stopPropagation()\n  event.preventDefault()\n\n  isDragOver.value = true\n\n  treeState.handleNodeDragOver(getNodeState(), event)\n}\n\nfunction handleDragLeave(event: DragEvent) {\n  if (!treeState.draggable) return\n\n  clearTimeout(dragTimer)\n  event.preventDefault()\n\n  dragTimer = setTimeout(() => {\n    isDragOver.value = false\n  }, 100)\n}\n\nfunction handleDrop(event: DragEvent) {\n  if (!treeState.draggable || !treeState.dragging) return\n\n  clearTimeout(dragTimer)\n  event.stopPropagation()\n  event.preventDefault()\n\n  isDragOver.value = false\n\n  treeState.handleNodeDrop(getNodeState())\n}\n\nfunction handleDragEnd(event: DragEvent) {\n  if (!treeState.draggable || !treeState.dragging) return\n\n  event.stopPropagation()\n  dragging.value = false\n  treeState.handleNodeDragEnd(getNodeState())\n}\n</script>\n\n<template>\n  <li\n    v-bind=\"$attrs\"\n    ref=\"wrapper\"\n    :class=\"className\"\n    :draggable=\"treeState.draggable\"\n    tabindex=\"-1\"\n    :aria-disabled=\"isDisabled\"\n    :aria-grabbed=\"treeState.draggable && dragging ? 'true' : undefined\"\n    :style=\"{ [nh.cv('depth')]: node.depth }\"\n    @click.left=\"handleClick\"\n    @focus=\"focused = true\"\n    @blur=\"focused = false\"\n    @dragstart.stop=\"handleDragStart\"\n    @dragover=\"handleDragOver\"\n    @dragleave=\"handleDragLeave\"\n    @dragend=\"handleDragEnd\"\n    @drop=\"handleDrop\"\n  >\n    <slot\n      :data=\"node.data\"\n      :node=\"node\"\n      :depth=\"node.depth\"\n      :focused=\"focused\"\n      :line-count=\"0\"\n      :line-indexes=\"node.lineIndexes\"\n      :toggle-check=\"handleToggleCheck\"\n      :toggle-expand=\"toggleExpanded\"\n      :toggle-select=\"handleToggleSelect\"\n    >\n      <template v-if=\"hasLinkLine\">\n        <div\n          v-for=\"(lineIndex, index) in node.lineIndexes\"\n          :key=\"index\"\n          :class=\"[\n            nh.be('link-line'),\n            nh.bem('link-line', 'vertical'),\n            !index && nh.bem('link-line', 'first')\n          ]\"\n          :style=\"{ [nh.cv('link-line-index')]: lineIndex }\"\n          aria-hidden=\"true\"\n        ></div>\n\n        <div\n          :class=\"[nh.be('link-line'), nh.bem('link-line', 'horizontal')]\"\n          aria-hidden=\"true\"\n        ></div>\n      </template>\n      <div\n        :class=\"{\n          [nh.be('content')]: true,\n          [nh.bem('content', 'effect')]: treeState.blockEffect,\n          [nh.bem('content', 'disabled')]:\n            treeState.blockEffect && (isDisabled || node.selectDisabled)\n        }\"\n      >\n        <span\n          ref=\"arrowEl\"\n          :class=\"{\n            [nh.be('arrow')]: true,\n            [nh.bem('arrow', 'transparent')]: !node.loading && !hasArrow,\n            [nh.bem('arrow', 'expanded')]: node.expanded,\n            [nh.bem('arrow', 'disabled')]: isDisabled || node.expandDisabled\n          }\"\n          :aria-hidden=\"!node.loading && !hasArrow\"\n          @click.stop=\"toggleExpanded()\"\n        >\n          <Icon v-if=\"node.loading\" v-bind=\"icons.loading\" label=\"loading\"></Icon>\n          <slot\n            v-else\n            name=\"arrow\"\n            :data=\"node.data\"\n            :node=\"node\"\n            :depth=\"node.depth\"\n            :focused=\"focused\"\n          >\n            <Icon v-if=\"treeState.arrowIcon\" :icon=\"treeState.arrowIcon\"></Icon>\n            <Icon v-else v-bind=\"isRtl ? icons.angleLeft : icons.angleRight\"></Icon>\n          </slot>\n        </span>\n        <Checkbox\n          v-if=\"hasCheckbox && !suffixCheckbox\"\n          inherit\n          :class=\"nh.be('checkbox')\"\n          :tab-index=\"-1\"\n          :control=\"hasArrow\"\n          :checked=\"node.checked\"\n          :disabled=\"isDisabled || node.checkDisabled\"\n          :partial=\"node.partial\"\n          @click.prevent.stop=\"handleToggleCheck()\"\n        ></Checkbox>\n        <div\n          :class=\"{\n            [nh.be('label')]: true,\n            [nh.bem('label', 'effect')]: !treeState.blockEffect,\n            [nh.bem('label', 'disabled')]:\n              !treeState.blockEffect && (isDisabled || node.selectDisabled)\n          }\"\n          @click=\"!treeState.blockEffect && handleLabelClick()\"\n        >\n          <div v-if=\"treeState.prefixRenderer || $slots.prefix\" :class=\"nh.be('prefix')\">\n            <Renderer\n              v-if=\"treeState.prefixRenderer\"\n              :renderer=\"treeState.prefixRenderer\"\n              :data=\"{ node, depth: node.depth, data: node.data, focused }\"\n            ></Renderer>\n            <slot\n              v-else\n              name=\"prefix\"\n              :data=\"node.data\"\n              :node=\"node\"\n              :depth=\"node.depth\"\n              :focused=\"focused\"\n            ></slot>\n          </div>\n          <div :class=\"nh.be('text')\">\n            <Renderer\n              v-if=\"treeState.renderer\"\n              :renderer=\"treeState.renderer\"\n              :data=\"{ node, depth: node.depth, data: node.data, focused }\"\n            ></Renderer>\n            <slot\n              v-else\n              name=\"label\"\n              :data=\"node.data\"\n              :node=\"node\"\n              :depth=\"node.depth\"\n              :focused=\"focused\"\n            >\n              {{ node.data[treeState.labelKey] }}\n            </slot>\n          </div>\n          <div v-if=\"treeState.suffixRenderer || $slots.suffix\" :class=\"nh.be('suffix')\">\n            <Renderer\n              v-if=\"treeState.suffixRenderer\"\n              :renderer=\"treeState.suffixRenderer\"\n              :data=\"{ node, depth: node.depth, data: node.data, focused }\"\n            ></Renderer>\n            <slot\n              v-else\n              name=\"suffix\"\n              :data=\"node.data\"\n              :node=\"node\"\n              :depth=\"node.depth\"\n              :focused=\"focused\"\n            ></slot>\n          </div>\n        </div>\n        <Checkbox\n          v-if=\"hasCheckbox && suffixCheckbox\"\n          inherit\n          :class=\"[nh.be('checkbox'), nh.bem('checkbox', 'suffix')]\"\n          :tab-index=\"-1\"\n          :control=\"hasArrow\"\n          :checked=\"node.checked\"\n          :disabled=\"isDisabled || node.checkDisabled\"\n          :partial=\"node.partial\"\n          @click.prevent.stop=\"handleToggleCheck()\"\n        ></Checkbox>\n      </div>\n    </slot>\n  </li>\n</template>\n"],"names":["props","__props","treeState","inject","TREE_STATE","nh","useNameHelper","icons","useIcons","isRtl","useRtl","wrapper","ref","arrowEl","parentState","computed","useModifier","event","modifier","decide","hasChild","_a","_b","toggleExpanded","hasCheckbox","handleToggleCheck","handleToggleSelect","loaded","loadFail","dragging","isDragOver","focused","isDisabled","isReadonly","secondary","hasLinkLine","className","hasArrow","isLeaf","leafSign","asyncLoad","isNull","checkbox","suffixCheckbox","nodeState","reactive","watch","values","value","prev","dragTimer","onBeforeUnmount","setValue","key","handleClick","handleLabelClick","able","nextTick","result","asyncLoadCallback","success","getNodeState","handleDragStart","handleDragOver","handleDragLeave","handleDrop","handleDragEnd"],"mappings":"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"}