tree.js 11 KB

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