useTree.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var virtualTree = require('../virtual-tree.js');
  5. var useCheck = require('./useCheck.js');
  6. var useFilter = require('./useFilter.js');
  7. var shared = require('@vue/shared');
  8. function useTree(props, emit) {
  9. const expandedKeySet = vue.ref(new Set(props.defaultExpandedKeys));
  10. const currentKey = vue.ref();
  11. const tree = vue.shallowRef();
  12. const listRef = vue.ref();
  13. vue.watch(() => props.currentNodeKey, (key) => {
  14. currentKey.value = key;
  15. }, {
  16. immediate: true
  17. });
  18. vue.watch(() => props.data, (data) => {
  19. setData(data);
  20. }, {
  21. immediate: true
  22. });
  23. const {
  24. isIndeterminate,
  25. isChecked,
  26. toggleCheckbox,
  27. getCheckedKeys,
  28. getCheckedNodes,
  29. getHalfCheckedKeys,
  30. getHalfCheckedNodes,
  31. setChecked,
  32. setCheckedKeys
  33. } = useCheck.useCheck(props, tree);
  34. const { doFilter, hiddenNodeKeySet, isForceHiddenExpandIcon } = useFilter.useFilter(props, tree);
  35. const valueKey = vue.computed(() => {
  36. var _a;
  37. return ((_a = props.props) == null ? void 0 : _a.value) || virtualTree.TreeOptionsEnum.KEY;
  38. });
  39. const childrenKey = vue.computed(() => {
  40. var _a;
  41. return ((_a = props.props) == null ? void 0 : _a.children) || virtualTree.TreeOptionsEnum.CHILDREN;
  42. });
  43. const disabledKey = vue.computed(() => {
  44. var _a;
  45. return ((_a = props.props) == null ? void 0 : _a.disabled) || virtualTree.TreeOptionsEnum.DISABLED;
  46. });
  47. const labelKey = vue.computed(() => {
  48. var _a;
  49. return ((_a = props.props) == null ? void 0 : _a.label) || virtualTree.TreeOptionsEnum.LABEL;
  50. });
  51. const flattenTree = vue.computed(() => {
  52. var _a;
  53. const expandedKeys = expandedKeySet.value;
  54. const hiddenKeys = hiddenNodeKeySet.value;
  55. const flattenNodes = [];
  56. const nodes = ((_a = tree.value) == null ? void 0 : _a.treeNodes) || [];
  57. const stack = [];
  58. for (let i = nodes.length - 1; i >= 0; --i) {
  59. stack.push(nodes[i]);
  60. }
  61. while (stack.length) {
  62. const node = stack.pop();
  63. if (hiddenKeys.has(node.key))
  64. continue;
  65. flattenNodes.push(node);
  66. if (node.children && expandedKeys.has(node.key)) {
  67. for (let i = node.children.length - 1; i >= 0; --i) {
  68. stack.push(node.children[i]);
  69. }
  70. }
  71. }
  72. return flattenNodes;
  73. });
  74. const isNotEmpty = vue.computed(() => {
  75. return flattenTree.value.length > 0;
  76. });
  77. function createTree(data) {
  78. const treeNodeMap = /* @__PURE__ */ new Map();
  79. const levelTreeNodeMap = /* @__PURE__ */ new Map();
  80. let maxLevel = 1;
  81. function traverse(nodes, level = 1, parent = void 0) {
  82. var _a;
  83. const siblings = [];
  84. for (const rawNode of nodes) {
  85. const value = getKey(rawNode);
  86. const node = {
  87. level,
  88. key: value,
  89. data: rawNode
  90. };
  91. node.label = getLabel(rawNode);
  92. node.parent = parent;
  93. const children = getChildren(rawNode);
  94. node.disabled = getDisabled(rawNode);
  95. node.isLeaf = !children || children.length === 0;
  96. if (children && children.length) {
  97. node.children = traverse(children, level + 1, node);
  98. }
  99. siblings.push(node);
  100. treeNodeMap.set(value, node);
  101. if (!levelTreeNodeMap.has(level)) {
  102. levelTreeNodeMap.set(level, []);
  103. }
  104. (_a = levelTreeNodeMap.get(level)) == null ? void 0 : _a.push(node);
  105. }
  106. if (level > maxLevel) {
  107. maxLevel = level;
  108. }
  109. return siblings;
  110. }
  111. const treeNodes = traverse(data);
  112. return {
  113. treeNodeMap,
  114. levelTreeNodeMap,
  115. maxLevel,
  116. treeNodes
  117. };
  118. }
  119. function filter(query) {
  120. const keys = doFilter(query);
  121. if (keys) {
  122. expandedKeySet.value = keys;
  123. }
  124. }
  125. function getChildren(node) {
  126. return node[childrenKey.value];
  127. }
  128. function getKey(node) {
  129. if (!node) {
  130. return "";
  131. }
  132. return node[valueKey.value];
  133. }
  134. function getDisabled(node) {
  135. return node[disabledKey.value];
  136. }
  137. function getLabel(node) {
  138. return node[labelKey.value];
  139. }
  140. function toggleExpand(node) {
  141. const expandedKeys = expandedKeySet.value;
  142. if (expandedKeys.has(node.key)) {
  143. collapseNode(node);
  144. } else {
  145. expandNode(node);
  146. }
  147. }
  148. function setExpandedKeys(keys) {
  149. const expandedKeys = /* @__PURE__ */ new Set();
  150. const nodeMap = tree.value.treeNodeMap;
  151. keys.forEach((k) => {
  152. let node = nodeMap.get(k);
  153. while (node && !expandedKeys.has(node.key)) {
  154. expandedKeys.add(node.key);
  155. node = node.parent;
  156. }
  157. });
  158. expandedKeySet.value = expandedKeys;
  159. }
  160. function handleNodeClick(node, e) {
  161. emit(virtualTree.NODE_CLICK, node.data, node, e);
  162. handleCurrentChange(node);
  163. if (props.expandOnClickNode) {
  164. toggleExpand(node);
  165. }
  166. if (props.showCheckbox && props.checkOnClickNode && !node.disabled) {
  167. toggleCheckbox(node, !isChecked(node), true);
  168. }
  169. }
  170. function handleNodeDrop(node, e) {
  171. emit(virtualTree.NODE_DROP, node.data, node, e);
  172. }
  173. function handleCurrentChange(node) {
  174. if (!isCurrent(node)) {
  175. currentKey.value = node.key;
  176. emit(virtualTree.CURRENT_CHANGE, node.data, node);
  177. }
  178. }
  179. function handleNodeCheck(node, checked) {
  180. toggleCheckbox(node, checked);
  181. }
  182. function expandNode(node) {
  183. const keySet = expandedKeySet.value;
  184. if (tree.value && props.accordion) {
  185. const { treeNodeMap } = tree.value;
  186. keySet.forEach((key) => {
  187. const treeNode = treeNodeMap.get(key);
  188. if (node && node.level === (treeNode == null ? void 0 : treeNode.level)) {
  189. keySet.delete(key);
  190. }
  191. });
  192. }
  193. keySet.add(node.key);
  194. emit(virtualTree.NODE_EXPAND, node.data, node);
  195. }
  196. function collapseNode(node) {
  197. expandedKeySet.value.delete(node.key);
  198. emit(virtualTree.NODE_COLLAPSE, node.data, node);
  199. }
  200. function isExpanded(node) {
  201. return expandedKeySet.value.has(node.key);
  202. }
  203. function isDisabled(node) {
  204. return !!node.disabled;
  205. }
  206. function isCurrent(node) {
  207. const current = currentKey.value;
  208. return current !== void 0 && current === node.key;
  209. }
  210. function getCurrentNode() {
  211. var _a, _b;
  212. if (!currentKey.value)
  213. return void 0;
  214. return (_b = (_a = tree.value) == null ? void 0 : _a.treeNodeMap.get(currentKey.value)) == null ? void 0 : _b.data;
  215. }
  216. function getCurrentKey() {
  217. return currentKey.value;
  218. }
  219. function setCurrentKey(key) {
  220. currentKey.value = key;
  221. }
  222. function setData(data) {
  223. vue.nextTick(() => tree.value = createTree(data));
  224. }
  225. function getNode(data) {
  226. var _a;
  227. const key = shared.isObject(data) ? getKey(data) : data;
  228. return (_a = tree.value) == null ? void 0 : _a.treeNodeMap.get(key);
  229. }
  230. function scrollToNode(key, strategy = "auto") {
  231. const node = getNode(key);
  232. if (node && listRef.value) {
  233. listRef.value.scrollToItem(flattenTree.value.indexOf(node), strategy);
  234. }
  235. }
  236. function scrollTo(offset) {
  237. var _a;
  238. (_a = listRef.value) == null ? void 0 : _a.scrollTo(offset);
  239. }
  240. return {
  241. tree,
  242. flattenTree,
  243. isNotEmpty,
  244. listRef,
  245. getKey,
  246. getChildren,
  247. toggleExpand,
  248. toggleCheckbox,
  249. isExpanded,
  250. isChecked,
  251. isIndeterminate,
  252. isDisabled,
  253. isCurrent,
  254. isForceHiddenExpandIcon,
  255. handleNodeClick,
  256. handleNodeDrop,
  257. handleNodeCheck,
  258. getCurrentNode,
  259. getCurrentKey,
  260. setCurrentKey,
  261. getCheckedKeys,
  262. getCheckedNodes,
  263. getHalfCheckedKeys,
  264. getHalfCheckedNodes,
  265. setChecked,
  266. setCheckedKeys,
  267. filter,
  268. setData,
  269. getNode,
  270. expandNode,
  271. collapseNode,
  272. setExpandedKeys,
  273. scrollToNode,
  274. scrollTo
  275. };
  276. }
  277. exports.useTree = useTree;
  278. //# sourceMappingURL=useTree.js.map