@syncfusion/ej2-lists 23.2.4 → 24.1.46

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 (39) hide show
  1. package/CHANGELOG.md +1 -9
  2. package/README.md +1 -1
  3. package/dist/ej2-lists.min.js +2 -2
  4. package/dist/ej2-lists.umd.min.js +2 -2
  5. package/dist/ej2-lists.umd.min.js.map +1 -1
  6. package/dist/es6/ej2-lists.es2015.js +57 -58
  7. package/dist/es6/ej2-lists.es2015.js.map +1 -1
  8. package/dist/es6/ej2-lists.es5.js +53 -54
  9. package/dist/es6/ej2-lists.es5.js.map +1 -1
  10. package/dist/global/ej2-lists.min.js +2 -2
  11. package/dist/global/ej2-lists.min.js.map +1 -1
  12. package/dist/global/index.d.ts +1 -1
  13. package/package.json +10 -9
  14. package/src/common/list-base.js +19 -14
  15. package/src/list-view/list-view-model.d.ts +8 -1
  16. package/src/list-view/list-view.d.ts +34 -0
  17. package/src/list-view/list-view.js +32 -35
  18. package/src/list-view/virtualization.js +2 -5
  19. package/styles/bootstrap4.css +2 -2
  20. package/styles/bootstrap5-dark.css +1 -1
  21. package/styles/bootstrap5.css +1 -1
  22. package/styles/list-view/_bootstrap4-definition.scss +2 -2
  23. package/styles/list-view/_bootstrap5-definition.scss +1 -1
  24. package/styles/list-view/_material-definition.scss +1 -1
  25. package/styles/list-view/_material3-definition.scss +1 -1
  26. package/styles/list-view/_tailwind-definition.scss +2 -2
  27. package/styles/list-view/bootstrap4.css +2 -2
  28. package/styles/list-view/bootstrap5-dark.css +1 -1
  29. package/styles/list-view/bootstrap5.css +1 -1
  30. package/styles/list-view/material.css +1 -1
  31. package/styles/list-view/material3-dark.css +1 -1
  32. package/styles/list-view/material3.css +1 -1
  33. package/styles/list-view/tailwind-dark.css +4 -4
  34. package/styles/list-view/tailwind.css +4 -4
  35. package/styles/material.css +1 -1
  36. package/styles/material3-dark.css +1 -1
  37. package/styles/material3.css +1 -1
  38. package/styles/tailwind-dark.css +4 -4
  39. package/styles/tailwind.css +4 -4
@@ -280,18 +280,31 @@ 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);
287
287
  // eslint-disable-next-line no-prototype-builtins
288
288
  if (fieldData.hasOwnProperty(fields.tooltip)) {
289
- const tooltipText = SanitizeHtmlHelper.sanitize(fieldData[fields.tooltip]);
289
+ let tooltipText = fieldData[fields.tooltip];
290
+ if (options && options.enableHtmlSanitizer) {
291
+ tooltipText = SanitizeHtmlHelper.sanitize(tooltipText);
292
+ }
293
+ else {
294
+ let tooltipTextElement = createElement('span', { innerHTML: tooltipText });
295
+ tooltipText = tooltipTextElement.innerText;
296
+ tooltipTextElement = null;
297
+ }
290
298
  li.setAttribute('title', tooltipText);
291
299
  }
292
300
  // eslint-disable-next-line no-prototype-builtins
293
301
  if (fieldData.hasOwnProperty(fields.htmlAttributes) && fieldData[fields.htmlAttributes]) {
294
- setAttribute(li, fieldData[fields.htmlAttributes]);
302
+ const htmlAttributes = fieldData[fields.htmlAttributes];
303
+ // Check if 'class' attribute is present and not an empty string
304
+ if (htmlAttributes.hasOwnProperty('class') && typeof htmlAttributes['class'] === 'string' && htmlAttributes['class'].trim() === '') {
305
+ delete htmlAttributes['class'];
306
+ }
307
+ setAttribute(li, htmlAttributes);
295
308
  }
296
309
  // eslint-disable-next-line no-prototype-builtins
