@syncfusion/ej2-lists 23.2.4 → 24.1.41

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 (38) hide show
  1. package/CHANGELOG.md +0 -10
  2. package/dist/ej2-lists.min.js +2 -2
  3. package/dist/ej2-lists.umd.min.js +2 -2
  4. package/dist/ej2-lists.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-lists.es2015.js +48 -57
  6. package/dist/es6/ej2-lists.es2015.js.map +1 -1
  7. package/dist/es6/ej2-lists.es5.js +44 -53
  8. package/dist/es6/ej2-lists.es5.js.map +1 -1
  9. package/dist/global/ej2-lists.min.js +2 -2
  10. package/dist/global/ej2-lists.min.js.map +1 -1
  11. package/dist/global/index.d.ts +1 -1
  12. package/package.json +10 -9
  13. package/src/common/list-base.js +10 -13
  14. package/src/list-view/list-view-model.d.ts +8 -1
  15. package/src/list-view/list-view.d.ts +34 -0
  16. package/src/list-view/list-view.js +32 -35
  17. package/src/list-view/virtualization.js +2 -5
  18. package/styles/bootstrap4.css +2 -2
  19. package/styles/bootstrap5-dark.css +1 -1
  20. package/styles/bootstrap5.css +1 -1
  21. package/styles/list-view/_bootstrap4-definition.scss +2 -2
  22. package/styles/list-view/_bootstrap5-definition.scss +1 -1
  23. package/styles/list-view/_material-definition.scss +1 -1
  24. package/styles/list-view/_material3-definition.scss +1 -1
  25. package/styles/list-view/_tailwind-definition.scss +2 -2
  26. package/styles/list-view/bootstrap4.css +2 -2
  27. package/styles/list-view/bootstrap5-dark.css +1 -1
  28. package/styles/list-view/bootstrap5.css +1 -1
  29. package/styles/list-view/material.css +1 -1
  30. package/styles/list-view/material3-dark.css +1 -1
  31. package/styles/list-view/material3.css +1 -1
  32. package/styles/list-view/tailwind-dark.css +4 -4
  33. package/styles/list-view/tailwind.css +4 -4
  34. package/styles/material.css +1 -1
  35. package/styles/material3-dark.css +1 -1
  36. package/styles/material3.css +1 -1
  37. package/styles/tailwind-dark.css +4 -4
  38. package/styles/tailwind.css +4 -4
@@ -280,7 +280,7 @@ var ListBase;
280
280
  li = generateLI(createElement, curItem, fieldData, fields, curOpt.itemClass, options, componentInstance);
281
281
  li.classList.add(cssClass.level + '-' + ariaAttributes.level);
282
282
  li.setAttribute('aria-level', ariaAttributes.level.toString());
283
- if (ariaAttributes.groupItemRole == 'presentation' || ariaAttributes.itemRole == 'presentation') {
283
+ if (ariaAttributes.groupItemRole === 'presentation' || ariaAttributes.itemRole === 'presentation') {
284
284
  li.removeAttribute('aria-level');
285
285
  }
286
286
  anchorElement = li.querySelector('.' + cssClass.anchorWrap);
@@ -291,7 +291,12 @@ var ListBase;
291
291
  }
292
292
  // eslint-disable-next-line no-prototype-builtins
293
293
  if (fieldData.hasOwnProperty(fields.htmlAttributes) && fieldData[fields.htmlAttributes]) {
294
- setAttribute(li, fieldData[fields.htmlAttributes]);
294
+ var htmlAttributes = fieldData[fields.htmlAttributes];
295
+ // Check if 'class' attribute is present and not an empty string
296
+ if (htmlAttributes.hasOwnProperty('class') && typeof htmlAttributes['class'] === 'string' && htmlAttributes['class'].trim() === '') {
297
+ delete htmlAttributes['class'];
298
+ }
299
+ setAttribute(li, htmlAttributes);
295
300
  }
296
301
  // eslint-disable-next-line no-prototype-builtins
