igniteui-angular 21.0.3 → 21.1.0-alpha.1

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 (93) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +5 -6
  3. package/fesm2022/igniteui-angular-action-strip.mjs +39 -34
  4. package/fesm2022/igniteui-angular-action-strip.mjs.map +1 -1
  5. package/fesm2022/igniteui-angular-banner.mjs +64 -59
  6. package/fesm2022/igniteui-angular-banner.mjs.map +1 -1
  7. package/fesm2022/igniteui-angular-calendar.mjs +182 -161
  8. package/fesm2022/igniteui-angular-calendar.mjs.map +1 -1
  9. package/fesm2022/igniteui-angular-carousel.mjs +7 -3
  10. package/fesm2022/igniteui-angular-carousel.mjs.map +1 -1
  11. package/fesm2022/igniteui-angular-chips.mjs +140 -136
  12. package/fesm2022/igniteui-angular-chips.mjs.map +1 -1
  13. package/fesm2022/igniteui-angular-combo.mjs +360 -356
  14. package/fesm2022/igniteui-angular-combo.mjs.map +1 -1
  15. package/fesm2022/igniteui-angular-core.mjs +420 -618
  16. package/fesm2022/igniteui-angular-core.mjs.map +1 -1
  17. package/fesm2022/igniteui-angular-date-picker.mjs +124 -32
  18. package/fesm2022/igniteui-angular-date-picker.mjs.map +1 -1
  19. package/fesm2022/igniteui-angular-directives.mjs +15 -10
  20. package/fesm2022/igniteui-angular-directives.mjs.map +1 -1
  21. package/fesm2022/igniteui-angular-grids-core.mjs +75 -57
  22. package/fesm2022/igniteui-angular-grids-core.mjs.map +1 -1
  23. package/fesm2022/igniteui-angular-grids-grid.mjs +71 -62
  24. package/fesm2022/igniteui-angular-grids-grid.mjs.map +1 -1
  25. package/fesm2022/igniteui-angular-grids-hierarchical-grid.mjs +51 -6
  26. package/fesm2022/igniteui-angular-grids-hierarchical-grid.mjs.map +1 -1
  27. package/fesm2022/igniteui-angular-grids-pivot-grid.mjs +6 -1
  28. package/fesm2022/igniteui-angular-grids-pivot-grid.mjs.map +1 -1
  29. package/fesm2022/igniteui-angular-grids-tree-grid.mjs +8 -8
  30. package/fesm2022/igniteui-angular-grids-tree-grid.mjs.map +1 -1
  31. package/fesm2022/igniteui-angular-input-group.mjs +8 -4
  32. package/fesm2022/igniteui-angular-input-group.mjs.map +1 -1
  33. package/fesm2022/igniteui-angular-list.mjs +24 -19
  34. package/fesm2022/igniteui-angular-list.mjs.map +1 -1
  35. package/fesm2022/igniteui-angular-paginator.mjs +71 -66
  36. package/fesm2022/igniteui-angular-paginator.mjs.map +1 -1
  37. package/fesm2022/igniteui-angular-query-builder.mjs +51 -36
  38. package/fesm2022/igniteui-angular-query-builder.mjs.map +1 -1
  39. package/fesm2022/igniteui-angular-time-picker.mjs +50 -8
  40. package/fesm2022/igniteui-angular-time-picker.mjs.map +1 -1
  41. package/fesm2022/igniteui-angular-tree.mjs +64 -61
  42. package/fesm2022/igniteui-angular-tree.mjs.map +1 -1
  43. package/lib/core/styles/components/calendar/_calendar-theme.scss +2 -0
  44. package/lib/core/styles/components/grid/_grid-theme.scss +2 -1
  45. package/lib/core/styles/components/slider/_slider-theme.scss +0 -1
  46. package/lib/core/styles/components/tabs/_tabs-theme.scss +2 -1
  47. package/package.json +3 -2
  48. package/schematics/tsconfig.tsbuildinfo +1 -1
  49. package/schematics/utils/dependency-handler.js +1 -0
  50. package/styles/igniteui-angular-dark.css +1 -1
  51. package/styles/igniteui-angular.css +1 -1
  52. package/styles/igniteui-bootstrap-dark.css +1 -1
  53. package/styles/igniteui-bootstrap-light.css +1 -1
  54. package/styles/igniteui-dark-green.css +1 -1
  55. package/styles/igniteui-fluent-dark-excel.css +1 -1
  56. package/styles/igniteui-fluent-dark-word.css +1 -1
  57. package/styles/igniteui-fluent-dark.css +1 -1
  58. package/styles/igniteui-fluent-light-excel.css +1 -1
  59. package/styles/igniteui-fluent-light-word.css +1 -1
  60. package/styles/igniteui-fluent-light.css +1 -1
  61. package/styles/igniteui-indigo-dark.css +1 -1
  62. package/styles/igniteui-indigo-light.css +1 -1
  63. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  64. package/styles/maps/igniteui-angular.css.map +1 -1
  65. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  66. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  67. package/styles/maps/igniteui-dark-green.css.map +1 -1
  68. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  69. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  70. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  71. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  72. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  73. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  74. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  75. package/styles/maps/igniteui-indigo-light.css.map +1 -1
  76. package/types/igniteui-angular-action-strip.d.ts +3 -0
  77. package/types/igniteui-angular-banner.d.ts +3 -0
  78. package/types/igniteui-angular-calendar.d.ts +37 -47
  79. package/types/igniteui-angular-carousel.d.ts +1 -0
  80. package/types/igniteui-angular-chips.d.ts +2 -0
  81. package/types/igniteui-angular-combo.d.ts +4 -2
  82. package/types/igniteui-angular-core.d.ts +152 -397
  83. package/types/igniteui-angular-date-picker.d.ts +22 -4
  84. package/types/igniteui-angular-directives.d.ts +8 -4
  85. package/types/igniteui-angular-grids-core.d.ts +18 -8
  86. package/types/igniteui-angular-grids-grid.d.ts +9 -7
  87. package/types/igniteui-angular-grids-hierarchical-grid.d.ts +20 -3
  88. package/types/igniteui-angular-input-group.d.ts +1 -0
  89. package/types/igniteui-angular-list.d.ts +3 -0
  90. package/types/igniteui-angular-paginator.d.ts +3 -0
  91. package/types/igniteui-angular-query-builder.d.ts +8 -0
  92. package/types/igniteui-angular-time-picker.d.ts +7 -2
  93. package/types/igniteui-angular-tree.d.ts +2 -1
