eaccd04b1f71d9dd36205d33fc7d9ad263e12d5f6b037949dcbf22d9555636d70cd54076ca0efc4ed62fa06006b1b0d036a422c95e2e0575dfddb7592abb82 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var util = require('../util.js');
  5. var shared = require('@vue/shared');
  6. var types = require('../../../../utils/types.js');
  7. function useTree(watcherData) {
  8. const expandRowKeys = vue.ref([]);
  9. const treeData = vue.ref({});
  10. const indent = vue.ref(16);
  11. const lazy = vue.ref(false);
  12. const lazyTreeNodeMap = vue.ref({});
  13. const lazyColumnIdentifier = vue.ref("hasChildren");
  14. const childrenColumnName = vue.ref("children");
  15. const checkStrictly = vue.ref(false);
  16. const instance = vue.getCurrentInstance();
  17. const normalizedData = vue.computed(() => {
  18. if (!watcherData.rowKey.value)
  19. return {};
  20. const data = watcherData.data.value || [];
  21. return normalize(data);
  22. });
  23. const normalizedLazyNode = vue.computed(() => {
  24. const rowKey = watcherData.rowKey.value;
  25. const keys = Object.keys(lazyTreeNodeMap.value);
  26. const res = {};
  27. if (!keys.length)
  28. return res;
  29. keys.forEach((key) => {
  30. if (lazyTreeNodeMap.value[key].length) {
  31. const item = { children: [] };
  32. lazyTreeNodeMap.value[key].forEach((row) => {
  33. const currentRowKey = util.getRowIdentity(row, rowKey);
  34. item.children.push(currentRowKey);
  35. if (row[lazyColumnIdentifier.value] && !res[currentRowKey]) {
  36. res[currentRowKey] = { children: [] };
  37. }
  38. });
  39. res[key] = item;
  40. }
  41. });
  42. return res;
  43. });
  44. const normalize = (data) => {
  45. const rowKey = watcherData.rowKey.value;
  46. const res = {};
  47. util.walkTreeNode(data, (parent, children, level) => {
  48. const parentId = util.getRowIdentity(parent, rowKey);
  49. if (shared.isArray(children)) {
  50. res[parentId] = {
  51. children: children.map((row) => util.getRowIdentity(row, rowKey)),
  52. level
  53. };
  54. } else if (lazy.value) {
  55. res[parentId] = {
  56. children: [],
  57. lazy: true,
  58. level
  59. };
  60. }
  61. }, childrenColumnName.value, lazyColumnIdentifier.value, lazy.value);
  62. return res;
  63. };
  64. const updateTreeData = (ifChangeExpandRowKeys = false, ifExpandAll) => {
  65. var _a, _b;
  66. ifExpandAll || (ifExpandAll = (_a = instance.store) == null ? void 0 : _a.states.defaultExpandAll.value);
  67. const nested = normalizedData.value;
  68. const normalizedLazyNode_ = normalizedLazyNode.value;
  69. const keys = Object.keys(nested);
  70. const newTreeData = {};
  71. if (keys.length) {
  72. const oldTreeData = vue.unref(treeData);
  73. const rootLazyRowKeys = [];
  74. const getExpanded = (oldValue, key) => {
  75. if (ifChangeExpandRowKeys) {
  76. if (expandRowKeys.value) {
  77. return ifExpandAll || expandRowKeys.value.includes(key);
  78. } else {
  79. return !!(ifExpandAll || (oldValue == null ? void 0 : oldValue.expanded));
  80. }
  81. } else {
  82. const included = ifExpandAll || expandRowKeys.value && expandRowKeys.value.includes(key);
  83. return !!((oldValue == null ? void 0 : oldValue.expanded) || included);
  84. }
  85. };
  86. keys.forEach((key) => {
  87. const oldValue = oldTreeData[key];
  88. const newValue = { ...nested[key] };
  89. newValue.expanded = getExpanded(oldValue, key);
  90. if (newValue.lazy) {
  91. const { loaded = false, loading = false } = oldValue || {};
  92. newValue.loaded = !!loaded;
  93. newValue.loading = !!loading;
  94. rootLazyRowKeys.push(key);
  95. }
  96. newTreeData[key] = newValue;
  97. });
  98. const lazyKeys = Object.keys(normalizedLazyNode_);
  99. if (lazy.value && lazyKeys.length && rootLazyRowKeys.length) {
  100. lazyKeys.forEach((key) => {
  101. var _a2;
  102. const oldValue = oldTreeData[key];
  103. const lazyNodeChildren = normalizedLazyNode_[key].children;
  104. if (rootLazyRowKeys.includes(key)) {
  105. if (((_a2 = newTreeData[key].children) == null ? void 0 : _a2.length) !== 0) {
  106. throw new Error("[ElTable]children must be an empty array.");
  107. }
  108. newTreeData[key].children = lazyNodeChildren;
  109. } else {
  110. const { loaded = false, loading = false } = oldValue || {};
  111. newTreeData[key] = {
  112. lazy: true,
  113. loaded: !!loaded,
  114. loading: !!loading,
  115. expanded: getExpanded(oldValue, key),
  116. children: lazyNodeChildren,
  117. level: void 0
  118. };
  119. }
  120. });
  121. }
  122. }
  123. treeData.value = newTreeData;
  124. (_b = instance.store) == null ? void 0 : _b.updateTableScrollY();
  125. };
  126. vue.watch(() => expandRowKeys.value, () => {
  127. updateTreeData(true);
  128. });
  129. vue.watch(() => normalizedData.value, () => {
  130. updateTreeData();
  131. });
  132. vue.watch(() => normalizedLazyNode.value, () => {
  133. updateTreeData();
  134. });
  135. const updateTreeExpandKeys = (value) => {
  136. expandRowKeys.value = value;
  137. updateTreeData();
  138. };
  139. const isUseLazy = (data) => {
  140. return lazy.value && data && "loaded" in data && !data.loaded;
  141. };
  142. const toggleTreeExpansion = (row, expanded) => {
  143. instance.store.assertRowKey();
  144. const rowKey = watcherData.rowKey.value;
  145. const id = util.getRowIdentity(row, rowKey);
  146. const data = id && treeData.value[id];
  147. if (id && data && "expanded" in data) {
  148. const oldExpanded = data.expanded;
  149. expanded = types.isUndefined(expanded) ? !data.expanded : expanded;
  150. treeData.value[id].expanded = expanded;
  151. if (oldExpanded !== expanded) {
  152. instance.emit("expand-change", row, expanded);
  153. }
  154. isUseLazy(data) && loadData(row, id, data);
  155. instance.store.updateTableScrollY();
  156. }
  157. };
  158. const loadOrToggle = (row) => {
  159. instance.store.assertRowKey();
  160. const rowKey = watcherData.rowKey.value;
  161. const id = util.getRowIdentity(row, rowKey);
  162. const data = treeData.value[id];
  163. if (isUseLazy(data)) {
  164. loadData(row, id, data);
  165. } else {
  166. toggleTreeExpansion(row, void 0);
  167. }
  168. };
  169. const loadData = (row, key, treeNode) => {
  170. const { load } = instance.props;
  171. if (load && !treeData.value[key].loaded) {
  172. treeData.value[key].loading = true;
  173. load(row, treeNode, (data) => {
  174. if (!shared.isArray(data)) {
  175. throw new TypeError("[ElTable] data must be an array");
  176. }
  177. treeData.value[key].loading = false;
  178. treeData.value[key].loaded = true;
  179. treeData.value[key].expanded = true;
  180. if (data.length) {
  181. lazyTreeNodeMap.value[key] = data;
  182. }
  183. instance.emit("expand-change", row, true);
  184. });
  185. }
  186. };
  187. const updateKeyChildren = (key, data) => {
  188. const { lazy: lazy2, rowKey } = instance.props;
  189. if (!lazy2)
  190. return;
  191. if (!rowKey)
  192. throw new Error("[Table] rowKey is required in updateKeyChild");
  193. if (lazyTreeNodeMap.value[key]) {
  194. lazyTreeNodeMap.value[key] = data;
  195. }
  196. };
  197. return {
  198. loadData,
  199. loadOrToggle,
  200. toggleTreeExpansion,
  201. updateTreeExpandKeys,
  202. updateTreeData,
  203. updateKeyChildren,
  204. normalize,
  205. states: {
  206. expandRowKeys,
  207. treeData,
  208. indent,
  209. lazy,
  210. lazyTreeNodeMap,
  211. lazyColumnIdentifier,
  212. childrenColumnName,
  213. checkStrictly
  214. }
  215. };
  216. }
  217. exports["default"] = useTree;
  218. //# sourceMappingURL=tree.js.map