conductUtil.js 7.0 KB

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