conductUtil.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import { note } from '../../vc-util/warning';
  2. function removeFromCheckedKeys(halfCheckedKeys, checkedKeys) {
  3. var filteredKeys = new Set();
  4. halfCheckedKeys.forEach(function (key) {
  5. if (!checkedKeys.has(key)) {
  6. filteredKeys.add(key);
  7. }
  8. });
  9. return filteredKeys;
  10. }
  11. export function isCheckDisabled(node) {
  12. var _ref = node || {},
  13. disabled = _ref.disabled,
  14. disableCheckbox = _ref.disableCheckbox,
  15. checkable = _ref.checkable;
  16. return !!(disabled || disableCheckbox) || checkable === false;
  17. }
  18. // Fill miss keys
  19. function fillConductCheck(keys, levelEntities, maxLevel, syntheticGetCheckDisabled) {
  20. var checkedKeys = new Set(keys);
  21. var halfCheckedKeys = new Set();
  22. // Add checked keys top to bottom
  23. for (var level = 0; level <= maxLevel; level += 1) {
  24. var entities = levelEntities.get(level) || new Set();
  25. entities.forEach(function (entity) {
  26. var key = entity.key,
  27. node = entity.node,
  28. _entity$children = entity.children,
  29. children = _entity$children === void 0 ? [] : _entity$children;
  30. if (checkedKeys.has(key) && !syntheticGetCheckDisabled(node)) {
  31. children.filter(function (childEntity) {
  32. return !syntheticGetCheckDisabled(childEntity.node);
  33. }).forEach(function (childEntity) {
  34. checkedKeys.add(childEntity.key);
  35. });
  36. }
  37. });
  38. }
  39. // Add checked keys from bottom to top
  40. var visitedKeys = new Set();
  41. for (var _level = maxLevel; _level >= 0; _level -= 1) {
  42. var _entities = levelEntities.get(_level) || new Set();
  43. _entities.forEach(function (entity) {
  44. var parent = entity.parent,
  45. node = entity.node;
  46. // Skip if no need to check
  47. if (syntheticGetCheckDisabled(node) || !entity.parent || visitedKeys.has(entity.parent.key)) {
  48. return;
  49. }
  50. // Skip if parent is disabled
  51. if (syntheticGetCheckDisabled(entity.parent.node)) {
  52. visitedKeys.add(parent.key);
  53. return;
  54. }
  55. var allChecked = true;
  56. var partialChecked = false;
  57. (parent.children || []).filter(function (childEntity) {
  58. return !syntheticGetCheckDisabled(childEntity.node);
  59. }).forEach(function (_ref2) {
  60. var key = _ref2.key;
  61. var checked = checkedKeys.has(key);
  62. if (allChecked && !checked) {
  63. allChecked = false;
  64. }
  65. if (!partialChecked && (checked || halfCheckedKeys.has(key))) {
  66. partialChecked = true;
  67. }
  68. });
  69. if (allChecked) {
  70. checkedKeys.add(parent.key);
  71. }
  72. if (partialChecked) {
  73. halfCheckedKeys.add(parent.key);
  74. }
  75. visitedKeys.add(parent.key);
  76. });
  77. }
  78. return {
  79. checkedKeys: Array.from(checkedKeys),
  80. halfCheckedKeys: Array.from(removeFromCheckedKeys(halfCheckedKeys, checkedKeys))
  81. };
  82. }
  83. // Remove useless key
  84. function cleanConductCheck(keys, halfKeys, levelEntities, maxLevel, syntheticGetCheckDisabled) {
  85. var checkedKeys = new Set(keys);
  86. var halfCheckedKeys = new Set(halfKeys);
  87. // Remove checked keys from top to bottom
  88. for (var level = 0; level <= maxLevel; level += 1) {
  89. var entities = levelEntities.get(level) || new Set();
  90. entities.forEach(function (entity) {
  91. var key = entity.key,
  92. node = entity.node,
  93. _entity$children2 = entity.children,
  94. children = _entity$children2 === void 0 ? [] : _entity$children2;
  95. if (!checkedKeys.has(key) && !halfCheckedKeys.has(key) && !syntheticGetCheckDisabled(node)) {
  96. children.filter(function (childEntity) {
  97. return !syntheticGetCheckDisabled(childEntity.node);
  98. }).forEach(function (childEntity) {
  99. checkedKeys.delete(childEntity.key);
  100. });
  101. }
  102. });
  103. }
  104. // Remove checked keys form bottom to top
  105. halfCheckedKeys = new Set();
  106. var visitedKeys = new Set();
  107. for (var _level2 = maxLevel; _level2 >= 0; _level2 -= 1) {
  108. var _entities2 = levelEntities.get(_level2) || new Set();
  109. _entities2.forEach(function (entity) {
  110. var parent = entity.parent,
  111. node = entity.node;
  112. // Skip if no need to check
  113. if (syntheticGetCheckDisabled(node) || !entity.parent || visitedKeys.has(entity.parent.key)) {
  114. return;
  115. }
  116. // Skip if parent is disabled
  117. if (syntheticGetCheckDisabled(entity.parent.node)) {
  118. visitedKeys.add(parent.key);
  119. return;
  120. }
  121. var allChecked = true;
  122. var partialChecked = false;
  123. (parent.children || []).filter(function (childEntity) {
  124. return !syntheticGetCheckDisabled(childEntity.node);
  125. }).forEach(function (_ref3) {
  126. var key = _ref3.key;
  127. var checked = checkedKeys.has(key);
  128. if (allChecked && !checked) {
  129. allChecked = false;
  130. }
  131. if (!partialChecked && (checked || halfCheckedKeys.has(key))) {
  132. partialChecked = true;
  133. }
  134. });
  135. if (!allChecked) {
  136. checkedKeys.delete(parent.key);
  137. }
  138. if (partialChecked) {
  139. halfCheckedKeys.add(parent.key);
  140. }
  141. visitedKeys.add(parent.key);
  142. });
  143. }
  144. return {
  145. checkedKeys: Array.from(checkedKeys),
  146. halfCheckedKeys: Array.from(removeFromCheckedKeys(halfCheckedKeys, checkedKeys))
  147. };
  148. }
  149. /**
  150. * Conduct with keys.
  151. * @param keyList current key list
  152. * @param keyEntities key - dataEntity map
  153. * @param mode `fill` to fill missing key, `clean` to remove useless key
  154. */
  155. export function conductCheck(keyList, checked, keyEntities, maxLevel, levelEntities, getCheckDisabled) {
  156. var warningMissKeys = [];
  157. var syntheticGetCheckDisabled;
  158. if (getCheckDisabled) {
  159. syntheticGetCheckDisabled = getCheckDisabled;
  160. } else {
  161. syntheticGetCheckDisabled = isCheckDisabled;
  162. }
  163. // We only handle exist keys
  164. var keys = new Set(keyList.filter(function (key) {
  165. var hasEntity = !!keyEntities[key];
  166. if (!hasEntity) {
  167. warningMissKeys.push(key);
  168. }
  169. return hasEntity;
  170. }));
  171. note(!warningMissKeys.length, "Tree missing follow keys: ".concat(warningMissKeys.slice(0, 100).map(function (key) {
  172. return "'".concat(key, "'");
  173. }).join(', ')));
  174. var result;
  175. if (checked === true) {
  176. result = fillConductCheck(keys, levelEntities, maxLevel, syntheticGetCheckDisabled);
  177. } else {
  178. result = cleanConductCheck(keys, checked.halfCheckedKeys, levelEntities, maxLevel, syntheticGetCheckDisabled);
  179. }
  180. return result;
  181. }