@refinitiv-ui/efx-grid 6.0.33 → 6.0.35

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. package/lib/column-dragging/es6/ColumnDragging.js +50 -40
  2. package/lib/core/dist/core.js +210 -38
  3. package/lib/core/dist/core.min.js +1 -1
  4. package/lib/core/es6/data/DataTable.d.ts +3 -1
  5. package/lib/core/es6/data/DataTable.js +27 -9
  6. package/lib/core/es6/data/DataView.d.ts +2 -0
  7. package/lib/core/es6/data/DataView.js +12 -1
  8. package/lib/core/es6/data/Segment.d.ts +2 -0
  9. package/lib/core/es6/data/Segment.js +16 -0
  10. package/lib/core/es6/data/SegmentCollection.d.ts +1 -3
  11. package/lib/core/es6/data/SegmentCollection.js +25 -18
  12. package/lib/core/es6/grid/Core.d.ts +12 -0
  13. package/lib/core/es6/grid/Core.js +64 -2
  14. package/lib/core/es6/grid/plugins/SortableTitlePlugin.js +13 -7
  15. package/lib/grid/index.js +1 -1
  16. package/lib/grid/themes/halo/dark/efx-grid.js +1 -1
  17. package/lib/grid/themes/halo/dark/es5/all-elements.js +1 -1
  18. package/lib/grid/themes/halo/efx-grid.less +3 -1
  19. package/lib/grid/themes/halo/light/efx-grid.js +1 -1
  20. package/lib/grid/themes/halo/light/es5/all-elements.js +1 -1
  21. package/lib/rt-grid/dist/rt-grid.js +766 -293
  22. package/lib/rt-grid/dist/rt-grid.min.js +1 -1
  23. package/lib/rt-grid/es6/ColumnDefinition.js +13 -8
  24. package/lib/rt-grid/es6/DataConnector.js +3 -2
  25. package/lib/rt-grid/es6/Grid.d.ts +3 -1
  26. package/lib/rt-grid/es6/Grid.js +148 -40
  27. package/lib/rt-grid/es6/RowDefSorter.d.ts +5 -5
  28. package/lib/rt-grid/es6/RowDefSorter.js +165 -71
  29. package/lib/rt-grid/es6/RowDefinition.d.ts +7 -2
  30. package/lib/rt-grid/es6/RowDefinition.js +48 -10
  31. package/lib/rt-grid/es6/SnapshotFiller.d.ts +1 -0
  32. package/lib/rt-grid/es6/SnapshotFiller.js +1 -11
  33. package/lib/tr-grid-column-selection/es6/ColumnSelection.js +66 -0
  34. package/lib/tr-grid-column-stack/es6/ColumnStack.d.ts +2 -0
  35. package/lib/tr-grid-column-stack/es6/ColumnStack.js +38 -13
  36. package/lib/tr-grid-conditional-coloring/es6/ConditionalColoring.d.ts +12 -5
  37. package/lib/tr-grid-conditional-coloring/es6/ConditionalColoring.js +128 -42
  38. package/lib/tr-grid-heat-map/es6/HeatMap.d.ts +3 -3
  39. package/lib/tr-grid-heat-map/es6/HeatMap.js +13 -2
  40. package/lib/tr-grid-row-dragging/es6/RowDragging.d.ts +2 -1
  41. package/lib/tr-grid-row-dragging/es6/RowDragging.js +153 -17
  42. package/lib/tr-grid-rowcoloring/es6/RowColoring.js +3 -2
  43. package/lib/tr-grid-textformatting/es6/TextFormatting.d.ts +20 -20
  44. package/lib/tr-grid-textformatting/es6/TextFormatting.js +37 -138
  45. package/lib/tr-grid-util/es6/CellPainter.d.ts +1 -1
  46. package/lib/tr-grid-util/es6/CellPainter.js +56 -55
  47. package/lib/tr-grid-util/es6/DragUI.js +7 -3
  48. package/lib/tr-grid-util/es6/FieldFormatter.js +6 -2
  49. package/lib/tr-grid-util/es6/NumberFormatter.js +23 -11
  50. package/lib/tr-grid-util/es6/Util.d.ts +3 -0
  51. package/lib/tr-grid-util/es6/Util.js +53 -0
  52. package/lib/tr-grid-util/es6/jet/DataGenerator.js +36 -33
  53. package/lib/types/es6/ColumnStack.d.ts +2 -0
  54. package/lib/types/es6/ConditionalColoring.d.ts +12 -5
  55. package/lib/types/es6/Core/data/DataTable.d.ts +3 -1
  56. package/lib/types/es6/Core/data/DataView.d.ts +2 -0
  57. package/lib/types/es6/Core/data/Segment.d.ts +2 -0
  58. package/lib/types/es6/Core/data/SegmentCollection.d.ts +1 -3
  59. package/lib/types/es6/Core/grid/Core.d.ts +4 -0
  60. package/lib/types/es6/Core/grid/plugins/SortableTitlePlugin.d.ts +1 -0
  61. package/lib/types/es6/HeatMap.d.ts +3 -3
  62. package/lib/types/es6/RealtimeGrid/Grid.d.ts +3 -1
  63. package/lib/types/es6/RealtimeGrid/RowDefSorter.d.ts +5 -5
  64. package/lib/types/es6/RealtimeGrid/RowDefinition.d.ts +7 -2
  65. package/lib/types/es6/RealtimeGrid/SnapshotFiller.d.ts +1 -0
  66. package/lib/types/es6/RowDragging.d.ts +2 -1
  67. package/lib/types/es6/TextFormatting.d.ts +20 -20
  68. package/lib/versions.json +9 -9
  69. package/package.json +1 -1
