@refinitiv-ui/efx-grid 6.0.106 → 6.0.108

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. package/lib/core/dist/core.js +162 -59
  2. package/lib/core/dist/core.min.js +1 -1
  3. package/lib/core/es6/grid/Core.d.ts +2 -2
  4. package/lib/core/es6/grid/Core.js +156 -55
  5. package/lib/core/es6/grid/ILayoutGrid.js +1 -1
  6. package/lib/core/es6/grid/components/Scrollbar.js +5 -3
  7. package/lib/filter-dialog/lib/filter-dialog.d.ts +2 -0
  8. package/lib/filter-dialog/lib/filter-dialog.js +23 -1
  9. package/lib/filter-dialog/themes/base-checkbox.less +1 -2
  10. package/lib/filter-dialog/themes/elemental/dark/checkbox-list.js +1 -1
  11. package/lib/filter-dialog/themes/elemental/dark/es5/all-elements.js +1 -1
  12. package/lib/filter-dialog/themes/elemental/light/checkbox-list.js +1 -1
  13. package/lib/filter-dialog/themes/elemental/light/es5/all-elements.js +1 -1
  14. package/lib/filter-dialog/themes/halo/dark/checkbox-list.js +1 -1
  15. package/lib/filter-dialog/themes/halo/dark/es5/all-elements.js +1 -1
  16. package/lib/filter-dialog/themes/halo/light/checkbox-list.js +1 -1
  17. package/lib/filter-dialog/themes/halo/light/es5/all-elements.js +1 -1
  18. package/lib/filter-dialog/themes/solar/charcoal/checkbox-list.js +1 -1
  19. package/lib/filter-dialog/themes/solar/charcoal/es5/all-elements.js +1 -1
  20. package/lib/filter-dialog/themes/solar/pearl/checkbox-list.js +1 -1
  21. package/lib/filter-dialog/themes/solar/pearl/es5/all-elements.js +1 -1
  22. package/lib/formatters/es6/index.d.ts +22 -1
  23. package/lib/formatters/es6/index.js +22 -1
  24. package/lib/grid/index.js +1 -1
  25. package/lib/rt-grid/dist/rt-grid.js +13 -12
  26. package/lib/rt-grid/dist/rt-grid.min.js +1 -1
  27. package/lib/rt-grid/es6/FieldDefinition.js +1 -1
  28. package/lib/tr-grid-column-grouping/es6/ColumnGrouping.js +1452 -1304
  29. package/lib/tr-grid-in-cell-editing/es6/InCellEditing.js +128 -89
  30. package/lib/tr-grid-row-filtering/es6/RowFiltering.d.ts +2 -0
  31. package/lib/tr-grid-row-filtering/es6/RowFiltering.js +14 -0
  32. package/lib/tr-grid-util/es6/GroupDefinitions.js +3 -3
  33. package/lib/types/es6/Core/grid/Core.d.ts +2 -2
  34. package/lib/types/es6/RowFiltering.d.ts +2 -0
  35. package/lib/types/es6/SimpleTickerFormatter.d.ts +0 -2
  36. package/lib/versions.json +6 -6
  37. package/package.json +1 -1
@@ -3783,7 +3783,7 @@ ILayoutGrid.prototype.setRowOffset = function (index) { };
3783
3783
  ILayoutGrid.prototype.updateLayout = function () { };
3784
3784
 
3785
3785
  /** This will make the specified cell horizontally span to fit entire row regardless of position of the cell -- cell will shift to the left most of the section.<br>
3786
- * If opt_noLeftStretching is true, the cell will not extend to the left most position<br>
3786
+ * If onlyToTheRight is true, the cell will not extend to the left most position<br>
3787
3787
  * This is different from cell colSpan, which the cell remain in the same position. tr-stretched class will also be added to the cell
3788
3788
  * @public
3789
3789
  * @param {number|Cell} cellRef Either column index or cell reference is acceptable
@@ -6391,7 +6391,6 @@ Scrollbar.updateTrackThickness = function () {
6391
6391
 
6392
6392
  /** @override */
