@refinitiv-ui/efx-grid 6.0.34 → 6.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/lib/column-dragging/es6/ColumnDragging.js +50 -40
  2. package/lib/core/dist/core.css +1 -1
  3. package/lib/core/dist/core.js +248 -8
  4. package/lib/core/dist/core.min.js +1 -1
  5. package/lib/core/es6/data/DataCache.js +20 -1
  6. package/lib/core/es6/data/DataTable.d.ts +2 -0
  7. package/lib/core/es6/data/DataTable.js +18 -1
  8. package/lib/core/es6/data/DataView.d.ts +2 -0
  9. package/lib/core/es6/data/DataView.js +11 -0
  10. package/lib/core/es6/grid/Core.d.ts +12 -0
  11. package/lib/core/es6/grid/Core.js +88 -3
  12. package/lib/core/es6/grid/ILayoutGrid.js +4 -0
  13. package/lib/core/es6/grid/LayoutGrid.d.ts +4 -0
  14. package/lib/core/es6/grid/LayoutGrid.js +95 -3
  15. package/lib/core/es6/grid/VirtualizedLayoutGrid.js +6 -0
  16. package/lib/core/es6/grid/plugins/SortableTitlePlugin.js +6 -0
  17. package/lib/core/es6/tr-grid-theme.js +1 -1
  18. package/lib/grid/index.js +1 -1
  19. package/lib/grid/themes/halo/dark/efx-grid.js +1 -1
  20. package/lib/grid/themes/halo/dark/es5/all-elements.js +1 -1
  21. package/lib/grid/themes/halo/efx-grid.less +1 -1
  22. package/lib/grid/themes/halo/light/efx-grid.js +1 -1
  23. package/lib/grid/themes/halo/light/es5/all-elements.js +1 -1
  24. package/lib/rt-grid/dist/rt-grid.js +367 -148
  25. package/lib/rt-grid/dist/rt-grid.min.js +1 -1
  26. package/lib/rt-grid/es6/Grid.js +37 -31
  27. package/lib/rt-grid/es6/RowDefSorter.d.ts +5 -5
  28. package/lib/rt-grid/es6/RowDefSorter.js +165 -71
  29. package/lib/tr-grid-column-selection/es6/ColumnSelection.js +66 -0
  30. package/lib/tr-grid-column-stack/es6/ColumnStack.d.ts +3 -0
  31. package/lib/tr-grid-column-stack/es6/ColumnStack.js +566 -607
  32. package/lib/tr-grid-conditional-coloring/es6/ConditionalColoring.js +1 -1
  33. package/lib/tr-grid-range-bar/es6/RangeBar.d.ts +4 -1
  34. package/lib/tr-grid-range-bar/es6/RangeBar.js +99 -39
  35. package/lib/tr-grid-row-dragging/es6/RowDragging.js +14 -3
  36. package/lib/tr-grid-rowcoloring/es6/RowColoring.js +3 -2
  37. package/lib/tr-grid-util/es6/DragUI.js +7 -3
  38. package/lib/tr-grid-util/es6/GroupDefinitions.d.ts +7 -1
  39. package/lib/tr-grid-util/es6/GroupDefinitions.js +39 -3
  40. package/lib/tr-grid-util/es6/jet/DataGenerator.js +36 -33
  41. package/lib/types/es6/ColumnStack.d.ts +2 -0
  42. package/lib/types/es6/Core/data/DataTable.d.ts +3 -1
  43. package/lib/types/es6/Core/data/DataView.d.ts +2 -0
  44. package/lib/types/es6/Core/grid/Core.d.ts +12 -0
  45. package/lib/types/es6/RealtimeGrid/RowDefSorter.d.ts +5 -5
  46. package/lib/versions.json +8 -8
  47. package/package.json +1 -1
