@refinitiv-ui/efx-grid 6.0.98 → 6.0.100

Sign up to get free protection for your applications and to get access to all the features.
@@ -709,15 +709,15 @@ EventDispatcher._proto = EventDispatcher.prototype;
709
709
  /** Provide ability for prototype based Class to inherits another class
710
710
  * @namespace
711
711
  * @example
712
- * var BaseClass = function() {};
712
+ * let BaseClass = function() {};
713
713
  * BaseClass.prototype.method = function() {};
714
714
  * BaseClass.prototype._member = 1;
715
- * var DerivedClass = function() {};
715
+ * let DerivedClass = function() {};
716
716
  * Ext.inherits(DerivedClass, BaseClass); // Derived class will have methods and members of the base class
717
717
  * // To call base class method
718
718
  * DeriveClass["base"](this, "methodName", ...params);
719
719
  */
720
- var Ext = {};
720
+ let Ext = {};
721
721
 
722
722
  /** @public
723
723
  * @function
@@ -747,9 +747,9 @@ Ext.inherits = function (childCtor, parentCtor) {
747
747
  childCtor["base"] = function(me, methodName, var_args) {
748
748
  if(!methodName) { methodName = 'constructor'; }
749
749
  // Copying using loop to avoid deop due to passing arguments object to function. This is faster in many JS engines as of late 2014.
750
- var len = arguments.length;
751
- var args = new Array(len); // http://jsperf.com/creating-an-array
752
- for (var i = 2; i < len; i++) {
750
+ let len = arguments.length;
751
+ let args = new Array(len); // http://jsperf.com/creating-an-array
752
+ for (let i = 2; i < len; i++) {
753
753
  args[i - 2] = arguments[i];
754
754
  }
755
755
  return parentCtor.prototype[methodName].apply(me, args);
@@ -10620,7 +10620,7 @@ LayoutGrid._proto = LayoutGrid.prototype;
10620
10620
 
10621
10621
  ;// CONCATENATED MODULE: ./node_modules/tr-grid-util/es6/Util.js
10622
10622
  /** @namespace */
10623
- var Util_Util = {};
10623
+ let Util_Util = {};
10624
10624
 
10625
10625
  /** This is a shorthand for fetch() API by POST method and with json body <br>
10626
10626
  * WARNING: fetch is not supported in IE (including IE11)
@@ -10703,7 +10703,7 @@ Util_Util._logError = function(resp) {
10703
10703
  * @return {!Promise<Response>}
10704
10704
  */
