tree.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
  2. require("../../../_virtual/_rolldown/runtime.js");
  3. const require_event = require("../../../constants/event.js");
  4. const require_types = require("../../../utils/types.js");
  5. const require_strings = require("../../../utils/strings.js");
  6. const require_index = require("../../tree/index.js");
  7. const require_tree_select_option = require("./tree-select-option.js");
  8. const require_utils = require("./utils.js");
  9. let lodash_unified = require("lodash-unified");
  10. let vue = require("vue");
  11. let _vue_shared = require("@vue/shared");
  12. //#region ../../packages/components/tree-select/src/tree.ts
  13. const useTree = (props, { attrs, slots, emit }, { select, tree, key }) => {
  14. (0, vue.watch)([() => props.modelValue, tree], () => {
  15. if (props.showCheckbox) (0, vue.nextTick)(() => {
  16. const treeInstance = tree.value;
  17. if (treeInstance && !(0, lodash_unified.isEqual)(treeInstance.getCheckedKeys(), require_utils.toValidArray(props.modelValue))) treeInstance.setCheckedKeys(require_utils.toValidArray(props.modelValue));
  18. });
  19. }, {
  20. immediate: true,
  21. deep: true
  22. });
  23. const propsMap = (0, vue.computed)(() => ({
  24. value: key.value,
  25. label: "label",
  26. children: "children",
  27. disabled: "disabled",
  28. isLeaf: "isLeaf",
  29. ...props.props
  30. }));
  31. const getNodeValByProp = (prop, data) => {
  32. const propVal = propsMap.value[prop];
  33. if ((0, _vue_shared.isFunction)(propVal)) return propVal(data, tree.value?.getNode(getNodeValByProp("value", data)));
  34. else return data[propVal];
  35. };
  36. const defaultExpandedParentKeys = require_utils.toValidArray(props.modelValue).map((value) => {
  37. return require_utils.treeFind(props.data || [], (data) => getNodeValByProp("value", data) === value, (data) => getNodeValByProp("children", data), (data, index, array, parent) => parent && getNodeValByProp("value", parent));
  38. }).filter((item) => require_utils.isValidValue(item));
  39. const cacheOptions = (0, vue.computed)(() => {
  40. if (!props.renderAfterExpand && !props.lazy) return [];
  41. const options = [];
  42. require_utils.treeEach(props.data.concat(props.cacheData), (node) => {
  43. const value = getNodeValByProp("value", node);
  44. options.push({
  45. value,
  46. currentLabel: getNodeValByProp("label", node),
  47. isDisabled: getNodeValByProp("disabled", node)
  48. });
  49. }, (data) => getNodeValByProp("children", data));
  50. return options;
  51. });
  52. const getChildCheckedKeys = () => {
  53. return tree.value?.getCheckedKeys().filter((checkedKey) => {
  54. const node = tree.value?.getNode(checkedKey);
  55. return !(0, lodash_unified.isNil)(node) && require_types.isEmpty(node.childNodes);
  56. });
  57. };
  58. const emitChange = (val) => {
  59. if (!(0, lodash_unified.isEqual)(props.modelValue, val)) emit(require_event.CHANGE_EVENT, val);
  60. };
  61. function update(val) {
  62. emit(require_event.UPDATE_MODEL_EVENT, val);
  63. emitChange(val);
  64. }
  65. return {
  66. ...(0, lodash_unified.pick)((0, vue.toRefs)(props), Object.keys(require_index.ElTree.props)),
  67. ...attrs,
  68. nodeKey: key,
  69. expandOnClickNode: (0, vue.computed)(() => {
  70. return !props.checkStrictly && props.expandOnClickNode;
  71. }),
  72. defaultExpandedKeys: (0, vue.computed)(() => {
  73. return props.defaultExpandedKeys ? props.defaultExpandedKeys.concat(defaultExpandedParentKeys) : defaultExpandedParentKeys;
  74. }),
  75. renderContent: (h, { node, data, store }) => {
  76. return h(require_tree_select_option.default, {
  77. value: getNodeValByProp("value", data),
  78. label: getNodeValByProp("label", data),
  79. disabled: getNodeValByProp("disabled", data),
  80. visible: node.visible
  81. }, props.renderContent ? () => props.renderContent(h, {
  82. node,
  83. data,
  84. store
  85. }) : slots.default ? () => slots.default({
  86. node,
  87. data,
  88. store
  89. }) : void 0);
  90. },
  91. filterNodeMethod: (value, data, node) => {
  92. if (props.filterNodeMethod) return props.filterNodeMethod(value, data, node);
  93. if (!value) return true;
  94. return new RegExp(require_strings.escapeStringRegexp(value), "i").test(getNodeValByProp("label", data) || "");
  95. },
  96. onNodeClick: (data, node, e) => {
  97. attrs.onNodeClick?.(data, node, e);
  98. if (props.showCheckbox && props.checkOnClickNode) return;
  99. if (!props.showCheckbox && (props.checkStrictly || node.isLeaf)) {
  100. if (!getNodeValByProp("disabled", data)) {
  101. const option = select.value?.states.options.get(getNodeValByProp("value", data));
  102. select.value?.handleOptionSelect(option);
  103. }
  104. } else if (props.expandOnClickNode) e.proxy.handleExpandIconClick();
  105. },
  106. onCheck: (data, params) => {
  107. if (!props.showCheckbox) return;
  108. const dataValue = getNodeValByProp("value", data);
  109. const dataMap = {};
  110. require_utils.treeEach([tree.value.store.root], (node) => dataMap[node.key] = node, (node) => node.childNodes);
  111. const uncachedCheckedKeys = params.checkedKeys;
  112. const cachedKeys = props.multiple ? require_utils.toValidArray(props.modelValue).filter((item) => !(item in dataMap) && !uncachedCheckedKeys.includes(item)) : [];
  113. const checkedKeys = cachedKeys.concat(uncachedCheckedKeys);
  114. if (props.checkStrictly) update(props.multiple ? checkedKeys : checkedKeys.includes(dataValue) ? dataValue : void 0);
  115. else if (props.multiple) {
  116. const childKeys = getChildCheckedKeys();
  117. update(cachedKeys.concat(childKeys));
  118. } else {
  119. const firstLeaf = require_utils.treeFind([data], (data) => !require_utils.isValidArray(getNodeValByProp("children", data)) && !getNodeValByProp("disabled", data), (data) => getNodeValByProp("children", data));
  120. const firstLeafKey = firstLeaf ? getNodeValByProp("value", firstLeaf) : void 0;
  121. const hasCheckedChild = require_utils.isValidValue(props.modelValue) && !!require_utils.treeFind([data], (data) => getNodeValByProp("value", data) === props.modelValue, (data) => getNodeValByProp("children", data));
  122. update(firstLeafKey === props.modelValue || hasCheckedChild ? void 0 : firstLeafKey);
  123. }
  124. (0, vue.nextTick)(() => {
  125. const checkedKeys = require_utils.toValidArray(props.modelValue);
  126. tree.value.setCheckedKeys(checkedKeys);
  127. attrs.onCheck?.(data, {
  128. checkedKeys: tree.value.getCheckedKeys(),
  129. checkedNodes: tree.value.getCheckedNodes(),
  130. halfCheckedKeys: tree.value.getHalfCheckedKeys(),
  131. halfCheckedNodes: tree.value.getHalfCheckedNodes()
  132. });
  133. });
  134. select.value?.focus();
  135. },
  136. onNodeExpand: (data, node, e) => {
  137. attrs.onNodeExpand?.(data, node, e);
  138. (0, vue.nextTick)(() => {
  139. if (!props.checkStrictly && props.lazy && props.multiple && node.checked) {
  140. const dataMap = {};
  141. const uncachedCheckedKeys = tree.value.getCheckedKeys();
  142. require_utils.treeEach([tree.value.store.root], (node) => dataMap[node.key] = node, (node) => node.childNodes);
  143. const cachedKeys = require_utils.toValidArray(props.modelValue).filter((item) => !(item in dataMap) && !uncachedCheckedKeys.includes(item));
  144. const childKeys = getChildCheckedKeys();
  145. update(cachedKeys.concat(childKeys));
  146. }
  147. });
  148. },
  149. cacheOptions
  150. };
  151. };
  152. //#endregion
  153. exports.useTree = useTree;
  154. //# sourceMappingURL=tree.js.map