tree.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. import { getterForProp } from './column-prop-getters';
  6. /**
  7. * @param {?} prop
  8. * @return {?}
  9. */
  10. export function optionalGetterForProp(prop) {
  11. return prop && ((/**
  12. * @param {?} row
  13. * @return {?}
  14. */
  15. row => getterForProp(prop)(row, prop)));
  16. }
  17. /**
  18. * This functions rearrange items by their parents
  19. * Also sets the level value to each of the items
  20. *
  21. * Note: Expecting each item has a property called parentId
  22. * Note: This algorithm will fail if a list has two or more items with same ID
  23. * NOTE: This algorithm will fail if there is a deadlock of relationship
  24. *
  25. * For example,
  26. *
  27. * Input
  28. *
  29. * id -> parent
  30. * 1 -> 0
  31. * 2 -> 0
  32. * 3 -> 1
  33. * 4 -> 1
  34. * 5 -> 2
  35. * 7 -> 8
  36. * 6 -> 3
  37. *
  38. *
  39. * Output
  40. * id -> level
  41. * 1 -> 0
  42. * --3 -> 1
  43. * ----6 -> 2
  44. * --4 -> 1
  45. * 2 -> 0
  46. * --5 -> 1
  47. * 7 -> 8
  48. *
  49. *
  50. * @param {?} rows
  51. *
  52. * @param {?=} from
  53. * @param {?=} to
  54. * @return {?}
  55. */
  56. export function groupRowsByParents(rows, from, to) {
  57. if (from && to) {
  58. /** @type {?} */
  59. const nodeById = {};
  60. /** @type {?} */
  61. const l = rows.length;
  62. /** @type {?} */
  63. let node = null;
  64. nodeById[0] = new TreeNode(); // that's the root node
  65. // that's the root node
  66. /** @type {?} */
  67. const uniqIDs = rows.reduce((/**
  68. * @param {?} arr
  69. * @param {?} item
  70. * @return {?}
  71. */
  72. (arr, item) => {
  73. /** @type {?} */
  74. const toValue = to(item);
  75. if (arr.indexOf(toValue) === -1) {
  76. arr.push(toValue);
  77. }
  78. return arr;
  79. }), []);
  80. for (let i = 0; i < l; i++) {
  81. // make TreeNode objects for each item
  82. nodeById[to(rows[i])] = new TreeNode(rows[i]);
  83. }
  84. for (let i = 0; i < l; i++) {
  85. // link all TreeNode objects
  86. node = nodeById[to(rows[i])];
  87. /** @type {?} */
  88. let parent = 0;
  89. /** @type {?} */
  90. const fromValue = from(node.row);
  91. if (!!fromValue && uniqIDs.indexOf(fromValue) > -1) {
  92. parent = fromValue;
  93. }
  94. node.parent = nodeById[parent];
  95. node.row['level'] = node.parent.row['level'] + 1;
  96. node.parent.children.push(node);
  97. }
  98. /** @type {?} */
  99. let resolvedRows = [];
  100. nodeById[0].flatten((/**
  101. * @return {?}
  102. */
  103. function () {
  104. resolvedRows = [...resolvedRows, this.row];
  105. }), true);
  106. return resolvedRows;
  107. }
  108. else {
  109. return rows;
  110. }
  111. }
  112. class TreeNode {
  113. /**
  114. * @param {?=} row
  115. */
  116. constructor(row = null) {
  117. if (!row) {
  118. row = {
  119. level: -1,
  120. treeStatus: 'expanded'
  121. };
  122. }
  123. this.row = row;
  124. this.parent = null;
  125. this.children = [];
  126. }
  127. /**
  128. * @param {?} f
  129. * @param {?} recursive
  130. * @return {?}
  131. */
  132. flatten(f, recursive) {
  133. if (this.row['treeStatus'] === 'expanded') {
  134. for (let i = 0, l = this.children.length; i < l; i++) {
  135. /** @type {?} */
  136. const child = this.children[i];
  137. f.apply(child, Array.prototype.slice.call(arguments, 2));
  138. if (recursive)
  139. child.flatten.apply(child, arguments);
  140. }
  141. }
  142. }
  143. }
  144. if (false) {
  145. /** @type {?} */
  146. TreeNode.prototype.row;
  147. /** @type {?} */
  148. TreeNode.prototype.parent;
  149. /** @type {?} */
  150. TreeNode.prototype.children;
  151. }
  152. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bzd2ltbGFuZS9uZ3gtZGF0YXRhYmxlLyIsInNvdXJjZXMiOlsibGliL3V0aWxzL3RyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7QUFJdEQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBQXFCO0lBQ3pELE9BQU8sSUFBSSxJQUFJOzs7O0lBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFDLENBQUM7QUFDekQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNDRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsSUFBVyxFQUFFLElBQTBCLEVBQUUsRUFBd0I7SUFDbEcsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFOztjQUNSLFFBQVEsR0FBRyxFQUFFOztjQUNiLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTTs7WUFDakIsSUFBSSxHQUFvQixJQUFJO1FBRWhDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUMsdUJBQXVCOzs7Y0FFL0MsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNOzs7OztRQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFOztrQkFDbEMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDeEIsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUMvQixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ25CO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEdBQUUsRUFBRSxDQUFDO1FBRU4sS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixzQ0FBc0M7WUFDdEMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9DO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQiw0QkFBNEI7WUFDNUIsSUFBSSxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBQ3pCLE1BQU0sR0FBRyxDQUFDOztrQkFDUixTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDaEMsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2xELE1BQU0sR0FBRyxTQUFTLENBQUM7YUFDcEI7WUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakM7O1lBRUcsWUFBWSxHQUFVLEVBQUU7UUFDNUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87OztRQUFDO1lBQ2xCLFlBQVksR0FBRyxDQUFDLEdBQUcsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QyxDQUFDLEdBQUUsSUFBSSxDQUFDLENBQUM7UUFFVCxPQUFPLFlBQVksQ0FBQztLQUNyQjtTQUFNO1FBQ0wsT0FBTyxJQUFJLENBQUM7S0FDYjtBQUNILENBQUM7QUFFRCxNQUFNLFFBQVE7Ozs7SUFLWixZQUFZLE1BQWtCLElBQUk7UUFDaEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLEdBQUcsR0FBRztnQkFDSixLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNULFVBQVUsRUFBRSxVQUFVO2FBQ3ZCLENBQUM7U0FDSDtRQUNELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQzs7Ozs7O0lBRUQsT0FBTyxDQUFDLENBQU0sRUFBRSxTQUFrQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssVUFBVSxFQUFFO1lBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFOztzQkFDOUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELElBQUksU0FBUztvQkFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDdEQ7U0FDRjtJQUNILENBQUM7Q0FDRjs7O0lBekJDLHVCQUFnQjs7SUFDaEIsMEJBQW1COztJQUNuQiw0QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXR0ZXJGb3JQcm9wIH0gZnJvbSAnLi9jb2x1bW4tcHJvcC1nZXR0ZXJzJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uUHJvcCB9IGZyb20gJy4uL3R5cGVzL3RhYmxlLWNvbHVtbi50eXBlJztcblxuZXhwb3J0IHR5cGUgT3B0aW9uYWxWYWx1ZUdldHRlciA9IChyb3c6IGFueSkgPT4gYW55IHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsR2V0dGVyRm9yUHJvcChwcm9wOiBUYWJsZUNvbHVtblByb3ApOiBPcHRpb25hbFZhbHVlR2V0dGVyIHtcbiAgcmV0dXJuIHByb3AgJiYgKHJvdyA9PiBnZXR0ZXJGb3JQcm9wKHByb3ApKHJvdywgcHJvcCkpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb25zIHJlYXJyYW5nZSBpdGVtcyBieSB0aGVpciBwYXJlbnRzXG4gKiBBbHNvIHNldHMgdGhlIGxldmVsIHZhbHVlIHRvIGVhY2ggb2YgdGhlIGl0ZW1zXG4gKlxuICogTm90ZTogRXhwZWN0aW5nIGVhY2ggaXRlbSBoYXMgYSBwcm9wZXJ0eSBjYWxsZWQgcGFyZW50SWRcbiAqIE5vdGU6IFRoaXMgYWxnb3JpdGhtIHdpbGwgZmFpbCBpZiBhIGxpc3QgaGFzIHR3byBvciBtb3JlIGl0ZW1zIHdpdGggc2FtZSBJRFxuICogTk9URTogVGhpcyBhbGdvcml0aG0gd2lsbCBmYWlsIGlmIHRoZXJlIGlzIGEgZGVhZGxvY2sgb2YgcmVsYXRpb25zaGlwXG4gKlxuICogRm9yIGV4YW1wbGUsXG4gKlxuICogSW5wdXRcbiAqXG4gKiBpZCAtPiBwYXJlbnRcbiAqIDEgIC0+IDBcbiAqIDIgIC0+IDBcbiAqIDMgIC0+IDFcbiAqIDQgIC0+IDFcbiAqIDUgIC0+IDJcbiAqIDcgIC0+IDhcbiAqIDYgIC0+IDNcbiAqXG4gKlxuICogT3V0cHV0XG4gKiBpZCAtPiBsZXZlbFxuICogMSAgICAgIC0+IDBcbiAqIC0tMyAgICAtPiAxXG4gKiAtLS0tNiAgLT4gMlxuICogLS00ICAgIC0+IDFcbiAqIDIgICAgICAtPiAwXG4gKiAtLTUgICAgLT4gMVxuICogNyAgICAgLT4gOFxuICpcbiAqXG4gKiBAcGFyYW0gcm93c1xuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwUm93c0J5UGFyZW50cyhyb3dzOiBhbnlbXSwgZnJvbT86IE9wdGlvbmFsVmFsdWVHZXR0ZXIsIHRvPzogT3B0aW9uYWxWYWx1ZUdldHRlcik6IGFueVtdIHtcbiAgaWYgKGZyb20gJiYgdG8pIHtcbiAgICBjb25zdCBub2RlQnlJZCA9IHt9O1xuICAgIGNvbnN0IGwgPSByb3dzLmxlbmd0aDtcbiAgICBsZXQgbm9kZTogVHJlZU5vZGUgfCBudWxsID0gbnVsbDtcblxuICAgIG5vZGVCeUlkWzBdID0gbmV3IFRyZWVOb2RlKCk7IC8vIHRoYXQncyB0aGUgcm9vdCBub2RlXG5cbiAgICBjb25zdCB1bmlxSURzID0gcm93cy5yZWR1Y2UoKGFyciwgaXRlbSkgPT4ge1xuICAgICAgY29uc3QgdG9WYWx1ZSA9IHRvKGl0ZW0pO1xuICAgICAgaWYgKGFyci5pbmRleE9mKHRvVmFsdWUpID09PSAtMSkge1xuICAgICAgICBhcnIucHVzaCh0b1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSwgW10pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIC8vIG1ha2UgVHJlZU5vZGUgb2JqZWN0cyBmb3IgZWFjaCBpdGVtXG4gICAgICBub2RlQnlJZFt0byhyb3dzW2ldKV0gPSBuZXcgVHJlZU5vZGUocm93c1tpXSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIC8vIGxpbmsgYWxsIFRyZWVOb2RlIG9iamVjdHNcbiAgICAgIG5vZGUgPSBub2RlQnlJZFt0byhyb3dzW2ldKV07XG4gICAgICBsZXQgcGFyZW50ID0gMDtcbiAgICAgIGNvbnN0IGZyb21WYWx1ZSA9IGZyb20obm9kZS5yb3cpO1xuICAgICAgaWYgKCEhZnJvbVZhbHVlICYmIHVuaXFJRHMuaW5kZXhPZihmcm9tVmFsdWUpID4gLTEpIHtcbiAgICAgICAgcGFyZW50ID0gZnJvbVZhbHVlO1xuICAgICAgfVxuICAgICAgbm9kZS5wYXJlbnQgPSBub2RlQnlJZFtwYXJlbnRdO1xuICAgICAgbm9kZS5yb3dbJ2xldmVsJ10gPSBub2RlLnBhcmVudC5yb3dbJ2xldmVsJ10gKyAxO1xuICAgICAgbm9kZS5wYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzb2x2ZWRSb3dzOiBhbnlbXSA9IFtdO1xuICAgIG5vZGVCeUlkWzBdLmZsYXR0ZW4oZnVuY3Rpb24oKSB7XG4gICAgICByZXNvbHZlZFJvd3MgPSBbLi4ucmVzb2x2ZWRSb3dzLCB0aGlzLnJvd107XG4gICAgfSwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gcmVzb2x2ZWRSb3dzO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByb3dzO1xuICB9XG59XG5cbmNsYXNzIFRyZWVOb2RlIHtcbiAgcHVibGljIHJvdzogYW55O1xuICBwdWJsaWMgcGFyZW50OiBhbnk7XG4gIHB1YmxpYyBjaGlsZHJlbjogYW55W107XG5cbiAgY29uc3RydWN0b3Iocm93OiBhbnkgfCBudWxsID0gbnVsbCkge1xuICAgIGlmICghcm93KSB7XG4gICAgICByb3cgPSB7XG4gICAgICAgIGxldmVsOiAtMSxcbiAgICAgICAgdHJlZVN0YXR1czogJ2V4cGFuZGVkJ1xuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5yb3cgPSByb3c7XG4gICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgfVxuXG4gIGZsYXR0ZW4oZjogYW55LCByZWN1cnNpdmU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5yb3dbJ3RyZWVTdGF0dXMnXSA9PT0gJ2V4cGFuZGVkJykge1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgIGYuYXBwbHkoY2hpbGQsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMikpO1xuICAgICAgICBpZiAocmVjdXJzaXZlKSBjaGlsZC5mbGF0dGVuLmFwcGx5KGNoaWxkLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19