5c8d6d23865c04e88765cc06df20d22d1480b54201f95d05b2b961104a1c6ae8e7b49face241ff26301487ecd65a2f966ca651617debd17335cdefefbd8529 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import { ref, getCurrentInstance, watch, nextTick } from 'vue';
  2. import { NODE_CHECK, NODE_CHECK_CHANGE, SetOperationEnum } from '../virtual-tree.mjs';
  3. function useCheck(props, tree) {
  4. const checkedKeys = ref(/* @__PURE__ */ new Set());
  5. const indeterminateKeys = ref(/* @__PURE__ */ new Set());
  6. const { emit } = getCurrentInstance();
  7. watch([() => tree.value, () => props.defaultCheckedKeys], () => {
  8. return nextTick(() => {
  9. _setCheckedKeys(props.defaultCheckedKeys);
  10. });
  11. }, {
  12. immediate: true
  13. });
  14. const updateCheckedKeys = () => {
  15. if (!tree.value || !props.showCheckbox || props.checkStrictly) {
  16. return;
  17. }
  18. const { levelTreeNodeMap, maxLevel } = tree.value;
  19. const checkedKeySet = checkedKeys.value;
  20. const indeterminateKeySet = /* @__PURE__ */ new Set();
  21. for (let level = maxLevel - 1; level >= 1; --level) {
  22. const nodes = levelTreeNodeMap.get(level);
  23. if (!nodes)
  24. continue;
  25. nodes.forEach((node) => {
  26. const children = node.children;
  27. if (children) {
  28. let allChecked = true;
  29. let hasChecked = false;
  30. for (const childNode of children) {
  31. const key = childNode.key;
  32. if (checkedKeySet.has(key)) {
  33. hasChecked = true;
  34. } else if (indeterminateKeySet.has(key)) {
  35. allChecked = false;
  36. hasChecked = true;
  37. break;
  38. } else {
  39. allChecked = false;
  40. }
  41. }
  42. if (allChecked) {
  43. checkedKeySet.add(node.key);
  44. } else if (hasChecked) {
  45. indeterminateKeySet.add(node.key);
  46. checkedKeySet.delete(node.key);
  47. } else {
  48. checkedKeySet.delete(node.key);
  49. indeterminateKeySet.delete(node.key);
  50. }
  51. }
  52. });
  53. }
  54. indeterminateKeys.value = indeterminateKeySet;
  55. };
  56. const isChecked = (node) => checkedKeys.value.has(node.key);
  57. const isIndeterminate = (node) => indeterminateKeys.value.has(node.key);
  58. const toggleCheckbox = (node, isChecked2, nodeClick = true, immediateUpdate = true) => {
  59. const checkedKeySet = checkedKeys.value;
  60. const toggle = (node2, checked) => {
  61. checkedKeySet[checked ? SetOperationEnum.ADD : SetOperationEnum.DELETE](node2.key);
  62. const children = node2.children;
  63. if (!props.checkStrictly && children) {
  64. children.forEach((childNode) => {
  65. if (!childNode.disabled) {
  66. toggle(childNode, checked);
  67. }
  68. });
  69. }
  70. };
  71. toggle(node, isChecked2);
  72. if (immediateUpdate) {
  73. updateCheckedKeys();
  74. }
  75. if (nodeClick) {
  76. afterNodeCheck(node, isChecked2);
  77. }
  78. };
  79. const afterNodeCheck = (node, checked) => {
  80. const { checkedNodes, checkedKeys: checkedKeys2 } = getChecked();
  81. const { halfCheckedNodes, halfCheckedKeys } = getHalfChecked();
  82. emit(NODE_CHECK, node.data, {
  83. checkedKeys: checkedKeys2,
  84. checkedNodes,
  85. halfCheckedKeys,
  86. halfCheckedNodes
  87. });
  88. emit(NODE_CHECK_CHANGE, node.data, checked);
  89. };
  90. function getCheckedKeys(leafOnly = false) {
  91. return getChecked(leafOnly).checkedKeys;
  92. }
  93. function getCheckedNodes(leafOnly = false) {
  94. return getChecked(leafOnly).checkedNodes;
  95. }
  96. function getHalfCheckedKeys() {
  97. return getHalfChecked().halfCheckedKeys;
  98. }
  99. function getHalfCheckedNodes() {
  100. return getHalfChecked().halfCheckedNodes;
  101. }
  102. function getChecked(leafOnly = false) {
  103. const checkedNodes = [];
  104. const keys = [];
  105. if ((tree == null ? void 0 : tree.value) && props.showCheckbox) {
  106. const { treeNodeMap } = tree.value;
  107. checkedKeys.value.forEach((key) => {
  108. const node = treeNodeMap.get(key);
  109. if (node && (!leafOnly || leafOnly && node.isLeaf)) {
  110. keys.push(key);
  111. checkedNodes.push(node.data);
  112. }
  113. });
  114. }
  115. return {
  116. checkedKeys: keys,
  117. checkedNodes
  118. };
  119. }
  120. function getHalfChecked() {
  121. const halfCheckedNodes = [];
  122. const halfCheckedKeys = [];
  123. if ((tree == null ? void 0 : tree.value) && props.showCheckbox) {
  124. const { treeNodeMap } = tree.value;
  125. indeterminateKeys.value.forEach((key) => {
  126. const node = treeNodeMap.get(key);
  127. if (node) {
  128. halfCheckedKeys.push(key);
  129. halfCheckedNodes.push(node.data);
  130. }
  131. });
  132. }
  133. return {
  134. halfCheckedNodes,
  135. halfCheckedKeys
  136. };
  137. }
  138. function setCheckedKeys(keys) {
  139. checkedKeys.value.clear();
  140. indeterminateKeys.value.clear();
  141. nextTick(() => {
  142. _setCheckedKeys(keys);
  143. });
  144. }
  145. function setChecked(key, isChecked2) {
  146. if ((tree == null ? void 0 : tree.value) && props.showCheckbox) {
  147. const node = tree.value.treeNodeMap.get(key);
  148. if (node) {
  149. toggleCheckbox(node, isChecked2, false);
  150. }
  151. }
  152. }
  153. function _setCheckedKeys(keys) {
  154. if (tree == null ? void 0 : tree.value) {
  155. const { treeNodeMap } = tree.value;
  156. if (props.showCheckbox && treeNodeMap && (keys == null ? void 0 : keys.length) > 0) {
  157. for (const key of keys) {
  158. const node = treeNodeMap.get(key);
  159. if (node && !isChecked(node)) {
  160. toggleCheckbox(node, true, false, false);
  161. }
  162. }
  163. updateCheckedKeys();
  164. }
  165. }
  166. }
  167. return {
  168. updateCheckedKeys,
  169. toggleCheckbox,
  170. isChecked,
  171. isIndeterminate,
  172. getCheckedKeys,
  173. getCheckedNodes,
  174. getHalfCheckedKeys,
  175. getHalfCheckedNodes,
  176. setChecked,
  177. setCheckedKeys
  178. };
  179. }
  180. export { useCheck };
  181. //# sourceMappingURL=useCheck.mjs.map