element-plus
Version:
A Component Library for Vue 3
1 lines • 13.3 kB
Source Map (JSON)
{"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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"}