10705
10705
  Util_Util._post = function(url, obj, contentType) {
10706
- var options = {
10706
+ let options = {
10707
10707
  method: obj ? "POST" : "GET",
10708
10708
  headers: { "Content-Type": contentType || "application/json" }
10709
10709
  };
@@ -10724,7 +10724,7 @@ Util_Util._post = function(url, obj, contentType) {
10724
10724
  * @param {Array.<string>=} limiters Specify property to be extended
10725
10725
  * @return {Object}
10726
10726
  */
10727
- var extendObject = function (obj, extender, limiters) {
10727
+ let extendObject = function (obj, extender, limiters) {
10728
10728
  if(!obj) { // null undefined NaN empty string and 0
10729
10729
  return null;
10730
10730
  }
@@ -10732,10 +10732,10 @@ var extendObject = function (obj, extender, limiters) {
10732
10732
  return obj;
10733
10733
  }
10734
10734
 
10735
- var key;
10735
+ let key;
10736
10736
  if(limiters) {
10737
- var len = limiters.length;
10738
- for(var i = 0; i < len; ++i) {
10737
+ let len = limiters.length;
10738
+ for(let i = 0; i < len; ++i) {
10739
10739
  key = limiters[i];
10740
10740
  if(key) {
10741
10741
  extendProperty(obj, extender, key);
@@ -10756,7 +10756,7 @@ var extendObject = function (obj, extender, limiters) {
10756
10756
  * @param {Array.<string>=} limiters
10757
10757
  * @return {Object}
10758
10758
  */
10759
- var cloneObject = function (obj, limiters) {
10759
+ let cloneObject = function (obj, limiters) {
10760
10760
  return extendObject({}, obj, limiters);
10761
10761
  };
10762
10762
 
@@ -10766,8 +10766,8 @@ var cloneObject = function (obj, limiters) {
10766
10766
  * @param {Object} obj
10767
10767
  * @return {boolean}=true, if the obj is empty
10768
10768
  */
10769
- var isEmptyObject = function (obj) {
10770
- for (var key in obj) {
10769
+ let isEmptyObject = function (obj) {
10770
+ for (let key in obj) {
10771
10771
  return false;
10772
10772
  }
10773
10773
  return true;
@@ -10778,17 +10778,17 @@ var isEmptyObject = function (obj) {
10778
10778
  * @param {Array.<string>=} fields In case of the given data is an array, this param will be used for mapping index to field
10779
10779
  * @return {Object|null}
10780
10780
  */
10781
- var arrayToObject = function(data, fields) {
10781
+ let arrayToObject = function(data, fields) {
10782
10782
  if(!Array.isArray(data)) {
10783
10783
  return data;
10784
10784
  } else if(!fields) {
10785
10785
  return null;
10786
10786
  }
10787
- var ary = data;
10787
+ let ary = data;
10788
10788
  data = {};
10789
- var len = ary.length;
10790
- for(var i = 0; i < len; ++i) {
10791
- var field = fields[i];
10789
+ let len = ary.length;
10790
+ for(let i = 0; i < len; ++i) {
10791
+ let field = fields[i];
10792
10792
  // eslint-disable-next-line no-undefined
10793
10793
  if(field && ary[i] !== undefined) {
10794
10794
  data[field] = ary[i];
@@ -10808,10 +10808,10 @@ var arrayToObject = function(data, fields) {
10808
10808
  * extendProperty({a: [0]}, {a: 1}, "a"); // {a: [0, 1]}
10809
10809
  * extendProperty({a: [0]}, {a: [1, 2]}, "a"); // {a: [0, 1, 2]}
10810
10810
  */
10811
- var extendProperty = function (obj, extender, propName) {
10812
- var val = extender[propName];
10811
+ let extendProperty = function (obj, extender, propName) {
10812
+ let val = extender[propName];
10813
10813
  if(val != null) {
10814
- var objVal = obj[propName];
10814
+ let objVal = obj[propName];
10815
10815
  if(Array.isArray(objVal)) {
10816
10816
  obj[propName] = objVal.concat(val);
10817
10817
  } else if(Array.isArray(val) && objVal) {
@@ -10829,7 +10829,7 @@ var extendProperty = function (obj, extender, propName) {
10829
10829
  * @param {*} obj2
10830
10830
  * @return {boolean}
10831
10831
  */
10832
- var deepEqual = function (obj1, obj2) {
10832
+ let deepEqual = function (obj1, obj2) {
10833
10833
 
10834
10834
  if(obj1 === obj2) {
10835
10835
  return true;
@@ -10847,7 +10847,7 @@ var deepEqual = function (obj1, obj2) {
10847
10847
  return false;
10848
10848
  }
10849
10849
 
10850
- for (var i = 0; i < obj1.length; i++) {
10850
+ for (let i = 0; i < obj1.length; i++) {
10851
10851
  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.
10852
10852
  return false;
10853
10853
  }
@@ -10859,7 +10859,7 @@ var deepEqual = function (obj1, obj2) {
10859
10859
  return false;
10860
10860
  }
10861
10861
 
10862
- for (var key in obj1) {
10862
+ for (let key in obj1) {
10863
10863
  if (!deepEqual(obj1[key], obj2[key])) {
10864
10864
  return false;
10865
10865
  }
@@ -10883,7 +10883,7 @@ var deepEqual = function (obj1, obj2) {
10883
10883
  * @return {Array} Returns the result of the extended array
10884
10884
  * @see {@link https://dev.to/uilicious/javascript-array-push-is-945x-faster-than-array-concat-1oki}
10885
10885
  * @example
10886
- * var obj = {};
10886
+ * let obj = {};
10887
10887
  * extendArrayProperty(obj, "prop1", 1); // [1]
10888
10888
  * extendArrayProperty(obj, "prop1", 2); // [1, 2]
10889
10889
  * extendArrayProperty(obj, "prop1", [3, 4]); // [1, 2, 3, 4]
@@ -10892,10 +10892,10 @@ var deepEqual = function (obj1, obj2) {
10892
10892
  * extendArrayProperty(obj, "prop2", [7]); // [5, 6, 7]
10893
10893
  * extendArrayProperty(obj, "prop2", null); // null
10894
10894
  */
10895
- var extendArrayProperty = function (obj, propName, ary) {
10896
- var objAry = null;
10895
+ let extendArrayProperty = function (obj, propName, ary) {
10896
+ let objAry = null;
10897
10897
  if(ary) {
10898
- var objVal = obj[propName];
10898
+ let objVal = obj[propName];
10899
10899
  if(objVal) {
10900
10900
  if(Array.isArray(objVal)) {
10901
10901
  objAry = objVal;
@@ -10926,14 +10926,14 @@ var extendArrayProperty = function (obj, propName, ary) {
10926
10926
  * @param {string|Array.<string>} item
10927
10927
  * @return {string}
10928
10928
  */
10929
- var _encloseBracket = function(item) {
10929
+ let _encloseBracket = function(item) {
10930
10930
  return Array.isArray(item) ? "{\n" + item.join("\n") + "\n}" : item;
10931
10931
  };
10932
10932
  /** @private
10933
10933
  * @param {string} str
10934
10934
  * @return {string}
10935
10935
  */
10936
- var _indentBracketContent = function(str){
10936
+ let _indentBracketContent = function(str){
10937
10937
  return str.replace(/\n+/g, "\n\t").replace(/\n\t}$/, "\n}");
10938
10938
  };
10939
10939
  /** @public
@@ -10949,11 +10949,11 @@ var _indentBracketContent = function(str){
10949
10949
  * ]
10950
10950
  * ]);
10951
10951
  */
10952
- var prettifyCss = function(css) {
10952
+ let prettifyCss = function(css) {
10953
10953
  if(css) {
10954
- var cssStr = "";
10954
+ let cssStr = "";
10955
10955
  if (Array.isArray(css)) {
10956
- var ary = css.map(_encloseBracket);
10956
+ let ary = css.map(_encloseBracket);
10957
10957
  cssStr = ary.join("\n").replace(/{\s*{/g, "{").replace(/\s+{/g, " {");
10958
10958
  } else {
10959
10959
  cssStr = (typeof css === "string") ? css : css + "";
@@ -10970,9 +10970,9 @@ var prettifyCss = function(css) {
10970
10970
  * @param {Element} elem
10971
10971
  * @return {DocumentFragment}
10972
10972
  */
10973
- var getShadowRoot = function(elem) {
10973
+ let getShadowRoot = function(elem) {
10974
10974
  if(elem) {
10975
- var rootNode;
10975
+ let rootNode;
10976
10976
  if(elem.shadowRoot) {
10977
10977
  rootNode = elem.shadowRoot;
10978
10978
  } else if(elem.getRootNode) {
@@ -10994,23 +10994,23 @@ var getShadowRoot = function(elem) {
10994
10994
  * @param {Element=} targetContext Element that needs the CSS
10995
10995
  * @return {Element} New style tag
10996
10996
  */
10997
- var injectCss = function(cssStr, targetContext) {
10997
+ let injectCss = function(cssStr, targetContext) {
10998
10998
  if(!cssStr) {
10999
10999
  return null;
11000
11000
  }
11001
11001
 
11002
- var styleTag = document.createElement("style");
11002
+ let styleTag = document.createElement("style");
11003
11003
  styleTag.textContent = "\n" + cssStr + "\n";
11004
11004
 
11005
- var styleHost = getShadowRoot(targetContext);
11006
- var isInShadow = true;
11005
+ let styleHost = getShadowRoot(targetContext);
11006
+ let isInShadow = true;
11007
11007
  if(!styleHost) {
11008
11008
  isInShadow = false;
11009
11009
  styleHost = document.head;
11010
11010
  }
11011
11011
 
11012
11012
  // Find a place to insert the style tag
11013
- var beforeElem;
11013
+ let beforeElem;
11014
11014
  if(isInShadow) {
11015
11015
  if(styleHost.children && styleHost.children.length) {
11016
11016
  beforeElem = styleHost.children[0];
@@ -11028,8 +11028,8 @@ var injectCss = function(cssStr, targetContext) {
11028
11028
  * @public
11029
11029
  * @return {boolean}
11030
11030
  */
11031
- var isIE = function () {
11032
- var ua = window.navigator.userAgent;
11031
+ let isIE = function () {
11032
+ let ua = window.navigator.userAgent;
11033
11033
  return (ua.indexOf('MSIE ') > 0) || (ua.indexOf('Trident/') > 0) || (ua.indexOf('Edge/') > 0);
11034
11034
  };
11035
11035
 
@@ -11037,7 +11037,7 @@ var isIE = function () {
11037
11037
  * @public
11038
11038
  * @return {boolean}
11039
11039
  */
11040
- var isMac = function () {
11040
+ let isMac = function () {
11041
11041
  return /Mac/.test(navigator.platform);
11042
11042
  };
11043
11043
 
@@ -11045,7 +11045,7 @@ var isMac = function () {
11045
11045
  * @public
11046
11046
  * @return {boolean}
11047
11047
  */
11048
- var isTouchDevice = function () {
11048
+ let isTouchDevice = function () {
11049
11049
  if ((navigator["maxTouchPoints"] && navigator["maxTouchPoints"] < 256) ||
11050
11050
  (navigator["msMaxTouchPoints"] && navigator["msMaxTouchPoints"] < 256)) {
11051
11051
  return true;
@@ -11059,12 +11059,12 @@ var isTouchDevice = function () {
11059
11059
  * @param {Array=} ary
11060
11060
  * @return {Array}
11061
11061
  */
11062
- var nestedObjectToArray = function (obj, ary) {
11062
+ let nestedObjectToArray = function (obj, ary) {
11063
11063
  if (!ary) {
11064
11064
  ary = [];
11065
11065
  }
11066
- for (var key in obj) {
11067
- var element = obj[key];
11066
+ for (let key in obj) {
11067
+ let element = obj[key];
11068
11068
  if ('object' === typeof element) {
11069
11069
  nestedObjectToArray(element, ary);
11070
11070
  } else {
@@ -11088,21 +11088,21 @@ var nestedObjectToArray = function (obj, ary) {
11088
11088
  * rgb2Hex("invalid"); // "invalid"
11089
11089
  * rgb2Hex(null); // ""
11090
11090
  */
11091
- var rgb2Hex = function (rgbCode) {
11091
+ let rgb2Hex = function (rgbCode) {
11092
11092
  if(!rgbCode || typeof rgbCode !== "string") {
11093
11093
  return "";
11094
11094
  }
11095
11095
  if(rgbCode.charAt(0) === "#") {
11096
11096
  return rgbCode;
11097
11097
  }
11098
- var rgb = rgbCode.match(/\d+/g);
11098
+ let rgb = rgbCode.match(/\d+/g);
11099
11099
  if(!rgb || rgb.length < 3) {
11100
11100
  return rgbCode;
11101
11101
  }
11102
11102
 
11103
- var hex = "#";
11104
- for(var i = 0; i < 3; i++) {
11105
- var num = +rgb[i];
11103
+ let hex = "#";
11104
+ for(let i = 0; i < 3; i++) {
11105
+ let num = +rgb[i];
11106
11106
  if(!(num >= 16)) { // Handle NaN case
11107
11107
  hex += "0";
11108
11108
  }
@@ -11116,12 +11116,12 @@ var rgb2Hex = function (rgbCode) {
11116
11116
  * @param {*} data
11117
11117
  * @return {string}
11118
11118
  */
11119
- var prepareTSVContent = function (data) {
11119
+ let prepareTSVContent = function (data) {
11120
11120
  if (data == null) {
11121
11121
  return "";
11122
11122
  }
11123
11123
 
11124
- var content = (typeof data === 'string') ? data : data.toString();
11124
+ let content = (typeof data === 'string') ? data : data.toString();
11125
11125
 
11126
11126
  if (!content.length) { return ""; }
11127
11127
 
@@ -11150,7 +11150,7 @@ var prepareTSVContent = function (data) {
11150
11150
 
11151
11151
  /** @constructor
11152
11152
  */
11153
- var GroupDefinitions = function () {
11153
+ let GroupDefinitions = function () {
11154
11154
  this._groupMap = {};
11155
11155
  this._childToParent = {};
11156
11156
  };
@@ -11184,14 +11184,14 @@ GroupDefinitions.getGroupId = function(groupDef) {
11184
11184
  * @return {number} Return total number of parents. Return 0 if there is no parent.
11185
11185
  */
11186
11186
  GroupDefinitions.calcTreeDepth = function (groupMap, groupDef) {
11187
- var curDepth = -1;
11188
- var curNode = groupDef;
11187
+ let curDepth = -1;
11188
+ let curNode = groupDef;
11189
11189
  while(curNode) { // WARNING: infinite loop could occured, if parentId is cycle back to one of the child group
11190
11190
  if(++curDepth > 15) {
11191
11191
  console.log("WARNING: Infinite loop detected during column group creation");
11192
11192
  break;
11193
11193
  }
11194
- var parentId = curNode.parentId;
11194
+ let parentId = curNode.parentId;
11195
11195
  curNode = groupMap[parentId];
11196
11196
  }
11197
11197
  return curDepth;
@@ -11202,22 +11202,22 @@ GroupDefinitions.calcTreeDepth = function (groupMap, groupDef) {
11202
11202
  * @return {Array.<string>}
11203
11203
  */
11204
11204
  GroupDefinitions.getLeafDescendants = function (groupMap, groupId) {
11205
- var groupDef = groupMap[groupId];
11205
+ let groupDef = groupMap[groupId];
11206
11206
  if(!groupDef) {
11207
11207
  return null;
11208
11208
  }
11209
11209
 
11210
- var leaves = [];
11211
- var unvisitedGroups = [groupDef];
11212
- var visitedCount = 0;
11213
- var visitedMap = {};
11210
+ let leaves = [];
11211
+ let unvisitedGroups = [groupDef];
11212
+ let visitedCount = 0;
11213
+ let visitedMap = {};
11214
11214
  while(visitedCount < unvisitedGroups.length) {
11215
11215
  groupDef = unvisitedGroups[visitedCount++];
11216
11216
  visitedMap[groupDef.id] = true;
11217
- var chdr = groupDef.children;
11218
- var len = chdr ? chdr.length : 0;
11219
- for(var i = 0; i < len; ++i) {
11220
- var childId = chdr[i];
11217
+ let chdr = groupDef.children;
11218
+ let len = chdr ? chdr.length : 0;
11219
+ for(let i = 0; i < len; ++i) {
11220
+ let childId = chdr[i];
11221
11221
  groupDef = groupMap[childId];
11222
11222
  if(groupDef) {
11223
11223
  if(!visitedMap[groupDef.id]) { // Prevent infinite loop
@@ -11238,7 +11238,7 @@ GroupDefinitions.getLeafDescendants = function (groupMap, groupId) {
11238
11238
  * @return {Object} Return a new object with guaranteed children property
11239
11239
  */
11240
11240
  GroupDefinitions._cloneObject = function(obj) {
11241
- var newObj = cloneObject(obj);
11241
+ let newObj = cloneObject(obj);
11242
11242
  if(Array.isArray(newObj.children)) { // This is to prevent modification from the outside source
11243
11243
  newObj.children = newObj.children.slice();
11244
11244
  } else {
@@ -11254,7 +11254,7 @@ GroupDefinitions._cloneObject = function(obj) {
11254
11254
  * @return {Object} Return a new object with guaranteed children property
11255
11255
  */
11256
11256
  GroupDefinitions._toGroupDefinition = function(obj, groupId) {
11257
- var groupDef = null;
11257
+ let groupDef = null;
11258
11258
  if(obj) {
11259
11259
  if(Array.isArray(obj)) {
11260
11260
  groupDef = {
@@ -11277,11 +11277,11 @@ GroupDefinitions._toGroupDefinition = function(obj, groupId) {
11277
11277
  * @return {string}
11278
11278
  */
11279
11279
  GroupDefinitions.prototype.toString = function() {
11280
- var groupMap = this._groupMap;
11281
- var lines = [];
11280
+ let groupMap = this._groupMap;
11281
+ let lines = [];
11282
11282
  lines.push("=== groupDefs ===");
11283
- for(var key in groupMap) {
11284
- var group = groupMap[key];
11283
+ for(let key in groupMap) {
11284
+ let group = groupMap[key];
11285
11285
  lines.push(key + ": " + JSON.stringify(group, ["id", "parentId", "children"]));
11286
11286
  }
11287
11287
 
@@ -11314,9 +11314,9 @@ GroupDefinitions.prototype.getDefinition = GroupDefinitions.prototype.getGroup;
11314
11314
  * @return {!Array.<Object>}
11315
11315
  */
11316
11316
  GroupDefinitions.prototype.getGroups = function () {
11317
- var groupDefs = [];
11318
- var groupMap = this._groupMap;
11319
- for(var key in groupMap) {
11317
+ let groupDefs = [];
11318
+ let groupMap = this._groupMap;
11319
+ for(let key in groupMap) {
11320
11320
  groupDefs.push(groupMap[key]);
11321
11321
  }
11322
11322
  return groupDefs;
@@ -11338,11 +11338,11 @@ GroupDefinitions.prototype.getGroupMap = function () {
11338
11338
  * @return {!Object.<string, Object>}
11339
11339
  */
11340
11340
  GroupDefinitions.prototype.cloneGroupMap = function () {
11341
- var groupMap = this._groupMap;
11342
- var outMap = {};
11343
- for(var groupId in groupMap) {
11344
- var groupDef = groupMap[groupId];
11345
- var obj = GroupDefinitions._cloneObject(groupDef);
11341
+ let groupMap = this._groupMap;
11342
+ let outMap = {};
11343
+ for(let groupId in groupMap) {
11344
+ let groupDef = groupMap[groupId];
11345
+ let obj = GroupDefinitions._cloneObject(groupDef);
11346
11346
  outMap[groupId] = obj;
11347
11347
  }
11348
11348
  return outMap;
@@ -11351,18 +11351,18 @@ GroupDefinitions.prototype.cloneGroupMap = function () {
11351
11351
  * @public
11352
11352
  */
11353
11353
  GroupDefinitions.prototype.rebuildMap = function () {
11354
- var groupMap = this._groupMap;
11355
- var childToParent = this._childToParent = {};
11354
+ let groupMap = this._groupMap;
11355
+ let childToParent = this._childToParent = {};
11356
11356
 
11357
11357
  // Create child to parent map
11358
- var groupIds = Object.keys(groupMap);
11359
- var grpCount = groupIds.length;
11360
- var i, groupId;
11358
+ let groupIds = Object.keys(groupMap);
11359
+ let grpCount = groupIds.length;
11360
+ let i, groupId;
11361
11361
  for(i = 0; i < grpCount; ++i) {
11362
11362
  groupId = groupIds[i];
11363
- var chdr = groupMap[groupId].children;
11364
- var childCount = chdr ? chdr.length : 0;
11365
- for (var j = 0; j < childCount; j++) {
11363
+ let chdr = groupMap[groupId].children;
11364
+ let childCount = chdr ? chdr.length : 0;
11365
+ for (let j = 0; j < childCount; j++) {
11366
11366
  childToParent[chdr[j]] = groupId;
11367
11367
  }
11368
11368
  }
@@ -11370,7 +11370,7 @@ GroupDefinitions.prototype.rebuildMap = function () {
11370
11370
  // Apply a parent id to group definition to make it easier to find depth
11371
11371
  for(i = 0; i < grpCount; ++i) {
11372
11372
  groupId = groupIds[i];
11373
- var parentId = childToParent[groupId];
11373
+ let parentId = childToParent[groupId];
11374
11374
  if(parentId) {
11375
11375
  groupMap[groupId].parentId = parentId;
11376
11376
  }
@@ -11383,7 +11383,7 @@ GroupDefinitions.prototype.rebuildMap = function () {
11383
11383
  * @return {Array.<string>}
11384
11384
  */
11385
11385
  GroupDefinitions.prototype.getGroupChildren = function (groupId) {
11386
- var groupDef = this._groupMap[groupId];
11386
+ let groupDef = this._groupMap[groupId];
11387
11387
  return groupDef ? groupDef.children : null;
11388
11388
  };
11389
11389
  /** Get all non-group descendants of the given group id.
@@ -11409,12 +11409,12 @@ GroupDefinitions.prototype.getRootGroup = function (groupId) {
11409
11409
  if (!groupId) {
11410
11410
  return null;
11411
11411
  }
11412
- var groupMap = this._groupMap;
11413
- var groupDef = groupMap[groupId] || null;
11412
+ let groupMap = this._groupMap;
11413
+ let groupDef = groupMap[groupId] || null;
11414
11414
  // TODO: Support column id
11415
11415
  if(groupDef) {
11416
11416
  while (groupDef.parentId) {
11417
- var parentDef = groupMap[groupDef.parentId];
11417
+ let parentDef = groupMap[groupDef.parentId];
11418
11418
  if(parentDef) {
11419
11419
  groupDef = parentDef;
11420
11420
  } else {
@@ -11437,10 +11437,10 @@ GroupDefinitions.prototype.getParentGroup = function (childId) {
11437
11437
  */
11438
11438
  GroupDefinitions.prototype.getParentIds = function(childId) {
11439
11439
  if (childId && typeof childId === "string") {
11440
- var groupId = this._childToParent[childId];
11440
+ let groupId = this._childToParent[childId];
11441
11441
  if (groupId) {
11442
- var groupIds = [groupId];
11443
- var group = this._groupMap[groupId];
11442
+ let groupIds = [groupId];
11443
+ let group = this._groupMap[groupId];
11444
11444
  while (group && group.parentId) {
11445
11445
  group = this._groupMap[group.parentId];
11446
11446
  if (group) {
@@ -11458,9 +11458,9 @@ GroupDefinitions.prototype.getParentIds = function(childId) {
11458
11458
  * @return {string}
11459
11459
  */
11460
11460
  GroupDefinitions.prototype.getParentId = function (childId, groupLevel) {
11461
- var parentId = this._childToParent[childId];
11461
+ let parentId = this._childToParent[childId];
11462
11462
  if(groupLevel != null) {
11463
- var currentLevel = this.getGroupLevel(parentId);
11463
+ let currentLevel = this.getGroupLevel(parentId);
11464
11464
  while(currentLevel > groupLevel && parentId){
11465
11465
  parentId = this._childToParent[parentId];
11466
11466
  currentLevel--;
@@ -11475,7 +11475,7 @@ GroupDefinitions.prototype.getParentId = function (childId, groupLevel) {
11475
11475
  * @return {boolean}
11476
11476
  */
11477
11477
  GroupDefinitions.prototype.removeAllGroups = function () {
11478
- for(var groupId in this._groupMap) { // eslint-disable-line
11478
+ for(let groupId in this._groupMap) { // eslint-disable-line
11479
11479
  this._groupMap = {};
11480
11480
  this._childToParent = {};
11481
11481
  return true;
@@ -11488,13 +11488,13 @@ GroupDefinitions.prototype.removeAllGroups = function () {
11488
11488
  */
11489
11489
  GroupDefinitions.prototype.setGroups = function (groupDefs) {
11490
11490
  // Clear existing group structure
11491
- var groupMap = this._groupMap = {};
11491
+ let groupMap = this._groupMap = {};
11492
11492
 
11493
11493
  // Create group map
11494
- var grpCount = groupDefs ? groupDefs.length : 0;
11495
- for (var i = 0; i < grpCount; i++) {
11496
- var groupDef = groupDefs[i];
11497
- var groupId = groupDef.id;
11494
+ let grpCount = groupDefs ? groupDefs.length : 0;
11495
+ for (let i = 0; i < grpCount; i++) {
11496
+ let groupDef = groupDefs[i];
11497
+ let groupId = groupDef.id;
11498
11498
  if(groupId) {
11499
11499
  groupMap[groupId] = GroupDefinitions._cloneObject(groupDef);
11500
11500
  }
@@ -11508,7 +11508,7 @@ GroupDefinitions.prototype.setGroups = function (groupDefs) {
11508
11508
  * @return {string} Return group ID
11509
11509
  */
11510
11510
  GroupDefinitions.prototype.addGroup = function (groupDef) {
11511
- var groupId = GroupDefinitions.getGroupId(groupDef);
11511
+ let groupId = GroupDefinitions.getGroupId(groupDef);
11512
11512
  if(groupId) {
11513
11513
  return this.setGroup(groupId, groupDef);
11514
11514
  }
@@ -11519,7 +11519,7 @@ GroupDefinitions.prototype.addGroup = function (groupDef) {
11519
11519
  * @return {boolean}
11520
11520
  */
11521
11521
  GroupDefinitions.prototype.removeGroup = function (groupId) {
11522
- var curDef = this._groupMap[groupId];
11522
+ let curDef = this._groupMap[groupId];
11523
11523
  if(curDef) {
11524
11524
  this.removeAllChildren(groupId);
11525
11525
  this.unsetParent(groupId);
@@ -11541,25 +11541,25 @@ GroupDefinitions.prototype.setGroup = function (groupId, groupDef) {
11541
11541
  }
11542
11542
 
11543
11543
  if(groupDef) {
11544
- var newDef = GroupDefinitions._toGroupDefinition(groupDef, groupId);
11544
+ let newDef = GroupDefinitions._toGroupDefinition(groupDef, groupId);
11545
11545
  this._ungroupChildren(newDef.children);
11546
11546
 
11547
- var curDef = this._groupMap[groupId];
11547
+ let curDef = this._groupMap[groupId];
11548
11548
  if(curDef) { // Replace
11549
11549
  this.removeAllChildren(groupId);
11550
11550
  }
11551
- var parentDef = this._childToParent[groupId];
11551
+ let parentDef = this._childToParent[groupId];
11552
11552
  if(parentDef) {
11553
11553
  newDef.parentId = parentDef.id;
11554
11554
  }
11555
11555
  this._groupMap[groupId] = newDef;
11556
11556
 
11557
- var chdr = newDef.children; // newDef is guaranteed to have children property
11558
- var len = chdr.length;
11559
- for(var i = 0; i < len; ++i) {
11560
- var childId = chdr[i];
11557
+ let chdr = newDef.children; // newDef is guaranteed to have children property
11558
+ let len = chdr.length;
11559
+ for(let i = 0; i < len; ++i) {
11560
+ let childId = chdr[i];
11561
11561
  this._childToParent[childId] = groupId;
11562
- var childDef = this._groupMap[childId];
11562
+ let childDef = this._groupMap[childId];
11563
11563
  if(childDef) {
11564
11564
  childDef.parentId = groupId;
11565
11565
  }
@@ -11579,8 +11579,8 @@ GroupDefinitions.prototype.setGroup = function (groupId, groupDef) {
11579
11579
  */
11580
11580
  GroupDefinitions.prototype._ungroupChildren = function(children) {
11581
11581
  if (Array.isArray(children)) {
11582
- var len = children.length;
11583
- for(var i = 0; i < len; ++i) {
11582
+ let len = children.length;
11583
+ for(let i = 0; i < len; ++i) {
11584
11584
  this.unsetParent(children[i]);
11585
11585
  }
11586
11586
  }
@@ -11593,9 +11593,9 @@ GroupDefinitions.prototype._ungroupChildren = function(children) {
11593
11593
  * @return {boolean}
11594
11594
  */
11595
11595
  GroupDefinitions.prototype.hasGroupChild = function (parentId, childId) {
11596
- var groupDef = this._groupMap[parentId];
11596
+ let groupDef = this._groupMap[parentId];
11597
11597
  if(childId && groupDef) {
11598
- var chdr = groupDef.children;
11598
+ let chdr = groupDef.children;
11599
11599
  if(chdr) {
11600
11600
  return chdr.indexOf(childId) >= 0; // TODO: Use childToParent map to improve performance
11601
11601
  }
@@ -11613,8 +11613,8 @@ GroupDefinitions.prototype.contains = function (groupId, childId) {
11613
11613
  if(groupId === childId) {
11614
11614
  return true;
11615
11615
  }
11616
- var levelLimit = 20;
11617
- var parentId = this._childToParent[childId];
11616
+ let levelLimit = 20;
11617
+ let parentId = this._childToParent[childId];
11618
11618
  while(parentId && levelLimit) { // WARNING: Circular dependency could happen
11619
11619
  if(groupId === parentId) {
11620
11620
  return true;
@@ -11632,15 +11632,15 @@ GroupDefinitions.prototype.contains = function (groupId, childId) {
11632
11632
  * @return {boolean}
11633
11633
  */
11634
11634
  GroupDefinitions.prototype.addGroupChild = function (parentId, childId, position) {
11635
- var groupDef = this._groupMap[parentId];
11635
+ let groupDef = this._groupMap[parentId];
11636
11636
 
11637
11637
  if(childId && groupDef) {
11638
- var chdr = groupDef.children;
11638
+ let chdr = groupDef.children;
11639
11639
  if(chdr && chdr.indexOf(childId) < 0) {
11640
11640
  this.unsetParent(childId); // Remove previous parent
11641
11641
  // Add new child to group structures
11642
11642
  this._childToParent[childId] = parentId;
11643
- var childDef = this._groupMap[childId];
11643
+ let childDef = this._groupMap[childId];
11644
11644
  if(childDef) {
11645
11645
  childDef.parentId = parentId;
11646
11646
  }
@@ -11675,20 +11675,20 @@ GroupDefinitions.prototype.removeGroupChild = function (parentId, childId) {
11675
11675
  * @return {boolean}
11676
11676
  */
11677
11677
  GroupDefinitions.prototype.unsetParent = function (childId) {
11678
- var parentId = this._childToParent[childId];
11678
+ let parentId = this._childToParent[childId];
11679
11679
  if(!parentId) {
11680
11680
  return false;
11681
11681
  }
11682
11682
  this._childToParent[childId] = "";
11683
- var childDef = this._groupMap[childId];
11683
+ let childDef = this._groupMap[childId];
11684
11684
  if(childDef) {
11685
11685
  childDef.parentId = "";
11686
11686
  }
11687
- var parentDef = this._groupMap[parentId];
11687
+ let parentDef = this._groupMap[parentId];
11688
11688
  if(parentDef) {
11689
- var chdr = parentDef.children;
11689
+ let chdr = parentDef.children;
11690
11690
  if(chdr && chdr.length) {
11691
- var at = chdr.indexOf(childId);
11691
+ let at = chdr.indexOf(childId);
11692
11692
  if (at >= 0) {
11693
11693
  chdr.splice(at, 1); // splice is slow
11694
11694
  }
@@ -11702,18 +11702,18 @@ GroupDefinitions.prototype.unsetParent = function (childId) {
11702
11702
  * @return {boolean}
11703
11703
  */
11704
11704
  GroupDefinitions.prototype.removeAllChildren = function(groupId) {
11705
- var grpDef = this._groupMap[groupId];
11705
+ let grpDef = this._groupMap[groupId];
11706
11706
  if(grpDef) {
11707
- var chdr = grpDef.children;
11708
- var len = chdr ? chdr.length : 0;
11707
+ let chdr = grpDef.children;
11708
+ let len = chdr ? chdr.length : 0;
11709
11709
  if(len) {
11710
11710
  grpDef.children = [];
11711
- for(var i = 0; i < len; ++i) {
11712
- var childId = chdr[i];
11711
+ for(let i = 0; i < len; ++i) {
11712
+ let childId = chdr[i];
11713
11713
  if(this._childToParent[childId]) {
11714
11714
  this._childToParent[childId] = "";
11715
11715
  }
11716
- var childDef = this._groupMap[childId];
11716
+ let childDef = this._groupMap[childId];
11717
11717
  if(childDef) {
11718
11718
  childDef.parentId = "";
11719
11719
  }
@@ -11730,20 +11730,20 @@ GroupDefinitions.prototype.removeAllChildren = function(groupId) {
11730
11730
  * @return {boolean}
11731
11731
  */
11732
11732
  GroupDefinitions.prototype.setGroupChildren = function (groupId, newChildList) {
11733
- var groupDef = this._groupMap[groupId];
11733
+ let groupDef = this._groupMap[groupId];
11734
11734
  if(groupDef) {
11735
11735
  if(Array.isArray(newChildList)) {
11736
- var chdr = newChildList.slice();
11736
+ let chdr = newChildList.slice();
11737
11737
  this._ungroupChildren(chdr);
11738
11738
  this.removeAllChildren(groupId);
11739
11739
  groupDef.children = chdr;
11740
11740
 
11741
- var parentId = groupDef.id;
11742
- var len = chdr.length;
11743
- for(var i = 0; i < len; ++i) {
11744
- var childId = chdr[i];
11741
+ let parentId = groupDef.id;
11742
+ let len = chdr.length;
11743
+ for(let i = 0; i < len; ++i) {
11744
+ let childId = chdr[i];
11745
11745
  this._childToParent[childId] = parentId;
11746
- var childDef = this._groupMap[childId];
11746
+ let childDef = this._groupMap[childId];
11747
11747
  if(childDef) {
11748
11748
  childDef.parentId = parentId;
11749
11749
  }
@@ -11763,7 +11763,7 @@ GroupDefinitions.prototype.setGroupChildren = function (groupId, newChildList) {
11763
11763
  * @return {string}
11764
11764
  */
11765
11765
  GroupDefinitions.prototype.getGroupName = function (groupId) {
11766
- var groupDef = this._groupMap[groupId];
11766
+ let groupDef = this._groupMap[groupId];
11767
11767
  if(groupDef) {
11768
11768
  return groupDef.name || "";
11769
11769
  }
@@ -11775,7 +11775,7 @@ GroupDefinitions.prototype.getGroupName = function (groupId) {
11775
11775
  * @return {boolean}
11776
11776
  */
11777
11777
  GroupDefinitions.prototype.setGroupName = function (groupId, groupName) {
11778
- var groupDef = this._groupMap[groupId];
11778
+ let groupDef = this._groupMap[groupId];
11779
11779
  if(groupDef) {
11780
11780
  if(groupDef.name !== groupName) {
11781
11781
  groupDef.name = groupName;
@@ -13131,7 +13131,7 @@ DataCache_DataCache._proto = DataCache_DataCache.prototype;
13131
13131
  /** Abstract base class that provides event management methods for derived class
13132
13132
  * @constructor
13133
13133
  */
13134
- var EventDispatcher_EventDispatcher = function () {};
13134
+ let EventDispatcher_EventDispatcher = function () {};
13135
13135
 
13136
13136
  /** @type {Object.<string, Function>}
13137
13137
  * @protected
@@ -13156,7 +13156,7 @@ EventDispatcher_EventDispatcher.prototype.addEventListener = function(type, hand
13156
13156
  this._events = {};
13157
13157
  }
13158
13158
 
13159
- var listeners = this._events[type];
13159
+ let listeners = this._events[type];
13160
13160
  if(listeners) {
13161
13161
  if(listeners.indexOf(handler) < 0) {
13162
13162
  listeners.push(handler);
@@ -13173,9 +13173,9 @@ EventDispatcher_EventDispatcher.prototype.addEventListener = function(type, hand
13173
13173
  * @param {Function} handler Event handler
13174
13174
  */
13175
13175
  EventDispatcher_EventDispatcher.prototype.removeEventListener = function(type, handler) {
13176
- var listeners = (this._events) ? this._events[type] : null;
13176
+ let listeners = (this._events) ? this._events[type] : null;
13177
13177
  if(listeners) {
13178
- var at = listeners.indexOf(handler);
13178
+ let at = listeners.indexOf(handler);
13179
13179
  if(at >= 0) {
13180
13180
  listeners.splice(at, 1);
13181
13181
  --this._listenerCount;
@@ -13198,7 +13198,7 @@ EventDispatcher_EventDispatcher.prototype.removeAllEventListeners = function() {
13198
13198
  EventDispatcher_EventDispatcher.prototype.hasListener = function(type) {
13199
13199
  if(this._listenerCount) {
13200
13200
  if(type) {
13201
- var listeners = this._events ? this._events[type] : null;
13201
+ let listeners = this._events ? this._events[type] : null;
13202
13202
  return listeners ? (listeners.length > 0) : false;
13203
13203
  } else {
13204
13204
  return true;
@@ -13215,7 +13215,7 @@ EventDispatcher_EventDispatcher.prototype.hasListener = function(type) {
13215
13215
  */
13216
13216
  EventDispatcher_EventDispatcher.prototype.getListener = function(type, idx) {
13217
13217
  if(type) {
13218
- var listeners = this._events ? this._events[type] : null;
13218
+ let listeners = this._events ? this._events[type] : null;
13219
13219
  if(listeners) {
13220
13220
  if(!idx) {
13221
13221
  idx = 0;
@@ -13231,12 +13231,12 @@ EventDispatcher_EventDispatcher.prototype.getListener = function(type, idx) {
13231
13231
  * @param {Object} obj Object that contains a handler with the same name as the given `type`
13232
13232
  * @param {string} type Event name
13233
13233
  * @example
13234
- * var obj = {"mouseUp": function(e) { console.log(e); }};
13234
+ * let obj = {"mouseUp": function(e) { console.log(e); }};
13235
13235
  * plugin.addListener(obj, "mouseUp");
13236
13236
  * plugin.addListener(obj, "mouseDown");
13237
13237
  */
13238
13238
  EventDispatcher_EventDispatcher.prototype.addListener = function(obj, type) {
13239
- var func = obj ? obj[type] : null;
13239
+ let func = obj ? obj[type] : null;
13240
13240
  if(typeof func === "function") {
13241
13241
  this.addEventListener(type, func);
13242
13242
  }
@@ -13260,11 +13260,11 @@ EventDispatcher_EventDispatcher.prototype._prepareEventArguments = function(type
13260
13260
  * @param {Object} eventArg Event arguments
13261
13261
  */
13262
13262
  EventDispatcher_EventDispatcher.prototype._dispatch = function(type, eventArg) {
13263
- var listeners = this._events ? this._events[type] : null;
13263
+ let listeners = this._events ? this._events[type] : null;
13264
13264
  if(listeners) {
13265
13265
  eventArg = this._prepareEventArguments(type, eventArg);
13266
- var len = listeners.length;
13267
- for(var i = 0; i < len; ++i) {
13266
+ let len = listeners.length;
13267
+ for(let i = 0; i < len; ++i) {
13268
13268
  listeners[i](eventArg);
13269
13269
  }
13270
13270
  }
@@ -13274,7 +13274,7 @@ EventDispatcher_EventDispatcher.prototype._dispatch = function(type, eventArg) {
13274
13274
  * @function
13275
13275
  * @param {Event} e
13276
13276
  */
13277
- var preventDefault = function(e) {
13277
+ let preventDefault = function(e) {
13278
13278
  if(e && e.preventDefault) {
13279
13279
  e.preventDefault();
13280
13280
  e.stopPropagation();
@@ -18498,12 +18498,12 @@ WrappedView.prototype.isRowFiltered = function(rid, rowData) {
18498
18498
  * @param {(number|Function)=} ms The delay time in millisecond before executing the function
18499
18499
  * @param {*=} thisObj "this" object to be bound with the given function. If the function is already bound, there is no need to provide thisObj parameter
18500
18500
  * @example
18501
- * var c = new Conflator(function() { console.log("Executed"); }, 1000);
18502
- * for(var i = 10; --i >= 0;) {
18501
+ * let c = new Conflator(function() { console.log("Executed"); }, 1000);
18502
+ * for(let i = 10; --i >= 0;) {
18503
18503
  * c.conflate(i); // Only one "Executed" text will be logged to console after one second
18504
18504
  * }
18505
18505
  */
18506
- var Conflator = function (func, ms, thisObj) {
18506
+ let Conflator = function (func, ms, thisObj) {
18507
18507
  this._onConflated = this._onConflated.bind(this);
18508
18508
 
18509
18509
  this._data = [];
@@ -18565,7 +18565,7 @@ Conflator.prototype.reset = function () {
18565
18565
  */
18566
18566
  Conflator.prototype.popAllData = function() {
18567
18567
  if(this._data.length) {
18568
- var data = this._data;
18568
+ let data = this._data;
18569
18569
  this._data = [];
18570
18570
  return data;
18571
18571
  }
@@ -21072,8 +21072,9 @@ DataView.prototype.stallSorting = function(bool) {
21072
21072
  this._dispatchDataChange(data_DataTable._positionChangeArg);
21073
21073
  }
21074
21074
  }
21075
+ return true;
21075
21076
  }
21076
- return true;
21077
+ return false;
21077
21078
  };
21078
21079
 
21079
21080
  /** Automatically and asyncronuosly remove group that has no member or no content. Predefined groups will not be removed in this way.
@@ -23941,12 +23942,12 @@ Virtualizer.prototype.setViewOffset = function (px) {
23941
23942
  };
23942
23943
  /** @public
23943
23944
  * @ignore
23944
- * @param {number} start
23945
- * @param {number} end
23945
+ * @param {number} startItemCount
23946
+ * @param {number} endItemCount
23946
23947
  */
23947
- Virtualizer.prototype.setViewBounds = function (start, end) {
23948
- this._startOffsetCount = start > 0 ? start : 0;
23949
- this._endOffsetCount = end > 0 ? end : 0;
23948
+ Virtualizer.prototype.setViewBounds = function (startItemCount, endItemCount) {
23949
+ this._startOffsetCount = startItemCount > 0 ? startItemCount : 0;
23950
+ this._endOffsetCount = endItemCount > 0 ? endItemCount : 0;
23950
23951
  this.validateVirtualization(); // Everytime row height is changed
23951
23952
  };
23952
23953
  /** @public
@@ -26027,7 +26028,7 @@ Core_Core.prototype._hasPendingRowChange = false;
26027
26028
  * @return {string}
26028
26029
  */
26029
26030
  Core_Core.getVersion = function () {
26030
- return "5.1.98";
26031
+ return "5.1.103";
26031
26032
  };
26032
26033
  /** {@link ElementWrapper#dispose}
26033
26034
  * @override
@@ -27228,6 +27229,16 @@ Core_Core.prototype._moveColumn = function (fromCol, destCol) {
27228
27229
  }
27229
27230
  }
27230
27231
 
27232
+ // The deactivated column may be moved directly or indirectly to the current view. It's necessary to make all columns in view activated.
27233
+ if(!this._frozenLayout) {
27234
+ if(this._colVirtualizer.isEnabled()) {
27235
+ let vBegin = this._colVirtualizer.getFirstIndexInView();
27236
+ if(!((fromCol < vBegin && destCol < vBegin) || (fromCol > vEnd && destCol > vEnd))) { // Columns does not move between hidden columns
27237
+ this._activateColumns(vBegin, vEnd, vBegin, vEnd); // To confirm that all columns in view are activated
27238
+ }
27239
+ }
27240
+ }
27241
+
27231
27242
  // no need to invoke because moving column does not change column-width
27232
27243
  // this._syncLayoutToColumns(minColumn, this.getColumnCount());
27233
27244
 
@@ -29026,33 +29037,24 @@ Core_Core.prototype.getYScrollVal = function (sectionRef, rowIndex, topOfView) {
29026
29037
  }
29027
29038
 
29028
29039
  let rowCount = this._layoutY.getLaneCount();
29029
- let rowIndexOffset = (section) ? section.getRowOffset() : this._sectionStarts[this._startVScrollbarIndex];
29030
-
29031
- if(rowIndexOffset) {
29032
- rowIndex += rowIndexOffset;
29033
- }
29034
29040
  if (rowIndex <= 0) { rowIndex = 0; }
29035
29041
  else if (rowIndex >= rowCount) { rowIndex = rowCount - 1; }
29036
29042
 
29037
- let heightOffset = this._layoutY.getLaneStart(rowIndexOffset);
29038
- let scrollTop = this._vscrollbar.getScrollTop();
29039
- let viewTop = scrollTop + heightOffset;
29040
- let viewTopIndex = section ? section.getFirstIndexInView() : this._layoutY.hitTest(viewTop); // TODO: Make it work in zooming mode
29043
+ let viewInfo = this.getVerticalViewInfo();
29044
+ let viewTopIndex = viewInfo.topRowIndex; // TODO: Make it work in zooming mode
29041
29045
 
29042
29046
  let scrollIndex = -1;
29043
29047
  if (topOfView) {
29044
29048
  scrollIndex = rowIndex;
29045
29049
  } else {
29046
- if(rowIndex <= viewTopIndex) { // Scroll up
29050
+ if(rowIndex < viewTopIndex) { // Scroll up
29047
29051
  scrollIndex = rowIndex - 3; // Have some spaces at the top for more appealing visual
29048
29052
  if(scrollIndex < 0) {
29049
29053
  scrollIndex = 0;
29050
29054
  }
29051
29055
  } else { // Scroll down
29052
- let viewHeight = this._vscrollbar.getHeight();
29053
- let viewBottom = viewTop + viewHeight;
29054
- let viewBottomIndex = section ? section.getLastIndexInView() : this._layoutY.hitTest(viewBottom - 0.1);
29055
- if (rowIndex >= viewBottomIndex) {
29056
+ let viewBottomIndex = viewInfo.bottomRowIndex;
29057
+ if (rowIndex > viewBottomIndex) {
29056
29058
  let viewIndexSize = viewBottomIndex - viewTopIndex;
29057
29059
  scrollIndex = rowIndex - viewIndexSize + 3;
29058
29060
  if(scrollIndex < 0) {
@@ -29062,7 +29064,9 @@ Core_Core.prototype.getYScrollVal = function (sectionRef, rowIndex, topOfView) {
29062
29064
  }
29063
29065
  }
29064
29066
 
29065
- return (scrollIndex >= 0) ? (this._layoutY.getLaneStart(scrollIndex) - heightOffset) : null;
29067
+ let rowIndexOffset = (section) ? section.getRowOffset() : this._sectionStarts[this._startVScrollbarIndex];
29068
+ let heightOffset = this._layoutY.getLaneStart(this._startVScrollbarIndex);
29069
+ return (scrollIndex >= 0) ? (this._layoutY.getLaneStart(scrollIndex + rowIndexOffset) - heightOffset) : null;
29066
29070
  };
29067
29071
  /** Scroll up or down to make specified row visible in the view
29068
29072
  * @public
@@ -29077,6 +29081,21 @@ Core_Core.prototype.scrollToRow = function (sectionRef, rowIndex, topOfView) {
29077
29081
  }
29078
29082
  };
29079
29083
  /** @public
29084
+ * @return {Object}
29085
+ */
29086
+ Core_Core.prototype.getVerticalViewInfo = function() {
29087
+ let rowIndexOffset = this._sectionStarts[this._startVScrollbarIndex];
29088
+ let heightOffset = this._layoutY.getLaneStart(rowIndexOffset);
29089
+ let viewHeight = this._vscrollbar.getHeight();
29090
+ let viewTop = this._vscrollbar.getScrollTop() + heightOffset;
29091
+ let viewBottom = viewTop + viewHeight;
29092
+
29093
+ return {
29094
+ topRowIndex: this._layoutY.hitTest(viewTop) - rowIndexOffset,
29095
+ bottomRowIndex: this._layoutY.hitTest(viewBottom - 0.1) - rowIndexOffset
29096
+ };
29097
+ };
29098
+ /** @public
29080
29099
  * @return {Object} Returns null if vscrollbar does not exists
29081
29100
  */
29082
29101
  Core_Core.prototype.getVScrollView = function () {
@@ -31174,7 +31193,15 @@ Core_Core.prototype._updateScrollbarHeight = function (paneChanged, contentChang
31174
31193
  // HACK: Due to fixed layout size we need to scale view size instead of content size, when zooming
31175
31194
  // TODO: Check if zoom factor is used for virtualization correctly
31176
31195
  this._rowVirtualizer.setViewSize(viewSize / this._zoomFactor);
31177
- this._rowVirtualizer.setViewBounds(this._startVScrollbarIndex, this.getFooterCount());
31196
+
31197
+ let offsetRowCount = this._sectionStarts[this._startVScrollbarIndex];
31198
+ let footerCount = this.getFooterCount();
31199
+ let footerRowCount = 0;
31200
+ if(footerCount) {
31201
+ let sectionCount = this.getSectionCount();
31202
+ footerRowCount = this._sectionStarts[sectionCount] - this._sectionStarts[sectionCount - footerCount];
31203
+ }
31204
+ this._rowVirtualizer.setViewBounds(offsetRowCount, footerRowCount);
31178
31205
  } else {
31179
31206
  this._rowVirtualizer.validateVirtualization(); // Content height may be changed
31180
31207
  }
@@ -32660,6 +32687,17 @@ SortableTitlePlugin.prototype._getPlugin = function(pluginName) {
32660
32687
  let host = this._hosts[0];
32661
32688
  return (host) ? host.getPlugin(pluginName) : null;
32662
32689
  };
32690
+
32691
+ /** @public
32692
+ * @description Click title to sort with mouse event. This is for testing purpose.
32693
+ * @ignore
32694
+ * @param {Core} grid
32695
+ * @param {Object=} mouseEvt
32696
+ */
32697
+ SortableTitlePlugin.prototype.clickTitleByMouse = function (grid, mouseEvt) {
32698
+ this._onClickTitle(grid, mouseEvt);
32699
+ };
32700
+
32663
32701
  /** @private
32664
32702
  * @param {Core} grid
32665
32703
  * @param {MouseEvent} e