@syncfusion/ej2-lists 23.1.43 → 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 (39) hide show
  1. package/CHANGELOG.md +0 -8
  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 +105 -244
  6. package/dist/es6/ej2-lists.es2015.js.map +1 -1
  7. package/dist/es6/ej2-lists.es5.js +101 -241
  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 +12 -14
  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.d.ts +1 -8
  18. package/src/list-view/virtualization.js +57 -192
  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
@@ -1,4 +1,4 @@
1
- import { Animation, Base, ChildProperty, Complex, Component, Draggable, Event, EventHandler, NotifyPropertyChanges, Property, SanitizeHtmlHelper, Touch, addClass, animationMode, append, attributes, closest, compareElementParent, compile, detach, extend, formatUnit, getComponent, getUniqueID, getValue, isBlazor, isNullOrUndefined, isVisible, merge, prepend, remove, removeClass, rippleEffect } from '@syncfusion/ej2-base';
1
+ import { Animation, Base, ChildProperty, Complex, Component, Draggable, Event, EventHandler, NotifyPropertyChanges, Property, SanitizeHtmlHelper, Touch, addClass, animationMode, append, attributes, closest, compareElementParent, compile, detach, extend, formatUnit, getComponent, getUniqueID, getValue, isBlazor, isNullOrUndefined, isVisible, merge, prepend, remove, removeClass, rippleEffect, select } from '@syncfusion/ej2-base';
2
2
  import { DataManager, Query } from '@syncfusion/ej2-data';
3
3
  import { createCheckBox } from '@syncfusion/ej2-buttons';
4
4
 
@@ -280,17 +280,23 @@ 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
- li.setAttribute('title', fieldData[fields.tooltip]);
289
+ const tooltipText = SanitizeHtmlHelper.sanitize(fieldData[fields.tooltip]);
290
+ li.setAttribute('title', tooltipText);
290
291
  }
291
292
  // eslint-disable-next-line no-prototype-builtins
292
293
  if (fieldData.hasOwnProperty(fields.htmlAttributes) && fieldData[fields.htmlAttributes]) {
293
- setAttribute(li, fieldData[fields.htmlAttributes]);
294
+ const 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);
294
300
  }
295
301
  // eslint-disable-next-line no-prototype-builtins
