{"version":3,"file":"use-tree-select.mjs","sources":["../../../../../packages/components/tree-select/src/use-tree-select.ts"],"sourcesContent":["import {\n  shallowRef,\n  watch,\n  nextTick,\n  computed,\n  type ShallowRef,\n  ComputedRef\n} from 'vue'\nimport type {\n  CheckedInfo,\n  TreeNodeData,\n  ElTree\n} from '@element-ultra/components/tree'\nimport type { TreeSelectProps, TreeSelectEmits } from './tree-select'\nimport { useFormItem } from '@element-ultra/hooks'\nimport { getChainValue } from '@element-ultra/utils'\n\ninterface Options {\n  props: TreeSelectProps\n  emit: TreeSelectEmits\n  treeRef: ShallowRef<InstanceType<typeof ElTree> | undefined>\n  filterer: any\n  treeSelectDisabled: ComputedRef<boolean>\n}\n\nexport default function useTreeSelect(options: Options) {\n  const { props, emit, treeRef, filterer, treeSelectDisabled } = options\n\n  const dropdownRef = shallowRef<HTMLDivElement>()\n  /** 下拉框显隐 */\n  const treeVisible = shallowRef(false)\n  /** 是否已渲染 */\n  const hasRendered = shallowRef(false)\n  /** 通过事件更改的值 */\n  const changedByEvent = shallowRef(false)\n\n  const hovered = shallowRef(false)\n\n  const handleMouseEnter = () => {\n    hovered.value = true\n  }\n\n  const handleMouseLeave = () => {\n    hovered.value = false\n  }\n\n  /** 是否可清除 */\n  const clearable = computed(() => {\n    const { modelValue } = props\n    const hasValue = Array.isArray(modelValue)\n      ? modelValue.length\n      : !!(modelValue || modelValue === 0)\n\n    return hasValue && hovered.value\n  })\n\n  // 只有不是通过用户事件触发的才调用\n  watch(\n    [() => props.modelValue, () => props.data],\n    () => {\n      if (changedByEvent.value) {\n        changedByEvent.value = false\n        return\n      }\n\n      nextTick(() => setTreeChecked())\n    },\n    { immediate: true }\n  )\n\n  type EmitModelValue = {\n    (\n      v: string | number,\n      label: string,\n      model: Record<string, any> | undefined\n    ): void\n    (\n      v: (string | number)[],\n      label: string[],\n      model: Record<string, any>[]\n    ): void\n  }\n\n  const { formItem } = useFormItem()\n  const emitModelValue: EmitModelValue = (value, label, model) => {\n    emit('update:modelValue', value, label, model)\n    emit('update:text', label)\n    formItem?.validate()\n  }\n\n  /** 计算dropdown的位置 */\n  const treeSelectRef = shallowRef<HTMLDivElement>()\n\n  const position = shallowRef('bottom')\n\n  const openDialog = () => {\n    if (treeSelectDisabled.value) return\n    treeVisible.value = true\n  }\n  const closeDialog = () => {\n    treeVisible.value = false\n  }\n\n  watch(treeVisible, visible => {\n    if (!visible) {\n      filterer.query = ''\n      treeRef.value?.filter('')\n    }\n  })\n\n  // 值相关操作---------------------------------------\n\n  /** 多选值的tag, 如果子节点全部被选中， 那么tag只现实父节点一个 */\n  const tagList = shallowRef<Record<string, any>[]>([])\n\n  /** 单选值 */\n  const selectedLabel = shallowRef<string | number>('')\n\n  /** 关闭标签 */\n  const handleCloseTag = (data: Record<string, any>, i: number) => {\n    const tree = treeRef.value\n    const { modelValue, labelKey, valueKey } = props\n    if (!tree || !Array.isArray(modelValue)) return\n\n    tagList.value.splice(i, 1)\n    tree.setChecked(getChainValue(data, valueKey), false)\n\n    const { nodes, keys } = tree.getChecked()\n\n    const labels = nodes.map(node => getChainValue(node, labelKey))\n    emitModelValue(keys, labels, nodes)\n  }\n\n  /** 设置树的选中状态 */\n  const setTreeChecked = () => {\n    const tree = treeRef.value\n    if (!tree) return\n\n    const { modelValue, multiple, labelKey, text } = props\n\n    // 多选选中\n    if (Array.isArray(modelValue)) {\n      if (!multiple) return\n      tree.setCheckedKeys(modelValue)\n      tagList.value = tree.getChecked().nodes\n    }\n    // 单选\n    else {\n      if (!modelValue && modelValue !== 0) {\n        tree?.setCurrentKey('')\n        selectedLabel.value = ''\n        return\n      }\n\n      tree.setCurrentKey(modelValue)\n      selectedLabel.value =\n        getChainValue(tree.getCurrentNode(), labelKey) ?? text\n    }\n  }\n\n  /** 单选 */\n  const handleSelectChange = (data?: TreeNodeData) => {\n    const { labelKey, valueKey, multiple } = props\n    if (multiple) return\n    const value = getChainValue(data, valueKey)\n    const label = getChainValue(data, labelKey)\n    selectedLabel.value = label\n    changedByEvent.value = true\n    emitModelValue(value, label, data)\n    closeDialog()\n  }\n\n  /** 多选 */\n  const handleCheck = (_: any, info: CheckedInfo) => {\n    const { checkedKeys, checkedNodes } = info\n    const { labelKey } = props\n    const checkedLabels = checkedNodes.map(node =>\n      getChainValue(node, labelKey)\n    )\n    tagList.value = checkedNodes\n    changedByEvent.value = true\n    emitModelValue(checkedKeys, checkedLabels, checkedNodes)\n  }\n\n  return {\n    treeRef,\n    treeSelectRef,\n    dropdownRef,\n    treeVisible,\n    changedByEvent,\n    clearable,\n    position,\n    handleMouseLeave,\n    handleMouseEnter,\n    hasRendered,\n    emitModelValue,\n    tagList,\n    selectedLabel,\n    setTreeChecked,\n    handleCheck,\n    handleSelectChange,\n    openDialog,\n    closeDialog,\n    handleCloseTag\n  }\n}\n"],"names":[],"mappings":"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"}