297
302
  if (fieldData.hasOwnProperty(fields.enabled) && fieldData[fields.enabled] === false) {
@@ -509,7 +514,6 @@ var ListBase;
509
514
  var curOpt = extend({}, defaultListBaseOptions, options);
510
515
  var fields = extend({}, ListBase.defaultMappedFields, curOpt.fields);
511
516
  var curEle = element.cloneNode(true);
512
- // eslint-disable-next-line
513
517
  var jsonAr = [];
514
518
  curEle.classList.add('json-parent');
515
519
  var childs = curEle.querySelectorAll('.json-parent>li');
@@ -518,7 +522,6 @@ var ListBase;
518
522
  var li = childs[i];
519
523
  var anchor = li.querySelector('a');
520
524
  var ul = li.querySelector('ul');
521
- // eslint-disable-next-line
522
525
  var json = {};
523
526
  var childNodes = anchor ? anchor.childNodes : li.childNodes;
524
527
  var keys = Object.keys(childNodes);
@@ -592,7 +595,6 @@ var ListBase;
592
595
  var ulElement = createElement('ul', { className: cssClass.ul, attrs: { role: 'presentation' } });
593
596
  var curOpt = extend({}, defaultListBaseOptions, options);
594
597
  var curFields = extend({}, ListBase.defaultMappedFields, fields);
595
- // eslint-disable-next-line
596
598
  var compiledString = compileTemplate(template);
597
599
  var liCollection = [];
598
600
  var value;
@@ -641,7 +643,7 @@ var ListBase;
641
643
  else {
642
644
  var currentID = isHeader ? curOpt.groupTemplateID : curOpt.templateID;
643
645
  if (isHeader) {
644
- if (componentInstance && componentInstance.getModuleName() != 'listview') {
646
+ if (componentInstance && componentInstance.getModuleName() !== 'listview') {
645
647
  // eslint-disable-next-line
646
648
  var compiledElement = compiledString(curItem, componentInstance, 'headerTemplate', currentID, !!curOpt.isStringTemplate, null, li);
647
649
  if (compiledElement) {
@@ -699,7 +701,6 @@ var ListBase;
699
701
  function renderGroupTemplate(groupTemplate, groupDataSource, fields,
700
702
  // eslint-disable-next-line
701
703
  headerItems, options, componentInstance) {
702
- // eslint-disable-next-line @typescript-eslint/ban-types
703
704
  var compiledString = compileTemplate(groupTemplate);
704
705
  var curFields = extend({}, ListBase.defaultMappedFields, fields);
705
706
  var curOpt = extend({}, defaultListBaseOptions, options);
@@ -709,7 +710,7 @@ var ListBase;
709
710
  var headerData = {};
710
711
  headerData["" + category] = header.textContent;
711
712
  header.innerHTML = '';
712
- if (componentInstance && componentInstance.getModuleName() !== "listview") {
713
+ if (componentInstance && componentInstance.getModuleName() !== 'listview') {
713
714
  // eslint-disable-next-line
714
715
  var compiledElement = compiledString(headerData, componentInstance, 'groupTemplate', curOpt.groupTemplateID, !!curOpt.isStringTemplate, null, header);
715
716
  if (compiledElement) {
@@ -745,7 +746,6 @@ var ListBase;
745
746
  // Create expand and collapse node
746
747
  if (!!options.expandCollapse && hasChildren && !options.template) {
747
748
  element.firstElementChild.classList.add(cssClass.iconWrapper);
748
- // eslint-disable-next-line @typescript-eslint/ban-types
749
749
  var expandElement = options.expandIconPosition === 'Left' ? prepend : append;
750
750
  expandElement([createElement('div', { className: 'e-icons ' + options.expandIconClass })], element.querySelector('.' + cssClass.textContent));
751
751
  }
@@ -891,9 +891,8 @@ var ListBase;
891
891
  li.setAttribute('data-uid', generateId());
892
892
  }
893
893
  if (grpLI && options && options.groupTemplate) {
894
- // eslint-disable-next-line @typescript-eslint/ban-types
895
894
  var compiledString = compileTemplate(options.groupTemplate);
896
- if (componentInstance && componentInstance.getModuleName() !== "listview") {
895
+ if (componentInstance && componentInstance.getModuleName() !== 'listview') {
897
896
  // eslint-disable-next-line
898
897
  var compiledElement = compiledString(item, componentInstance, 'groupTemplate', curOpt.groupTemplateID, !!curOpt.isStringTemplate, null, li);
899
898
  if (compiledElement) {
@@ -905,7 +904,6 @@ var ListBase;
905
904
  }
906
905
  }
907
906
  else if (!grpLI && options && options.template) {
908
- // eslint-disable-next-line @typescript-eslint/ban-types
909
907
  var compiledString = compileTemplate(options.template);
910
908
  if (componentInstance && componentInstance.getModuleName() !== 'listview') {
911
909
  // eslint-disable-next-line
@@ -977,7 +975,6 @@ var ListBase;
977
975
  function generateIcon(createElement, liElement, className, options) {
978
976
  var curOpt = extend({}, defaultListBaseOptions, options);
979
977
  cssClass = getModuleClass(curOpt.moduleName);
980
- // eslint-disable-next-line @typescript-eslint/ban-types
981
978
  var expandElement = curOpt.expandIconPosition === 'Left' ? prepend : append;
982
979
  expandElement([createElement('div', {
983
980
  className: 'e-icons ' + curOpt.expandIconClass + ' ' +
@@ -1336,7 +1333,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
1336
1333
  this.headerEle.appendChild(hedBackButton);
1337
1334
  this.headerEle.appendChild(textEle);
1338
1335
  if (this.headerTemplate) {
1339
- // eslint-disable-next-line
1340
1336
  var compiledString = compile(this.headerTemplate);
1341
1337
  var headerTemplateEle = this.createElement('div', { className: classNames.headerTemplateText });
1342
1338
  // eslint-disable-next-line
@@ -1456,7 +1452,7 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
1456
1452
  itemCreated: this.renderCheckbox.bind(this),
1457
1453
  templateID: "" + this.element.id + LISTVIEW_TEMPLATE_PROPERTY,
1458
1454
  groupTemplateID: "" + this.element.id + LISTVIEW_GROUPTEMPLATE_PROPERTY,
1459
- enableHtmlSanitizer: this.enableHtmlSanitizer,
1455
+ enableHtmlSanitizer: this.enableHtmlSanitizer
1460
1456
  };
1461
1457
  this.initialization();
1462
1458
  };
@@ -1498,8 +1494,8 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
1498
1494
  if (typeof this.dataSource[0] !== 'string' && typeof this.dataSource[0] !== 'number') {
1499
1495
  fieldData_1 = getFieldValues(args.curData, this.listBaseOption.fields);
1500
1496
  if (this.enablePersistence && !isNullOrUndefined(this.selectedId)) {
1501
- var index = this.selectedId.findIndex(function (e) { return e == fieldData_1[_this.listBaseOption.fields.id].toString(); });
1502
- if (index != -1) {
1497
+ var index = this.selectedId.findIndex(function (e) { return e === fieldData_1[_this.listBaseOption.fields.id].toString(); });
1498
+ if (index !== -1) {
1503
1499
  this.checkInternally(args, checkboxElement);
1504
1500
  }
1505
1501
  }
@@ -1512,7 +1508,7 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
1512
1508
  this.checkInternally(args, checkboxElement);
1513
1509
  }
1514
1510
  checkboxElement.setAttribute('aria-checked', frameElement_1.classList.contains(classNames.checked) ? 'true' : 'false');
1515
- checkboxElement.setAttribute('aria-label', 'checkbox');
1511
+ checkboxElement.setAttribute('aria-label', args.text);
1516
1512
  if (this.checkBoxPosition === 'Left') {
1517
1513
  checkboxElement.classList.add(classNames.checkboxLeft);
1518
1514
  args.item.firstElementChild.classList.add(classNames.checkboxLeft);
@@ -1709,7 +1705,7 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
1709
1705
  }
1710
1706
  else {
1711
1707
  this.setCheckboxLI(li, e);
1712
- if ((target.nodeName == "INPUT") || (target.nodeName == "TEXTAREA")) {
1708
+ if ((target.nodeName === 'INPUT') || (target.nodeName === 'TEXTAREA')) {
1713
1709
  target.classList.add('e-focused');
1714
1710
  this.targetElement = target;
1715
1711
  }
@@ -1717,7 +1713,7 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
1717
1713
  }
1718
1714
  else {
1719
1715
  this.setSelectLI(li, e);
1720
- if ((target.nodeName == "INPUT") || (target.nodeName == "TEXTAREA")) {
1716
+ if ((target.nodeName === 'INPUT') || (target.nodeName === 'TEXTAREA')) {
1721
1717
  target.classList.add('e-focused');
1722
1718
  this.targetElement = target;
1723
1719
  }
@@ -1979,6 +1975,9 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
1979
1975
  EventHandler.add(this.element, 'mouseout', this.leaveHandler, this);
1980
1976
  EventHandler.add(this.element, 'focusout', this.focusout, this);
1981
1977
  this.touchModule = new Touch(this.element, { swipe: this.swipeActionHandler.bind(this) });
1978
+ if (!isNullOrUndefined(this.scroll)) {
1979
+ EventHandler.add(this.element, 'scroll', this.onListScroll, this);
1980
+ }
1982
1981
  };
1983
1982
  ListView.prototype.unWireEvents = function () {
1984
1983
  EventHandler.remove(this.element, 'click', this.clickHandler);
@@ -1986,6 +1985,9 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
1986
1985
  EventHandler.remove(this.element, 'mouseout', this.leaveHandler);
1987
1986
  EventHandler.remove(this.element, 'mouseover', this.hoverHandler);
1988
1987
  EventHandler.remove(this.element, 'mouseout', this.leaveHandler);
1988
+ if (!isNullOrUndefined(this.scroll)) {
1989
+ EventHandler.remove(this.element, 'scroll', this.onListScroll);
1990
+ }
1989
1991
  this.touchModule.destroy();
1990
1992
  this.touchModule = null;
1991
1993
  };
@@ -2069,7 +2071,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2069
2071
  }
2070
2072
  else {
2071
2073
  selectedItem =
2072
- // eslint-disable-next-line
2073
2074
  {
2074
2075
  item: li, text: fieldData && fieldData[this.listBaseOption.fields.text],
2075
2076
  // eslint-disable-next-line
@@ -2311,7 +2312,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2311
2312
  this.removeElement(this.headerEle);
2312
2313
  this.removeElement(this.ulElement);
2313
2314
  this.removeElement(this.contentContainer);
2314
- // eslint-disable-next-line
2315
2315
  if (this.isReact) {
2316
2316
  this.clearTemplate();
2317
2317
  }
@@ -2350,7 +2350,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2350
2350
  ListView.prototype.UpdateCurrentUL = function () {
2351
2351
  this.ulElement = this.curUL = this.element.querySelector('.' + classNames.parentItem);
2352
2352
  if (this.curUL) {
2353
- // eslint-disable-next-line
2354
2353
  this.liCollection = this.curUL.querySelectorAll('.' + classNames.listItem);
2355
2354
  }
2356
2355
  };
@@ -2365,7 +2364,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2365
2364
  if (!ele) {
2366
2365
  var data = this.curViewDS;
2367
2366
  ele = ListBase.createListFromJson(this.createElement, data, this.listBaseOption, this.curDSLevel.length, null, this);
2368
- // eslint-disable-next-line
2369
2367
  if (this.isReact) {
2370
2368
  this.renderReactTemplates();
2371
2369
  }
@@ -2379,7 +2377,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2379
2377
  this.liCollection = this.curUL.querySelectorAll('.' + classNames.listItem);
2380
2378
  if (this.selectedItems) {
2381
2379
  var fieldData = getFieldValues(this.selectedItems.data, this.listBaseOption.fields);
2382
- // eslint-disable-next-line
2383
2380
  this.header((fieldData[this.listBaseOption.fields.text]), true, 'header');
2384
2381
  }
2385
2382
  this.selectedLI = undefined;
@@ -2403,7 +2400,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2403
2400
  this.contentContainer = this.createElement('div', { className: classNames.container });
2404
2401
  this.element.appendChild(this.contentContainer);
2405
2402
  this.renderIntoDom(this.ulElement);
2406
- // eslint-disable-next-line
2407
2403
  if (this.isReact) {
2408
2404
  this.renderReactTemplates();
2409
2405
  }
@@ -2412,7 +2408,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2412
2408
  ListView.prototype.getElementUID = function (obj) {
2413
2409
  var fields = {};
2414
2410
  if (obj instanceof Element) {
2415
- // eslint-disable-next-line
2416
2411
  fields[this.fields.id] = obj.getAttribute('data-uid');
2417
2412
  }
2418
2413
  else {
@@ -2438,12 +2433,12 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2438
2433
  selector: '.' + classNames.listItem
2439
2434
  });
2440
2435
  this.renderComplete();
2436
+ this.previousScrollTop = this.element.scrollTop;
2441
2437
  };
2442
2438
  /**
2443
2439
  * It is used to destroy the ListView component.
2444
2440
  */
2445
2441
  ListView.prototype.destroy = function () {
2446
- // eslint-disable-next-line
2447
2442
  if (this.isReact) {
2448
2443
  this.clearTemplate();
2449
2444
  }
@@ -2485,7 +2480,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2485
2480
  toUL = toUL.parentElement;
2486
2481
  }
2487
2482
  var fieldData = getFieldValues(this.curDSJSON, this.listBaseOption.fields);
2488
- // eslint-disable-next-line
2489
2483
  var text = fieldData[this.fields.text];
2490
2484
  this.switchView(fromUL, toUL, true);
2491
2485
  this.removeFocus();
@@ -2558,7 +2552,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2558
2552
  if (!this.enableVirtualization && isNullOrUndefined(li)) {
2559
2553
  var curLi = this.element.querySelectorAll('.' + classNames.listItem);
2560
2554
  for (var i = 0; i < curLi.length; i++) {
2561
- // eslint-disable-next-line
2562
2555
  if (curLi[i].innerText.trim() === fieldData[this.fields.text]) {
2563
2556
  li = curLi[i];
2564
2557
  }
@@ -2608,7 +2601,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2608
2601
  *
2609
2602
  */
2610
2603
  ListView.prototype.getSelectedItems = function () {
2611
- // eslint-disable-next-line
2612
2604
  var finalValue;
2613
2605
  var isCompleted = false;
2614
2606
  this.selectedId = [];
@@ -2619,7 +2611,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2619
2611
  isCompleted = true;
2620
2612
  }
2621
2613
  else if (this.showCheckBox && !isCompleted) {
2622
- // eslint-disable-next-line
2623
2614
  var liCollection = this.curUL.getElementsByClassName(classNames.selected);
2624
2615
  var liTextCollection = [];
2625
2616
  var liDataCollection = [];
@@ -2639,9 +2630,7 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2639
2630
  liDataCollection.push(tempData);
2640
2631
  }
2641
2632
  if (fieldData) {
2642
- // eslint-disable-next-line
2643
2633
  liTextCollection.push(fieldData[this.listBaseOption.fields.text]);
2644
- // eslint-disable-next-line
2645
2634
  this.selectedId.push(fieldData[this.listBaseOption.fields.id]);
2646
2635
  }
2647
2636
  else {
@@ -2683,7 +2672,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2683
2672
  isCompleted = true;
2684
2673
  }
2685
2674
  else {
2686
- // eslint-disable-next-line
2687
2675
  this.selectedId.push(fieldData[this.listBaseOption.fields.id]);
2688
2676
  finalValue = {
2689
2677
  text: fieldData[this.listBaseOption.fields.text], item: liElement,
@@ -2741,7 +2729,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2741
2729
  if (li) {
2742
2730
  li.classList.add(classNames.disable);
2743
2731
  }
2744
- // eslint-disable-next-line
2745
2732
  resultJSON[this.fields.enabled] = false;
2746
2733
  }
2747
2734
  }
@@ -2777,7 +2764,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2777
2764
  li.style.display = display;
2778
2765
  }
2779
2766
  if (isHide) {
2780
- // eslint-disable-next-line
2781
2767
  resultJSON[this.fields.isVisible] = false;
2782
2768
  }
2783
2769
  else {
@@ -2861,7 +2847,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2861
2847
  return newDataSource;
2862
2848
  };
2863
2849
  ListView.prototype.addItemInNestedList = function (targetItemData, itemQueue) {
2864
- // eslint-disable-next-line
2865
2850
  var targetItemId = targetItemData[this.fields.id];
2866
2851
  var targetChildDS = targetItemData[this.fields.child];
2867
2852
  var isAlreadyRenderedUL = this.element.querySelector('[pid=\'' + targetItemId + '\']');
@@ -2902,7 +2887,6 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2902
2887
  this.getLiFromObjOrElement(curViewDS[index + 2]) || null;
2903
2888
  var li = ListBase.createListItemFromJson(this.createElement, [dataSource], this.listBaseOption, null, null, this);
2904
2889
  this.setAttributes(li);
2905
- // eslint-disable-next-line
2906
2890
  if (this.template && this.isReact) {
2907
2891
  this.renderReactTemplates();
2908
2892
  }
@@ -2935,11 +2919,9 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2935
2919
  var curViewDS = this.curViewDS;
2936
2920
  var fields = obj instanceof Element ? this.getElementUID(obj) : obj;
2937
2921
  var dataSource;
2938
- // eslint-disable-next-line prefer-const
2939
2922
  dataSource = this.findItemFromDS(listDataSource, fields, true);
2940
2923
  if (dataSource) {
2941
2924
  var data_1;
2942
- // eslint-disable-next-line prefer-const
2943
2925
  data_1 = this.findItemFromDS(dataSource, fields);
2944
2926
  var index = curViewDS.indexOf(data_1);
2945
2927
  var li = this.getLiFromObjOrElement(obj);
@@ -2960,11 +2942,8 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
2960
2942
  if (groupLi) {
2961
2943
  detach(groupLi);
2962
2944
  }
2963
- // eslint-disable-next-line
2964
2945
  var foundData = (dataSource.length - 1) <= 0
2965
- ? this.findParent(this.localData, this.fields.id,
2966
- // eslint-disable-next-line
2967
- function (value) { return value === data_1[_this.fields.id]; }, null) : null;
2946
+ ? this.findParent(this.localData, this.fields.id, function (value) { return value === data_1[_this.fields.id]; }, null) : null;
2968
2947
  var dsIndex = dataSource.indexOf(data_1);
2969
2948
  dataSource.splice(dsIndex, 1);
2970
2949
  this.setViewDataSource(listDataSource);
@@ -3007,16 +2986,13 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
3007
2986
  }
3008
2987
  }
3009
2988
  };
3010
- // eslint-disable-next-line
3011
2989
  ListView.prototype.findParent = function (dataSource, id, callback, parent) {
3012
- // eslint-disable-next-line no-prototype-builtins
3013
2990
  if (dataSource.hasOwnProperty(id) && callback(dataSource[id]) === true) {
3014
2991
  return extend({}, dataSource);
3015
2992
  }
3016
2993
  for (var i = 0; i < Object.keys(dataSource).length; i++) {
3017
2994
  if (dataSource[Object.keys(dataSource)[i]]
3018
2995
  && typeof dataSource[Object.keys(dataSource)[i]] === 'object') {
3019
- // eslint-disable-next-line
3020
2996
  var result = this.findParent(dataSource[Object.keys(dataSource)[i]], id, callback, dataSource);
3021
2997
  if (result != null) {
3022
2998
  if (!result.parent) {
@@ -3039,6 +3015,21 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
3039
3015
  }
3040
3016
  return modules;
3041
3017
  };
3018
+ ListView.prototype.onListScroll = function (e) {
3019
+ var args = { originalEvent: e, scrollDirection: "Bottom", distanceY: this.element.scrollHeight - this.element.scrollTop };
3020
+ var currentScrollTop = this.element.scrollTop;
3021
+ if (currentScrollTop > this.previousScrollTop) {
3022
+ args.scrollDirection = "Bottom";
3023
+ args.distanceY = this.element.scrollHeight - this.element.clientHeight - this.element.scrollTop;
3024
+ this.trigger('scroll', args);
3025
+ }
3026
+ else if (this.previousScrollTop > currentScrollTop) {
3027
+ args.scrollDirection = "Top";
3028
+ args.distanceY = this.element.scrollTop;
3029
+ this.trigger('scroll', args);
3030
+ }
3031
+ this.previousScrollTop = currentScrollTop;
3032
+ };
3042
3033
  /**
3043
3034
  * Get the properties to be maintained in the persisted state.
3044
3035
  */
@@ -3119,6 +3110,9 @@ var ListView = /** @__PURE__ @class */ (function (_super) {
3119
3110
  __decorate([
3120
3111
  Event()
3121
3112
  ], ListView.prototype, "actionFailure", void 0);
3113
+ __decorate([
3114
+ Event()
3115
+ ], ListView.prototype, "scroll", void 0);
3122
3116
  ListView = __decorate([
3123
3117
  NotifyPropertyChanges
3124
3118
  ], ListView);
@@ -3287,7 +3281,7 @@ var Virtualization = /** @__PURE__ @class */ (function () {
3287
3281
  var _a;
3288
3282
  var startingHeight;
3289
3283
  var curViewDS = this.listViewInstance.curViewDS;
3290
- this.listItemHeight = select(".e-list-item", this.listViewInstance.element).getBoundingClientRect().height;
3284
+ this.listItemHeight = select('.e-list-item', this.listViewInstance.element).getBoundingClientRect().height;
3291
3285
  this.totalHeight = (Object.keys(curViewDS).length * this.listItemHeight) - (this.domItemCount * this.listItemHeight);
3292
3286
  if (this.listViewInstance.isWindow) {
3293
3287
  startingHeight = this.listViewInstance.ulElement.getBoundingClientRect().top -
@@ -3654,7 +3648,6 @@ var Virtualization = /** @__PURE__ @class */ (function () {
3654
3648
  var curViewDS = this.listViewInstance.curViewDS;
3655
3649
  // eslint-disable-next-line
3656
3650
  var resutJSON = this.findDSAndIndexFromId(curViewDS, obj);
3657
- // eslint-disable-next-line
3658
3651
  if (Object.keys(resutJSON).length) {
3659
3652
  dataSource = resutJSON.data;
3660
3653
  if (curViewDS[resutJSON.index - 1] &&
@@ -3918,7 +3911,7 @@ var Virtualization = /** @__PURE__ @class */ (function () {
3918
3911
  this.refreshItemHeight();
3919
3912
  };
3920
3913
  Virtualization.prototype.createUIItem = function (args) {
3921
- if (!args.item.classList.contains("e-list-group-item")) {
3914
+ if (!args.item.classList.contains('e-list-group-item')) {
3922
3915
  this.templateData = args.curData.isHeader ? args.curData.items[0] :
3923
3916
  args.curData;
3924
3917
  if (this.listViewInstance.showCheckBox) {
@@ -3975,7 +3968,6 @@ var Virtualization = /** @__PURE__ @class */ (function () {
3975
3968
  this.listViewInstance.setLocalData();
3976
3969
  };
3977
3970
  Virtualization.prototype.updateUI = function (element, index, targetElement) {
3978
- // eslint-disable-next-line @typescript-eslint/ban-types
3979
3971
  var onChange = this.isNgTemplate() ? this.onNgChange : this.onChange;
3980
3972
  if (this.listViewInstance.template || this.listViewInstance.groupTemplate) {
3981
3973
  var curViewDS = this.listViewInstance.curViewDS[index];
@@ -4016,7 +4008,6 @@ var Virtualization = /** @__PURE__ @class */ (function () {
4016
4008
  };
4017
4009
  Virtualization.prototype.onNgChange = function (newData, listElement, virtualThis) {
4018
4010
  // compile given target element with template for new data
4019
- // eslint-disable-next-line
4020
4011
  var templateCompiler = compile(virtualThis.listViewInstance.template);
4021
4012
  var resultElement = templateCompiler(newData);
4022
4013
  while (listElement.lastChild) {