@@ -832,7 +832,8 @@ DataCache.prototype._insertRic = function (subId, ric, values) {
832
832
  // We cannot cache event arguments because user may want to collect all the updates
833
833
  this._onADCForNewRic(subId, ric);
834
834
 
835
- if (!this.getRowData(rid)) { // Ensure that we have subscription id and ric from Quotes2
835
+ var rowData = this.getRowData(rid);
836
+ if (!rowData) { // Ensure that we have subscription id and ric from Quotes2
836
837
  var tmp = values;
837
838
 
838
839
  values = {}; // Clone a new object for duplicated ric
@@ -843,6 +844,11 @@ DataCache.prototype._insertRic = function (subId, ric, values) {
843
844
 
844
845
  values["SUB_ID"] = subId;
845
846
  values["RIC"] = ric;
847
+ } else {
848
+ var rowDef = rowData["ROW_DEF"];
849
+ if(rowDef && rowDef.isChain()){
850
+ values["SUB_ID"] = subId;
851
+ }
846
852
  }
847
853
 
848
854
  this.setRowData(rid, values);
@@ -879,6 +885,12 @@ DataCache.prototype._onQ2SubAdded = function (e) {
879
885
  var sub = subs[i];
880
886
  var ric = sub["ric"];
881
887
 
888
+ // chain subId fires twice, one with "_ci_" and one without "_ci_"
889
+ // the subId with "_ci_" should be ignore
890
+ if(sub["id"].indexOf("_ci_") >= 0){
891
+ continue;
892
+ }
893
+
882
894
  this.addSubscription(sub, ric);
883
895
 
884
896
  if (duplicateSubIds) { // There will be no network request for duplicate subs, and hence we need to update the data from our cache
@@ -903,6 +915,13 @@ DataCache.prototype._onQ2SubRemoved = function (e) {
903
915
 
904
916
  for (var i = 0; i < len; ++i) {
905
917
  var sub = subs[i];
918
+
919
+ // chain subId fires twice, one with "_ci_" and one without "_ci_"
920
+ // the subId with "_ci_" should be ignore
921
+ if(sub["id"].indexOf("_ci_") >= 0){
922
+ continue;
923
+ }
924
+
906
925
  this.removeSubscription(sub);
907
926
  }
908
927
  };
@@ -70,6 +70,8 @@ declare class DataTable extends DataCache {
70
70
 
71
71
  public setColumnSortingLogic(cid: string, func: DataTable.SortLogic|null): void;
72
72
 
73
+ public getColumnSortingLogic(cid?: string|null): DataTable.SortLogic|null;
74
+
73
75
  public freeze(bool?: boolean|null): boolean;
74
76
 
75
77
  public unfreeze(bool?: boolean|null): boolean;
@@ -882,7 +882,24 @@ DataTable.prototype.setSortingLogic = function(func) {
882
882
  * @param {DataTable.SortLogic} func Use null to remove current sorting logic
883
883
  */
884
884
  DataTable.prototype.setColumnSortingLogic = function(cid, func) {
885
- this._compMap[cid] = func;
885
+ if(cid) {
886
+ this._compMap[cid] = func;
887
+ }
888
+ };
889
+ /** Get sorting logic for the specified field. Default logic is returned, if no logic is specified for the column
890
+ * @public
891
+ * @param {string=} cid
892
+ * @return {DataTable.SortLogic}
893
+ */
894
+ DataTable.prototype.getColumnSortingLogic = function(cid) {
895
+ if(cid) {
896
+ var logic = this._compMap[cid];
897
+ if(logic) {
898
+ return logic;
899
+ }
900
+ }
901
+
902
+ return this._compMap["_default"] || null;
886
903
  };
887
904
 
888
905
  /** Freeze data table so that no event is fired for data processing until executing {@link DataTable#unfreeze} method
@@ -80,6 +80,8 @@ declare class DataView extends EventDispatcher {
80
80
 
81
81
  public setColumnSortingLogic(cid: string, func: DataTable.SortLogic|null): void;
82
82
 
83
+ public getColumnSortingLogic(cid?: string|null): DataTable.SortLogic|null;
84
+
83
85
  public isSorting(): boolean;
84
86
 
85
87
  public hideRow(rId: string|number|null, hidden?: boolean|null): void;
@@ -783,6 +783,17 @@ DataView.prototype.setColumnSortingLogic = function(cid, func) {
783
783
  this._dt.setColumnSortingLogic(cid, func);
784
784
  }
785
785
  };
786
+ /** Get sorting logic for the specified field. Default logic is returned, if no logic is specified for the column
787
+ * @public
788
+ * @param {string=} cid
789
+ * @return {DataTable.SortLogic}
790
+ */
791
+ DataView.prototype.getColumnSortingLogic = function(cid) {
792
+ if(this._dt) {
793
+ return this._dt.getColumnSortingLogic(cid);
794
+ }
795
+ return null;
796
+ };
786
797
  /** Check if this view is in sorting mode
787
798
  * @public
788
799
  * @return {boolean}
@@ -1,5 +1,6 @@
1
1
  import Ext from "../../../tr-grid-util/es6/Ext.js";
2
2
  import GroupDefinitions from "../../../tr-grid-util/es6/GroupDefinitions.js"; // eslint-disable-line
3
+ import { isEmptyObject } from "../../../tr-grid-util/es6/Util.js";
3
4
  import ElementWrapper from "./components/ElementWrapper.js";
4
5
  import ILayoutGrid from "./ILayoutGrid.js"; // eslint-disable-line
5
6
  import LayoutGrid from "./LayoutGrid.js";
@@ -32,6 +33,13 @@ declare namespace Core {
32
33
  dataSource: DataView|null
33
34
  };
34
35
 
36
+ type BatchInfo = {
37
+ reset?: string|null,
38
+ insertion?: string|null,
39
+ removal?: string|null,
40
+ moving?: string|null
41
+ };
42
+
35
43
  type CellReference = Core.MouseInfo|ElementWrapper|Element|null;
36
44
 
37
45
  type ColumnOptions = {
@@ -395,6 +403,10 @@ declare class Core extends ElementWrapper {
395
403
 
396
404
  public getColumnGroupChildIds(groupId: string): (string)[]|null;
397
405
 
406
+ public startBatch(batchType: string): boolean;
407
+
408
+ public stopBatch(batchType: string): boolean;
409
+
398
410
  public getColumnId(colIndex: number): string;
399
411
 
400
412
  public getColumnIds(): (string)[];
@@ -1,5 +1,6 @@
1
1
  import Ext from "../../../tr-grid-util/es6/Ext.js";
2
2
  import GroupDefinitions from "../../../tr-grid-util/es6/GroupDefinitions.js"; // eslint-disable-line
3
+ import { isEmptyObject } from "../../../tr-grid-util/es6/Util.js";
3
4
  import ElementWrapper from "./components/ElementWrapper.js";
4
5
  import ILayoutGrid from "./ILayoutGrid.js"; // eslint-disable-line
5
6
  import LayoutGrid from "./LayoutGrid.js";
@@ -200,7 +201,9 @@ var Core = function (opt_initializer) {
200
201
  "rowRemoved",
201
202
  "columnPositionChanged",
202
203
  "rowPositionChanged",
203
- "beforeColumnBoundUpdate"
204
+ "beforeColumnBoundUpdate",
205
+ "beforeBatchOperation",
206
+ "afterBatchOperation"
204
207
  );
205
208
 
206
209
  // For debugging in advanced optimization mode
@@ -275,6 +278,15 @@ Core.SectionReference;
275
278
  */
276
279
  Core.MouseInfo;
277
280
 
281
+ /** @typedef {Object} Core~BatchInfo
282
+ * @private
283
+ * @property {string=} reset //set columns
284
+ * @property {string=} insertion //add cols
285
+ * @property {string=} removal //remove cols
286
+ * @property {string=} moving //reorder
287
+ */
288
+ Core.BatchInfo;
289
+
278
290
  /** @typedef {Core.MouseInfo|ElementWrapper|Element} Core~CellReference
279
291
  * @description A section in core grid can be refered by the following object <br>
280
292
  * `{Core.MouseInfo}` : Object with valid x, y coordinates and section index <br>
@@ -529,6 +541,10 @@ Core.prototype._rowHeightTimerId = 0;
529
541
  * @private
530
542
  */
531
543
  Core.prototype._groupDefs = null;
544
+ /** @type {BatchInfo}
545
+ * @private
546
+ */
547
+ Core.prototype._batches = null;
532
548
  //#region Public Methods
533
549
 
534
550
  /**
@@ -536,7 +552,7 @@ Core.prototype._groupDefs = null;
536
552
  * @return {string}
537
553
  */
538
554
  Core.getVersion = function () {
539
- return "5.1.45";
555
+ return "5.1.50";
540
556
  };
541
557
  /** {@link ElementWrapper#dispose}
542
558
  * @override
@@ -1475,6 +1491,10 @@ Core.prototype.removeColumnAt = function (index) {
1475
1491
 
1476
1492
  if (this._hasListener("columnRemoved")) {
1477
1493
  var e = {};
1494
+ var batches = this._batches;
1495
+ if(batches){
1496
+ e["batches"] = batches;
1497
+ }
1478
1498
  e["atTheMiddle"] = true;
1479
1499
  e["colIndex"] = index;
1480
1500
  e["columns"] = "deprecated";
@@ -1745,6 +1765,7 @@ Core.prototype._moveColumn = function (fromCol, destCol) {
1745
1765
  }
1746
1766
  }
1747
1767
  this._updateColumnBounds();
1768
+ this._updateColumnSeparators();
1748
1769
  return true;
1749
1770
  };
1750
1771
 
@@ -2075,6 +2096,7 @@ Core.prototype.setDefaultRowHeight = function (val, opt_includeTitle) {
2075
2096
  this._syncRowHeights();
2076
2097
  this._rowHeightSync = true;
2077
2098
  this.setRowScrollingStep(this._rowScrollingStep);
2099
+ this._updateColumnSeparators();
2078
2100
  }
2079
2101
  };
2080
2102
 
@@ -2909,6 +2931,7 @@ Core.prototype.freezeColumn = function (frozenColIndex, numRightColumn) {
2909
2931
 
2910
2932
  this._onColumnCountChanged(); // Activate horizontal scrollbar and column virtualization
2911
2933
  this._updateScrollbarWidth(true, true);
2934
+ this._updateColumnSeparators();
2912
2935
  };
2913
2936
 
2914
2937
  /** @private
@@ -4150,6 +4173,21 @@ Core.prototype._updateColumnBounds = function () {
4150
4173
  section.updateColumnBounds(posAry, noBorderAry);
4151
4174
  }
4152
4175
  };
4176
+ /* @private
4177
+ */
4178
+ Core.prototype._updateColumnSeparators = function() {
4179
+ var sectCount = this._settings.length;
4180
+ if(!sectCount) {
4181
+ return;
4182
+ }
4183
+
4184
+ for(var i = 0; i < sectCount; i++) {
4185
+ var section = this._settings[i].getSection();
4186
+ if (section) {
4187
+ section.updateColumnSeparators();
4188
+ }
4189
+ }
4190
+ };
4153
4191
 
4154
4192
  /** @public
4155
4193
  * @param {number} startColIndex INCLUSIVE
@@ -4319,6 +4357,40 @@ Core.prototype.getColumnGroupChildIds = function (groupId) {
4319
4357
  }
4320
4358
  return null;
4321
4359
  };
4360
+
4361
+ /** @public
4362
+ * @param {string} batchType
4363
+ * @return {boolean}
4364
+ * @fires Core#beforeBatchOperation
4365
+ */
4366
+ Core.prototype.startBatch = function (batchType) {
4367
+ if(!batchType){
4368
+ return false;
4369
+ }
4370
+ if(!this._batches){
4371
+ this._batches = {};
4372
+ }
4373
+ this._batches[batchType] = batchType;
4374
+ this._dispatch("beforeBatchOperation", { batches: this._batches, batchType: batchType });
4375
+ return true;
4376
+ };
4377
+ /** @public
4378
+ * @param {string} batchType
4379
+ * @return {boolean}
4380
+ * @fires Core#afterBatchOperation
4381
+ */
4382
+ Core.prototype.stopBatch = function (batchType) {
4383
+ if(!batchType){
4384
+ return false;
4385
+ }
4386
+ this._dispatch("afterBatchOperation", { batches: this._batches, batchType: batchType });
4387
+
4388
+ delete this._batches[batchType];
4389
+ if(isEmptyObject(this._batches)){
4390
+ this._batches = null;
4391
+ }
4392
+ return true;
4393
+ };
4322
4394
  //#endregion Public Methods
4323
4395
 
4324
4396
  //#region Private Methods
@@ -4562,6 +4634,10 @@ Core.prototype._dispatchColumnAddedEvent = function (at, count, atTheMiddle, ctx
4562
4634
  if (this._hasListener("columnAdded")) {
4563
4635
  var e = {};
4564
4636
  e["atTheMiddle"] = atTheMiddle;
4637
+ var batches = this._batches;
4638
+ if(batches){
4639
+ e["batches"] = batches;
4640
+ }
4565
4641
  if(count === 1) {
4566
4642
  e["colIndex"] = at;
4567
4643
  e["context"] = ctx;
@@ -4713,6 +4789,10 @@ Core.prototype._removeColumn = function (num) { // TODO: change the logic to us
4713
4789
 
4714
4790
  if (this._hasListener("columnRemoved")) {
4715
4791
  var e = {};
4792
+ var batches = this._batches;
4793
+ if(batches){
4794
+ e["batches"] = batches;
4795
+ }
4716
4796
  for (var c = colCount; --c >= newCount; ) {
4717
4797
  var colDef = removedCols[c - newCount];
4718
4798
  e["colIndex"] = c;
@@ -5177,6 +5257,8 @@ Core.prototype._onRowCountChanged = function (e) {
5177
5257
  if(!forceUpdate) {
5178
5258
  this._updateVScrollbar(); // Asynchronous
5179
5259
  }
5260
+
5261
+ this._updateColumnSeparators();
5180
5262
  if(prevRowCount < newRowCount) {
5181
5263
  this._dispatch("rowAdded", e);
5182
5264
  } else if(prevRowCount > newRowCount) {
@@ -5234,7 +5316,7 @@ Core.prototype._onRowHeightChanged = function (e) {
5234
5316
  minSectionIndex >= this._startVScrollbarIndex);
5235
5317
  }
5236
5318
  }
5237
-
5319
+ this._updateColumnSeparators();
5238
5320
  this._dispatchRowPositionChanged();
5239
5321
  };
5240
5322
  /** @private
@@ -5299,6 +5381,7 @@ Core.prototype._onColumnCountChanged = function () {
5299
5381
  var pinnedRight = this._countPinnedRightColumns();
5300
5382
 
5301
5383
  this._updateColumnBounds();
5384
+ this._updateColumnSeparators();
5302
5385
 
5303
5386
  if (this._hScrollbarEnabled && pinnedLeft + pinnedRight < this.getColumnCount()) {
5304
5387
  this._hscrollbar.enable();
@@ -5580,6 +5663,7 @@ Core.prototype._syncLayoutToColumns = function (from, to, opt_forceDispatching)
5580
5663
  var paneChanged = forceUpdate || (from < this.getHScrollStartIndex()) || (to > this.getFirstPinnedRightIndex());
5581
5664
  this._updateScrollbarWidth(paneChanged, true /* contentChanged */);
5582
5665
  this._updateColumnBounds();
5666
+ this._updateColumnSeparators();
5583
5667
  this._dispatchColumnPositionChanged();
5584
5668
 
5585
5669
  if (dirty || opt_forceDispatching) {
@@ -5675,6 +5759,7 @@ Core.prototype._updateLayout = function () {
5675
5759
  var section = this._settings[s].getSection();
5676
5760
  section.updateLayout(); // Notify section about forced recalculation of the layout
5677
5761
  }
5762
+ this._updateColumnSeparators();
5678
5763
  };
5679
5764
 
5680
5765
  /** @private */
@@ -697,6 +697,10 @@ ILayoutGrid.prototype.calculateColumnBounds = function (lftIdx, rgtIdx, outPosit
697
697
  * @param {number=} topPx Top position of bound
698
698
  */
699
699
  ILayoutGrid.prototype.updateColumnBounds = function (posAry, noBorderAry, topPx) {};
700
+ /** @public
701
+ * @ignore
702
+ */
703
+ ILayoutGrid.prototype.updateColumnSeparators = function () {};
700
704
 
701
705
  export default ILayoutGrid;
702
706
  export { ILayoutGrid };
@@ -26,7 +26,11 @@ declare class LayoutGrid extends ElementWrapper {
26
26
 
27
27
  public setCellBounds(colIndex: number, rowIndex: number, width: number, height: number): void;
28
28
 
29
+ public updateColumnSeparators(): void;
30
+
29
31
  }
30
32
 
33
+ declare function rgtPx(): void;
34
+
31
35
  export default LayoutGrid;
32
36
  export { LayoutGrid };
@@ -269,7 +269,14 @@ LayoutGrid.prototype._colSelDirty = false;
269
269
  * @private
270
270
  */
271
271
  LayoutGrid.prototype._hscrollbar = null;
272
-
272
+ /** @type {Element}
273
+ * @private
274
+ */
275
+ LayoutGrid.prototype._leftColumnSeparator = null;
276
+ /** @type {Element}
277
+ * @private
278
+ */
279
+ LayoutGrid.prototype._rightColumnSeparator = null;
273
280
 
274
281
  /**
275
282
  * {@link ElementWrapper#dispose}
@@ -2236,8 +2243,7 @@ LayoutGrid.prototype.selectColumn = function (colIndex, selected) {
2236
2243
 
2237
2244
  var boundLayer = this._boundLayer;
2238
2245
  if(!boundLayer) {
2239
- boundLayer = this._boundLayer = document.createElement("div");
2240
- boundLayer.className = "cover-layer";
2246
+ this._initBoundLayer();
2241
2247
  this._updateLayers();
2242
2248
  }
2243
2249
  }
@@ -2409,6 +2415,92 @@ LayoutGrid.prototype.updateColumnBounds = function (posAry, noBorderAry, topPx)
2409
2415
  }
2410
2416
  };
2411
2417
 
2418
+ /** @public
2419
+ */
2420
+ LayoutGrid.prototype.updateColumnSeparators = function () {
2421
+ var pinnedLeftCount = this._hscrollbar.getPinnedLeftColumnCount();
2422
+ var pinnedRightCount = this._hscrollbar.getPinnedRightColumnCount();
2423
+ if ((pinnedLeftCount || pinnedRightCount) && !this._boundLayer) {
2424
+ this._initBoundLayer();
2425
+ }
2426
+
2427
+ var isScrollbarActive = false;
2428
+ if(this._hscrollbar) {
2429
+ isScrollbarActive = this._hscrollbar.isActive();
2430
+ }
2431
+
2432
+ var boundLayer = this._boundLayer;
2433
+
2434
+ var colSeparator = this._leftColumnSeparator;
2435
+ if (isScrollbarActive && pinnedLeftCount) {
2436
+ if (!colSeparator) {
2437
+ colSeparator = this._leftColumnSeparator = this._createColumnSeparator();
2438
+ }
2439
+ if (!colSeparator.parentNode) {
2440
+ if (boundLayer.children.length) {
2441
+ boundLayer.insertBefore(colSeparator, boundLayer.children[0]);
2442
+ } else {
2443
+ boundLayer.appendChild(colSeparator);
2444
+ }
2445
+ }
2446
+
2447
+ var rightPos = this._trackX.getLaneStart(pinnedLeftCount);
2448
+ colSeparator.style.left = (rightPos - 1) + "px";
2449
+ colSeparator.style.height = this._trackY.getTrackSize() + "px";
2450
+ } else {
2451
+ if (colSeparator && colSeparator.parentNode) {
2452
+ this._boundLayer.removeChild(colSeparator);
2453
+ }
2454
+ }
2455
+
2456
+ colSeparator = this._rightColumnSeparator;
2457
+ if (isScrollbarActive && pinnedRightCount) {
2458
+ if (!colSeparator) {
2459
+ colSeparator = this._rightColumnSeparator = this._createColumnSeparator();
2460
+ }
2461
+
2462
+ if (!colSeparator.parentNode) {
2463
+ if (boundLayer.children.length) {
2464
+ boundLayer.insertBefore(colSeparator, boundLayer.children[0]);
2465
+ } else {
2466
+ boundLayer.appendChild(colSeparator);
2467
+ }
2468
+ }
2469
+ var colCount = this.getColumnCount();
2470
+ var colWidth = this._trackX.getLaneEnd(colCount - 1) - this._trackX.getLaneStart(colCount - pinnedRightCount);
2471
+ var viewSize = this._getViewSize();
2472
+
2473
+ colSeparator.style.left = (viewSize - colWidth - this._rightSpaceSize) + "px";
2474
+ colSeparator.style.height = this._trackY.getTrackSize() + "px";
2475
+ } else {
2476
+ if (colSeparator && colSeparator.parentNode) {
2477
+ this._boundLayer.removeChild(colSeparator);
2478
+ }
2479
+ }
2480
+ };
2481
+
2482
+ /** @private
2483
+ * @return {Element}
2484
+ */
2485
+ LayoutGrid.prototype._createColumnSeparator = function() {
2486
+ var colSeparator = document.createElement("div");
2487
+ colSeparator.classList.add("column-separator");
2488
+ return colSeparator;
2489
+ };
2490
+
2491
+ /** @private
2492
+ * @return {Element}
2493
+ */
2494
+ LayoutGrid.prototype._initBoundLayer = function () {
2495
+ var boundLayer = this._boundLayer;
2496
+ if(!boundLayer) {
2497
+ boundLayer = this._boundLayer = document.createElement("div");
2498
+ boundLayer.className = "cover-layer";
2499
+ this._element.appendChild(boundLayer);
2500
+ }
2501
+ return boundLayer;
2502
+ };
2503
+
2412
2504
  /**
2413
2505
  * @private
2414
2506
  * @param {number} indexX
@@ -1102,6 +1102,12 @@ VirtualizedLayoutGrid.prototype.updateColumnBounds = function (posAry, noBorderA
1102
1102
  this._grid.updateColumnBounds(posAry, noBorderAry, topPx);
1103
1103
  this._updateRowBounds();
1104
1104
  };
1105
+ /** @public
1106
+ * @ignore
1107
+ */
1108
+ VirtualizedLayoutGrid.prototype.updateColumnSeparators = function () {
1109
+ this._grid.updateColumnSeparators();
1110
+ };
1105
1111
  /** @private
1106
1112
  */
1107
1113
  VirtualizedLayoutGrid.prototype._initBoundLayer = function () {
@@ -1541,6 +1541,9 @@ SortableTitlePlugin.prototype._sortDataView = function (opt_action) {
1541
1541
  if (!this._dataSorting) { return; }
1542
1542
 
1543
1543
  var sortCount = this._sortStates.length;
1544
+ if(this._userManagedLogic && sortCount > 1) { // The logic is managed by the user. There is no point in using multi-column sorting
1545
+ sortCount = 1;
1546
+ }
1544
1547
  var orders = null;
1545
1548
  var sortLogics = null;
1546
1549
  var c_ref = null;
@@ -1556,6 +1559,9 @@ SortableTitlePlugin.prototype._sortDataView = function (opt_action) {
1556
1559
  } else {
1557
1560
  c_ref = this.getColumnSortingFields();
1558
1561
  }
1562
+ if(this._userManagedLogic && c_ref.length > 1) {
1563
+ c_ref = c_ref.slice(0, 1);
1564
+ }
1559
1565
  }
1560
1566
 
1561
1567
  // Perform sorting even if there is no sort state