util.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import _toConsumableArray from 'babel-runtime/helpers/toConsumableArray';
  2. import { getNodeChildren, convertTreeToEntities } from '../vc-tree/src/util';
  3. import { getSlots } from '../_util/props-util';
  4. var Record = {
  5. None: 'node',
  6. Start: 'start',
  7. End: 'end'
  8. };
  9. // TODO: Move this logic into `rc-tree`
  10. function traverseNodesKey(rootChildren, callback) {
  11. var nodeList = getNodeChildren(rootChildren) || [];
  12. function processNode(node) {
  13. var key = node.key;
  14. var children = getSlots(node)['default'];
  15. if (callback(key, node) !== false) {
  16. traverseNodesKey(typeof children === 'function' ? children() : children, callback);
  17. }
  18. }
  19. nodeList.forEach(processNode);
  20. }
  21. export function getFullKeyList(children) {
  22. var _convertTreeToEntitie = convertTreeToEntities(children),
  23. keyEntities = _convertTreeToEntitie.keyEntities;
  24. return [].concat(_toConsumableArray(keyEntities.keys()));
  25. }
  26. /** 计算选中范围,只考虑expanded情况以优化性能 */
  27. export function calcRangeKeys(rootChildren, expandedKeys, startKey, endKey) {
  28. var keys = [];
  29. var record = Record.None;
  30. if (startKey && startKey === endKey) {
  31. return [startKey];
  32. }
  33. if (!startKey || !endKey) {
  34. return [];
  35. }
  36. function matchKey(key) {
  37. return key === startKey || key === endKey;
  38. }
  39. traverseNodesKey(rootChildren, function (key) {
  40. if (record === Record.End) {
  41. return false;
  42. }
  43. if (matchKey(key)) {
  44. // Match test
  45. keys.push(key);
  46. if (record === Record.None) {
  47. record = Record.Start;
  48. } else if (record === Record.Start) {
  49. record = Record.End;
  50. return false;
  51. }
  52. } else if (record === Record.Start) {
  53. // Append selection
  54. keys.push(key);
  55. }
  56. if (expandedKeys.indexOf(key) === -1) {
  57. return false;
  58. }
  59. return true;
  60. });
  61. return keys;
  62. }
  63. export function convertDirectoryKeysToNodes(rootChildren, keys) {
  64. var restKeys = [].concat(_toConsumableArray(keys));
  65. var nodes = [];
  66. traverseNodesKey(rootChildren, function (key, node) {
  67. var index = restKeys.indexOf(key);
  68. if (index !== -1) {
  69. nodes.push(node);
  70. restKeys.splice(index, 1);
  71. }
  72. return !!restKeys.length;
  73. });
  74. return nodes;
  75. }
  76. export function getFullKeyListByTreeData(treeData) {
  77. var keys = [];
  78. (treeData || []).forEach(function (item) {
  79. keys.push(item.key);
  80. if (item.children) {
  81. keys = [].concat(_toConsumableArray(keys), _toConsumableArray(getFullKeyListByTreeData(item.children)));
  82. }
  83. });
  84. return keys;
  85. }