@@ -6,7 +6,7 @@ import { Injectable, inject, booleanAttribute, Input, HostBinding, Component, Di
6
6
  import * as i1 from '@angular/forms';
7
7
  import { NgControl, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
8
8
  import { IgxForOfDirective, IgxToggleDirective, IgxButtonDirective, IgxRippleDirective } from 'igniteui-angular/directives';
9
- import { rem, IgxSelectionAPIService, getCurrentResourceStrings, ComboResourceStringsEN, SortingDirection, AutoPositionStrategy, AbsoluteScrollStrategy, cloneArray } from 'igniteui-angular/core';
9
+ import { rem, IgxSelectionAPIService, getCurrentResourceStrings, ComboResourceStringsEN, SortingDirection, onResourceChangeHandle, AutoPositionStrategy, AbsoluteScrollStrategy, cloneArray } from 'igniteui-angular/core';
10
10
  import { IgxCheckboxComponent } from 'igniteui-angular/checkbox';
11
11
  import { IgxDropDownItemComponent, Navigate, IgxDropDownComponent, DropDownActionKey, IGX_DROPDOWN_BASE, IgxDropDownItemNavigationDirective } from 'igniteui-angular/drop-down';
12
12
  import { caseSensitive } from '@igniteui/material-icons-extended';
@@ -397,359 +397,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.2", ngImpor
397
397
  const IGX_COMBO_COMPONENT = /*@__PURE__*/ new InjectionToken('IgxComboComponentToken');
398
398
  let NEXT_ID = 0;
399
399
  class IgxComboBaseDirective {
400
- constructor() {
401
- this.elementRef = inject(ElementRef);
402
- this.cdr = inject(ChangeDetectorRef);
403
- this.selectionService = inject(IgxSelectionAPIService);
404
- this.comboAPI = inject(IgxComboAPIService);
405
- this.document = inject(DOCUMENT);
406
- this._inputGroupType = inject(IGX_INPUT_GROUP_TYPE, { optional: true });
407
- this._injector = inject(Injector, { optional: true });
408
- this._iconService = inject(IgxIconService, { optional: true });
409
- /**
410
- * Defines whether the caseSensitive icon should be shown in the search input
411
- *
412
- * ```typescript
413
- * // get
414
- * let myComboShowSearchCaseIcon = this.combo.showSearchCaseIcon;
415
- * ```
416
- *
417
- * ```html
418
- * <!--set-->
419
- * <igx-combo [showSearchCaseIcon]='true'></igx-combo>
420
- * ```
421
- */
422
- this.showSearchCaseIcon = false;
423
- /**
424
- * Set custom overlay settings that control how the combo's list of items is displayed.
425
- * Set:
426
- * ```html
427
- * <igx-combo [overlaySettings]="customOverlaySettings"></igx-combo>
428
- * ```
429
- *
430
- * ```typescript
431
- * const customSettings = { positionStrategy: { settings: { target: myTarget } } };
432
- * combo.overlaySettings = customSettings;
433
- * ```
434
- * Get any custom overlay settings used by the combo:
435
- * ```typescript
436
- * const comboOverlaySettings: OverlaySettings = myCombo.overlaySettings;
437
- * ```
438
- */
439
- this.overlaySettings = null;
440
- /**
441
- * Controls whether custom values can be added to the collection
442
- *
443
- * ```typescript
444
- * // get
445
- * let comboAllowsCustomValues = this.combo.allowCustomValues;
446
- * ```
447
- *
448
- * ```html
449
- * <!--set-->
450
- * <igx-combo [allowCustomValues]='true'></igx-combo>
451
- * ```
452
- */
453
- this.allowCustomValues = false;
454
- /**
455
- * Determines which column in the data source is used to determine the value.
456
- *
457
- * ```typescript
458
- * // get
459
- * let myComboValueKey = this.combo.valueKey;
460
- * ```
461
- *
462
- * ```html
463
- * <!--set-->
464
- * <igx-combo [valueKey]='myKey'></igx-combo>
465
- * ```
466
- */
467
- this.valueKey = null;
468
- /** @hidden @internal */
469
- this.cssClass = 'igx-combo'; // Independent of display density for the time being
470
- /**
471
- * Disables the combo. The default is `false`.
472
- * ```html
473
- * <igx-combo [disabled]="'true'">
474
- * ```
475
- */
476
- this.disabled = false;
477
- /**
478
- * Emitted before the dropdown is opened
479
- *
480
- * ```html
481
- * <igx-combo opening='handleOpening($event)'></igx-combo>
482
- * ```
483
- */
484
- this.opening = new EventEmitter();
485
- /**
486
- * Emitted after the dropdown is opened
487
- *
488
- * ```html
489
- * <igx-combo (opened)='handleOpened($event)'></igx-combo>
490
- * ```
491
- */
492
- this.opened = new EventEmitter();
493
- /**
494
- * Emitted before the dropdown is closed
495
- *
496
- * ```html
497
- * <igx-combo (closing)='handleClosing($event)'></igx-combo>
498
- * ```
499
- */
500
- this.closing = new EventEmitter();
501
- /**
502
- * Emitted after the dropdown is closed
503
- *
504
- * ```html
505
- * <igx-combo (closed)='handleClosed($event)'></igx-combo>
506
- * ```
507
- */
508
- this.closed = new EventEmitter();
509
- /**
510
- * Emitted when an item is being added to the data collection
511
- *
512
- * ```html
513
- * <igx-combo (addition)='handleAdditionEvent($event)'></igx-combo>
514
- * ```
515
- */
516
- this.addition = new EventEmitter();
517
- /**
518
- * Emitted when the value of the search input changes (e.g. typing, pasting, clear, etc.)
519
- *
520
- * ```html
521
- * <igx-combo (searchInputUpdate)='handleSearchInputEvent($event)'></igx-combo>
522
- * ```
523
- */
524
- this.searchInputUpdate = new EventEmitter();
525
- /**
526
- * Emitted when new chunk of data is loaded from the virtualization
527
- *
528
- * ```html
529
- * <igx-combo (dataPreLoad)='handleDataPreloadEvent($event)'></igx-combo>
530
- * ```
531
- */
532
- this.dataPreLoad = new EventEmitter();
533
- /**
534
- * The custom template, if any, that should be used when rendering ITEMS in the combo list
535
- *
536
- * ```typescript
537
- * // Set in typescript
538
- * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
539
- * myComponent.combo.itemTemplate = myCustomTemplate;
540
- * ```
541
- * ```html
542
- * <!-- Set in markup -->
543
- * <igx-combo #combo>
544
- * ...
545
- * <ng-template igxComboItem let-item let-key="valueKey">
546
- * <div class="custom-item">
547
- * <div class="custom-item__name">{{ item[key] }}</div>
548
- * <div class="custom-item__cost">{{ item.cost }}</div>
549
- * </div>
550
- * </ng-template>
551
- * </igx-combo>
552
- * ```
553
- */
554
- this.itemTemplate = null;
555
- /**
556
- * The custom template, if any, that should be used when rendering the HEADER for the combo items list
557
- *
558
- * ```typescript
559
- * // Set in typescript
560
- * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
561
- * myComponent.combo.headerTemplate = myCustomTemplate;
562
- * ```
563
- * ```html
564
- * <!-- Set in markup -->
565
- * <igx-combo #combo>
566
- * ...
567
- * <ng-template igxComboHeader>
568
- * <div class="combo__header">
569
- * This is a custom header
570
- * </div>
571
- * </ng-template>
572
- * </igx-combo>
573
- * ```
574
- */
575
- this.headerTemplate = null;
576
- /**
577
- * The custom template, if any, that should be used when rendering the FOOTER for the combo items list
578
- *
579
- * ```typescript
580
- * // Set in typescript
581
- * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
582
- * myComponent.combo.footerTemplate = myCustomTemplate;
583
- * ```
584
- * ```html
585
- * <!-- Set in markup -->
586
- * <igx-combo #combo>
587
- * ...
588
- * <ng-template igxComboFooter>
589
- * <div class="combo__footer">
590
- * This is a custom footer
591
- * </div>
592
- * </ng-template>
593
- * </igx-combo>
594
- * ```
595
- */
596
- this.footerTemplate = null;
597
- /**
598
- * The custom template, if any, that should be used when rendering HEADER ITEMS for groups in the combo list
599
- *
600
- * ```typescript
601
- * // Set in typescript
602
- * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
603
- * myComponent.combo.headerItemTemplate = myCustomTemplate;
604
- * ```
605
- * ```html
606
- * <!-- Set in markup -->
607
- * <igx-combo #combo>
608
- * ...
609
- * <ng-template igxComboHeaderItem let-item let-key="groupKey">
610
- * <div class="custom-item--group">Group header for {{ item[key] }}</div>
611
- * </ng-template>
612
- * </igx-combo>
613
- * ```
614
- */
615
- this.headerItemTemplate = null;
616
- /**
617
- * The custom template, if any, that should be used when rendering the ADD BUTTON in the combo drop down
618
- *
619
- * ```typescript
620
- * // Set in typescript
621
- * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
622
- * myComponent.combo.addItemTemplate = myCustomTemplate;
623
- * ```
624
- * ```html
625
- * <!-- Set in markup -->
626
- * <igx-combo #combo>
627
- * ...
628
- * <ng-template igxComboAddItem>
629
- * <button type="button" igxButton="contained" class="combo__add-button">
630
- * Click to add item
631
- * </button>
632
- * </ng-template>
633
- * </igx-combo>
634
- * ```
635
- */
636
- this.addItemTemplate = null;
637
- /**
638
- * The custom template, if any, that should be used when rendering the ADD BUTTON in the combo drop down
639
- *
640
- * ```typescript
641
- * // Set in typescript
642
- * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
643
- * myComponent.combo.emptyTemplate = myCustomTemplate;
644
- * ```
645
- * ```html
646
- * <!-- Set in markup -->
647
- * <igx-combo #combo>
648
- * ...
649
- * <ng-template igxComboEmpty>
650
- * <div class="combo--empty">
651
- * There are no items to display
652
- * </div>
653
- * </ng-template>
654
- * </igx-combo>
655
- * ```
656
- */
657
- this.emptyTemplate = null;
658
- /**
659
- * The custom template, if any, that should be used when rendering the combo TOGGLE(open/close) button
660
- *
661
- * ```typescript
662
- * // Set in typescript
663
- * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
664
- * myComponent.combo.toggleIconTemplate = myCustomTemplate;
665
- * ```
666
- * ```html
667
- * <!-- Set in markup -->
668
- * <igx-combo #combo>
669
- * ...
670
- * <ng-template igxComboToggleIcon let-collapsed>
671
- * <igx-icon>{{ collapsed ? 'remove_circle' : 'remove_circle_outline'}}</igx-icon>
672
- * </ng-template>
673
- * </igx-combo>
674
- * ```
675
- */
676
- this.toggleIconTemplate = null;
677
- /**
678
- * The custom template, if any, that should be used when rendering the combo CLEAR button
679
- *
680
- * ```typescript
681
- * // Set in typescript
682
- * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
683
- * myComponent.combo.clearIconTemplate = myCustomTemplate;
684
- * ```
685
- * ```html
686
- * <!-- Set in markup -->
687
- * <igx-combo #combo>
688
- * ...
689
- * <ng-template igxComboClearIcon>
690
- * <igx-icon>clear</igx-icon>
691
- * </ng-template>
692
- * </igx-combo>
693
- * ```
694
- */
695
- this.clearIconTemplate = null;
696
- /** @hidden @internal */
697
- this.searchInput = null;
698
- this.dropdownContainer = null;
699
- /** @hidden @internal */
700
- this.customValueFlag = true;
701
- /** @hidden @internal */
702
- this.filterValue = '';
703
- /** @hidden @internal */
704
- this.defaultFallbackGroup = 'Other';
705
- /** @hidden @internal */
706
- this.activeDescendant = '';
707
- this.containerSize = undefined;
708
- this.itemSize = undefined;
709
- this._data = [];
710
- this._value = [];
711
- this._displayValue = '';
712
- this._groupKey = '';
713
- this._searchValue = '';
714
- this._filteredData = [];
715
- this._remoteSelection = {};
716
- this._resourceStrings = getCurrentResourceStrings(ComboResourceStringsEN);
717
- this._valid = IgxInputState.INITIAL;
718
- this.ngControl = null;
719
- this.destroy$ = new Subject();
720
- this._onTouchedCallback = noop;
721
- this._onChangeCallback = noop;
722
- this.compareCollator = new Intl.Collator();
723
- this._id = `igx-combo-${NEXT_ID++}`;
724
- this._disableFiltering = false;
725
- this._type = null;
726
- this._dataType = '';
727
- this._itemHeight = undefined;
728
- this._itemsMaxHeight = null;
729
- this._groupSortingDirection = SortingDirection.Asc;
730
- this._defaultFilteringOptions = { caseSensitive: false };
731
- this.itemsInContainer = 10;
732
- this.onStatusChanged = () => {
733
- if (this.ngControl && this.isTouchedOrDirty && !this.disabled) {
734
- if (this.hasValidators && (!this.collapsed || this.inputGroup.isFocused)) {
735
- this.valid = this.ngControl.valid ? IgxInputState.VALID : IgxInputState.INVALID;
736
- }
737
- else {
738
- this.valid = this.ngControl.valid ? IgxInputState.INITIAL : IgxInputState.INVALID;
739
- }
740
- }
741
- else {
742
- // B.P. 18 May 2021: IgxDatePicker does not reset its state upon resetForm #9526
743
- this.valid = IgxInputState.INITIAL;
744
- }
745
- this.manageRequiredAsterisk();
746
- };
747
- this.findMatch = (element) => {
748
- const value = this.displayKey ? element[this.displayKey] : element;
749
- const searchValue = this.searchValue || this.comboInput?.value;
750
- return value?.toString().trim().toLowerCase() === searchValue.trim().toLowerCase();
751
- };
752
- }
753
400
  /**
754
401
  * Enables/disables filtering in the list. The default is `false`.
755
402
  */
@@ -935,7 +582,7 @@ class IgxComboBaseDirective {
935
582
  * By default it uses EN resources.
936
583
  */
937
584
  get resourceStrings() {
938
- return this._resourceStrings;
585
+ return this._resourceStrings || this._defaultResourceStrings;
939
586
  }
940
587
  set resourceStrings(value) {
941
588
  this._resourceStrings = Object.assign({}, this._resourceStrings, value);
@@ -1090,6 +737,363 @@ class IgxComboBaseDirective {
1090
737
  set filteringOptions(value) {
1091
738
  this._filteringOptions = value;
1092
739
  }
740
+ constructor() {
741
+ this.elementRef = inject(ElementRef);
742
+ this.cdr = inject(ChangeDetectorRef);
743
+ this.selectionService = inject(IgxSelectionAPIService);
744
+ this.comboAPI = inject(IgxComboAPIService);
745
+ this.document = inject(DOCUMENT);
746
+ this._inputGroupType = inject(IGX_INPUT_GROUP_TYPE, { optional: true });
747
+ this._injector = inject(Injector, { optional: true });
748
+ this._iconService = inject(IgxIconService, { optional: true });
749
+ /**
750
+ * Defines whether the caseSensitive icon should be shown in the search input
751
+ *
752
+ * ```typescript
753
+ * // get
754
+ * let myComboShowSearchCaseIcon = this.combo.showSearchCaseIcon;
755
+ * ```
756
+ *
757
+ * ```html
758
+ * <!--set-->
759
+ * <igx-combo [showSearchCaseIcon]='true'></igx-combo>
760
+ * ```
761
+ */
762
+ this.showSearchCaseIcon = false;
763
+ /**
764
+ * Set custom overlay settings that control how the combo's list of items is displayed.
765
+ * Set:
766
+ * ```html
767
+ * <igx-combo [overlaySettings]="customOverlaySettings"></igx-combo>
768
+ * ```
769
+ *
770
+ * ```typescript
771
+ * const customSettings = { positionStrategy: { settings: { target: myTarget } } };
772
+ * combo.overlaySettings = customSettings;
773
+ * ```
774
+ * Get any custom overlay settings used by the combo:
775
+ * ```typescript
776
+ * const comboOverlaySettings: OverlaySettings = myCombo.overlaySettings;
777
+ * ```
778
+ */
779
+ this.overlaySettings = null;
780
+ /**
781
+ * Controls whether custom values can be added to the collection
782
+ *
783
+ * ```typescript
784
+ * // get
785
+ * let comboAllowsCustomValues = this.combo.allowCustomValues;
786
+ * ```
787
+ *
788
+ * ```html
789
+ * <!--set-->
790
+ * <igx-combo [allowCustomValues]='true'></igx-combo>
791
+ * ```
792
+ */
793
+ this.allowCustomValues = false;
794
+ /**
795
+ * Determines which column in the data source is used to determine the value.
796
+ *
797
+ * ```typescript
798
+ * // get
799
+ * let myComboValueKey = this.combo.valueKey;
800
+ * ```
801
+ *
802
+ * ```html
803
+ * <!--set-->
804
+ * <igx-combo [valueKey]='myKey'></igx-combo>
805
+ * ```
806
+ */
807
+ this.valueKey = null;
808
+ /** @hidden @internal */
809
+ this.cssClass = 'igx-combo'; // Independent of display density for the time being
810
+ /**
811
+ * Disables the combo. The default is `false`.
812
+ * ```html
813
+ * <igx-combo [disabled]="'true'">
814
+ * ```
815
+ */
816
+ this.disabled = false;
817
+ /**
818
+ * Emitted before the dropdown is opened
819
+ *
820
+ * ```html
821
+ * <igx-combo opening='handleOpening($event)'></igx-combo>
822
+ * ```
823
+ */
824
+ this.opening = new EventEmitter();
825
+ /**
826
+ * Emitted after the dropdown is opened
827
+ *
828
+ * ```html
829
+ * <igx-combo (opened)='handleOpened($event)'></igx-combo>
830
+ * ```
831
+ */
832
+ this.opened = new EventEmitter();
833
+ /**
834
+ * Emitted before the dropdown is closed
835
+ *
836
+ * ```html
837
+ * <igx-combo (closing)='handleClosing($event)'></igx-combo>
838
+ * ```
839
+ */
840
+ this.closing = new EventEmitter();
841
+ /**
842
+ * Emitted after the dropdown is closed
843
+ *
844
+ * ```html
845
+ * <igx-combo (closed)='handleClosed($event)'></igx-combo>
846
+ * ```
847
+ */
848
+ this.closed = new EventEmitter();
849
+ /**
850
+ * Emitted when an item is being added to the data collection
851
+ *
852
+ * ```html
853
+ * <igx-combo (addition)='handleAdditionEvent($event)'></igx-combo>
854
+ * ```
855
+ */
856
+ this.addition = new EventEmitter();
857
+ /**
858
+ * Emitted when the value of the search input changes (e.g. typing, pasting, clear, etc.)
859
+ *
860
+ * ```html
861
+ * <igx-combo (searchInputUpdate)='handleSearchInputEvent($event)'></igx-combo>
862
+ * ```
863
+ */
864
+ this.searchInputUpdate = new EventEmitter();
865
+ /**
866
+ * Emitted when new chunk of data is loaded from the virtualization
867
+ *
868
+ * ```html
869
+ * <igx-combo (dataPreLoad)='handleDataPreloadEvent($event)'></igx-combo>
870
+ * ```
871
+ */
872
+ this.dataPreLoad = new EventEmitter();
873
+ /**
874
+ * The custom template, if any, that should be used when rendering ITEMS in the combo list
875
+ *
876
+ * ```typescript
877
+ * // Set in typescript
878
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
879
+ * myComponent.combo.itemTemplate = myCustomTemplate;
880
+ * ```
881
+ * ```html
882
+ * <!-- Set in markup -->
883
+ * <igx-combo #combo>
884
+ * ...
885
+ * <ng-template igxComboItem let-item let-key="valueKey">
886
+ * <div class="custom-item">
887
+ * <div class="custom-item__name">{{ item[key] }}</div>
888
+ * <div class="custom-item__cost">{{ item.cost }}</div>
889
+ * </div>
890
+ * </ng-template>
891
+ * </igx-combo>
892
+ * ```
893
+ */
894
+ this.itemTemplate = null;
895
+ /**
896
+ * The custom template, if any, that should be used when rendering the HEADER for the combo items list
897
+ *
898
+ * ```typescript
899
+ * // Set in typescript
900
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
901
+ * myComponent.combo.headerTemplate = myCustomTemplate;
902
+ * ```
903
+ * ```html
904
+ * <!-- Set in markup -->
905
+ * <igx-combo #combo>
906
+ * ...
907
+ * <ng-template igxComboHeader>
908
+ * <div class="combo__header">
909
+ * This is a custom header
910
+ * </div>
911
+ * </ng-template>
912
+ * </igx-combo>
913
+ * ```
914
+ */
915
+ this.headerTemplate = null;
916
+ /**
917
+ * The custom template, if any, that should be used when rendering the FOOTER for the combo items list
918
+ *
919
+ * ```typescript
920
+ * // Set in typescript
921
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
922
+ * myComponent.combo.footerTemplate = myCustomTemplate;
923
+ * ```
924
+ * ```html
925
+ * <!-- Set in markup -->
926
+ * <igx-combo #combo>
927
+ * ...
928
+ * <ng-template igxComboFooter>
929
+ * <div class="combo__footer">
930
+ * This is a custom footer
931
+ * </div>
932
+ * </ng-template>
933
+ * </igx-combo>
934
+ * ```
935
+ */
936
+ this.footerTemplate = null;
937
+ /**
938
+ * The custom template, if any, that should be used when rendering HEADER ITEMS for groups in the combo list
939
+ *
940
+ * ```typescript
941
+ * // Set in typescript
942
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
943
+ * myComponent.combo.headerItemTemplate = myCustomTemplate;
944
+ * ```
945
+ * ```html
946
+ * <!-- Set in markup -->
947
+ * <igx-combo #combo>
948
+ * ...
949
+ * <ng-template igxComboHeaderItem let-item let-key="groupKey">
950
+ * <div class="custom-item--group">Group header for {{ item[key] }}</div>
951
+ * </ng-template>
952
+ * </igx-combo>
953
+ * ```
954
+ */
955
+ this.headerItemTemplate = null;
956
+ /**
957
+ * The custom template, if any, that should be used when rendering the ADD BUTTON in the combo drop down
958
+ *
959
+ * ```typescript
960
+ * // Set in typescript
961
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
962
+ * myComponent.combo.addItemTemplate = myCustomTemplate;
963
+ * ```
964
+ * ```html
965
+ * <!-- Set in markup -->
966
+ * <igx-combo #combo>
967
+ * ...
968
+ * <ng-template igxComboAddItem>
969
+ * <button type="button" igxButton="contained" class="combo__add-button">
970
+ * Click to add item
971
+ * </button>
972
+ * </ng-template>
973
+ * </igx-combo>
974
+ * ```
975
+ */
976
+ this.addItemTemplate = null;
977
+ /**
978
+ * The custom template, if any, that should be used when rendering the ADD BUTTON in the combo drop down
979
+ *
980
+ * ```typescript
981
+ * // Set in typescript
982
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
983
+ * myComponent.combo.emptyTemplate = myCustomTemplate;
984
+ * ```
985
+ * ```html
986
+ * <!-- Set in markup -->
987
+ * <igx-combo #combo>
988
+ * ...
989
+ * <ng-template igxComboEmpty>
990
+ * <div class="combo--empty">
991
+ * There are no items to display
992
+ * </div>
993
+ * </ng-template>
994
+ * </igx-combo>
995
+ * ```
996
+ */
997
+ this.emptyTemplate = null;
998
+ /**
999
+ * The custom template, if any, that should be used when rendering the combo TOGGLE(open/close) button
1000
+ *
1001
+ * ```typescript
1002
+ * // Set in typescript
1003
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
1004
+ * myComponent.combo.toggleIconTemplate = myCustomTemplate;
1005
+ * ```
1006
+ * ```html
1007
+ * <!-- Set in markup -->
1008
+ * <igx-combo #combo>
1009
+ * ...
1010
+ * <ng-template igxComboToggleIcon let-collapsed>
1011
+ * <igx-icon>{{ collapsed ? 'remove_circle' : 'remove_circle_outline'}}</igx-icon>
1012
+ * </ng-template>
1013
+ * </igx-combo>
1014
+ * ```
1015
+ */
1016
+ this.toggleIconTemplate = null;
1017
+ /**
1018
+ * The custom template, if any, that should be used when rendering the combo CLEAR button
1019
+ *
1020
+ * ```typescript
1021
+ * // Set in typescript
1022
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
1023
+ * myComponent.combo.clearIconTemplate = myCustomTemplate;
1024
+ * ```
1025
+ * ```html
1026
+ * <!-- Set in markup -->
1027
+ * <igx-combo #combo>
1028
+ * ...
1029
+ * <ng-template igxComboClearIcon>
1030
+ * <igx-icon>clear</igx-icon>
1031
+ * </ng-template>
1032
+ * </igx-combo>
1033
+ * ```
1034
+ */
1035
+ this.clearIconTemplate = null;
1036
+ /** @hidden @internal */
1037
+ this.searchInput = null;
1038
+ this.dropdownContainer = null;
1039
+ /** @hidden @internal */
1040
+ this.customValueFlag = true;
1041
+ /** @hidden @internal */
1042
+ this.filterValue = '';
1043
+ /** @hidden @internal */
1044
+ this.defaultFallbackGroup = 'Other';
1045
+ /** @hidden @internal */
1046
+ this.activeDescendant = '';
1047
+ this.containerSize = undefined;
1048
+ this.itemSize = undefined;
1049
+ this._data = [];
1050
+ this._value = [];
1051
+ this._displayValue = '';
1052
+ this._groupKey = '';
1053
+ this._searchValue = '';
1054
+ this._filteredData = [];
1055
+ this._remoteSelection = {};
1056
+ this._resourceStrings = null;
1057
+ this._defaultResourceStrings = getCurrentResourceStrings(ComboResourceStringsEN);
1058
+ this._valid = IgxInputState.INITIAL;
1059
+ this.ngControl = null;
1060
+ this.destroy$ = new Subject();
1061
+ this._onTouchedCallback = noop;
1062
+ this._onChangeCallback = noop;
1063
+ this.compareCollator = new Intl.Collator();
1064
+ this._id = `igx-combo-${NEXT_ID++}`;
1065
+ this._disableFiltering = false;
1066
+ this._type = null;
1067
+ this._dataType = '';
1068
+ this._itemHeight = undefined;
1069
+ this._itemsMaxHeight = null;
1070
+ this._groupSortingDirection = SortingDirection.Asc;
1071
+ this._defaultFilteringOptions = { caseSensitive: false };
1072
+ this.itemsInContainer = 10;
1073
+ this.onStatusChanged = () => {
1074
+ if (this.ngControl && this.isTouchedOrDirty && !this.disabled) {
1075
+ if (this.hasValidators && (!this.collapsed || this.inputGroup.isFocused)) {
1076
+ this.valid = this.ngControl.valid ? IgxInputState.VALID : IgxInputState.INVALID;
1077
+ }
1078
+ else {
1079
+ this.valid = this.ngControl.valid ? IgxInputState.INITIAL : IgxInputState.INVALID;
1080
+ }
1081
+ }
1082
+ else {
1083
+ // B.P. 18 May 2021: IgxDatePicker does not reset its state upon resetForm #9526
1084
+ this.valid = IgxInputState.INITIAL;
1085
+ }
1086
+ this.manageRequiredAsterisk();
1087
+ };
1088
+ this.findMatch = (element) => {
1089
+ const value = this.displayKey ? element[this.displayKey] : element;
1090
+ const searchValue = this.searchValue || this.comboInput?.value;
1091
+ return value?.toString().trim().toLowerCase() === searchValue.trim().toLowerCase();
1092
+ };
1093
+ onResourceChangeHandle(this.destroy$, () => {
1094
+ this._defaultResourceStrings = getCurrentResourceStrings(ComboResourceStringsEN, false);
1095
+ }, this);
1096
+ }
1093
1097
  ngAfterViewChecked() {
1094
1098
  const targetElement = this.inputGroup.element.nativeElement.querySelector('.igx-input-group__bundle');
1095
1099
  this._overlaySettings = {
@@ -1451,7 +1455,7 @@ class IgxComboBaseDirective {
1451
1455
  }
1452
1456
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.2", ngImport: i0, type: IgxComboBaseDirective, decorators: [{
1453
1457
  type: Directive
1454
- }], propDecorators: { showSearchCaseIcon: [{
1458
+ }], ctorParameters: () => [], propDecorators: { showSearchCaseIcon: [{
1455
1459
  type: Input,
1456
1460
  args: [{ transform: booleanAttribute }]
1457
1461
  }], disableFiltering: [{