@syncfusion/ej2-dropdowns 24.2.9 → 25.1.35

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 (92) hide show
  1. package/CHANGELOG.md +23 -158
  2. package/dist/ej2-dropdowns.min.js +2 -2
  3. package/dist/ej2-dropdowns.umd.min.js +2 -2
  4. package/dist/ej2-dropdowns.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-dropdowns.es2015.js +1996 -513
  6. package/dist/es6/ej2-dropdowns.es2015.js.map +1 -1
  7. package/dist/es6/ej2-dropdowns.es5.js +2012 -512
  8. package/dist/es6/ej2-dropdowns.es5.js.map +1 -1
  9. package/dist/global/ej2-dropdowns.min.js +2 -2
  10. package/dist/global/ej2-dropdowns.min.js.map +1 -1
  11. package/dist/global/index.d.ts +1 -1
  12. package/package.json +13 -13
  13. package/src/auto-complete/auto-complete-model.d.ts +3 -1
  14. package/src/auto-complete/auto-complete.d.ts +2 -0
  15. package/src/auto-complete/auto-complete.js +51 -6
  16. package/src/combo-box/combo-box-model.d.ts +10 -1
  17. package/src/combo-box/combo-box.d.ts +10 -2
  18. package/src/combo-box/combo-box.js +55 -23
  19. package/src/common/interface.d.ts +32 -0
  20. package/src/common/virtual-scroll.d.ts +1 -3
  21. package/src/common/virtual-scroll.js +157 -27
  22. package/src/drop-down-base/drop-down-base-model.d.ts +1 -1
  23. package/src/drop-down-base/drop-down-base.d.ts +64 -5
  24. package/src/drop-down-base/drop-down-base.js +241 -24
  25. package/src/drop-down-list/drop-down-list-model.d.ts +10 -1
  26. package/src/drop-down-list/drop-down-list.d.ts +16 -50
  27. package/src/drop-down-list/drop-down-list.js +150 -196
  28. package/src/drop-down-tree/drop-down-tree-model.d.ts +16 -12
  29. package/src/drop-down-tree/drop-down-tree.d.ts +13 -3
  30. package/src/drop-down-tree/drop-down-tree.js +55 -49
  31. package/src/global.js +1 -1
  32. package/src/list-box/list-box.js +9 -4
  33. package/src/mention/mention.d.ts +2 -0
  34. package/src/mention/mention.js +16 -8
  35. package/src/multi-select/checkbox-selection.js +8 -2
  36. package/src/multi-select/float-label.d.ts +5 -5
  37. package/src/multi-select/index.d.ts +1 -0
  38. package/src/multi-select/index.js +1 -0
  39. package/src/multi-select/interface.d.ts +1 -0
  40. package/src/multi-select/multi-select-model.d.ts +17 -2
  41. package/src/multi-select/multi-select.d.ts +34 -4
  42. package/src/multi-select/multi-select.js +1271 -173
  43. package/styles/auto-complete/_bds-definition.scss +2 -0
  44. package/styles/bootstrap-dark.css +7 -1
  45. package/styles/bootstrap.css +7 -1
  46. package/styles/bootstrap4.css +2 -1
  47. package/styles/bootstrap5-dark.css +2 -1
  48. package/styles/bootstrap5.css +2 -1
  49. package/styles/combo-box/_bds-definition.scss +2 -0
  50. package/styles/drop-down-base/_bds-definition.scss +134 -0
  51. package/styles/drop-down-list/_bds-definition.scss +134 -0
  52. package/styles/drop-down-list/icons/_bds.scss +14 -0
  53. package/styles/drop-down-tree/_bds-definition.scss +61 -0
  54. package/styles/drop-down-tree/icons/_bds.scss +11 -0
  55. package/styles/fabric-dark.css +3 -1
  56. package/styles/fabric.css +3 -1
  57. package/styles/fluent-dark.css +7 -1
  58. package/styles/fluent.css +7 -1
  59. package/styles/highcontrast-light.css +3 -1
  60. package/styles/highcontrast.css +3 -1
  61. package/styles/list-box/_bds-definition.scss +136 -0
  62. package/styles/list-box/icons/_bds.scss +25 -0
  63. package/styles/material-dark.css +2 -1
  64. package/styles/material.css +2 -1
  65. package/styles/material3-dark.css +2 -1
  66. package/styles/material3.css +2 -1
  67. package/styles/mention/_bds-definition.scss +1 -0
  68. package/styles/multi-select/_bds-definition.scss +235 -0
  69. package/styles/multi-select/_bootstrap-dark-definition.scss +4 -0
  70. package/styles/multi-select/_bootstrap-definition.scss +4 -0
  71. package/styles/multi-select/_fluent-definition.scss +5 -0
  72. package/styles/multi-select/_layout.scss +8 -1
  73. package/styles/multi-select/bootstrap-dark.css +7 -1
  74. package/styles/multi-select/bootstrap.css +7 -1
  75. package/styles/multi-select/bootstrap4.css +2 -1
  76. package/styles/multi-select/bootstrap5-dark.css +2 -1
  77. package/styles/multi-select/bootstrap5.css +2 -1
  78. package/styles/multi-select/fabric-dark.css +3 -1
  79. package/styles/multi-select/fabric.css +3 -1
  80. package/styles/multi-select/fluent-dark.css +7 -1
  81. package/styles/multi-select/fluent.css +7 -1
  82. package/styles/multi-select/highcontrast-light.css +3 -1
  83. package/styles/multi-select/highcontrast.css +3 -1
  84. package/styles/multi-select/icons/_bds.scss +26 -0
  85. package/styles/multi-select/material-dark.css +2 -1
  86. package/styles/multi-select/material.css +2 -1
  87. package/styles/multi-select/material3-dark.css +2 -1
  88. package/styles/multi-select/material3.css +2 -1
  89. package/styles/multi-select/tailwind-dark.css +2 -1
  90. package/styles/multi-select/tailwind.css +2 -1
  91. package/styles/tailwind-dark.css +2 -1
  92. package/styles/tailwind.css +2 -1
@@ -1,9 +1,9 @@
1
1
  import { Animation, Browser, ChildProperty, Complex, Component, Event, EventHandler, KeyboardEvents, L10n, NotifyPropertyChanges, Property, SanitizeHtmlHelper, Touch, addClass, append, attributes, classList, closest, compile, createElement, debounce, detach, extend, formatUnit, getComponent, getUniqueID, getValue, isNullOrUndefined, isUndefined, matches, prepend, remove, removeClass, rippleEffect, select, selectAll, setStyleAttribute, setValue } from '@syncfusion/ej2-base';
2
2
  import { DataManager, DataUtil, JsonAdaptor, Predicate, Query } from '@syncfusion/ej2-data';
3
3
  import { ListBase, Sortable, cssClass, moveTo } from '@syncfusion/ej2-lists';
4
+ import { Skeleton } from '@syncfusion/ej2-notifications';
4
5
  import { Popup, createSpinner, getZindexPartial, hideSpinner, isCollide, showSpinner } from '@syncfusion/ej2-popups';
5
6
  import { Input, TextBox } from '@syncfusion/ej2-inputs';
6
- import { Skeleton } from '@syncfusion/ej2-notifications';
7
7
  import { Button, createCheckBox } from '@syncfusion/ej2-buttons';
8
8
  import { TreeView } from '@syncfusion/ej2-navigations';
9
9
 
