@refinitiv-ui/efx-grid 6.0.158 → 6.0.160

Sign up to get free protection for your applications and to get access to all the features.
@@ -9153,6 +9153,12 @@ let Segment = function(rid, sharedObj) {
9153
9153
  };
9154
9154
  es6_Ext.inherits(Segment, es6_EventDispatcher);
9155
9155
 
9156
+ /** @public
9157
+ * @type {string}
9158
+ * @constant
9159
+ */
9160
+ const UNCATEGORY = "Uncategorized";
9161
+
9156
9162
  /** @private
9157
9163
  * @function
9158
9164
  * @param {string} a
@@ -9160,10 +9166,10 @@ es6_Ext.inherits(Segment, es6_EventDispatcher);
9160
9166
  * @return {number}
9161
9167
  */
9162
9168
  Segment._subSegSortLogic = function(a, b) {
9163
- if(a === "Uncategorized") {
9169
+ if(a === UNCATEGORY) {
9164
9170
  return 1;
9165
9171
  }
9166
- if(b === "Uncategorized") {
9172
+ if(b === UNCATEGORY) {
9167
9173
  return -1;
9168
9174
  }
9169
9175
 
@@ -9640,7 +9646,7 @@ Segment.prototype.classify = function(rows) {
9640
9646
 
9641
9647
  sharedObj.childToSegment[rid] = this._rid; // Relocate child in case of it has been moved to a non existence group
9642
9648
 
9643
- segmentName = "Uncategorized";
9649
+ segmentName = UNCATEGORY;
9644
9650
  if(val || val === 0 || val === false) { // Check for null, undefined, "", and NaN value
9645
9651
  segmentName = val + "";
9646
9652
  }
@@ -9716,13 +9722,6 @@ Segment.prototype.classify = function(rows) {
9716
9722
  }
9717
9723
  }
9718
9724
 
9719
- // Collecting all subsegments including all descendants and reassigning segment order.
9720
- if(rootSegment && this._subSegDef) {
9721
- if(segmentCount) {
9722
- this.calcSubSegmentOrder(0);
9723
- }
9724
- // this._subSegDef.classifierChanged = false;
9725
- }
9726
9725
  return true;
9727
9726
  };
9728
9727
  /** SubSegment implies being classified
@@ -9790,65 +9789,68 @@ Segment.prototype.getAllSubSegments = function(out_ary) {
9790
9789
  /** This method sets order, last order, and depth to entire tree structure in the segment, including the segment itself
9791
9790
  * @public
9792
9791
  * @param {number} counter
9793
- * @return {number}
9792
+ * @param {number} rootOrder
9793
+ * @param {Object} ridMap Row id map that stores row order of the entire tree
9794
+ * @return {number} Last order of the segment
9794
9795
  */
9795
- Segment.prototype.updateTreeStructure = function(counter) {
9796
+ Segment.prototype.updateTreeStructure = function(counter, rootOrder, ridMap) {
9796
9797
  if(!counter) {
9797
9798
  counter = 0;
9798
9799
  if(!this._subSegment) { // Subsegment's depth cannot be reset back to 0
9799
9800
  this._depth = 0; // WARNING: this assumes counter at 0 is the root segment
9800
9801
  }
9801
9802
  }
9802
- if(this.hasSubSegments()) {
9803
- return this.setLastOrder(counter); // Sub segments has already been calculated
9803
+ if(!rootOrder) {
9804
+ rootOrder = 0;
9804
9805
  }
9805
- let segmentSeparators = this._shared.segments;
9806
- let childCount = this._childIds.length;
9807
- let prevSeg = null;
9808
- for(let i = 0; i < childCount; ++i) {
9809
- let rid = this._childIds[i];
9810
- let segment = segmentSeparators[rid];
9811
- let segmentId = (segment) ? segment.getId() : "Uncategorized";
9812
- if(prevSeg !== segmentId) {
9813
- ++counter; // 0 become 1
9814
- prevSeg = segmentId;
9806
+ if(!ridMap) {
9807
+ ridMap = {};
9808
+ }
9809
+
9810
+ let i;
9811
+ let segmentNames = this._subSegNames;
9812
+ let subSegmentCount = segmentNames ? segmentNames.length : 0;
9813
+ if(subSegmentCount) { // Classified segment
9814
+ let segmentMap = this._subSegMap;
9815
+ for(i = 0; i < subSegmentCount; ++i) {
9816
+ let subSegment = segmentMap[segmentNames[i]];
9817
+ ++counter;
9818
+ ridMap[subSegment.getId()] = rootOrder + counter;
9819
+ subSegment.setOrder(counter);
9820
+ counter = subSegment.updateTreeStructure(counter, rootOrder, ridMap);
9815
9821
  }
9816
- if(segment) {
9817
- segment._depth = this._depth + 1;
9818
- segment.setOrder(counter);
9819
- counter = segment.updateTreeStructure(counter);
9822
+ } else {
9823
+ let childIds = this._childIds;
9824
+ let childCount = childIds.length;
9825
+ let segmentSeparators = this._shared.segments;
9826
+ let prevSeg = "";
9827
+ for(i = 0; i < childCount; ++i) {
9828
+ let childId = childIds[i];
9829
+ let childSegment = segmentSeparators[childId];
9830
+ let segmentId = (childSegment) ? childSegment.getId() : UNCATEGORY;
9831
+ if(prevSeg !== segmentId) {
9832
+ ++counter;
9833
+ prevSeg = segmentId;
9834
+ }
9835
+ ridMap[childId] = rootOrder + counter;
9836
+ if(childSegment) {
9837
+ childSegment._depth = this._depth + 1;
9838
+ childSegment.setOrder(counter);
9839
+ counter = childSegment.updateTreeStructure(counter, rootOrder, ridMap);
9840
+ }
9820
9841
  }
9821
9842
  }
9822
9843
 
9823
9844
  return this.setLastOrder(counter);
9824
9845
  };
9825
- /** @public
9846
+ /** Deprecated.
9847
+ * @ignore
9848
+ * @public
9849
+ * @function
9826
9850
  * @param {number} counter
9827
9851
  * @return {number}
9828
9852
  */
9829
- Segment.prototype.calcSubSegmentOrder = function(counter) {
9830
- if(!this.hasSubSegments()) {
9831
- return this.setLastOrder(counter);
9832
- }
9833
-
9834
- let segmentMap = this._subSegMap;
9835
- let childCount = this._subSegNames.length;
9836
- let prevSeg = null;
9837
- for(let i = 0; i < childCount; ++i) {
9838
- let segmentName = this._subSegNames[i];
9839
- let segment = segmentMap[segmentName];
9840
- let segmentId = (segment) ? segment.getId() : "Uncategorized";
9841
- if(prevSeg !== segmentId) {
9842
- ++counter; // 0 become 1
9843
- prevSeg = segmentId;
9844
- }
9845
- if(segment) {
9846
- segment.setOrder(counter);
9847
- counter = segment.calcSubSegmentOrder(counter);
9848
- }
9849
- }
9850
- return this.setLastOrder(counter);
9851
- };
9853
+ Segment.prototype.calcSubSegmentOrder = Segment.prototype.updateTreeStructure;
9852
9854
  /** @public
9853
9855
  * @return {number}
9854
9856
  */
@@ -9898,14 +9900,6 @@ Segment.prototype.getSubSegmentName = function(row) {
9898
9900
  return this._subSegName;
9899
9901
  };
9900
9902
  /**
9901
- * @private
9902
- * @param {!Segment} segment
9903
- * @returns {string}
9904
- */
9905
- let _toSegmentId = function(segment) {
9906
- return segment.getId();
9907
- };
9908
- /**
9909
9903
  * @public
9910
9904
  * @param {!Function} comparer
9911
9905
  * @returns {boolean} Returns true if there is any change
@@ -9915,26 +9909,17 @@ Segment.prototype.sortSegments = function(comparer) {
9915
9909
  return false;
9916
9910
  }
9917
9911
 
9918
- let segmentList = [];
9919
- let rids = [];
9920
9912
  let childIds = this._childIds;
9921
9913
  let childCount = childIds.length;
9922
9914
  let segments = this._shared.segments;
9923
9915
  for(let i = 0; i < childCount; ++i) {
9924
- let childId = childIds[i];
9925
- let childSegment = segments[childId];
9926
- if(childSegment) {
9927
- segmentList.push(childSegment);
9928
- } else {
9929
- rids.push(childId);
9916
+ if(segments[childIds[i]]) {
9917
+ this._childIds.sort(comparer); // Perform segment sorting only if children have at least one segment
9918
+ return true;
9930
9919
  }
9931
9920
  }
9932
- if(segmentList.length < 2) {
9933
- return false;
9934
- }
9935
- segmentList.sort(comparer);
9936
- this._childIds = rids.concat(segmentList.map(_toSegmentId));
9937
- return true;
9921
+
9922
+ return false;
9938
9923
  };
9939
9924
  /** Get segment id and ids of children, including nested segments, but excluding sub segments
9940
9925
  * @public
@@ -10048,28 +10033,15 @@ Segment.prototype.getCollapsingStates = function(objMap, parentState) {
10048
10033
  return dirty;
10049
10034
  };
10050
10035
 
10051
- /** @private
10052
- * @return {number}
10053
- */
10054
- Segment.prototype._getOrder = function() {
10055
- return this._order * 10000;
10056
- };
10057
- /** @private
10058
- * @return {number}
10059
- */
10060
- Segment.prototype._getLastOrder = function() {
10061
- return this._getOrder() + this._offsetOrder;
10062
- };
10063
10036
  /** @public
10064
10037
  * @return {number}
10065
10038
  */
10066
10039
  Segment.prototype.getOrder = function() {
10067
10040
  let ancestor = this.getFirstAncestor();
10068
10041
  if(ancestor) {
10069
- // WARNING: this._order cannot be greater than 9999
10070
- return ancestor._getOrder() + this._order;
10042
+ return ancestor._order + this._order;
10071
10043
  }
10072
- return this._getOrder();
10044
+ return this._order; // This is root order
10073
10045
  };
10074
10046
  /** Get the last (highest) order from the entire tree regardless of the current position segment in the hierachy
10075
10047
  * @public
@@ -10078,10 +10050,9 @@ Segment.prototype.getOrder = function() {
10078
10050
  Segment.prototype.getLastOrder = function() {
10079
10051
  let ancestor = this.getFirstAncestor();
10080
10052
  if(ancestor) {
10081
- // WARNING: this._order cannot be greater than 9999
10082
- return ancestor._getLastOrder();
10053
+ return ancestor.getLastOrder();
10083
10054
  }
10084
- return this._getLastOrder();
10055
+ return this._order + this._offsetOrder; // This is root last order
10085
10056
  };
10086
10057
  /** @public
10087
10058
  * @param {number} val
@@ -10089,12 +10060,13 @@ Segment.prototype.getLastOrder = function() {
10089
10060
  Segment.prototype.setOrder = function(val) {
10090
10061
  this._order = val;
10091
10062
  };
10092
- /** @public
10063
+ /** WARNING: This actually sets offset from the starting order
10064
+ * @public
10093
10065
  * @param {number} val
10094
10066
  * @returns {number} Returns the number set
10095
10067
  */
10096
10068
  Segment.prototype.setLastOrder = function(val) {
10097
- return (this._offsetOrder = val);
10069
+ return (this._offsetOrder = val); // WARNING: this._offsetOrder cannot be greater than 9999
10098
10070
  };
10099
10071
 
10100
10072
  /** @private
@@ -10162,7 +10134,7 @@ Segment.prototype.log = function(lines, tabLevel) {
10162
10134
  };
10163
10135
 
10164
10136
 
10165
- /* harmony default export */ const data_Segment = (Segment);
10137
+ /* harmony default export */ const data_Segment = ((/* unused pure expression or super */ null && (Segment)));
10166
10138
 
10167
10139
 
10168
10140
  ;// CONCATENATED MODULE: ./node_modules/@grid/core/es6/data/SegmentCollection.js
@@ -10210,7 +10182,7 @@ SegmentCollection.prototype._shared;
10210
10182
  /** @type {Array.<Segment>}
10211
10183
  * @private
10212
10184
  */
10213
- SegmentCollection.prototype._segmentList = null; // Array of main segments
10185
+ SegmentCollection.prototype._segmentList = null; // Array of main/root segments
10214
10186
  /** @type {Array.<Segment>}
10215
10187
  * @private
10216
10188
  */
@@ -10227,6 +10199,10 @@ SegmentCollection.prototype._classification = false;
10227
10199
  * @private
10228
10200
  */
10229
10201
  SegmentCollection.prototype._classifierChanged = false;
10202
+ /** @type {Object.<string, number>}
10203
+ * @private
10204
+ */
10205
+ SegmentCollection.prototype._rowOrders = null;
10230
10206
 
10231
10207
  /** @public
10232
10208
  */
@@ -10234,7 +10210,7 @@ SegmentCollection.prototype.dispose = function() {
10234
10210
  this.removeAllSegments();
10235
10211
  this.removeAllEventListeners();
10236
10212
  this._collapsedRids = null;
10237
- this._segmentList = this._insertionList = this._removalList = null;
10213
+ this._segmentList = this._rowOrders = this._insertionList = this._removalList = null;
10238
10214
  };
10239
10215
  /** @public
10240
10216
  * @param {string} rid
@@ -10243,11 +10219,11 @@ SegmentCollection.prototype.dispose = function() {
10243
10219
  */
10244
10220
  SegmentCollection.prototype.addSegment = function(rid, childRids) {
10245
10221
  if(rid && !this._segments[rid]) {
10246
- let segment = this._segments[rid] = new data_Segment(rid, this._shared);
10222
+ let segment = this._segments[rid] = new Segment(rid, this._shared);
10247
10223
  segment.addEventListener("subSegmentAdded", this._onSubSegmentAdded);
10248
10224
  segment.addEventListener("subSegmentRemoved", this._onSubSegmentRemoved);
10249
10225
  ++this._segmentCount;
10250
- this._segmentList = null; // order could be changed
10226
+ this.invalidateSegmentOrder(); // order could be changed
10251
10227
 
10252
10228
  if(childRids && childRids.length) {
10253
10229
  segment.addChildren(childRids);
@@ -10323,6 +10299,7 @@ SegmentCollection.prototype.removeSegment = function(rid) {
10323
10299
 
10324
10300
  delete this._segments[rid]; // Slow
10325
10301
  --this._segmentCount;
10302
+ this.invalidateSegmentOrder();
10326
10303
  return true;
10327
10304
  };
10328
10305
  /** @public
@@ -10335,7 +10312,7 @@ SegmentCollection.prototype.removeAllSegments = function() {
10335
10312
  }
10336
10313
  this._segments = {};
10337
10314
  this._segmentCount = 0;
10338
- this._segmentList = null;
10315
+ this._segmentList = this._rowOrders = null;
10339
10316
  this._shared.segments = this._segments;
10340
10317
  this._shared.childToSegment = {};
10341
10318
 
@@ -10396,6 +10373,7 @@ SegmentCollection.prototype.sortSegments = function(comparer) {
10396
10373
  }
10397
10374
  }
10398
10375
  rootSegments.sort(comparer);
10376
+ this.invalidateSegmentOrder();
10399
10377
  return rootSegments;
10400
10378
  };
10401
10379
 
@@ -10491,28 +10469,14 @@ SegmentCollection.prototype.getCollapsedRows = function() {
10491
10469
  return this._collapsedRids;
10492
10470
  };
10493
10471
 
10494
- /** Invalidate segment order cache, if the given row id is a segment separator
10495
- * @private
10496
- * @param {string|Array.<string>} segmentIds
10472
+ /** Invalidate segment order cache
10473
+ * @public
10497
10474
  * @returns {boolean} Returns true if there is any change
10498
10475
  */
10499
- SegmentCollection.prototype._invalidateSegmentOrder = function(segmentIds) {
10476
+ SegmentCollection.prototype.invalidateSegmentOrder = function() {
10500
10477
  if(this._segmentList) {
10501
- if(typeof segmentIds === "string") {
10502
- if(this._segments[segmentIds]) {
10503
- this._segmentList = null;
10504
- return true;
10505
- }
10506
- } else if(Array.isArray(segmentIds)) {
10507
- let len = segmentIds.length;
10508
- for(let i = 0; i < len; ++i) {
10509
- let segmentId = segmentIds[i];
10510
- if(this._segments[segmentId]) {
10511
- this._segmentList = null;
10512
- return true;
10513
- }
10514
- }
10515
- }
10478
+ this._segmentList = this._rowOrders = null;
10479
+ return true;
10516
10480
  }
10517
10481
  return false;
10518
10482
  };
@@ -10526,7 +10490,7 @@ SegmentCollection.prototype.addSegmentChild = function(segmentId, rid, dataId) {
10526
10490
  let segment = this._segments[segmentId];
10527
10491
  if(segment && !segment.isSubSegment()) {
10528
10492
  // If a segment becomes a child of other segment, then the segment order needs to be recalculated
10529
- this._invalidateSegmentOrder(rid);
10493
+ this.invalidateSegmentOrder();
10530
10494
  return segment.addChild(rid, dataId);
10531
10495
  }
10532
10496
  return false;
@@ -10541,7 +10505,7 @@ SegmentCollection.prototype.addSegmentChildren = function(segmentId, rids, dataI
10541
10505
  let segment = this._segments[segmentId];
10542
10506
  if(segment && !segment.isSubSegment()) {
10543
10507
  // If a segment becomes a child of other segment, then the segment order needs to be recalculated
10544
- this._invalidateSegmentOrder(rids);
10508
+ this.invalidateSegmentOrder();
10545
10509
  return segment.addChildren(rids, dataIds);
10546
10510
  }
10547
10511
  return false;
@@ -10567,7 +10531,7 @@ SegmentCollection.prototype.containsSegmentChild = function(segmentId, rid) {
10567
10531
  SegmentCollection.prototype.removeSegmentChild = function(segmentId, rid) {
10568
10532
  let segment = this._segments[segmentId];
10569
10533
  if(segment) {
10570
- this._invalidateSegmentOrder(rid);
10534
+ this.invalidateSegmentOrder();
10571
10535
  return segment.removeChild(rid);
10572
10536
  }
10573
10537
  return false;
@@ -10580,7 +10544,7 @@ SegmentCollection.prototype.removeSegmentChild = function(segmentId, rid) {
10580
10544
  SegmentCollection.prototype.removeSegmentChildren = function(segmentId, rids) {
10581
10545
  let segment = this._segments[segmentId];
10582
10546
  if(segment) {
10583
- this._invalidateSegmentOrder(rids);
10547
+ this.invalidateSegmentOrder();
10584
10548
  return segment.removeChildren(rids);
10585
10549
  }
10586
10550
  return false;
@@ -10600,7 +10564,7 @@ SegmentCollection.prototype.removeAllSegmentChildren = function() {
10600
10564
  }
10601
10565
 
10602
10566
  if(dirty) {
10603
- this._segmentList = null; // WARNING: not optimized
10567
+ this.invalidateSegmentOrder();
10604
10568
  this.classify(null);
10605
10569
  }
10606
10570
 
@@ -10630,6 +10594,7 @@ SegmentCollection.prototype.fillSegment = function(segmentId, rids) {
10630
10594
  }
10631
10595
  curSegment.addChild(rid);
10632
10596
  }
10597
+ this.invalidateSegmentOrder();
10633
10598
  }
10634
10599
  }
10635
10600
  };
@@ -10655,8 +10620,19 @@ SegmentCollection.prototype.fillSegments = function(rids) {
10655
10620
  change = true;
10656
10621
  }
10657
10622
  }
10623
+ if(change) {
10624
+ this.invalidateSegmentOrder();
10625
+ }
10658
10626
  return change;
10659
10627
  };
10628
+
10629
+ /** The number represent maximum nested segments that can be created in a single segment
10630
+ * @private
10631
+ * @type {number}
10632
+ * @constant
10633
+ */
10634
+ const SEGMENT_STEP = 10000;
10635
+
10660
10636
  /** @public
10661
10637
  * @param {Array.<string>} rids
10662
10638
  * @param {boolean=} useCache=false If this is true, skip the calculation when there is already a cache for segment order
@@ -10672,21 +10648,29 @@ SegmentCollection.prototype.calcSegmentOrder = function(rids, useCache) {
10672
10648
  segmentList = this._segmentList = [];
10673
10649
  }
10674
10650
 
10675
- let ridCount = rids ? rids.length : 0;
10651
+ this._rowOrders = {};
10652
+ let rowOrders = this._rowOrders;
10676
10653
  let segmentSeparators = this._segments;
10677
- let segmentCount = this._segmentCount;
10654
+ let childToSegmentId = this._shared.childToSegment;
10655
+ let prevSeg = UNCATEGORY;
10656
+ let ridCount = rids ? rids.length : 0;
10678
10657
  let order = 0;
10679
10658
  for(let i = 0; i < ridCount; ++i) {
10680
10659
  let rid = rids[i];
10681
- let segment = segmentSeparators[rid];
10682
- if(segment) {
10683
- if(segment.isRootSegment()) {
10684
- this._segmentList.push(segment);
10685
- segment.setOrder(++order); // WARNING: Segments and sub segments start with 1
10686
- segment.updateTreeStructure(0);
10660
+ if(!childToSegmentId[rid]) {
10661
+ let segment = segmentSeparators[rid];
10662
+ let segmentId = (segment) ? segment.getId() : UNCATEGORY;
10663
+ if(prevSeg !== segmentId) {
10664
+ ++order; // WARNING: Segments and sub segments start with 1
10665
+ prevSeg = segmentId;
10687
10666
  }
10688
- if(--segmentCount <= 0) {
10689
- break;
10667
+
10668
+ let rootOrder = order * SEGMENT_STEP;
10669
+ rowOrders[rid] = rootOrder;
10670
+ if(segment) {
10671
+ this._segmentList.push(segment);
10672
+ segment.setOrder(rootOrder);
10673
+ segment.updateTreeStructure(0, rootOrder, rowOrders);
10690
10674
  }
10691
10675
  }
10692
10676
  }
@@ -10695,57 +10679,33 @@ SegmentCollection.prototype.calcSegmentOrder = function(rids, useCache) {
10695
10679
  * @param {!Array.<string>} rids Array of row ids
10696
10680
  * @param {boolean=} partial Indicating that the given ids are not the whole list
10697
10681
  * @return {Array.<number>} Returns Array of segment values, if there are at least one segment, otherwise returns null
10698
- */ //
10682
+ */
10699
10683
  SegmentCollection.prototype.getSegmentValues = function(rids, partial) {
10700
10684
  let rowCount = rids ? rids.length : 0;
10701
10685
  if(!rowCount) {
10702
10686
  return null;
10703
10687
  }
10704
- let segmentSeparators = this._segments;
10705
- let childToSegmentId = this._shared.childToSegment;
10706
- let curSegment = null;
10707
- let prevSegment = null;
10688
+ let rowOrders = this._rowOrders;
10689
+ if(!rowOrders) { // calcSegmentOrder has not been called (no cache detected)
10690
+ return null;
10691
+ }
10692
+
10708
10693
  let segmentValues = new Array(rowCount);
10709
- let segmentVal = 0;
10710
10694
  let highestVal = 0;
10711
- let offset = 0;
10712
10695
  for(let r = 0; r < rowCount; ++r) {
10713
10696
  let rid = rids[r];
10714
- curSegment = segmentSeparators[rid];
10715
- if(curSegment) { // segment separator
10716
- segmentVal = curSegment.getOrder() * 100;
10717
- offset = 0;
10718
- if(curSegment.isRootSegment()) {
10719
- if(prevSegment !== curSegment) {
10720
- prevSegment = curSegment;
10721
- highestVal = curSegment.getLastOrder() * 100;
10722
- }
10697
+ let segmentVal = rowOrders[rid];
10698
+ if(segmentVal != null) {
10699
+ if(highestVal < segmentVal) {
10700
+ highestVal = segmentVal;
10723
10701
  }
10724
10702
  } else {
10725
- let parentId = childToSegmentId[rid];
10726
- if(parentId) { // segment member
10727
- curSegment = segmentSeparators[parentId];
10728
- segmentVal = curSegment.getOrder() * 100;
10729
- offset = 1;
10730
- if(partial) { // This fixes the out of order sub segment
10731
- highestVal = curSegment.getLastOrder() * 100;
10732
- }
10733
- } else { // row outside of segments
10734
- if(highestVal) {
10735
- if(segmentVal < highestVal) {
10736
- segmentVal = highestVal;
10737
- }
10738
- offset = 10;
10739
- } else {
10740
- segmentVal = offset = 0;
10741
- }
10742
- }
10703
+ segmentVal = highestVal ? highestVal + SEGMENT_STEP : 0;
10743
10704
  }
10744
-
10745
- segmentValues[r] = segmentVal + offset;
10705
+ segmentValues[r] = segmentVal;
10746
10706
  }
10747
10707
 
10748
- return prevSegment ? segmentValues : null;
10708
+ return highestVal ? segmentValues : null;
10749
10709
  };
10750
10710
  /** @public
10751
10711
  * @return {string}
@@ -10834,6 +10794,7 @@ SegmentCollection.prototype.classify = function(rows) {
10834
10794
  }
10835
10795
  }
10836
10796
  if(this._insertionList.length || this._removalList.length) {
10797
+ this.invalidateSegmentOrder();
10837
10798
  this._dispatch("subSegmentChanged", {
10838
10799
  "insertionList": this._insertionList,
10839
10800
  "removalList": this._removalList
@@ -10990,7 +10951,6 @@ DataTable.prototype._classifyingTimer = 0;
10990
10951
  */
10991
10952
  DataTable.prototype._segmentDefaultCollapsing = false;
10992
10953
 
10993
-
10994
10954
  /** @typedef {Function} DataTable~SortLogic
10995
10955
  * @description SortLogic function is used for comparison between two values during sorting. <br>
10996
10956
  * The function should return:<br>
@@ -11100,6 +11060,7 @@ DataTable.prototype.getPreviousData = function(rid, cid) {
11100
11060
  return null;
11101
11061
  };
11102
11062
 
11063
+
11103
11064
  /** Set data to individual cell
11104
11065
  * @override
11105
11066
  * @param {string} rid Row Id
@@ -11180,7 +11141,10 @@ DataTable.prototype.setRowData = function(rid, values, eventArg) { // Data chang
11180
11141
  this._rids.push(rid);
11181
11142
  } else {
11182
11143
  this._rids.splice(rowIndex, 0, rid);
11183
- segmentChanged = !this._isLastSegment(rowIndex);
11144
+ if(this._segments) { // for no sorting case
11145
+ this._segments.invalidateSegmentOrder();
11146
+ }
11147
+ segmentChanged = !this._isLastSegment(rowIndex); // This is slow. Check if this is required
11184
11148
  }
11185
11149
  } else {
11186
11150
  this._rids.push(rid);
@@ -11625,7 +11589,7 @@ DataTable.prototype.moveRow = function(fromIndex, toIndex, suppressEvent) {
11625
11589
 
11626
11590
  if(output) {
11627
11591
  if(this._segments) {
11628
- this._segments.calcSegmentOrder(this._rids);
11592
+ this._segments.invalidateSegmentOrder();
11629
11593
  this._sort(null); // Reorder segment members
11630
11594
  }
11631
11595
  this._dispatchPositionChange(suppressEvent);
@@ -11882,6 +11846,9 @@ DataTable.prototype.freeze = function(bool) {
11882
11846
  let prevState = this._frozen;
11883
11847
  if(prevState !== bool) {
11884
11848
  this._frozen = bool;
11849
+ if(!bool && this._segments) { // for no sorting case
11850
+ this._segments.invalidateSegmentOrder();
11851
+ }
11885
11852
  this._autoFillSegments();
11886
11853
  this.dispatchGlobalChange();
11887
11854
  }
@@ -11948,9 +11915,6 @@ DataTable.prototype.setSegmentSeparators = function(rids, enabled) {
11948
11915
  }
11949
11916
  }
11950
11917
  }
11951
- if (segmentAdded) {
11952
- this._segments.calcSegmentOrder(this._rids);
11953
- }
11954
11918
  let changed = segmentAdded || segmentRemoved;
11955
11919
  if(changed && this._needFiring()) {
11956
11920
  this.dispatchGlobalChange();
@@ -11978,7 +11942,6 @@ DataTable.prototype.setSegmentSeparator = function(rid, options) {
11978
11942
  }
11979
11943
  let children = (options && options["children"]) ? options["children"] : null;
11980
11944
  if(this._segments.addSegment(rid, children)) {
11981
- this._segments.calcSegmentOrder(this._rids);
11982
11945
  change = true;
11983
11946
  }
11984
11947
  } else if(this._segments) { // Remove the separator
@@ -12103,6 +12066,7 @@ DataTable.prototype.getSegmentParentRowId = function(rid) {
12103
12066
  */
12104
12067
  DataTable.prototype.getSegmentValues = function(rids, partial) {
12105
12068
  if(this._segments) {
12069
+ this._segments.calcSegmentOrder(this._rids, true); // use cache
12106
12070
  return this._segments.getSegmentValues(rids || this._rids, partial);
12107
12071
  }
12108
12072
  return null;
@@ -12180,9 +12144,6 @@ DataTable.prototype.fillSegments = function() {
12180
12144
  * @param {boolean=} adding This indicates that segment is changed by adding a new child
12181
12145
  */
12182
12146
  DataTable.prototype._onSegmentChildChanged = function(adding) {
12183
- if(this._segments) {
12184
- this._segments.calcSegmentOrder(this._rids, true);
12185
- }
12186
12147
  if(adding !== false) {
12187
12148
  this._sort(null);
12188
12149
  }
@@ -12371,7 +12332,6 @@ DataTable.prototype.sortSegments = function (compare) {
12371
12332
  return false;
12372
12333
  }
12373
12334
  if(typeof compare !== "function") {
12374
- this._segments.calcSegmentOrder(this._rids);
12375
12335
  return false;
12376
12336
  }
12377
12337
 
@@ -12406,7 +12366,6 @@ DataTable.prototype.sortSegments = function (compare) {
12406
12366
  }
12407
12367
 
12408
12368
  if(dirty) {
12409
- this._segments.calcSegmentOrder(rids);
12410
12369
  this._sort(null);
12411
12370
  this._dispatchPositionChange();
12412
12371
  }
@@ -12414,18 +12373,34 @@ DataTable.prototype.sortSegments = function (compare) {
12414
12373
  };
12415
12374
  /** Sort all of existing segments by given compare function
12416
12375
  * @private
12417
- * @param {tr.Segment} segmentA
12418
- * @param {tr.Segment} segmentB
12376
+ * @param {*} rowA
12377
+ * @param {*} rowB
12419
12378
  * @return {number}
12420
12379
  */
12421
- DataTable.prototype._bySegmentSeparator = function (segmentA, segmentB) {
12380
+ DataTable.prototype._bySegmentSeparator = function (rowA, rowB) {
12422
12381
  return /** @type{number} */(this._userSegmentComparer(
12423
- this.getRowData(segmentA.getId()),
12424
- this.getRowData(segmentB.getId()),
12382
+ this._getRowDataFromSegment(rowA),
12383
+ this._getRowDataFromSegment(rowB),
12425
12384
  this._segmentSortOrder,
12426
12385
  this._segmentSortContext
12427
12386
  ));
12428
12387
  };
12388
+ /** Get row data from either Segment or row id
12389
+ * @private
12390
+ * @param {*} obj
12391
+ * @return {Object}
12392
+ */
12393
+ DataTable.prototype._getRowDataFromSegment = function (obj) {
12394
+ var rowData = null;
12395
+ if(obj) {
12396
+ if(typeof obj == "string") {
12397
+ rowData = this.getRowData(obj);
12398
+ } else if(obj.getId) {
12399
+ rowData = this.getRowData(obj.getId());
12400
+ }
12401
+ }
12402
+ return rowData;
12403
+ };
12429
12404
 
12430
12405
  /** A data source to be used with segment classification
12431
12406
  * @public
@@ -29983,6 +29958,7 @@ DataView.prototype.getAllRowData = function() {
29983
29958
  return this.getMultipleRowData(this.getAllRowIds(true));
29984
29959
  };
29985
29960
 
29961
+
29986
29962
  /** @public
29987
29963
  * @param {string} rid
29988
29964
  * @param {string} cid
@@ -36834,7 +36810,7 @@ Core.prototype._hasPendingRowChange = false;
36834
36810
  * @return {string}
36835
36811
  */
36836
36812
  Core.getVersion = function () {
36837
- return "5.1.140";
36813
+ return "5.2.2";
36838
36814
  };
36839
36815
  /** {@link ElementWrapper#dispose}
36840
36816
  * @override
@@ -40504,6 +40480,9 @@ Core.prototype.initSimpleTable = function (columns) {
40504
40480
  colCount = columns.length;
40505
40481
  this.setColumnCount(colCount);
40506
40482
  this.setDataColumnMap(columns);
40483
+ for(let c = 0; c < colCount; ++c) {
40484
+ this.setColumnField(c, columns[c]);
40485
+ }
40507
40486
  }
40508
40487
 
40509
40488
  let titleSect = this.addSection("title");
@@ -43272,6 +43251,12 @@ RowDefSorter.prototype._multiColumnsSorter = function(rowDefA, rowDefB, primaryO
43272
43251
  * @property {Array.<string>} sortedFields An array of sortedField
43273
43252
  */
43274
43253
 
43254
+ /** @private
43255
+ * @type {string}
43256
+ *@constant
43257
+ */
43258
+ const SortableTitlePlugin_ROW_DEF = "ROW_DEF";
43259
+
43275
43260
  /** @constructor
43276
43261
  * @extends {EventDispatcher}
43277
43262
  * @param {SortableTitlePlugin.Options=} options
@@ -43287,6 +43272,7 @@ let SortableTitlePlugin = function (options) { // TODO: Extract SortableTitlePlu
43287
43272
  _t._onColumnRemoved = _t._onColumnRemoved.bind(_t);
43288
43273
  _t._onItemSortingClicked = _t._onItemSortingClicked.bind(_t);
43289
43274
  _t.refresh = _t.refresh.bind(_t);
43275
+ _t._rowDefSorter = _t._rowDefSorter.bind(_t);
43290
43276
 
43291
43277
  _t._hosts = [];
43292
43278
  _t._sortLogic = {};
@@ -43448,6 +43434,11 @@ SortableTitlePlugin.prototype._frozenIndicator = false;
43448
43434
  * @type {boolean}
43449
43435
  */
43450
43436
  SortableTitlePlugin.prototype._rowDefMode = false;
43437
+ /**
43438
+ * @private
43439
+ * @type {Function}
43440
+ */
43441
+ SortableTitlePlugin.prototype._userComparer = null;
43451
43442
 
43452
43443
  /** @private
43453
43444
  * @type {!Object.<string, string>}
@@ -44624,6 +44615,21 @@ SortableTitlePlugin.prototype.setSortingSequence = function (sequence, colRef) {
44624
44615
  SortableTitlePlugin.prototype.clearAllColumnSortingSequences = function () {
44625
44616
  this._sortingSequenceMap = null;
44626
44617
  };
44618
+ /** @private
44619
+ * @param {Object} rowA
44620
+ * @param {Object} rowB
44621
+ * @param {number} sortOrder
44622
+ * @param {*} context
44623
+ * @returns {number}
44624
+ */
44625
+ SortableTitlePlugin.prototype._rowDefSorter = function (rowA, rowB, sortOrder, context) {
44626
+ return this._userComparer(
44627
+ rowA[SortableTitlePlugin_ROW_DEF].getRowData(),
44628
+ rowB[SortableTitlePlugin_ROW_DEF].getRowData(),
44629
+ sortOrder,
44630
+ context
44631
+ );
44632
+ };
44627
44633
  /** @public
44628
44634
  * @description Sorting all separators according to compare function. If compare function is not specified, separators will will be sort by current sorting states.
44629
44635
  * @param {Function} comparer Compare function
@@ -44632,16 +44638,21 @@ SortableTitlePlugin.prototype.sortSeparators = function (comparer) {
44632
44638
  let host = this._hosts[0];
44633
44639
  let dv = host.getDataSource();
44634
44640
  if(comparer){
44635
- dv.sortSeparators(comparer);
44641
+ if(this._rowDefMode) {
44642
+ this._userComparer = comparer;
44643
+ dv.sortSeparators(this._rowDefSorter);
44644
+ this._userComparer = null;
44645
+ } else {
44646
+ dv.sortSeparators(comparer);
44647
+ }
44636
44648
  } else {
44637
44649
  let sortLogics = dv.getSortingLogics();
44638
44650
  let sortOrders = [];
44639
44651
  let sortFields = [];
44640
44652
  let sortStateCount = this._sortStates.length;
44641
- let rowDefField = SortableTitlePlugin._toRowDefField();
44642
44653
  for(let i = 0; i < sortStateCount; i++){
44643
44654
  let sortState = this._sortStates[i];
44644
- let field = this._rowDefMode ? rowDefField : sortState["field"];
44655
+ let field = this._rowDefMode ? SortableTitlePlugin_ROW_DEF : sortState["field"];
44645
44656
  sortOrders.push(sortState["sortOrder"]);
44646
44657
  sortFields.push(field);
44647
44658
  }
@@ -44891,11 +44902,10 @@ SortableTitlePlugin.prototype._onColumnRemoved = function (e) {
44891
44902
  };
44892
44903
 
44893
44904
  /** @private
44894
- * @param {Object=} sortState
44895
44905
  * @return {string}
44896
44906
  */
44897
- SortableTitlePlugin._toRowDefField = function(sortState) {
44898
- return "ROW_DEF";
44907
+ SortableTitlePlugin._toRowDefField = function() {
44908
+ return SortableTitlePlugin_ROW_DEF;
44899
44909
  };
44900
44910
  /** @private
44901
44911
  * @param {Object=} opt_action Action that raised the sort. This is optional
@@ -48454,22 +48464,46 @@ Grid_Grid.prototype._getRowId = function(rowRef) {
48454
48464
  return "";
48455
48465
  };
48456
48466
 
48467
+ /** Clear all existing data from the specified column(s).
48468
+ * @public
48469
+ * @param {Grid~ColumnReference|Array.<Grid~ColumnReference>} colRefs
48470
+ */
48471
+ Grid_Grid.prototype.clearColumnData = function(colRefs) {
48472
+ let colIndices = this.getColumnIndices(colRefs);
48473
+ let colCount = colIndices.length;
48474
+ if(!colCount) {
48475
+ return;
48476
+ }
48477
+ let emptyData = {};
48478
+ for(let c = 0; c < colCount; ++c) {
48479
+ let colIndex = colIndices[c];
48480
+ let field = this.getColumnField(colIndex);
48481
+ if(field) {
48482
+ emptyData[field] = null;
48483
+ }
48484
+ }
48485
+
48486
+ let rowDefs = this.getAllRowDefinitions();
48487
+ let rowCount = rowDefs.length;
48488
+ for(let r = 0; r < rowCount; ++r) {
48489
+ rowDefs[r].setRowData(emptyData); // There is a conflator caching the data change in DataCache
48490
+ }
48491
+ };
48492
+
48457
48493
  /** @public
48458
48494
  * @param {Grid~ColumnReference} colRef
48459
48495
  * @return {number}
48460
48496
  */
48461
48497
  Grid_Grid.prototype.getColumnIndex = function(colRef) {
48462
- if(colRef) {
48463
- if(colRef instanceof ColumnDefinition) {
48464
- let colCount = this.getColumnCount();
48465
- for(let i = 0; i < colCount; ++i) {
48466
- let colDef = this.getColumnDefinition(i);
48467
- if(colDef === colRef) {
48468
- return i;
48469
- }
48498
+ if(colRef instanceof ColumnDefinition) {
48499
+ let colCount = this.getColumnCount();
48500
+ for(let i = 0; i < colCount; ++i) {
48501
+ let colDef = this.getColumnDefinition(i);
48502
+ if(colDef === colRef) {
48503
+ return i;
48470
48504
  }
48471
- return -1;
48472
48505
  }
48506
+ return -1;
48473
48507
  }
48474
48508
  return this._grid.getColumnIndex(colRef);
48475
48509
  };
@@ -48480,14 +48514,16 @@ Grid_Grid.prototype.getColumnIndex = function(colRef) {
48480
48514
  */
48481
48515
  Grid_Grid.prototype.getColumnIndices = function(colRefs) {
48482
48516
  let ary = [];
48483
- let colCount = this.getColumnCount();
48484
- let inputAry = Array.isArray(colRefs) ? colRefs : [colRefs];
48485
- let len = inputAry.length;
48486
- // Verify user input
48487
- for(let i = 0; i < len; ++i) {
48488
- let colIndex = this.getColumnIndex(inputAry[i]);
48489
- if(colIndex >= 0 && colIndex < colCount) {
48490
- ary.push(colIndex); // WARNING: We have not checked for duplication
48517
+ if(colRefs || colRefs === 0) {
48518
+ let colCount = this.getColumnCount();
48519
+ let inputAry = Array.isArray(colRefs) ? colRefs : [colRefs];
48520
+ let len = inputAry.length;
48521
+ // Verify user input
48522
+ for(let i = 0; i < len; ++i) {
48523
+ let colIndex = this.getColumnIndex(inputAry[i]);
48524
+ if(colIndex >= 0 && colIndex < colCount) {
48525
+ ary.push(colIndex); // WARNING: We have not checked for duplication
48526
+ }
48491
48527
  }
48492
48528
  }
48493
48529
  return ary;