{"version":3,"file":"tree.mjs","names":["TreeSelectOption"],"sources":["../../../../../../packages/components/tree-select/src/tree.ts"],"sourcesContent":["// @ts-nocheck\nimport { computed, nextTick, toRefs, watch } from 'vue'\nimport { isEqual, isNil, pick } from 'lodash-unified'\nimport { CHANGE_EVENT, UPDATE_MODEL_EVENT } from '@element-plus/constants'\nimport { escapeStringRegexp, isEmpty, isFunction } from '@element-plus/utils'\nimport ElTree from '@element-plus/components/tree'\nimport TreeSelectOption from './tree-select-option'\nimport {\n  isValidArray,\n  isValidValue,\n  toValidArray,\n  treeEach,\n  treeFind,\n} from './utils'\n\nimport type { CacheOption } from './cache-options'\nimport type { Ref } from 'vue'\nimport type { SelectInstance } from '@element-plus/components/select'\nimport type Node from '@element-plus/components/tree/src/model/node'\nimport type { TreeNodeData } from '@element-plus/components/tree/src/tree.type'\nimport type { TreeInstance } from '@element-plus/components/tree'\n\nexport const useTree = (\n  props,\n  { attrs, slots, emit },\n  {\n    select,\n    tree,\n    key,\n  }: {\n    select: Ref<SelectInstance | undefined>\n    tree: Ref<TreeInstance | undefined>\n    key: Ref<string>\n  }\n) => {\n  watch(\n    [() => props.modelValue, tree],\n    () => {\n      if (props.showCheckbox) {\n        nextTick(() => {\n          const treeInstance = tree.value\n          if (\n            treeInstance &&\n            !isEqual(\n              treeInstance.getCheckedKeys(),\n              toValidArray(props.modelValue)\n            )\n          ) {\n            treeInstance.setCheckedKeys(toValidArray(props.modelValue))\n          }\n        })\n      }\n    },\n    {\n      immediate: true,\n      deep: true,\n    }\n  )\n\n  const propsMap = computed(() => ({\n    value: key.value,\n    label: 'label',\n    children: 'children',\n    disabled: 'disabled',\n    isLeaf: 'isLeaf',\n    ...props.props,\n  }))\n\n  const getNodeValByProp = (\n    prop: 'value' | 'label' | 'children' | 'disabled' | 'isLeaf',\n    data: TreeNodeData\n  ) => {\n    const propVal = propsMap.value[prop]\n    if (isFunction(propVal)) {\n      return propVal(\n        data,\n        tree.value?.getNode(getNodeValByProp('value', data)) as Node\n      )\n    } else {\n      return data[propVal as string]\n    }\n  }\n\n  const defaultExpandedParentKeys = toValidArray(props.modelValue)\n    .map((value) => {\n      return treeFind(\n        props.data || [],\n        (data) => getNodeValByProp('value', data) === value,\n        (data) => getNodeValByProp('children', data),\n        (data, index, array, parent) =>\n          parent && getNodeValByProp('value', parent)\n      )\n    })\n    .filter((item) => isValidValue(item))\n\n  const cacheOptions = computed(() => {\n    if (!props.renderAfterExpand && !props.lazy) return []\n\n    const options: CacheOption[] = []\n\n    treeEach(\n      props.data.concat(props.cacheData),\n      (node) => {\n        const value = getNodeValByProp('value', node)\n        options.push({\n          value,\n          currentLabel: getNodeValByProp('label', node),\n          isDisabled: getNodeValByProp('disabled', node),\n        })\n      },\n      (data) => getNodeValByProp('children', data)\n    )\n\n    return options\n  })\n\n  const getChildCheckedKeys = () => {\n    return tree.value?.getCheckedKeys().filter((checkedKey) => {\n      const node = tree.value?.getNode(checkedKey) as Node\n      return !isNil(node) && isEmpty(node.childNodes)\n    })\n  }\n\n  const emitChange = (val: any | any[]) => {\n    if (!isEqual(props.modelValue, val)) {\n      emit(CHANGE_EVENT, val)\n    }\n  }\n\n  function update(val) {\n    emit(UPDATE_MODEL_EVENT, val)\n    emitChange(val)\n  }\n\n  return {\n    ...pick(toRefs(props), Object.keys(ElTree.props)),\n    ...attrs,\n    nodeKey: key,\n\n    // only expand on click node when the `check-strictly` is false\n    expandOnClickNode: computed(() => {\n      return !props.checkStrictly && props.expandOnClickNode\n    }),\n\n    // show current selected node only first time,\n    // fix the problem of expanding multiple nodes when checking multiple nodes\n    defaultExpandedKeys: computed(() => {\n      return props.defaultExpandedKeys\n        ? props.defaultExpandedKeys.concat(defaultExpandedParentKeys)\n        : defaultExpandedParentKeys\n    }),\n\n    renderContent: (h, { node, data, store }) => {\n      return h(\n        TreeSelectOption,\n        {\n          value: getNodeValByProp('value', data),\n          label: getNodeValByProp('label', data),\n          disabled: getNodeValByProp('disabled', data),\n          visible: node.visible,\n        },\n        props.renderContent\n          ? () => props.renderContent(h, { node, data, store })\n          : slots.default\n            ? () => slots.default({ node, data, store })\n            : undefined\n      )\n    },\n    filterNodeMethod: (value, data, node) => {\n      if (props.filterNodeMethod)\n        return props.filterNodeMethod(value, data, node)\n      if (!value) return true\n      const regexp = new RegExp(escapeStringRegexp(value), 'i')\n      return regexp.test(getNodeValByProp('label', data) || '')\n    },\n    onNodeClick: (data, node, e) => {\n      attrs.onNodeClick?.(data, node, e)\n\n      // `onCheck` is trigger when `checkOnClickNode`\n      if (props.showCheckbox && props.checkOnClickNode) return\n\n      // now `checkOnClickNode` is false, only no checkbox and `checkStrictly` or `isLeaf`\n      if (!props.showCheckbox && (props.checkStrictly || node.isLeaf)) {\n        if (!getNodeValByProp('disabled', data)) {\n          const option = select.value?.states.options.get(\n            getNodeValByProp('value', data)\n          )\n          select.value?.handleOptionSelect(option)\n        }\n      } else if (props.expandOnClickNode) {\n        e.proxy.handleExpandIconClick()\n      }\n    },\n    onCheck: (data, params) => {\n      // ignore when no checkbox, like only `checkOnClickNode` is true\n      if (!props.showCheckbox) return\n\n      const dataValue = getNodeValByProp('value', data)\n      const dataMap = {}\n      treeEach(\n        [tree.value.store.root],\n        (node) => (dataMap[node.key] = node),\n        (node) => node.childNodes\n      )\n\n      // fix: checkedKeys has not cached keys\n      const uncachedCheckedKeys = params.checkedKeys\n      const cachedKeys = props.multiple\n        ? toValidArray(props.modelValue).filter(\n            (item) => !(item in dataMap) && !uncachedCheckedKeys.includes(item)\n          )\n        : []\n      const checkedKeys = cachedKeys.concat(uncachedCheckedKeys)\n\n      if (props.checkStrictly) {\n        // Checking for changes may come from `check-on-node-click`\n        update(\n          props.multiple\n            ? checkedKeys\n            : checkedKeys.includes(dataValue)\n              ? dataValue\n              : undefined\n        )\n      }\n      // only can select leaf node\n      else if (props.multiple) {\n        const childKeys = getChildCheckedKeys()\n        update(cachedKeys.concat(childKeys))\n      } else {\n        // select first leaf node when check parent\n        const firstLeaf = treeFind(\n          [data],\n          (data) =>\n            !isValidArray(getNodeValByProp('children', data)) &&\n            !getNodeValByProp('disabled', data),\n          (data) => getNodeValByProp('children', data)\n        )\n        const firstLeafKey = firstLeaf\n          ? getNodeValByProp('value', firstLeaf)\n          : undefined\n\n        // unselect when any child checked\n        const hasCheckedChild =\n          isValidValue(props.modelValue) &&\n          !!treeFind(\n            [data],\n            (data) => getNodeValByProp('value', data) === props.modelValue,\n            (data) => getNodeValByProp('children', data)\n          )\n\n        update(\n          firstLeafKey === props.modelValue || hasCheckedChild\n            ? undefined\n            : firstLeafKey\n        )\n      }\n\n      nextTick(() => {\n        const checkedKeys = toValidArray(props.modelValue)\n        tree.value.setCheckedKeys(checkedKeys)\n\n        attrs.onCheck?.(data, {\n          checkedKeys: tree.value.getCheckedKeys(),\n          checkedNodes: tree.value.getCheckedNodes(),\n          halfCheckedKeys: tree.value.getHalfCheckedKeys(),\n          halfCheckedNodes: tree.value.getHalfCheckedNodes(),\n        })\n      })\n\n      select.value?.focus()\n    },\n\n    onNodeExpand: (data, node, e) => {\n      attrs.onNodeExpand?.(data, node, e)\n      nextTick(() => {\n        if (\n          !props.checkStrictly &&\n          props.lazy &&\n          props.multiple &&\n          node.checked\n        ) {\n          const dataMap = {}\n          const uncachedCheckedKeys = (\n            tree.value as TreeInstance\n          ).getCheckedKeys()\n\n          treeEach(\n            [tree.value.store.root],\n            (node) => (dataMap[node.key] = node),\n            (node) => node.childNodes\n          )\n\n          const cachedKeys = toValidArray(props.modelValue).filter(\n            (item) => !(item in dataMap) && !uncachedCheckedKeys.includes(item)\n          )\n\n          const childKeys = getChildCheckedKeys()\n          update(cachedKeys.concat(childKeys))\n        }\n      })\n    },\n    // else\n    cacheOptions,\n  }\n}\n"],"mappings":"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"}