@@ -75,11 +75,17 @@ var ColumnDraggingPlugin = function (options) {
75
75
  t._hosts = [];
76
76
 
77
77
  t._guideline = document.createElement("div");
78
- t._guideline.className = "guideline";
79
78
  t._dragBox = document.createElement("div");
80
- t._dragBox.className = "drag-box-disabled"; // defualt disable dragbox
79
+ t._dragBox.classList.add("drag-box-disabled"); // defualt disable dragbox
81
80
  t._dragBoxIcon = document.createElement("ef-icon");
82
- t._dragBoxIcon.className = "drag-box-icon";
81
+ t._dragBoxIcon.classList.add("drag-box-icon");
82
+
83
+ if(ElfUtil.getElfVersion() < 4) {
84
+ t._dragBox.classList.add("tr-dragbox");
85
+ t._guideline.classList.add("tr-guideline");
86
+ } else {
87
+ t._guideline.classList.add("guideline");
88
+ }
83
89
 
84
90
  if(options) {
85
91
  this.config({ "columnDragging": options });
@@ -284,7 +290,8 @@ ColumnDraggingPlugin.prototype.config = function (options) {
284
290
 
285
291
  if (typeof extOptions["dragBoxRenderer"] === "function") {
286
292
  this._dragBoxRenderer = extOptions["dragBoxRenderer"];
287
- this._dragBox.className = "drag-box";
293
+ this._dragBox.classList.add("drag-box");
294
+ this._dragBox.classList.remove("drag-box-disabled");
288
295
  }
289
296
  this.addListener(extOptions, "dragStart");
290
297
  this.addListener(extOptions, "drag");
@@ -607,47 +614,38 @@ ColumnDraggingPlugin.prototype._onDragEnd = function (e) {
607
614
  if (!operationCancelled) {
608
615
  if (!this._noColumnMoving) {
609
616
  var cgp = this._getPlugin("ColumnGroupingPlugin");
617
+ var csp = this._getPlugin("ColumnStackPlugin");
618
+ var destIndex = this._destColumn;
619
+ var groupId, stackId;
620
+
621
+ // Move operation always move to the left of destination column
622
+ // When moving forward, destnation need to added by 1 to move correctly
623
+ if (this._startColumn < this._destColumn) {
624
+ destIndex = this._destColumn + 1;
625
+ }
626
+
627
+ // TODO: support multi column dragging
628
+ if(csp) {
629
+ stackId = csp.getStackId(this._startColumn);
630
+ }
610
631
  if(cgp){
611
632
  var cellInfo = cgp.getCellInfo(this._startPos);
612
- var srcId = cellInfo["groupId"] || cellInfo["columnId"];
613
- var destIndex = this._destColumn;
633
+ groupId = cellInfo["groupId"] || cellInfo["columnId"];
634
+ }
614
635
 
615
- // Move group always move to the left of destination
616
- // When moving forward, destnation need to added by 1 to move correctly
617
- if (this._startColumn < this._destColumn) {
618
- destIndex = this._destColumn + 1;
619
- }
620
- if(srcId){
621
- cgp.moveGroup(srcId, destIndex);
622
- }
636
+ if(stackId && this._startColumn === this._endColumn){
637
+ csp.moveStack(stackId, destIndex);
638
+ } else if(groupId) {
639
+ cgp.moveGroup(groupId, destIndex);
623
640
  } else {
624
- var shiftStart = -1;
625
- var shiftEnd = -1;
626
- var moveSize = -1;
627
- if (this._startColumn > this._destColumn) { //Move backward
628
- shiftStart = this._destColumn;
629
- shiftEnd = this._startColumn - 1;
630
- moveSize = -1 * (this._startColumn - this._destColumn); //Move to the left
631
- } else
632
- if (this._startColumn < this._destColumn) { //Move foward
633
- shiftStart = this._endColumn + 1;
634
- shiftEnd = this._destColumn;
635
- moveSize = ((shiftEnd - shiftStart) + 1); //Move to the right
641
+ var colList = [];
642
+ var i;
643
+ for(i = this._startColumn; i <= this._endColumn; i++){
644
+ colList.push(i);
636
645
  }
637
-
638
- //Perform moving all columns in the range
639
- for(var j = this._hosts.length; --j >= 0;) {
640
- var host = this._hosts[j];
641
- var i;
642
- if (moveSize > 0) { //Move forward
643
- for (i = this._startColumn; i <= this._endColumn; i++) {
644
- host.moveColumn(this._startColumn, this._destColumn);
645
- }
646
- } else { //Move backward
647
- for (i = this._startColumn; i <= this._endColumn; i++) {
648
- host.moveColumn(this._startColumn + (i - this._startColumn), this._destColumn + (i - this._startColumn));
649
- }
650
- }
646
+ for(i = this._hosts.length; --i >= 0;) {
647
+ var host = this._hosts[i];
648
+ host.reorderColumns(colList, destIndex);
651
649
  }
652
650
  }
653
651
  }
@@ -756,6 +754,18 @@ ColumnDraggingPlugin.prototype._renderGuideline = function() {
756
754
  var rightHand = this._pos["x"] > colLeft + colWidth / 2;
757
755
  var destColumn = (rightHand) ? colEnd + 1 : colStart;
758
756
 
757
+ var csp = this._getPlugin("ColumnStackPlugin");
758
+ if(csp){
759
+ var stackId = csp.getStackId(destColumn);
760
+ if(stackId){
761
+ var members = csp.getStackMemberIndices(stackId);
762
+ var memberCount = members.length;
763
+ if(members && memberCount){
764
+ destColumn = rightHand ? members[memberCount - 1] + 1 : members[0];
765
+ }
766
+ }
767
+ }
768
+
759
769
  colLeft = this._clickedGrid.getColumnLeft(this._destColumn);
760
770
  // If destination exceeds the specified bounds
761
771
  if (destColumn < this._leftMovableBorder) {
@@ -9,7 +9,7 @@
9
9
  /* harmony export */ "Qr": () => (/* binding */ isEmptyObject),
10
10
  /* harmony export */ "kI": () => (/* binding */ cloneObject)
11
11
  /* harmony export */ });
12
- /* unused harmony exports Util, extendObject, arrayToObject, extendProperty, extendArrayProperty, parseCondition, prettifyCss, getShadowRoot, injectCss, isIE, isMac, isTouchDevice, nestedObjectToArray, rgb2Hex, prepareTSVContent */
12
+ /* unused harmony exports Util, extendObject, deepEqual, arrayToObject, extendProperty, extendArrayProperty, parseCondition, prettifyCss, getShadowRoot, injectCss, isIE, isMac, isTouchDevice, nestedObjectToArray, rgb2Hex, prepareTSVContent */
13
13
  /** @namespace */
14
14
  var Util = {};
15
15
 
@@ -212,6 +212,58 @@ var extendProperty = function (obj, extender, propName) {
212
212
  }
213
213
  }
214
214
  };
215
+
216
+
217
+ /** Compare the values of obj1 and obj2. if they are the same object or have the same value, the result will be true. Otherwise, it will return false.
218
+ * @public
219
+ * @param {*} obj1
220
+ * @param {*} obj2
221
+ * @return {boolean}
222
+ */
223
+ var deepEqual = function (obj1, obj2) {
224
+
225
+ if(obj1 === obj2) {
226
+ return true;
227
+ }
228
+
229
+ if (typeof obj1 !== typeof obj2) {
230
+ return false;
231
+ }
232
+
233
+ if (typeof obj1 === "object") {
234
+
235
+ // We need to split array and object for performance reason
236
+ if(Array.isArray(obj1)) {
237
+ if(obj1.length !== obj2.length) {
238
+ return false;
239
+ }
240
+
241
+ for (var i = 0; i < obj1.length; i++) {
242
+ if (!deepEqual(obj1[i], obj2[i])) { // The array may not be a match if the elements are not sorted, so it will not be considered equal if there is a mismatch.
243
+ return false;
244
+ }
245
+ }
246
+
247
+ } else {
248
+
249
+ if (Object.keys(obj1).length !== Object.keys(obj2).length) {
250
+ return false;
251
+ }
252
+
253
+ for (var key in obj1) {
254
+ if (!deepEqual(obj1[key], obj2[key])) {
255
+ return false;
256
+ }
257
+ }
258
+ }
259
+
260
+
261
+ return true;
262
+ }
263
+
264
+ return false;
265
+
266
+ };
215
267
  /** Array.push() is much faster than Array.concat(). The downside is the parameters must be an array, whereas concat() has no such requirement. <br>
216
268
  * This method excels in extending known array property in an object.
217
269
  * @public
@@ -14060,6 +14112,22 @@ Segment.prototype.getOrder = function() {
14060
14112
  }
14061
14113
  return this._order * 10000;
14062
14114
  };
14115
+ /** Get the last (highest) order from the entire tree regardless of the current position segment in the hierachy
14116
+ * @public
14117
+ * @return {number}
14118
+ */
14119
+ Segment.prototype.getLastOrder = function() {
14120
+ if(this._subSegDef) {
14121
+ var subSegments = this._subSegDef.subSegments;
14122
+ if(subSegments) {
14123
+ var lastSegment = subSegments[subSegments.length - 1];
14124
+ if(lastSegment) {
14125
+ return lastSegment.getOrder();
14126
+ }
14127
+ }
14128
+ }
14129
+ return this.getOrder();
14130
+ };
14063
14131
  /** @public
14064
14132
  * @param {number} val
14065
14133
  */
@@ -14181,9 +14249,10 @@ SegmentCollection.prototype.dispose = function() {
14181
14249
  };
14182
14250
  /** @public
14183
14251
  * @param {string} rid
14252
+ * @param {Array.<string>=} childRids Children of the newly added segment. This is a shorthand to addSegmentChildren method
14184
14253
  * @return {boolean} Returns true if there is any change. Otherwise, returns false
14185
14254
  */
14186
- SegmentCollection.prototype.addSegment = function(rid) {
14255
+ SegmentCollection.prototype.addSegment = function(rid, childRids) {
14187
14256
  if(rid && !this._segments[rid]) {
14188
14257
  if(this.getParentRowId(rid)) {
14189
14258
  console.log("child of a segment cannot be set as a segment separator");
@@ -14194,6 +14263,10 @@ SegmentCollection.prototype.addSegment = function(rid) {
14194
14263
  segment.addEventListener("subSegmentRemoved", this._onSubSegmentRemoved);
14195
14264
  ++this._segmentCount;
14196
14265
  this._segmentList = null; // order could be changed
14266
+
14267
+ if(childRids && childRids.length) {
14268
+ segment.addChildren(childRids);
14269
+ }
14197
14270
  return true;
14198
14271
  }
14199
14272
  return false;
@@ -14541,9 +14614,10 @@ SegmentCollection.prototype.calcSegmentOrder = function(rids) {
14541
14614
  };
14542
14615
  /** @public
14543
14616
  * @param {!Array.<string>} rids Array of row ids
14617
+ * @param {boolean=} partial Indicating that the given ids are not the whole list
14544
14618
  * @return {Array.<number>} Returns Array of segment values, if there are at least one segment, otherwise returns null
14545
- */
14546
- SegmentCollection.prototype.getSegmentValues = function(rids) {
14619
+ */ //
14620
+ SegmentCollection.prototype.getSegmentValues = function(rids, partial) {
14547
14621
  var rowCount = rids ? rids.length : 0;
14548
14622
  if(!rowCount) {
14549
14623
  return null;
@@ -14560,29 +14634,30 @@ SegmentCollection.prototype.getSegmentValues = function(rids) {
14560
14634
  var rid = rids[r];
14561
14635
  curSegment = segmentSeparators[rid];
14562
14636
  if(curSegment) { // segment separator
14563
- if(prevSegment !== curSegment) {
14564
- prevSegment = curSegment;
14565
- segmentVal = curSegment.getOrder() * 100;
14566
- if(segmentVal > highestVal) {
14567
- highestVal = segmentVal;
14637
+ segmentVal = curSegment.getOrder() * 100;
14638
+ offset = 0;
14639
+ if(!curSegment.isSubSegment()) {
14640
+ if(prevSegment !== curSegment) {
14641
+ prevSegment = curSegment;
14642
+ highestVal = curSegment.getLastOrder() * 100;
14568
14643
  }
14569
14644
  }
14570
- offset = 0;
14571
14645
  } else {
14572
14646
  var parentId = childToSegmentId[rid];
14573
14647
  if(parentId) { // segment member
14574
14648
  curSegment = segmentSeparators[parentId];
14575
- if(prevSegment !== curSegment) {
14576
- prevSegment = curSegment;
14577
- segmentVal = curSegment.getOrder() * 100;
14578
- if(segmentVal > highestVal) {
14579
- highestVal = segmentVal;
14580
- }
14581
- }
14649
+ segmentVal = curSegment.getOrder() * 100;
14582
14650
  offset = 1;
14651
+ if(partial) {
14652
+ highestVal = curSegment.getLastOrder() * 100;
14653
+ }
14583
14654
  } else { // row outside of segments
14584
- segmentVal = highestVal;
14585
- offset = 10;
14655
+ if(highestVal) {
14656
+ segmentVal = highestVal;
14657
+ offset = 10;
14658
+ } else {
14659
+ segmentVal = offset = 0;
14660
+ }
14586
14661
  }
14587
14662
  }
14588
14663
 
@@ -15601,7 +15676,24 @@ DataTable.prototype.setSortingLogic = function(func) {
15601
15676
  * @param {DataTable.SortLogic} func Use null to remove current sorting logic
15602
15677
  */
15603
15678
  DataTable.prototype.setColumnSortingLogic = function(cid, func) {
15604
- this._compMap[cid] = func;
15679
+ if(cid) {
15680
+ this._compMap[cid] = func;
15681
+ }
15682
+ };
15683
+ /** Get sorting logic for the specified field. Default logic is returned, if no logic is specified for the column
15684
+ * @public
15685
+ * @param {string=} cid
15686
+ * @return {DataTable.SortLogic}
15687
+ */
15688
+ DataTable.prototype.getColumnSortingLogic = function(cid) {
15689
+ if(cid) {
15690
+ var logic = this._compMap[cid];
15691
+ if(logic) {
15692
+ return logic;
15693
+ }
15694
+ }
15695
+
15696
+ return this._compMap["_default"] || null;
15605
15697
  };
15606
15698
 
15607
15699
  /** Freeze data table so that no event is fired for data processing until executing {@link DataTable#unfreeze} method
@@ -15764,11 +15856,12 @@ DataTable.prototype.getSegmentParentRowId = function(rid) {
15764
15856
  /**
15765
15857
  * @public
15766
15858
  * @param {Array.<string>=} rids If no row id is given, row ids of this data table is used instead
15859
+ * @param {boolean=} partial Indicating that the given ids are not the whole list
15767
15860
  * @return {Array.<number>} Return null if there is no segmentation
15768
15861
  */
15769
- DataTable.prototype.getSegmentValues = function(rids) {
15862
+ DataTable.prototype.getSegmentValues = function(rids, partial) {
15770
15863
  if(this._segments) {
15771
- return this._segments.getSegmentValues(rids || this._rids);
15864
+ return this._segments.getSegmentValues(rids || this._rids, partial);
15772
15865
  }
15773
15866
  return null;
15774
15867
  };
@@ -15851,9 +15944,9 @@ DataTable.prototype.addSegmentChild = function(segmentId, rid, dataId) {
15851
15944
  if(this._segments) {
15852
15945
  var dirty = this._segments.addSegmentChild(segmentId, rid, dataId);
15853
15946
  if(dirty) {
15854
- if(this._sort(null)) {
15855
- this._dispatchPositionChange();
15856
- }
15947
+ this._sort(null);
15948
+ this._dispatchPositionChange(); // Force rerendering, even if there is no position change
15949
+
15857
15950
  this.requestClassifying();
15858
15951
  return true;
15859
15952
  }
@@ -15870,9 +15963,9 @@ DataTable.prototype.addSegmentChildren = function(segmentId, rids, dataIds) {
15870
15963
  if(this._segments) {
15871
15964
  var dirty = this._segments.addSegmentChildren(segmentId, rids, dataIds);
15872
15965
  if(dirty) {
15873
- if(this._sort(null)) {
15874
- this._dispatchPositionChange();
15875
- }
15966
+ this._sort(null);
15967
+ this._dispatchPositionChange(); // Force rerendering, even if there is no position change
15968
+
15876
15969
  this.requestClassifying();
15877
15970
  return true;
15878
15971
  }
@@ -19347,6 +19440,17 @@ DataView.prototype.setColumnSortingLogic = function(cid, func) {
19347
19440
  this._dt.setColumnSortingLogic(cid, func);
19348
19441
  }
19349
19442
  };
19443
+ /** Get sorting logic for the specified field. Default logic is returned, if no logic is specified for the column
19444
+ * @public
19445
+ * @param {string=} cid
19446
+ * @return {DataTable.SortLogic}
19447
+ */
19448
+ DataView.prototype.getColumnSortingLogic = function(cid) {
19449
+ if(this._dt) {
19450
+ return this._dt.getColumnSortingLogic(cid);
19451
+ }
19452
+ return null;
19453
+ };
19350
19454
  /** Check if this view is in sorting mode
19351
19455
  * @public
19352
19456
  * @return {boolean}
@@ -21864,7 +21968,7 @@ DataView.prototype._sort = function() {
21864
21968
  if(this._dt._getSegmentSeparators() || this.isSorting()) {
21865
21969
  var rids = this._rids;
21866
21970
  var dataRows = this._dt.getMultipleRowData(rids);
21867
- var segmentValues = this._dt.getSegmentValues(rids);
21971
+ var segmentValues = this._dt.getSegmentValues(rids, true); // WARNING: This does not work well for hidden/filtered rows
21868
21972
  var change = data_DataTable._performMultiLevelSorting(dataRows, this._sortingDefs, segmentValues);
21869
21973
 
21870
21974
  if(change) {
@@ -25083,6 +25187,7 @@ VirtualizedLayoutGrid._proto = VirtualizedLayoutGrid.prototype;
25083
25187
 
25084
25188
  // eslint-disable-line
25085
25189
 
25190
+
25086
25191
  // eslint-disable-line
25087
25192
 
25088
25193
 
@@ -25282,7 +25387,9 @@ var Core_Core = function (opt_initializer) {
25282
25387
  "rowRemoved",
25283
25388
  "columnPositionChanged",
25284
25389
  "rowPositionChanged",
25285
- "beforeColumnBoundUpdate"
25390
+ "beforeColumnBoundUpdate",
25391
+ "beforeBatchOperation",
25392
+ "afterBatchOperation"
25286
25393
  );
25287
25394
 
25288
25395
  // For debugging in advanced optimization mode
@@ -25357,6 +25464,15 @@ Core_Core.SectionReference;
25357
25464
  */
25358
25465
  Core_Core.MouseInfo;
25359
25466
 
25467
+ /** @typedef {Object} Core~BatchInfo
25468
+ * @private
25469
+ * @property {string=} reset //set columns
25470
+ * @property {string=} insertion //add cols
25471
+ * @property {string=} removal //remove cols
25472
+ * @property {string=} moving //reorder
25473
+ */
25474
+ Core_Core.BatchInfo;
25475
+
25360
25476
  /** @typedef {Core.MouseInfo|ElementWrapper|Element} Core~CellReference
25361
25477
  * @description A section in core grid can be refered by the following object <br>
25362
25478
  * `{Core.MouseInfo}` : Object with valid x, y coordinates and section index <br>
@@ -25611,6 +25727,10 @@ Core_Core.prototype._rowHeightTimerId = 0;
25611
25727
  * @private
25612
25728
  */
25613
25729
  Core_Core.prototype._groupDefs = null;
25730
+ /** @type {BatchInfo}
25731
+ * @private
25732
+ */
25733
+ Core_Core.prototype._batches = null;
25614
25734
  //#region Public Methods
25615
25735
 
25616
25736
  /**
@@ -25618,7 +25738,7 @@ Core_Core.prototype._groupDefs = null;
25618
25738
  * @return {string}
25619
25739
  */
25620
25740
  Core_Core.getVersion = function () {
25621
- return "5.1.42";
25741
+ return "5.1.48";
25622
25742
  };
25623
25743
  /** {@link ElementWrapper#dispose}
25624
25744
  * @override
@@ -26557,6 +26677,10 @@ Core_Core.prototype.removeColumnAt = function (index) {
26557
26677
 
26558
26678
  if (this._hasListener("columnRemoved")) {
26559
26679
  var e = {};
26680
+ var batches = this._batches;
26681
+ if(batches){
26682
+ e["batches"] = batches;
26683
+ }
26560
26684
  e["atTheMiddle"] = true;
26561
26685
  e["colIndex"] = index;
26562
26686
  e["columns"] = "deprecated";
@@ -29401,6 +29525,40 @@ Core_Core.prototype.getColumnGroupChildIds = function (groupId) {
29401
29525
  }
29402
29526
  return null;
29403
29527
  };
29528
+
29529
+ /** @public
29530
+ * @param {string} batchType
29531
+ * @return {boolean}
29532
+ * @fires Core#beforeBatchOperation
29533
+ */
29534
+ Core_Core.prototype.startBatch = function (batchType) {
29535
+ if(!batchType){
29536
+ return false;
29537
+ }
29538
+ if(!this._batches){
29539
+ this._batches = {};
29540
+ }
29541
+ this._batches[batchType] = batchType;
29542
+ this._dispatch("beforeBatchOperation", { batches: this._batches, batchType: batchType });
29543
+ return true;
29544
+ };
29545
+ /** @public
29546
+ * @param {string} batchType
29547
+ * @return {boolean}
29548
+ * @fires Core#afterBatchOperation
29549
+ */
29550
+ Core_Core.prototype.stopBatch = function (batchType) {
29551
+ if(!batchType){
29552
+ return false;
29553
+ }
29554
+ this._dispatch("afterBatchOperation", { batches: this._batches, batchType: batchType });
29555
+
29556
+ delete this._batches[batchType];
29557
+ if((0,es6_Util/* isEmptyObject */.Qr)(this._batches)){
29558
+ this._batches = null;
29559
+ }
29560
+ return true;
29561
+ };
29404
29562
  //#endregion Public Methods
29405
29563
 
29406
29564
  //#region Private Methods
@@ -29644,6 +29802,10 @@ Core_Core.prototype._dispatchColumnAddedEvent = function (at, count, atTheMiddle
29644
29802
  if (this._hasListener("columnAdded")) {
29645
29803
  var e = {};
29646
29804
  e["atTheMiddle"] = atTheMiddle;
29805
+ var batches = this._batches;
29806
+ if(batches){
29807
+ e["batches"] = batches;
29808
+ }
29647
29809
  if(count === 1) {
29648
29810
  e["colIndex"] = at;
29649
29811
  e["context"] = ctx;
@@ -29795,6 +29957,10 @@ Core_Core.prototype._removeColumn = function (num) { // TODO: change the logic
29795
29957
 
29796
29958
  if (this._hasListener("columnRemoved")) {
29797
29959
  var e = {};
29960
+ var batches = this._batches;
29961
+ if(batches){
29962
+ e["batches"] = batches;
29963
+ }
29798
29964
  for (var c = colCount; --c >= newCount; ) {
29799
29965
  var colDef = removedCols[c - newCount];
29800
29966
  e["colIndex"] = c;
@@ -32319,6 +32485,9 @@ SortableTitlePlugin.prototype._sortDataView = function (opt_action) {
32319
32485
  if (!this._dataSorting) { return; }
32320
32486
 
32321
32487
  var sortCount = this._sortStates.length;
32488
+ if(this._userManagedLogic && sortCount > 1) { // The logic is managed by the user. There is no point in using multi-column sorting
32489
+ sortCount = 1;
32490
+ }
32322
32491
  var orders = null;
32323
32492
  var sortLogics = null;
32324
32493
  var c_ref = null;
@@ -32334,6 +32503,9 @@ SortableTitlePlugin.prototype._sortDataView = function (opt_action) {
32334
32503
  } else {
32335
32504
  c_ref = this.getColumnSortingFields();
32336
32505
  }
32506
+ if(this._userManagedLogic && c_ref.length > 1) {
32507
+ c_ref = c_ref.slice(0, 1);
32508
+ }
32337
32509
  }
32338
32510
 
32339
32511
  // Perform sorting even if there is no sort state
@@ -32442,16 +32614,16 @@ SortableTitlePlugin.prototype._updateSortableIndicator = function (hostIndex) {
32442
32614
  symbol = t._createIconElem(icon, textContent);
32443
32615
  symbol.className = "sort-symbol";
32444
32616
  cell["insertFloatingIcon"](symbol, 0);
32445
-
32446
- if (t._sortStates.length > 1) {
32447
- symbol = document.createElement("span");
32448
- symbol.className = "priority-symbol";
32449
- symbol.textContent = priority + 1;
32450
- cell["insertFloatingIcon"](symbol, 1);
32451
- }
32452
32617
  } else {
32453
32618
  cell["addClass"]("edge-indicator");
32454
32619
  }
32620
+
32621
+ if (t._sortStates.length > 1) {
32622
+ symbol = document.createElement("span");
32623
+ symbol.className = "priority-symbol";
32624
+ symbol.textContent = priority + 1;
32625
+ cell["insertFloatingIcon"](symbol, 1);
32626
+ }
32455
32627
  } else if (t._sortableIndicator) { // Can sort but currently not sorting
32456
32628
  icon = SortableTitlePlugin._icons["sortable"];
32457
32629
  symbol = t._createIconElem(icon, CODE_DIAMOND);