@refinitiv-ui/efx-grid 6.0.2 → 6.0.3

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 (54) hide show
  1. package/lib/column-format-dialog/lib/column-format-dialog.d.ts +13 -1
  2. package/lib/column-selection-dialog/lib/column-selection-dialog.d.ts +15 -2
  3. package/lib/column-selection-dialog/lib/column-selection-dialog.js +146 -5
  4. package/lib/core/dist/core.js +65 -27
  5. package/lib/core/dist/core.min.js +1 -1
  6. package/lib/core/es6/data/DataTable.js +32 -10
  7. package/lib/core/es6/data/DataView.d.ts +0 -6
  8. package/lib/core/es6/data/DataView.js +0 -4
  9. package/lib/core/es6/data/Segment.d.ts +2 -0
  10. package/lib/core/es6/data/Segment.js +7 -0
  11. package/lib/core/es6/data/WrappedView.js +6 -6
  12. package/lib/core/es6/grid/Core.js +15 -7
  13. package/lib/core/es6/grid/VirtualizedLayoutGrid.js +5 -0
  14. package/lib/filter-dialog/lib/checkbox-list.d.ts +13 -1
  15. package/lib/filter-dialog/lib/filter-dialog.d.ts +13 -1
  16. package/lib/filter-dialog/lib/filter-dialog.js +16 -3
  17. package/lib/grid/lib/efx-grid.d.ts +22 -10
  18. package/lib/grid/lib/efx-grid.js +8 -8
  19. package/lib/grid/themes/base.less +1 -1
  20. package/lib/grid/themes/halo/dark/efx-grid.js +1 -1
  21. package/lib/grid/themes/halo/dark/es5/all-elements.js +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/grid/themes/solar/charcoal/efx-grid.js +1 -1
  25. package/lib/grid/themes/solar/charcoal/es5/all-elements.js +1 -1
  26. package/lib/grid/themes/solar/pearl/efx-grid.js +1 -1
  27. package/lib/grid/themes/solar/pearl/es5/all-elements.js +1 -1
  28. package/lib/row-segmenting/es6/RowSegmenting.js +4 -2
  29. package/lib/rt-grid/dist/rt-grid.js +3 -1
  30. package/lib/rt-grid/dist/rt-grid.min.js +1 -1
  31. package/lib/rt-grid/es6/Grid.js +3 -1
  32. package/lib/tr-grid-checkbox/es6/Checkbox.d.ts +2 -1
  33. package/lib/tr-grid-checkbox/es6/Checkbox.js +13 -1
  34. package/lib/tr-grid-conditional-coloring/es6/ConditionalColoring.js +5 -1
  35. package/lib/tr-grid-in-cell-editing/es6/InCellEditing.d.ts +1 -1
  36. package/lib/tr-grid-in-cell-editing/es6/InCellEditing.js +13 -1
  37. package/lib/tr-grid-row-dragging/es6/RowDragging.d.ts +1 -3
  38. package/lib/tr-grid-row-dragging/es6/RowDragging.js +65 -60
  39. package/lib/tr-grid-row-selection/es6/RowSelection.d.ts +8 -8
  40. package/lib/tr-grid-row-selection/es6/RowSelection.js +32 -22
  41. package/lib/tr-grid-util/es6/ExpanderIcon.js +2 -2
  42. package/lib/tr-grid-util/es6/MultiTableManager.d.ts +8 -0
  43. package/lib/tr-grid-util/es6/MultiTableManager.js +164 -57
  44. package/lib/tr-grid-util/es6/RowPainter.js +16 -8
  45. package/lib/tr-grid-util/es6/jsx.d.ts +223 -0
  46. package/lib/types/es6/Checkbox.d.ts +2 -1
  47. package/lib/types/es6/Core/data/DataView.d.ts +0 -6
  48. package/lib/types/es6/Core/data/Segment.d.ts +2 -0
  49. package/lib/types/es6/InCellEditing.d.ts +1 -1
  50. package/lib/types/es6/RowDragging.d.ts +1 -3
  51. package/lib/types/es6/RowSelection.d.ts +8 -8
  52. package/lib/types/es6/index.d.ts +1 -0
  53. package/lib/versions.json +10 -10
  54. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import { customElement } from "@refinitiv-ui/core/decorators/custom-element.js";