6393
6393
  Scrollbar.prototype.dispose = function () {
6394
-
6395
6394
  let sbListeners = Scrollbar._listeners;
6396
6395
  if(sbListeners) {
6397
6396
  let idx = sbListeners.indexOf(this._onThicknessChanged);
@@ -6855,7 +6854,7 @@ Scrollbar.prototype._clearAllPanes = function() {
6855
6854
  */
6856
6855
  Scrollbar.prototype.disableKeyboardInput = function (opt_disabled) {
6857
6856
  if(opt_disabled === false) {
6858
- this._element.setAttribute("tabindex", "0");
6857
+ this._element.setAttribute("tabindex", "-1"); // tabindex makes the element focusable. The negative value exclude it from tab key navigation
6859
6858
  this._element.addEventListener("keydown", this._onKeyDown, false);
6860
6859
  } else {
6861
6860
  this._element.removeAttribute("tabindex");
@@ -7050,8 +7049,11 @@ Scrollbar.prototype._onStartFading = function (e) {
7050
7049
  * @param {Object} e
7051
7050
  */
7052
7051
  Scrollbar.prototype._onTrackScroll = function (e) {
7053
- let tScrollVal = (this._vertical) ? e.target["scrollTop"] : e.target["scrollLeft"];
7052
+ if(!this._element) {
7053
+ return; // Element has been disposed
7054
+ }
7054
7055
 
7056
+ let tScrollVal = (this._vertical) ? e.target["scrollTop"] : e.target["scrollLeft"];
7055
7057
  let pScrollVal = this._convertTrackToPane(tScrollVal);
7056
7058
 
7057
7059
  pScrollVal = this._calcProperScrollValue(pScrollVal);
@@ -25140,6 +25142,9 @@ VirtualizedLayoutGrid._proto = VirtualizedLayoutGrid.prototype;
25140
25142
  /** @event Core#preForcedUpdate
25141
25143
  * @ignore
25142
25144
  */
25145
+ /** @event Core#tabNavigation
25146
+ * @ignore
25147
+ */
25143
25148
  //#endregion Events
25144
25149
 
25145
25150
  /** @private
@@ -25150,6 +25155,44 @@ VirtualizedLayoutGrid._proto = VirtualizedLayoutGrid.prototype;
25150
25155
  let ascNumberSorter = function (a, b) {
25151
25156
  return a - b;
25152
25157
  };
25158
+ /** @private
25159
+ * @return {!Element}
25160
+ */
25161
+ let _createHiddenInput = function () {
25162
+ let hiddenInput = document.createElement("input");
25163
+ let styleObj = hiddenInput.style;
25164
+ styleObj.position = "absolute";
25165
+ styleObj.width = styleObj.height = styleObj.padding = styleObj.border = "0";
25166
+ hiddenInput.value = "0";
25167
+ return hiddenInput;
25168
+ };
25169
+ /** @private
25170
+ * @param {Object} e
25171
+ * @return {boolean}
25172
+ */
25173
+ let _isTabCommand = function (e) {
25174
+ if(e.keyCode === 9) {
25175
+ return !e.ctrlKey && !e.altKey && !e.metaKey;
25176
+ }
25177
+ return false;
25178
+ };
25179
+ /** @private
25180
+ * @param {Element} elem
25181
+ * @return {Element}
25182
+ */
25183
+ let _getActiveElement = function (elem) {
25184
+ if(elem) {
25185
+ if(elem.getRootNode) {
25186
+ let rootNode = elem.getRootNode(); // Get uncomposed root node
25187
+ if(rootNode && rootNode !== elem) { // The root node could be the element itself, if it is not attached to the DOM tree
25188
+ return rootNode.activeElement || null;
25189
+ }
25190
+ } else { // Older browser does not support getRootNode
25191
+ return document.activeElement;
25192
+ }
25193
+ }
25194
+ return null;
25195
+ };
25153
25196
 
25154
25197
  /** @constructor
25155
25198
  * @param {Element=} opt_initializer this can be either element id (string) or DOM element.
@@ -25173,6 +25216,8 @@ let Core_Core = function (opt_initializer) {
25173
25216
  _t._onMouseMove = _t._onMouseMove.bind(_t);
25174
25217
  _t._onRowHightlighted = _t._onRowHightlighted.bind(_t);
25175
25218
  _t._onGridClicked = _t._onGridClicked.bind(_t);
25219
+ _t._onKeyDown = _t._onKeyDown.bind(_t);
25220
+ _t._onKeyUp = _t._onKeyUp.bind(_t);
25176
25221
 
25177
25222
  _t._onWindowResize = _t._onWindowResize.bind(_t);
25178
25223
  _t._onSectionDataChanged = _t._onSectionDataChanged.bind(_t);
@@ -25193,7 +25238,7 @@ let Core_Core = function (opt_initializer) {
25193
25238
  _t._onColInViewChanged = _t._onColInViewChanged.bind(_t);
25194
25239
 
25195
25240
  _t._updateVScrollbar = _t._updateVScrollbar.bind(_t);
25196
- _t._updateColumnBounds = _t._updateColumnBounds.bind(_t);
25241
+ _t.updateColumnBounds = _t.updateColumnBounds.bind(_t);
25197
25242
  _t._dispatchColumnPositionChanged = _t._dispatchColumnPositionChanged.bind(_t);
25198
25243
  _t._dispatchRowPositionChanged = _t._dispatchRowPositionChanged.bind(_t);
25199
25244
  _t._requestScrollbarUpdate = _t._requestScrollbarUpdate.bind(_t);
@@ -25234,7 +25279,7 @@ let Core_Core = function (opt_initializer) {
25234
25279
  // Initialize vertical scrollbar
25235
25280
  _t._vscrollbar = new components_VScrollbar();
25236
25281
  _t._vscrollbar.disable();
25237
- _t._vscrollbar.setParent(this.getParent() || this.getElement());
25282
+ _t._vscrollbar.setParent(_t.getParent() || _t.getElement());
25238
25283
 
25239
25284
  _t._vscrollbar.listen("scroll", _t._onVScroll);
25240
25285
  _t._vscrollbar.listen("layoutChanged", _t._onVScroll);
@@ -25247,25 +25292,28 @@ let Core_Core = function (opt_initializer) {
25247
25292
  // Initialize horizontal scrollbars
25248
25293
  _t._hscrollbar = new components_HScrollbar();
25249
25294
  _t._hscrollbar.disable();
25250
- _t._hscrollbar.setParent(this.getParent() || this.getElement());
25295
+ _t._hscrollbar.setParent(_t.getParent() || _t.getElement());
25251
25296
 
25252
- _t._hscrollbar.listen("scroll", this._onHScroll);
25253
- _t._hscrollbar.listen("layoutChanged", this._onHScroll);
25254
- _t._hscrollbar.listen("activated", this.updateLayout);
25255
- _t._hscrollbar.listen("deactivated", this.updateLayout);
25297
+ _t._hscrollbar.listen("scroll", _t._onHScroll);
25298
+ _t._hscrollbar.listen("layoutChanged", _t._onHScroll);
25299
+ _t._hscrollbar.listen("activated", _t.updateLayout);
25300
+ _t._hscrollbar.listen("deactivated", _t.updateLayout);
25256
25301
 
25257
25302
  // cross-reference scrollbars
25258
25303
  _t._hscrollbar.setOtherScrollbar(_t._vscrollbar);
25259
25304
  _t._vscrollbar.setOtherScrollbar(_t._hscrollbar);
25260
25305
 
25306
+
25307
+ _t._element.addEventListener("keydown", _t._onKeyDown);
25308
+ _t._element.addEventListener("keyup", _t._onKeyUp);
25261
25309
  if (util.isMobile || util.isTouchDevice) {
25262
- _t._element.addEventListener("touchmove", this._onMouseMove, false);
25310
+ _t._element.addEventListener("touchmove", _t._onMouseMove, false);
25263
25311
  } else {
25264
- _t._element.addEventListener("mousemove", this._onMouseMove, false);
25312
+ _t._element.addEventListener("mousemove", _t._onMouseMove, false);
25265
25313
  }
25266
25314
 
25267
25315
  if(util.isSafari){
25268
- _t._element.addEventListener("click", this._onGridClicked);
25316
+ _t._element.addEventListener("click", _t._onGridClicked);
25269
25317
  }
25270
25318
 
25271
25319
  window.addEventListener("resize", _t._onWindowResize, false); // Should be unlistened after destroyed
@@ -25273,10 +25321,17 @@ let Core_Core = function (opt_initializer) {
25273
25321
  _t._colVirtualizer.listen("indexChanged", _t._onColInViewChanged);
25274
25322
  _t._rowHeightConflator = new util_Conflator(_t._onRowHeightChanged, 50);
25275
25323
  _t._vScrollbarConflator = new util_Conflator(_t._updateVScrollbar, 200);
25276
- _t._columnBoundConflator = new util_Conflator(_t._updateColumnBounds, 10);
25324
+ _t._columnBoundConflator = new util_Conflator(_t.updateColumnBounds, 10);
25277
25325
  _t._columnPositionConflator = new util_Conflator(_t._dispatchColumnPositionChanged, 10);
25278
25326
  _t._rowPositionConflator = new util_Conflator(_t._dispatchRowPositionChanged, 10);
25279
25327
 
25328
+ _t._firstHiddenInput = _createHiddenInput();
25329
+ _t._firstHiddenInput.className = "first-input";
25330
+ _t._lastHiddenInput = _createHiddenInput();
25331
+ _t._lastHiddenInput.className = "last-input";
25332
+ _t._element.insertBefore(_t._firstHiddenInput, _t._element.firstChild);
25333
+ _t._element.appendChild(_t._lastHiddenInput);
25334
+
25280
25335
  // Initialize events for external users
25281
25336
  _t._addEvents(
25282
25337
  "sectionAdded",
@@ -25305,7 +25360,8 @@ let Core_Core = function (opt_initializer) {
25305
25360
  "beforeColumnBoundUpdate",
25306
25361
  "beforeBatchOperation",
25307
25362
  "afterBatchOperation",
25308
- "pinningChanged"
25363
+ "pinningChanged",
25364
+ "tabNavigation"
25309
25365
  );
25310
25366
 
25311
25367
  // For debugging in advanced optimization mode
@@ -25314,9 +25370,9 @@ let Core_Core = function (opt_initializer) {
25314
25370
  map = {};
25315
25371
  Core_Core["map"] = map;
25316
25372
  }
25317
- let elem = _t._element;
25318
- elem["_control"] = _t;
25319
- let id = elem.id || elem.name;
25373
+
25374
+ _t._element["_control"] = _t;
25375
+ let id = _t._element.id || _t._element.name;
25320
25376
  if(!id || map[id]) {
25321
25377
  id = "_grid" + Core_Core._runningGridId;
25322
25378
  }
@@ -25324,17 +25380,6 @@ let Core_Core = function (opt_initializer) {
25324
25380
  map[id] = _t;
25325
25381
  Core_Core._runningGridId++;
25326
25382
 
25327
- // init hiddenInput for retrieve copy and cut event
25328
- let hiddenInput = document.createElement("input");
25329
- hiddenInput.style.position = "absolute";
25330
- hiddenInput.style.width = "0";
25331
- hiddenInput.style.height = "0";
25332
- hiddenInput.style.padding = "0";
25333
- hiddenInput.style.border = "0";
25334
- hiddenInput.value = "0";
25335
- _t._hiddenInput = hiddenInput;
25336
- elem.insertBefore(hiddenInput, elem.firstChild);
25337
-
25338
25383
  // Ensure all affected plugins are loaded prior zoom plugin
25339
25384
  // use as entity to trigger updateLayout once zoom is changed
25340
25385
  Object.defineProperty(_t, "zoomFactor", {
@@ -25614,11 +25659,16 @@ Core_Core.prototype._rowRefreshTimer = 0;
25614
25659
  * @private
25615
25660
  */
25616
25661
  Core_Core.prototype._layoutUpdating = false;
25617
- /** A Hidden input that allow to get cut and copy event when user perform cut, copy activities
25618
- * @type {Element}
25662
+ /** A hidden input that allows grid to receive keyboard input and focus
25663
+ * @type {!Element}
25619
25664
  * @private
25620
25665
  */
25621
- Core_Core.prototype._hiddenInput;
25666
+ Core_Core.prototype._firstHiddenInput;
25667
+ /** A hidden input that allows grid to receive keyboard input and focus
25668
+ * @type {!Element}
25669
+ * @private
25670
+ */
25671
+ Core_Core.prototype._lastHiddenInput;
25622
25672
  /** @type {number}
25623
25673
  * @private
25624
25674
  */
@@ -25662,7 +25712,7 @@ Core_Core.prototype._hasPendingRowChange = false;
25662
25712
  * @return {string}
25663
25713
  */
25664
25714
  Core_Core.getVersion = function () {
25665
- return "5.1.107";
25715
+ return "5.1.110";
25666
25716
  };
25667
25717
  /** {@link ElementWrapper#dispose}
25668
25718
  * @override
@@ -25723,11 +25773,12 @@ Core_Core.prototype.dispose = function () {
25723
25773
 
25724
25774
  // Clean Top node
25725
25775
  let elem = this._element;
25726
- if (elem !== null) {
25776
+ if (elem) {
25727
25777
  if (elem["_control"]) {
25728
25778
  delete elem["_control"];
25729
25779
  }
25730
- elem.removeChild(this._hiddenInput);
25780
+ elem.removeChild(this._firstHiddenInput);
25781
+ elem.removeChild(this._lastHiddenInput);
25731
25782
  }
25732
25783
  this._dispose();
25733
25784
 
@@ -26892,7 +26943,7 @@ Core_Core.prototype._moveColumn = function (fromCol, destCol) {
26892
26943
  this._colVirtualizer.update();
26893
26944
  }
26894
26945
  }
26895
- this._updateColumnBounds();
26946
+ this.updateColumnBounds();
26896
26947
  this._updateColumnSeparators();
26897
26948
  return true;
26898
26949
  };
@@ -29125,15 +29176,14 @@ Core_Core.prototype.reserveRightSpace = function (size) {
29125
29176
  return false;
29126
29177
  };
29127
29178
 
29128
- /** Get hidden input in grid <br>
29129
- * this input for make grid can copy <br>
29130
- * normal user should not touch it <br>
29131
- * but sometime grid extension will have to use this element
29179
+ /** Get the hidden input. This input allows grid to receive keyboard input
29132
29180
  * @public
29133
- * @return {Element}
29181
+ * @ignore
29182
+ * @param {boolean} firstInput
29183
+ * @return {!Element}
29134
29184
  */
29135
- Core_Core.prototype.getHiddenInput = function () {
29136
- return this._hiddenInput;
29185
+ Core_Core.prototype.getHiddenInput = function (firstInput) {
29186
+ return firstInput ? this._firstHiddenInput : this._lastHiddenInput;
29137
29187
  };
29138
29188
 
29139
29189
  /** Focus grid element without bringing grid into window's view. This is useful when grid is very wide or tall, since window can be scrolled to focused element by default in some browsers.
@@ -29142,8 +29192,8 @@ Core_Core.prototype.getHiddenInput = function () {
29142
29192
  * @see {@link http://help.dottoro.com/ljqmdirr.php}
29143
29193
  */
29144
29194
  Core_Core.prototype.focus = function () {
29145
- let elem = this._hiddenInput;
29146
- let activeElem = document.activeElement;
29195
+ let elem = this._lastHiddenInput;
29196
+ let activeElem = _getActiveElement(elem);
29147
29197
  if(elem && elem !== activeElem) {
29148
29198
  let x = window.pageXOffset;
29149
29199
  let y = window.pageYOffset;
@@ -29274,7 +29324,7 @@ Core_Core.prototype.selectColumn = function (colIndex, selected) {
29274
29324
  for (let i = this._settings.length; --i >= 0; ) {
29275
29325
  this._settings[i].getSection().selectColumn(colIndex, selected);
29276
29326
  }
29277
- this._updateColumnBounds();
29327
+ this.updateColumnBounds();
29278
29328
  };
29279
29329
  /** @public
29280
29330
  * @param {number} colIndex
@@ -29288,9 +29338,9 @@ Core_Core.prototype.isSelectedColumn = function (colIndex) {
29288
29338
  return false;
29289
29339
  };
29290
29340
 
29291
- /** @private
29341
+ /** @public
29292
29342
  */
29293
- Core_Core.prototype._updateColumnBounds = function () {
29343
+ Core_Core.prototype.updateColumnBounds = function () {
29294
29344
  if(this._columnBoundConflator.conflate()) {
29295
29345
  return;
29296
29346
  }
@@ -29777,14 +29827,14 @@ Core_Core.prototype._newSection = function (opt_type, sectionName) {
29777
29827
  Core_Core.prototype._putToLast = function(section) {
29778
29828
  let sectionCount = this._settings.length;
29779
29829
  if (sectionCount === 0) {
29780
- section.setParent(this._element, true);
29830
+ section.insertBefore(this._lastHiddenInput);
29781
29831
  } else {
29782
29832
  let lastGrid = this.getLastSection();
29783
29833
  let nextSibling = lastGrid.getElement().nextSibling;
29784
29834
  if (nextSibling !== null) {
29785
29835
  section.insertBefore(nextSibling);
29786
29836
  } else {
29787
- section.setParent(this._element);
29837
+ section.insertBefore(this._lastHiddenInput);
29788
29838
  }
29789
29839
  }
29790
29840
  };
@@ -30170,7 +30220,7 @@ Core_Core.prototype._onVScroll = function (e) {
30170
30220
  Core_Core.prototype._onHScroll = function (e) {
30171
30221
  let scrollVal = this._hscrollbar.getScrollLeft();
30172
30222
  this._colVirtualizer.setViewOffset(scrollVal); // Trigger virtualization event
30173
- this._updateColumnBounds();
30223
+ this.updateColumnBounds();
30174
30224
  this._dispatchColumnPositionChanged();
30175
30225
  };
30176
30226
  /** @private
@@ -30469,14 +30519,66 @@ Core_Core.prototype._onMouseMove = function () {
30469
30519
  };
30470
30520
  /** @private */
30471
30521
  Core_Core.prototype._onGridClicked = function () {
30472
- // research for dragging
30473
30522
  let selection = window.getSelection();
30474
- if(selection.toString()){
30523
+ if(!selection.toString()){
30524
+ if(!this._element.contains(_getActiveElement(this._element))){
30525
+ this.focus();
30526
+ }
30527
+ }
30528
+ };
30529
+
30530
+ /** @private
30531
+ * @param {Object} e
30532
+ */
30533
+ Core_Core.prototype._onKeyDown = function (e) {
30534
+ if(!_isTabCommand(e)) {
30475
30535
  return;
30476
30536
  }
30477
- let activeElem = document.activeElement;
30478
- if(!this._element.contains(activeElem)){
30479
- this.focus();
30537
+ let activeElement = _getActiveElement(this._element);
30538
+ let onTheEdge = false;
30539
+ if(this._firstHiddenInput === activeElement) {
30540
+ onTheEdge = -1;
30541
+ } else if(this._lastHiddenInput === activeElement) {
30542
+ onTheEdge = 1;
30543
+ }
30544
+
30545
+ this._dispatch("tabNavigation", {
30546
+ "activeElement": activeElement,
30547
+ "firstHiddenInput": this._firstHiddenInput,
30548
+ "lastHiddenInput": this._lastHiddenInput,
30549
+ "onTheEdge": onTheEdge,
30550
+ "shiftKey": e.shiftKey,
30551
+ "event": e
30552
+ });
30553
+
30554
+ if(onTheEdge && !e.defaultPrevented) {
30555
+ if(onTheEdge > 0 && e.shiftKey) {
30556
+ this._firstHiddenInput.focus(); // jump to the top
30557
+ e.preventDefault();
30558
+ } else if(onTheEdge < 0 && !e.shiftKey) {
30559
+ this._lastHiddenInput.focus(); // skip to the end
30560
+ e.preventDefault();
30561
+ }
30562
+ }
30563
+ };
30564
+ /** @private
30565
+ * @param {Object} e
30566
+ */
30567
+ Core_Core.prototype._onKeyUp = function (e) {
30568
+ if(!_isTabCommand(e)) {
30569
+ return;
30570
+ }
30571
+ var activeElem = _getActiveElement(this._element);
30572
+ if(e.shiftKey) {
30573
+ if(activeElem === this._lastHiddenInput) {
30574
+ this._firstHiddenInput.focus();
30575
+ e.preventDefault();
30576
+ }
30577
+ } else {
30578
+ if(activeElem === this._firstHiddenInput) {
30579
+ this._lastHiddenInput.focus();
30580
+ e.preventDefault();
30581
+ }
30480
30582
  }
30481
30583
  };
30482
30584
 
@@ -30659,6 +30761,7 @@ Core_Core.prototype._onSectionCountChanged = function (opt_suppressLayout) {
30659
30761
 
30660
30762
  // Reinsert sections
30661
30763
  this._vscrollbar.setScrollContent(this, this._getAllSections(), this._startVScrollbarIndex);
30764
+ this._element.appendChild(this._lastHiddenInput); // Ensure that the hidden input is always at the last position
30662
30765
 
30663
30766
  if(!opt_suppressLayout) {
30664
30767
  this._updateScrollbarHeight(true, true);
@@ -30676,7 +30779,7 @@ Core_Core.prototype._onColumnCountChanged = function () {
30676
30779
  let pinnedLeft = this._countPinnedLeftColumns();
30677
30780
  let pinnedRight = this._countPinnedRightColumns();
30678
30781
 
30679
- this._updateColumnBounds();
30782
+ this.updateColumnBounds();
30680
30783
  this._updateColumnSeparators();
30681
30784
 
30682
30785
  if (this._hScrollbarEnabled && pinnedLeft + pinnedRight < this.getColumnCount()) {
@@ -30972,7 +31075,7 @@ Core_Core.prototype._syncLayoutToColumns = function (from, to, opt_forceDispatch
30972
31075
  // TODO: Check if "to" should be greater than or equal to first pinnied right index
30973
31076
  let paneChanged = forceUpdate || (from < this.getHScrollStartIndex()) || (to > this.getFirstPinnedRightIndex());
30974
31077
  this._updateScrollbarWidth(paneChanged, true /* contentChanged */);
30975
- this._updateColumnBounds();
31078
+ this.updateColumnBounds();
30976
31079
  this._updateColumnSeparators();
30977
31080
  this._dispatchColumnPositionChanged();
30978
31081