@@ -331,7 +331,9 @@ class VirtualScroll {
331
331
  generateAndExecuteQueryAsync(query, virtualItemStartIndex = 0, virtualItemEndIndex = 0, isQueryGenerated = false) {
332
332
  let dataSource = this.parent.dataSource;
333
333
  if (!isQueryGenerated) {
334
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
334
335
  if (!isNullOrUndefined(this.parent.query)) {
336
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
335
337
  var newQuery = this.removeSkipAndTakeEvents(this.parent.query.clone());
336
338
  query = this.getPageQuery(newQuery, virtualItemStartIndex, virtualItemEndIndex);
337
339
  }
@@ -346,6 +348,7 @@ class VirtualScroll {
346
348
  totalData = this.parent.dataSource.dataSource.json.length;
347
349
  }
348
350
  else if (this.parent.dataSource && this.parent.dataSource.length > 0) {
351
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
349
352
  totalData = this.parent.dataSource.length;
350
353
  }
351
354
  if (totalData > 0) {
@@ -362,22 +365,151 @@ class VirtualScroll {
362
365
  });
363
366
  return query;
364
367
  }
365
- setCurrentViewDataAsync() {
368
+ setCurrentViewDataAsync(component) {
366
369
  // eslint-disable-next-line
367
370
  let currentData = [];
368
- for (let i = this.parent.viewPortInfo.startIndex; i < this.parent.viewPortInfo.endIndex; i++) {
369
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
370
- const alreadyAddedData = this.parent.generatedDataObject[i];
371
- if (alreadyAddedData) {
372
- currentData.push(alreadyAddedData[0]);
371
+ let isResetListCalled = false;
372
+ let isListUpdated = true;
373
+ if (isNullOrUndefined(this.component)) {
374
+ this.component = component.component;
375
+ }
376
+ let endIndex = this.parent.viewPortInfo.endIndex;
377
+ if (this.component === 'multiselect' && this.parent.mode === 'CheckBox' && this.parent.value && Array.isArray(this.parent.value) && this.parent.value.length > 0 && this.parent.enableSelectionOrder) {
378
+ if (this.parent.viewPortInfo.startIndex < this.parent.value.length) {
379
+ endIndex = this.parent.viewPortInfo.endIndex - this.parent.value.length;
380
+ if (this.parent.viewPortInfo.startIndex === 0) {
381
+ this.parent.updateVirtualReOrderList(true);
382
+ if (this.parent.value.length < this.parent.itemCount) {
383
+ var oldUlElement = this.parent.list.querySelector('.e-list-parent' + ':not(.e-reorder)');
384
+ if (oldUlElement) {
385
+ this.parent.list.querySelector('.e-virtual-ddl-content').removeChild(oldUlElement);
386
+ }
387
+ var query = this.parent.getForQuery(this.parent.value).clone();
388
+ query = query.skip(0).take(this.parent.itemCount - (this.parent.value.length - this.parent.viewPortInfo.startIndex));
389
+ this.parent.appendUncheckList = true;
390
+ this.parent.resetList(this.parent.dataSource, this.parent.fields, query);
391
+ isListUpdated = false;
392
+ this.parent.appendUncheckList = false;
393
+ isListUpdated = false;
394
+ }
395
+ else {
396
+ var oldUlElement = this.parent.list.querySelector('.e-list-parent' + ':not(.e-reorder)');
397
+ if (oldUlElement) {
398
+ this.parent.list.querySelector('.e-virtual-ddl-content').removeChild(oldUlElement);
399
+ }
400
+ }
401
+ isListUpdated = false;
402
+ }
403
+ else if (this.parent.viewPortInfo.startIndex != 0) {
404
+ this.parent.updateVirtualReOrderList(true);
405
+ var oldUlElement = this.parent.list.querySelector('.e-list-parent' + ':not(.e-reorder)');
406
+ if (oldUlElement) {
407
+ this.parent.list.querySelector('.e-virtual-ddl-content').removeChild(oldUlElement);
408
+ }
409
+ isListUpdated = false;
410
+ }
411
+ if (this.parent.viewPortInfo.startIndex != 0 && this.parent.viewPortInfo.startIndex - this.parent.value.length != this.parent.itemCount && (this.parent.viewPortInfo.startIndex + this.parent.itemCount > this.parent.value.length)) {
412
+ var query = this.parent.getForQuery(this.parent.value).clone();
413
+ query = query.skip(0).take(this.parent.itemCount - (this.parent.value.length - this.parent.viewPortInfo.startIndex));
414
+ this.parent.appendUncheckList = true;
415
+ this.parent.resetList(this.parent.dataSource, this.parent.fields, query);
416
+ isListUpdated = false;
417
+ this.parent.appendUncheckList = false;
418
+ }
419
+ }
420
+ else {
421
+ var reOrderList = this.parent.list.querySelectorAll('.e-reorder')[0];
422
+ if (this.parent.list.querySelector('.e-virtual-ddl-content') && reOrderList) {
423
+ this.parent.list.querySelector('.e-virtual-ddl-content').removeChild(reOrderList);
424
+ }
425
+ var query = this.parent.getForQuery(this.parent.value).clone();
426
+ if (!this.parent.allowFiltering) { //need to check with allowFiltering false
427
+ var skipvalue = this.parent.viewPortInfo.startIndex - this.parent.value.length >= 0 ? this.parent.viewPortInfo.startIndex - this.parent.value.length : 0;
428
+ query = query.skip(skipvalue);
429
+ }
430
+ this.parent.resetList(this.parent.dataSource, this.parent.fields, query);
431
+ isListUpdated = false;
432
+ }
433
+ this.parent.totalItemsCount();
434
+ }
435
+ if (isListUpdated) {
436
+ for (let i = this.parent.viewPortInfo.startIndex; i < endIndex; i++) {
437
+ var index = i;
438
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
439
+ const alreadyAddedData = this.parent.generatedDataObject[index];
440
+ if (this.component === 'multiselect' && this.parent.hideSelectedItem) {
441
+ if (alreadyAddedData) {
442
+ let value = getValue(this.parent.fields.value, alreadyAddedData[0]);
443
+ if (this.parent.value && value != null && Array.isArray(this.parent.value) && this.parent.value.length > 0 && this.parent.value.indexOf(value) < 0) {
444
+ var query = this.parent.getForQuery(this.parent.value).clone();
445
+ if (this.parent.viewPortInfo.endIndex == this.parent.totalItemCount + this.parent.value.length && this.parent.hideSelectedItem) {
446
+ query = query.skip(this.parent.totalItemCount - this.parent.itemCount);
447
+ }
448
+ else {
449
+ query = query.skip(this.parent.viewPortInfo.startIndex);
450
+ }
451
+ this.parent.resetList(this.parent.dataSource, this.parent.fields, query);
452
+ isResetListCalled = true;
453
+ break;
454
+ }
455
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
456
+ else if ((this.parent.value === null || (this.parent.value && this.parent.value.length === 0))) {
457
+ currentData.push(alreadyAddedData[0]);
458
+ }
459
+ }
460
+ if (index === endIndex - 1) {
461
+ if (currentData.length != this.parent.itemCount) {
462
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
463
+ if (this.parent.hideSelectedItem) {
464
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
465
+ var query = this.parent.getForQuery(this.parent.value).clone();
466
+ if (this.parent.viewPortInfo.endIndex == this.parent.totalItemCount + this.parent.value.length && this.parent.hideSelectedItem) {
467
+ query = query.skip(this.parent.totalItemCount - this.parent.itemCount);
468
+ }
469
+ else {
470
+ query = query.skip(this.parent.viewPortInfo.startIndex);
471
+ }
472
+ this.parent.resetList(this.parent.dataSource, this.parent.fields, query);
473
+ isResetListCalled = true;
474
+ }
475
+ }
476
+ }
477
+ }
478
+ else {
479
+ if (alreadyAddedData) {
480
+ currentData.push(alreadyAddedData[0]);
481
+ }
482
+ }
373
483
  }
374
484
  }
375
- this.parent.renderItems(currentData, this.parent.fields);
485
+ if (!isResetListCalled && isListUpdated) {
486
+ if (this.component === 'multiselect' && this.parent.allowCustomValue && this.parent.viewPortInfo.startIndex == 0 && this.parent.virtualCustomData) {
487
+ currentData.splice(0, 0, this.parent.virtualCustomData);
488
+ }
489
+ let totalData = [];
490
+ if (this.component === 'multiselect' && this.parent.allowCustomValue && this.parent.viewPortInfo.endIndex == this.parent.totalItemCount) {
491
+ if (this.parent.virtualCustomSelectData && this.parent.virtualCustomSelectData.length > 0) {
492
+ totalData = currentData.concat(this.parent.virtualCustomSelectData);
493
+ currentData = totalData;
494
+ }
495
+ }
496
+ let ulElement = this.parent.renderItems(currentData, this.parent.fields, this.component === 'multiselect' && this.parent.mode === 'CheckBox');
497
+ }
498
+ if (this.component === 'multiselect') {
499
+ this.parent.updatevirtualizationList();
500
+ }
501
+ this.parent.getSkeletonCount();
376
502
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
377
503
  const virtualTrackElement = this.parent.list.getElementsByClassName('e-virtual-ddl')[0];
378
504
  if (virtualTrackElement) {
379
505
  (virtualTrackElement).style = this.parent.GetVirtualTrackHeight();
380
506
  }
507
+ else if (!virtualTrackElement && this.parent.skeletonCount > 0 && this.parent.popupWrapper) {
508
+ var virualElement = this.parent.createElement('div', {
509
+ id: this.parent.element.id + '_popup', className: 'e-virtual-ddl', styles: this.parent.GetVirtualTrackHeight()
510
+ });
511
+ this.parent.popupWrapper.querySelector('.e-dropdownbase').appendChild(virualElement);
512
+ }
381
513
  this.parent.UpdateSkeleton();
382
514
  this.parent.liCollections = this.parent.list.querySelectorAll('.e-list-item');
383
515
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -388,13 +520,17 @@ class VirtualScroll {
388
520
  if (this.parent.fields.groupBy) {
389
521
  this.parent.scrollStop();
390
522
  }
523
+ if (this.parent.keyCode == 40 && this.parent.isScrollChanged && this.parent.hideSelectedItem && !isNullOrUndefined(this.parent.currentFocuedListElement)) {
524
+ let currentSelectElem = this.parent.getElementByValue(this.parent.currentFocuedListElement.getAttribute('data-value'));
525
+ this.parent.addListFocus(currentSelectElem);
526
+ this.parent.isScrollChanged = false;
527
+ }
391
528
  }
392
529
  generateQueryAndSetQueryIndexAsync(query, isPopupOpen) {
393
530
  let isStartIndexInitialised = false;
394
531
  let queryStartIndex = 0;
395
532
  let queryEndIndex = 0;
396
- let sortedDataStartIndex = 0;
397
- let vEndIndex = this.parent && this.parent.viewPortInfo.endIndex !== 0 ? this.parent.viewPortInfo.endIndex : sortedDataStartIndex + this.parent.getItems().length;
533
+ let vEndIndex = this.parent.viewPortInfo.endIndex;
398
534
  if (!isPopupOpen && vEndIndex !== 0) {
399
535
  for (let i = this.parent.viewPortInfo.startIndex; i <= vEndIndex; i++) {
400
536
  if (!(i in this.parent.generatedDataObject)) {
@@ -412,6 +548,13 @@ class VirtualScroll {
412
548
  this.parent.virtualItemStartIndex = queryStartIndex;
413
549
  this.parent.virtualItemEndIndex = queryEndIndex;
414
550
  this.generateAndExecuteQueryAsync(query, queryStartIndex, queryEndIndex);
551
+ if (this.component === 'multiselect' && this.parent.hideSelectedItem && this.parent.value && Array.isArray(this.parent.value) && this.parent.value.length > 0) {
552
+ this.parent.totalItemsCount();
553
+ }
554
+ if (this.component === 'multiselect' && this.parent.virtualItemStartIndex === this.parent.virtualItemEndIndex) {
555
+ this.parent.virtualItemStartIndex = this.parent.viewPortInfo.startIndex;
556
+ this.parent.virtualItemEndIndex = this.parent.viewPortInfo.endIndex;
557
+ }
415
558
  }
416
559
  this.setCurrentViewDataAsync();
417
560
  }
@@ -448,7 +591,8 @@ class VirtualScroll {
448
591
  });
449
592
  }
450
593
  scrollListener(scrollArgs) {
451
- if (!this.parent.isPreventScrollAction) {
594
+ if (!this.parent.isPreventScrollAction && !this.parent.isVirtualTrackHeight) {
595
+ this.parent.preventSetCurrentData = false;
452
596
  let info = scrollArgs.sentinel;
453
597
  let pStartIndex = this.parent.previousStartIndex;
454
598
  this.parent.viewPortInfo = this.getInfoFromView(scrollArgs.direction, info, scrollArgs.offset, false);
@@ -484,19 +628,6 @@ class VirtualScroll {
484
628
  this.parent.previousInfo = this.parent.viewPortInfo;
485
629
  }
486
630
  }
487
- getPageCount(popupElement, returnExactCount = false) {
488
- var list = popupElement && popupElement.querySelector('.e-content');
489
- if (list) {
490
- var liHeight = list.classList.contains('e-nodata') ? null : getComputedStyle(list.querySelectorAll('.e-list-item')[0], null).getPropertyValue('height');
491
- var pageCount = list.getBoundingClientRect().height / parseInt(liHeight, 10);
492
- return returnExactCount ? pageCount : Math.round(pageCount);
493
- }
494
- return 0;
495
- }
496
- ;
497
- getRowHeight() {
498
- return (isNullOrUndefined(this.parent.liCollections) || this.parent.liCollections.length == 0) ? 0 : Math.ceil(this.parent.liCollections[0].getBoundingClientRect().height);
499
- }
500
631
  getInfoFromView(direction, info, e, isscrollAction) {
501
632
  let infoType = {
502
633
  direction: direction, sentinelInfo: info, offsets: e,
@@ -532,7 +663,7 @@ class VirtualScroll {
532
663
  let idxAddedToExactTop = (pageSizeBy4) > infoViewIndices ? pageSizeBy4 :
533
664
  (infoViewIndices + infoViewIndices / 4);
534
665
  let eIndex = Math.round(exactTopIndex + idxAddedToExactTop);
535
- infoType.endIndex = eIndex < totalItemCount ? eIndex : totalItemCount;
666
+ infoType.endIndex = (eIndex < totalItemCount || this.component == "multiselect") ? eIndex : totalItemCount;
536
667
  let sIndex = infoType.endIndex - this.parent.virtualItemCount;
537
668
  infoType.startIndex = sIndex > 0 ? sIndex : 0;
538
669
  infoType.endIndex = sIndex < 0 ? this.parent.virtualItemCount : infoType.endIndex;
@@ -566,7 +697,7 @@ class VirtualScroll {
566
697
  top: top,
567
698
  left: left
568
699
  };
569
- if (this.parent.list.querySelectorAll('.e-virtual-list').length > 0) {
700
+ if (this.parent.list && this.parent.list.querySelectorAll('.e-virtual-list').length > 0) {
570
701
  var infoview = this.getInfoFromView(direction, current, scrollOffsetargs, true);
571
702
  if (this.parent.scrollPreStartIndex != pstartIndex && !this.parent.isPreventScrollAction) {
572
703
  this.parent.isScrollActionTriggered = true;
@@ -626,7 +757,8 @@ const dropDownBaseClasses = {
626
757
  li: 'e-list-item',
627
758
  group: 'e-list-group-item',
628
759
  disabled: 'e-disabled',
629
- grouping: 'e-dd-group'
760
+ grouping: 'e-dd-group',
761
+ virtualList: 'e-list-item e-virtual-list',
630
762
  };
631
763
  const ITEMTEMPLATE_PROPERTY = 'ItemTemplate';
632
764
  const DISPLAYTEMPLATE_PROPERTY = 'DisplayTemplate';
@@ -659,13 +791,63 @@ let DropDownBase = class DropDownBase extends Component {
659
791
  this.isAddNewItemTemplate = false;
660
792
  this.isRequesting = false;
661
793
  this.isVirtualizationEnabled = false;
794
+ this.isCustomDataUpdated = false;
662
795
  this.isAllowFiltering = false;
663
796
  this.virtualizedItemsCount = 0;
797
+ this.isCheckBoxSelection = false;
664
798
  this.totalItemCount = 0;
665
799
  this.dataCount = 0;
666
800
  this.isRemoteDataUpdated = false;
667
801
  this.isIncrementalRequest = false;
668
802
  this.itemCount = 10;
803
+ this.virtualListHeight = 0;
804
+ this.isVirtualScrolling = false;
805
+ this.isPreventScrollAction = false;
806
+ this.scrollPreStartIndex = 0;
807
+ this.isScrollActionTriggered = false;
808
+ this.previousStartIndex = 0;
809
+ this.isMouseScrollAction = false;
810
+ this.isKeyBoardAction = false;
811
+ this.isScrollChanged = false;
812
+ this.isUpwardScrolling = false;
813
+ this.startIndex = 0;
814
+ this.currentPageNumber = 0;
815
+ this.pageCount = 0;
816
+ this.isPreventKeyAction = false;
817
+ this.generatedDataObject = {};
818
+ this.skeletonCount = 32;
819
+ this.isVirtualTrackHeight = false;
820
+ this.virtualSelectAll = false;
821
+ this.incrementalQueryString = '';
822
+ this.incrementalEndIndex = 0;
823
+ this.incrementalStartIndex = 0;
824
+ this.incrementalPreQueryString = '';
825
+ this.isObjectCustomValue = false;
826
+ this.appendUncheckList = false;
827
+ this.virtualListInfo = {
828
+ currentPageNumber: null,
829
+ direction: null,
830
+ sentinelInfo: {},
831
+ offsets: {},
832
+ startIndex: 0,
833
+ endIndex: 0,
834
+ };
835
+ this.viewPortInfo = {
836
+ currentPageNumber: null,
837
+ direction: null,
838
+ sentinelInfo: {},
839
+ offsets: {},
840
+ startIndex: 0,
841
+ endIndex: 0,
842
+ };
843
+ this.selectedValueInfo = {
844
+ currentPageNumber: null,
845
+ direction: null,
846
+ sentinelInfo: {},
847
+ offsets: {},
848
+ startIndex: 0,
849
+ endIndex: 0,
850
+ };
669
851
  }
670
852
  getPropObject(prop, newProp, oldProp) {
671
853
  const newProperty = new Object();
@@ -876,6 +1058,124 @@ let DropDownBase = class DropDownBase extends Component {
876
1058
  }
877
1059
  }
878
1060
  }
1061
+ checkAndResetCache() {
1062
+ if (this.isVirtualizationEnabled) {
1063
+ this.generatedDataObject = {};
1064
+ this.virtualItemStartIndex = this.virtualItemEndIndex = 0;
1065
+ this.viewPortInfo = {
1066
+ currentPageNumber: null,
1067
+ direction: null,
1068
+ sentinelInfo: {},
1069
+ offsets: {},
1070
+ startIndex: 0,
1071
+ endIndex: this.itemCount,
1072
+ };
1073
+ this.selectedValueInfo = null;
1074
+ }
1075
+ }
1076
+ updateIncrementalInfo(startIndex, endIndex) {
1077
+ this.viewPortInfo.startIndex = startIndex;
1078
+ this.viewPortInfo.endIndex = endIndex;
1079
+ this.updateVirtualItemIndex();
1080
+ this.isIncrementalRequest = true;
1081
+ this.resetList(this.dataSource, this.fields, this.query);
1082
+ this.isIncrementalRequest = false;
1083
+ }
1084
+ updateIncrementalView(startIndex, endIndex) {
1085
+ this.viewPortInfo.startIndex = startIndex;
1086
+ this.viewPortInfo.endIndex = endIndex;
1087
+ this.updateVirtualItemIndex();
1088
+ this.resetList(this.dataSource, this.fields, this.query);
1089
+ this.UpdateSkeleton();
1090
+ this.liCollections = this.list.querySelectorAll('.' + dropDownBaseClasses.li);
1091
+ this.ulElement = this.list.querySelector('ul');
1092
+ }
1093
+ updateVirtualItemIndex() {
1094
+ this.virtualItemStartIndex = this.viewPortInfo.startIndex;
1095
+ this.virtualItemEndIndex = this.viewPortInfo.endIndex;
1096
+ this.virtualListInfo = this.viewPortInfo;
1097
+ }
1098
+ getFilteringSkeletonCount() {
1099
+ const difference = this.dataCount - this.viewPortInfo.endIndex;
1100
+ const currentSkeletonCount = this.skeletonCount;
1101
+ this.getSkeletonCount(true);
1102
+ this.skeletonCount = this.dataCount > this.itemCount * 2 ? this.skeletonCount : difference > this.skeletonCount ? this.skeletonCount : difference > 0 ? difference : 0;
1103
+ let skeletonUpdated = true;
1104
+ if ((this.getModuleName() === 'autocomplete' || this.getModuleName() === 'multiselect') && (this.totalItemCount < (this.itemCount * 2))) {
1105
+ this.skeletonCount = 0;
1106
+ skeletonUpdated = false;
1107
+ }
1108
+ if (!this.list.classList.contains(dropDownBaseClasses.noData)) {
1109
+ const isSkeletonCountChange = currentSkeletonCount !== this.skeletonCount;
1110
+ if (currentSkeletonCount !== this.skeletonCount && skeletonUpdated) {
1111
+ this.UpdateSkeleton(true, Math.abs(currentSkeletonCount - this.skeletonCount));
1112
+ }
1113
+ else {
1114
+ this.UpdateSkeleton();
1115
+ }
1116
+ this.liCollections = this.list.querySelectorAll('.e-list-item');
1117
+ if ((this.list.getElementsByClassName('e-virtual-ddl').length > 0)) {
1118
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1119
+ this.list.getElementsByClassName('e-virtual-ddl')[0].style = this.GetVirtualTrackHeight();
1120
+ }
1121
+ else if (!this.list.querySelector('.e-virtual-ddl') && this.skeletonCount > 0 && this.list.querySelector('.e-dropdownbase')) {
1122
+ var virualElement = this.createElement('div', {
1123
+ id: this.element.id + '_popup', className: 'e-virtual-ddl', styles: this.GetVirtualTrackHeight()
1124
+ });
1125
+ this.list.querySelector('.e-dropdownbase').appendChild(virualElement);
1126
+ }
1127
+ if (this.list.getElementsByClassName('e-virtual-ddl-content').length > 0) {
1128
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1129
+ this.list.getElementsByClassName('e-virtual-ddl-content')[0].style = this.getTransformValues();
1130
+ }
1131
+ }
1132
+ }
1133
+ getSkeletonCount(retainSkeleton) {
1134
+ this.virtualListHeight = this.listContainerHeight != null ? parseInt(this.listContainerHeight, 10) : this.virtualListHeight;
1135
+ const actualCount = this.virtualListHeight > 0 ? Math.floor(this.virtualListHeight / this.listItemHeight) : 0;
1136
+ this.skeletonCount = actualCount * 2 < this.itemCount ? this.itemCount : actualCount * 2;
1137
+ this.itemCount = retainSkeleton ? this.itemCount : this.skeletonCount;
1138
+ this.skeletonCount = Math.floor(this.skeletonCount / 2) + 2;
1139
+ }
1140
+ GetVirtualTrackHeight() {
1141
+ let height = this.totalItemCount === this.viewPortInfo.endIndex ? this.totalItemCount * this.listItemHeight - this.itemCount * this.listItemHeight : this.totalItemCount * this.listItemHeight;
1142
+ height = this.isVirtualTrackHeight ? 0 : height;
1143
+ const heightDimension = `height: ${height - this.itemCount * this.listItemHeight}px;`;
1144
+ if ((this.getModuleName() === 'autocomplete' || this.getModuleName() === 'multiselect') && this.skeletonCount === 0) {
1145
+ return "height: 0px;";
1146
+ }
1147
+ return heightDimension;
1148
+ }
1149
+ getTransformValues() {
1150
+ let translateY = this.viewPortInfo.startIndex * this.listItemHeight;
1151
+ translateY = translateY - (this.skeletonCount * this.listItemHeight);
1152
+ translateY = this.viewPortInfo.startIndex === 0 && this.listData && this.listData.length === 0 ? 0 : translateY;
1153
+ const styleText = `transform: translate(0px, ${translateY}px);`;
1154
+ return styleText;
1155
+ }
1156
+ UpdateSkeleton(isSkeletonCountChange, skeletonCount) {
1157
+ let isContainSkeleton = this.list.querySelector('.e-virtual-ddl-content');
1158
+ let isContainVirtualList = this.list.querySelector('.e-virtual-list');
1159
+ if (isContainSkeleton && (!isContainVirtualList || isSkeletonCountChange) && this.isVirtualizationEnabled) {
1160
+ const totalSkeletonCount = isSkeletonCountChange ? skeletonCount : this.skeletonCount;
1161
+ for (let i = 0; i < totalSkeletonCount; i++) {
1162
+ const liElement = this.createElement('li', { className: dropDownBaseClasses.virtualList, styles: 'overflow: inherit' });
1163
+ if (this.isVirtualizationEnabled && this.itemTemplate) {
1164
+ liElement.style.height = this.listItemHeight + 'px';
1165
+ }
1166
+ let skeleton = new Skeleton({
1167
+ shape: "Text",
1168
+ height: "10px",
1169
+ width: "95%",
1170
+ cssClass: "e-skeleton-text",
1171
+ });
1172
+ skeleton.appendTo(this.createElement('div'));
1173
+ liElement.appendChild(skeleton.element);
1174
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1175
+ isContainSkeleton.firstChild && isContainSkeleton.firstChild.insertBefore(liElement, isContainSkeleton.firstChild.children[0]);
1176
+ }
1177
+ }
1178
+ }
879
1179
  getLocaleName() {
880
1180
  return 'drop-down-base';
881
1181
  }
@@ -1122,31 +1422,52 @@ let DropDownBase = class DropDownBase extends Component {
1122
1422
  }
1123
1423
  else {
1124
1424
  this.isRequesting = false;
1425
+ let isReOrder = true;
1125
1426
  let listItems;
1126
1427
  if (this.isVirtualizationEnabled && !this.virtualGroupDataSource && this.fields.groupBy) {
1127
1428
  let data = new DataManager(this.dataSource).executeLocal(new Query().group(this.fields.groupBy));
1128
1429
  this.virtualGroupDataSource = data.records;
1129
1430
  }
1130
- let dataManager = this.isVirtualizationEnabled && this.virtualGroupDataSource ? new DataManager(this.virtualGroupDataSource) : new DataManager(eventArgs.data);
1431
+ let dataManager = this.isVirtualizationEnabled && this.virtualGroupDataSource && !this.isCustomDataUpdated ? new DataManager(this.virtualGroupDataSource) : new DataManager(eventArgs.data);
1131
1432
  listItems = (this.getQuery(eventArgs.query)).executeLocal(dataManager);
1132
- if (this.isVirtualizationEnabled && this.getModuleName() === 'autocomplete' && (listItems.count != 0 && listItems.count < (this.itemCount * 2))) {
1433
+ if (!this.virtualSelectAll) {
1133
1434
  let newQuery = this.getQuery(eventArgs.query);
1134
- if (newQuery) {
1135
- for (let queryElements = 0; queryElements < newQuery.queries.length; queryElements++) {
1136
- if (newQuery.queries[queryElements].fn === 'onTake') {
1137
- newQuery.queries[queryElements].e.nos = listItems.count;
1435
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1436
+ if (this.isVirtualizationEnabled && (listItems.count != 0 && listItems.count < (this.itemCount * 2))) {
1437
+ if (newQuery) {
1438
+ for (let queryElements = 0; queryElements < newQuery.queries.length; queryElements++) {
1439
+ if (newQuery.queries[queryElements].fn === 'onTake') {
1440
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1441
+ newQuery.queries[queryElements].e.nos = listItems.count;
1442
+ listItems = (newQuery).executeLocal(dataManager);
1443
+ }
1444
+ if (this.getModuleName() === 'multiselect' && (newQuery.queries[queryElements].e.condition == 'or' || newQuery.queries[queryElements].e.operator == 'equal')) {
1445
+ isReOrder = false;
1446
+ }
1447
+ }
1448
+ if (isReOrder) {
1138
1449
  listItems = (newQuery).executeLocal(dataManager);
1139
- break;
1450
+ this.isVirtualTrackHeight = true;
1451
+ }
1452
+ }
1453
+ }
1454
+ else {
1455
+ this.isVirtualTrackHeight = false;
1456
+ if (newQuery) {
1457
+ for (let queryElements = 0; queryElements < newQuery.queries.length; queryElements++) {
1458
+ if (this.getModuleName() === 'multiselect' && ((newQuery.queries[queryElements].e && newQuery.queries[queryElements].e.condition == 'or') || (newQuery.queries[queryElements].e && newQuery.queries[queryElements].e.operator == 'equal'))) {
1459
+ isReOrder = false;
1460
+ }
1140
1461
  }
1141
1462
  }
1142
1463
  }
1143
1464
  }
1144
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1145
- this.dataCount = listItems.count;
1146
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1147
- this.totalItemCount = listItems.count;
1148
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1149
- listItems = this.isVirtualizationEnabled ? listItems.result : listItems;
1465
+ if (isReOrder) {
1466
+ // eslint-disable @typescript-eslint/no-explicit-any
1467
+ this.dataCount = this.totalItemCount = this.virtualSelectAll ? listItems.length : listItems.count;
1468
+ }
1469
+ listItems = this.isVirtualizationEnabled && !this.virtualSelectAll ? listItems.result : listItems;
1470
+ // eslint-enable @typescript-eslint/no-explicit-any
1150
1471
  const localDataArgs = { cancel: false, result: listItems };
1151
1472
  this.isPreventChange = this.isAngular && this.preventChange ? true : this.isPreventChange;
1152
1473
  this.trigger('actionComplete', localDataArgs, (localDataArgs) => {
@@ -1193,6 +1514,13 @@ let DropDownBase = class DropDownBase extends Component {
1193
1514
  this.raiseDataBound(listItems, e);
1194
1515
  }
1195
1516
  }
1517
+ isObjectInArray(objectToFind, array) {
1518
+ return array.some(item => {
1519
+ return Object.keys(objectToFind).every(key => {
1520
+ return item.hasOwnProperty(key) && item[key] === objectToFind[key];
1521
+ });
1522
+ });
1523
+ }
1196
1524
  updateListValues() {
1197
1525
  // Used this method in component side.
1198
1526
  }
@@ -1233,6 +1561,7 @@ let DropDownBase = class DropDownBase extends Component {
1233
1561
  const listItems = [];
1234
1562
  this.onActionComplete(this.renderItems(listItems, fields), listItems);
1235
1563
  this.isRequested = false;
1564
+ this.isRequesting = false;
1236
1565
  this.hideSpinner();
1237
1566
  }
1238
1567
  showSpinner() {
@@ -1253,7 +1582,7 @@ let DropDownBase = class DropDownBase extends Component {
1253
1582
  onActionComplete(ulElement, list, e) {
1254
1583
  /* eslint-enable @typescript-eslint/no-unused-vars */
1255
1584
  this.listData = list;
1256
- if (this.isVirtualizationEnabled) {
1585
+ if (this.isVirtualizationEnabled && !this.isCustomDataUpdated) {
1257
1586
  this.notify("setGeneratedData", {
1258
1587
  module: "VirtualScroll",
1259
1588
  });
@@ -1312,10 +1641,11 @@ let DropDownBase = class DropDownBase extends Component {
1312
1641
  getQuery(query) {
1313
1642
  return query ? query : this.query ? this.query : new Query();
1314
1643
  }
1315
- updateVirtualizationProperties(itemCount, filtering) {
1644
+ updateVirtualizationProperties(itemCount, filtering, isCheckbox) {
1316
1645
  this.isVirtualizationEnabled = true;
1317
1646
  this.virtualizedItemsCount = itemCount;
1318
1647
  this.isAllowFiltering = filtering;
1648
+ this.isCheckBoxSelection = isCheckbox;
1319
1649
  }
1320
1650
  /**
1321
1651
  * To render the template content for group header element.
@@ -1427,7 +1757,7 @@ let DropDownBase = class DropDownBase extends Component {
1427
1757
  if (isCount) {
1428
1758
  count++;
1429
1759
  }
1430
- if (this.updateGroupHeader(index, liCollections, target)) {
1760
+ if (this.fixedHeaderElement && this.updateGroupHeader(index, liCollections, target)) {
1431
1761
  loadedGroupList++;
1432
1762
  if (count >= this.getPageCount()) {
1433
1763
  break;
@@ -1483,7 +1813,7 @@ let DropDownBase = class DropDownBase extends Component {
1483
1813
  * @param {FieldSettingsModel} fields - Maps the columns of the data table and binds the data to the component.
1484
1814
  * @returns {HTMLElement} Return the list items.
1485
1815
  */
1486
- renderItems(listData, fields) {
1816
+ renderItems(listData, fields, isCheckBoxUpdate) {
1487
1817
  let ulElement;
1488
1818
  if (this.itemTemplate && listData) {
1489
1819
  let dataSource = listData;
@@ -1506,6 +1836,10 @@ let DropDownBase = class DropDownBase extends Component {
1506
1836
  var virtualUlElement = this.list.querySelector('.e-virtual-ddl-content');
1507
1837
  if ((listData.length >= this.virtualizedItemsCount && oldUlElement && virtualUlElement) || (oldUlElement && virtualUlElement && this.isAllowFiltering) || (oldUlElement && virtualUlElement && this.getModuleName() === 'autocomplete')) {
1508
1838
  virtualUlElement.replaceChild(ulElement, oldUlElement);
1839
+ let reOrderList = this.list.querySelectorAll('.e-reorder');
1840
+ if (this.list.querySelector('.e-virtual-ddl-content') && reOrderList && reOrderList.length > 0 && !isCheckBoxUpdate) {
1841
+ this.list.querySelector('.e-virtual-ddl-content').removeChild(reOrderList[0]);
1842
+ }
1509
1843
  this.updateListElements(listData);
1510
1844
  }
1511
1845
  else if ((!virtualUlElement)) {
@@ -1517,6 +1851,10 @@ let DropDownBase = class DropDownBase extends Component {
1517
1851
  }
1518
1852
  }
1519
1853
  else {
1854
+ if (this.getModuleName() === 'multiselect' && this.virtualSelectAll) {
1855
+ this.virtualSelectAllData = listData;
1856
+ listData = listData.slice(this.virtualItemStartIndex, this.virtualItemEndIndex);
1857
+ }
1520
1858
  ulElement = this.createListItems(listData, fields);
1521
1859
  if (this.isIncrementalRequest) {
1522
1860
  this.incrementalLiCollections = ulElement.querySelectorAll('.' + dropDownBaseClasses.li);
@@ -1525,10 +1863,19 @@ let DropDownBase = class DropDownBase extends Component {
1525
1863
  return ulElement;
1526
1864
  }
1527
1865
  if (this.isVirtualizationEnabled) {
1528
- var oldUlElement = this.list.querySelector('.e-list-parent');
1866
+ var oldUlElement = this.list.querySelector('.e-list-parent' + ':not(.e-reorder)');
1529
1867
  var virtualUlElement = this.list.querySelector('.e-virtual-ddl-content');
1530
- if ((listData.length >= this.virtualizedItemsCount && oldUlElement && virtualUlElement) || (oldUlElement && virtualUlElement && this.isAllowFiltering) || (oldUlElement && virtualUlElement && this.getModuleName() === 'autocomplete')) {
1531
- virtualUlElement.replaceChild(ulElement, oldUlElement);
1868
+ var isRemovedUlelement = false;
1869
+ if (!oldUlElement && this.list.querySelector('.e-list-parent' + '.e-reorder')) {
1870
+ oldUlElement = this.list.querySelector('.e-list-parent' + '.e-reorder');
1871
+ }
1872
+ if ((listData.length >= this.virtualizedItemsCount && oldUlElement && virtualUlElement) || (oldUlElement && virtualUlElement && this.isAllowFiltering) || (oldUlElement && virtualUlElement && (this.getModuleName() === 'autocomplete' || this.getModuleName() === 'multiselect')) || isRemovedUlelement) {
1873
+ if (!this.appendUncheckList) {
1874
+ virtualUlElement.replaceChild(ulElement, oldUlElement);
1875
+ }
1876
+ else {
1877
+ virtualUlElement.appendChild(ulElement);
1878
+ }
1532
1879
  this.updateListElements(listData);
1533
1880
  }
1534
1881
  else if ((!virtualUlElement)) {
@@ -1721,11 +2068,11 @@ let DropDownBase = class DropDownBase extends Component {
1721
2068
  this.render();
1722
2069
  }
1723
2070
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
1724
- updateDataSource(props) {
2071
+ updateDataSource(props, oldProps) {
1725
2072
  this.resetList(this.dataSource);
1726
2073
  this.totalItemCount = this.dataSource instanceof DataManager ? this.dataSource.dataSource.json.length : 0;
1727
2074
  }
1728
- setUpdateInitial(props, newProp) {
2075
+ setUpdateInitial(props, newProp, oldProp) {
1729
2076
  this.isDataFetched = false;
1730
2077
  const updateData = {};
1731
2078
  for (let j = 0; props.length > j; j++) {
@@ -1741,7 +2088,7 @@ let DropDownBase = class DropDownBase extends Component {
1741
2088
  if (Object.keys(updateData).indexOf('dataSource') === -1) {
1742
2089
  updateData.dataSource = this.dataSource;
1743
2090
  }
1744
- this.updateDataSource(updateData);
2091
+ this.updateDataSource(updateData, oldProp);
1745
2092
  }
1746
2093
  }
1747
2094
  /**
@@ -2191,55 +2538,12 @@ let DropDownList = class DropDownList extends DropDownBase {
2191
2538
  */
2192
2539
  constructor(options, element) {
2193
2540
  super(options, element);
2194
- this.skeletonCount = 32;
2195
2541
  this.isListSearched = false;
2196
2542
  this.preventChange = false;
2197
2543
  this.isAngular = false;
2198
- this.virtualListHeight = 0;
2199
- this.isVirtualScrolling = false;
2200
- this.isPreventScrollAction = false;
2201
- this.scrollPreStartIndex = 0;
2202
- this.isScrollActionTriggered = false;
2203
- this.previousStartIndex = 0;
2204
- this.isMouseScrollAction = false;
2205
- this.isKeyBoardAction = false;
2206
- this.isUpwardScrolling = false;
2207
- this.startIndex = 0;
2208
- this.currentPageNumber = 0;
2209
- this.pageCount = 0;
2210
- this.isPreventKeyAction = false;
2211
- this.generatedDataObject = {};
2212
- this.incrementalQueryString = '';
2213
- this.incrementalEndIndex = 0;
2214
- this.incrementalStartIndex = 0;
2215
- this.incrementalPreQueryString = '';
2216
2544
  this.isTouched = false;
2217
- this.virtualListInfo = {
2218
- currentPageNumber: null,
2219
- direction: null,
2220
- sentinelInfo: {},
2221
- offsets: {},
2222
- startIndex: 0,
2223
- endIndex: 0,
2224
- };
2225
- this.viewPortInfo = {
2226
- currentPageNumber: null,
2227
- direction: null,
2228
- sentinelInfo: {},
2229
- offsets: {},
2230
- startIndex: 0,
2231
- endIndex: 0,
2232
- };
2233
- this.selectedValueInfo = {
2234
- currentPageNumber: null,
2235
- direction: null,
2236
- sentinelInfo: {},
2237
- offsets: {},
2238
- startIndex: 0,
2239
- endIndex: 0,
2240
- };
2241
- this.IsScrollerAtEnd = function () {
2242
- return this.list && this.list.scrollTop + this.list.clientHeight >= this.list.scrollHeight;
2545
+ this.IsScrollerAtEnd = function () {
2546
+ return this.list && this.list.scrollTop + this.list.clientHeight >= this.list.scrollHeight;
2243
2547
  };
2244
2548
  }
2245
2549
  /**
@@ -2325,6 +2629,11 @@ let DropDownList = class DropDownList extends DropDownBase {
2325
2629
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
2326
2630
  this.totalItemCount = this.dataSource && this.dataSource.length ? this.dataSource.length : 0;
2327
2631
  }
2632
+ if (this.enableVirtualization && this.isFiltering() && this.getModuleName() === 'combobox') {
2633
+ this.UpdateSkeleton();
2634
+ this.liCollections = this.list.querySelectorAll('.' + dropDownBaseClasses.li);
2635
+ this.ulElement = this.list.querySelector('ul');
2636
+ }
2328
2637
  this.unWireListEvents();
2329
2638
  this.wireListEvents();
2330
2639
  }
@@ -2372,8 +2681,8 @@ let DropDownList = class DropDownList extends DropDownBase {
2372
2681
  this.isActive = true;
2373
2682
  this.resetSelection(properties);
2374
2683
  }
2375
- const dataItem = this.getItemData();
2376
- if (this.previousValue === dataItem.value) {
2684
+ let dataItem = this.getItemData();
2685
+ if ((!this.allowObjectBinding && (this.previousValue === dataItem.value)) || (this.allowObjectBinding && this.previousValue && this.isObjectInArray(this.previousValue, [this.allowCustom ? this.value ? this.value : dataItem : dataItem.value ? this.getDataByValue(dataItem.value) : dataItem]))) {
2377
2686
  return;
2378
2687
  }
2379
2688
  this.onChangeEvent(e);
@@ -2561,7 +2870,8 @@ let DropDownList = class DropDownList extends DropDownBase {
2561
2870
  updateValues() {
2562
2871
  this.selectedValueInfo = this.viewPortInfo;
2563
2872
  if (!isNullOrUndefined(this.value)) {
2564
- this.setSelection(this.getElementByValue(this.value), null);
2873
+ const value = this.allowObjectBinding && !isNullOrUndefined(this.value) ? getValue(((this.fields.value) ? this.fields.value : ''), this.value) : this.value;
2874
+ this.setSelection(this.getElementByValue(value), null);
2565
2875
  }
2566
2876
  else if (this.text && isNullOrUndefined(this.value)) {
2567
2877
  const element = this.getElementByText(this.text);
@@ -2786,23 +3096,6 @@ let DropDownList = class DropDownList extends DropDownBase {
2786
3096
  isValidLI(li) {
2787
3097
  return (li && li.hasAttribute('role') && li.getAttribute('role') === 'option');
2788
3098
  }
2789
- updateIncrementalInfo(startIndex, endIndex) {
2790
- this.viewPortInfo.startIndex = startIndex;
2791
- this.viewPortInfo.endIndex = endIndex;
2792
- this.updateVirtualItemIndex();
2793
- this.isIncrementalRequest = true;
2794
- this.resetList(this.dataSource, this.fields, this.query);
2795
- this.isIncrementalRequest = false;
2796
- }
2797
- updateIncrementalView(startIndex, endIndex) {
2798
- this.viewPortInfo.startIndex = startIndex;
2799
- this.viewPortInfo.endIndex = endIndex;
2800
- this.updateVirtualItemIndex();
2801
- this.resetList(this.dataSource, this.fields, this.query);
2802
- this.UpdateSkeleton();
2803
- this.liCollections = this.list.querySelectorAll('.' + dropDownBaseClasses.li);
2804
- this.ulElement = this.list.querySelector('ul');
2805
- }
2806
3099
  updateIncrementalItemIndex(startIndex, endIndex) {
2807
3100
  this.incrementalStartIndex = startIndex;
2808
3101
  this.incrementalEndIndex = endIndex;
@@ -2970,10 +3263,12 @@ let DropDownList = class DropDownList extends DropDownBase {
2970
3263
  const isTabAction = e.action === 'tab' || e.action === 'close';
2971
3264
  if (isNullOrUndefined(this.list) && !this.isRequested && !isTabAction && e.action !== 'escape') {
2972
3265
  this.searchKeyEvent = e;
2973
- this.renderList(e);
2974
- this.UpdateSkeleton();
2975
- this.liCollections = this.list.querySelectorAll('.' + dropDownBaseClasses.li);
2976
- this.ulElement = this.list.querySelector('ul');
3266
+ if (!this.enableVirtualization || (this.enableVirtualization && this.getModuleName() !== 'autocomplete' && e.type !== 'mousedown' && (e.keyCode === 40 || e.keyCode === 38))) {
3267
+ this.renderList(e);
3268
+ this.UpdateSkeleton();
3269
+ this.liCollections = this.list.querySelectorAll('.' + dropDownBaseClasses.li);
3270
+ this.ulElement = this.list.querySelector('ul');
3271
+ }
2977
3272
  }
2978
3273
  if (isNullOrUndefined(this.list) || (!isNullOrUndefined(this.liCollections) &&
2979
3274
  isNavigation && this.liCollections.length === 0) || this.isRequested) {
@@ -3132,7 +3427,7 @@ let DropDownList = class DropDownList extends DropDownBase {
3132
3427
  this.activeIndex = filterIndex;
3133
3428
  }
3134
3429
  }
3135
- if (this.allowFiltering && this.getModuleName() === 'dropdownlist') {
3430
+ if (this.allowFiltering && this.getModuleName() === 'dropdownlist' && this.filterInput) {
3136
3431
  if (!isNullOrUndefined(this.ulElement) && !isNullOrUndefined(this.ulElement.getElementsByClassName('e-item-focus')[0])) {
3137
3432
  attributes(this.filterInput, { 'aria-activedescendant': this.ulElement.getElementsByClassName('e-item-focus')[0].id });
3138
3433
  }
@@ -3142,11 +3437,6 @@ let DropDownList = class DropDownList extends DropDownBase {
3142
3437
  }
3143
3438
  e.preventDefault();
3144
3439
  }
3145
- updateVirtualItemIndex() {
3146
- this.virtualItemStartIndex = this.viewPortInfo.startIndex;
3147
- this.virtualItemEndIndex = this.viewPortInfo.endIndex;
3148
- this.virtualListInfo = this.viewPortInfo;
3149
- }
3150
3440
  updateHomeEndAction(e, isVirtualKeyAction) {
3151
3441
  if (this.getModuleName() === 'dropdownlist') {
3152
3442
  let findLi = 0;
@@ -3295,6 +3585,10 @@ let DropDownList = class DropDownList extends DropDownBase {
3295
3585
  pageDownSelection(steps, event, isVirtualKeyAction) {
3296
3586
  const list = this.getItems();
3297
3587
  let previousItem = steps <= list.length ? this.liCollections[steps - 1] : this.liCollections[list.length - 1];
3588
+ if (this.enableVirtualization && this.skeletonCount > 0) {
3589
+ steps = this.getModuleName() === 'dropdownlist' && this.allowFiltering ? steps + 1 : steps;
3590
+ previousItem = steps < list.length ? this.liCollections[steps] : this.liCollections[list.length - 1];
3591
+ }
3298
3592
  if ((this.enableVirtualization && this.activeIndex == null) || isVirtualKeyAction) {
3299
3593
  previousItem = steps <= list.length ? this.liCollections[steps + this.skeletonCount - 1] : this.liCollections[list.length - 1];
3300
3594
  }
@@ -3458,7 +3752,7 @@ let DropDownList = class DropDownList extends DropDownBase {
3458
3752
  selectEventCallback(li, e, preventSelect, selectedData, value) {
3459
3753
  this.previousItemData = (!isNullOrUndefined(this.itemData)) ? this.itemData : null;
3460
3754
  if (this.itemData != selectedData) {
3461
- this.previousValue = (!isNullOrUndefined(this.itemData)) ? typeof this.itemData == "object" ? this.checkFieldValue(this.itemData, this.fields.value.split('.')) : this.itemData : null;
3755
+ this.previousValue = (!isNullOrUndefined(this.itemData)) ? typeof this.itemData == "object" && !this.allowObjectBinding ? this.checkFieldValue(this.itemData, this.fields.value.split('.')) : this.itemData : null;
3462
3756
  }
3463
3757
  this.item = li;
3464
3758
  this.itemData = selectedData;
@@ -3516,7 +3810,7 @@ let DropDownList = class DropDownList extends DropDownBase {
3516
3810
  if (this.isFiltering() && clearElement) {
3517
3811
  clearElement.style.removeProperty('visibility');
3518
3812
  }
3519
- if (this.previousValue === dataItem.value) {
3813
+ if ((!this.allowObjectBinding && (this.previousValue === dataItem.value)) || (this.allowObjectBinding && (this.previousValue != null && this.isObjectInArray(this.previousValue, [this.allowCustom && this.isObjectCustomValue ? this.value ? this.value : dataItem : dataItem.value ? this.getDataByValue(dataItem.value) : dataItem])))) {
3520
3814
  this.isSelected = false;
3521
3815
  return true;
3522
3816
  }
@@ -3536,25 +3830,28 @@ let DropDownList = class DropDownList extends DropDownBase {
3536
3830
  }
3537
3831
  else {
3538
3832
  this.setSelectOptions(li, e);
3539
- if (this.enableVirtualization) {
3833
+ if (this.enableVirtualization && this.value) {
3540
3834
  const fields = (this.fields.value) ? this.fields.value : '';
3835
+ let currentValue = this.allowObjectBinding && !isNullOrUndefined(this.value) ? getValue((this.fields.value) ? this.fields.value : '', this.value) : this.value;
3541
3836
  if (this.dataSource instanceof DataManager && this.virtualGroupDataSource) {
3542
- const getItem = new DataManager(this.virtualGroupDataSource).executeLocal(new Query().where(new Predicate(fields, 'equal', this.value)));
3837
+ const getItem = new DataManager(this.virtualGroupDataSource).executeLocal(new Query().where(new Predicate(fields, 'equal', currentValue)));
3543
3838
  if (getItem && getItem.length > 0) {
3544
3839
  this.itemData = getItem[0];
3545
3840
  const dataItem = this.getItemData();
3841
+ let value = this.allowObjectBinding ? this.getDataByValue(dataItem.value) : dataItem.value;
3546
3842
  if ((this.value === dataItem.value && this.text !== dataItem.text) || (this.value !== dataItem.value && this.text === dataItem.text)) {
3547
- this.setProperties({ 'text': dataItem.text, 'value': dataItem.value });
3843
+ this.setProperties({ 'text': dataItem.text, 'value': value });
3548
3844
  }
3549
3845
  }
3550
3846
  }
3551
3847
  else {
3552
- const getItem = new DataManager(this.dataSource).executeLocal(new Query().where(new Predicate(fields, 'equal', this.value)));
3848
+ const getItem = new DataManager(this.dataSource).executeLocal(new Query().where(new Predicate(fields, 'equal', currentValue)));
3553
3849
  if (getItem && getItem.length > 0) {
3554
3850
  this.itemData = getItem[0];
3555
3851
  const dataItem = this.getItemData();
3852
+ let value = this.allowObjectBinding ? this.getDataByValue(dataItem.value) : dataItem.value;
3556
3853
  if ((this.value === dataItem.value && this.text !== dataItem.text) || (this.value !== dataItem.value && this.text === dataItem.text)) {
3557
- this.setProperties({ 'text': dataItem.text, 'value': dataItem.value });
3854
+ this.setProperties({ 'text': dataItem.text, 'value': value });
3558
3855
  }
3559
3856
  }
3560
3857
  }
@@ -3668,10 +3965,20 @@ let DropDownList = class DropDownList extends DropDownBase {
3668
3965
  * @param {MouseEvent | KeyboardEvent | TouchEvent} eve - Specifies the event arguments.
3669
3966
  * @returns {void}
3670
3967
  */
3671
- onChangeEvent(eve) {
3968
+ onChangeEvent(eve, isCustomValue) {
3672
3969
  const dataItem = this.getItemData();
3673
- const index = this.isSelectCustom ? null : this.activeIndex;
3674
- this.setProperties({ 'index': index, 'text': dataItem.text, 'value': dataItem.value }, true);
3970
+ let index = this.isSelectCustom ? null : this.activeIndex;
3971
+ if (this.enableVirtualization) {
3972
+ let datas = this.dataSource instanceof DataManager ? this.virtualGroupDataSource : this.dataSource;
3973
+ if (dataItem.value && datas && datas.length > 0) {
3974
+ const foundIndex = datas.findIndex((data) => !isNullOrUndefined(dataItem.value) && getValue(this.fields.value, data) === dataItem.value);
3975
+ if (foundIndex !== -1) {
3976
+ index = foundIndex;
3977
+ }
3978
+ }
3979
+ }
3980
+ let value = this.allowObjectBinding ? isCustomValue ? this.value : this.getDataByValue(dataItem.value) : dataItem.value;
3981
+ this.setProperties({ 'index': index, 'text': dataItem.text, 'value': value }, true);
3675
3982
  this.detachChangeEvent(eve);
3676
3983
  }
3677
3984
  detachChanges(value) {
@@ -3698,7 +4005,7 @@ let DropDownList = class DropDownList extends DropDownBase {
3698
4005
  detachChangeEvent(eve) {
3699
4006
  this.isSelected = false;
3700
4007
  this.previousValue = this.value;
3701
- this.activeIndex = this.index;
4008
+ this.activeIndex = this.enableVirtualization ? this.getIndexByValue(this.value) : this.index;
3702
4009
  this.typedString = !isNullOrUndefined(this.text) ? this.text : '';
3703
4010
  if (!this.initial) {
3704
4011
  const items = this.detachChanges(this.itemData);
@@ -3745,16 +4052,17 @@ let DropDownList = class DropDownList extends DropDownBase {
3745
4052
  }
3746
4053
  setHiddenValue() {
3747
4054
  if (!isNullOrUndefined(this.value)) {
4055
+ let value = this.allowObjectBinding && !isNullOrUndefined(this.value) ? getValue((this.fields.value) ? this.fields.value : '', this.value) : this.value;
3748
4056
  if (this.hiddenElement.querySelector('option')) {
3749
4057
  const selectedElement = this.hiddenElement.querySelector('option');
3750
4058
  selectedElement.textContent = this.text;
3751
- selectedElement.setAttribute('value', this.value.toString());
4059
+ selectedElement.setAttribute('value', value.toString());
3752
4060
  }
3753
4061
  else {
3754
4062
  if (!isNullOrUndefined(this.hiddenElement)) {
3755
4063
  this.hiddenElement.innerHTML = '<option selected>' + this.text + '</option>';
3756
4064
  const selectedElement = this.hiddenElement.querySelector('option');
3757
- selectedElement.setAttribute('value', this.value.toString());
4065
+ selectedElement.setAttribute('value', value.toString());
3758
4066
  }
3759
4067
  }
3760
4068
  }
@@ -3771,6 +4079,7 @@ let DropDownList = class DropDownList extends DropDownBase {
3771
4079
  onFilterUp(e) {
3772
4080
  if (!(e.ctrlKey && e.keyCode === 86) && (this.isValidKey || e.keyCode === 40 || e.keyCode === 38)) {
3773
4081
  this.isValidKey = false;
4082
+ this.firstItem = this.dataSource && this.dataSource.length > 0 ? this.dataSource[0] : null;
3774
4083
  switch (e.keyCode) {
3775
4084
  case 38: //up arrow
3776
4085
  case 40: //down arrow
@@ -3827,42 +4136,6 @@ let DropDownList = class DropDownList extends DropDownBase {
3827
4136
  this.isValidKey = false;
3828
4137
  }
3829
4138
  }
3830
- getFilteringSkeletonCount() {
3831
- const difference = this.dataCount - this.viewPortInfo.endIndex;
3832
- const currentSkeletonCount = this.skeletonCount;
3833
- this.getSkeletonCount(true);
3834
- this.skeletonCount = this.dataCount > this.itemCount * 2 ? this.skeletonCount : difference > this.skeletonCount ? this.skeletonCount : difference > 0 ? difference : 0;
3835
- let skeletonUpdated = true;
3836
- if (this.getModuleName() === 'autocomplete' && (this.totalItemCount != 0 && this.totalItemCount < (this.itemCount * 2))) {
3837
- this.skeletonCount = 0;
3838
- skeletonUpdated = false;
3839
- }
3840
- if (!this.list.classList.contains(dropDownBaseClasses.noData)) {
3841
- const isSkeletonCountChange = currentSkeletonCount !== this.skeletonCount;
3842
- if (currentSkeletonCount !== this.skeletonCount && skeletonUpdated) {
3843
- this.UpdateSkeleton(true, Math.abs(currentSkeletonCount - this.skeletonCount));
3844
- }
3845
- else {
3846
- this.UpdateSkeleton();
3847
- }
3848
- this.liCollections = this.list.querySelectorAll('.e-list-item');
3849
- if ((this.list.getElementsByClassName('e-virtual-ddl').length > 0)) {
3850
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
3851
- this.list.getElementsByClassName('e-virtual-ddl')[0].style = this.GetVirtualTrackHeight();
3852
- }
3853
- if (this.list.getElementsByClassName('e-virtual-ddl-content').length > 0) {
3854
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
3855
- this.list.getElementsByClassName('e-virtual-ddl-content')[0].style = this.getTransformValues();
3856
- }
3857
- }
3858
- }
3859
- getSkeletonCount(retainSkeleton) {
3860
- this.virtualListHeight = this.listHeight != null ? parseInt(this.listHeight, 10) : this.virtualListHeight;
3861
- const actualCount = this.virtualListHeight > 0 ? Math.floor(this.virtualListHeight / this.listItemHeight) : 0;
3862
- this.skeletonCount = actualCount * 2 < this.itemCount ? this.itemCount : actualCount * 2;
3863
- this.itemCount = retainSkeleton ? this.itemCount : this.skeletonCount;
3864
- this.skeletonCount = Math.floor(this.skeletonCount / 2) + 2;
3865
- }
3866
4139
  onFilterDown(e) {
3867
4140
  switch (e.keyCode) {
3868
4141
  case 13: //enter
@@ -3917,14 +4190,51 @@ let DropDownList = class DropDownList extends DropDownBase {
3917
4190
  }
3918
4191
  }
3919
4192
  }
3920
- if (this.allowFiltering || !this.isPopupOpen || !alreadySkipAdded) {
3921
- filterQuery.skip(this.virtualItemStartIndex);
4193
+ let queryTakeValue = 0;
4194
+ let querySkipValue = 0;
4195
+ if (this.query && this.query.queries.length > 0) {
4196
+ for (let queryElements = 0; queryElements < this.query.queries.length; queryElements++) {
4197
+ if (this.query.queries[queryElements].fn === 'onSkip') {
4198
+ querySkipValue = this.query.queries[queryElements].e.nos;
4199
+ }
4200
+ if (this.query.queries[queryElements].fn === 'onTake') {
4201
+ queryTakeValue = takeValue <= this.query.queries[queryElements].e.nos ? this.query.queries[queryElements].e.nos : takeValue;
4202
+ }
4203
+ }
4204
+ }
4205
+ let skipExists = false;
4206
+ let takeExists = false;
4207
+ if (filterQuery && filterQuery.queries.length > 0) {
4208
+ for (let queryElements = 0; queryElements < filterQuery.queries.length; queryElements++) {
4209
+ if (filterQuery.queries[queryElements].fn === 'onSkip') {
4210
+ skipExists = true;
4211
+ }
4212
+ if (filterQuery.queries[queryElements].fn === 'onTake') {
4213
+ takeExists = true;
4214
+ filterQuery.queries[queryElements].e.nos = filterQuery.queries[queryElements].e.nos <= queryTakeValue ? queryTakeValue : filterQuery.queries[queryElements].e.nos;
4215
+ }
4216
+ }
4217
+ }
4218
+ if (!skipExists && (this.allowFiltering || !this.isPopupOpen || !alreadySkipAdded)) {
4219
+ if (querySkipValue > 0) {
4220
+ filterQuery.skip(querySkipValue);
4221
+ }
4222
+ else {
4223
+ filterQuery.skip(this.virtualItemStartIndex);
4224
+ }
3922
4225
  }
3923
4226
  if (this.isIncrementalRequest) {
3924
4227
  filterQuery.take(this.incrementalEndIndex);
3925
4228
  }
3926
4229
  else {
3927
- filterQuery.take(takeValue);
4230
+ if (!takeExists) {
4231
+ if (queryTakeValue > 0) {
4232
+ filterQuery.take(queryTakeValue);
4233
+ }
4234
+ else {
4235
+ filterQuery.take(takeValue);
4236
+ }
4237
+ }
3928
4238
  }
3929
4239
  filterQuery.requiresCount();
3930
4240
  }
@@ -4143,29 +4453,6 @@ let DropDownList = class DropDownList extends DropDownBase {
4143
4453
  this.renderPopup();
4144
4454
  }
4145
4455
  }
4146
- UpdateSkeleton(isSkeletonCountChange, skeletonCount) {
4147
- let isContainSkeleton = this.list.querySelector('.e-virtual-ddl-content');
4148
- let isContainVirtualList = this.list.querySelector('.e-virtual-list');
4149
- if (isContainSkeleton && (!isContainVirtualList || isSkeletonCountChange) && this.enableVirtualization) {
4150
- const totalSkeletonCount = isSkeletonCountChange ? skeletonCount : this.skeletonCount;
4151
- for (let i = 0; i < totalSkeletonCount; i++) {
4152
- const liElement = this.createElement('li', { className: dropDownListClasses.virtualList, styles: 'overflow: inherit' });
4153
- if (this.enableVirtualization && this.itemTemplate) {
4154
- liElement.style.height = this.listItemHeight + 'px';
4155
- }
4156
- let skeleton = new Skeleton({
4157
- shape: "Text",
4158
- height: "10px",
4159
- width: "95%",
4160
- cssClass: "e-skeleton-text",
4161
- });
4162
- skeleton.appendTo(this.createElement('div'));
4163
- liElement.appendChild(skeleton.element);
4164
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
4165
- isContainSkeleton.firstChild.insertBefore(liElement, isContainSkeleton.firstChild.children[0]);
4166
- }
4167
- }
4168
- }
4169
4456
  getTakeValue() {
4170
4457
  return this.allowFiltering && this.getModuleName() === 'dropdownlist' && Browser.isDevice ? Math.round(window.outerHeight / this.listItemHeight) : this.itemCount;
4171
4458
  }
@@ -4206,15 +4493,16 @@ let DropDownList = class DropDownList extends DropDownBase {
4206
4493
  this.initialRemoteRender = false;
4207
4494
  if (this.value && this.dataSource instanceof DataManager) {
4208
4495
  const checkField = isNullOrUndefined(this.fields.value) ? this.fields.text : this.fields.value;
4496
+ let value = this.allowObjectBinding && !isNullOrUndefined(this.value) ? getValue(checkField, this.value) : this.value;
4209
4497
  const fieldValue = this.fields.value.split('.');
4210
4498
  let checkVal = list.some((x) => isNullOrUndefined(x[checkField]) && fieldValue.length > 1 ?
4211
- this.checkFieldValue(x, fieldValue) === this.value : x[checkField] === this.value);
4499
+ this.checkFieldValue(x, fieldValue) === value : x[checkField] === value);
4212
4500
  if (this.enableVirtualization && this.virtualGroupDataSource) {
4213
4501
  checkVal = this.virtualGroupDataSource.some((x) => isNullOrUndefined(x[checkField]) && fieldValue.length > 1 ?
4214
- this.checkFieldValue(x, fieldValue) === this.value : x[checkField] === this.value);
4502
+ this.checkFieldValue(x, fieldValue) === value : x[checkField] === value);
4215
4503
  }
4216
4504
  if (!checkVal) {
4217
- this.dataSource.executeQuery(this.getQuery(this.query).where(new Predicate(checkField, 'equal', this.value)))
4505
+ this.dataSource.executeQuery(this.getQuery(this.query).where(new Predicate(checkField, 'equal', value)))
4218
4506
  .then((e) => {
4219
4507
  if (e.result.length > 0) {
4220
4508
  this.addItem(e.result, list.length);
@@ -4383,46 +4671,19 @@ let DropDownList = class DropDownList extends DropDownBase {
4383
4671
  updateSelectionList() {
4384
4672
  let selectedItem = this.list && this.list.querySelector('.' + 'e-active');
4385
4673
  if (!selectedItem && !isNullOrUndefined(this.value)) {
4386
- var findEle = this.findListElement(this.list, 'li', 'data-value', this.value);
4674
+ let value = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', this.value) : this.value;
4675
+ var findEle = this.findListElement(this.list, 'li', 'data-value', value);
4387
4676
  if (findEle) {
4388
4677
  findEle.classList.add('e-active');
4389
4678
  }
4390
4679
  }
4391
4680
  }
4392
- checkAndResetCache() {
4393
- if (this.enableVirtualization) {
4394
- this.generatedDataObject = {};
4395
- this.virtualItemStartIndex = this.virtualItemEndIndex = 0;
4396
- this.viewPortInfo = { currentPageNumber: null,
4397
- direction: null,
4398
- sentinelInfo: {},
4399
- offsets: {},
4400
- startIndex: 0,
4401
- endIndex: this.itemCount, };
4402
- this.selectedValueInfo = null;
4403
- }
4404
- }
4405
4681
  removeFocus() {
4406
4682
  const highlightedItem = this.list.querySelectorAll('.' + dropDownListClasses.focus);
4407
4683
  if (highlightedItem && highlightedItem.length) {
4408
4684
  removeClass(highlightedItem, dropDownListClasses.focus);
4409
4685
  }
4410
4686
  }
4411
- getTransformValues() {
4412
- let translateY = this.viewPortInfo.startIndex * this.listItemHeight;
4413
- translateY = translateY - (this.skeletonCount * this.listItemHeight);
4414
- translateY = this.viewPortInfo.startIndex === 0 && this.listData && this.listData.length === 0 ? 0 : translateY;
4415
- const styleText = `transform: translate(0px, ${translateY}px);`;
4416
- return styleText;
4417
- }
4418
- GetVirtualTrackHeight() {
4419
- const height = this.totalItemCount === this.viewPortInfo.endIndex ? this.totalItemCount * this.listItemHeight - this.itemCount * this.listItemHeight : this.totalItemCount * this.listItemHeight;
4420
- const heightDimension = `height: ${height - this.itemCount * this.listItemHeight}px;`;
4421
- if (this.getModuleName() === 'autocomplete' && this.skeletonCount === 0) {
4422
- return "height: 0px;";
4423
- }
4424
- return heightDimension;
4425
- }
4426
4687
  renderPopup(e) {
4427
4688
  if (this.popupObj && document.body.contains(this.popupObj.element)) {
4428
4689
  this.refreshPopup();
@@ -4437,7 +4698,7 @@ let DropDownList = class DropDownList extends DropDownBase {
4437
4698
  popupEle.setAttribute('aria-label', this.element.id);
4438
4699
  popupEle.setAttribute('role', 'dialog');
4439
4700
  const searchBox = this.setSearchBox(popupEle);
4440
- this.listHeight = formatUnit(this.popupHeight);
4701
+ this.listContainerHeight = formatUnit(this.popupHeight);
4441
4702
  if (this.headerTemplate) {
4442
4703
  this.setHeaderTemplate(popupEle);
4443
4704
  }
@@ -4481,19 +4742,19 @@ let DropDownList = class DropDownList extends DropDownBase {
4481
4742
  this.searchBoxHeight = 0;
4482
4743
  if (!isNullOrUndefined(searchBox.container) && this.getModuleName() !== 'combobox' && this.getModuleName() !== 'autocomplete') {
4483
4744
  this.searchBoxHeight = (searchBox.container.parentElement).getBoundingClientRect().height;
4484
- this.listHeight = (parseInt(this.listHeight, 10) - (this.searchBoxHeight)).toString() + 'px';
4745
+ this.listContainerHeight = (parseInt(this.listContainerHeight, 10) - (this.searchBoxHeight)).toString() + 'px';
4485
4746
  }
4486
4747
  if (this.headerTemplate) {
4487
4748
  this.header = this.header ? this.header : popupEle.querySelector('.e-ddl-header');
4488
4749
  const height = Math.round(this.header.getBoundingClientRect().height);
4489
- this.listHeight = (parseInt(this.listHeight, 10) - (height + this.searchBoxHeight)).toString() + 'px';
4750
+ this.listContainerHeight = (parseInt(this.listContainerHeight, 10) - (height + this.searchBoxHeight)).toString() + 'px';
4490
4751
  }
4491
4752
  if (this.footerTemplate) {
4492
4753
  this.footer = this.footer ? this.footer : popupEle.querySelector('.e-ddl-footer');
4493
4754
  const height = Math.round(this.footer.getBoundingClientRect().height);
4494
- this.listHeight = (parseInt(this.listHeight, 10) - (height + this.searchBoxHeight)).toString() + 'px';
4755
+ this.listContainerHeight = (parseInt(this.listContainerHeight, 10) - (height + this.searchBoxHeight)).toString() + 'px';
4495
4756
  }
4496
- this.list.style.maxHeight = (parseInt(this.listHeight, 10) - 2).toString() + 'px'; // due to box-sizing property
4757
+ this.list.style.maxHeight = (parseInt(this.listContainerHeight, 10) - 2).toString() + 'px'; // due to box-sizing property
4497
4758
  popupEle.style.maxHeight = formatUnit(this.popupHeight);
4498
4759
  }
4499
4760
  else {
@@ -4799,6 +5060,9 @@ let DropDownList = class DropDownList extends DropDownBase {
4799
5060
  this.list.scrollTop += nextOffset;
4800
5061
  }
4801
5062
  else {
5063
+ if (this.enableVirtualization) {
5064
+ liCount = keyAction == "pageDown" ? this.getPageCount() : liCount;
5065
+ }
4802
5066
  this.list.scrollTop += this.selectedLI.offsetHeight * liCount;
4803
5067
  }
4804
5068
  this.isPreventKeyAction = this.IsScrollerAtEnd() ? false : this.isPreventKeyAction;
@@ -4851,6 +5115,9 @@ let DropDownList = class DropDownList extends DropDownBase {
4851
5115
  else if (nextOffset < 0 || isPageUpKeyAction) {
4852
5116
  var currentElementValue = this.selectedLI ? this.selectedLI.getAttribute('data-value') : null;
4853
5117
  var liCount = keyAction == "pageUp" ? this.getPageCount() - 2 : 1;
5118
+ if (this.enableVirtualization) {
5119
+ liCount = keyAction == "pageUp" ? this.getPageCount() : liCount;
5120
+ }
4854
5121
  if (this.enableVirtualization && this.isKeyBoardAction && firstElementValue && currentElementValue === firstElementValue && keyAction != "home" && !this.isVirtualScrolling) {
4855
5122
  this.isUpwardScrolling = true;
4856
5123
  this.isPreventKeyAction = true;
@@ -4947,6 +5214,7 @@ let DropDownList = class DropDownList extends DropDownBase {
4947
5214
  let isFilterValue = !isNullOrUndefined(this.filterInput) && !isNullOrUndefined(this.filterInput.value) && this.filterInput.value !== '';
4948
5215
  const typedString = this.getModuleName() === 'combobox' ? this.typedString : null;
4949
5216
  this.isTyped = false;
5217
+ this.isVirtualTrackHeight = false;
4950
5218
  if (!(this.popupObj && document.body.contains(this.popupObj.element) && this.beforePopupOpen)) {
4951
5219
  return;
4952
5220
  }
@@ -5201,6 +5469,9 @@ let DropDownList = class DropDownList extends DropDownBase {
5201
5469
  this.listItemHeight = this.getListHeight();
5202
5470
  this.getSkeletonCount();
5203
5471
  this.updateVirtualizationProperties(this.itemCount, this.allowFiltering);
5472
+ if (this.index !== null) {
5473
+ this.activeIndex = this.index + this.skeletonCount;
5474
+ }
5204
5475
  }
5205
5476
  this.initValue();
5206
5477
  this.selectedValueInfo = this.viewPortInfo;
@@ -5210,7 +5481,7 @@ let DropDownList = class DropDownList extends DropDownBase {
5210
5481
  }
5211
5482
  else if (this.element.tagName === 'SELECT' && this.element.options[0]) {
5212
5483
  const selectElement = this.element;
5213
- this.value = selectElement.options[selectElement.selectedIndex].value;
5484
+ this.value = this.allowObjectBinding ? this.getDataByValue(selectElement.options[selectElement.selectedIndex].value) : selectElement.options[selectElement.selectedIndex].value;
5214
5485
  this.text = isNullOrUndefined(this.value) ? null : selectElement.options[selectElement.selectedIndex].textContent;
5215
5486
  this.initValue();
5216
5487
  }
@@ -5362,7 +5633,7 @@ let DropDownList = class DropDownList extends DropDownBase {
5362
5633
  this.actionData = this.actionCompleteData;
5363
5634
  }
5364
5635
  }
5365
- updateDataSource(props) {
5636
+ updateDataSource(props, oldProps) {
5366
5637
  if (this.inputElement.value !== '' || (!isNullOrUndefined(props) && (isNullOrUndefined(props.dataSource)
5367
5638
  || (!(props.dataSource instanceof DataManager) && props.dataSource.length === 0)))) {
5368
5639
  this.clearAll(null, props);
@@ -5372,7 +5643,7 @@ let DropDownList = class DropDownList extends DropDownBase {
5372
5643
  EventHandler.add(this.list, 'scroll', this.setFloatingHeader, this);
5373
5644
  }
5374
5645
  if (!(!isNullOrUndefined(props) && (isNullOrUndefined(props.dataSource)
5375
- || (!(props.dataSource instanceof DataManager) && props.dataSource.length === 0))) || !(Array.isArray(props.dataSource) && props.dataSource.length === 0)) {
5646
+ || (!(props.dataSource instanceof DataManager) && props.dataSource.length === 0))) || ((props.dataSource instanceof DataManager) || (!isNullOrUndefined(props) && Array.isArray(props.dataSource) && !isNullOrUndefined(oldProps) && Array.isArray(oldProps.dataSource) && props.dataSource.length !== oldProps.dataSource.length))) {
5376
5647
  this.typedString = '';
5377
5648
  this.resetList(this.dataSource);
5378
5649
  }
@@ -5381,9 +5652,11 @@ let DropDownList = class DropDownList extends DropDownBase {
5381
5652
  }
5382
5653
  }
5383
5654
  checkCustomValue() {
5384
- this.itemData = this.getDataByValue(this.value);
5655
+ const currentValue = this.allowObjectBinding && !isNullOrUndefined(this.value) ? getValue((this.fields.value) ? this.fields.value : '', this.value) : this.value;
5656
+ this.itemData = this.getDataByValue(currentValue);
5385
5657
  const dataItem = this.getItemData();
5386
- this.setProperties({ 'text': dataItem.text, 'value': dataItem.value });
5658
+ let value = this.allowObjectBinding ? this.itemData : dataItem.value;
5659
+ this.setProperties({ 'text': dataItem.text, 'value': value });
5387
5660
  }
5388
5661
  updateInputFields() {
5389
5662
  if (this.getModuleName() === 'dropdownlist') {
@@ -5504,6 +5777,9 @@ let DropDownList = class DropDownList extends DropDownBase {
5504
5777
  this.clearAll();
5505
5778
  break;
5506
5779
  }
5780
+ if (this.allowObjectBinding && !isNullOrUndefined(newProp.value) && !isNullOrUndefined(oldProp.value) && this.isObjectInArray(newProp.value, [oldProp.value])) {
5781
+ return;
5782
+ }
5507
5783
  if (this.enableVirtualization) {
5508
5784
  this.updateValues();
5509
5785
  this.updateInputFields();
@@ -5521,7 +5797,8 @@ let DropDownList = class DropDownList extends DropDownBase {
5521
5797
  this.renderList();
5522
5798
  }
5523
5799
  if (!this.initialRemoteRender) {
5524
- const item = this.getElementByValue(newProp.value);
5800
+ const value = this.allowObjectBinding && !isNullOrUndefined(newProp.value) ? getValue((this.fields.value) ? this.fields.value : '', newProp.value) : newProp.value;
5801
+ const item = this.getElementByValue(value);
5525
5802
  if (!this.checkValidLi(item)) {
5526
5803
  if (this.liCollections && this.liCollections.length === 100 &&
5527
5804
  this.getModuleName() === 'autocomplete' && this.listData.length > 100) {
@@ -5531,7 +5808,8 @@ let DropDownList = class DropDownList extends DropDownBase {
5531
5808
  const listLength = this.getItems().length;
5532
5809
  const checkField = isNullOrUndefined(this.fields.value) ? this.fields.text : this.fields.value;
5533
5810
  this.typedString = '';
5534
- this.dataSource.executeQuery(this.getQuery(this.query).where(new Predicate(checkField, 'equal', newProp.value)))
5811
+ let value = this.allowObjectBinding && !isNullOrUndefined(newProp.value) ? getValue(checkField, newProp.value) : newProp.value;
5812
+ this.dataSource.executeQuery(this.getQuery(this.query).where(new Predicate(checkField, 'equal', value)))
5535
5813
  .then((e) => {
5536
5814
  if (e.result.length > 0) {
5537
5815
  this.addItem(e.result, listLength);
@@ -5643,6 +5921,8 @@ let DropDownList = class DropDownList extends DropDownBase {
5643
5921
  }
5644
5922
  }
5645
5923
  else if (prop === 'value') {
5924
+ const fields = (this.fields.value) ? this.fields.value : '';
5925
+ const value = this.allowObjectBinding && !isNullOrUndefined(newProp) ? getValue(fields, newProp) : newProp;
5646
5926
  li = this.getElementByValue(newProp);
5647
5927
  if (!this.checkValidLi(li)) {
5648
5928
  this.setOldValue(oldProp);
@@ -5705,6 +5985,7 @@ let DropDownList = class DropDownList extends DropDownBase {
5705
5985
  if (!this.enabled) {
5706
5986
  return;
5707
5987
  }
5988
+ this.firstItem = this.dataSource && this.dataSource.length > 0 ? this.dataSource[0] : null;
5708
5989
  if (this.isReact && this.getModuleName() === 'combobox' && this.itemTemplate && this.isCustomFilter && this.isAddNewItemTemplate) {
5709
5990
  this.renderList();
5710
5991
  this.isAddNewItemTemplate = false;
@@ -5781,7 +6062,8 @@ let DropDownList = class DropDownList extends DropDownBase {
5781
6062
  }
5782
6063
  this.isEscapeKey = false;
5783
6064
  if (!isNullOrUndefined(this.index)) {
5784
- const element = this.findListElement(this.ulElement, 'li', 'data-value', this.value);
6065
+ const value = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', this.value) : this.value;
6066
+ const element = this.findListElement(this.ulElement, 'li', 'data-value', value);
5785
6067
  this.selectedLI = this.liCollections[this.index] || element;
5786
6068
  if (this.selectedLI) {
5787
6069
  this.updateSelectedItem(this.selectedLI, null, true);
@@ -5794,6 +6076,7 @@ let DropDownList = class DropDownList extends DropDownBase {
5794
6076
  this.resetSelection();
5795
6077
  }
5796
6078
  }
6079
+ this.isVirtualTrackHeight = false;
5797
6080
  this.closePopup(0, e);
5798
6081
  const dataItem = this.getItemData();
5799
6082
  let isSelectVal = !isNullOrUndefined(this.selectedLI);
@@ -5865,6 +6148,9 @@ let DropDownList = class DropDownList extends DropDownBase {
5865
6148
  */
5866
6149
  destroy() {
5867
6150
  this.isActive = false;
6151
+ if (this.showClearButton) {
6152
+ this.clearButton = document.getElementsByClassName('e-clear-icon')[0];
6153
+ }
5868
6154
  resetIncrementalSearchValues(this.element.id);
5869
6155
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5870
6156
  if (this.isReact) {
@@ -5920,6 +6206,14 @@ let DropDownList = class DropDownList extends DropDownBase {
5920
6206
  if (this.inputElement && !isNullOrUndefined(this.inputElement.onchange)) {
5921
6207
  this.inputElement.onchange = null;
5922
6208
  }
6209
+ if (this.inputElement && !isNullOrUndefined(this.inputElement.onselect)) {
6210
+ this.inputElement.onselect = null;
6211
+ }
6212
+ Input.destroy({
6213
+ element: this.inputElement,
6214
+ floatLabelType: this.floatLabelType,
6215
+ properties: this.properties
6216
+ }, this.clearButton);
5923
6217
  if (this.isAngular) {
5924
6218
  this.inputElement = null;
5925
6219
  }
@@ -6013,6 +6307,9 @@ __decorate$1([
6013
6307
  __decorate$1([
6014
6308
  Property(null)
6015
6309
  ], DropDownList.prototype, "value", void 0);
6310
+ __decorate$1([
6311
+ Property(false)
6312
+ ], DropDownList.prototype, "allowObjectBinding", void 0);
6016
6313
  __decorate$1([
6017
6314
  Property(null)
6018
6315
  ], DropDownList.prototype, "index", void 0);
@@ -6182,7 +6479,6 @@ let DropDownTree = class DropDownTree extends Component {
6182
6479
  this.filterTimer = null;
6183
6480
  this.isFilteredData = false;
6184
6481
  this.isFilterRestore = false;
6185
- // eslint-disable-next-line
6186
6482
  this.selectedData = [];
6187
6483
  this.filterDelayTime = 300;
6188
6484
  this.isClicked = false;
@@ -6279,7 +6575,7 @@ let DropDownTree = class DropDownTree extends Component {
6279
6575
  this.inputEle.setAttribute('aria-expanded', 'false');
6280
6576
  this.inputEle.setAttribute('role', 'combobox');
6281
6577
  this.inputEle.setAttribute('aria-haspopup', 'tree');
6282
- this.inputEle.setAttribute('aria-controls', this.element.id + "_options");
6578
+ this.inputEle.setAttribute('aria-controls', this.element.id + '_options');
6283
6579
  }
6284
6580
  if (isNullOrUndefined(this.inputEle.getAttribute('type'))) {
6285
6581
  this.inputEle.setAttribute('type', 'text');
@@ -6322,7 +6618,9 @@ let DropDownTree = class DropDownTree extends Component {
6322
6618
  this.popupDiv.classList.add(DROPDOWN);
6323
6619
  this.tree = this.createElement('div', { id: this.element.id + '_tree' });
6324
6620
  this.popupDiv.appendChild(this.tree);
6325
- document.body.appendChild(this.popupDiv);
6621
+ if (!this.destroyPopupOnHide) {
6622
+ document.body.appendChild(this.popupDiv);
6623
+ }
6326
6624
  this.wireTreeEvents();
6327
6625
  addClass([this.popupDiv], DDTHIDEICON);
6328
6626
  this.renderTree();
@@ -6427,6 +6725,7 @@ let DropDownTree = class DropDownTree extends Component {
6427
6725
  if (value === '') {
6428
6726
  this.isFilteredData = false;
6429
6727
  this.isFilterRestore = true;
6728
+ this.isFromFilterChange = false;
6430
6729
  fields = this.cloneFields(this.fields);
6431
6730
  }
6432
6731
  else if (args.preventDefaultAction) {
@@ -6465,7 +6764,7 @@ let DropDownTree = class DropDownTree extends Component {
6465
6764
  this.treeObj.dataBind();
6466
6765
  if (this.hasTemplate && this.portals && this.treeObj.portals) {
6467
6766
  for (let i = 0; i < this.treeObj.portals.length; i++) {
6468
- if (this.portals.indexOf(this.treeObj.portals[i]) == -1) {
6767
+ if (this.portals.indexOf(this.treeObj.portals[i]) === -1) {
6469
6768
  this.portals.push(this.treeObj.portals[i]);
6470
6769
  }
6471
6770
  }
@@ -6504,7 +6803,6 @@ let DropDownTree = class DropDownTree extends Component {
6504
6803
  return filteredItems;
6505
6804
  }
6506
6805
  nestedFilter(value, filteredFields) {
6507
- // eslint-disable-next-line
6508
6806
  const matchedDataSource = [];
6509
6807
  for (let i = 0; i < this.treeData.length; i++) {
6510
6808
  // eslint-disable-next-line
@@ -6516,15 +6814,12 @@ let DropDownTree = class DropDownTree extends Component {
6516
6814
  filteredFields.dataSource = matchedDataSource;
6517
6815
  return filteredFields;
6518
6816
  }
6519
- // eslint-disable-next-line
6520
6817
  nestedChildFilter(value, node) {
6521
- // eslint-disable-next-line
6522
6818
  const children = node[this.fields.child];
6523
6819
  if (isNullOrUndefined(children)) {
6524
6820
  return (this.isMatchedNode(value, node)) ? node : null;
6525
6821
  }
6526
6822
  else {
6527
- // eslint-disable-next-line
6528
6823
  const matchedChildren = [];
6529
6824
  for (let i = 0; i < children.length; i++) {
6530
6825
  // eslint-disable-next-line
@@ -6545,9 +6840,7 @@ let DropDownTree = class DropDownTree extends Component {
6545
6840
  }
6546
6841
  }
6547
6842
  selfReferencefilter(value, filteredFields) {
6548
- // eslint-disable-next-line
6549
6843
  const matchedData = [];
6550
- // eslint-disable-next-line
6551
6844
  const matchedDataSource = [];
6552
6845
  for (let i = 0; i < this.treeData.length; i++) {
6553
6846
  if (this.isMatchedNode(value, this.treeData[i])) {
@@ -6560,7 +6853,6 @@ let DropDownTree = class DropDownTree extends Component {
6560
6853
  // eslint-disable-next-line
6561
6854
  let parentId = matchedData[i][this.fields.parentValue];
6562
6855
  while (!isNullOrUndefined(parentId)) {
6563
- // eslint-disable-next-line
6564
6856
  let parent = null;
6565
6857
  for (let j = 0; j < this.treeData.length; j++) {
6566
6858
  // eslint-disable-next-line
@@ -6583,7 +6875,6 @@ let DropDownTree = class DropDownTree extends Component {
6583
6875
  filteredFields.dataSource = matchedDataSource;
6584
6876
  return filteredFields;
6585
6877
  }
6586
- // eslint-disable-next-line
6587
6878
  isMatchedNode(value, node, isChild, isChildFiltering) {
6588
6879
  let checkValue;
6589
6880
  let isObjectValue = isChild && isChildFiltering && this.isChildObject();
@@ -6938,7 +7229,7 @@ let DropDownTree = class DropDownTree extends Component {
6938
7229
  this.clickHandler(e);
6939
7230
  break;
6940
7231
  case 'moveDown':
6941
- let focusedElement = this.treeObj.element.querySelector('li');
7232
+ const focusedElement = this.treeObj.element.querySelector('li');
6942
7233
  focusedElement.focus();
6943
7234
  addClass([focusedElement], ['e-node-focus']);
6944
7235
  }
@@ -6976,7 +7267,6 @@ let DropDownTree = class DropDownTree extends Component {
6976
7267
  let remaining;
6977
7268
  let downIconWidth = 0;
6978
7269
  this.overFlowWrapper.innerHTML = '';
6979
- // eslint-disable-next-line
6980
7270
  const l10nLocale = { overflowCountTemplate: '+${count} more..', totalCountTemplate: '${count} selected' };
6981
7271
  this.l10n = new L10n(this.getLocaleName(), l10nLocale, this.locale);
6982
7272
  const remainContent = this.l10n.getConstant('overflowCountTemplate');
@@ -7259,7 +7549,6 @@ let DropDownTree = class DropDownTree extends Component {
7259
7549
  if (this.selectAllText !== 'Select All' || this.unSelectAllText !== 'Unselect All') {
7260
7550
  const template = unSelect ? this.unSelectAllText : this.selectAllText;
7261
7551
  this.selectAllSpan.textContent = '';
7262
- // eslint-disable-next-line
7263
7552
  const compiledString = compile(template);
7264
7553
  const templateName = unSelect ? 'unSelectAllText' : 'selectAllText';
7265
7554
  for (const item of compiledString({}, this, templateName, null, !this.isStringTemplate)) {
@@ -7283,11 +7572,11 @@ let DropDownTree = class DropDownTree extends Component {
7283
7572
  if (htmlAttr === 'class') {
7284
7573
  this.inputWrapper.classList.add(this.htmlAttributes[`${htmlAttr}`]);
7285
7574
  }
7286
- else if (htmlAttr === 'disabled' && this.htmlAttributes[`${htmlAttr}`] === 'disabled') {
7575
+ else if (htmlAttr === 'disabled') {
7287
7576
  this.setProperties({ enabled: false }, true);
7288
7577
  this.setEnable();
7289
7578
  }
7290
- else if (htmlAttr === 'readonly' && !isNullOrUndefined(this.htmlAttributes[`${htmlAttr}`])) {
7579
+ else if (htmlAttr === 'readonly') {
7291
7580
  this.setProperties({ readonly: true }, true);
7292
7581
  this.dataBind();
7293
7582
  }
@@ -7347,7 +7636,6 @@ let DropDownTree = class DropDownTree extends Component {
7347
7636
  }
7348
7637
  setTreeValue() {
7349
7638
  if (this.value !== null && this.value.length !== 0) {
7350
- // eslint-disable-next-line
7351
7639
  let data;
7352
7640
  if (this.showCheckBox || this.allowMultiSelection) {
7353
7641
  for (let i = 0; i < this.value.length; i++) {
@@ -7377,7 +7665,6 @@ let DropDownTree = class DropDownTree extends Component {
7377
7665
  return;
7378
7666
  }
7379
7667
  if (this.text !== null) {
7380
- // eslint-disable-next-line
7381
7668
  let data;
7382
7669
  const valArr = [];
7383
7670
  if (this.showCheckBox || this.allowMultiSelection) {
@@ -7445,7 +7732,7 @@ let DropDownTree = class DropDownTree extends Component {
7445
7732
  }
7446
7733
  else {
7447
7734
  if (this.showCheckBox) {
7448
- let difference = this.value.filter((e) => {
7735
+ const difference = this.value.filter((e) => {
7449
7736
  return this.treeObj.checkedNodes.indexOf(e) === -1;
7450
7737
  });
7451
7738
  if (difference.length > 0 || this.treeSettings.autoCheck) {
@@ -7467,9 +7754,7 @@ let DropDownTree = class DropDownTree extends Component {
7467
7754
  this.triggerChangeEvent();
7468
7755
  }
7469
7756
  }
7470
- // eslint-disable-next-line
7471
7757
  getItems(givenText) {
7472
- // eslint-disable-next-line
7473
7758
  let data;
7474
7759
  if (this.treeDataType === 1) {
7475
7760
  for (let i = 0; i < this.treeItems.length; i++) {
@@ -7486,9 +7771,7 @@ let DropDownTree = class DropDownTree extends Component {
7486
7771
  }
7487
7772
  return data;
7488
7773
  }
7489
- // eslint-disable-next-line
7490
7774
  getNestedItems(data, field, givenText) {
7491
- // eslint-disable-next-line
7492
7775
  let newData;
7493
7776
  for (let i = 0, objlen = data.length; i < objlen; i++) {
7494
7777
  // eslint-disable-next-line
@@ -7499,7 +7782,6 @@ let DropDownTree = class DropDownTree extends Component {
7499
7782
  else if (typeof field.child === 'string' && !isNullOrUndefined(getValue(field.child, data[i]))) {
7500
7783
  // eslint-disable-next-line
7501
7784
  const childData = getValue(field.child, data[i]);
7502
- // eslint-disable-next-line
7503
7785
  newData = this.getNestedItems(childData, this.getChildType(field), givenText);
7504
7786
  if (newData !== undefined) {
7505
7787
  break;
@@ -7542,7 +7824,7 @@ let DropDownTree = class DropDownTree extends Component {
7542
7824
  nodeTemplate: this.itemTemplate
7543
7825
  });
7544
7826
  this.treeObj.root = this.root ? this.root : this;
7545
- this.treeObj.appendTo('#' + this.tree.id);
7827
+ this.treeObj.appendTo(this.tree);
7546
7828
  }
7547
7829
  /* To render the popup element */
7548
7830
  renderPopup() {
@@ -7599,9 +7881,13 @@ let DropDownTree = class DropDownTree extends Component {
7599
7881
  this.isFirstRender = false;
7600
7882
  /* eslint-disable */
7601
7883
  if (this.hasTemplate && this.portals) {
7602
- this.portals = this.portals.concat(this.treeObj.portals);
7884
+ if (this.treeObj.portals) {
7885
+ this.portals = this.portals.concat(this.treeObj.portals.filter((item) => !this.portals.includes(item)));
7886
+ }
7603
7887
  /* eslint-enable */
7604
- this.renderReactTemplates();
7888
+ if (this.isReact) {
7889
+ this.renderReactTemplates(this.reactCallBack);
7890
+ }
7605
7891
  }
7606
7892
  }
7607
7893
  if (!isCancelled) {
@@ -7612,7 +7898,15 @@ let DropDownTree = class DropDownTree extends Component {
7612
7898
  this.popupObj.refreshPosition();
7613
7899
  if (!(this.showCheckBox && this.showSelectAll) && (!this.popupDiv.classList.contains(NODATA)
7614
7900
  && this.treeItems.length > 0)) {
7615
- let focusedElement = this.treeObj.element.querySelector('li');
7901
+ let focusedElement;
7902
+ if (this.value != null && this.text != null) {
7903
+ this.treeObj.element.querySelector('li').setAttribute('tabindex', '-1');
7904
+ focusedElement = this.treeObj.element.querySelector('[data-uid="' + this.value[0] + '"]');
7905
+ focusedElement.setAttribute('tabindex', '0');
7906
+ }
7907
+ else {
7908
+ focusedElement = this.treeObj.element.querySelector('li');
7909
+ }
7616
7910
  focusedElement.focus();
7617
7911
  addClass([focusedElement], ['e-node-focus']);
7618
7912
  }
@@ -7630,6 +7924,10 @@ let DropDownTree = class DropDownTree extends Component {
7630
7924
  }
7631
7925
  });
7632
7926
  }
7927
+ reactCallBack() {
7928
+ this.updatePopupHeight();
7929
+ this.popupObj.refreshPosition();
7930
+ }
7633
7931
  updatePopupHeight() {
7634
7932
  if (this.isFirstRender) {
7635
7933
  return;
@@ -7887,7 +8185,6 @@ let DropDownTree = class DropDownTree extends Component {
7887
8185
  }
7888
8186
  return null;
7889
8187
  }
7890
- // eslint-disable-next-line
7891
8188
  getTreeDataType(ds, field) {
7892
8189
  if (this.fields.dataSource instanceof DataManager) {
7893
8190
  for (let i = 0; i < ds.length; i++) {
@@ -7897,8 +8194,9 @@ let DropDownTree = class DropDownTree extends Component {
7897
8194
  }
7898
8195
  return 2;
7899
8196
  }
7900
- if (isNullOrUndefined(this.fields.dataSource))
8197
+ if (isNullOrUndefined(this.fields.dataSource)) {
7901
8198
  this.fields.dataSource = [];
8199
+ }
7902
8200
  for (let i = 0, len = this.fields.dataSource.length; i < len; i++) {
7903
8201
  if ((typeof field.child === 'string') && !isNullOrUndefined(getValue(field.child, this.fields.dataSource[i]))) {
7904
8202
  return 2;
@@ -7919,9 +8217,7 @@ let DropDownTree = class DropDownTree extends Component {
7919
8217
  this.treeObj.dataBind();
7920
8218
  }
7921
8219
  getEventArgs(args) {
7922
- // eslint-disable-next-line
7923
8220
  const checkData = args.data;
7924
- // eslint-disable-next-line
7925
8221
  const selectData = args.nodeData;
7926
8222
  let state;
7927
8223
  if (this.showCheckBox) {
@@ -8006,7 +8302,6 @@ let DropDownTree = class DropDownTree extends Component {
8006
8302
  const target = args.event.target;
8007
8303
  if ((target.classList.contains('e-fullrow') || target.classList.contains('e-list-text')) && this.showCheckBox) {
8008
8304
  this.isClicked = true;
8009
- // eslint-disable-next-line
8010
8305
  const getNodeDetails = this.treeObj.getNode(args.node);
8011
8306
  if (getNodeDetails.isChecked === 'true') {
8012
8307
  this.treeObj.uncheckAll([args.node]);
@@ -8058,7 +8353,7 @@ let DropDownTree = class DropDownTree extends Component {
8058
8353
  onNodeExpanded(args) {
8059
8354
  if (this.hasTemplate && this.portals && this.treeObj.portals) {
8060
8355
  for (let i = 0; i < this.treeObj.portals.length; i++) {
8061
- if (this.portals.indexOf(this.treeObj.portals[i]) == -1) {
8356
+ if (this.portals.indexOf(this.treeObj.portals[i]) === -1) {
8062
8357
  this.portals.push(this.treeObj.portals[i]);
8063
8358
  }
8064
8359
  }
@@ -8156,7 +8451,7 @@ let DropDownTree = class DropDownTree extends Component {
8156
8451
  }
8157
8452
  setMultiSelectValue(newValues) {
8158
8453
  if (!this.isFilteredData) {
8159
- this.setProperties({ value: this.isFromFilterChange && newValues && newValues.length == 0 ? this.value : newValues }, true);
8454
+ this.setProperties({ value: this.isFromFilterChange && newValues && newValues.length === 0 ? this.value : newValues }, true);
8160
8455
  this.isFromFilterChange = false;
8161
8456
  if (newValues && newValues.length !== 0 && !this.showCheckBox) {
8162
8457
  this.treeObj.selectedNodes = this.value.slice();
@@ -8206,9 +8501,7 @@ let DropDownTree = class DropDownTree extends Component {
8206
8501
  }
8207
8502
  this.updateSelectedValues();
8208
8503
  }
8209
- // eslint-disable-next-line
8210
8504
  getSelectedData(value) {
8211
- // eslint-disable-next-line
8212
8505
  let data = null;
8213
8506
  if (this.isFilteredData) {
8214
8507
  for (let i = 0; i < this.selectedData.length; i++) {
@@ -8238,7 +8531,7 @@ let DropDownTree = class DropDownTree extends Component {
8238
8531
  }
8239
8532
  else if (this.treeDataType === 1) {
8240
8533
  for (let i = 0, objlen = this.treeItems.length; i < objlen; i++) {
8241
- let dataId = getValue(this.fields.value, this.treeItems[i]);
8534
+ const dataId = getValue(this.fields.value, this.treeItems[i]);
8242
8535
  if (!isNullOrUndefined(this.treeItems[i]) && !isNullOrUndefined(dataId) && dataId.toString() === id) {
8243
8536
  return this.treeItems[i];
8244
8537
  }
@@ -8255,19 +8548,19 @@ let DropDownTree = class DropDownTree extends Component {
8255
8548
  return newChildItems;
8256
8549
  }
8257
8550
  for (let i = 0, objlen = obj.length; i < objlen; i++) {
8258
- let dataValue = getValue(mapper.value, obj[i]);
8551
+ const dataValue = getValue(mapper.value, obj[i]);
8259
8552
  if (obj[i] && dataValue && dataValue.toString() === id) {
8260
8553
  return obj[i];
8261
8554
  }
8262
8555
  else if (typeof mapper.child === 'string' && !isNullOrUndefined(getValue(mapper.child, obj[i]))) {
8263
- let childNodeData = getValue(mapper.child, obj[i]);
8556
+ const childNodeData = getValue(mapper.child, obj[i]);
8264
8557
  newChildItems = this.getChildNodeData(childNodeData, this.getChildMapperFields(mapper), id);
8265
8558
  if (newChildItems !== undefined) {
8266
8559
  break;
8267
8560
  }
8268
8561
  }
8269
8562
  else if (this.fields.dataSource instanceof DataManager && !isNullOrUndefined(getValue('child', obj[i]))) {
8270
- let child = 'child';
8563
+ const child = 'child';
8271
8564
  newChildItems = this.getChildNodeData(getValue(child, obj[i]), this.getChildMapperFields(mapper), id);
8272
8565
  if (newChildItems !== undefined) {
8273
8566
  break;
@@ -8295,7 +8588,6 @@ let DropDownTree = class DropDownTree extends Component {
8295
8588
  let temp;
8296
8589
  let text;
8297
8590
  let textValue = '';
8298
- // eslint-disable-next-line
8299
8591
  let selectedData;
8300
8592
  this.hiddenElement.innerHTML = '';
8301
8593
  let hiddenInputValue = '';
@@ -8391,7 +8683,7 @@ let DropDownTree = class DropDownTree extends Component {
8391
8683
  addClass([this.inputWrapper], SHOW_CHIP);
8392
8684
  }
8393
8685
  const chip = this.createElement('span', {
8394
- className: CHIP,
8686
+ className: CHIP
8395
8687
  });
8396
8688
  if (!this.inputEle.classList.contains(CHIP_INPUT)) {
8397
8689
  addClass([this.inputEle], CHIP_INPUT);
@@ -8433,7 +8725,6 @@ let DropDownTree = class DropDownTree extends Component {
8433
8725
  this.header = this.createElement('div');
8434
8726
  addClass([this.header], HEADER);
8435
8727
  }
8436
- // eslint-disable-next-line
8437
8728
  const compiledString = this.templateComplier(this.headerTemplate);
8438
8729
  let tempArr = compiledString({}, this, 'headerTemplate', this.headerTemplateId, this.isStringTemplate, undefined, this.header);
8439
8730
  if (tempArr) {
@@ -8442,7 +8733,6 @@ let DropDownTree = class DropDownTree extends Component {
8442
8733
  }
8443
8734
  this.popupEle.insertBefore(this.header, this.checkAllParent ? this.checkAllParent : this.popupDiv);
8444
8735
  }
8445
- // eslint-disable-next-line
8446
8736
  templateComplier(template) {
8447
8737
  if (template) {
8448
8738
  // eslint-disable-next-line
@@ -8468,7 +8758,6 @@ let DropDownTree = class DropDownTree extends Component {
8468
8758
  this.footer = this.createElement('div');
8469
8759
  addClass([this.footer], FOOTER);
8470
8760
  }
8471
- // eslint-disable-next-line
8472
8761
  const compiledString = this.templateComplier(this.footerTemplate);
8473
8762
  let tempArr = compiledString({}, this, 'footerTemplate', this.footerTemplateId, this.isStringTemplate, undefined, this.footer);
8474
8763
  if (tempArr) {
@@ -8527,7 +8816,7 @@ let DropDownTree = class DropDownTree extends Component {
8527
8816
  this.ensurePlaceHolder();
8528
8817
  }
8529
8818
  resetValue(isDynamicChange) {
8530
- if (this.value == [] && this.text == null) {
8819
+ if (this.value === [] && this.text == null) {
8531
8820
  return;
8532
8821
  }
8533
8822
  Input.setValue(null, this.inputEle, this.floatLabelType);
@@ -8666,7 +8955,6 @@ let DropDownTree = class DropDownTree extends Component {
8666
8955
  const template = actionFailure ? this.actionFailureTemplate : this.noRecordsTemplate;
8667
8956
  const templateId = actionFailure ? this.actionFailureTemplateId : this.noRecordsTemplateId;
8668
8957
  const templatestring = actionFailure ? 'actionFailureTemplate' : 'noRecordsTemplate';
8669
- // eslint-disable-next-line
8670
8958
  const compiledString = this.templateComplier(template);
8671
8959
  let tempArr = compiledString({}, this, templatestring, templateId, this.isStringTemplate, undefined, this.noRecord);
8672
8960
  if (tempArr) {
@@ -8675,7 +8963,6 @@ let DropDownTree = class DropDownTree extends Component {
8675
8963
  }
8676
8964
  }
8677
8965
  else {
8678
- // eslint-disable-next-line
8679
8966
  const l10nLocale = { noRecordsTemplate: 'No Records Found', actionFailureTemplate: 'The Request Failed' };
8680
8967
  this.l10n = new L10n(this.getLocaleName(), l10nLocale, this.locale);
8681
8968
  this.noRecord.innerHTML = actionFailure ?
@@ -8906,10 +9193,10 @@ let DropDownTree = class DropDownTree extends Component {
8906
9193
  this.updateTreeSettings(newProp);
8907
9194
  break;
8908
9195
  case 'customTemplate':
8909
- if (this.mode !== "Custom") {
9196
+ if (this.mode !== 'Custom') {
8910
9197
  return;
8911
9198
  }
8912
- this.chipCollection.innerHTML = "";
9199
+ this.chipCollection.innerHTML = '';
8913
9200
  this.setTagValues();
8914
9201
  break;
8915
9202
  case 'sortOrder':
@@ -9059,6 +9346,16 @@ let DropDownTree = class DropDownTree extends Component {
9059
9346
  this.filterObj = null;
9060
9347
  }
9061
9348
  }
9349
+ destroyPopup() {
9350
+ this.isPopupOpen = false;
9351
+ if (this.isReact) {
9352
+ this.clearTemplate();
9353
+ }
9354
+ if (this.popupObj) {
9355
+ this.popupObj.destroy();
9356
+ detach(this.popupObj.element);
9357
+ }
9358
+ }
9062
9359
  /**
9063
9360
  * Ensures visibility of the Dropdown Tree item by using item value or item element.
9064
9361
  * If many Dropdown Tree items are present, and we are in need to find a particular item, then the `ensureVisible` property
@@ -9076,7 +9373,6 @@ let DropDownTree = class DropDownTree extends Component {
9076
9373
  * @param {string | Element} item - Specifies the value of Dropdown Tree item/ Dropdown Tree item element
9077
9374
  * @returns {'{[key: string]: Object }[]'} - returns the updated data source of the Dropdown Tree.
9078
9375
  */
9079
- // eslint-disable-next-line
9080
9376
  getData(item) {
9081
9377
  return this.treeObj.getTreeData(item);
9082
9378
  }
@@ -9101,6 +9397,10 @@ let DropDownTree = class DropDownTree extends Component {
9101
9397
  }
9102
9398
  }
9103
9399
  this.trigger('close', eventArgs);
9400
+ if (this.destroyPopupOnHide) {
9401
+ this.isFirstRender = true;
9402
+ this.destroyPopup();
9403
+ }
9104
9404
  }
9105
9405
  }
9106
9406
  /**
@@ -9151,7 +9451,7 @@ __decorate$2([
9151
9451
  Property('')
9152
9452
  ], DropDownTree.prototype, "cssClass", void 0);
9153
9453
  __decorate$2([
9154
- Property("${value.length} item(s) selected")
9454
+ Property('${value.length} item(s) selected')
9155
9455
  ], DropDownTree.prototype, "customTemplate", void 0);
9156
9456
  __decorate$2([
9157
9457
  Property(',')
@@ -9217,7 +9517,10 @@ __decorate$2([
9217
9517
  Property(false)
9218
9518
  ], DropDownTree.prototype, "showCheckBox", void 0);
9219
9519
  __decorate$2([
9220
- Property(false)
9520
+ Property(true)
9521
+ ], DropDownTree.prototype, "destroyPopupOnHide", void 0);
9522
+ __decorate$2([
9523
+ Property(true)
9221
9524
  ], DropDownTree.prototype, "enableHtmlSanitizer", void 0);
9222
9525
  __decorate$2([
9223
9526
  Property(true)
@@ -9402,8 +9705,12 @@ let ComboBox = class ComboBox extends DropDownList {
9402
9705
  this.setHiddenValue();
9403
9706
  }
9404
9707
  valueMuteChange(value) {
9708
+ value = this.allowObjectBinding && !isNullOrUndefined(value) ? getValue((this.fields.value) ? this.fields.value : '', value) : value;
9405
9709
  const inputValue = isNullOrUndefined(value) ? null : value.toString();
9406
9710
  Input.setValue(inputValue, this.inputElement, this.floatLabelType, this.showClearButton);
9711
+ if (this.allowObjectBinding) {
9712
+ value = this.getDataByValue(value);
9713
+ }
9407
9714
  this.setProperties({ value: value, text: value, index: null }, true);
9408
9715
  this.activeIndex = this.index;
9409
9716
  const fields = this.fields;
@@ -9412,35 +9719,39 @@ let ComboBox = class ComboBox extends DropDownList {
9412
9719
  dataItem[fields.value] = isNullOrUndefined(value) ? null : value.toString();
9413
9720
  this.itemData = dataItem;
9414
9721
  this.item = null;
9415
- if (this.previousValue !== this.value) {
9722
+ if ((!this.allowObjectBinding && (this.previousValue !== this.value)) || (this.allowObjectBinding && this.previousValue && this.value && !this.isObjectInArray(this.previousValue, [this.value]))) {
9416
9723
  this.detachChangeEvent(null);
9417
9724
  }
9418
9725
  }
9419
9726
  updateValues() {
9420
9727
  if (!isNullOrUndefined(this.value)) {
9421
- const li = this.getElementByValue(this.value);
9422
- let isExistItem = !isNullOrUndefined(li) ? true : false;
9728
+ let currentValue = this.allowObjectBinding && !isNullOrUndefined(this.value) ? getValue((this.fields.value) ? this.fields.value : '', this.value) : this.value;
9729
+ const li = this.getElementByValue(currentValue);
9730
+ let doesItemExist = !isNullOrUndefined(li) ? true : false;
9423
9731
  if (this.enableVirtualization && this.value) {
9424
9732
  const fields = (this.fields.value) ? this.fields.value : '';
9733
+ let currentValue = this.allowObjectBinding && !isNullOrUndefined(this.value) ? getValue((this.fields.value) ? this.fields.value : '', this.value) : this.value;
9425
9734
  if (this.dataSource instanceof DataManager && this.virtualGroupDataSource) {
9426
- const getItem = new DataManager(this.virtualGroupDataSource).executeLocal(new Query().where(new Predicate(fields, 'equal', this.value)));
9735
+ const getItem = new DataManager(this.virtualGroupDataSource).executeLocal(new Query().where(new Predicate(fields, 'equal', currentValue)));
9427
9736
  if (getItem && getItem.length > 0) {
9428
9737
  this.itemData = getItem[0];
9429
- isExistItem = true;
9738
+ doesItemExist = true;
9430
9739
  const dataItem = this.getItemData();
9740
+ let value = this.allowObjectBinding ? this.getDataByValue(dataItem.value) : dataItem.value;
9431
9741
  if ((this.value === dataItem.value && this.text !== dataItem.text) || (this.value !== dataItem.value && this.text === dataItem.text)) {
9432
- this.setProperties({ 'text': dataItem.text, 'value': dataItem.value });
9742
+ this.setProperties({ 'text': dataItem.text, 'value': value });
9433
9743
  }
9434
9744
  }
9435
9745
  }
9436
9746
  else {
9437
- const getItem = new DataManager(this.dataSource).executeLocal(new Query().where(new Predicate(fields, 'equal', this.value)));
9747
+ const getItem = new DataManager(this.dataSource).executeLocal(new Query().where(new Predicate(fields, 'equal', currentValue)));
9438
9748
  if (getItem && getItem.length > 0) {
9439
9749
  this.itemData = getItem[0];
9440
- isExistItem = true;
9750
+ doesItemExist = true;
9441
9751
  const dataItem = this.getItemData();
9752
+ let value = this.allowObjectBinding ? this.getDataByValue(dataItem.value) : dataItem.value;
9442
9753
  if ((this.value === dataItem.value && this.text !== dataItem.text) || (this.value !== dataItem.value && this.text === dataItem.text)) {
9443
- this.setProperties({ 'text': dataItem.text, 'value': dataItem.value });
9754
+ this.setProperties({ 'text': dataItem.text, 'value': value });
9444
9755
  }
9445
9756
  }
9446
9757
  }
@@ -9448,10 +9759,10 @@ let ComboBox = class ComboBox extends DropDownList {
9448
9759
  if (li) {
9449
9760
  this.setSelection(li, null);
9450
9761
  }
9451
- else if ((!this.enableVirtualization && this.allowCustom) || (this.allowCustom && this.enableVirtualization && !isExistItem)) {
9762
+ else if ((!this.enableVirtualization && this.allowCustom) || (this.allowCustom && this.enableVirtualization && !doesItemExist)) {
9452
9763
  this.valueMuteChange(this.value);
9453
9764
  }
9454
- else if (!this.enableVirtualization || (this.enableVirtualization && !isExistItem)) {
9765
+ else if (!this.enableVirtualization || (this.enableVirtualization && !doesItemExist)) {
9455
9766
  this.valueMuteChange(null);
9456
9767
  }
9457
9768
  }
@@ -9560,7 +9871,7 @@ let ComboBox = class ComboBox extends DropDownList {
9560
9871
  this.updateIncrementalView(0, this.itemCount);
9561
9872
  }
9562
9873
  activeItem = Search(inputValue, this.incrementalLiCollections, this.filterType, true, dataSource, this.fields, type);
9563
- while (isNullOrUndefined(activeItem) && this.incrementalEndIndex < this.totalItemCount) {
9874
+ while (isNullOrUndefined(activeItem.item) && this.incrementalEndIndex < this.totalItemCount) {
9564
9875
  this.incrementalStartIndex = this.incrementalEndIndex;
9565
9876
  this.incrementalEndIndex = this.incrementalEndIndex + 100 > this.totalItemCount ? this.totalItemCount : this.incrementalEndIndex + 100;
9566
9877
  this.updateIncrementalInfo(this.incrementalStartIndex, this.incrementalEndIndex);
@@ -9570,6 +9881,7 @@ let ComboBox = class ComboBox extends DropDownList {
9570
9881
  }
9571
9882
  activeItem = Search(inputValue, this.incrementalLiCollections, this.filterType, true, dataSource, this.fields, type);
9572
9883
  if (!isNullOrUndefined(activeItem)) {
9884
+ activeItem.index = activeItem.index + this.incrementalStartIndex;
9573
9885
  break;
9574
9886
  }
9575
9887
  if (isNullOrUndefined(activeItem) && this.incrementalEndIndex >= this.totalItemCount) {
@@ -9655,10 +9967,12 @@ let ComboBox = class ComboBox extends DropDownList {
9655
9967
  }
9656
9968
  }
9657
9969
  checkCustomValue() {
9658
- this.itemData = this.getDataByValue(this.value);
9970
+ const value = this.allowObjectBinding && !isNullOrUndefined(this.value) ? getValue((this.fields.value) ? this.fields.value : '', this.value) : this.value;
9971
+ this.itemData = this.getDataByValue(value);
9659
9972
  const dataItem = this.getItemData();
9973
+ const setValue$$1 = this.allowObjectBinding ? this.itemData : dataItem.value;
9660
9974
  if (!(this.allowCustom && isNullOrUndefined(dataItem.value) && isNullOrUndefined(dataItem.text))) {
9661
- this.setProperties({ 'value': dataItem.value }, !this.allowCustom);
9975
+ this.setProperties({ 'value': setValue$$1 }, !this.allowCustom);
9662
9976
  }
9663
9977
  }
9664
9978
  /**
@@ -9708,10 +10022,10 @@ let ComboBox = class ComboBox extends DropDownList {
9708
10022
  const currentValue = this.getTextByValue(activeElement.getAttribute('data-value')).toString();
9709
10023
  const currentFillValue = this.getFormattedValue(activeElement.getAttribute('data-value'));
9710
10024
  if (this.getModuleName() === 'combobox') {
9711
- if (!this.isSelected && this.previousValue !== currentFillValue) {
10025
+ if (!this.isSelected && ((!this.allowObjectBinding && this.previousValue !== currentFillValue)) || (this.allowObjectBinding && this.previousValue && currentFillValue && !this.isObjectInArray(this.previousValue, [this.getDataByValue(currentFillValue)]))) {
9712
10026
  this.updateSelectedItem(activeElement, null);
9713
10027
  this.isSelected = true;
9714
- this.previousValue = this.getFormattedValue(activeElement.getAttribute('data-value'));
10028
+ this.previousValue = this.allowObjectBinding ? this.getDataByValue(this.getFormattedValue(activeElement.getAttribute('data-value'))) : this.getFormattedValue(activeElement.getAttribute('data-value'));
9715
10029
  }
9716
10030
  else {
9717
10031
  this.updateSelectedItem(activeElement, null, true);
@@ -9880,15 +10194,17 @@ let ComboBox = class ComboBox extends DropDownList {
9880
10194
  super.dropDownClick(e);
9881
10195
  }
9882
10196
  customValue(e) {
9883
- const value = this.getValueByText(this.inputElement.value);
10197
+ let value = this.getValueByText(this.inputElement.value);
9884
10198
  if (!this.allowCustom && this.inputElement.value !== '') {
9885
10199
  const previousValue = this.previousValue;
9886
10200
  const currentValue = this.value;
10201
+ value = this.allowObjectBinding ? this.getDataByValue(value) : value;
9887
10202
  this.setProperties({ value: value });
9888
10203
  if (isNullOrUndefined(this.value)) {
9889
10204
  Input.setValue('', this.inputElement, this.floatLabelType, this.showClearButton);
9890
10205
  }
9891
- if (this.autofill && previousValue === this.value && currentValue !== this.value) {
10206
+ const newValue = this.allowObjectBinding && !isNullOrUndefined(this.value) ? getValue((this.fields.value) ? this.fields.value : '', this.value) : this.value;
10207
+ if (this.autofill && ((!this.allowObjectBinding && previousValue === this.value) || (this.allowObjectBinding && previousValue && this.isObjectInArray(previousValue, [this.value]))) && ((!this.allowObjectBinding && currentValue !== this.value) || (this.allowObjectBinding && currentValue && !this.isObjectInArray(currentValue, [this.value])))) {
9892
10208
  this.onChangeEvent(null);
9893
10209
  }
9894
10210
  }
@@ -9898,6 +10214,7 @@ let ComboBox = class ComboBox extends DropDownList {
9898
10214
  const value = this.inputElement.value === '' ? null : this.inputElement.value;
9899
10215
  // eslint-disable-next-line max-len
9900
10216
  const eventArgs = { text: value, item: {} };
10217
+ this.isObjectCustomValue = true;
9901
10218
  if (!this.initial) {
9902
10219
  this.trigger('customValueSpecifier', eventArgs, (eventArgs) => {
9903
10220
  this.updateCustomValueCallback(value, eventArgs, previousValue, e);
@@ -9909,8 +10226,9 @@ let ComboBox = class ComboBox extends DropDownList {
9909
10226
  }
9910
10227
  else {
9911
10228
  this.isSelectCustom = false;
10229
+ value = this.allowObjectBinding ? this.getDataByValue(value) : value;
9912
10230
  this.setProperties({ value: value });
9913
- if (previousValue !== this.value) {
10231
+ if ((!this.allowObjectBinding && previousValue !== this.value) || (this.allowObjectBinding && previousValue && this.value && !this.isObjectInArray(previousValue, [this.value]))) {
9914
10232
  this.onChangeEvent(e);
9915
10233
  }
9916
10234
  }
@@ -9931,16 +10249,28 @@ let ComboBox = class ComboBox extends DropDownList {
9931
10249
  setValue(fields.value, value, dataItem);
9932
10250
  }
9933
10251
  this.itemData = dataItem;
10252
+ const emptyObject = {};
10253
+ if (this.allowObjectBinding) {
10254
+ let keys = this.listData && this.listData.length > 0 ? Object.keys(this.listData[0]) : Object.keys(this.itemData);
10255
+ if ((!(this.listData && this.listData.length > 0)) && (this.getModuleName() === 'autocomplete' || (this.getModuleName() === 'combobox' && this.allowFiltering))) {
10256
+ keys = this.firstItem ? Object.keys(this.firstItem) : Object.keys(this.itemData);
10257
+ }
10258
+ // Create an empty object with predefined keys
10259
+ keys.forEach(key => {
10260
+ emptyObject[key] = ((key === fields.value) || (key === fields.text)) ? getValue(fields.value, this.itemData) : null;
10261
+ });
10262
+ }
9934
10263
  const changeData = {
9935
10264
  text: getValue(fields.text, this.itemData),
9936
- value: getValue(fields.value, this.itemData),
10265
+ value: this.allowObjectBinding ? emptyObject : getValue(fields.value, this.itemData),
9937
10266
  index: null
9938
10267
  };
9939
10268
  this.setProperties(changeData, true);
9940
10269
  this.setSelection(null, null);
9941
10270
  this.isSelectCustom = true;
9942
- if (previousValue !== this.value) {
9943
- this.onChangeEvent(e);
10271
+ this.isObjectCustomValue = false;
10272
+ if ((!this.allowObjectBinding && (previousValue !== this.value)) || (this.allowObjectBinding && ((previousValue == null && this.value !== null) || (previousValue && !this.isObjectInArray(previousValue, [this.value]))))) {
10273
+ this.onChangeEvent(e, true);
9944
10274
  }
9945
10275
  }
9946
10276
  /**
@@ -9954,7 +10284,7 @@ let ComboBox = class ComboBox extends DropDownList {
9954
10284
  onPropertyChanged(newProp, oldProp) {
9955
10285
  if (this.getModuleName() === 'combobox') {
9956
10286
  this.checkData(newProp);
9957
- this.setUpdateInitial(['fields', 'query', 'dataSource'], newProp);
10287
+ this.setUpdateInitial(['fields', 'query', 'dataSource'], newProp, oldProp);
9958
10288
  }
9959
10289
  for (const prop of Object.keys(newProp)) {
9960
10290
  switch (prop) {
@@ -10102,7 +10432,8 @@ let ComboBox = class ComboBox extends DropDownList {
10102
10432
  this.customValue(e);
10103
10433
  }
10104
10434
  }
10105
- if (isNullOrUndefined(this.listData) && this.allowCustom && !isNullOrUndefined(inputValue) && inputValue !== this.value) {
10435
+ let value = this.allowObjectBinding && !isNullOrUndefined(this.value) ? getValue((this.fields.value) ? this.fields.value : '', this.value) : this.value;
10436
+ if (isNullOrUndefined(this.listData) && this.allowCustom && !isNullOrUndefined(inputValue) && inputValue !== value) {
10106
10437
  this.customValue();
10107
10438
  }
10108
10439
  super.hidePopup(e);
@@ -10235,6 +10566,9 @@ __decorate$3([
10235
10566
  __decorate$3([
10236
10567
  Property(null)
10237
10568
  ], ComboBox.prototype, "value", void 0);
10569
+ __decorate$3([
10570
+ Property(false)
10571
+ ], ComboBox.prototype, "allowObjectBinding", void 0);
10238
10572
  ComboBox = __decorate$3([
10239
10573
  NotifyPropertyChanges
10240
10574
  ], ComboBox);
@@ -10294,8 +10628,9 @@ let AutoComplete = class AutoComplete extends ComboBox {
10294
10628
  }
10295
10629
  getQuery(query) {
10296
10630
  const filterQuery = query ? query.clone() : this.query ? this.query.clone() : new Query();
10297
- const filterType = (this.queryString === '' && !isNullOrUndefined(this.value)) ? 'equal' : this.filterType;
10298
- const queryString = (this.queryString === '' && !isNullOrUndefined(this.value)) ? this.value : this.queryString;
10631
+ let value = this.allowObjectBinding && !isNullOrUndefined(this.value) ? getValue((this.fields.value) ? this.fields.value : '', this.value) : this.value;
10632
+ const filterType = (this.queryString === '' && !isNullOrUndefined(value)) ? 'equal' : this.filterType;
10633
+ const queryString = (this.queryString === '' && !isNullOrUndefined(value)) ? value : this.queryString;
10299
10634
  if (this.isFiltered) {
10300
10635
  return filterQuery;
10301
10636
  }
@@ -10321,9 +10656,48 @@ let AutoComplete = class AutoComplete extends ComboBox {
10321
10656
  filterQuery.take(this.suggestionCount);
10322
10657
  }
10323
10658
  if (this.enableVirtualization && (!(this.dataSource instanceof DataManager) || (this.dataSource instanceof DataManager && this.virtualGroupDataSource))) {
10659
+ let queryTakeValue = 0;
10660
+ let querySkipValue = 0;
10661
+ if (this.query && this.query.queries.length > 0) {
10662
+ for (let queryElements = 0; queryElements < this.query.queries.length; queryElements++) {
10663
+ if (this.query.queries[queryElements].fn === 'onSkip') {
10664
+ querySkipValue = this.query.queries[queryElements].e.nos;
10665
+ }
10666
+ if (this.query.queries[queryElements].fn === 'onTake') {
10667
+ queryTakeValue = takeValue <= this.query.queries[queryElements].e.nos ? this.query.queries[queryElements].e.nos : takeValue;
10668
+ }
10669
+ }
10670
+ }
10671
+ let skipExists = false;
10672
+ let takeExists = false;
10673
+ if (filterQuery && filterQuery.queries.length > 0) {
10674
+ for (let queryElements = 0; queryElements < filterQuery.queries.length; queryElements++) {
10675
+ if (filterQuery.queries[queryElements].fn === 'onSkip') {
10676
+ skipExists = true;
10677
+ }
10678
+ if (filterQuery.queries[queryElements].fn === 'onTake') {
10679
+ takeExists = true;
10680
+ filterQuery.queries[queryElements].e.nos = filterQuery.queries[queryElements].e.nos <= queryTakeValue ? queryTakeValue : filterQuery.queries[queryElements].e.nos;
10681
+ }
10682
+ }
10683
+ }
10324
10684
  var takeValue = this.getTakeValue();
10325
- filterQuery.skip(this.virtualItemStartIndex);
10326
- filterQuery.take(takeValue);
10685
+ if (!skipExists) {
10686
+ if (querySkipValue > 0 && this.virtualItemStartIndex <= querySkipValue) {
10687
+ filterQuery.skip(querySkipValue);
10688
+ }
10689
+ else {
10690
+ filterQuery.skip(this.virtualItemStartIndex);
10691
+ }
10692
+ }
10693
+ if (!takeExists) {
10694
+ if (queryTakeValue > 0 && takeValue <= queryTakeValue) {
10695
+ filterQuery.take(queryTakeValue);
10696
+ }
10697
+ else {
10698
+ filterQuery.take(takeValue);
10699
+ }
10700
+ }
10327
10701
  filterQuery.requiresCount();
10328
10702
  }
10329
10703
  return filterQuery;
@@ -10331,6 +10705,7 @@ let AutoComplete = class AutoComplete extends ComboBox {
10331
10705
  searchLists(e) {
10332
10706
  this.isTyped = true;
10333
10707
  this.isDataFetched = this.isSelectCustom = false;
10708
+ this.firstItem = this.dataSource && this.dataSource.length > 0 ? this.dataSource[0] : null;
10334
10709
  this.checkAndResetCache();
10335
10710
  if (isNullOrUndefined(this.list)) {
10336
10711
  super.renderList(e, true);
@@ -10523,6 +10898,10 @@ let AutoComplete = class AutoComplete extends ComboBox {
10523
10898
  setInputValue(newProp, oldProp) {
10524
10899
  let oldValue = oldProp && oldProp.text ? oldProp.text : oldProp ? oldProp.value : oldProp;
10525
10900
  let value = newProp && newProp.text ? newProp.text : newProp && newProp.value ? newProp.value : this.value;
10901
+ if (this.allowObjectBinding) {
10902
+ oldValue = !isNullOrUndefined(oldValue) ? getValue((this.fields.value) ? this.fields.value : '', oldValue) : oldValue;
10903
+ value = !isNullOrUndefined(value) ? getValue((this.fields.value) ? this.fields.value : '', value) : value;
10904
+ }
10526
10905
  if (value && this.typedString === '' && !this.allowCustom && !(this.dataSource instanceof DataManager)) {
10527
10906
  let checkFields_1 = this.typeOfData(this.dataSource).typeof === 'string' ? '' : this.fields.value;
10528
10907
  const listLength = this.getItems().length;
@@ -10531,7 +10910,7 @@ let AutoComplete = class AutoComplete extends ComboBox {
10531
10910
  new DataManager(this.dataSource).executeQuery(query.where(new Predicate(checkFields_1, 'equal', value)))
10532
10911
  .then(function (e) {
10533
10912
  if (e.result.length > 0) {
10534
- _this.value = checkFields_1 !== '' ? e.result[0][_this.fields.value].toString() : e.result[0].toString();
10913
+ _this.value = checkFields_1 !== '' ? _this.allowObjectBinding ? e.result[0] : e.result[0][_this.fields.value].toString() : e.result[0].toString();
10535
10914
  _this.addItem(e.result, listLength);
10536
10915
  _this.updateValues();
10537
10916
  }
@@ -10939,8 +11318,12 @@ let MultiSelect = class MultiSelect extends DropDownBase {
10939
11318
  this.selectAllEventEle = [];
10940
11319
  this.resetMainList = null;
10941
11320
  this.resetFilteredData = false;
11321
+ this.preventSetCurrentData = false;
10942
11322
  this.scrollFocusStatus = false;
10943
11323
  this.keyDownStatus = false;
11324
+ this.IsScrollerAtEnd = function () {
11325
+ return this.list && this.list.scrollTop + this.list.clientHeight >= this.list.scrollHeight;
11326
+ };
10944
11327
  }
10945
11328
  enableRTL(state) {
10946
11329
  if (state) {
@@ -10956,7 +11339,10 @@ let MultiSelect = class MultiSelect extends DropDownBase {
10956
11339
  }
10957
11340
  requiredModules() {
10958
11341
  const modules = [];
10959
- if (this.mode === 'CheckBox') {
11342
+ if (this.enableVirtualization) {
11343
+ modules.push({ args: [this], member: 'VirtualScroll' });
11344
+ }
11345
+ if (this.mode === 'CheckBox') {
10960
11346
  this.isGroupChecking = this.enableGroupCheckBox;
10961
11347
  if (this.enableGroupCheckBox) {
10962
11348
  const prevOnChange = this.isProtectedOnChange;
@@ -11094,6 +11480,9 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11094
11480
  attributes(this.inputElement, { 'aria-expanded': 'true', 'aria-owns': this.element.id + '_popup', 'aria-controls': this.element.id });
11095
11481
  this.updateAriaActiveDescendant();
11096
11482
  if (this.isFirstClick) {
11483
+ if (this.enableVirtualization && this.mode === 'CheckBox' && this.value) {
11484
+ this.updateVirtualReOrderList();
11485
+ }
11097
11486
  this.loadTemplate();
11098
11487
  }
11099
11488
  if (this.mode === 'CheckBox' && this.showSelectAll) {
@@ -11102,6 +11491,33 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11102
11491
  }
11103
11492
  });
11104
11493
  }
11494
+ updateVirtualReOrderList(isCheckBoxUpdate) {
11495
+ let query = this.getForQuery(this.value, true).clone();
11496
+ this.resetList(this.dataSource, this.fields, query);
11497
+ this.UpdateSkeleton();
11498
+ this.liCollections = this.list.querySelectorAll('.' + dropDownBaseClasses.li);
11499
+ this.virtualItemCount = this.itemCount;
11500
+ if (this.mode !== 'CheckBox') {
11501
+ this.totalItemCount = this.value && this.value.length ? this.totalItemCount - this.value.length : this.totalItemCount;
11502
+ }
11503
+ if (!this.list.querySelector('.e-virtual-ddl')) {
11504
+ var virualElement = this.createElement('div', {
11505
+ id: this.element.id + '_popup', className: 'e-virtual-ddl', styles: this.GetVirtualTrackHeight()
11506
+ });
11507
+ this.popupWrapper.querySelector('.e-dropdownbase').appendChild(virualElement);
11508
+ }
11509
+ else {
11510
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11511
+ this.list.getElementsByClassName('e-virtual-ddl')[0].style = this.GetVirtualTrackHeight();
11512
+ }
11513
+ if (this.list.querySelector('.e-virtual-ddl-content')) {
11514
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11515
+ this.list.getElementsByClassName('e-virtual-ddl-content')[0].style = this.getTransformValues();
11516
+ }
11517
+ if (isCheckBoxUpdate) {
11518
+ this.loadTemplate();
11519
+ }
11520
+ }
11105
11521
  updateListItems(listItems, mainListItems) {
11106
11522
  for (let i = 0; i < listItems.length; i++) {
11107
11523
  this.findGroupStart(listItems[i]);
@@ -11111,19 +11527,33 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11111
11527
  }
11112
11528
  loadTemplate() {
11113
11529
  this.refreshListItems(null);
11530
+ if (this.enableVirtualization && this.list && this.mode === 'CheckBox') {
11531
+ var reOrderList = this.list.querySelectorAll('.e-reorder')[0];
11532
+ if (this.list.querySelector('.e-virtual-ddl-content') && reOrderList) {
11533
+ this.list.querySelector('.e-virtual-ddl-content').removeChild(reOrderList);
11534
+ }
11535
+ }
11114
11536
  if (this.mode === 'CheckBox') {
11115
11537
  this.removeFocus();
11116
11538
  }
11117
11539
  this.notify('reOrder', { module: 'CheckBoxSelection', enable: this.mode === 'CheckBox', e: this });
11540
+ this.isPreventScrollAction = true;
11118
11541
  }
11119
11542
  setScrollPosition() {
11120
11543
  if (((!this.hideSelectedItem && this.mode !== 'CheckBox') || (this.mode === 'CheckBox' && !this.enableSelectionOrder)) &&
11121
11544
  (!isNullOrUndefined(this.value) && (this.value.length > 0))) {
11122
- const valueEle = this.findListElement((this.hideSelectedItem ? this.ulElement : this.list), 'li', 'data-value', this.value[this.value.length - 1]);
11545
+ const value = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', this.value[this.value.length - 1]) : this.value[this.value.length - 1];
11546
+ const valueEle = this.findListElement((this.hideSelectedItem ? this.ulElement : this.list), 'li', 'data-value', value);
11123
11547
  if (!isNullOrUndefined(valueEle)) {
11124
11548
  this.scrollBottom(valueEle);
11125
11549
  }
11126
11550
  }
11551
+ if (this.enableVirtualization) {
11552
+ const focusedItem = this.list.querySelector('.' + dropDownBaseClasses.focus);
11553
+ if (focusedItem) {
11554
+ this.scrollBottom(focusedItem);
11555
+ }
11556
+ }
11127
11557
  }
11128
11558
  focusAtFirstListItem() {
11129
11559
  if (this.ulElement && this.ulElement.querySelector('li.'
@@ -11134,9 +11564,15 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11134
11564
  return;
11135
11565
  }
11136
11566
  else {
11137
- element = this.ulElement.querySelector('li.'
11138
- + dropDownBaseClasses.li + ':not(.'
11139
- + HIDE_LIST + ')');
11567
+ if (this.enableVirtualization) {
11568
+ element = this.ulElement.querySelector('li.'
11569
+ + dropDownBaseClasses.li + ':not(.e-virtual-list)' + ':not(.e-hide-listitem)');
11570
+ }
11571
+ else {
11572
+ element = this.ulElement.querySelector('li.'
11573
+ + dropDownBaseClasses.li + ':not(.'
11574
+ + HIDE_LIST + ')');
11575
+ }
11140
11576
  }
11141
11577
  if (element !== null) {
11142
11578
  this.removeFocus();
@@ -11151,7 +11587,8 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11151
11587
  }
11152
11588
  else {
11153
11589
  if (this.value && this.value.length) {
11154
- Search(this.value[this.value.length - 1], this.liCollections, 'StartsWith', this.ignoreCase);
11590
+ const value = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), this.value[this.value.length - 1]) : this.value[this.value.length - 1];
11591
+ Search(value, this.liCollections, 'StartsWith', this.ignoreCase);
11155
11592
  }
11156
11593
  else {
11157
11594
  activeElement = null;
@@ -11159,7 +11596,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11159
11596
  }
11160
11597
  if (activeElement && activeElement.item !== null) {
11161
11598
  this.addListFocus(activeElement.item);
11162
- if (((this.allowCustomValue || this.allowFiltering) && this.isPopupOpen() && this.closePopupOnSelect) || this.closePopupOnSelect) {
11599
+ if (((this.allowCustomValue || this.allowFiltering) && this.isPopupOpen() && this.closePopupOnSelect && !this.enableVirtualization) || this.closePopupOnSelect && !this.enableVirtualization) {
11163
11600
  this.scrollBottom(activeElement.item, activeElement.index);
11164
11601
  }
11165
11602
  }
@@ -11201,9 +11638,9 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11201
11638
  const elements = this.chipCollectionWrapper.querySelectorAll('span.' + CHIP$1);
11202
11639
  const value = elements[elements.length - 1].getAttribute('data-value');
11203
11640
  if (!isNullOrUndefined(this.value)) {
11204
- this.tempValues = this.value.slice();
11641
+ this.tempValues = this.allowObjectBinding ? this.value.slice() : this.value.slice();
11205
11642
  }
11206
- let customValue = this.getFormattedValue(value);
11643
+ let customValue = this.allowObjectBinding ? this.getDataByValue(value) : this.getFormattedValue(value);
11207
11644
  if (this.allowCustomValue && (value !== 'false' && customValue === false || (!isNullOrUndefined(customValue) &&
11208
11645
  customValue.toString() === 'NaN'))) {
11209
11646
  customValue = value;
@@ -11229,15 +11666,43 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11229
11666
  }
11230
11667
  return this.targetInputElement.value;
11231
11668
  }
11232
- getForQuery(valuecheck) {
11669
+ getForQuery(valuecheck, isCheckbox) {
11233
11670
  let predicate;
11234
11671
  const field = isNullOrUndefined(this.fields.value) ? this.fields.text : this.fields.value;
11235
- for (let i = 0; i < valuecheck.length; i++) {
11236
- if (i === 0) {
11237
- predicate = new Predicate(field, 'equal', valuecheck[i]);
11672
+ if (this.enableVirtualization) {
11673
+ if (isCheckbox) {
11674
+ for (let i = 0; i < valuecheck.length; i++) {
11675
+ const value = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', valuecheck[i]) : valuecheck[i];
11676
+ if (i === 0) {
11677
+ predicate = new Predicate(field, 'equal', value);
11678
+ }
11679
+ else {
11680
+ predicate = predicate.or(field, 'equal', value);
11681
+ }
11682
+ }
11683
+ return new Query().where(predicate);
11238
11684
  }
11239
11685
  else {
11240
- predicate = predicate.or(field, 'equal', valuecheck[i]);
11686
+ for (let i = 0; i < valuecheck.length; i++) {
11687
+ const value = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', valuecheck[i]) : valuecheck[i];
11688
+ if (i === 0) {
11689
+ predicate = new Predicate(field, 'notequal', value);
11690
+ }
11691
+ else {
11692
+ predicate = predicate.and(field, 'notequal', value);
11693
+ }
11694
+ }
11695
+ return new Query().where(predicate);
11696
+ }
11697
+ }
11698
+ else {
11699
+ for (let i = 0; i < valuecheck.length; i++) {
11700
+ if (i === 0) {
11701
+ predicate = new Predicate(field, 'equal', valuecheck[i]);
11702
+ }
11703
+ else {
11704
+ predicate = predicate.or(field, 'equal', valuecheck[i]);
11705
+ }
11241
11706
  }
11242
11707
  }
11243
11708
  if (this.dataSource instanceof DataManager && this.dataSource.adaptor instanceof JsonAdaptor) {
@@ -11249,14 +11714,20 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11249
11714
  }
11250
11715
  /* eslint-disable @typescript-eslint/no-unused-vars */
11251
11716
  onActionComplete(ulElement, list, e, isUpdated) {
11717
+ if (this.dataSource instanceof DataManager && !isNullOrUndefined(e) && !this.virtualGroupDataSource) {
11718
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11719
+ this.totalItemCount = e.count;
11720
+ }
11252
11721
  /* eslint-enable @typescript-eslint/no-unused-vars */
11253
11722
  super.onActionComplete(ulElement, list, e);
11723
+ this.skeletonCount = this.totalItemCount != 0 && this.totalItemCount < (this.itemCount * 2) ? 0 : this.skeletonCount;
11254
11724
  this.updateSelectElementData(this.allowFiltering);
11255
11725
  // eslint-disable-next-line @typescript-eslint/no-this-alias
11256
11726
  const proxy = this;
11257
- if (!isNullOrUndefined(this.value) && !this.allowCustomValue) {
11727
+ if (!isNullOrUndefined(this.value) && !this.allowCustomValue && !this.enableVirtualization) {
11258
11728
  for (let i = 0; i < this.value.length; i++) {
11259
- const checkEle = this.findListElement(((this.allowFiltering && !isNullOrUndefined(this.mainList)) ? this.mainList : ulElement), 'li', 'data-value', proxy.value[i]);
11729
+ const value = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', proxy.value[i]) : proxy.value[i];
11730
+ const checkEle = this.findListElement(((this.allowFiltering && !isNullOrUndefined(this.mainList)) ? this.mainList : ulElement), 'li', 'data-value', value);
11260
11731
  if (!checkEle && !(this.dataSource instanceof DataManager)) {
11261
11732
  this.value.splice(i, 1);
11262
11733
  i -= 1;
@@ -11344,7 +11815,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11344
11815
  dropDownBaseClasses.selected;
11345
11816
  if (!isNullOrUndefined(this.value)) {
11346
11817
  for (let index = 0; !isNullOrUndefined(this.value[index]); index++) {
11347
- value = this.value[index];
11818
+ value = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', this.value[index]) : this.value[index];
11348
11819
  element = this.findListElement(this.list, 'li', 'data-value', value);
11349
11820
  if (element) {
11350
11821
  addClass([element], className);
@@ -11443,13 +11914,13 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11443
11914
  checkSelectAll() {
11444
11915
  const groupItemLength = this.list.querySelectorAll('li.e-list-group-item.e-active').length;
11445
11916
  const listItem = this.list.querySelectorAll('li.e-list-item');
11446
- const searchCount = this.list.querySelectorAll('li.' + dropDownBaseClasses.li).length;
11917
+ const searchCount = this.enableVirtualization ? this.list.querySelectorAll('li.' + dropDownBaseClasses.li + ':not(.e-virtual-list)').length : this.list.querySelectorAll('li.' + dropDownBaseClasses.li).length;
11447
11918
  let searchActiveCount = this.list.querySelectorAll('li.' + dropDownBaseClasses.selected).length;
11448
11919
  if (this.enableGroupCheckBox && !isNullOrUndefined(this.fields.groupBy)) {
11449
11920
  searchActiveCount = searchActiveCount - groupItemLength;
11450
11921
  }
11451
- if ((searchCount === searchActiveCount || searchActiveCount === this.maximumSelectionLength)
11452
- && (this.mode === 'CheckBox' && this.showSelectAll)) {
11922
+ if ((!this.enableVirtualization && ((searchCount === searchActiveCount || searchActiveCount === this.maximumSelectionLength)
11923
+ && (this.mode === 'CheckBox' && this.showSelectAll))) || (this.enableVirtualization && this.mode === 'CheckBox' && this.showSelectAll && this.virtualSelectAll && this.value && this.value.length === this.totalItemCount)) {
11453
11924
  this.notify('checkSelectAll', { module: 'CheckBoxSelection', enable: this.mode === 'CheckBox', value: 'check' });
11454
11925
  }
11455
11926
  else if ((searchCount !== searchActiveCount) && (this.mode === 'CheckBox' && this.showSelectAll)) {
@@ -11486,7 +11957,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11486
11957
  }
11487
11958
  this.isValidKey = (this.isPopupOpen() && e.keyCode === 8) || this.isValidKey;
11488
11959
  this.isValidKey = e.ctrlKey && e.keyCode === 86 ? false : this.isValidKey;
11489
- if (this.isValidKey) {
11960
+ if (this.isValidKey && this.inputElement) {
11490
11961
  this.isValidKey = false;
11491
11962
  this.expandTextbox();
11492
11963
  this.showOverAllClear();
@@ -11516,7 +11987,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11516
11987
  return filterQuery;
11517
11988
  }
11518
11989
  if (this.filterAction) {
11519
- if (this.targetElement() !== null) {
11990
+ if ((this.targetElement() !== null && !this.enableVirtualization) || (this.enableVirtualization && this.targetElement() !== null && this.targetElement().trim() !== '')) {
11520
11991
  const dataType = this.typeOfData(this.dataSource).typeof;
11521
11992
  if (!(this.dataSource instanceof DataManager) && dataType === 'string' || dataType === 'number') {
11522
11993
  filterQuery.where('', this.filterType, this.targetElement(), this.ignoreCase, this.ignoreAccent);
@@ -11526,21 +11997,89 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11526
11997
  filterQuery.where(!isNullOrUndefined(fields.text) ? fields.text : '', this.filterType, this.targetElement(), this.ignoreCase, this.ignoreAccent);
11527
11998
  }
11528
11999
  }
12000
+ if (this.enableVirtualization && (this.viewPortInfo.endIndex != 0) && !this.virtualSelectAll) {
12001
+ return this.virtualFilterQuery(filterQuery);
12002
+ }
11529
12003
  return filterQuery;
11530
12004
  }
11531
12005
  else {
12006
+ if (this.enableVirtualization && (this.viewPortInfo.endIndex != 0) && !this.virtualSelectAll && (!(this.dataSource instanceof DataManager) || (this.dataSource instanceof DataManager && this.virtualGroupDataSource))) {
12007
+ return this.virtualFilterQuery(filterQuery);
12008
+ }
11532
12009
  return query ? query : this.query ? this.query : new Query();
11533
12010
  }
11534
12011
  }
12012
+ virtualFilterQuery(filterQuery) {
12013
+ var takeValue = this.getTakeValue();
12014
+ var isReOrder = true;
12015
+ var isSkip = true;
12016
+ var isTake = true;
12017
+ for (let queryElements = 0; queryElements < filterQuery.queries.length; queryElements++) {
12018
+ if (this.getModuleName() === 'multiselect' && ((filterQuery.queries[queryElements].e && filterQuery.queries[queryElements].e.condition == 'or') || (filterQuery.queries[queryElements].e && filterQuery.queries[queryElements].e.operator == 'equal'))) {
12019
+ isReOrder = false;
12020
+ }
12021
+ if (filterQuery.queries[queryElements].fn === 'onSkip') {
12022
+ isSkip = false;
12023
+ }
12024
+ if (filterQuery.queries[queryElements].fn === 'onTake') {
12025
+ isTake = false;
12026
+ }
12027
+ }
12028
+ if ((this.allowFiltering && isSkip) || !isReOrder || (!this.allowFiltering && isSkip)) {
12029
+ if (!isReOrder) {
12030
+ filterQuery.skip(this.viewPortInfo.startIndex);
12031
+ }
12032
+ else {
12033
+ filterQuery.skip(this.virtualItemStartIndex);
12034
+ }
12035
+ }
12036
+ if (isTake) {
12037
+ if (this.isIncrementalRequest) {
12038
+ filterQuery.take(this.incrementalEndIndex);
12039
+ }
12040
+ else {
12041
+ filterQuery.take(takeValue);
12042
+ }
12043
+ }
12044
+ filterQuery.requiresCount();
12045
+ return filterQuery;
12046
+ }
12047
+ getTakeValue() {
12048
+ return this.allowFiltering && Browser.isDevice ? Math.round(window.outerHeight / this.listItemHeight) : this.itemCount;
12049
+ }
11535
12050
  dataUpdater(dataSource, query, fields) {
11536
12051
  this.isDataFetched = false;
12052
+ let isNoData = this.list.classList.contains(dropDownBaseClasses.noData);
11537
12053
  if (this.targetElement().trim() === '') {
11538
- const list = this.mainList.cloneNode ? this.mainList.cloneNode(true) : this.mainList;
12054
+ const list = this.enableVirtualization ? this.list.cloneNode(true) : this.mainList.cloneNode ? this.mainList.cloneNode(true) : this.mainList;
11539
12055
  if (this.backCommand) {
11540
12056
  this.remoteCustomValue = false;
11541
12057
  if (this.allowCustomValue && list.querySelectorAll('li').length == 0 && this.mainData.length > 0) {
11542
12058
  this.mainData = [];
11543
12059
  }
12060
+ if (this.enableVirtualization) {
12061
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12062
+ this.totalItemCount = this.dataSource && this.dataSource.length ? this.dataSource.length : 0;
12063
+ this.resetList(dataSource, fields, query);
12064
+ if (this.mode !== 'CheckBox') {
12065
+ this.totalItemCount = this.value && this.value.length ? this.totalItemCount - this.value.length : this.totalItemCount;
12066
+ }
12067
+ this.UpdateSkeleton();
12068
+ if ((isNoData || this.allowCustomValue) && !this.list.classList.contains(dropDownBaseClasses.noData)) {
12069
+ if (!this.list.querySelector('.e-virtual-ddl-content')) {
12070
+ this.list.appendChild(this.createElement('div', {
12071
+ className: 'e-virtual-ddl-content',
12072
+ styles: this.getTransformValues()
12073
+ })).appendChild(this.list.querySelector('.e-list-parent'));
12074
+ }
12075
+ if (!this.list.querySelector('.e-virtual-ddl')) {
12076
+ var virualElement = this.createElement('div', {
12077
+ id: this.element.id + '_popup', className: 'e-virtual-ddl', styles: this.GetVirtualTrackHeight()
12078
+ });
12079
+ document.getElementsByClassName('e-popup')[0].querySelector('.e-dropdownbase').appendChild(virualElement);
12080
+ }
12081
+ }
12082
+ }
11544
12083
  this.onActionComplete(list, this.mainData);
11545
12084
  if (this.value && this.value.length) {
11546
12085
  this.refreshSelection();
@@ -11552,7 +12091,30 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11552
12091
  }
11553
12092
  }
11554
12093
  else {
12094
+ if (this.enableVirtualization && this.allowFiltering) {
12095
+ this.isPreventScrollAction = true;
12096
+ this.list.scrollTop = 0;
12097
+ this.previousStartIndex = 0;
12098
+ this.virtualListInfo = null;
12099
+ }
11555
12100
  this.resetList(dataSource, fields, query);
12101
+ if (this.enableVirtualization && (isNoData || this.allowCustomValue) && !this.list.classList.contains(dropDownBaseClasses.noData)) {
12102
+ if (!this.list.querySelector('.e-virtual-ddl-content')) {
12103
+ this.list.appendChild(this.createElement('div', {
12104
+ className: 'e-virtual-ddl-content',
12105
+ styles: this.getTransformValues()
12106
+ })).appendChild(this.list.querySelector('.e-list-parent'));
12107
+ }
12108
+ if (this.mode !== 'CheckBox') {
12109
+ this.totalItemCount = this.value && this.value.length ? this.totalItemCount - this.value.length : this.totalItemCount;
12110
+ }
12111
+ if (!this.list.querySelector('.e-virtual-ddl')) {
12112
+ var virualElement = this.createElement('div', {
12113
+ id: this.element.id + '_popup', className: 'e-virtual-ddl', styles: this.GetVirtualTrackHeight()
12114
+ });
12115
+ document.getElementsByClassName('e-popup')[0].querySelector('.e-dropdownbase').appendChild(virualElement);
12116
+ }
12117
+ }
11556
12118
  if (this.allowCustomValue) {
11557
12119
  if (!(dataSource instanceof DataManager)) {
11558
12120
  this.checkForCustomValue(query, fields);
@@ -11563,6 +12125,9 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11563
12125
  }
11564
12126
  }
11565
12127
  }
12128
+ if (this.enableVirtualization && this.allowFiltering) {
12129
+ this.getFilteringSkeletonCount();
12130
+ }
11566
12131
  this.refreshPopup();
11567
12132
  if (this.mode === 'CheckBox') {
11568
12133
  this.removeFocus();
@@ -11576,7 +12141,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11576
12141
  const customData = (!isNullOrUndefined(this.mainData) && this.mainData.length > 0) ?
11577
12142
  this.mainData[0] : this.mainData;
11578
12143
  if (customData && typeof (customData) !== 'string' && typeof (customData) !== 'number' && typeof (customData) !== 'boolean') {
11579
- const dataItem = {};
12144
+ let dataItem = {};
11580
12145
  setValue(field.text, value, dataItem);
11581
12146
  if (typeof getValue((this.fields.value ? this.fields.value : 'value'), customData)
11582
12147
  === 'number') {
@@ -11585,9 +12150,34 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11585
12150
  else {
11586
12151
  setValue(field.value, value, dataItem);
11587
12152
  }
11588
- const tempData = JSON.parse(JSON.stringify(this.listData));
11589
- tempData.splice(0, 0, dataItem);
11590
- this.resetList(tempData, field, query);
12153
+ const emptyObject = {};
12154
+ if (this.allowObjectBinding) {
12155
+ let keys = this.listData && this.listData.length > 0 ? Object.keys(this.listData[0]) : this.firstItem ? Object.keys(this.firstItem) : Object.keys(dataItem);
12156
+ // Create an empty object with predefined keys
12157
+ keys.forEach(key => {
12158
+ emptyObject[key] = ((key === fields.value) || (key === fields.text)) ? getValue(fields.value, dataItem) : null;
12159
+ });
12160
+ }
12161
+ dataItem = this.allowObjectBinding ? emptyObject : dataItem;
12162
+ if (this.enableVirtualization) {
12163
+ this.virtualCustomData = dataItem;
12164
+ let tempData = this.virtualGroupDataSource ? JSON.parse(JSON.stringify(this.virtualGroupDataSource)) : JSON.parse(JSON.stringify(this.dataSource));
12165
+ let totalData = [];
12166
+ if (this.virtualCustomSelectData && this.virtualCustomSelectData.length > 0) {
12167
+ totalData = tempData.concat(this.virtualCustomSelectData);
12168
+ }
12169
+ tempData.splice(0, 0, dataItem);
12170
+ this.isCustomDataUpdated = true;
12171
+ this.viewPortInfo.startIndex = this.virtualItemStartIndex = 0;
12172
+ this.viewPortInfo.endIndex = this.virtualItemEndIndex = this.itemCount;
12173
+ this.resetList(tempData, field, query);
12174
+ this.isCustomDataUpdated = false;
12175
+ }
12176
+ else {
12177
+ const tempData = JSON.parse(JSON.stringify(this.listData));
12178
+ tempData.splice(0, 0, dataItem);
12179
+ this.resetList(tempData, field, query);
12180
+ }
11591
12181
  }
11592
12182
  else if (this.listData) {
11593
12183
  const tempData = JSON.parse(JSON.stringify(this.listData));
@@ -11621,6 +12211,8 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11621
12211
  }
11622
12212
  wrapperClick(e) {
11623
12213
  this.setDynValue = false;
12214
+ this.keyboardEvent = null;
12215
+ this.isKeyBoardAction = false;
11624
12216
  if (!this.enabled) {
11625
12217
  return;
11626
12218
  }
@@ -11820,8 +12412,8 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11820
12412
  if (this.initStatus && this.validateValues(newValue, oldValue)) {
11821
12413
  const eventArgs = {
11822
12414
  e: event,
11823
- oldValue: oldVal,
11824
- value: newVal,
12415
+ oldValue: this.allowObjectBinding ? oldVal : oldVal,
12416
+ value: this.allowObjectBinding ? newVal : newVal,
11825
12417
  isInteracted: event ? true : false,
11826
12418
  element: this.element,
11827
12419
  event: event
@@ -11837,13 +12429,14 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11837
12429
  this.dispatchEvent(this.hiddenElement, 'change');
11838
12430
  }
11839
12431
  }
12432
+ this.selectedValueInfo = this.viewPortInfo;
11840
12433
  }
11841
12434
  updateTempValue() {
11842
12435
  if (!this.value) {
11843
12436
  this.tempValues = this.value;
11844
12437
  }
11845
12438
  else {
11846
- this.tempValues = this.value.slice();
12439
+ this.tempValues = this.allowObjectBinding ? this.value.slice() : this.value.slice();
11847
12440
  }
11848
12441
  }
11849
12442
  updateAriaActiveDescendant() {
@@ -11851,26 +12444,44 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11851
12444
  attributes(this.inputElement, { 'aria-activedescendant': this.ulElement.getElementsByClassName('e-item-focus')[0].id });
11852
12445
  }
11853
12446
  }
11854
- getPagingCount() {
11855
- const height = this.list.classList.contains(dropDownBaseClasses.noData) ? null :
11856
- getComputedStyle(this.getItems()[0], null).getPropertyValue('height');
11857
- return Math.round(this.list.offsetHeight / parseInt(height, 10));
11858
- }
11859
- pageUpSelection(steps) {
12447
+ pageUpSelection(steps, isVirtualKeyAction) {
11860
12448
  const collection = this.list.querySelectorAll('li.'
11861
12449
  + dropDownBaseClasses.li + ':not(.' + HIDE_LIST + ')' + ':not(.e-reorder-hide)');
11862
- const previousItem = steps >= 0 ? collection[steps + 1] : collection[0];
11863
- this.addListFocus(previousItem);
11864
- this.scrollBottom(previousItem, this.getIndexByValue(previousItem.getAttribute('data-value')));
12450
+ let previousItem = steps >= 0 ? collection[steps + 1] : collection[0];
12451
+ if (this.enableVirtualization && isVirtualKeyAction) {
12452
+ previousItem = steps >= 0 && this.viewPortInfo.startIndex != 0 ? this.liCollections[steps + this.skeletonCount + 1] : this.liCollections[this.skeletonCount];
12453
+ }
12454
+ if (!isNullOrUndefined(previousItem) && previousItem.classList.contains('e-virtual-list')) {
12455
+ previousItem = this.liCollections[this.skeletonCount];
12456
+ }
12457
+ if (this.enableVirtualization) {
12458
+ if (!isNullOrUndefined(previousItem) && !previousItem.classList.contains('e-item-focus')) {
12459
+ this.addListFocus(previousItem);
12460
+ this.scrollTop(previousItem, this.getIndexByValue(previousItem.getAttribute('data-value')), this.keyboardEvent.keyCode);
12461
+ }
12462
+ else if (this.viewPortInfo.startIndex == 0) {
12463
+ this.scrollTop(previousItem, this.getIndexByValue(previousItem.getAttribute('data-value')), this.keyboardEvent.keyCode);
12464
+ }
12465
+ }
12466
+ else {
12467
+ this.addListFocus(previousItem);
12468
+ this.scrollTop(previousItem, this.getIndexByValue(previousItem.getAttribute('data-value')), this.keyboardEvent.keyCode);
12469
+ }
11865
12470
  }
11866
- pageDownSelection(steps) {
12471
+ pageDownSelection(steps, isVirtualKeyAction) {
11867
12472
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
11868
12473
  const list = this.getItems();
11869
12474
  const collection = this.list.querySelectorAll('li.'
11870
12475
  + dropDownBaseClasses.li + ':not(.' + HIDE_LIST + ')' + ':not(.e-reorder-hide)');
11871
- const previousItem = steps <= collection.length ? collection[steps - 1] : collection[collection.length - 1];
12476
+ let previousItem = steps <= collection.length ? collection[steps - 1] : collection[collection.length - 1];
12477
+ if (this.enableVirtualization && this.skeletonCount > 0) {
12478
+ previousItem = steps < list.length ? this.liCollections[steps] : this.liCollections[list.length - 1];
12479
+ }
12480
+ if (this.enableVirtualization && isVirtualKeyAction) {
12481
+ previousItem = steps <= list.length ? this.liCollections[steps] : this.liCollections[list.length - 1];
12482
+ }
11872
12483
  this.addListFocus(previousItem);
11873
- this.scrollBottom(previousItem, this.getIndexByValue(previousItem.getAttribute('data-value')));
12484
+ this.scrollBottom(previousItem, this.getIndexByValue(previousItem.getAttribute('data-value')), false, this.keyboardEvent.keyCode);
11874
12485
  }
11875
12486
  getItems() {
11876
12487
  if (!this.list) {
@@ -11988,21 +12599,110 @@ let MultiSelect = class MultiSelect extends DropDownBase {
11988
12599
  }
11989
12600
  }
11990
12601
  }
11991
- homeNavigation(isHome) {
12602
+ homeNavigation(isHome, isVirtualKeyAction) {
11992
12603
  this.removeFocus();
12604
+ if (this.enableVirtualization) {
12605
+ if (isHome) {
12606
+ if (this.enableVirtualization && this.viewPortInfo.startIndex !== 0) {
12607
+ this.viewPortInfo.startIndex = 0;
12608
+ this.viewPortInfo.endIndex = this.itemCount;
12609
+ this.updateVirtualItemIndex();
12610
+ this.resetList(this.dataSource, this.fields, this.query);
12611
+ }
12612
+ }
12613
+ else {
12614
+ if (this.enableVirtualization && ((!this.value && this.viewPortInfo.endIndex !== this.totalItemCount) || (this.value && this.value.length > 0 && this.viewPortInfo.endIndex !== this.totalItemCount + this.value.length))) {
12615
+ this.viewPortInfo.startIndex = this.totalItemCount - this.itemCount;
12616
+ this.viewPortInfo.endIndex = this.totalItemCount;
12617
+ this.updateVirtualItemIndex();
12618
+ let query = new Query().clone();
12619
+ if (this.value && this.value.length > 0) {
12620
+ query = this.getForQuery(this.value).clone();
12621
+ query = query.skip(this.totalItemCount - this.itemCount);
12622
+ }
12623
+ this.resetList(this.dataSource, this.fields, query);
12624
+ }
12625
+ }
12626
+ }
12627
+ this.UpdateSkeleton();
11993
12628
  const scrollEle = this.ulElement.querySelectorAll('li.' + dropDownBaseClasses.li
11994
12629
  + ':not(.' + HIDE_LIST + ')' + ':not(.e-reorder-hide)');
11995
12630
  if (scrollEle.length > 0) {
11996
- const element = scrollEle[(isHome) ? 0 : (scrollEle.length - 1)];
12631
+ let element = scrollEle[(isHome) ? 0 : (scrollEle.length - 1)];
12632
+ if (this.enableVirtualization && isHome) {
12633
+ element = scrollEle[this.skeletonCount];
12634
+ }
12635
+ this.removeFocus();
11997
12636
  element.classList.add(dropDownBaseClasses.focus);
11998
- this.scrollBottom(element);
12637
+ if (this.enableVirtualization && isHome) {
12638
+ this.scrollTop(element, undefined, this.keyboardEvent.keyCode);
12639
+ }
12640
+ else if (!isVirtualKeyAction) {
12641
+ this.scrollBottom(element, undefined, false, this.keyboardEvent.keyCode);
12642
+ }
11999
12643
  this.updateAriaActiveDescendant();
12000
12644
  }
12001
12645
  }
12646
+ updateSelectionList() {
12647
+ if (!isNullOrUndefined(this.value) && this.value.length) {
12648
+ for (let index = 0; index < this.value.length; index++) {
12649
+ const value = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), this.value[index]) : this.value[index];
12650
+ let selectedItem = this.getElementByValue(value);
12651
+ if (selectedItem && !selectedItem.classList.contains(dropDownBaseClasses.selected)) {
12652
+ selectedItem.classList.add('e-active');
12653
+ }
12654
+ }
12655
+ }
12656
+ }
12657
+ handleVirtualKeyboardActions(e, pageCount) {
12658
+ const focusedItem = this.list.querySelector('.' + dropDownBaseClasses.focus);
12659
+ let activeIndex;
12660
+ this.isKeyBoardAction = true;
12661
+ switch (e.keyCode) {
12662
+ case 40:
12663
+ this.arrowDown(e, true);
12664
+ break;
12665
+ case 38:
12666
+ this.arrowUp(e, true);
12667
+ break;
12668
+ case 33:
12669
+ e.preventDefault();
12670
+ if (focusedItem) {
12671
+ var count = (this.getPageCount() * 2) - 4;
12672
+ activeIndex = Math.round(count);
12673
+ activeIndex = this.getIndexByValue(focusedItem.getAttribute('data-value'));
12674
+ this.pageUpSelection(activeIndex - this.getPageCount(), true);
12675
+ this.updateAriaAttribute();
12676
+ }
12677
+ break;
12678
+ case 34:
12679
+ e.preventDefault();
12680
+ if (focusedItem) {
12681
+ activeIndex = this.getIndexByValue(focusedItem.getAttribute('data-value'));
12682
+ this.pageDownSelection(activeIndex + this.getPageCount() + 1, true);
12683
+ this.updateAriaAttribute();
12684
+ }
12685
+ break;
12686
+ case 35:
12687
+ case 36:
12688
+ this.isMouseScrollAction = true;
12689
+ this.homeNavigation((e.keyCode === 36) ? true : false, true);
12690
+ this.isPreventScrollAction = true;
12691
+ break;
12692
+ }
12693
+ this.keyboardEvent = null;
12694
+ this.isScrollChanged = true;
12695
+ this.isKeyBoardAction = false;
12696
+ }
12002
12697
  onKeyDown(e) {
12003
12698
  if (this.readonly || !this.enabled && this.mode !== 'CheckBox') {
12004
12699
  return;
12005
12700
  }
12701
+ this.preventSetCurrentData = false;
12702
+ this.keyboardEvent = e;
12703
+ if (this.isPreventKeyAction && this.enableVirtualization) {
12704
+ e.preventDefault();
12705
+ }
12006
12706
  this.keyCode = e.keyCode;
12007
12707
  this.keyDownStatus = true;
12008
12708
  if (e.keyCode > 111 && e.keyCode < 124) {
@@ -12015,16 +12715,18 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12015
12715
  else if (this.isPopupOpen()) {
12016
12716
  const focusedItem = this.list.querySelector('.' + dropDownBaseClasses.focus);
12017
12717
  let activeIndex;
12718
+ this.isKeyBoardAction = true;
12018
12719
  switch (e.keyCode) {
12019
12720
  case 36:
12020
12721
  case 35:
12722
+ this.isMouseScrollAction = true;
12021
12723
  this.homeNavigation((e.keyCode === 36) ? true : false);
12022
12724
  break;
12023
12725
  case 33:
12024
12726
  e.preventDefault();
12025
12727
  if (focusedItem) {
12026
- this.getIndexByValue(focusedItem.getAttribute('data-value'));
12027
- this.pageUpSelection(activeIndex - this.getPagingCount());
12728
+ activeIndex = this.getIndexByValue(focusedItem.getAttribute('data-value'));
12729
+ this.pageUpSelection(activeIndex - this.getPageCount() - 1);
12028
12730
  this.updateAriaAttribute();
12029
12731
  }
12030
12732
  return;
@@ -12032,7 +12734,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12032
12734
  e.preventDefault();
12033
12735
  if (focusedItem) {
12034
12736
  this.getIndexByValue(focusedItem.getAttribute('data-value'));
12035
- this.pageDownSelection(activeIndex + this.getPagingCount());
12737
+ this.pageDownSelection(activeIndex + this.getPageCount());
12036
12738
  this.updateAriaAttribute();
12037
12739
  }
12038
12740
  return;
@@ -12098,10 +12800,11 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12098
12800
  if (!(this.mode === 'CheckBox' && this.showSelectAll)) {
12099
12801
  this.refreshPopup();
12100
12802
  }
12803
+ this.isKeyBoardAction = false;
12101
12804
  }
12102
- arrowDown(e) {
12805
+ arrowDown(e, isVirtualKeyAction) {
12103
12806
  e.preventDefault();
12104
- this.moveByList(1);
12807
+ this.moveByList(1, isVirtualKeyAction);
12105
12808
  this.keyAction = true;
12106
12809
  if (document.activeElement.classList.contains(FILTERINPUT)
12107
12810
  || (this.mode === 'CheckBox' && !this.allowFiltering && document.activeElement !== this.list)) {
@@ -12109,7 +12812,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12109
12812
  }
12110
12813
  this.updateAriaAttribute();
12111
12814
  }
12112
- arrowUp(e) {
12815
+ arrowUp(e, isVirtualKeyAction) {
12113
12816
  e.preventDefault();
12114
12817
  this.keyAction = true;
12115
12818
  let list = this.list.querySelectorAll('li.'
@@ -12127,7 +12830,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12127
12830
  this.keyAction = false;
12128
12831
  this.notify('inputFocus', { module: 'CheckBoxSelection', enable: this.mode === 'CheckBox', value: 'focus' });
12129
12832
  }
12130
- this.moveByList(-1);
12833
+ this.moveByList(-1, isVirtualKeyAction);
12131
12834
  this.updateAriaAttribute();
12132
12835
  }
12133
12836
  spaceKeySelection(e) {
@@ -12178,8 +12881,8 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12178
12881
  else if (e.keyCode === 8 && this.mode === 'Delimiter') {
12179
12882
  if (this.value && this.value.length) {
12180
12883
  e.preventDefault();
12181
- const temp = this.value[this.value.length - 1];
12182
- this.removeValue(temp, e);
12884
+ const temp = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), this.value[this.value.length - 1]) : this.value[this.value.length - 1];
12885
+ this.removeValue(this.value[this.value.length - 1], e);
12183
12886
  this.updateDelimeter(this.delimiterChar, e);
12184
12887
  this.focusAtLastListItem(temp);
12185
12888
  }
@@ -12193,7 +12896,10 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12193
12896
  }
12194
12897
  }
12195
12898
  escapeAction() {
12196
- const temp = this.tempValues ? this.tempValues.slice() : [];
12899
+ let temp = this.tempValues ? this.tempValues.slice() : [];
12900
+ if (this.allowObjectBinding) {
12901
+ temp = this.tempValues ? this.tempValues.slice() : [];
12902
+ }
12197
12903
  if (this.value && this.validateValues(this.value, temp)) {
12198
12904
  if (this.mode !== 'CheckBox') {
12199
12905
  this.value = temp;
@@ -12215,36 +12921,100 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12215
12921
  }
12216
12922
  this.makeTextBoxEmpty();
12217
12923
  }
12218
- scrollBottom(selectedLI, activeIndex) {
12924
+ scrollBottom(selectedLI, activeIndex, isInitialSelection = false, keyCode = null) {
12925
+ if ((!isNullOrUndefined(selectedLI) && selectedLI.classList.contains('e-virtual-list')) || (this.enableVirtualization && isNullOrUndefined(selectedLI))) {
12926
+ selectedLI = this.liCollections[this.skeletonCount];
12927
+ }
12928
+ this.isUpwardScrolling = false;
12929
+ let virtualListCount = this.list.querySelectorAll('.e-virtual-list').length;
12930
+ let lastElementValue = this.list.querySelector('li:last-of-type') ? this.list.querySelector('li:last-of-type').getAttribute('data-value') : null;
12931
+ let selectedLiOffsetTop = this.virtualListInfo && this.virtualListInfo.startIndex ? selectedLI.offsetTop + (this.virtualListInfo.startIndex * selectedLI.offsetHeight) : selectedLI.offsetTop;
12219
12932
  const currentOffset = this.list.offsetHeight;
12220
- const nextBottom = selectedLI.offsetTop + selectedLI.offsetHeight - this.list.scrollTop;
12221
- const nextOffset = this.list.scrollTop + nextBottom - currentOffset;
12222
- let boxRange = (selectedLI.offsetTop + selectedLI.offsetHeight - this.list.scrollTop);
12933
+ let nextBottom = selectedLiOffsetTop - (virtualListCount * selectedLI.offsetHeight) + selectedLI.offsetHeight - this.list.scrollTop;
12934
+ let nextOffset = this.list.scrollTop + nextBottom - currentOffset;
12935
+ let isScrollerCHanged = false;
12936
+ let boxRange = selectedLiOffsetTop - (virtualListCount * selectedLI.offsetHeight) + selectedLI.offsetHeight - this.list.scrollTop;
12223
12937
  boxRange = this.fields.groupBy && !isNullOrUndefined(this.fixedHeaderElement) ?
12224
12938
  boxRange - this.fixedHeaderElement.offsetHeight : boxRange;
12225
- if (activeIndex === 0) {
12939
+ if (activeIndex === 0 && !this.enableVirtualization) {
12226
12940
  this.list.scrollTop = 0;
12227
12941
  }
12228
- else if (nextBottom > currentOffset) {
12229
- this.list.scrollTop = nextOffset;
12230
- }
12231
- else if (!(boxRange > 0 && this.list.offsetHeight > boxRange)) {
12232
- this.list.scrollTop = nextOffset;
12942
+ else if (nextBottom > currentOffset || !(boxRange > 0 && this.list.offsetHeight > boxRange)) {
12943
+ let currentElementValue = selectedLI ? selectedLI.getAttribute('data-value') : null;
12944
+ var liCount = keyCode == 34 ? this.getPageCount() - 1 : 1;
12945
+ if (!this.enableVirtualization || this.isKeyBoardAction || isInitialSelection) {
12946
+ if (this.isKeyBoardAction && this.enableVirtualization && lastElementValue && currentElementValue === lastElementValue && keyCode != 35 && !this.isVirtualScrolling) {
12947
+ this.isPreventKeyAction = true;
12948
+ this.list.scrollTop += selectedLI.offsetHeight * liCount;
12949
+ this.isPreventKeyAction = this.IsScrollerAtEnd() ? false : this.isPreventKeyAction;
12950
+ this.isKeyBoardAction = false;
12951
+ this.isPreventScrollAction = false;
12952
+ }
12953
+ else if (this.enableVirtualization && keyCode == 35) {
12954
+ this.isPreventKeyAction = false;
12955
+ this.isKeyBoardAction = false;
12956
+ this.isPreventScrollAction = false;
12957
+ this.list.scrollTop = this.list.scrollHeight;
12958
+ }
12959
+ else {
12960
+ if (keyCode == 34 && this.enableVirtualization && !this.isVirtualScrolling) {
12961
+ this.isPreventKeyAction = false;
12962
+ this.isKeyBoardAction = false;
12963
+ this.isPreventScrollAction = false;
12964
+ nextOffset = nextOffset + (selectedLI.offsetHeight * liCount);
12965
+ }
12966
+ this.list.scrollTop = nextOffset;
12967
+ }
12968
+ }
12969
+ else {
12970
+ this.list.scrollTop = this.virtualListInfo && this.virtualListInfo.startIndex ? this.virtualListInfo.startIndex * this.listItemHeight : 0;
12971
+ }
12972
+ isScrollerCHanged = this.isKeyBoardAction;
12973
+
12233
12974
  }
12975
+ this.isKeyBoardAction = isScrollerCHanged;
12234
12976
  }
12235
- scrollTop(selectedLI, activeIndex) {
12236
- let nextOffset = selectedLI.offsetTop - this.list.scrollTop;
12977
+ scrollTop(selectedLI, activeIndex, keyCode = null) {
12978
+ let virtualListCount = this.list.querySelectorAll('.e-virtual-list').length;
12979
+ let selectedLiOffsetTop = (this.virtualListInfo && this.virtualListInfo.startIndex) ? selectedLI.offsetTop + (this.virtualListInfo.startIndex * selectedLI.offsetHeight) : selectedLI.offsetTop;
12980
+ let nextOffset = selectedLiOffsetTop - (virtualListCount * selectedLI.offsetHeight) - this.list.scrollTop;
12981
+ let firstElementValue = this.list.querySelector('li.e-list-item:not(.e-virtual-list)') ? this.list.querySelector('li.e-list-item:not(.e-virtual-list)').getAttribute('data-value') : null;
12237
12982
  nextOffset = this.fields.groupBy && !isUndefined(this.fixedHeaderElement) ?
12238
12983
  nextOffset - this.fixedHeaderElement.offsetHeight : nextOffset;
12239
- const boxRange = (selectedLI.offsetTop + selectedLI.offsetHeight - this.list.scrollTop);
12240
- if (activeIndex === 0) {
12984
+ let boxRange = (selectedLiOffsetTop - (virtualListCount * selectedLI.offsetHeight) + selectedLI.offsetHeight - this.list.scrollTop);
12985
+ let isPageUpKeyAction = this.enableVirtualization && this.getModuleName() === 'autocomplete' && nextOffset <= 0;
12986
+ if (activeIndex === 0 && !this.enableVirtualization) {
12241
12987
  this.list.scrollTop = 0;
12242
12988
  }
12243
- else if (nextOffset < 0) {
12244
- this.list.scrollTop = this.list.scrollTop + nextOffset;
12989
+ else if (nextOffset < 0 || isPageUpKeyAction) {
12990
+ var currentElementValue = selectedLI ? selectedLI.getAttribute('data-value') : null;
12991
+ var liCount = keyCode == 33 ? this.getPageCount() - 2 : 1;
12992
+ if (this.enableVirtualization && this.isKeyBoardAction && firstElementValue && currentElementValue === firstElementValue && keyCode != 36 && !this.isVirtualScrolling) {
12993
+ this.isUpwardScrolling = true;
12994
+ this.isPreventKeyAction = true;
12995
+ this.list.scrollTop -= selectedLI.offsetHeight * liCount;
12996
+ this.isPreventKeyAction = this.list.scrollTop != 0 ? this.isPreventKeyAction : false;
12997
+ this.isKeyBoardAction = false;
12998
+ this.isPreventScrollAction = false;
12999
+ }
13000
+ else if (this.enableVirtualization && keyCode == 36) {
13001
+ this.isPreventScrollAction = false;
13002
+ this.isPreventKeyAction = true;
13003
+ this.isKeyBoardAction = false;
13004
+ this.list.scrollTo(0, 0);
13005
+ }
13006
+ else {
13007
+ if (keyCode == 33 && this.enableVirtualization && !this.isVirtualScrolling) {
13008
+ this.isPreventKeyAction = false;
13009
+ this.isKeyBoardAction = false;
13010
+ this.isPreventScrollAction = false;
13011
+ nextOffset = nextOffset - (selectedLI.offsetHeight * liCount);
13012
+ }
13013
+ this.list.scrollTop = this.list.scrollTop + nextOffset;
13014
+ }
12245
13015
  }
12246
13016
  else if (!(boxRange > 0 && this.list.offsetHeight > boxRange)) {
12247
- this.list.scrollTop = selectedLI.offsetTop - (this.fields.groupBy && !isUndefined(this.fixedHeaderElement) ?
13017
+ this.list.scrollTop = selectedLI.offsetTop - (this.fields.groupBy && !isNullOrUndefined(this.fixedHeaderElement) ?
12248
13018
  this.fixedHeaderElement.offsetHeight : 0);
12249
13019
  }
12250
13020
  }
@@ -12331,7 +13101,19 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12331
13101
  if ((this.allowFiltering || (this.mode === 'CheckBox' && this.enableSelectionOrder === true)
12332
13102
  || this.allowCustomValue) && this.mainList && this.listData) {
12333
13103
  const list = this.mainList.cloneNode ? this.mainList.cloneNode(true) : this.mainList;
12334
- this.onActionComplete(list, this.mainData);
13104
+ if (this.enableVirtualization) {
13105
+ if (this.allowCustomValue && this.virtualCustomData && data == null && this.virtualCustomData && this.viewPortInfo && this.viewPortInfo.startIndex === 0 && this.viewPortInfo.endIndex === this.itemCount) {
13106
+ this.virtualCustomData = null;
13107
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13108
+ this.renderItems(this.mainData, this.fields);
13109
+ }
13110
+ else {
13111
+ this.onActionComplete(this.list, this.listData);
13112
+ }
13113
+ }
13114
+ else {
13115
+ this.onActionComplete(list, this.mainData);
13116
+ }
12335
13117
  this.focusAtLastListItem(data);
12336
13118
  if (this.value && this.value.length) {
12337
13119
  this.refreshSelection();
@@ -12346,14 +13128,15 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12346
13128
  let temp;
12347
13129
  if (selectedElem !== null) {
12348
13130
  if (!isNullOrUndefined(this.value)) {
12349
- this.tempValues = this.value.slice();
13131
+ this.tempValues = this.allowObjectBinding ? this.value.slice() : this.value.slice();
12350
13132
  }
12351
13133
  temp = selectedElem.nextElementSibling;
12352
13134
  if (temp !== null) {
12353
13135
  this.removeChipSelection();
12354
13136
  this.addChipSelection(temp, e);
12355
13137
  }
12356
- this.removeValue(selectedElem.getAttribute('data-value'), e);
13138
+ const currentChip = this.allowObjectBinding ? this.getDataByValue(selectedElem.getAttribute('data-value')) : selectedElem.getAttribute('data-value');
13139
+ this.removeValue(currentChip, e);
12357
13140
  this.makeTextBoxEmpty();
12358
13141
  }
12359
13142
  if (this.closePopupOnSelect) {
@@ -12380,7 +13163,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12380
13163
  selectAllParent.classList.remove('e-item-focus');
12381
13164
  }
12382
13165
  }
12383
- moveByList(position) {
13166
+ moveByList(position, isVirtualKeyAction) {
12384
13167
  if (this.list) {
12385
13168
  let elements = this.list.querySelectorAll('li.'
12386
13169
  + dropDownBaseClasses.li
@@ -12390,7 +13173,10 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12390
13173
  + dropDownBaseClasses.li + ',li.' + dropDownBaseClasses.group
12391
13174
  + ':not(.' + HIDE_LIST + ')' + ':not(.e-reorder-hide)');
12392
13175
  }
12393
- const selectedElem = this.list.querySelector('li.' + dropDownBaseClasses.focus);
13176
+ let selectedElem = this.list.querySelector('li.' + dropDownBaseClasses.focus);
13177
+ if (this.enableVirtualization && isVirtualKeyAction && !isNullOrUndefined(this.currentFocuedListElement)) {
13178
+ selectedElem = this.getElementByValue(this.getFormattedValue(this.currentFocuedListElement.getAttribute('data-value')));
13179
+ }
12394
13180
  let temp = -1;
12395
13181
  const selectAllParent = document.getElementsByClassName('e-selectall-parent')[0];
12396
13182
  if (this.mode === 'CheckBox' && this.showSelectAll && position == 1 && !isNullOrUndefined(selectAllParent) && !selectAllParent.classList.contains('e-item-focus') && this.list.getElementsByClassName('e-item-focus').length == 0 && this.liCollections.length > 1) {
@@ -12419,22 +13205,56 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12419
13205
  if (position > 0) {
12420
13206
  if (temp < (elements.length - 1)) {
12421
13207
  this.removeFocus();
12422
- this.addListFocus(elements[++temp]);
12423
- this.updateCheck(elements[temp]);
12424
- this.scrollBottom(elements[temp], temp);
13208
+ if (this.enableVirtualization && isVirtualKeyAction) {
13209
+ this.addListFocus(elements[temp]);
13210
+ }
13211
+ else {
13212
+ this.addListFocus(elements[++temp]);
13213
+ }
13214
+ if (temp > -1) {
13215
+ this.updateCheck(elements[temp]);
13216
+ this.scrollBottom(elements[temp], temp);
13217
+ this.currentFocuedListElement = elements[temp];
13218
+ }
12425
13219
  }
12426
13220
  }
12427
13221
  else {
12428
13222
  if (temp > 0) {
12429
- this.removeFocus();
12430
- this.addListFocus(elements[--temp]);
12431
- this.updateCheck(elements[temp]);
12432
- this.scrollTop(elements[temp], temp);
13223
+ if (this.enableVirtualization) {
13224
+ let isVirtualElement = elements[temp - 1].classList.contains('e-virtual-list');
13225
+ const elementIndex = isVirtualKeyAction ? temp : temp - 1;
13226
+ if (isVirtualKeyAction || !isVirtualElement) {
13227
+ this.removeFocus();
13228
+ }
13229
+ if (isVirtualKeyAction || !isVirtualElement) {
13230
+ this.addListFocus(elements[elementIndex]);
13231
+ this.updateCheck(elements[elementIndex]);
13232
+ this.scrollTop(elements[elementIndex], temp);
13233
+ this.currentFocuedListElement = elements[elementIndex];
13234
+ }
13235
+ }
13236
+ else {
13237
+ this.removeFocus();
13238
+ this.addListFocus(elements[--temp]);
13239
+ this.updateCheck(elements[temp]);
13240
+ this.scrollTop(elements[temp], temp);
13241
+ }
12433
13242
  }
12434
13243
  }
12435
13244
  }
12436
13245
  }
12437
13246
  }
13247
+ getElementByValue(value) {
13248
+ let item;
13249
+ const listItems = this.getItems();
13250
+ for (const liItem of listItems) {
13251
+ if (this.getFormattedValue(liItem.getAttribute('data-value')) === value) {
13252
+ item = liItem;
13253
+ break;
13254
+ }
13255
+ }
13256
+ return item;
13257
+ }
12438
13258
  updateCheck(element) {
12439
13259
  if (this.mode === 'CheckBox' && this.enableGroupCheckBox &&
12440
13260
  !isNullOrUndefined(this.fields.groupBy)) {
@@ -12496,7 +13316,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12496
13316
  if (this.enabled && !this.readonly) {
12497
13317
  const element = e.target.parentElement;
12498
13318
  const customVal = element.getAttribute('data-value');
12499
- let value = this.getFormattedValue(customVal);
13319
+ let value = this.allowObjectBinding ? this.getDataByValue(customVal) : this.getFormattedValue(customVal);
12500
13320
  if (this.allowCustomValue && ((customVal !== 'false' && value === false) ||
12501
13321
  (!isNullOrUndefined(value) && value.toString() === 'NaN'))) {
12502
13322
  value = customVal;
@@ -12508,6 +13328,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12508
13328
  this.inputElement.focus();
12509
13329
  }
12510
13330
  this.removeValue(value, e);
13331
+ value = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', value) : value;
12511
13332
  if (isNullOrUndefined(this.findListElement(this.list, 'li', 'data-value', value)) && this.mainList && this.listData) {
12512
13333
  const list = this.mainList.cloneNode ? this.mainList.cloneNode(true) : this.mainList;
12513
13334
  this.onActionComplete(list, this.mainData);
@@ -12542,7 +13363,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12542
13363
  this.expandTextbox();
12543
13364
  }
12544
13365
  removeAllItems(value, eve, isClearAll, element, mainElement) {
12545
- let index = this.value.indexOf(value);
13366
+ let index = this.allowObjectBinding ? this.indexOfObjectInArray(value, this.value) : this.value.indexOf(value);
12546
13367
  const removeVal = this.value.slice(0);
12547
13368
  removeVal.splice(index, 1);
12548
13369
  this.setProperties({ value: [].concat([], removeVal) }, true);
@@ -12557,7 +13378,8 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12557
13378
  e: this, index: index
12558
13379
  });
12559
13380
  this.invokeCheckboxSelection(element, eve, isClearAll);
12560
- this.updateMainList(true, value, mainElement);
13381
+ const currentValue = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), value) : value;
13382
+ this.updateMainList(true, currentValue, mainElement);
12561
13383
  this.updateChipStatus();
12562
13384
  }
12563
13385
  invokeCheckboxSelection(element, eve, isClearAll) {
@@ -12573,9 +13395,9 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12573
13395
  }
12574
13396
  }
12575
13397
  removeValue(value, eve, length, isClearAll) {
12576
- let index = this.value.indexOf(this.getFormattedValue(value));
13398
+ let index = this.allowObjectBinding ? this.indexOfObjectInArray(value, this.value) : this.value.indexOf(this.getFormattedValue(value));
12577
13399
  if (index === -1 && this.allowCustomValue && !isNullOrUndefined(value)) {
12578
- index = this.value.indexOf(value.toString());
13400
+ index = this.allowObjectBinding ? this.indexOfObjectInArray(value, this.value) : this.value.indexOf(value.toString());
12579
13401
  }
12580
13402
  const targetEle = eve && eve.target;
12581
13403
  isClearAll = (isClearAll || targetEle && targetEle.classList.contains('e-close-hooker')) ? true : null;
@@ -12583,7 +13405,8 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12583
13405
  HIDE_LIST :
12584
13406
  dropDownBaseClasses.selected;
12585
13407
  if (index !== -1) {
12586
- const element = this.findListElement(this.list, 'li', 'data-value', value);
13408
+ const currentValue = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), value) : value;
13409
+ const element = this.findListElement(this.list, 'li', 'data-value', currentValue);
12587
13410
  const val = this.getDataByValue(value);
12588
13411
  const eventArgs = {
12589
13412
  e: eve,
@@ -12597,11 +13420,20 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12597
13420
  this.removeIndex++;
12598
13421
  }
12599
13422
  else {
12600
- const removeVal = this.value.slice(0);
13423
+ this.virtualSelectAll = false;
13424
+ let removeVal = this.value.slice(0);
13425
+ if (this.enableVirtualization && isClearAll) {
13426
+ removeVal = [];
13427
+ }
12601
13428
  removeVal.splice(index, 1);
12602
13429
  this.setProperties({ value: [].concat([], removeVal) }, true);
13430
+ if (this.enableVirtualization) {
13431
+ let currentText = index == 0 ? this.text.replace(this.text.split(this.delimiterChar)[index] + this.delimiterChar, '') : this.text.replace(this.delimiterChar + this.text.split(this.delimiterChar)[index], '');
13432
+ this.setProperties({ text: currentText.toString() }, true);
13433
+ }
12603
13434
  if (element !== null) {
12604
- const hideElement = this.findListElement(this.mainList, 'li', 'data-value', value);
13435
+ const currentValue = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), value) : value;
13436
+ const hideElement = this.findListElement(this.mainList, 'li', 'data-value', currentValue);
12605
13437
  element.setAttribute('aria-selected', 'false');
12606
13438
  removeClass([element], className);
12607
13439
  if (hideElement) {
@@ -12615,15 +13447,16 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12615
13447
  });
12616
13448
  this.invokeCheckboxSelection(element, eve, isClearAll);
12617
13449
  }
13450
+ const currentValue = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), value) : value;
12618
13451
  if (this.hideSelectedItem && this.fields.groupBy && element) {
12619
- this.hideGroupItem(value);
13452
+ this.hideGroupItem(currentValue);
12620
13453
  }
12621
13454
  if (this.hideSelectedItem && this.fixedHeaderElement && this.fields.groupBy && this.mode !== 'CheckBox' &&
12622
13455
  this.isPopupOpen()) {
12623
13456
  super.scrollStop();
12624
13457
  }
12625
- this.updateMainList(true, value);
12626
- this.removeChip(value);
13458
+ this.updateMainList(true, currentValue);
13459
+ this.removeChip(currentValue, isClearAll);
12627
13460
  this.updateChipStatus();
12628
13461
  const limit = this.value && this.value.length ? this.value.length : 0;
12629
13462
  if (limit < this.maximumSelectionLength) {
@@ -12659,6 +13492,14 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12659
13492
  if (isClearAll && (length === 1 || length === null)) {
12660
13493
  this.clearAllCallback(eve, isClearAll);
12661
13494
  }
13495
+ if (this.isPopupOpen() && element && element.parentElement.classList.contains('e-reorder')) {
13496
+ if (this.hideSelectedItem && this.value && Array.isArray(this.value) && this.value.length > 0) {
13497
+ this.totalItemsCount();
13498
+ }
13499
+ this.notify("setCurrentViewDataAsync", {
13500
+ module: "VirtualScroll",
13501
+ });
13502
+ }
12662
13503
  }
12663
13504
  });
12664
13505
  }
@@ -12689,11 +13530,16 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12689
13530
  }
12690
13531
  }
12691
13532
  }
12692
- removeChip(value) {
13533
+ removeChip(value, isClearAll) {
12693
13534
  if (this.chipCollectionWrapper) {
12694
- const element = this.findListElement(this.chipCollectionWrapper, 'span', 'data-value', value);
12695
- if (element) {
12696
- remove(element);
13535
+ if (this.enableVirtualization && isClearAll) {
13536
+ let childElements = this.chipCollectionWrapper.querySelectorAll('.e-chips');
13537
+ }
13538
+ else {
13539
+ const element = this.findListElement(this.chipCollectionWrapper, 'span', 'data-value', value);
13540
+ if (element) {
13541
+ remove(element);
13542
+ }
12697
13543
  }
12698
13544
  }
12699
13545
  }
@@ -12727,12 +13573,40 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12727
13573
  this.hideOverAllClear();
12728
13574
  }
12729
13575
  }
13576
+ indexOfObjectInArray(objectToFind, array) {
13577
+ for (let i = 0; i < array.length; i++) {
13578
+ const item = array[i];
13579
+ if (Object.keys(objectToFind).every(key => item.hasOwnProperty(key) && item[key] === objectToFind[key])) {
13580
+ return i; // Return the index if the object is found
13581
+ }
13582
+ }
13583
+ return -1; // Return -1 if the object is not found
13584
+ }
12730
13585
  addValue(value, text, eve) {
12731
13586
  if (!this.value) {
12732
13587
  this.value = [];
12733
13588
  }
12734
- if (this.value.indexOf(value) < 0) {
12735
- this.setProperties({ value: [].concat([], this.value, [value]) }, true);
13589
+ let currentValue = this.allowObjectBinding ? this.getDataByValue(value) : value;
13590
+ if ((this.allowObjectBinding && !this.isObjectInArray(value, this.value)) || (!this.allowObjectBinding && this.value.indexOf(currentValue) < 0)) {
13591
+ this.setProperties({ value: [].concat([], this.value, [currentValue]) }, true);
13592
+ if (this.enableVirtualization) {
13593
+ let data = this.viewWrapper.innerHTML;
13594
+ let temp;
13595
+ data += (this.value.length === 1) ? '' : this.delimiterChar + ' ';
13596
+ temp = this.getOverflowVal(this.value.length - 1);
13597
+ data += temp;
13598
+ temp = this.viewWrapper.innerHTML;
13599
+ this.updateWrapperText(this.viewWrapper, data);
13600
+ }
13601
+ if (this.enableVirtualization && this.mode === 'CheckBox') {
13602
+ let temp;
13603
+ let currentText = [];
13604
+ const value = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), this.value[this.value.length - 1]) : this.value[this.value.length - 1];
13605
+ temp = this.getTextByValue(value);
13606
+ var textValues = this.text != null ? this.text + ',' + temp : temp;
13607
+ currentText.push(textValues);
13608
+ this.setProperties({ text: currentText.toString() }, true);
13609
+ }
12736
13610
  }
12737
13611
  const element = this.findListElement(this.list, 'li', 'data-value', value);
12738
13612
  this.removeFocus();
@@ -12760,6 +13634,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12760
13634
  dispatchSelect(value, eve, element, isNotTrigger, length) {
12761
13635
  const list = this.listData;
12762
13636
  if (this.initStatus && !isNotTrigger) {
13637
+ value = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), value) : value;
12763
13638
  const val = this.getDataByValue(value);
12764
13639
  const eventArgs = {
12765
13640
  e: eve,
@@ -12788,7 +13663,10 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12788
13663
  if (this.allowCustomValue && this.isServerRendered && this.listData !== list) {
12789
13664
  this.listData = list;
12790
13665
  }
12791
- this.updateListSelectEventCallback(value, element, eve);
13666
+ value = this.allowObjectBinding ? this.getDataByValue(value) : value;
13667
+ if ((this.enableVirtualization && value) || !this.enableVirtualization) {
13668
+ this.updateListSelectEventCallback(value, element, eve);
13669
+ }
12792
13670
  if (this.hideSelectedItem && this.fixedHeaderElement && this.fields.groupBy && this.mode !== 'CheckBox') {
12793
13671
  super.scrollStop();
12794
13672
  }
@@ -12872,7 +13750,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12872
13750
  chipContent.innerText = data;
12873
13751
  }
12874
13752
  else {
12875
- chipContent.innerHTML = this.encodeHtmlEntities(data);
13753
+ chipContent.innerHTML = this.encodeHtmlEntities(data.toString());
12876
13754
  }
12877
13755
  chip.appendChild(chipContent);
12878
13756
  const eventArgs = {
@@ -12957,6 +13835,37 @@ let MultiSelect = class MultiSelect extends DropDownBase {
12957
13835
  overAllHeight -= this.header.offsetHeight;
12958
13836
  }
12959
13837
  append([this.list], this.popupWrapper);
13838
+ if (!this.list.classList.contains(dropDownBaseClasses.noData) && this.getItems()[1]) {
13839
+ this.listItemHeight = this.getItems()[1].offsetHeight;
13840
+ }
13841
+ if (this.enableVirtualization && !this.list.classList.contains(dropDownBaseClasses.noData)) {
13842
+ if (!this.list.querySelector('.e-virtual-ddl-content') && this.list.querySelector('.e-list-parent')) {
13843
+ this.list.appendChild(this.createElement('div', {
13844
+ className: 'e-virtual-ddl-content',
13845
+ styles: this.getTransformValues()
13846
+ })).appendChild(this.list.querySelector('.e-list-parent'));
13847
+ }
13848
+ else if (this.list.querySelector('.e-virtual-ddl-content')) {
13849
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13850
+ this.list.getElementsByClassName('e-virtual-ddl-content')[0].style = this.getTransformValues();
13851
+ }
13852
+ this.UpdateSkeleton();
13853
+ this.liCollections = this.list.querySelectorAll('.' + dropDownBaseClasses.li);
13854
+ this.virtualItemCount = this.itemCount;
13855
+ if (this.mode !== 'CheckBox') {
13856
+ this.totalItemCount = this.value && this.value.length ? this.totalItemCount - this.value.length : this.totalItemCount;
13857
+ }
13858
+ if (!this.list.querySelector('.e-virtual-ddl')) {
13859
+ var virualElement = this.createElement('div', {
13860
+ id: this.element.id + '_popup', className: 'e-virtual-ddl', styles: this.GetVirtualTrackHeight()
13861
+ });
13862
+ this.popupWrapper.querySelector('.e-dropdownbase').appendChild(virualElement);
13863
+ }
13864
+ else {
13865
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13866
+ this.list.getElementsByClassName('e-virtual-ddl')[0].style = this.GetVirtualTrackHeight();
13867
+ }
13868
+ }
12960
13869
  if (this.footerTemplate) {
12961
13870
  this.setFooterTemplate();
12962
13871
  overAllHeight -= this.footer.offsetHeight;
@@ -13029,21 +13938,41 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13029
13938
  }
13030
13939
  this.popupObj.wireScrollEvents();
13031
13940
  if (!(this.mode !== 'CheckBox' && (this.allowFiltering || this.allowCustomValue) &&
13032
- this.targetElement().trim() !== '')) {
13941
+ this.targetElement().trim() !== '') && !this.enableVirtualization) {
13033
13942
  this.loadTemplate();
13943
+ if (this.enableVirtualization && this.mode === 'CheckBox') {
13944
+ this.UpdateSkeleton();
13945
+ }
13034
13946
  }
13947
+ this.isPreventScrollAction = true;
13035
13948
  this.setScrollPosition();
13036
13949
  if (this.allowFiltering) {
13037
13950
  this.notify('inputFocus', {
13038
13951
  module: 'CheckBoxSelection', enable: this.mode === 'CheckBox', value: 'focus'
13039
13952
  });
13040
13953
  }
13954
+ if (this.enableVirtualization) {
13955
+ this.notify("bindScrollEvent", {
13956
+ module: "VirtualScroll",
13957
+ component: this.getModuleName(),
13958
+ enable: this.enableVirtualization,
13959
+ });
13960
+ setTimeout(() => {
13961
+ if (this.value) {
13962
+ this.updateSelectionList();
13963
+ }
13964
+ else if (this.viewPortInfo && this.viewPortInfo.offsets.top) {
13965
+ this.list.scrollTop = this.viewPortInfo.offsets.top;
13966
+ }
13967
+ }, 5);
13968
+ }
13041
13969
  }, targetExitViewport: () => {
13042
13970
  if (!Browser.isDevice) {
13043
13971
  this.hidePopup();
13044
13972
  }
13045
13973
  }
13046
13974
  });
13975
+ this.popupContentElement = this.popupObj.element.querySelector('.e-content');
13047
13976
  if (this.mode === 'CheckBox' && Browser.isDevice && this.allowFiltering) {
13048
13977
  this.notify('deviceSearchBox', { module: 'CheckBoxSelection', enable: this.mode === 'CheckBox' });
13049
13978
  }
@@ -13101,6 +14030,53 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13101
14030
  append([this.footer], this.popupWrapper);
13102
14031
  EventHandler.add(this.footer, 'mousedown', this.onListMouseDown, this);
13103
14032
  }
14033
+ updateInitialData() {
14034
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14035
+ let currentData = this.selectData;
14036
+ let ulElement = this.renderItems(currentData, this.fields);
14037
+ this.list.scrollTop = 0;
14038
+ this.virtualListInfo = {
14039
+ currentPageNumber: null,
14040
+ direction: null,
14041
+ sentinelInfo: {},
14042
+ offsets: {},
14043
+ startIndex: 0,
14044
+ endIndex: 0,
14045
+ };
14046
+ this.previousStartIndex = 0;
14047
+ this.previousEndIndex = 0;
14048
+ if (this.dataSource instanceof DataManager) {
14049
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14050
+ this.totalItemCount = this.dataCount = this.virtualGroupDataSource && this.virtualGroupDataSource.length ? this.virtualGroupDataSource.length : 0;
14051
+ }
14052
+ else {
14053
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14054
+ this.totalItemCount = this.dataCount = this.dataSource && this.dataSource.length ? this.dataSource.length : 0;
14055
+ }
14056
+ if (this.mode !== 'CheckBox') {
14057
+ this.totalItemCount = this.value && this.value.length ? this.totalItemCount - this.value.length : this.totalItemCount;
14058
+ }
14059
+ this.getSkeletonCount();
14060
+ this.UpdateSkeleton();
14061
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14062
+ if (this.list.getElementsByClassName('e-virtual-ddl')[0]) {
14063
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14064
+ this.list.getElementsByClassName('e-virtual-ddl')[0].style = this.GetVirtualTrackHeight();
14065
+ }
14066
+ else if (!this.list.querySelector('.e-virtual-ddl') && this.skeletonCount > 0) {
14067
+ var virualElement = this.createElement('div', {
14068
+ id: this.element.id + '_popup', className: 'e-virtual-ddl', styles: this.GetVirtualTrackHeight()
14069
+ });
14070
+ this.popupWrapper.querySelector('.e-dropdownbase').appendChild(virualElement);
14071
+ }
14072
+ this.listData = currentData;
14073
+ this.liCollections = this.list.querySelectorAll('.e-list-item');
14074
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14075
+ if (this.list.getElementsByClassName('e-virtual-ddl-content')[0]) {
14076
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14077
+ this.list.getElementsByClassName('e-virtual-ddl-content')[0].style = this.getTransformValues();
14078
+ }
14079
+ }
13104
14080
  clearAll(e) {
13105
14081
  if (this.enabled && !this.readonly) {
13106
14082
  let temp;
@@ -13121,6 +14097,24 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13121
14097
  else {
13122
14098
  this.clearAllCallback(e);
13123
14099
  }
14100
+ this.checkAndResetCache();
14101
+ if (this.enableVirtualization) {
14102
+ this.updateInitialData();
14103
+ if (this.chipCollectionWrapper) {
14104
+ this.chipCollectionWrapper.innerHTML = '';
14105
+ }
14106
+ if (!this.isCustomDataUpdated) {
14107
+ this.notify("setGeneratedData", {
14108
+ module: "VirtualScroll",
14109
+ });
14110
+ }
14111
+ }
14112
+ if (this.enableVirtualization) {
14113
+ this.list.scrollTop = 0;
14114
+ this.virtualListInfo = null;
14115
+ this.previousStartIndex = 0;
14116
+ this.previousEndIndex = 0;
14117
+ }
13124
14118
  }
13125
14119
  }
13126
14120
  clearAllCallback(e, isClearAll) {
@@ -13219,6 +14213,8 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13219
14213
  }
13220
14214
  search(e) {
13221
14215
  this.resetFilteredData = true;
14216
+ this.preventSetCurrentData = false;
14217
+ this.firstItem = this.dataSource && this.dataSource.length > 0 ? this.dataSource[0] : null;
13222
14218
  if (!isNullOrUndefined(e)) {
13223
14219
  this.keyCode = e.keyCode;
13224
14220
  }
@@ -13235,6 +14231,9 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13235
14231
  if (this.allowCustomValue) {
13236
14232
  this.isRemoteSelection = true;
13237
14233
  }
14234
+ if (!this.backCommand) {
14235
+ this.checkAndResetCache();
14236
+ }
13238
14237
  const eventArgs = {
13239
14238
  preventDefaultAction: false,
13240
14239
  text: this.targetElement(),
@@ -13261,12 +14260,83 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13261
14260
  else if (this.allowCustomValue) {
13262
14261
  let query = new Query();
13263
14262
  query = this.allowFiltering && (text !== '') ? query.where(this.fields.text, 'startswith', text, this.ignoreCase, this.ignoreAccent) : query;
13264
- this.dataUpdater(this.mainData, query, this.fields);
14263
+ if (this.enableVirtualization) {
14264
+ if (this.dataSource instanceof DataManager) {
14265
+ this.dataUpdater(this.virtualGroupDataSource, query, this.fields);
14266
+ }
14267
+ else {
14268
+ this.dataUpdater(this.dataSource, query, this.fields);
14269
+ }
14270
+ }
14271
+ else {
14272
+ this.dataUpdater(this.mainData, query, this.fields);
14273
+ }
14274
+ this.UpdateSkeleton();
13265
14275
  }
13266
14276
  else {
13267
14277
  const liCollections = this.list.querySelectorAll('li.' + dropDownBaseClasses.li + ':not(.e-hide-listitem)');
13268
- const activeElement = Search(this.targetElement(), liCollections, 'StartsWith', this.ignoreCase);
13269
- if (activeElement && activeElement.item !== null) {
14278
+ const type = this.typeOfData(this.listData).typeof;
14279
+ let activeElement = Search(this.targetElement(), liCollections, 'StartsWith', this.ignoreCase);
14280
+ if (this.enableVirtualization && this.targetElement().trim() !== '' && !this.allowFiltering) {
14281
+ var updatingincrementalindex = false;
14282
+ if ((this.viewPortInfo.endIndex >= this.incrementalEndIndex && this.incrementalEndIndex <= this.totalItemCount) || this.incrementalEndIndex == 0) {
14283
+ updatingincrementalindex = true;
14284
+ this.incrementalStartIndex = 0;
14285
+ this.incrementalEndIndex = 100 > this.totalItemCount ? this.totalItemCount : 100;
14286
+ this.updateIncrementalInfo(this.incrementalStartIndex, this.incrementalEndIndex);
14287
+ updatingincrementalindex = false;
14288
+ }
14289
+ if (this.viewPortInfo.startIndex !== 0 || updatingincrementalindex) {
14290
+ this.updateIncrementalView(0, this.itemCount);
14291
+ }
14292
+ activeElement = Search(this.targetElement(), this.incrementalLiCollections, this.filterType, true, this.listData, this.fields, type);
14293
+ while (isNullOrUndefined(activeElement) && this.incrementalEndIndex < this.totalItemCount) {
14294
+ this.incrementalStartIndex = this.incrementalEndIndex;
14295
+ this.incrementalEndIndex = this.incrementalEndIndex + 100 > this.totalItemCount ? this.totalItemCount : this.incrementalEndIndex + 100;
14296
+ this.updateIncrementalInfo(this.incrementalStartIndex, this.incrementalEndIndex);
14297
+ updatingincrementalindex = true;
14298
+ if (this.viewPortInfo.startIndex !== 0 || updatingincrementalindex) {
14299
+ this.updateIncrementalView(0, this.itemCount);
14300
+ }
14301
+ activeElement = Search(this.targetElement(), this.incrementalLiCollections, this.filterType, true, this.listData, this.fields, type);
14302
+ if (!isNullOrUndefined(activeElement)) {
14303
+ break;
14304
+ }
14305
+ if (isNullOrUndefined(activeElement) && this.incrementalEndIndex >= this.totalItemCount) {
14306
+ this.incrementalStartIndex = 0;
14307
+ this.incrementalEndIndex = 100 > this.totalItemCount ? this.totalItemCount : 100;
14308
+ break;
14309
+ }
14310
+ }
14311
+ if (activeElement.index) {
14312
+ if ((!(this.viewPortInfo.startIndex >= activeElement.index)) || (!(activeElement.index >= this.viewPortInfo.endIndex))) {
14313
+ var startIndex = activeElement.index - ((this.itemCount / 2) - 2) > 0 ? activeElement.index - ((this.itemCount / 2) - 2) : 0;
14314
+ var endIndex = startIndex + this.itemCount > this.totalItemCount ? this.totalItemCount : startIndex + this.itemCount;
14315
+ if (startIndex != this.viewPortInfo.startIndex) {
14316
+ this.updateIncrementalView(startIndex, endIndex);
14317
+ }
14318
+ }
14319
+ }
14320
+ if (!isNullOrUndefined(activeElement.item)) {
14321
+ var index_1 = this.getIndexByValue(activeElement.item.getAttribute('data-value')) - this.skeletonCount;
14322
+ if (index_1 > this.itemCount / 2) {
14323
+ var startIndex = this.viewPortInfo.startIndex + ((this.itemCount / 2) - 2) < this.totalItemCount ? this.viewPortInfo.startIndex + ((this.itemCount / 2) - 2) : this.totalItemCount;
14324
+ var endIndex = this.viewPortInfo.startIndex + this.itemCount > this.totalItemCount ? this.totalItemCount : this.viewPortInfo.startIndex + this.itemCount;
14325
+ this.updateIncrementalView(startIndex, endIndex);
14326
+ }
14327
+ activeElement.item = this.getElementByValue(activeElement.item.getAttribute('data-value'));
14328
+ }
14329
+ else {
14330
+ this.updateIncrementalView(0, this.itemCount);
14331
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14332
+ this.list.getElementsByClassName('e-virtual-ddl-content')[0].style = this.getTransformValues();
14333
+ this.list.scrollTop = 0;
14334
+ }
14335
+ if (activeElement && activeElement.item) {
14336
+ activeElement.item = this.getElementByValue(activeElement.item.getAttribute('data-value'));
14337
+ }
14338
+ }
14339
+ if (activeElement && activeElement.item) {
13270
14340
  this.addListFocus(activeElement.item);
13271
14341
  this.list.scrollTop =
13272
14342
  activeElement.item.offsetHeight * activeElement.index;
@@ -13279,11 +14349,15 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13279
14349
  }
13280
14350
  }
13281
14351
  }
14352
+ if (this.enableVirtualization && this.allowFiltering) {
14353
+ this.getFilteringSkeletonCount();
14354
+ }
13282
14355
  }
13283
14356
  preRender() {
13284
14357
  if (this.allowFiltering === null) {
13285
14358
  this.allowFiltering = (this.mode === 'CheckBox') ? true : false;
13286
14359
  }
14360
+ this.preventSetCurrentData = false;
13287
14361
  this.initializeData();
13288
14362
  this.updateDataAttribute(this.htmlAttributes);
13289
14363
  super.preRender();
@@ -13305,6 +14379,14 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13305
14379
  this.isCustomRendered = false;
13306
14380
  this.isRemoteSelection = false;
13307
14381
  this.isSelectAllTarget = true;
14382
+ this.viewPortInfo = {
14383
+ currentPageNumber: null,
14384
+ direction: null,
14385
+ sentinelInfo: {},
14386
+ offsets: {},
14387
+ startIndex: 0,
14388
+ endIndex: this.itemCount,
14389
+ };
13308
14390
  }
13309
14391
  updateData(delimiterChar, e) {
13310
14392
  let data = '';
@@ -13312,7 +14394,9 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13312
14394
  const text = [];
13313
14395
  let temp;
13314
14396
  const tempData = this.listData;
13315
- this.listData = this.mainData;
14397
+ if (!this.enableVirtualization) {
14398
+ this.listData = this.mainData;
14399
+ }
13316
14400
  if (!isNullOrUndefined(this.hiddenElement)) {
13317
14401
  this.hiddenElement.innerHTML = '';
13318
14402
  }
@@ -13320,16 +14404,32 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13320
14404
  let valueLength = this.value.length;
13321
14405
  let hiddenElementContent = '';
13322
14406
  for (let index = 0; index < valueLength; index++) {
13323
- const valueItem = this.value[index];
13324
- const listValue = this.findListElement((!isNullOrUndefined(this.mainList) ? this.mainList : this.ulElement), 'li', 'data-value', valueItem);
13325
- if (isNullOrUndefined(listValue) && !this.allowCustomValue) {
14407
+ const valueItem = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', this.value[index]) : this.value[index];
14408
+ let listValue = this.findListElement((!isNullOrUndefined(this.mainList) ? this.mainList : this.ulElement), 'li', 'data-value', valueItem);
14409
+ if (this.enableVirtualization) {
14410
+ listValue = this.findListElement((!isNullOrUndefined(this.list) ? this.list : this.ulElement), 'li', 'data-value', valueItem);
14411
+ }
14412
+ if (isNullOrUndefined(listValue) && !this.allowCustomValue && !this.enableVirtualization) {
13326
14413
  this.value.splice(index, 1);
13327
14414
  index -= 1;
13328
14415
  valueLength -= 1;
13329
14416
  }
13330
14417
  else {
13331
14418
  if (this.listData) {
13332
- temp = this.getTextByValue(valueItem);
14419
+ if (this.enableVirtualization) {
14420
+ if (delim) {
14421
+ data = this.delimiterWrapper && this.delimiterWrapper.innerHTML == "" ? data : this.delimiterWrapper.innerHTML;
14422
+ }
14423
+ const value = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), this.value[this.value.length - 1]) : this.value[this.value.length - 1];
14424
+ temp = this.getTextByValue(value);
14425
+ let textValues = this.text != null && this.text != "" ? this.text + ',' + temp : temp;
14426
+ data += temp + delimiterChar + ' ';
14427
+ text.push(textValues);
14428
+ break;
14429
+ }
14430
+ else {
14431
+ temp = this.getTextByValue(valueItem);
14432
+ }
13333
14433
  }
13334
14434
  else {
13335
14435
  temp = valueItem;
@@ -13343,7 +14443,10 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13343
14443
  this.hiddenElement.innerHTML = hiddenElementContent;
13344
14444
  }
13345
14445
  }
13346
- this.setProperties({ text: text.toString() }, true);
14446
+ let isChipRemove = e && e.target && e.target.classList.contains('e-chips-close');
14447
+ if (!this.enableVirtualization || (this.enableVirtualization && this.mode !== 'CheckBox' && !isChipRemove)) {
14448
+ this.setProperties({ text: text.toString() }, true);
14449
+ }
13347
14450
  if (delim) {
13348
14451
  this.updateWrapperText(this.delimiterWrapper, data);
13349
14452
  this.delimiterWrapper.setAttribute('id', getUniqueID('delim_val'));
@@ -13372,7 +14475,8 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13372
14475
  }
13373
14476
  }
13374
14477
  if (textVal && textVal.length) {
13375
- this.setProperties({ value: textVal }, true);
14478
+ const value = this.allowObjectBinding ? this.getDataByValue(textVal) : textVal;
14479
+ this.setProperties({ value: value }, true);
13376
14480
  }
13377
14481
  }
13378
14482
  else {
@@ -13385,10 +14489,12 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13385
14489
  isEmptyData = true;
13386
14490
  }
13387
14491
  super.render(null, isEmptyData);
14492
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14493
+ this.totalItemCount = this.dataSource && this.dataSource.length ? this.dataSource.length : 0;
13388
14494
  this.unwireListEvents();
13389
14495
  this.wireListEvents();
13390
14496
  }
13391
- initialValueUpdate() {
14497
+ initialValueUpdate(listItems) {
13392
14498
  if (this.list) {
13393
14499
  let text;
13394
14500
  let element;
@@ -13399,12 +14505,34 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13399
14505
  this.removeListSelection();
13400
14506
  if (!isNullOrUndefined(this.value)) {
13401
14507
  for (let index = 0; !isNullOrUndefined(this.value[index]); index++) {
13402
- value = this.value[index];
14508
+ value = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), this.value[index]) : this.value[index];
13403
14509
  element = this.findListElement(this.hideSelectedItem ? this.ulElement : this.list, 'li', 'data-value', value);
13404
- text = this.getTextByValue(value);
13405
- if ((element && (element.getAttribute('aria-selected') !== 'true')) ||
14510
+ let isCustomData = false;
14511
+ if (this.enableVirtualization) {
14512
+ text = null;
14513
+ if (listItems != null && listItems.length > 0) {
14514
+ for (let i = 0; i < listItems.length; i++) {
14515
+ if (getValue((this.fields.value ? this.fields.value : 'value'), listItems[i]) === value) {
14516
+ text = getValue(this.fields.text, listItems[i]);
14517
+ break;
14518
+ }
14519
+ }
14520
+ }
14521
+ if (isNullOrUndefined(text) && this.allowCustomValue) {
14522
+ text = this.getTextByValue(value);
14523
+ isCustomData = true;
14524
+ }
14525
+ }
14526
+ else {
14527
+ text = this.getTextByValue(value);
14528
+ }
14529
+ if (((element && (element.getAttribute('aria-selected') !== 'true')) ||
13406
14530
  (element && (element.getAttribute('aria-selected') === 'true' && this.hideSelectedItem) &&
13407
- (this.mode === 'Box' || this.mode === 'Default'))) {
14531
+ (this.mode === 'Box' || this.mode === 'Default'))) || (this.enableVirtualization && value != null && text != null && !isCustomData)) {
14532
+ let currentText = [];
14533
+ var textValues = this.text != null ? this.text + ',' + text : text;
14534
+ currentText.push(textValues);
14535
+ this.setProperties({ text: currentText.toString() }, true);
13408
14536
  this.addChip(text, value);
13409
14537
  this.addListSelection(element);
13410
14538
  }
@@ -13415,12 +14543,24 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13415
14543
  setValue(this.fields.value, value, newValue);
13416
14544
  const noDataEle = this.popupWrapper.querySelector('.' + dropDownBaseClasses.noData);
13417
14545
  this.addItem(newValue, indexItem);
14546
+ if (this.enableVirtualization) {
14547
+ if (this.virtualCustomSelectData && this.virtualCustomSelectData.length >= 0) {
14548
+ this.virtualCustomSelectData.push(newValue);
14549
+ }
14550
+ else {
14551
+ this.virtualCustomSelectData = [newValue];
14552
+ }
14553
+ }
13418
14554
  element = element ? element : this.findListElement(this.hideSelectedItem ? this.ulElement : this.list, 'li', 'data-value', value);
13419
14555
  if (this.popupWrapper.contains(noDataEle)) {
13420
14556
  this.list.setAttribute('style', noDataEle.getAttribute('style'));
13421
14557
  this.popupWrapper.replaceChild(this.list, noDataEle);
13422
14558
  this.wireListEvents();
13423
14559
  }
14560
+ let currentText = [];
14561
+ var textValues = this.text != null ? this.text + ',' + text : text;
14562
+ currentText.push(textValues);
14563
+ this.setProperties({ text: currentText.toString() }, true);
13424
14564
  this.addChip(text, value);
13425
14565
  this.addListSelection(element);
13426
14566
  }
@@ -13450,7 +14590,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13450
14590
  }
13451
14591
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
13452
14592
  updateActionCompleteData(li, item) {
13453
- if (this.value && this.value.indexOf(li.getAttribute('data-value')) > -1) {
14593
+ if (this.value && ((!this.allowObjectBinding && this.value.indexOf(li.getAttribute('data-value')) > -1) || (this.allowObjectBinding && this.isObjectInArray(this.getDataByValue(li.getAttribute('data-value')), this.value)))) {
13454
14594
  this.mainList = this.ulElement;
13455
14595
  if (this.hideSelectedItem) {
13456
14596
  addClass([li], HIDE_LIST);
@@ -13488,13 +14628,13 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13488
14628
  }
13489
14629
  updateListSelection(li, e, length) {
13490
14630
  const customVal = li.getAttribute('data-value');
13491
- let value = this.getFormattedValue(customVal);
14631
+ let value = this.allowObjectBinding ? this.getDataByValue(customVal) : this.getFormattedValue(customVal);
13492
14632
  if (this.allowCustomValue && ((customVal !== 'false' && value === false) ||
13493
14633
  (!isNullOrUndefined(value) && value.toString() === 'NaN'))) {
13494
14634
  value = customVal;
13495
14635
  }
13496
14636
  this.removeHover();
13497
- if (!this.value || this.value.indexOf(value) === -1) {
14637
+ if (!this.value || ((!this.allowObjectBinding && this.value.indexOf(value) === -1) || (this.allowObjectBinding && this.indexOfObjectInArray(value, this.value) === -1))) {
13498
14638
  this.dispatchSelect(value, e, li, (li.getAttribute('aria-selected') === 'true'), length);
13499
14639
  }
13500
14640
  else {
@@ -13502,9 +14642,10 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13502
14642
  }
13503
14643
  }
13504
14644
  updateListSelectEventCallback(value, li, e) {
14645
+ value = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), value) : value;
13505
14646
  const text = this.getTextByValue(value);
13506
- if ((this.allowCustomValue || this.allowFiltering) && !this.findListElement(this.mainList, 'li', 'data-value', value)) {
13507
- const temp = li.cloneNode(true);
14647
+ if ((this.allowCustomValue || this.allowFiltering) && !this.findListElement(this.mainList, 'li', 'data-value', value) && (!this.enableVirtualization || (this.enableVirtualization && this.virtualCustomData))) {
14648
+ const temp = li ? li.cloneNode(true) : li;
13508
14649
  const fieldValue = this.fields.value ? this.fields.value : 'value';
13509
14650
  if (this.allowCustomValue && this.mainData.length && typeof getValue(fieldValue, this.mainData[0]) === 'number') {
13510
14651
  value = !isNaN(parseFloat(value.toString())) ? parseFloat(value.toString()) : value;
@@ -13516,10 +14657,22 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13516
14657
  };
13517
14658
  this.trigger('customValueSelection', eventArgs, (eventArgs) => {
13518
14659
  if (!eventArgs.cancel) {
13519
- append([temp], this.mainList);
13520
- this.mainData.push(data);
13521
- this.remoteCustomValue = false;
13522
- this.addValue(value, text, e);
14660
+ if (this.enableVirtualization && this.virtualCustomData) {
14661
+ if (this.virtualCustomSelectData && this.virtualCustomSelectData.length >= 0) {
14662
+ this.virtualCustomSelectData.push(data);
14663
+ }
14664
+ else {
14665
+ this.virtualCustomSelectData = [data];
14666
+ }
14667
+ this.remoteCustomValue = false;
14668
+ this.addValue(value, text, e);
14669
+ }
14670
+ else {
14671
+ append([temp], this.mainList);
14672
+ this.mainData.push(data);
14673
+ this.remoteCustomValue = false;
14674
+ this.addValue(value, text, e);
14675
+ }
13523
14676
  }
13524
14677
  });
13525
14678
  }
@@ -13628,8 +14781,12 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13628
14781
  onMouseClick(e) {
13629
14782
  this.keyCode = null;
13630
14783
  this.scrollFocusStatus = false;
14784
+ this.keyboardEvent = null;
13631
14785
  let target = e.target;
13632
14786
  const li = closest(target, '.' + dropDownBaseClasses.li);
14787
+ if (this.enableVirtualization && li && li.classList.contains('e-virtual-list')) {
14788
+ return;
14789
+ }
13633
14790
  const headerLi = closest(target, '.' + dropDownBaseClasses.group);
13634
14791
  if (headerLi && this.enableGroupCheckBox && this.mode === 'CheckBox' && this.fields.groupBy) {
13635
14792
  target = target.classList.contains('e-list-group-item') ? target.firstElementChild.lastElementChild
@@ -13706,6 +14863,39 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13706
14863
  else {
13707
14864
  e.preventDefault();
13708
14865
  }
14866
+ if (this.enableVirtualization && this.hideSelectedItem) {
14867
+ let visibleListElements = this.list.querySelectorAll('li.'
14868
+ + dropDownBaseClasses.li
14869
+ + ':not(.' + HIDE_LIST + ')' + ':not(.e-reorder-hide)' + ':not(.e-virtual-list)');
14870
+ if (visibleListElements.length) {
14871
+ const actualCount = this.virtualListHeight > 0 ? Math.floor(this.virtualListHeight / this.listItemHeight) : 0;
14872
+ if (visibleListElements.length < (actualCount + 2)) {
14873
+ let query = this.getForQuery(this.value).clone();
14874
+ query = query.skip(this.virtualItemStartIndex);
14875
+ this.resetList(this.dataSource, this.fields, query);
14876
+ this.UpdateSkeleton();
14877
+ this.liCollections = this.list.querySelectorAll('.' + dropDownBaseClasses.li);
14878
+ this.virtualItemCount = this.itemCount;
14879
+ if (this.mode !== 'CheckBox') {
14880
+ this.totalItemCount = this.value && this.value.length ? this.totalItemCount - this.value.length : this.totalItemCount;
14881
+ }
14882
+ if (!this.list.querySelector('.e-virtual-ddl')) {
14883
+ var virualElement = this.createElement('div', {
14884
+ id: this.element.id + '_popup', className: 'e-virtual-ddl', styles: this.GetVirtualTrackHeight()
14885
+ });
14886
+ this.popupWrapper.querySelector('.e-dropdownbase').appendChild(virualElement);
14887
+ }
14888
+ else {
14889
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14890
+ this.list.getElementsByClassName('e-virtual-ddl')[0].style = this.GetVirtualTrackHeight();
14891
+ }
14892
+ if (this.list.querySelector('.e-virtual-ddl-content')) {
14893
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14894
+ this.list.getElementsByClassName('e-virtual-ddl-content')[0].style = this.getTransformValues();
14895
+ }
14896
+ }
14897
+ }
14898
+ }
13709
14899
  this.refreshPlaceHolder();
13710
14900
  this.deselectHeader();
13711
14901
  }
@@ -13943,7 +15133,9 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13943
15133
  let remaining;
13944
15134
  let downIconWidth = 0;
13945
15135
  let overAllContainer;
13946
- this.updateWrapperText(this.viewWrapper, data);
15136
+ if (!this.enableVirtualization) {
15137
+ this.updateWrapperText(this.viewWrapper, data);
15138
+ }
13947
15139
  const l10nLocale = {
13948
15140
  noRecordsTemplate: 'No records found',
13949
15141
  actionFailureTemplate: 'Request failed',
@@ -13974,11 +15166,21 @@ let MultiSelect = class MultiSelect extends DropDownBase {
13974
15166
  this.checkClearIconWidth();
13975
15167
  if (!isNullOrUndefined(this.value)) {
13976
15168
  for (let index = 0; !isNullOrUndefined(this.value[index]); index++) {
13977
- data += (index === 0) ? '' : this.delimiterChar + ' ';
13978
- temp = this.getOverflowVal(index);
13979
- data += temp;
13980
- temp = this.viewWrapper.innerHTML;
13981
- this.updateWrapperText(this.viewWrapper, data);
15169
+ let items = this.text && this.text.split(this.delimiterChar);
15170
+ if (!this.enableVirtualization) {
15171
+ data += (index === 0) ? '' : this.delimiterChar + ' ';
15172
+ temp = this.getOverflowVal(index);
15173
+ data += temp;
15174
+ temp = this.viewWrapper.innerHTML;
15175
+ this.updateWrapperText(this.viewWrapper, data);
15176
+ }
15177
+ else if (items) {
15178
+ data += (index === 0) ? '' : this.delimiterChar + ' ';
15179
+ temp = items[index];
15180
+ data += temp;
15181
+ temp = this.viewWrapper.innerHTML;
15182
+ this.updateWrapperText(this.viewWrapper, data);
15183
+ }
13982
15184
  wrapperleng = this.viewWrapper.offsetWidth +
13983
15185
  parseInt(window.getComputedStyle(this.viewWrapper).paddingRight, 10);
13984
15186
  overAllContainer = this.componentWrapper.offsetWidth -
@@ -14081,18 +15283,19 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14081
15283
  getOverflowVal(index) {
14082
15284
  let temp;
14083
15285
  if (this.mainData && this.mainData.length) {
15286
+ const value = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), this.value[index]) : this.value[index];
14084
15287
  if (this.mode === 'CheckBox') {
14085
15288
  const newTemp = this.listData;
14086
15289
  this.listData = this.mainData;
14087
- temp = this.getTextByValue(this.value[index]);
15290
+ temp = this.getTextByValue(value);
14088
15291
  this.listData = newTemp;
14089
15292
  }
14090
15293
  else {
14091
- temp = this.getTextByValue(this.value[index]);
15294
+ temp = this.getTextByValue(value);
14092
15295
  }
14093
15296
  }
14094
15297
  else {
14095
- temp = this.value[index];
15298
+ temp = this.allowObjectBinding ? getValue(((this.fields.value) ? this.fields.value : ''), this.value[index]) : this.value[index];
14096
15299
  }
14097
15300
  return temp;
14098
15301
  }
@@ -14209,7 +15412,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14209
15412
  preventSelectEvent: false
14210
15413
  };
14211
15414
  this.trigger('beforeSelectAll', beforeSelectArgs);
14212
- if (li && li.length) {
15415
+ if ((li && li.length) || (this.enableVirtualization && !state)) {
14213
15416
  let index = 0;
14214
15417
  let count = 0;
14215
15418
  if (this.enableGroupCheckBox) {
@@ -14219,37 +15422,127 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14219
15422
  count = state ? this.maximumSelectionLength - (this.value ? this.value.length : 0) : this.maximumSelectionLength;
14220
15423
  }
14221
15424
  if (!beforeSelectArgs.preventSelectEvent) {
14222
- this.isSelectAllTarget = (length === index + 1);
14223
- while (index < length && index <= 50 && index < count) {
14224
- this.updateListSelection(li[index], event, length - index);
14225
- if (this.enableGroupCheckBox) {
14226
- this.findGroupStart(li[index]);
14227
- }
14228
- index++;
14229
- }
14230
- if (length > 50) {
14231
- setTimeout(() => {
14232
- while (index < length && index < count) {
14233
- this.isSelectAllTarget = (length === index + 1);
14234
- this.updateListSelection(li[index], event, length - index);
14235
- if (this.enableGroupCheckBox) {
14236
- this.findGroupStart(li[index]);
15425
+ if (this.enableVirtualization) {
15426
+ if (state) {
15427
+ this.virtualSelectAll = true;
15428
+ this.resetList(this.dataSource, this.fields, new Query().skip(this.viewPortInfo.startIndex));
15429
+ if (this.virtualSelectAllData instanceof Array) {
15430
+ for (var i = 0; i < this.virtualSelectAllData.length; i++) {
15431
+ if (li[this.skeletonCount + i]) {
15432
+ let value = this.allowObjectBinding ? this.getDataByValue(li[this.skeletonCount + i].getAttribute('data-value')) : this.getFormattedValue(li[this.skeletonCount + i].getAttribute('data-value'));
15433
+ if (((!this.allowObjectBinding && this.value && this.value.indexOf(value) === 1) || (this.allowObjectBinding && this.indexOfObjectInArray(value, this.value) === 1))) {
15434
+ continue;
15435
+ }
15436
+ this.updateListSelection(li[this.skeletonCount + i], event, length - i);
15437
+ }
15438
+ else {
15439
+ if (this.fields) {
15440
+ let value = getValue(this.fields.value, this.virtualSelectAllData[i]);
15441
+ value = this.allowObjectBinding ? this.getDataByValue(value) : value;
15442
+ if (((!this.allowObjectBinding && this.value && this.value.indexOf(value) === 1) || (this.allowObjectBinding && this.indexOfObjectInArray(value, this.value) === 1))) {
15443
+ continue;
15444
+ }
15445
+ if (this.value && value != null && Array.isArray(this.value) && ((!this.allowObjectBinding && this.value.indexOf(value) < 0) || (this.allowObjectBinding && !this.isObjectInArray(value, this.value)))) {
15446
+ this.dispatchSelect(value, event, null, false, length);
15447
+ }
15448
+ }
15449
+ }
15450
+ }
15451
+ if (this.virtualSelectAllData && this.value.length != this.virtualSelectAllData.length && this.virtualItemStartIndex != 0) {
15452
+ if (this.virtualItemStartIndex > this.itemCount) {
15453
+ for (var i = 0; i < this.itemCount; i++) {
15454
+ if (this.fields) {
15455
+ let value = getValue(this.fields.value, this.virtualSelectAllData[i]);
15456
+ value = this.allowObjectBinding ? this.getDataByValue(value) : value;
15457
+ if (this.value && value != null && Array.isArray(this.value) && ((!this.allowObjectBinding && this.value.indexOf(value) < 0) || (this.allowObjectBinding && !this.isObjectInArray(value, this.value)))) {
15458
+ this.setProperties({ value: [].concat([], this.value, this.allowObjectBinding ? [this.virtualSelectAllData[i]] : [value]) }, true);
15459
+ }
15460
+ }
15461
+ }
15462
+ }
15463
+ }
15464
+ else {
15465
+ for (var i = 0; i < this.virtualItemStartIndex; i++) {
15466
+ if (this.fields) {
15467
+ var value = getValue(this.fields.value, this.virtualSelectAllData[i]);
15468
+ value = this.allowObjectBinding ? this.getDataByValue(value) : value;
15469
+ if (Array.isArray(this.value) && ((!this.allowObjectBinding && this.value.indexOf(value) < 0) || (this.allowObjectBinding && !this.isObjectInArray(value, this.value)))) {
15470
+ this.setProperties({ value: [].concat([], this.value, this.allowObjectBinding ? [this.virtualSelectAllData[i]] : [value]) }, true);
15471
+ }
15472
+ }
15473
+ }
14237
15474
  }
15475
+ }
15476
+ }
15477
+ else {
15478
+ while (index < this.value.length && index <= 50 && index < count && this.value.length > 0) {
15479
+ this.removeValue(this.value[index], event, this.value.length - index);
14238
15480
  index++;
14239
15481
  }
14240
- this.updatedataValueItems(event);
14241
- if (!this.changeOnBlur) {
14242
- this.updateValueState(event, this.value, this.tempValues);
14243
- this.isSelectAll = this.isSelectAll ? !this.isSelectAll : this.isSelectAll;
15482
+ if (length > 50) {
15483
+ setTimeout(() => {
15484
+ while (index < this.value.length && index < count && this.value.length > 0) {
15485
+ this.removeValue(value[index], event, this.value.length - index);
15486
+ index++;
15487
+ }
15488
+ this.updatedataValueItems(event);
15489
+ if (!this.changeOnBlur) {
15490
+ this.updateValueState(event, this.value, this.tempValues);
15491
+ this.isSelectAll = this.isSelectAll ? !this.isSelectAll : this.isSelectAll;
15492
+ }
15493
+ this.updateHiddenElement();
15494
+ }, 0);
14244
15495
  }
14245
- this.updateHiddenElement();
14246
- if (this.popupWrapper && li[index - 1].classList.contains('e-item-focus')) {
14247
- const selectAllParent = document.getElementsByClassName('e-selectall-parent')[0];
14248
- if (selectAllParent && selectAllParent.classList.contains('e-item-focus')) {
14249
- li[index - 1].classList.remove('e-item-focus');
14250
- }
15496
+ this.value = [];
15497
+ this.virtualSelectAll = false;
15498
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15499
+ let ulElement = this.renderItems(this.listData, this.fields);
15500
+ }
15501
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15502
+ const virtualTrackElement = this.list.getElementsByClassName('e-virtual-ddl')[0];
15503
+ if (virtualTrackElement) {
15504
+ (virtualTrackElement).style = this.GetVirtualTrackHeight();
15505
+ }
15506
+ this.UpdateSkeleton();
15507
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15508
+ const virtualContentElement = this.list.getElementsByClassName('e-virtual-ddl-content')[0];
15509
+ if (virtualContentElement) {
15510
+ (virtualContentElement).style = this.getTransformValues();
15511
+ }
15512
+ }
15513
+ else {
15514
+ while (index < length && index <= 50 && index < count) {
15515
+ this.isSelectAllTarget = (length === index + 1);
15516
+ this.updateListSelection(li[index], event, length - index);
15517
+ if (this.enableGroupCheckBox) {
15518
+ this.findGroupStart(li[index]);
14251
15519
  }
14252
- }, 0);
15520
+ index++;
15521
+ }
15522
+ if (length > 50) {
15523
+ setTimeout(() => {
15524
+ while (index < length && index < count) {
15525
+ this.isSelectAllTarget = (length === index + 1);
15526
+ this.updateListSelection(li[index], event, length - index);
15527
+ if (this.enableGroupCheckBox) {
15528
+ this.findGroupStart(li[index]);
15529
+ }
15530
+ index++;
15531
+ }
15532
+ this.updatedataValueItems(event);
15533
+ if (!this.changeOnBlur) {
15534
+ this.updateValueState(event, this.value, this.tempValues);
15535
+ this.isSelectAll = this.isSelectAll ? !this.isSelectAll : this.isSelectAll;
15536
+ }
15537
+ this.updateHiddenElement();
15538
+ if (this.popupWrapper && li[index - 1].classList.contains('e-item-focus')) {
15539
+ const selectAllParent = document.getElementsByClassName('e-selectall-parent')[0];
15540
+ if (selectAllParent && selectAllParent.classList.contains('e-item-focus')) {
15541
+ li[index - 1].classList.remove('e-item-focus');
15542
+ }
15543
+ }
15544
+ }, 0);
15545
+ }
14253
15546
  }
14254
15547
  }
14255
15548
  else {
@@ -14257,12 +15550,13 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14257
15550
  this.removeHover();
14258
15551
  let customVal = li[i].getAttribute('data-value');
14259
15552
  let value = this.getFormattedValue(customVal);
15553
+ value = this.allowObjectBinding ? this.getDataByValue(value) : value;
14260
15554
  let mainElement = this.mainList ? this.mainList.querySelectorAll(state ?
14261
15555
  'li.e-list-item:not([aria-selected="true"]):not(.e-reorder-hide)' :
14262
15556
  'li.e-list-item[aria-selected="true"]:not(.e-reorder-hide)')[i] : null;
14263
15557
  if (state) {
14264
15558
  this.value = !this.value ? [] : this.value;
14265
- if (this.value.indexOf(value) < 0) {
15559
+ if ((!this.allowObjectBinding && this.value.indexOf(value) < 0) || (this.allowObjectBinding && !this.isObjectInArray(value, this.value))) {
14266
15560
  this.setProperties({ value: [].concat([], this.value, [value]) }, true);
14267
15561
  }
14268
15562
  this.removeFocus();
@@ -14406,6 +15700,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14406
15700
  }
14407
15701
  this.selectAllItem(state, event);
14408
15702
  }
15703
+ this.virtualSelectAll = false;
14409
15704
  }
14410
15705
  /**
14411
15706
  * Get the properties to be maintained in the persisted state.
@@ -14572,12 +15867,31 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14572
15867
  }
14573
15868
  this.renderPopup();
14574
15869
  }
15870
+ totalItemsCount() {
15871
+ let dataSourceCount;
15872
+ if (this.dataSource instanceof DataManager) {
15873
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15874
+ dataSourceCount = this.virtualGroupDataSource && this.virtualGroupDataSource.length ? this.virtualGroupDataSource.length : 0;
15875
+ }
15876
+ else {
15877
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15878
+ dataSourceCount = this.dataSource && this.dataSource.length ? this.dataSource.length : 0;
15879
+ }
15880
+ if (this.mode === 'CheckBox') {
15881
+ this.totalItemCount = dataSourceCount != 0 ? dataSourceCount : this.totalItemCount;
15882
+ }
15883
+ else {
15884
+ this.totalItemCount = dataSourceCount != 0 ? dataSourceCount - this.value.length : this.totalItemCount;
15885
+ }
15886
+ }
14575
15887
  presentItemValue(ulElement) {
14576
15888
  let valuecheck = [];
14577
15889
  for (let i = 0; i < this.value.length; i++) {
14578
- let checkEle = this.findListElement(((this.allowFiltering && !isNullOrUndefined(this.mainList)) ? this.mainList : ulElement), 'li', 'data-value', this.value[i]);
15890
+ const value = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', this.value[i]) : this.value[i];
15891
+ let checkEle = this.findListElement(((this.allowFiltering && !isNullOrUndefined(this.mainList)) ? this.mainList : ulElement), 'li', 'data-value', value);
14579
15892
  if (!checkEle) {
14580
- valuecheck.push(this.value[i]);
15893
+ const checkvalue = this.allowObjectBinding ? this.getDataByValue(this.value[i]) : this.value[i];
15894
+ valuecheck.push(checkvalue);
14581
15895
  }
14582
15896
  }
14583
15897
  return valuecheck;
@@ -14688,6 +16002,31 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14688
16002
  if (this.mode === 'CheckBox' && this.showSelectAll) {
14689
16003
  EventHandler.remove(this.popupObj.element, 'click', this.clickHandler);
14690
16004
  }
16005
+ if (this.enableVirtualization && this.mode === 'CheckBox') {
16006
+ this.viewPortInfo.startIndex = this.virtualItemStartIndex = 0;
16007
+ this.viewPortInfo.endIndex = this.virtualItemEndIndex = this.viewPortInfo.startIndex > 0 ? this.viewPortInfo.endIndex : this.itemCount;
16008
+ this.previousStartIndex = 0;
16009
+ this.previousEndIndex = 0;
16010
+ }
16011
+ let dataSourceCount;
16012
+ if (this.dataSource instanceof DataManager) {
16013
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16014
+ dataSourceCount = this.virtualGroupDataSource && this.virtualGroupDataSource.length ? this.virtualGroupDataSource.length : 0;
16015
+ }
16016
+ else {
16017
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16018
+ dataSourceCount = this.dataSource && this.dataSource.length ? this.dataSource.length : 0;
16019
+ }
16020
+ if (this.enableVirtualization && (this.allowFiltering || this.allowCustomValue) && this.value != null && this.targetElement() && this.totalItemCount !== dataSourceCount) {
16021
+ this.updateInitialData();
16022
+ this.checkAndResetCache();
16023
+ }
16024
+ if (this.virtualCustomData && this.viewPortInfo && this.viewPortInfo.startIndex === 0 && this.viewPortInfo.endIndex === this.itemCount) {
16025
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16026
+ this.renderItems(this.mainData, this.fields);
16027
+ }
16028
+ this.virtualCustomData = null;
16029
+ this.isVirtualTrackHeight = false;
14691
16030
  }
14692
16031
  });
14693
16032
  }
@@ -14701,6 +16040,7 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14701
16040
  if (!this.enabled) {
14702
16041
  return;
14703
16042
  }
16043
+ this.firstItem = this.dataSource && this.dataSource.length > 0 ? this.dataSource[0] : null;
14704
16044
  const args = { cancel: false };
14705
16045
  this.trigger('beforeOpen', args, (args) => {
14706
16046
  if (!args.cancel) {
@@ -14723,6 +16063,46 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14723
16063
  return;
14724
16064
  }
14725
16065
  this.onPopupShown(e);
16066
+ if (this.enableVirtualization && this.listData && this.listData.length) {
16067
+ if (!isNullOrUndefined(this.value) && (this.getModuleName() === 'dropdownlist' || this.getModuleName() === 'combobox')) {
16068
+ this.removeHover();
16069
+ }
16070
+ if (!this.beforePopupOpen) {
16071
+ if (this.hideSelectedItem && this.value && Array.isArray(this.value) && this.value.length > 0) {
16072
+ this.totalItemsCount();
16073
+ }
16074
+ if (!this.preventSetCurrentData && !isNullOrUndefined(this.viewPortInfo.startIndex) && !isNullOrUndefined(this.viewPortInfo.endIndex)) {
16075
+ this.notify("setCurrentViewDataAsync", {
16076
+ component: this.getModuleName(),
16077
+ module: "VirtualScroll",
16078
+ });
16079
+ }
16080
+ }
16081
+ }
16082
+ if (this.enableVirtualization && !this.allowFiltering && this.selectedValueInfo != null && this.selectedValueInfo.startIndex > 0 && this.value != null) {
16083
+ this.notify("dataProcessAsync", {
16084
+ module: "VirtualScroll",
16085
+ isOpen: true,
16086
+ });
16087
+ }
16088
+ if (this.enableVirtualization) {
16089
+ this.updatevirtualizationList();
16090
+ }
16091
+ else {
16092
+ if (this.value && this.value.length) {
16093
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16094
+ let element;
16095
+ const listItems = this.getItems();
16096
+ for (const value of this.value) {
16097
+ const checkValue = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', value) : value;
16098
+ element = this.getElementByValue(checkValue);
16099
+ if (element) {
16100
+ this.addListSelection(element);
16101
+ }
16102
+ }
16103
+ }
16104
+ }
16105
+ this.preventSetCurrentData = true;
14726
16106
  }
14727
16107
  });
14728
16108
  }
@@ -14874,6 +16254,13 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14874
16254
  this.wireEvent();
14875
16255
  this.enable(this.enabled);
14876
16256
  this.enableRTL(this.enableRtl);
16257
+ if (this.enableVirtualization) {
16258
+ this.updateVirtualizationProperties(this.itemCount, this.allowFiltering, this.mode === 'CheckBox');
16259
+ }
16260
+ this.listItemHeight = this.getListHeight();
16261
+ this.getSkeletonCount();
16262
+ this.viewPortInfo.startIndex = this.virtualItemStartIndex = 0;
16263
+ this.viewPortInfo.endIndex = this.virtualItemEndIndex = this.viewPortInfo.startIndex > 0 ? this.viewPortInfo.endIndex : this.itemCount;
14877
16264
  this.checkInitialValue();
14878
16265
  if (this.element.hasAttribute('data-val')) {
14879
16266
  this.element.setAttribute('data-val', 'false');
@@ -14885,6 +16272,22 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14885
16272
  }
14886
16273
  this.renderComplete();
14887
16274
  }
16275
+ getListHeight() {
16276
+ let listParent = this.createElement('div', {
16277
+ className: 'e-dropdownbase'
16278
+ });
16279
+ let item = this.createElement('li', {
16280
+ className: 'e-list-item'
16281
+ });
16282
+ let listParentHeight = formatUnit(this.popupHeight);
16283
+ listParent.style.height = (parseInt(listParentHeight, 10)).toString() + 'px';
16284
+ listParent.appendChild(item);
16285
+ document.body.appendChild(listParent);
16286
+ this.virtualListHeight = listParent.getBoundingClientRect().height;
16287
+ let listItemHeight = Math.ceil(item.getBoundingClientRect().height);
16288
+ listParent.remove();
16289
+ return listItemHeight;
16290
+ }
14888
16291
  checkInitialValue() {
14889
16292
  const isData = this.dataSource instanceof Array ? (this.dataSource.length > 0)
14890
16293
  : !isNullOrUndefined(this.dataSource);
@@ -14900,7 +16303,8 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14900
16303
  const opt = optionsElement[index];
14901
16304
  if (!isNullOrUndefined(opt.getAttribute('selected'))) {
14902
16305
  if (opt.getAttribute('value')) {
14903
- valueCol.push(opt.getAttribute('value'));
16306
+ let value = this.allowObjectBinding ? this.getDataByValue(opt.getAttribute('value')) : opt.getAttribute('value');
16307
+ valueCol.push(value);
14904
16308
  }
14905
16309
  else {
14906
16310
  textCol += (opt.text + this.delimiterChar);
@@ -14927,14 +16331,40 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14927
16331
  this.initialTextUpdate();
14928
16332
  }
14929
16333
  if (this.value && this.value.length) {
16334
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16335
+ let listItems;
16336
+ if (this.enableVirtualization) {
16337
+ const fields = (this.fields.value) ? this.fields.value : '';
16338
+ let predicate;
16339
+ for (let i = 0; i < this.value.length; i++) {
16340
+ const value = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', this.value[i]) : this.value[i];
16341
+ if (i === 0) {
16342
+ predicate = new Predicate(fields, 'equal', value);
16343
+ }
16344
+ else {
16345
+ predicate = predicate.or(fields, 'equal', value);
16346
+ }
16347
+ }
16348
+ if (this.dataSource instanceof DataManager) {
16349
+ this.dataSource.executeQuery(new Query().where(predicate))
16350
+ .then((e) => {
16351
+ if (e.result.result.length > 0) {
16352
+ listItems = e.result.result;
16353
+ }
16354
+ });
16355
+ }
16356
+ else {
16357
+ listItems = new DataManager(this.dataSource).executeLocal(new Query().where(predicate));
16358
+ }
16359
+ }
14930
16360
  if (!(this.dataSource instanceof DataManager)) {
14931
- this.initialValueUpdate();
16361
+ this.initialValueUpdate(listItems);
14932
16362
  this.initialUpdate();
14933
16363
  }
14934
16364
  else {
14935
16365
  this.setInitialValue = () => {
14936
16366
  this.initStatus = false;
14937
- this.initialValueUpdate();
16367
+ this.initialValueUpdate(listItems);
14938
16368
  this.initialUpdate();
14939
16369
  this.setInitialValue = null;
14940
16370
  this.initStatus = true;
@@ -14956,6 +16386,33 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14956
16386
  this.inputElement.focus();
14957
16387
  }
14958
16388
  }
16389
+ updatevirtualizationList() {
16390
+ if (this.value && this.value.length) {
16391
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16392
+ let element;
16393
+ const listItems = this.getItems();
16394
+ for (const value of this.value) {
16395
+ const checkValue = this.allowObjectBinding ? getValue((this.fields.value) ? this.fields.value : '', value) : value;
16396
+ element = this.getElementByValue(checkValue);
16397
+ if (element) {
16398
+ this.addListSelection(element);
16399
+ }
16400
+ }
16401
+ if (this.enableVirtualization && this.hideSelectedItem) {
16402
+ let visibleListElements = this.list.querySelectorAll('li.'
16403
+ + dropDownBaseClasses.li
16404
+ + ':not(.' + HIDE_LIST + ')' + ':not(.e-reorder-hide)' + ':not(.e-virtual-list)');
16405
+ if (visibleListElements.length) {
16406
+ var actualCount = this.virtualListHeight > 0 ? Math.floor(this.virtualListHeight / this.listItemHeight) : 0;
16407
+ if (visibleListElements.length < (actualCount + 2)) {
16408
+ var query = this.getForQuery(this.value).clone();
16409
+ query = query.skip(this.viewPortInfo.startIndex);
16410
+ this.resetList(this.dataSource, this.fields, query);
16411
+ }
16412
+ }
16413
+ }
16414
+ }
16415
+ }
14959
16416
  setFloatLabelType() {
14960
16417
  removeFloating(this.overAllWrapper, this.componentWrapper, this.searchWrapper, this.inputElement, this.value, this.floatLabelType, this.placeholder);
14961
16418
  if (this.floatLabelType !== 'Never') {
@@ -14989,6 +16446,8 @@ let MultiSelect = class MultiSelect extends DropDownBase {
14989
16446
  if (this.mode !== 'Box' && !(this.setDynValue && this.mode === 'Default' && this.inputFocus)) {
14990
16447
  this.updateDelimView();
14991
16448
  }
16449
+ this.viewPortInfo.startIndex = this.virtualItemStartIndex = 0;
16450
+ this.viewPortInfo.endIndex = this.virtualItemEndIndex = this.itemCount;
14992
16451
  this.updateCssClass();
14993
16452
  this.updateHTMLAttribute();
14994
16453
  this.updateReadonly(this.readonly);
@@ -15086,6 +16545,9 @@ __decorate$5([
15086
16545
  __decorate$5([
15087
16546
  Property(true)
15088
16547
  ], MultiSelect.prototype, "enableHtmlSanitizer", void 0);
16548
+ __decorate$5([
16549
+ Property(false)
16550
+ ], MultiSelect.prototype, "enableVirtualization", void 0);
15089
16551
  __decorate$5([
15090
16552
  Property([])
15091
16553
  ], MultiSelect.prototype, "dataSource", void 0);
@@ -15164,6 +16626,9 @@ __decorate$5([
15164
16626
  __decorate$5([
15165
16627
  Property(null)
15166
16628
  ], MultiSelect.prototype, "value", void 0);
16629
+ __decorate$5([
16630
+ Property(false)
16631
+ ], MultiSelect.prototype, "allowObjectBinding", void 0);
15167
16632
  __decorate$5([
15168
16633
  Property(true)
15169
16634
  ], MultiSelect.prototype, "hideSelectedItem", void 0);
@@ -15391,7 +16856,7 @@ class CheckBoxSelection {
15391
16856
  }
15392
16857
  EventHandler.add(this.checkAllParent, 'mousedown', this.clickHandler, this);
15393
16858
  }
15394
- if (this.parent.list.classList.contains('e-nodata') || (this.parent.listData && this.parent.listData.length <= 1 &&
16859
+ if (this.parent.list.classList.contains('e-nodata') || (this.parent.listData && this.parent.listData.length <= 1 && !this.parent.enableVirtualization &&
15395
16860
  !(this.parent.isDynamicDataChange)) || (this.parent.isDynamicDataChange &&
15396
16861
  this.parent.listData && this.parent.listData.length <= 1)) {
15397
16862
  this.checkAllParent.style.display = 'none';
@@ -15752,7 +17217,13 @@ class CheckBoxSelection {
15752
17217
  });
15753
17218
  remLi = this.parent.ulElement.querySelectorAll('li.e-active');
15754
17219
  addClass(remLi, 'e-reorder-hide');
15755
- prepend([ulEle], this.parent.list);
17220
+ if (this.parent.enableVirtualization) {
17221
+ var virtualUlElement = this.parent.list.querySelector('.e-virtual-ddl-content');
17222
+ prepend([ulEle], virtualUlElement);
17223
+ }
17224
+ else {
17225
+ prepend([ulEle], this.parent.list);
17226
+ }
15756
17227
  }
15757
17228
  this.parent.focusAtFirstListItem();
15758
17229
  }
@@ -16125,7 +17596,7 @@ let ListBox = ListBox_1 = class ListBox extends DropDownBase {
16125
17596
  }
16126
17597
  }
16127
17598
  this.initWrapper();
16128
- this.setSelection();
17599
+ this.setSelection(this.value, true, false, !this.isRendered);
16129
17600
  this.initDraggable();
16130
17601
  this.mainList = this.ulElement;
16131
17602
  if (this.initLoad) {
@@ -17762,7 +19233,7 @@ let ListBox = ListBox_1 = class ListBox extends DropDownBase {
17762
19233
  });
17763
19234
  }
17764
19235
  }
17765
- setSelection(values = this.value, isSelect = true, isText = false) {
19236
+ setSelection(values = this.value, isSelect = true, isText = false, canFocus = true) {
17766
19237
  let li;
17767
19238
  let liselect;
17768
19239
  if (values) {
@@ -17791,13 +19262,17 @@ let ListBox = ListBox_1 = class ListBox extends DropDownBase {
17791
19262
  if (!isSelect && liselect || isSelect && !liselect && li) {
17792
19263
  if (this.selectionSettings.showCheckbox) {
17793
19264
  this.notify('updatelist', { li: li, module: 'listbox' });
17794
- li.focus();
19265
+ if (canFocus) {
19266
+ li.focus();
19267
+ }
17795
19268
  }
17796
19269
  else {
17797
19270
  if (isSelect) {
17798
19271
  li.classList.add(cssClass.selected);
17799
19272
  li.setAttribute('aria-selected', 'true');
17800
- li.focus();
19273
+ if (canFocus) {
19274
+ li.focus();
19275
+ }
17801
19276
  }
17802
19277
  else {
17803
19278
  li.classList.remove(cssClass.selected);
@@ -18280,6 +19755,8 @@ let Mention = class Mention extends DropDownBase {
18280
19755
  this.isPopupOpen = false;
18281
19756
  this.isCollided = false;
18282
19757
  this.lineBreak = false;
19758
+ this.isRTE = false;
19759
+ this.keyEventName = 'mousedown';
18283
19760
  }
18284
19761
  /**
18285
19762
  * Execute before render the list items
@@ -18325,7 +19802,7 @@ let Mention = class Mention extends DropDownBase {
18325
19802
  }
18326
19803
  bindCommonEvent() {
18327
19804
  if (!Browser.isDevice) {
18328
- this.inputElement.addEventListener('keydown', this.keyDownHandler.bind(this), true);
19805
+ this.inputElement.addEventListener('keydown', this.keyDownHandler.bind(this), !this.isRTE);
18329
19806
  }
18330
19807
  }
18331
19808
  /**
@@ -18355,6 +19832,10 @@ let Mention = class Mention extends DropDownBase {
18355
19832
  return parentElement.querySelector('.e-content');
18356
19833
  }
18357
19834
  }
19835
+ if (targetElement && targetElement.parentElement && targetElement.parentElement.classList.contains('e-rte-content')) {
19836
+ this.isRTE = true;
19837
+ this.keyEventName = 'click';
19838
+ }
18358
19839
  return targetElement;
18359
19840
  }
18360
19841
  /**
@@ -18496,7 +19977,7 @@ let Mention = class Mention extends DropDownBase {
18496
19977
  }
18497
19978
  unBindCommonEvent() {
18498
19979
  if (!Browser.isDevice) {
18499
- this.inputElement.removeEventListener('keydown', this.keyDownHandler.bind(this), true);
19980
+ this.inputElement.removeEventListener('keydown', this.keyDownHandler.bind(this), !this.isRTE);
18500
19981
  }
18501
19982
  }
18502
19983
  onKeyUp(e) {
@@ -18507,7 +19988,7 @@ let Mention = class Mention extends DropDownBase {
18507
19988
  }
18508
19989
  this.isTyped = e.code !== 'Enter' && e.code !== 'Space' && e.code !== 'ArrowDown' && e.code !== 'ArrowUp' ? true : false;
18509
19990
  const isRteImage = document.activeElement.parentElement && document.activeElement.parentElement.querySelector('.e-rte-image') ? true : false;
18510
- if (document.activeElement != this.inputElement && !isRteImage) {
19991
+ if (document.activeElement != this.inputElement && isRteImage) {
18511
19992
  this.inputElement.focus();
18512
19993
  }
18513
19994
  if (this.isContentEditable(this.inputElement)) {
@@ -18535,7 +20016,7 @@ let Mention = class Mention extends DropDownBase {
18535
20016
  this.range.startContainer.nodeType === 1))) {
18536
20017
  if (this.isPopupOpen && this.allowSpaces && currentRange && currentRange.trim() !== '' && charRegex.test(currentRange) && currentRange.indexOf(this.mentionChar) !== -1
18537
20018
  && !this.isMatchedText() && (currentRange.length > 1 && currentRange.replace(/\u00A0/g, ' ').charAt(currentRange.length - 2) !== ' ') &&
18538
- (this.list && this.list.querySelectorAll('ul').length > 0)) {
20019
+ (this.list && this.list.querySelectorAll('ul').length > 0) && e.code !== 'Enter') {
18539
20020
  this.queryString = currentRange.substring(currentRange.lastIndexOf(this.mentionChar) + 1).replace('\u00a0', ' ');
18540
20021
  this.searchLists(e);
18541
20022
  }
@@ -19175,7 +20656,7 @@ let Mention = class Mention extends DropDownBase {
19175
20656
  * @returns {void}
19176
20657
  */
19177
20658
  wireListEvents() {
19178
- EventHandler.add(this.list, 'mousedown', this.onMouseClick, this);
20659
+ EventHandler.add(this.list, this.keyEventName, this.onMouseClick, this);
19179
20660
  EventHandler.add(this.list, 'mouseover', this.onMouseOver, this);
19180
20661
  EventHandler.add(this.list, 'mouseout', this.onMouseLeave, this);
19181
20662
  }
@@ -19185,7 +20666,7 @@ let Mention = class Mention extends DropDownBase {
19185
20666
  * @returns {void}
19186
20667
  */
19187
20668
  unWireListEvents() {
19188
- EventHandler.remove(this.list, 'mousedown', this.onMouseClick);
20669
+ EventHandler.remove(this.list, this.keyEventName, this.onMouseClick);
19189
20670
  EventHandler.remove(this.list, 'mouseover', this.onMouseOver);
19190
20671
  EventHandler.remove(this.list, 'mouseout', this.onMouseLeave);
19191
20672
  }
@@ -19200,7 +20681,9 @@ let Mention = class Mention extends DropDownBase {
19200
20681
  const delay = 100;
19201
20682
  this.closePopup(delay, e);
19202
20683
  this.inputElement.focus();
19203
- e.preventDefault();
20684
+ if (!this.isRTE) {
20685
+ e.preventDefault();
20686
+ }
19204
20687
  }
19205
20688
  updateSelectedItem(li, e, preventSelect, isSelection) {
19206
20689
  this.removeSelection();
@@ -19440,7 +20923,7 @@ let Mention = class Mention extends DropDownBase {
19440
20923
  if (this.isPopupOpen) {
19441
20924
  this.hidePopup();
19442
20925
  }
19443
- //New event to update the RichTextEditor value, when a mention item is selected using mouse click action.
20926
+ //New event to update the RichTextEditor value, when a mention item is selected using mouse click action.
19444
20927
  if (!isNullOrUndefined(e.pointerType) && e.pointerType === 'mouse') {
19445
20928
  const event = new CustomEvent('content-changed', { detail: { click: true } });
19446
20929
  this.inputElement.dispatchEvent(event);