99da74ea2ddea1ac7bb9dbef12090f374a27b1d9680b46db56eabb415c83030753a348db87b2c41272355607868ffb43e2a28a80e9785b0af48c7bb22a6e1a 8.0 KB

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