297
310
  if (fieldData.hasOwnProperty(fields.enabled) && fieldData[fields.enabled] === false) {
@@ -507,7 +520,6 @@ var ListBase;
507
520
  const curOpt = extend({}, defaultListBaseOptions, options);
508
521
  const fields = extend({}, ListBase.defaultMappedFields, curOpt.fields);
509
522
  const curEle = element.cloneNode(true);
510
- // eslint-disable-next-line
511
523
  const jsonAr = [];
512
524
  curEle.classList.add('json-parent');
513
525
  const childs = curEle.querySelectorAll('.json-parent>li');
@@ -516,7 +528,6 @@ var ListBase;
516
528
  const li = childs[i];
517
529
  const anchor = li.querySelector('a');
518
530
  const ul = li.querySelector('ul');
519
- // eslint-disable-next-line
520
531
  const json = {};
521
532
  const childNodes = anchor ? anchor.childNodes : li.childNodes;
522
533
  const keys = Object.keys(childNodes);
@@ -590,7 +601,6 @@ var ListBase;
590
601
  const ulElement = createElement('ul', { className: cssClass.ul, attrs: { role: 'presentation' } });
591
602
  const curOpt = extend({}, defaultListBaseOptions, options);
592
603
  const curFields = extend({}, ListBase.defaultMappedFields, fields);
593
- // eslint-disable-next-line
594
604
  const compiledString = compileTemplate(template);
595
605
  const liCollection = [];
596
606
  let value;
@@ -639,7 +649,7 @@ var ListBase;
639
649
  else {
640
650
  const currentID = isHeader ? curOpt.groupTemplateID : curOpt.templateID;
641
651
  if (isHeader) {
642
- if (componentInstance && componentInstance.getModuleName() != 'listview') {
652
+ if (componentInstance && componentInstance.getModuleName() !== 'listview') {
643
653
  // eslint-disable-next-line
644
654
  const compiledElement = compiledString(curItem, componentInstance, 'headerTemplate', currentID, !!curOpt.isStringTemplate, null, li);
645
655
  if (compiledElement) {
@@ -697,7 +707,6 @@ var ListBase;
697
707
  function renderGroupTemplate(groupTemplate, groupDataSource, fields,
698
708
  // eslint-disable-next-line
699
709
  headerItems, options, componentInstance) {
700
- // eslint-disable-next-line @typescript-eslint/ban-types
701
710
  const compiledString = compileTemplate(groupTemplate);
702
711
  const curFields = extend({}, ListBase.defaultMappedFields, fields);
703
712
  const curOpt = extend({}, defaultListBaseOptions, options);
@@ -706,7 +715,7 @@ var ListBase;
706
715
  const headerData = {};
707
716
  headerData[`${category}`] = header.textContent;
708
717
  header.innerHTML = '';
709
- if (componentInstance && componentInstance.getModuleName() !== "listview") {
718
+ if (componentInstance && componentInstance.getModuleName() !== 'listview') {
710
719
  // eslint-disable-next-line
711
720
  const compiledElement = compiledString(headerData, componentInstance, 'groupTemplate', curOpt.groupTemplateID, !!curOpt.isStringTemplate, null, header);
712
721
  if (compiledElement) {
@@ -742,7 +751,6 @@ var ListBase;
742
751
  // Create expand and collapse node
743
752
  if (!!options.expandCollapse && hasChildren && !options.template) {
744
753
  element.firstElementChild.classList.add(cssClass.iconWrapper);
745
- // eslint-disable-next-line @typescript-eslint/ban-types
746
754
  const expandElement = options.expandIconPosition === 'Left' ? prepend : append;
747
755
  expandElement([createElement('div', { className: 'e-icons ' + options.expandIconClass })], element.querySelector('.' + cssClass.textContent));
748
756
  }
@@ -888,9 +896,8 @@ var ListBase;
888
896
  li.setAttribute('data-uid', generateId());
889
897
  }
890
898
  if (grpLI && options && options.groupTemplate) {
891
- // eslint-disable-next-line @typescript-eslint/ban-types
892
899
  const compiledString = compileTemplate(options.groupTemplate);
893
- if (componentInstance && componentInstance.getModuleName() !== "listview") {
900
+ if (componentInstance && componentInstance.getModuleName() !== 'listview') {
894
901
  // eslint-disable-next-line
895
902
  const compiledElement = compiledString(item, componentInstance, 'groupTemplate', curOpt.groupTemplateID, !!curOpt.isStringTemplate, null, li);
896
903
  if (compiledElement) {
@@ -902,7 +909,6 @@ var ListBase;
902
909
  }
903
910
  }
904
911
  else if (!grpLI && options && options.template) {
905
- // eslint-disable-next-line @typescript-eslint/ban-types
906
912
  const compiledString = compileTemplate(options.template);
907
913
  if (componentInstance && componentInstance.getModuleName() !== 'listview') {
908
914
  // eslint-disable-next-line
@@ -974,7 +980,6 @@ var ListBase;
974
980
  function generateIcon(createElement, liElement, className, options) {
975
981
  const curOpt = extend({}, defaultListBaseOptions, options);
976
982
  cssClass = getModuleClass(curOpt.moduleName);
977
- // eslint-disable-next-line @typescript-eslint/ban-types
978
983
  const expandElement = curOpt.expandIconPosition === 'Left' ? prepend : append;
979
984
  expandElement([createElement('div', {
980
985
  className: 'e-icons ' + curOpt.expandIconClass + ' ' +
@@ -1311,7 +1316,6 @@ let ListView = class ListView extends Component {
1311
1316
  this.headerEle.appendChild(hedBackButton);
1312
1317
  this.headerEle.appendChild(textEle);
1313
1318
  if (this.headerTemplate) {
1314
- // eslint-disable-next-line
1315
1319
  const compiledString = compile(this.headerTemplate);
1316
1320
  const headerTemplateEle = this.createElement('div', { className: classNames.headerTemplateText });
1317
1321
  // eslint-disable-next-line
@@ -1430,7 +1434,7 @@ let ListView = class ListView extends Component {
1430
1434
  itemCreated: this.renderCheckbox.bind(this),
1431
1435
  templateID: `${this.element.id}${LISTVIEW_TEMPLATE_PROPERTY}`,
1432
1436
  groupTemplateID: `${this.element.id}${LISTVIEW_GROUPTEMPLATE_PROPERTY}`,
1433
- enableHtmlSanitizer: this.enableHtmlSanitizer,
1437
+ enableHtmlSanitizer: this.enableHtmlSanitizer
1434
1438
  };
1435
1439
  this.initialization();
1436
1440
  }
@@ -1471,8 +1475,8 @@ let ListView = class ListView extends Component {
1471
1475
  if (typeof this.dataSource[0] !== 'string' && typeof this.dataSource[0] !== 'number') {
1472
1476
  fieldData = getFieldValues(args.curData, this.listBaseOption.fields);
1473
1477
  if (this.enablePersistence && !isNullOrUndefined(this.selectedId)) {
1474
- let index = this.selectedId.findIndex(e => e == fieldData[this.listBaseOption.fields.id].toString());
1475
- if (index != -1) {
1478
+ const index = this.selectedId.findIndex(e => e === fieldData[this.listBaseOption.fields.id].toString());
1479
+ if (index !== -1) {
1476
1480
  this.checkInternally(args, checkboxElement);
1477
1481
  }
1478
1482
  }
@@ -1485,7 +1489,7 @@ let ListView = class ListView extends Component {
1485
1489
  this.checkInternally(args, checkboxElement);
1486
1490
  }
1487
1491
  checkboxElement.setAttribute('aria-checked', frameElement.classList.contains(classNames.checked) ? 'true' : 'false');
1488
- checkboxElement.setAttribute('aria-label', 'checkbox');
1492
+ checkboxElement.setAttribute('aria-label', args.text);
1489
1493
  if (this.checkBoxPosition === 'Left') {
1490
1494
  checkboxElement.classList.add(classNames.checkboxLeft);
1491
1495
  args.item.firstElementChild.classList.add(classNames.checkboxLeft);
@@ -1682,7 +1686,7 @@ let ListView = class ListView extends Component {
1682
1686
  }
1683
1687
  else {
1684
1688
  this.setCheckboxLI(li, e);
1685
- if ((target.nodeName == "INPUT") || (target.nodeName == "TEXTAREA")) {
1689
+ if ((target.nodeName === 'INPUT') || (target.nodeName === 'TEXTAREA')) {
1686
1690
  target.classList.add('e-focused');
1687
1691
  this.targetElement = target;
1688
1692
  }
@@ -1690,7 +1694,7 @@ let ListView = class ListView extends Component {
1690
1694
  }
1691
1695
  else {
1692
1696
  this.setSelectLI(li, e);
1693
- if ((target.nodeName == "INPUT") || (target.nodeName == "TEXTAREA")) {
1697
+ if ((target.nodeName === 'INPUT') || (target.nodeName === 'TEXTAREA')) {
1694
1698
  target.classList.add('e-focused');
1695
1699
  this.targetElement = target;
1696
1700
  }
@@ -1951,6 +1955,9 @@ let ListView = class ListView extends Component {
1951
1955
  EventHandler.add(this.element, 'mouseout', this.leaveHandler, this);
1952
1956
  EventHandler.add(this.element, 'focusout', this.focusout, this);
1953
1957
  this.touchModule = new Touch(this.element, { swipe: this.swipeActionHandler.bind(this) });
1958
+ if (!isNullOrUndefined(this.scroll)) {
1959
+ EventHandler.add(this.element, 'scroll', this.onListScroll, this);
1960
+ }
1954
1961
  }
1955
1962
  unWireEvents() {
1956
1963
  EventHandler.remove(this.element, 'click', this.clickHandler);
@@ -1958,6 +1965,9 @@ let ListView = class ListView extends Component {
1958
1965
  EventHandler.remove(this.element, 'mouseout', this.leaveHandler);
1959
1966
  EventHandler.remove(this.element, 'mouseover', this.hoverHandler);
1960
1967
  EventHandler.remove(this.element, 'mouseout', this.leaveHandler);
1968
+ if (!isNullOrUndefined(this.scroll)) {
1969
+ EventHandler.remove(this.element, 'scroll', this.onListScroll);
1970
+ }
1961
1971
  this.touchModule.destroy();
1962
1972
  this.touchModule = null;
1963
1973
  }
@@ -1999,7 +2009,7 @@ let ListView = class ListView extends Component {
1999
2009
  if (this.curUL.querySelector('.' + classNames.focused)) {
2000
2010
  this.curUL.querySelector('.' + classNames.focused).classList.remove(classNames.focused);
2001
2011
  }
2002
- let textAreaFocus = li.querySelector('textarea') || li.querySelector('input');
2012
+ const textAreaFocus = li.querySelector('textarea') || li.querySelector('input');
2003
2013
  li.classList.add(classNames.focused);
2004
2014
  if (!isNullOrUndefined(e)) {
2005
2015
  if (e.target === textAreaFocus) {
@@ -2039,7 +2049,6 @@ let ListView = class ListView extends Component {
2039
2049
  }
2040
2050
  else {
2041
2051
  selectedItem =
2042
- // eslint-disable-next-line
2043
2052
  {
2044
2053
  item: li, text: fieldData && fieldData[this.listBaseOption.fields.text],
2045
2054
  // eslint-disable-next-line
@@ -2197,7 +2206,7 @@ let ListView = class ListView extends Component {
2197
2206
  setViewDataSource(dataSource = this.localData) {
2198
2207
  // eslint-disable-next-line
2199
2208
  let fieldValue = (isNullOrUndefined(this.fields.sortBy)) ? this.fields.text : this.fields.sortBy;
2200
- let query = ListBase.addSorting(this.sortOrder, fieldValue);
2209
+ const query = ListBase.addSorting(this.sortOrder, fieldValue);
2201
2210
  if (dataSource && this.fields.groupBy) {
2202
2211
  if (this.sortOrder !== 'None') {
2203
2212
  this.curViewDS = ListBase.groupDataSource(ListBase.getDataSource(dataSource, query), this.listBaseOption.fields, this.sortOrder);
@@ -2275,7 +2284,6 @@ let ListView = class ListView extends Component {
2275
2284
  this.removeElement(this.headerEle);
2276
2285
  this.removeElement(this.ulElement);
2277
2286
  this.removeElement(this.contentContainer);
2278
- // eslint-disable-next-line
2279
2287
  if (this.isReact) {
2280
2288
  this.clearTemplate();
2281
2289
  }
@@ -2314,7 +2322,6 @@ let ListView = class ListView extends Component {
2314
2322
  UpdateCurrentUL() {
2315
2323
  this.ulElement = this.curUL = this.element.querySelector('.' + classNames.parentItem);
2316
2324
  if (this.curUL) {
2317
- // eslint-disable-next-line
2318
2325
  this.liCollection = this.curUL.querySelectorAll('.' + classNames.listItem);
2319
2326
  }
2320
2327
  }
@@ -2329,7 +2336,6 @@ let ListView = class ListView extends Component {
2329
2336
  if (!ele) {
2330
2337
  const data = this.curViewDS;
2331
2338
  ele = ListBase.createListFromJson(this.createElement, data, this.listBaseOption, this.curDSLevel.length, null, this);
2332
- // eslint-disable-next-line
2333
2339
  if (this.isReact) {
2334
2340
  this.renderReactTemplates();
2335
2341
  }
@@ -2343,7 +2349,6 @@ let ListView = class ListView extends Component {
2343
2349
  this.liCollection = this.curUL.querySelectorAll('.' + classNames.listItem);
2344
2350
  if (this.selectedItems) {
2345
2351
  const fieldData = getFieldValues(this.selectedItems.data, this.listBaseOption.fields);
2346
- // eslint-disable-next-line
2347
2352
  this.header((fieldData[this.listBaseOption.fields.text]), true, 'header');
2348
2353
  }
2349
2354
  this.selectedLI = undefined;
@@ -2367,7 +2372,6 @@ let ListView = class ListView extends Component {
2367
2372
  this.contentContainer = this.createElement('div', { className: classNames.container });
2368
2373
  this.element.appendChild(this.contentContainer);
2369
2374
  this.renderIntoDom(this.ulElement);
2370
- // eslint-disable-next-line
2371
2375
  if (this.isReact) {
2372
2376
  this.renderReactTemplates();
2373
2377
  }
@@ -2376,7 +2380,6 @@ let ListView = class ListView extends Component {
2376
2380
  getElementUID(obj) {
2377
2381
  let fields = {};
2378
2382
  if (obj instanceof Element) {
2379
- // eslint-disable-next-line
2380
2383
  fields[this.fields.id] = obj.getAttribute('data-uid');
2381
2384
  }
2382
2385
  else {
@@ -2402,12 +2405,12 @@ let ListView = class ListView extends Component {
2402
2405
  selector: '.' + classNames.listItem
2403
2406
  });
2404
2407
  this.renderComplete();
2408
+ this.previousScrollTop = this.element.scrollTop;
2405
2409
  }
2406
2410
  /**
2407
2411
  * It is used to destroy the ListView component.
2408
2412
  */
2409
2413
  destroy() {
2410
- // eslint-disable-next-line
2411
2414
  if (this.isReact) {
2412
2415
  this.clearTemplate();
2413
2416
  }
@@ -2449,7 +2452,6 @@ let ListView = class ListView extends Component {
2449
2452
  toUL = toUL.parentElement;
2450
2453
  }
2451
2454
  const fieldData = getFieldValues(this.curDSJSON, this.listBaseOption.fields);
2452
- // eslint-disable-next-line
2453
2455
  const text = fieldData[this.fields.text];
2454
2456
  this.switchView(fromUL, toUL, true);
2455
2457
  this.removeFocus();
@@ -2522,7 +2524,6 @@ let ListView = class ListView extends Component {
2522
2524
  if (!this.enableVirtualization && isNullOrUndefined(li)) {
2523
2525
  const curLi = this.element.querySelectorAll('.' + classNames.listItem);
2524
2526
  for (let i = 0; i < curLi.length; i++) {
2525
- // eslint-disable-next-line
2526
2527
  if (curLi[i].innerText.trim() === fieldData[this.fields.text]) {
2527
2528
  li = curLi[i];
2528
2529
  }
@@ -2572,7 +2573,6 @@ let ListView = class ListView extends Component {
2572
2573
  *
2573
2574
  */
2574
2575
  getSelectedItems() {
2575
- // eslint-disable-next-line
2576
2576
  let finalValue;
2577
2577
  let isCompleted = false;
2578
2578
  this.selectedId = [];
@@ -2583,7 +2583,6 @@ let ListView = class ListView extends Component {
2583
2583
  isCompleted = true;
2584
2584
  }
2585
2585
  else if (this.showCheckBox && !isCompleted) {
2586
- // eslint-disable-next-line
2587
2586
  const liCollection = this.curUL.getElementsByClassName(classNames.selected);
2588
2587
  const liTextCollection = [];
2589
2588
  const liDataCollection = [];
@@ -2603,9 +2602,7 @@ let ListView = class ListView extends Component {
2603
2602
  liDataCollection.push(tempData);
2604
2603
  }
2605
2604
  if (fieldData) {
2606
- // eslint-disable-next-line
2607
2605
  liTextCollection.push(fieldData[this.listBaseOption.fields.text]);
2608
- // eslint-disable-next-line
2609
2606
  this.selectedId.push(fieldData[this.listBaseOption.fields.id]);
2610
2607
  }
2611
2608
  else {
@@ -2647,7 +2644,6 @@ let ListView = class ListView extends Component {
2647
2644
  isCompleted = true;
2648
2645
  }
2649
2646
  else {
2650
- // eslint-disable-next-line
2651
2647
  this.selectedId.push(fieldData[this.listBaseOption.fields.id]);
2652
2648
  finalValue = {
2653
2649
  text: fieldData[this.listBaseOption.fields.text], item: liElement,
@@ -2705,7 +2701,6 @@ let ListView = class ListView extends Component {
2705
2701
  if (li) {
2706
2702
  li.classList.add(classNames.disable);
2707
2703
  }
2708
- // eslint-disable-next-line
2709
2704
  resultJSON[this.fields.enabled] = false;
2710
2705
  }
2711
2706
  }
@@ -2741,7 +2736,6 @@ let ListView = class ListView extends Component {
2741
2736
  li.style.display = display;
2742
2737
  }
2743
2738
  if (isHide) {
2744
- // eslint-disable-next-line
2745
2739
  resultJSON[this.fields.isVisible] = false;
2746
2740
  }
2747
2741
  else {
@@ -2824,7 +2818,6 @@ let ListView = class ListView extends Component {
2824
2818
  return newDataSource;
2825
2819
  }
2826
2820
  addItemInNestedList(targetItemData, itemQueue) {
2827
- // eslint-disable-next-line
2828
2821
  const targetItemId = targetItemData[this.fields.id];
2829
2822
  const targetChildDS = targetItemData[this.fields.child];
2830
2823
  const isAlreadyRenderedUL = this.element.querySelector('[pid=\'' + targetItemId + '\']');
@@ -2865,7 +2858,6 @@ let ListView = class ListView extends Component {
2865
2858
  this.getLiFromObjOrElement(curViewDS[index + 2]) || null;
2866
2859
  const li = ListBase.createListItemFromJson(this.createElement, [dataSource], this.listBaseOption, null, null, this);
2867
2860
  this.setAttributes(li);
2868
- // eslint-disable-next-line
2869
2861
  if (this.template && this.isReact) {
2870
2862
  this.renderReactTemplates();
2871
2863
  }
@@ -2897,11 +2889,9 @@ let ListView = class ListView extends Component {
2897
2889
  const curViewDS = this.curViewDS;
2898
2890
  const fields = obj instanceof Element ? this.getElementUID(obj) : obj;
2899
2891
  let dataSource;
2900
- // eslint-disable-next-line prefer-const
2901
2892
  dataSource = this.findItemFromDS(listDataSource, fields, true);
2902
2893
  if (dataSource) {
2903
2894
  let data;
2904
- // eslint-disable-next-line prefer-const
2905
2895
  data = this.findItemFromDS(dataSource, fields);
2906
2896
  const index = curViewDS.indexOf(data);
2907
2897
  const li = this.getLiFromObjOrElement(obj);
@@ -2922,11 +2912,8 @@ let ListView = class ListView extends Component {
2922
2912
  if (groupLi) {
2923
2913
  detach(groupLi);
2924
2914
  }
2925
- // eslint-disable-next-line
2926
2915
  const foundData = (dataSource.length - 1) <= 0
2927
- ? this.findParent(this.localData, this.fields.id,
2928
- // eslint-disable-next-line
2929
- (value) => value === data[this.fields.id], null) : null;
2916
+ ? this.findParent(this.localData, this.fields.id, (value) => value === data[this.fields.id], null) : null;
2930
2917
  const dsIndex = dataSource.indexOf(data);
2931
2918
  dataSource.splice(dsIndex, 1);
2932
2919
  this.setViewDataSource(listDataSource);
@@ -2969,16 +2956,13 @@ let ListView = class ListView extends Component {
2969
2956
  }
2970
2957
  }
2971
2958
  }
2972
- // eslint-disable-next-line
2973
2959
  findParent(dataSource, id, callback, parent) {
2974
- // eslint-disable-next-line no-prototype-builtins
2975
2960
  if (dataSource.hasOwnProperty(id) && callback(dataSource[id]) === true) {
2976
2961
  return extend({}, dataSource);
2977
2962
  }
2978
2963
  for (let i = 0; i < Object.keys(dataSource).length; i++) {
2979
2964
  if (dataSource[Object.keys(dataSource)[i]]
2980
2965
  && typeof dataSource[Object.keys(dataSource)[i]] === 'object') {
2981
- // eslint-disable-next-line
2982
2966
  const result = this.findParent(dataSource[Object.keys(dataSource)[i]], id, callback, dataSource);
2983
2967
  if (result != null) {
2984
2968
  if (!result.parent) {
@@ -3001,6 +2985,21 @@ let ListView = class ListView extends Component {
3001
2985
  }
3002
2986
  return modules;
3003
2987
  }
2988
+ onListScroll(e) {
2989
+ let args = { originalEvent: e, scrollDirection: "Bottom", distanceY: this.element.scrollHeight - this.element.scrollTop };
2990
+ let currentScrollTop = this.element.scrollTop;
2991
+ if (currentScrollTop > this.previousScrollTop) {
2992
+ args.scrollDirection = "Bottom";
2993
+ args.distanceY = this.element.scrollHeight - this.element.clientHeight - this.element.scrollTop;
2994
+ this.trigger('scroll', args);
2995
+ }
2996
+ else if (this.previousScrollTop > currentScrollTop) {
2997
+ args.scrollDirection = "Top";
2998
+ args.distanceY = this.element.scrollTop;
2999
+ this.trigger('scroll', args);
3000
+ }
3001
+ this.previousScrollTop = currentScrollTop;
3002
+ }
3004
3003
  /**
3005
3004
  * Get the properties to be maintained in the persisted state.
3006
3005
  */
@@ -3082,6 +3081,9 @@ __decorate([
3082
3081
  __decorate([
3083
3082
  Event()
3084
3083
  ], ListView.prototype, "actionFailure", void 0);
3084
+ __decorate([
3085
+ Event()
3086
+ ], ListView.prototype, "scroll", void 0);
3085
3087
  ListView = __decorate([
3086
3088
  NotifyPropertyChanges
3087
3089
  ], ListView);
@@ -3247,7 +3249,7 @@ class Virtualization {
3247
3249
  onVirtualUiScroll(e) {
3248
3250
  let startingHeight;
3249
3251
  const curViewDS = this.listViewInstance.curViewDS;
3250
- this.listItemHeight = select(".e-list-item", this.listViewInstance.element).getBoundingClientRect().height;
3252
+ this.listItemHeight = select('.e-list-item', this.listViewInstance.element).getBoundingClientRect().height;
3251
3253
  this.totalHeight = (Object.keys(curViewDS).length * this.listItemHeight) - (this.domItemCount * this.listItemHeight);
3252
3254
  if (this.listViewInstance.isWindow) {
3253
3255
  startingHeight = this.listViewInstance.ulElement.getBoundingClientRect().top -
@@ -3608,7 +3610,6 @@ class Virtualization {
3608
3610
  const curViewDS = this.listViewInstance.curViewDS;
3609
3611
  // eslint-disable-next-line
3610
3612
  const resutJSON = this.findDSAndIndexFromId(curViewDS, obj);
3611
- // eslint-disable-next-line
3612
3613
  if (Object.keys(resutJSON).length) {
3613
3614
  dataSource = resutJSON.data;
3614
3615
  if (curViewDS[resutJSON.index - 1] &&
@@ -3856,7 +3857,7 @@ class Virtualization {
3856
3857
  this.listViewInstance.getLiFromObjOrElement(this.listViewInstance.curViewDS[index + 2]);
3857
3858
  }
3858
3859
  if (this.listViewInstance.fields.groupBy && this.listViewInstance.curViewDS[index + 1] && this.listViewInstance.curViewDS[index + 1].isHeader) {
3859
- let targetEle = this.listViewInstance.getLiFromObjOrElement(this.listViewInstance.curViewDS[index - 1]);
3860
+ const targetEle = this.listViewInstance.getLiFromObjOrElement(this.listViewInstance.curViewDS[index - 1]);
3860
3861
  if (targetEle) {
3861
3862
  target = targetEle.nextElementSibling;
3862
3863
  }
@@ -3872,7 +3873,7 @@ class Virtualization {
3872
3873
  this.refreshItemHeight();
3873
3874
  }
3874
3875
  createUIItem(args) {
3875
- if (!args.item.classList.contains("e-list-group-item")) {
3876
+ if (!args.item.classList.contains('e-list-group-item')) {
3876
3877
  this.templateData = args.curData.isHeader ? args.curData.items[0] :
3877
3878
  args.curData;
3878
3879
  if (this.listViewInstance.showCheckBox) {
@@ -3929,7 +3930,6 @@ class Virtualization {
3929
3930
  this.listViewInstance.setLocalData();
3930
3931
  }
3931
3932
  updateUI(element, index, targetElement) {
3932
- // eslint-disable-next-line @typescript-eslint/ban-types
3933
3933
  const onChange = this.isNgTemplate() ? this.onNgChange : this.onChange;
3934
3934
  if (this.listViewInstance.template || this.listViewInstance.groupTemplate) {
3935
3935
  const curViewDS = this.listViewInstance.curViewDS[index];
@@ -3955,7 +3955,7 @@ class Virtualization {
3955
3955
  * @param {Virtualization} virtualThis - The virtualization context for the list view.
3956
3956
  */
3957
3957
  onChange(newData, listElement, virtualThis) {
3958
- let liItem = ListBase.createListItemFromJson(virtualThis.listViewInstance.createElement,
3958
+ const liItem = ListBase.createListItemFromJson(virtualThis.listViewInstance.createElement,
3959
3959
  // eslint-disable-next-line
3960
3960
  [newData], virtualThis.listViewInstance.listBaseOption, null, null, virtualThis.listViewInstance);
3961
3961
  if (virtualThis.listViewInstance.isReact) {
@@ -3970,7 +3970,6 @@ class Virtualization {
3970
3970
  }
3971
3971
  onNgChange(newData, listElement, virtualThis) {
3972
3972
  // compile given target element with template for new data
3973
- // eslint-disable-next-line
3974
3973
  const templateCompiler = compile(virtualThis.listViewInstance.template);
3975
3974
  const resultElement = templateCompiler(newData);
3976
3975
  while (listElement.lastChild) {