296
302
  if (fieldData.hasOwnProperty(fields.enabled) && fieldData[fields.enabled] === false) {
@@ -506,7 +512,6 @@ var ListBase;
506
512
  const curOpt = extend({}, defaultListBaseOptions, options);
507
513
  const fields = extend({}, ListBase.defaultMappedFields, curOpt.fields);
508
514
  const curEle = element.cloneNode(true);
509
- // eslint-disable-next-line
510
515
  const jsonAr = [];
511
516
  curEle.classList.add('json-parent');
512
517
  const childs = curEle.querySelectorAll('.json-parent>li');
@@ -515,7 +520,6 @@ var ListBase;
515
520
  const li = childs[i];
516
521
  const anchor = li.querySelector('a');
517
522
  const ul = li.querySelector('ul');
518
- // eslint-disable-next-line
519
523
  const json = {};
520
524
  const childNodes = anchor ? anchor.childNodes : li.childNodes;
521
525
  const keys = Object.keys(childNodes);
@@ -589,7 +593,6 @@ var ListBase;
589
593
  const ulElement = createElement('ul', { className: cssClass.ul, attrs: { role: 'presentation' } });
590
594
  const curOpt = extend({}, defaultListBaseOptions, options);
591
595
  const curFields = extend({}, ListBase.defaultMappedFields, fields);
592
- // eslint-disable-next-line
593
596
  const compiledString = compileTemplate(template);
594
597
  const liCollection = [];
595
598
  let value;
@@ -638,7 +641,7 @@ var ListBase;
638
641
  else {
639
642
  const currentID = isHeader ? curOpt.groupTemplateID : curOpt.templateID;
640
643
  if (isHeader) {
641
- if (componentInstance && componentInstance.getModuleName() != 'listview') {
644
+ if (componentInstance && componentInstance.getModuleName() !== 'listview') {
642
645
  // eslint-disable-next-line
643
646
  const compiledElement = compiledString(curItem, componentInstance, 'headerTemplate', currentID, !!curOpt.isStringTemplate, null, li);
644
647
  if (compiledElement) {
@@ -696,7 +699,6 @@ var ListBase;
696
699
  function renderGroupTemplate(groupTemplate, groupDataSource, fields,
697
700
  // eslint-disable-next-line
698
701
  headerItems, options, componentInstance) {
699
- // eslint-disable-next-line @typescript-eslint/ban-types
700
702
  const compiledString = compileTemplate(groupTemplate);
701
703
  const curFields = extend({}, ListBase.defaultMappedFields, fields);
702
704
  const curOpt = extend({}, defaultListBaseOptions, options);
@@ -705,7 +707,7 @@ var ListBase;
705
707
  const headerData = {};
706
708
  headerData[`${category}`] = header.textContent;
707
709
  header.innerHTML = '';
708
- if (componentInstance && componentInstance.getModuleName() !== "listview") {
710
+ if (componentInstance && componentInstance.getModuleName() !== 'listview') {
709
711
  // eslint-disable-next-line
710
712
  const compiledElement = compiledString(headerData, componentInstance, 'groupTemplate', curOpt.groupTemplateID, !!curOpt.isStringTemplate, null, header);
711
713
  if (compiledElement) {
@@ -741,7 +743,6 @@ var ListBase;
741
743
  // Create expand and collapse node
742
744
  if (!!options.expandCollapse && hasChildren && !options.template) {
743
745
  element.firstElementChild.classList.add(cssClass.iconWrapper);
744
- // eslint-disable-next-line @typescript-eslint/ban-types
745
746
  const expandElement = options.expandIconPosition === 'Left' ? prepend : append;
746
747
  expandElement([createElement('div', { className: 'e-icons ' + options.expandIconClass })], element.querySelector('.' + cssClass.textContent));
747
748
  }
@@ -887,9 +888,8 @@ var ListBase;
887
888
  li.setAttribute('data-uid', generateId());
888
889
  }
889
890
  if (grpLI && options && options.groupTemplate) {
890
- // eslint-disable-next-line @typescript-eslint/ban-types
891
891
  const compiledString = compileTemplate(options.groupTemplate);
892
- if (componentInstance && componentInstance.getModuleName() !== "listview") {
892
+ if (componentInstance && componentInstance.getModuleName() !== 'listview') {
893
893
  // eslint-disable-next-line
894
894
  const compiledElement = compiledString(item, componentInstance, 'groupTemplate', curOpt.groupTemplateID, !!curOpt.isStringTemplate, null, li);
895
895
  if (compiledElement) {
@@ -901,7 +901,6 @@ var ListBase;
901
901
  }
902
902
  }
903
903
  else if (!grpLI && options && options.template) {
904
- // eslint-disable-next-line @typescript-eslint/ban-types
905
904
  const compiledString = compileTemplate(options.template);
906
905
  if (componentInstance && componentInstance.getModuleName() !== 'listview') {
907
906
  // eslint-disable-next-line
@@ -973,7 +972,6 @@ var ListBase;
973
972
  function generateIcon(createElement, liElement, className, options) {
974
973
  const curOpt = extend({}, defaultListBaseOptions, options);
975
974
  cssClass = getModuleClass(curOpt.moduleName);
976
- // eslint-disable-next-line @typescript-eslint/ban-types
977
975
  const expandElement = curOpt.expandIconPosition === 'Left' ? prepend : append;
978
976
  expandElement([createElement('div', {
979
977
  className: 'e-icons ' + curOpt.expandIconClass + ' ' +
@@ -1310,7 +1308,6 @@ let ListView = class ListView extends Component {
1310
1308
  this.headerEle.appendChild(hedBackButton);
1311
1309
  this.headerEle.appendChild(textEle);
1312
1310
  if (this.headerTemplate) {
1313
- // eslint-disable-next-line
1314
1311
  const compiledString = compile(this.headerTemplate);
1315
1312
  const headerTemplateEle = this.createElement('div', { className: classNames.headerTemplateText });
1316
1313
  // eslint-disable-next-line
@@ -1429,7 +1426,7 @@ let ListView = class ListView extends Component {
1429
1426
  itemCreated: this.renderCheckbox.bind(this),
1430
1427
  templateID: `${this.element.id}${LISTVIEW_TEMPLATE_PROPERTY}`,
1431
1428
  groupTemplateID: `${this.element.id}${LISTVIEW_GROUPTEMPLATE_PROPERTY}`,
1432
- enableHtmlSanitizer: this.enableHtmlSanitizer,
1429
+ enableHtmlSanitizer: this.enableHtmlSanitizer
1433
1430
  };
1434
1431
  this.initialization();
1435
1432
  }
@@ -1470,8 +1467,8 @@ let ListView = class ListView extends Component {
1470
1467
  if (typeof this.dataSource[0] !== 'string' && typeof this.dataSource[0] !== 'number') {
1471
1468
  fieldData = getFieldValues(args.curData, this.listBaseOption.fields);
1472
1469
  if (this.enablePersistence && !isNullOrUndefined(this.selectedId)) {
1473
- let index = this.selectedId.findIndex(e => e == fieldData[this.listBaseOption.fields.id].toString());
1474
- if (index != -1) {
1470
+ const index = this.selectedId.findIndex(e => e === fieldData[this.listBaseOption.fields.id].toString());
1471
+ if (index !== -1) {
1475
1472
  this.checkInternally(args, checkboxElement);
1476
1473
  }
1477
1474
  }
@@ -1484,7 +1481,7 @@ let ListView = class ListView extends Component {
1484
1481
  this.checkInternally(args, checkboxElement);
1485
1482
  }
1486
1483
  checkboxElement.setAttribute('aria-checked', frameElement.classList.contains(classNames.checked) ? 'true' : 'false');
1487
- checkboxElement.setAttribute('aria-label', 'checkbox');
1484
+ checkboxElement.setAttribute('aria-label', args.text);
1488
1485
  if (this.checkBoxPosition === 'Left') {
1489
1486
  checkboxElement.classList.add(classNames.checkboxLeft);
1490
1487
  args.item.firstElementChild.classList.add(classNames.checkboxLeft);
@@ -1681,7 +1678,7 @@ let ListView = class ListView extends Component {
1681
1678
  }
1682
1679
  else {
1683
1680
  this.setCheckboxLI(li, e);
1684
- if ((target.nodeName == "INPUT") || (target.nodeName == "TEXTAREA")) {
1681
+ if ((target.nodeName === 'INPUT') || (target.nodeName === 'TEXTAREA')) {
1685
1682
  target.classList.add('e-focused');
1686
1683
  this.targetElement = target;
1687
1684
  }
@@ -1689,7 +1686,7 @@ let ListView = class ListView extends Component {
1689
1686
  }
1690
1687
  else {
1691
1688
  this.setSelectLI(li, e);
1692
- if ((target.nodeName == "INPUT") || (target.nodeName == "TEXTAREA")) {
1689
+ if ((target.nodeName === 'INPUT') || (target.nodeName === 'TEXTAREA')) {
1693
1690
  target.classList.add('e-focused');
1694
1691
  this.targetElement = target;
1695
1692
  }
@@ -1950,6 +1947,9 @@ let ListView = class ListView extends Component {
1950
1947
  EventHandler.add(this.element, 'mouseout', this.leaveHandler, this);
1951
1948
  EventHandler.add(this.element, 'focusout', this.focusout, this);
1952
1949
  this.touchModule = new Touch(this.element, { swipe: this.swipeActionHandler.bind(this) });
1950
+ if (!isNullOrUndefined(this.scroll)) {
1951
+ EventHandler.add(this.element, 'scroll', this.onListScroll, this);
1952
+ }
1953
1953
  }
1954
1954
  unWireEvents() {
1955
1955
  EventHandler.remove(this.element, 'click', this.clickHandler);
@@ -1957,6 +1957,9 @@ let ListView = class ListView extends Component {
1957
1957
  EventHandler.remove(this.element, 'mouseout', this.leaveHandler);
1958
1958
  EventHandler.remove(this.element, 'mouseover', this.hoverHandler);
1959
1959
  EventHandler.remove(this.element, 'mouseout', this.leaveHandler);
1960
+ if (!isNullOrUndefined(this.scroll)) {
1961
+ EventHandler.remove(this.element, 'scroll', this.onListScroll);
1962
+ }
1960
1963
  this.touchModule.destroy();
1961
1964
  this.touchModule = null;
1962
1965
  }
@@ -1998,7 +2001,7 @@ let ListView = class ListView extends Component {
1998
2001
  if (this.curUL.querySelector('.' + classNames.focused)) {
1999
2002
  this.curUL.querySelector('.' + classNames.focused).classList.remove(classNames.focused);
2000
2003
  }
2001
- let textAreaFocus = li.querySelector('textarea') || li.querySelector('input');
2004
+ const textAreaFocus = li.querySelector('textarea') || li.querySelector('input');
2002
2005
  li.classList.add(classNames.focused);
2003
2006
  if (!isNullOrUndefined(e)) {
2004
2007
  if (e.target === textAreaFocus) {
@@ -2038,7 +2041,6 @@ let ListView = class ListView extends Component {
2038
2041
  }
2039
2042
  else {
2040
2043
  selectedItem =
2041
- // eslint-disable-next-line
2042
2044
  {
2043
2045
  item: li, text: fieldData && fieldData[this.listBaseOption.fields.text],
2044
2046
  // eslint-disable-next-line
@@ -2196,7 +2198,7 @@ let ListView = class ListView extends Component {
2196
2198
  setViewDataSource(dataSource = this.localData) {
2197
2199
  // eslint-disable-next-line
2198
2200
  let fieldValue = (isNullOrUndefined(this.fields.sortBy)) ? this.fields.text : this.fields.sortBy;
2199
- let query = ListBase.addSorting(this.sortOrder, fieldValue);
2201
+ const query = ListBase.addSorting(this.sortOrder, fieldValue);
2200
2202
  if (dataSource && this.fields.groupBy) {
2201
2203
  if (this.sortOrder !== 'None') {
2202
2204
  this.curViewDS = ListBase.groupDataSource(ListBase.getDataSource(dataSource, query), this.listBaseOption.fields, this.sortOrder);
@@ -2274,7 +2276,6 @@ let ListView = class ListView extends Component {
2274
2276
  this.removeElement(this.headerEle);
2275
2277
  this.removeElement(this.ulElement);
2276
2278
  this.removeElement(this.contentContainer);
2277
- // eslint-disable-next-line
2278
2279
  if (this.isReact) {
2279
2280
  this.clearTemplate();
2280
2281
  }
@@ -2313,7 +2314,6 @@ let ListView = class ListView extends Component {
2313
2314
  UpdateCurrentUL() {
2314
2315
  this.ulElement = this.curUL = this.element.querySelector('.' + classNames.parentItem);
2315
2316
  if (this.curUL) {
2316
- // eslint-disable-next-line
2317
2317
  this.liCollection = this.curUL.querySelectorAll('.' + classNames.listItem);
2318
2318
  }
2319
2319
  }
@@ -2328,7 +2328,6 @@ let ListView = class ListView extends Component {
2328
2328
  if (!ele) {
2329
2329
  const data = this.curViewDS;
2330
2330
  ele = ListBase.createListFromJson(this.createElement, data, this.listBaseOption, this.curDSLevel.length, null, this);
2331
- // eslint-disable-next-line
2332
2331
  if (this.isReact) {
2333
2332
  this.renderReactTemplates();
2334
2333
  }
@@ -2342,7 +2341,6 @@ let ListView = class ListView extends Component {
2342
2341
  this.liCollection = this.curUL.querySelectorAll('.' + classNames.listItem);
2343
2342
  if (this.selectedItems) {
2344
2343
  const fieldData = getFieldValues(this.selectedItems.data, this.listBaseOption.fields);
2345
- // eslint-disable-next-line
2346
2344
  this.header((fieldData[this.listBaseOption.fields.text]), true, 'header');
2347
2345
  }
2348
2346
  this.selectedLI = undefined;
@@ -2366,7 +2364,6 @@ let ListView = class ListView extends Component {
2366
2364
  this.contentContainer = this.createElement('div', { className: classNames.container });
2367
2365
  this.element.appendChild(this.contentContainer);
2368
2366
  this.renderIntoDom(this.ulElement);
2369
- // eslint-disable-next-line
2370
2367
  if (this.isReact) {
2371
2368
  this.renderReactTemplates();
2372
2369
  }
@@ -2375,7 +2372,6 @@ let ListView = class ListView extends Component {
2375
2372
  getElementUID(obj) {
2376
2373
  let fields = {};
2377
2374
  if (obj instanceof Element) {
2378
- // eslint-disable-next-line
2379
2375
  fields[this.fields.id] = obj.getAttribute('data-uid');
2380
2376
  }
2381
2377
  else {
@@ -2401,12 +2397,12 @@ let ListView = class ListView extends Component {
2401
2397
  selector: '.' + classNames.listItem
2402
2398
  });
2403
2399
  this.renderComplete();
2400
+ this.previousScrollTop = this.element.scrollTop;
2404
2401
  }
2405
2402
  /**
2406
2403
  * It is used to destroy the ListView component.
2407
2404
  */
2408
2405
  destroy() {
2409
- // eslint-disable-next-line
2410
2406
  if (this.isReact) {
2411
2407
  this.clearTemplate();
2412
2408
  }
@@ -2448,7 +2444,6 @@ let ListView = class ListView extends Component {
2448
2444
  toUL = toUL.parentElement;
2449
2445
  }
2450
2446
  const fieldData = getFieldValues(this.curDSJSON, this.listBaseOption.fields);
2451
- // eslint-disable-next-line
2452
2447
  const text = fieldData[this.fields.text];
2453
2448
  this.switchView(fromUL, toUL, true);
2454
2449
  this.removeFocus();
@@ -2521,7 +2516,6 @@ let ListView = class ListView extends Component {
2521
2516
  if (!this.enableVirtualization && isNullOrUndefined(li)) {
2522
2517
  const curLi = this.element.querySelectorAll('.' + classNames.listItem);
2523
2518
  for (let i = 0; i < curLi.length; i++) {
2524
- // eslint-disable-next-line
2525
2519
  if (curLi[i].innerText.trim() === fieldData[this.fields.text]) {
2526
2520
  li = curLi[i];
2527
2521
  }
@@ -2571,7 +2565,6 @@ let ListView = class ListView extends Component {
2571
2565
  *
2572
2566
  */
2573
2567
  getSelectedItems() {
2574
- // eslint-disable-next-line
2575
2568
  let finalValue;
2576
2569
  let isCompleted = false;
2577
2570
  this.selectedId = [];
@@ -2582,7 +2575,6 @@ let ListView = class ListView extends Component {
2582
2575
  isCompleted = true;
2583
2576
  }
2584
2577
  else if (this.showCheckBox && !isCompleted) {
2585
- // eslint-disable-next-line
2586
2578
  const liCollection = this.curUL.getElementsByClassName(classNames.selected);
2587
2579
  const liTextCollection = [];
2588
2580
  const liDataCollection = [];
@@ -2602,9 +2594,7 @@ let ListView = class ListView extends Component {
2602
2594
  liDataCollection.push(tempData);
2603
2595
  }
2604
2596
  if (fieldData) {
2605
- // eslint-disable-next-line
2606
2597
  liTextCollection.push(fieldData[this.listBaseOption.fields.text]);
2607
- // eslint-disable-next-line
2608
2598
  this.selectedId.push(fieldData[this.listBaseOption.fields.id]);
2609
2599
  }
2610
2600
  else {
@@ -2646,7 +2636,6 @@ let ListView = class ListView extends Component {
2646
2636
  isCompleted = true;
2647
2637
  }
2648
2638
  else {
2649
- // eslint-disable-next-line
2650
2639
  this.selectedId.push(fieldData[this.listBaseOption.fields.id]);
2651
2640
  finalValue = {
2652
2641
  text: fieldData[this.listBaseOption.fields.text], item: liElement,
@@ -2704,7 +2693,6 @@ let ListView = class ListView extends Component {
2704
2693
  if (li) {
2705
2694
  li.classList.add(classNames.disable);
2706
2695
  }
2707
- // eslint-disable-next-line
2708
2696
  resultJSON[this.fields.enabled] = false;
2709
2697
  }
2710
2698
  }
@@ -2740,7 +2728,6 @@ let ListView = class ListView extends Component {
2740
2728
  li.style.display = display;
2741
2729
  }
2742
2730
  if (isHide) {
2743
- // eslint-disable-next-line
2744
2731
  resultJSON[this.fields.isVisible] = false;
2745
2732
  }
2746
2733
  else {
@@ -2823,7 +2810,6 @@ let ListView = class ListView extends Component {
2823
2810
  return newDataSource;
2824
2811
  }
2825
2812
  addItemInNestedList(targetItemData, itemQueue) {
2826
- // eslint-disable-next-line
2827
2813
  const targetItemId = targetItemData[this.fields.id];
2828
2814
  const targetChildDS = targetItemData[this.fields.child];
2829
2815
  const isAlreadyRenderedUL = this.element.querySelector('[pid=\'' + targetItemId + '\']');
@@ -2864,7 +2850,6 @@ let ListView = class ListView extends Component {
2864
2850
  this.getLiFromObjOrElement(curViewDS[index + 2]) || null;
2865
2851
  const li = ListBase.createListItemFromJson(this.createElement, [dataSource], this.listBaseOption, null, null, this);
2866
2852
  this.setAttributes(li);
2867
- // eslint-disable-next-line
2868
2853
  if (this.template && this.isReact) {
2869
2854
  this.renderReactTemplates();
2870
2855
  }
@@ -2896,11 +2881,9 @@ let ListView = class ListView extends Component {
2896
2881
  const curViewDS = this.curViewDS;
2897
2882
  const fields = obj instanceof Element ? this.getElementUID(obj) : obj;
2898
2883
  let dataSource;
2899
- // eslint-disable-next-line prefer-const
2900
2884
  dataSource = this.findItemFromDS(listDataSource, fields, true);
2901
2885
  if (dataSource) {
2902
2886
  let data;
2903
- // eslint-disable-next-line prefer-const
2904
2887
  data = this.findItemFromDS(dataSource, fields);
2905
2888
  const index = curViewDS.indexOf(data);
2906
2889
  const li = this.getLiFromObjOrElement(obj);
@@ -2921,11 +2904,8 @@ let ListView = class ListView extends Component {
2921
2904
  if (groupLi) {
2922
2905
  detach(groupLi);
2923
2906
  }
2924
- // eslint-disable-next-line
2925
2907
  const foundData = (dataSource.length - 1) <= 0
2926
- ? this.findParent(this.localData, this.fields.id,
2927
- // eslint-disable-next-line
2928
- (value) => value === data[this.fields.id], null) : null;
2908
+ ? this.findParent(this.localData, this.fields.id, (value) => value === data[this.fields.id], null) : null;
2929
2909
  const dsIndex = dataSource.indexOf(data);
2930
2910
  dataSource.splice(dsIndex, 1);
2931
2911
  this.setViewDataSource(listDataSource);
@@ -2968,16 +2948,13 @@ let ListView = class ListView extends Component {
2968
2948
  }
2969
2949
  }
2970
2950
  }
2971
- // eslint-disable-next-line
2972
2951
  findParent(dataSource, id, callback, parent) {
2973
- // eslint-disable-next-line no-prototype-builtins
2974
2952
  if (dataSource.hasOwnProperty(id) && callback(dataSource[id]) === true) {
2975
2953
  return extend({}, dataSource);
2976
2954
  }
2977
2955
  for (let i = 0; i < Object.keys(dataSource).length; i++) {
2978
2956
  if (dataSource[Object.keys(dataSource)[i]]
2979
2957
  && typeof dataSource[Object.keys(dataSource)[i]] === 'object') {
2980
- // eslint-disable-next-line
2981
2958
  const result = this.findParent(dataSource[Object.keys(dataSource)[i]], id, callback, dataSource);
2982
2959
  if (result != null) {
2983
2960
  if (!result.parent) {
@@ -3000,6 +2977,21 @@ let ListView = class ListView extends Component {
3000
2977
  }
3001
2978
  return modules;
3002
2979
  }
2980
+ onListScroll(e) {
2981
+ let args = { originalEvent: e, scrollDirection: "Bottom", distanceY: this.element.scrollHeight - this.element.scrollTop };
2982
+ let currentScrollTop = this.element.scrollTop;
2983
+ if (currentScrollTop > this.previousScrollTop) {
2984
+ args.scrollDirection = "Bottom";
2985
+ args.distanceY = this.element.scrollHeight - this.element.clientHeight - this.element.scrollTop;
2986
+ this.trigger('scroll', args);
2987
+ }
2988
+ else if (this.previousScrollTop > currentScrollTop) {
2989
+ args.scrollDirection = "Top";
2990
+ args.distanceY = this.element.scrollTop;
2991
+ this.trigger('scroll', args);
2992
+ }
2993
+ this.previousScrollTop = currentScrollTop;
2994
+ }
3003
2995
  /**
3004
2996
  * Get the properties to be maintained in the persisted state.
3005
2997
  */
@@ -3081,6 +3073,9 @@ __decorate([
3081
3073
  __decorate([
3082
3074
  Event()
3083
3075
  ], ListView.prototype, "actionFailure", void 0);
3076
+ __decorate([
3077
+ Event()
3078
+ ], ListView.prototype, "scroll", void 0);
3084
3079
  ListView = __decorate([
3085
3080
  NotifyPropertyChanges
3086
3081
  ], ListView);
@@ -3114,10 +3109,6 @@ class Virtualization {
3114
3109
  * @private
3115
3110
  */
3116
3111
  uiVirtualization() {
3117
- this.commonTemplate = '<div class="e-text-content" role="presentation"> ' +
3118
- '<span class="e-list-text"> ${' + this.listViewInstance.fields.text + '} </span></div>';
3119
- this.templateFunction = compile(this.listViewInstance.template || this.commonTemplate, this.listViewInstance);
3120
- this.groupTemplateFunction = compile(this.listViewInstance.groupTemplate || this.commonTemplate, this.listViewInstance);
3121
3112
  this.wireScrollEvent(false);
3122
3113
  const curViewDS = this.listViewInstance.curViewDS;
3123
3114
  const firstDs = curViewDS.slice(0, 1);
@@ -3249,6 +3240,9 @@ class Virtualization {
3249
3240
  }
3250
3241
  onVirtualUiScroll(e) {
3251
3242
  let startingHeight;
3243
+ const curViewDS = this.listViewInstance.curViewDS;
3244
+ this.listItemHeight = select('.e-list-item', this.listViewInstance.element).getBoundingClientRect().height;
3245
+ this.totalHeight = (Object.keys(curViewDS).length * this.listItemHeight) - (this.domItemCount * this.listItemHeight);
3252
3246
  if (this.listViewInstance.isWindow) {
3253
3247
  startingHeight = this.listViewInstance.ulElement.getBoundingClientRect().top -
3254
3248
  document.documentElement.getBoundingClientRect().top;
@@ -3364,7 +3358,13 @@ class Virtualization {
3364
3358
  if (!element.querySelector('.' + classNames.checkboxWrapper)) {
3365
3359
  element.classList.add(classNames.checklist);
3366
3360
  textContent.classList.add(classNames.checkbox);
3367
- textContent.insertBefore(this.checkListWrapper.cloneNode(true), element.querySelector('.' + classNames.listItemText));
3361
+ if (this.listViewInstance.checkBoxPosition === 'Left') {
3362
+ textContent.classList.add('e-checkbox-left');
3363
+ }
3364
+ else {
3365
+ textContent.classList.add('e-checkbox-right');
3366
+ }
3367
+ textContent.append(this.checkListWrapper.cloneNode(true));
3368
3368
  }
3369
3369
  }
3370
3370
  }
@@ -3602,7 +3602,6 @@ class Virtualization {
3602
3602
  const curViewDS = this.listViewInstance.curViewDS;
3603
3603
  // eslint-disable-next-line
3604
3604
  const resutJSON = this.findDSAndIndexFromId(curViewDS, obj);
3605
- // eslint-disable-next-line
3606
3605
  if (Object.keys(resutJSON).length) {
3607
3606
  dataSource = resutJSON.data;
3608
3607
  if (curViewDS[resutJSON.index - 1] &&
@@ -3850,7 +3849,7 @@ class Virtualization {
3850
3849
  this.listViewInstance.getLiFromObjOrElement(this.listViewInstance.curViewDS[index + 2]);
3851
3850
  }
3852
3851
  if (this.listViewInstance.fields.groupBy && this.listViewInstance.curViewDS[index + 1] && this.listViewInstance.curViewDS[index + 1].isHeader) {
3853
- let targetEle = this.listViewInstance.getLiFromObjOrElement(this.listViewInstance.curViewDS[index - 1]);
3852
+ const targetEle = this.listViewInstance.getLiFromObjOrElement(this.listViewInstance.curViewDS[index - 1]);
3854
3853
  if (targetEle) {
3855
3854
  target = targetEle.nextElementSibling;
3856
3855
  }
@@ -3866,190 +3865,49 @@ class Virtualization {
3866
3865
  this.refreshItemHeight();
3867
3866
  }
3868
3867
  createUIItem(args) {
3869
- const template = document.createElement('div');
3870
- this.templateData = args.curData.isHeader ? args.curData.items[0] :
3871
- args.curData;
3872
- if (this.listViewInstance.isReact) {
3873
- this.commonTemplate = null;
3874
- }
3875
- if (this.listViewInstance.showCheckBox) {
3876
- // eslint-disable-next-line
3877
- this.listViewInstance.renderCheckbox(args);
3878
- if ((!isNullOrUndefined(this.listViewInstance.virtualCheckBox)) &&
3879
- (!isNullOrUndefined(this.listViewInstance.virtualCheckBox.outerHTML))) {
3880
- const div = document.createElement('div');
3881
- const nodes = this.templateFunction(this.templateData, this.listViewInstance);
3882
- if (this.listViewInstance.template && this.listViewInstance.isReact) {
3883
- this.listViewInstance.renderReactTemplates();
3884
- }
3885
- [].slice.call(nodes).forEach((ele) => {
3886
- div.appendChild(ele);
3887
- });
3888
- if (div.children && div.children[0]) {
3889
- div.children[0].classList.add('e-checkbox');
3890
- if (this.listViewInstance.checkBoxPosition === 'Left') {
3891
- div.children[0].classList.add('e-checkbox-left');
3892
- }
3893
- else {
3894
- div.children[0].classList.add('e-checkbox-right');
3895
- }
3896
- if (this.listViewInstance.checkBoxPosition === 'Left') {
3897
- div.children[0].insertBefore(this.listViewInstance.virtualCheckBox, div.childNodes[0].children[0]);
3898
- }
3899
- else {
3900
- div.children[0].appendChild(this.listViewInstance.virtualCheckBox);
3868
+ if (!args.item.classList.contains('e-list-group-item')) {
3869
+ this.templateData = args.curData.isHeader ? args.curData.items[0] :
3870
+ args.curData;
3871
+ if (this.listViewInstance.showCheckBox) {
3872
+ // eslint-disable-next-line
3873
+ this.listViewInstance.renderCheckbox(args);
3874
+ if ((!isNullOrUndefined(this.listViewInstance.virtualCheckBox)) &&
3875
+ (!isNullOrUndefined(this.listViewInstance.virtualCheckBox.outerHTML))) {
3876
+ const div = document.createElement('div');
3877
+ const commonTemplate = '<div class="e-text-content" role="presentation"> ' +
3878
+ '<span class="e-list-text"> ${' + this.listViewInstance.fields.text + '} </span></div>';
3879
+ const templateFunction = compile(this.listViewInstance.template || commonTemplate, this.listViewInstance);
3880
+ const nodes = templateFunction(this.templateData, this.listViewInstance);
3881
+ if (this.listViewInstance.template && this.listViewInstance.isReact) {
3882
+ this.listViewInstance.renderReactTemplates();
3901
3883
  }
3902
- template.innerHTML = div.innerHTML;
3903
- }
3904
- }
3905
- else {
3906
- let div = document.createElement('div');
3907
- const nodes = this.templateFunction(this.templateData, this.listViewInstance);
3908
- if (this.listViewInstance.template && this.listViewInstance.isReact) {
3909
- this.listViewInstance.renderReactTemplates();
3910
- }
3911
- [].slice.call(nodes).forEach((ele) => {
3912
- div.appendChild(ele);
3913
- });
3914
- template.innerHTML = div.innerHTML;
3915
- }
3916
- }
3917
- else {
3918
- const nodes = this.templateFunction(this.templateData, this.listViewInstance);
3919
- if (this.listViewInstance.template && this.listViewInstance.isReact) {
3920
- this.listViewInstance.renderReactTemplates();
3921
- }
3922
- [].slice.call(nodes).forEach((ele) => {
3923
- template.appendChild(ele);
3924
- });
3925
- }
3926
- if (args.curData.isHeader) {
3927
- this.headerData = args.curData;
3928
- }
3929
- const groupTemplate = this.listViewInstance.createElement('div');
3930
- if (this.listViewInstance.fields.groupBy) {
3931
- const nodes = this.groupTemplateFunction(this.headerData, this.listViewInstance);
3932
- if (this.listViewInstance.template && this.listViewInstance.isReact) {
3933
- this.listViewInstance.renderReactTemplates();
3934
- }
3935
- [].slice.call(nodes).forEach((ele) => {
3936
- groupTemplate.appendChild(ele);
3937
- });
3938
- }
3939
- if ((!this.listViewInstance.isReact || (typeof this.listViewInstance.template == "string" && !args.item.classList.contains("e-list-group-item")) ||
3940
- (typeof this.listViewInstance.groupTemplate == "string" && args.item.classList.contains("e-list-group-item"))) && !this.listViewInstance.isVue) {
3941
- args.item.innerHTML = '';
3942
- }
3943
- args.item.context = { data: args.curData, nodes: { flatTemplateNodes: [], groupTemplateNodes: [] } };
3944
- for (let i = 0; i < template.children.length; i++) {
3945
- this.compileTemplate(template.children[i], args.item, false);
3946
- }
3947
- for (let i = 0; i < groupTemplate.children.length; i++) {
3948
- this.compileTemplate(groupTemplate.children[i], args.item, true);
3949
- }
3950
- args.item.context.template = args.curData.isHeader ? template.firstElementChild :
3951
- groupTemplate.firstElementChild;
3952
- args.item.context.type = args.curData.isHeader ? 'flatList' : 'groupList';
3953
- const element = args.curData.isHeader ? groupTemplate : template;
3954
- if (element.firstElementChild && !this.listViewInstance.isReact && !this.listViewInstance.isVue) {
3955
- args.item.insertBefore(element.firstElementChild, null);
3956
- }
3957
- }
3958
- compileTemplate(element, item, isHeader) {
3959
- const subNode = {};
3960
- subNode.onChange = (value) => {
3961
- let groupTemplateElements;
3962
- let templateElements;
3963
- if (this.listViewInstance.isVue) {
3964
- groupTemplateElements = this.groupTemplateFunction(value);
3965
- templateElements = this.templateFunction(value);
3966
- }
3967
- else {
3968
- groupTemplateElements = this.groupTemplateFunction(value, this.listViewInstance);
3969
- templateElements = this.templateFunction(value, this.listViewInstance);
3970
- }
3971
- if (this.listViewInstance.template && this.listViewInstance.isReact) {
3972
- this.listViewInstance.renderReactTemplates();
3973
- }
3974
- let currentTemplate = templateElements;
3975
- if (value.isHeader) {
3976
- currentTemplate = groupTemplateElements;
3977
- }
3978
- [].slice.call(currentTemplate).forEach(function (currentElement) {
3979
- let RemovableClass = element.classList.value.replace('e-checkbox', '');
3980
- RemovableClass = RemovableClass.replace('e-checkbox-left', '');
3981
- RemovableClass = RemovableClass.replace('e-checkbox-right', '');
3982
- removeClass([element], RemovableClass.split(' ').filter(function (css) { return css; }));
3983
- addClass([element], Array.from(currentElement.classList));
3984
- for (let i = 0; i < element.attributes.length; i++) {
3985
- if (element.attributes[i].name != 'class') {
3986
- const newData = currentElement.getAttribute(element.attributes[i].name);
3987
- element.setAttribute(element.attributes[i].name, newData);
3884
+ [].slice.call(nodes).forEach((ele) => {
3885
+ div.appendChild(ele);
3886
+ });
3887
+ if (div.children && div.children[0]) {
3888
+ div.children[0].classList.add('e-checkbox');
3889
+ if (this.listViewInstance.checkBoxPosition === 'Left') {
3890
+ div.children[0].classList.add('e-checkbox-left');
3891
+ }
3892
+ else {
3893
+ div.children[0].classList.add('e-checkbox-right');
3894
+ }
3895
+ if (this.listViewInstance.checkBoxPosition === 'Left') {
3896
+ div.children[0].insertBefore(this.listViewInstance.virtualCheckBox, div.childNodes[0].children[0]);
3897
+ }
3898
+ else {
3899
+ div.children[0].appendChild(this.listViewInstance.virtualCheckBox);
3900
+ }
3901
+ while (args.item.lastChild) {
3902
+ args.item.removeChild(args.item.lastChild);
3903
+ }
3904
+ [].slice.call(div.children).forEach(function (ele) {
3905
+ args.item.appendChild(ele);
3906
+ });
3988
3907
  }
3989
3908
  }
3990
- [].slice.call(element.children).forEach(function (ele) {
3991
- if (!ele.classList.contains('e-listview-checkbox') && !(ele.classList.contains('e-checkbox-left') || ele.classList.contains('e-checkbox-right'))) {
3992
- ele.remove();
3993
- }
3994
- });
3995
- [].slice.call(currentElement.children).forEach(function (ele) {
3996
- element.appendChild(ele);
3997
- });
3998
- });
3999
- };
4000
- this.updateContextData(item, subNode, isHeader);
4001
- }
4002
- onChange(newData, listElement) {
4003
- listElement.context.data = newData;
4004
- // eslint-disable-next-line max-len
4005
- const groupTemplateNodes = listElement.context.nodes.groupTemplateNodes;
4006
- // eslint-disable-next-line max-len
4007
- const flatTemplateNodes = listElement.context.nodes.flatTemplateNodes;
4008
- // eslint-disable-next-line
4009
- if (!isNullOrUndefined(newData.isHeader) && newData.isHeader && listElement.context.type === 'groupList') {
4010
- // eslint-disable-next-line
4011
- const element = listElement.firstElementChild;
4012
- detach(listElement.firstElementChild);
4013
- listElement.insertBefore(listElement.context.template, null);
4014
- listElement.context.template = element;
4015
- listElement.context.type = 'flatList';
4016
- for (let i = 0; i < groupTemplateNodes.length; i++) {
4017
- // eslint-disable-next-line
4018
- groupTemplateNodes[i].onChange(newData);
4019
3909
  }
4020
3910
  }
4021
- else if (!newData.isHeader && listElement.context.type === 'flatList') {
4022
- const element = listElement.firstElementChild;
4023
- detach(listElement.firstElementChild);
4024
- listElement.insertBefore(listElement.context.template, null);
4025
- listElement.context.template = element;
4026
- listElement.context.type = 'groupList';
4027
- for (let i = 0; i < flatTemplateNodes.length; i++) {
4028
- // eslint-disable-next-line
4029
- flatTemplateNodes[i].onChange(newData);
4030
- }
4031
- }
4032
- else if (!newData.isHeader) {
4033
- for (let i = 0; i < flatTemplateNodes.length; i++) {
4034
- // eslint-disable-next-line
4035
- flatTemplateNodes[i].onChange(newData);
4036
- }
4037
- }
4038
- else {
4039
- for (let i = 0; i < groupTemplateNodes.length; i++) {
4040
- // eslint-disable-next-line
4041
- groupTemplateNodes[i].onChange(newData);
4042
- }
4043
- }
4044
- }
4045
- // eslint-disable-next-line
4046
- updateContextData(listElement, node, isHeader) {
4047
- if (isHeader) {
4048
- listElement.context.nodes.groupTemplateNodes.push(node);
4049
- }
4050
- else {
4051
- listElement.context.nodes.flatTemplateNodes.push(node);
4052
- }
4053
3911
  }
4054
3912
  reRenderUiVirtualization() {
4055
3913
  this.wireScrollEvent(true);
@@ -4064,8 +3922,7 @@ class Virtualization {
4064
3922
  this.listViewInstance.setLocalData();
4065
3923
  }
4066
3924
  updateUI(element, index, targetElement) {
4067
- // eslint-disable-next-line @typescript-eslint/ban-types
4068
- const onChange = this.isNgTemplate() ? this.onNgChange : (this.isVueFunctionTemplate()) ? this.onVueChange : this.onChange;
3925
+ const onChange = this.isNgTemplate() ? this.onNgChange : this.onChange;
4069
3926
  if (this.listViewInstance.template || this.listViewInstance.groupTemplate) {
4070
3927
  const curViewDS = this.listViewInstance.curViewDS[index];
4071
3928
  // eslint-disable-next-line
@@ -4089,18 +3946,22 @@ class Virtualization {
4089
3946
  * @param {ElementContext} listElement - The HTML element context for the list view.
4090
3947
  * @param {Virtualization} virtualThis - The virtualization context for the list view.
4091
3948
  */
4092
- onVueChange(newData, listElement, virtualThis) {
4093
- let liItem = ListBase.createListItemFromJson(virtualThis.listViewInstance.createElement,
3949
+ onChange(newData, listElement, virtualThis) {
3950
+ const liItem = ListBase.createListItemFromJson(virtualThis.listViewInstance.createElement,
4094
3951
  // eslint-disable-next-line
4095
3952
  [newData], virtualThis.listViewInstance.listBaseOption, null, null, virtualThis.listViewInstance);
3953
+ if (virtualThis.listViewInstance.isReact) {
3954
+ virtualThis.listViewInstance.renderReactTemplates();
3955
+ }
4096
3956
  while (listElement.lastChild) {
4097
3957
  listElement.removeChild(listElement.lastChild);
4098
3958
  }
4099
- listElement.appendChild(liItem[0].firstChild);
3959
+ [].slice.call(liItem[0].children).forEach(function (ele) {
3960
+ listElement.appendChild(ele);
3961
+ });
4100
3962
  }
4101
3963
  onNgChange(newData, listElement, virtualThis) {
4102
3964
  // compile given target element with template for new data
4103
- // eslint-disable-next-line
4104
3965
  const templateCompiler = compile(virtualThis.listViewInstance.template);
4105
3966
  const resultElement = templateCompiler(newData);
4106
3967
  while (listElement.lastChild) {