2
+ import { JSXInterface } from "../../tr-grid-util/es6/jsx";
2
3
  import {
3
4
  BasicElement,
4
5
  html
@@ -60,5 +61,16 @@ declare class ColumnFormatDialog extends BasicElement {
60
61
 
61
62
  }
62
63
 
64
+ declare global {
65
+ interface HTMLElementTagNameMap {
66
+ "column-format-dialog": ColumnFormatDialog;
67
+ }
68
+ namespace JSX {
69
+ interface IntrinsicElements {
70
+ "column-format-dialog": ColumnFormatDialog | JSXInterface.HTMLAttributes;
71
+ }
72
+ }
73
+ }
74
+
63
75
  export { ColumnFormatDialog };
64
- export default ColumnFormatDialog;
76
+ export default ColumnFormatDialog;
@@ -1,12 +1,14 @@
1
1
  import { customElement } from "@refinitiv-ui/core/decorators/custom-element.js";
2
+ import { JSXInterface } from "../../tr-grid-util/es6/jsx";
2
3
  import { BasicElement, html } from "@refinitiv-ui/core";
3
4
  import "@refinitiv-ui/elements/button";
4
- import "@refinitiv-ui/elements/tree";
5
+ import { DefaultRenderer } from "@refinitiv-ui/elements/tree";
5
6
  import "@refinitiv-ui/elements/dialog";
6
7
  import "@refinitiv-ui/elements/search-field";
7
8
  import translation from "./locale/translation.js";
8
9
  import ElementObserver from "../../tr-grid-util/es6/ElementObserver.js";
9
10
  import { ElfUtil } from "../../tr-grid-util/es6/ElfUtil.js";
11
+ import { injectCss, prettifyCss } from "../../tr-grid-util/es6/Util.js";
10
12
 
11
13
  declare namespace ColumnSelectionDialog {
12
14
 
@@ -37,5 +39,16 @@ declare class ColumnSelectionDialog extends BasicElement {
37
39
 
38
40
  }
39
41
 
42
+ declare global {
43
+ interface HTMLElementTagNameMap {
44
+ "column-selection-dialog": ColumnSelectionDialog;
45
+ }
46
+ namespace JSX {
47
+ interface IntrinsicElements {
48
+ "column-selection-dialog": ColumnSelectionDialog | JSXInterface.HTMLAttributes;
49
+ }
50
+ }
51
+ }
52
+
40
53
  export { ColumnSelectionDialog };
41
- export default ColumnSelectionDialog;
54
+ export default ColumnSelectionDialog;
@@ -1,12 +1,13 @@
1
1
  import { customElement } from "@refinitiv-ui/core/decorators/custom-element.js";
2
2
  import { BasicElement, html } from "@refinitiv-ui/core";
3
3
  import "@refinitiv-ui/elements/button";
4
- import "@refinitiv-ui/elements/tree";
4
+ import { DefaultRenderer } from "@refinitiv-ui/elements/tree";
5
5
  import "@refinitiv-ui/elements/dialog";
6
6
  import "@refinitiv-ui/elements/search-field";
7
7
  import translation from "./locale/translation.js";
8
8
  import ElementObserver from "../../tr-grid-util/es6/ElementObserver.js";
9
9
  import { ElfUtil } from "../../tr-grid-util/es6/ElfUtil.js";
10
+ import { injectCss, prettifyCss } from "../../tr-grid-util/es6/Util.js";
10
11
 
11
12
  /**
12
13
  * @typedef {Object} ColumnSelectionDialog~Config
@@ -499,6 +500,7 @@ class ColumnSelectionDialog extends BasicElement {
499
500
  this._excludedLeftVisibleColumnList = []; // Visible left columns that is currently excluded from UI (eg. auto-generated column)
500
501
  this._excludedRightVisibleColumnList = []; // Visible right columns that is currently excluded from UI
501
502
  this._selectAllStatus = "";
503
+ this._treeDefualtRenderer = {};
502
504
 
503
505
  this._isMovable = this._isMovable.bind(this);
504
506
  this._treeValueChanged = this._treeValueChanged.bind(this);
@@ -515,7 +517,11 @@ class ColumnSelectionDialog extends BasicElement {
515
517
  this._handleMouseover = this._handleMouseover.bind(this);
516
518
  this._handleMouseout = this._handleMouseout.bind(this);
517
519
  this._handleSelectAllHeaderClick = this._handleSelectAllHeaderClick.bind(this);
520
+ this._handleInfoIconClicked = this._handleInfoIconClicked.bind(this);
521
+ this._handleInfoIconMouseover = this._handleInfoIconMouseover.bind(this);
522
+ this._handleInfoIconMouseout = this._handleInfoIconMouseout.bind(this);
518
523
  this._handleClick = this._handleClick.bind(this);
524
+ this._createTreeCustomRender = this._createTreeCustomRender.bind(this);
519
525
  this._selectAllCheckedChanged = this._selectAllCheckedChanged.bind(this);
520
526
  ElementObserver.addLanguageListener(this);
521
527
  }
@@ -683,6 +689,52 @@ class ColumnSelectionDialog extends BasicElement {
683
689
  this._visibleColumnsContainer.addEventListener('mouseout', this._handleMouseout);
684
690
  this._visibleColumnsContainer.addEventListener('click', this._handleClick);
685
691
  this._visibleColumnsContainer.addEventListener('dblclick', this._removeBtnClicked);
692
+
693
+ // icon custom renderer
694
+ if(this._descriptionBox) {
695
+ this._treeDefualtRenderer = new DefaultRenderer(this._tree);
696
+ this._tree.renderer = this._createTreeCustomRender;
697
+ }
698
+
699
+ // apply style for info icon
700
+ if(!this._styles) {
701
+ var styles = [
702
+ "ef-tree-item", [
703
+ "position: relative;"
704
+ ],
705
+ ".item", [
706
+ "display: flex;",
707
+ "justify-content: space-between;"
708
+ ],
709
+ ".div-icon", [
710
+ "position: absolute;",
711
+ "right: 0;",
712
+ "top: 0;",
713
+ "width: 24px;",
714
+ "height: 100%;",
715
+ "text-align: center;"
716
+ ],
717
+ ".info-icon", [
718
+ "display: block;",
719
+ "font-size: 18px;",
720
+ "height: 100%;",
721
+ "display: none"
722
+ ],
723
+ "ef-tree-item:hover .item .info-icon", [ // hover item will show icon
724
+ "display: inline-block;",
725
+ "color: #ffffff;" // icon-color white both dark and light theme
726
+ ],
727
+ "ef-tree-item .item .div-icon:hover", [ // hover icon will change icon background
728
+ "background-color: var(--color-scheme-primary);"
729
+ ],
730
+ ".bg-highligted", [ // effect ef-tree-item, when _handleInfoIconMouseover icon (disable highlighted background color)
731
+ "background-color: var(--color-scheme-tertiary);",
732
+ "color: var(--color-scheme-complementary);" // font text
733
+ ]
734
+ ];
735
+ this._styles = prettifyCss(styles);
736
+ injectCss(this._styles, this); // inject in column selection dialog dialog
737
+ }
686
738
  }
687
739
 
688
740
  /**
@@ -1188,10 +1240,7 @@ class ColumnSelectionDialog extends BasicElement {
1188
1240
  _handleClick(e) {
1189
1241
  var selectedElement = e.target; // Target should be ef-item
1190
1242
 
1191
- // click to display description
1192
- if (this._descriptionBox && this._initialColumnMap[selectedElement.value]) {
1193
- this._descriptionContainer.textContent = this._initialColumnMap[selectedElement.value].description;
1194
- }
1243
+ this._showDescription(selectedElement.value);
1195
1244
 
1196
1245
  if (!selectedElement.highlightable) {
1197
1246
  return;
@@ -1219,6 +1268,98 @@ class ColumnSelectionDialog extends BasicElement {
1219
1268
  this.requestUpdate();
1220
1269
  }
1221
1270
 
1271
+ /**
1272
+ * @private
1273
+ * @param {object} e - event object
1274
+ */
1275
+ _handleInfoIconClicked(e) {
1276
+ var targetElem = e.currentTarget;
1277
+ var divItem = targetElem.parentNode;
1278
+ var treeItem = divItem.parentNode;
1279
+ var value = treeItem.item.value;
1280
+ this._showDescription(value);
1281
+ e.stopPropagation();
1282
+ }
1283
+
1284
+ /**
1285
+ * @private
1286
+ * @param {object} e - event object
1287
+ */
1288
+ _handleInfoIconMouseover(e) {
1289
+ var targetElem = e.currentTarget;
1290
+ var divItem = targetElem.parentNode;
1291
+ var treeItem = divItem.parentNode;
1292
+ if(treeItem.highlighted) {
1293
+ treeItem.classList.add("bg-highligted");
1294
+ }
1295
+ }
1296
+
1297
+ /**
1298
+ * @private
1299
+ * @param {object} e - event object
1300
+ */
1301
+ _handleInfoIconMouseout(e) {
1302
+ var targetElem = e.currentTarget;
1303
+ var divItem = targetElem.parentNode;
1304
+ var treeItem = divItem.parentNode;
1305
+ if(treeItem.highlighted) {
1306
+ treeItem.classList.remove("bg-highligted");
1307
+ }
1308
+ }
1309
+
1310
+ /**
1311
+ * @private
1312
+ * @param {string} value of mapping item for show description
1313
+ */
1314
+ _showDescription(value) {
1315
+ if(!value) {
1316
+ return;
1317
+ }
1318
+ var rawValue = this._allItemMapping[value].rawValue; // restore rawValue for access initial value
1319
+ if (this._descriptionBox && this._initialColumnMap[rawValue]) {
1320
+ this._descriptionContainer.textContent = this._initialColumnMap[rawValue].description;
1321
+ }
1322
+ }
1323
+
1324
+ /**
1325
+ * @private
1326
+ * @param {object} item ef-tree-item element
1327
+ * @param {object} composer data collection composer for elf API wrapper
1328
+ * @param {object} element
1329
+ * @return {Object} custom renderer element
1330
+ */
1331
+ _createTreeCustomRender(item, composer, element) {
1332
+ // Use default renderer to create/recycle element
1333
+ element = this._treeDefualtRenderer(item, composer, element);
1334
+ var isParent = composer.isItemParent(item);
1335
+ var rawValue = item.rawValue;
1336
+ if (!isParent && this._initialColumnMap[rawValue].description) {
1337
+ var treeLabel = element._treeLabel;
1338
+ if (!treeLabel) {
1339
+ var div = document.createElement("div");
1340
+ treeLabel = document.createElement("div");
1341
+ element._treeLabel = treeLabel;
1342
+ var iconEl = document.createElement("ef-icon");
1343
+ var divIcon = document.createElement("div");
1344
+ div.classList.add("item");
1345
+ treeLabel.classList.add("tree-label");
1346
+ iconEl.classList.add("info-icon");
1347
+ iconEl.icon = "info";
1348
+ divIcon.classList.add("div-icon");
1349
+ divIcon.appendChild(iconEl);
1350
+ divIcon.addEventListener("tap", this._handleInfoIconClicked );
1351
+ divIcon.addEventListener("mouseover", this._handleInfoIconMouseover);
1352
+ divIcon.addEventListener("mouseout", this._handleInfoIconMouseout);
1353
+ div.appendChild(treeLabel);
1354
+ div.appendChild(divIcon);
1355
+ element.appendChild(div);
1356
+ } else {
1357
+ treeLabel = element.querySelector(".tree-label");
1358
+ }
1359
+ treeLabel.textContent = item.label;
1360
+ }
1361
+ return element;
1362
+ }
1222
1363
 
1223
1364
  /**
1224
1365
  * update up and down button
@@ -11981,6 +11981,13 @@ Segment.prototype.removeAllChildren = function(objMap) {
11981
11981
  Segment.prototype.getChildIds = function() {
11982
11982
  return this._childCount ? Object.keys(this._children) : [];
11983
11983
  };
11984
+ /** @public
11985
+ * @return {number}
11986
+ */
11987
+ Segment.prototype.getChildCount = function() {
11988
+ return this._childCount;
11989
+ };
11990
+
11984
11991
 
11985
11992
 
11986
11993
  /** @public
@@ -13356,6 +13363,7 @@ DataTable.prototype.isFrozen = function() {
13356
13363
  */
13357
13364
  DataTable.prototype.setSegmentSeparator = function(rid, enabled) {
13358
13365
  var change = false;
13366
+ var memberCount = 0;
13359
13367
  if(typeof rid === "string") {
13360
13368
  if(enabled !== false) {
13361
13369
  if(!this._segments) {
@@ -13365,16 +13373,20 @@ DataTable.prototype.setSegmentSeparator = function(rid, enabled) {
13365
13373
  change = true;
13366
13374
  }
13367
13375
  } else if(this._segments) {
13368
- if(this._segments.removeSegment(rid)) {
13369
- change = true;
13370
- if(!this._segments.getSegmentCount()) {
13371
- this._segments = null;
13376
+ var segment = this._segments.getSegment(rid);
13377
+ if(segment) {
13378
+ memberCount = segment.getChildCount();
13379
+ if(this._segments.removeSegment(rid)) {
13380
+ change = true;
13381
+ if(!this._segments.getSegmentCount()) {
13382
+ this._segments = null;
13383
+ }
13372
13384
  }
13373
13385
  }
13374
13386
  }
13375
13387
  }
13376
13388
  if(change && this._needFiring()) {
13377
- if(this._autoFillSegments()) {
13389
+ if(this._autoFillSegments() || memberCount) {
13378
13390
  this.dispatchGlobalChange();
13379
13391
  } else {
13380
13392
  var rowData = this._rows[rid] || null;
@@ -13486,13 +13498,14 @@ DataTable.prototype._autoFillSegments = function() {
13486
13498
  }
13487
13499
  return false;
13488
13500
  };
13489
- /** Remove existing segment children and fill the segments with all contnet rows before the next segment separator
13501
+ /** Remove existing segment children and fill the segments with all content rows before the next segment separator
13490
13502
  * @public
13491
13503
  * @param {string} segmentId Row id
13492
13504
  */
13493
13505
  DataTable.prototype.fillSegment = function(segmentId) {
13494
13506
  if(this._segments) {
13495
13507
  this._segments.fillSegment(segmentId, this._rids);
13508
+ this.dispatchGlobalChange();
13496
13509
  }
13497
13510
  };
13498
13511
  /** Remove all existing segment children in each segment and fill the segments with all contnet rows before the next segment separator
@@ -13501,7 +13514,11 @@ DataTable.prototype.fillSegment = function(segmentId) {
13501
13514
  */
13502
13515
  DataTable.prototype.fillSegments = function() {
13503
13516
  if(this._segments) {
13504
- return this._segments.fillSegments(this._rids);
13517
+ var dirty = this._segments.fillSegments(this._rids);
13518
+ if(dirty) {
13519
+ this.dispatchGlobalChange();
13520
+ }
13521
+ return dirty;
13505
13522
  }
13506
13523
  return false;
13507
13524
  };
@@ -13546,7 +13563,11 @@ DataTable.prototype.addSegmentChildren = function(segmentId, rids) {
13546
13563
  */
13547
13564
  DataTable.prototype.removeSegmentChild = function(segmentId, rid) {
13548
13565
  if(this._segments) {
13549
- return this._segments.removeSegmentChild(segmentId, rid);
13566
+ var dirty = this._segments.removeSegmentChild(segmentId, rid);
13567
+ if(dirty) {
13568
+ this.dispatchGlobalChange();
13569
+ }
13570
+ return dirty;
13550
13571
  }
13551
13572
  return false;
13552
13573
  };
@@ -13557,7 +13578,11 @@ DataTable.prototype.removeSegmentChild = function(segmentId, rid) {
13557
13578
  */
13558
13579
  DataTable.prototype.removeSegmentChildren = function(segmentId, rids) {
13559
13580
  if(this._segments) {
13560
- return this._segments.removeSegmentChildren(segmentId, rids);
13581
+ var dirty = this._segments.removeSegmentChildren(segmentId, rids);
13582
+ if(dirty) {
13583
+ this.dispatchGlobalChange();
13584
+ }
13585
+ return dirty;
13561
13586
  }
13562
13587
  return false;
13563
13588
  };
@@ -13566,7 +13591,11 @@ DataTable.prototype.removeSegmentChildren = function(segmentId, rids) {
13566
13591
  */
13567
13592
  DataTable.prototype.removeAllSegmentChildren = function() {
13568
13593
  if(this._segments) {
13569
- return this._segments.removeAllSegmentChildren();
13594
+ var dirty = this._segments.removeAllSegmentChildren();
13595
+ if (dirty) {
13596
+ this.dispatchGlobalChange();
13597
+ }
13598
+ return dirty;
13570
13599
  }
13571
13600
  return false;
13572
13601
  };
@@ -15523,7 +15552,7 @@ WrappedView.prototype.addRowExpansion = function(rid, count) {
15523
15552
  * @param {string} rid Row Id
15524
15553
  */
15525
15554
  WrappedView.prototype.removeRowExpansion = function(rid) {
15526
- this._dv.removeRowExpansion(rid, count);
15555
+ this._dv.removeRowExpansion(rid);
15527
15556
  };
15528
15557
  /**
15529
15558
  * @public
@@ -15730,7 +15759,7 @@ WrappedView.prototype.setSegmentCollapsingLogic = function() {};
15730
15759
  */
15731
15760
  WrappedView.prototype.isSegmentCollapsed = function(rowRef) {
15732
15761
  var rid = this._toRowId(rowRef);
15733
- return this._dv.isSegmentCollapsed(rid, collapsed);
15762
+ return this._dv.isSegmentCollapsed(rid);
15734
15763
  };
15735
15764
  /** Remove existing segment children and fill the segments with all contnet rows before the next segment separator
15736
15765
  * @public
@@ -15763,8 +15792,8 @@ WrappedView.prototype.addSegmentChild = function(segmentRef, rowRef) {
15763
15792
  */
15764
15793
  WrappedView.prototype.addSegmentChildren = function(segmentRef, rowRefs) {
15765
15794
  var segmentId = this._toRowId(segmentRef);
15766
- var rowId = this._toRowId(rowRef);
15767
- return this._dv.addSegmentChildren(segmentId, rowId);
15795
+ var rowIds = this._toRowIds(rowRefs);
15796
+ return this._dv.addSegmentChildren(segmentId, rowIds);
15768
15797
  };
15769
15798
  /** @public
15770
15799
  * @param {string|number} segmentRef Row id or row index
@@ -15783,8 +15812,8 @@ WrappedView.prototype.removeSegmentChild = function(segmentRef, rowRef) {
15783
15812
  */
15784
15813
  WrappedView.prototype.removeSegmentChildren = function(segmentRef, rowRefs) {
15785
15814
  var segmentId = this._toRowId(segmentRef);
15786
- var rowId = this._toRowId(rowRef);
15787
- return this._dv.removeSegmentChildren(segmentId, rowId);
15815
+ var rowIds = this._toRowIds(rowRefs);
15816
+ return this._dv.removeSegmentChildren(segmentId, rowIds);
15788
15817
  };
15789
15818
  /** @public
15790
15819
  * @return {boolean} Return true if there is any change
@@ -16088,10 +16117,6 @@ Conflator.prototype.enable = function (opt_enabled) {
16088
16117
 
16089
16118
 
16090
16119
 
16091
- /** @typedef {DataTable|WrappedView|DataView} DataView~IDataView
16092
- * @description DataView like classes
16093
- */
16094
-
16095
16120
  /** @event DataView#dataChanged
16096
16121
  * @description Trigger when data within the data view has been changed. Not only actual change in data, but also position change will trigger this event.
16097
16122
  * @property {boolean} globalChange Indicates a big change. User should expect all data has been change. With active sorting or filtering, this flag will always be true due to multiple changes in row position.
@@ -21283,6 +21308,11 @@ es6_Ext.inherits(VirtualizedLayoutGrid, components_ElementWrapper);
21283
21308
  */
21284
21309
  VirtualizedLayoutGrid.prototype._index = -1;
21285
21310
 
21311
+ /** Number of rows offsetting from the first section
21312
+ * @private
21313
+ * @type {number}
21314
+ */
21315
+ VirtualizedLayoutGrid.prototype._rowOffset = 0;
21286
21316
  /** For virtualization in Y-Axis
21287
21317
  * @private
21288
21318
  * @type {number}
@@ -22927,7 +22957,7 @@ Core_Core.prototype._preserveGridSize = false;
22927
22957
  * @return {string}
22928
22958
  */
22929
22959
  Core_Core.getVersion = function () {
22930
- return "5.0.50";
22960
+ return "5.0.53";
22931
22961
  };
22932
22962
  /** {@link ElementWrapper#dispose}
22933
22963
  * @override
@@ -23246,6 +23276,10 @@ Core_Core.prototype.addSectionAt = function (at, opt_type, opt_sectionName) {
23246
23276
  }
23247
23277
 
23248
23278
  this._updateSectionIndices(at);
23279
+ if (this._autoSetDataSource) {
23280
+ // This could trigger data binding and column virtualization
23281
+ sectionSettings.setDataSource(this._dataSource);
23282
+ }
23249
23283
 
23250
23284
  sectType = sectionSettings.getType();
23251
23285
  if (sectType === "footer") {
@@ -26468,9 +26502,6 @@ Core_Core.prototype._newSection = function (opt_type, sectionName) {
26468
26502
  section.listen("rowCountChanged", this._onRowCountChanged);
26469
26503
  section.listen("rowHeightChanged", this._onRowHeightChanged);
26470
26504
 
26471
- if (this._autoSetDataSource) {
26472
- sectionSettings.setDataSource(this._dataSource);
26473
- }
26474
26505
  return sectionSettings;
26475
26506
  };
26476
26507
 
@@ -26761,7 +26792,12 @@ Core_Core.prototype._removeColumn = function (num) { // TODO: change the logic
26761
26792
  */
26762
26793
  Core_Core.prototype._onSectionDataChanged = function (e) {
26763
26794
  if(this._dispatchingDataChanged) { return; } // Prevent infinite loop
26764
- this._dispatchingDataChanged = true;
26795
+
26796
+ var colCount = this._layoutX.getLaneCount();
26797
+ this._dispatchingDataChanged = colCount ? true : false;
26798
+ if(!colCount) {
26799
+ return;
26800
+ }
26765
26801
 
26766
26802
  var fromR = /** @type{number} */(e["fromRowIndex"]);
26767
26803
  var toR = /** @type{number} */(e["toRowIndex"]);
@@ -26776,7 +26812,6 @@ Core_Core.prototype._onSectionDataChanged = function (e) {
26776
26812
  }
26777
26813
  this._dispatch("preSectionDataBinding", e);
26778
26814
 
26779
- var colCount = this._layoutX.getLaneCount();
26780
26815
  var dataMap = this.getDataColumnMap();
26781
26816
  for (var c = 0; c < colCount; ++c) {
26782
26817
  if(section["isColumnActive"](c) && (this.isColumnVisible(c) || this._isAlwaysRenderColumn(c))) {
@@ -26882,6 +26917,9 @@ Core_Core.prototype._onRowInViewChanged = function (e) { // Triggered from virtu
26882
26917
  * @param {Object} e
26883
26918
  */
26884
26919
  Core_Core.prototype._onColInViewChanged = function (e) {
26920
+ if(!this.getColumnCount()) {
26921
+ return; // No column for activation and no cell to be rendered
26922
+ }
26885
26923
  var pfi = e["prevFirstIndex"];
26886
26924
  var pli = e["prevLastIndex"]; // INCLUSIVE
26887
26925
  var fi = e["firstIndex"];
@@ -27197,7 +27235,7 @@ Core_Core.prototype._onColumnCountChanged = function () {
27197
27235
  // TODO: Optimize these methods during initialization
27198
27236
  var pinnedLeft = this._countPinnedLeftColumns();
27199
27237
  var pinnedRight = this._countPinnedRightColumns();
27200
- ///
27238
+
27201
27239
  this._updateColumnBounds();
27202
27240
 
27203
27241
  if (this._hScrollbarEnabled && pinnedLeft + pinnedRight < this.getColumnCount()) {