igniteui-angular 18.2.0-rc.1 → 18.2.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 (49) hide show
  1. package/esm2022/lib/calendar/calendar.component.mjs +3 -10
  2. package/esm2022/lib/calendar/days-view/days-view.component.mjs +3 -3
  3. package/esm2022/lib/combo/combo.common.mjs +17 -7
  4. package/esm2022/lib/combo/combo.component.mjs +3 -3
  5. package/esm2022/lib/date-common/picker-base.directive.mjs +12 -1
  6. package/esm2022/lib/date-picker/date-picker.component.mjs +10 -7
  7. package/esm2022/lib/date-range-picker/date-range-picker.component.mjs +9 -2
  8. package/esm2022/lib/grids/filtering/base/grid-filtering-row.component.mjs +7 -7
  9. package/esm2022/lib/time-picker/time-picker.component.mjs +4 -1
  10. package/fesm2022/igniteui-angular.mjs +59 -32
  11. package/fesm2022/igniteui-angular.mjs.map +1 -1
  12. package/lib/combo/combo.common.d.ts +3 -0
  13. package/lib/core/styles/components/input/_input-group-theme.scss +1 -0
  14. package/lib/core/styles/typography/_bootstrap.scss +2 -2
  15. package/lib/date-common/picker-base.directive.d.ts +6 -0
  16. package/lib/date-picker/date-picker.component.d.ts +2 -0
  17. package/lib/date-range-picker/date-range-picker.component.d.ts +2 -0
  18. package/lib/directives/autocomplete/autocomplete.directive.d.ts +1 -1
  19. package/lib/grids/filtering/base/grid-filtering-row.component.d.ts +2 -2
  20. package/lib/grids/filtering/excel-style/excel-style-default-expression.component.d.ts +1 -1
  21. package/lib/grids/grid-base.directive.d.ts +1 -1
  22. package/lib/time-picker/time-picker.component.d.ts +1 -0
  23. package/package.json +2 -2
  24. package/styles/igniteui-angular-dark.css +1 -1
  25. package/styles/igniteui-angular.css +1 -1
  26. package/styles/igniteui-bootstrap-dark.css +1 -1
  27. package/styles/igniteui-bootstrap-light.css +1 -1
  28. package/styles/igniteui-dark-green.css +1 -1
  29. package/styles/igniteui-fluent-dark-excel.css +1 -1
  30. package/styles/igniteui-fluent-dark-word.css +1 -1
  31. package/styles/igniteui-fluent-dark.css +1 -1
  32. package/styles/igniteui-fluent-light-excel.css +1 -1
  33. package/styles/igniteui-fluent-light-word.css +1 -1
  34. package/styles/igniteui-fluent-light.css +1 -1
  35. package/styles/igniteui-indigo-dark.css +1 -1
  36. package/styles/igniteui-indigo-light.css +1 -1
  37. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  38. package/styles/maps/igniteui-angular.css.map +1 -1
  39. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  40. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  41. package/styles/maps/igniteui-dark-green.css.map +1 -1
  42. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  43. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  44. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  45. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  46. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  47. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  48. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  49. package/styles/maps/igniteui-indigo-light.css.map +1 -1
@@ -32178,7 +32178,7 @@ class IgxDaysViewComponent extends IgxCalendarBaseDirective {
32178
32178
  provide: NG_VALUE_ACCESSOR,
32179
32179
  useExisting: IgxDaysViewComponent
32180
32180
  },
32181
- ], viewQueries: [{ propertyName: "dates", predicate: IgxDayItemComponent, descendants: true, read: IgxDayItemComponent }], usesInheritance: true, ngImport: i0, template: "<div\n role=\"row\"\n class=\"igx-days-view__row\"\n [title]=\"weekNumberHeader.long | titlecase\"\n>\n <div\n role=\"columnheader\"\n *ngIf=\"showWeekNumbers\"\n class=\"igx-days-view__label igx-days-view__label--week-number\"\n >\n <span>\n <i>{{ weekNumberHeader.short | titlecase }}</i>\n </span>\n </div>\n <span\n role=\"columnheader\"\n [attr.aria-label]=\"dayName.long\"\n *ngFor=\"let dayName of weekHeaderLabels\"\n class=\"igx-days-view__label\"\n >\n <span class=\"igx-days-view__label-inner\">\n {{ dayName.formatted | titlecase }}\n </span>\n </span>\n</div>\n\n<div\n *ngFor=\"\n let week of monthWeeks;\n last as isLast;\n index as i;\n trackBy: rowTracker\n \"\n class=\"igx-days-view__row\"\n role=\"row\"\n>\n <div\n *ngIf=\"showWeekNumbers\"\n class=\"igx-days-view__date igx-days-view__date--week-number\"\n >\n <span\n role=\"rowheader\"\n class=\"igx-days-view__date-inner igx-days-view__date-inner--week-number\"\n >\n {{ getWeekNumber(week[0]) }}\n </span>\n </div>\n\n <igx-day-item\n #item\n *ngFor=\"let day of week; trackBy: dateTracker\"\n class=\"igx-days-view__date\"\n role=\"gridcell\"\n [attr.id]=\"item.isCurrentMonth && day.timestamp\"\n [attr.aria-selected]=\"isSelected(day)\"\n [attr.aria-disabled]=\"isDateDisabled(day.native)\"\n [attr.aria-label]=\"\n isFirstInRange(day)\n ? day.native.toDateString() +\n ', ' +\n resourceStrings.igx_calendar_range_start\n : isLastInRange(day)\n ? day.native.toDateString() +\n ', ' +\n resourceStrings.igx_calendar_range_end\n : day.native.toDateString()\n \"\n [date]=\"day\"\n [viewDate]=\"viewDate\"\n [selection]=\"selection\"\n [selected]=\"isSelected(day)\"\n [isActive]=\"isActiveDate(day)\"\n [isLastInRange]=\"isLastInRange(day)\"\n [isFirstInRange]=\"isFirstInRange(day)\"\n [isWithinRange]=\"isWithinRange(day.native, true)\"\n [isWithinPreviewRange]=\"isWithinPreviewRange(day.native)\"\n [disabledDates]=\"disabledDates\"\n [specialDates]=\"specialDates\"\n [hideLeadingDays]=\"hideLeadingDays\"\n [hideTrailingDays]=\"hideTrailingDays\"\n [attr.tabindex]=\"-1\"\n (mouseDown)=\"handleDateClick(item)\"\n (mouseEnter)=\"changePreviewRange(day.native)\"\n (mouseLeave)=\"clearPreviewRange()\"\n >\n {{ formattedDate(day.native) }}\n </igx-day-item>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxDayItemComponent, selector: "igx-day-item", inputs: ["date", "viewDate", "selection", "selected", "disabledDates", "specialDates", "hideOutsideDays", "isLastInRange", "isFirstInRange", "isWithinRange", "isWithinPreviewRange", "hideLeadingDays", "hideTrailingDays", "isActive"], outputs: ["dateSelection", "mouseEnter", "mouseLeave", "mouseDown"] }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32181
+ ], viewQueries: [{ propertyName: "dates", predicate: IgxDayItemComponent, descendants: true, read: IgxDayItemComponent }], usesInheritance: true, ngImport: i0, template: "<div\n role=\"row\"\n class=\"igx-days-view__row\"\n [title]=\"weekNumberHeader.long | titlecase\"\n>\n <div\n role=\"columnheader\"\n *ngIf=\"showWeekNumbers\"\n class=\"igx-days-view__label igx-days-view__label--week-number\"\n >\n <span>\n <i>{{ weekNumberHeader.short | titlecase }}</i>\n </span>\n </div>\n <span\n role=\"columnheader\"\n [attr.aria-label]=\"dayName.long\"\n *ngFor=\"let dayName of weekHeaderLabels\"\n class=\"igx-days-view__label\"\n >\n <span class=\"igx-days-view__label-inner\">\n {{ dayName.formatted | titlecase }}\n </span>\n </span>\n</div>\n\n<div\n *ngFor=\"\n let week of monthWeeks;\n last as isLast;\n index as i;\n trackBy: rowTracker\n \"\n class=\"igx-days-view__row\"\n role=\"row\"\n>\n <div\n *ngIf=\"showWeekNumbers\"\n class=\"igx-days-view__date igx-days-view__date--week-number\"\n >\n <span\n role=\"rowheader\"\n class=\"igx-days-view__date-inner igx-days-view__date-inner--week-number\"\n >\n {{ getWeekNumber(week[0]) }}\n </span>\n </div>\n\n <igx-day-item\n #item\n *ngFor=\"let day of week; trackBy: dateTracker\"\n class=\"igx-days-view__date\"\n role=\"gridcell\"\n [attr.id]=\"item.isCurrentMonth && day.timestamp\"\n [attr.aria-selected]=\"isSelected(day)\"\n [attr.aria-disabled]=\"isDateDisabled(day.native)\"\n [attr.aria-label]=\"\n isFirstInRange(day)\n ? day.native.toDateString() +\n ', ' +\n resourceStrings.igx_calendar_range_start\n : isLastInRange(day)\n ? day.native.toDateString() +\n ', ' +\n resourceStrings.igx_calendar_range_end\n : day.native.toDateString()\n \"\n [date]=\"day\"\n [viewDate]=\"viewDate\"\n [selection]=\"selection\"\n [selected]=\"isSelected(day)\"\n [isActive]=\"isActiveDate(day)\"\n [isLastInRange]=\"isLastInRange(day)\"\n [isFirstInRange]=\"isFirstInRange(day)\"\n [isWithinRange]=\"isWithinRange(day.native, true)\"\n [isWithinPreviewRange]=\"isWithinPreviewRange(day.native)\"\n [disabledDates]=\"disabledDates\"\n [specialDates]=\"specialDates\"\n [hideLeadingDays]=\"hideLeadingDays\"\n [hideTrailingDays]=\"hideTrailingDays\"\n [attr.tabindex]=\"-1\"\n (click)=\"handleDateClick(item)\"\n (mouseEnter)=\"changePreviewRange(day.native)\"\n (mouseLeave)=\"clearPreviewRange()\"\n >\n {{ formattedDate(day.native) }}\n </igx-day-item>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxDayItemComponent, selector: "igx-day-item", inputs: ["date", "viewDate", "selection", "selected", "disabledDates", "specialDates", "hideOutsideDays", "isLastInRange", "isFirstInRange", "isWithinRange", "isWithinPreviewRange", "hideLeadingDays", "hideTrailingDays", "isActive"], outputs: ["dateSelection", "mouseEnter", "mouseLeave", "mouseDown"] }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32182
32182
  }
32183
32183
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: IgxDaysViewComponent, decorators: [{
32184
32184
  type: Component,
@@ -32188,7 +32188,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImpor
32188
32188
  provide: NG_VALUE_ACCESSOR,
32189
32189
  useExisting: IgxDaysViewComponent
32190
32190
  },
32191
- ], selector: 'igx-days-view', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIf, NgFor, IgxDayItemComponent, TitleCasePipe], template: "<div\n role=\"row\"\n class=\"igx-days-view__row\"\n [title]=\"weekNumberHeader.long | titlecase\"\n>\n <div\n role=\"columnheader\"\n *ngIf=\"showWeekNumbers\"\n class=\"igx-days-view__label igx-days-view__label--week-number\"\n >\n <span>\n <i>{{ weekNumberHeader.short | titlecase }}</i>\n </span>\n </div>\n <span\n role=\"columnheader\"\n [attr.aria-label]=\"dayName.long\"\n *ngFor=\"let dayName of weekHeaderLabels\"\n class=\"igx-days-view__label\"\n >\n <span class=\"igx-days-view__label-inner\">\n {{ dayName.formatted | titlecase }}\n </span>\n </span>\n</div>\n\n<div\n *ngFor=\"\n let week of monthWeeks;\n last as isLast;\n index as i;\n trackBy: rowTracker\n \"\n class=\"igx-days-view__row\"\n role=\"row\"\n>\n <div\n *ngIf=\"showWeekNumbers\"\n class=\"igx-days-view__date igx-days-view__date--week-number\"\n >\n <span\n role=\"rowheader\"\n class=\"igx-days-view__date-inner igx-days-view__date-inner--week-number\"\n >\n {{ getWeekNumber(week[0]) }}\n </span>\n </div>\n\n <igx-day-item\n #item\n *ngFor=\"let day of week; trackBy: dateTracker\"\n class=\"igx-days-view__date\"\n role=\"gridcell\"\n [attr.id]=\"item.isCurrentMonth && day.timestamp\"\n [attr.aria-selected]=\"isSelected(day)\"\n [attr.aria-disabled]=\"isDateDisabled(day.native)\"\n [attr.aria-label]=\"\n isFirstInRange(day)\n ? day.native.toDateString() +\n ', ' +\n resourceStrings.igx_calendar_range_start\n : isLastInRange(day)\n ? day.native.toDateString() +\n ', ' +\n resourceStrings.igx_calendar_range_end\n : day.native.toDateString()\n \"\n [date]=\"day\"\n [viewDate]=\"viewDate\"\n [selection]=\"selection\"\n [selected]=\"isSelected(day)\"\n [isActive]=\"isActiveDate(day)\"\n [isLastInRange]=\"isLastInRange(day)\"\n [isFirstInRange]=\"isFirstInRange(day)\"\n [isWithinRange]=\"isWithinRange(day.native, true)\"\n [isWithinPreviewRange]=\"isWithinPreviewRange(day.native)\"\n [disabledDates]=\"disabledDates\"\n [specialDates]=\"specialDates\"\n [hideLeadingDays]=\"hideLeadingDays\"\n [hideTrailingDays]=\"hideTrailingDays\"\n [attr.tabindex]=\"-1\"\n (mouseDown)=\"handleDateClick(item)\"\n (mouseEnter)=\"changePreviewRange(day.native)\"\n (mouseLeave)=\"clearPreviewRange()\"\n >\n {{ formattedDate(day.native) }}\n </igx-day-item>\n</div>\n" }]
32191
+ ], selector: 'igx-days-view', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIf, NgFor, IgxDayItemComponent, TitleCasePipe], template: "<div\n role=\"row\"\n class=\"igx-days-view__row\"\n [title]=\"weekNumberHeader.long | titlecase\"\n>\n <div\n role=\"columnheader\"\n *ngIf=\"showWeekNumbers\"\n class=\"igx-days-view__label igx-days-view__label--week-number\"\n >\n <span>\n <i>{{ weekNumberHeader.short | titlecase }}</i>\n </span>\n </div>\n <span\n role=\"columnheader\"\n [attr.aria-label]=\"dayName.long\"\n *ngFor=\"let dayName of weekHeaderLabels\"\n class=\"igx-days-view__label\"\n >\n <span class=\"igx-days-view__label-inner\">\n {{ dayName.formatted | titlecase }}\n </span>\n </span>\n</div>\n\n<div\n *ngFor=\"\n let week of monthWeeks;\n last as isLast;\n index as i;\n trackBy: rowTracker\n \"\n class=\"igx-days-view__row\"\n role=\"row\"\n>\n <div\n *ngIf=\"showWeekNumbers\"\n class=\"igx-days-view__date igx-days-view__date--week-number\"\n >\n <span\n role=\"rowheader\"\n class=\"igx-days-view__date-inner igx-days-view__date-inner--week-number\"\n >\n {{ getWeekNumber(week[0]) }}\n </span>\n </div>\n\n <igx-day-item\n #item\n *ngFor=\"let day of week; trackBy: dateTracker\"\n class=\"igx-days-view__date\"\n role=\"gridcell\"\n [attr.id]=\"item.isCurrentMonth && day.timestamp\"\n [attr.aria-selected]=\"isSelected(day)\"\n [attr.aria-disabled]=\"isDateDisabled(day.native)\"\n [attr.aria-label]=\"\n isFirstInRange(day)\n ? day.native.toDateString() +\n ', ' +\n resourceStrings.igx_calendar_range_start\n : isLastInRange(day)\n ? day.native.toDateString() +\n ', ' +\n resourceStrings.igx_calendar_range_end\n : day.native.toDateString()\n \"\n [date]=\"day\"\n [viewDate]=\"viewDate\"\n [selection]=\"selection\"\n [selected]=\"isSelected(day)\"\n [isActive]=\"isActiveDate(day)\"\n [isLastInRange]=\"isLastInRange(day)\"\n [isFirstInRange]=\"isFirstInRange(day)\"\n [isWithinRange]=\"isWithinRange(day.native, true)\"\n [isWithinPreviewRange]=\"isWithinPreviewRange(day.native)\"\n [disabledDates]=\"disabledDates\"\n [specialDates]=\"specialDates\"\n [hideLeadingDays]=\"hideLeadingDays\"\n [hideTrailingDays]=\"hideTrailingDays\"\n [attr.tabindex]=\"-1\"\n (click)=\"handleDateClick(item)\"\n (mouseEnter)=\"changePreviewRange(day.native)\"\n (mouseLeave)=\"clearPreviewRange()\"\n >\n {{ formattedDate(day.native) }}\n </igx-day-item>\n</div>\n" }]
32192
32192
  }], ctorParameters: () => [{ type: PlatformUtil }, { type: undefined, decorators: [{
32193
32193
  type: Inject,
32194
32194
  args: [LOCALE_ID]
@@ -32655,20 +32655,17 @@ class IgxCalendarComponent extends IgxCalendarBaseDirective {
32655
32655
  });
32656
32656
  });
32657
32657
  }
32658
- onWrapperFocus(event) {
32659
- event.stopPropagation();
32658
+ onWrapperFocus(_event) {
32660
32659
  this.showActiveDay = true;
32661
32660
  this.monthViews.forEach(view => view.changePreviewRange(this.activeDate));
32662
32661
  }
32663
- onWrapperBlur(event) {
32664
- event.stopPropagation();
32662
+ onWrapperBlur(_event) {
32665
32663
  this.showActiveDay = false;
32666
32664
  this.monthViews.forEach(view => view.clearPreviewRange());
32667
32665
  this._onTouchedCallback();
32668
32666
  }
32669
32667
  handleArrowKeydown(event, delta) {
32670
32668
  event.preventDefault();
32671
- event.stopPropagation();
32672
32669
  const date = getClosestActiveDate(CalendarDay.from(this.activeDate), delta, this.disabledDates);
32673
32670
  this.activeDate = date.native;
32674
32671
  const dates = this.viewDates;
@@ -32680,7 +32677,6 @@ class IgxCalendarComponent extends IgxCalendarBaseDirective {
32680
32677
  }
32681
32678
  handlePageUpDown(event, delta) {
32682
32679
  event.preventDefault();
32683
- event.stopPropagation();
32684
32680
  const dir = delta > 0 ? "next" /* ScrollDirection.NEXT */ : "prev" /* ScrollDirection.PREV */;
32685
32681
  if (this.activeView === IgxCalendarView.Month && event.shiftKey) {
32686
32682
  this.viewDate = CalendarDay.from(this.viewDate).add('year', delta).native;
@@ -32746,7 +32742,6 @@ class IgxCalendarComponent extends IgxCalendarBaseDirective {
32746
32742
  }
32747
32743
  }
32748
32744
  onEnter(event) {
32749
- event.stopPropagation();
32750
32745
  if (this.activeView === IgxCalendarView.Month) {
32751
32746
  this.handleDateSelection(this.activeDate);
32752
32747
  this.cdr.detectChanges();
@@ -32760,7 +32755,6 @@ class IgxCalendarComponent extends IgxCalendarBaseDirective {
32760
32755
  this.monthViews.forEach(view => view.clearPreviewRange());
32761
32756
  }
32762
32757
  onHome(event) {
32763
- event.stopPropagation();
32764
32758
  if (this.activeView === IgxCalendarView.Month) {
32765
32759
  const dates = this.monthViews.toArray()
32766
32760
  .flatMap((view) => view.dates.toArray())
@@ -32776,7 +32770,6 @@ class IgxCalendarComponent extends IgxCalendarBaseDirective {
32776
32770
  }
32777
32771
  }
32778
32772
  onEnd(event) {
32779
- event.stopPropagation();
32780
32773
  if (this.activeView === IgxCalendarView.Month) {
32781
32774
  const dates = this.monthViews.toArray()
32782
32775
  .flatMap((view) => view.dates.toArray())
@@ -38087,6 +38080,9 @@ class IgxComboBaseDirective {
38087
38080
  /** @hidden @internal */
38088
38081
  handleClosed() {
38089
38082
  this.closed.emit({ owner: this });
38083
+ if (this.comboInput.nativeElement !== this.document.activeElement) {
38084
+ this.validateComboState();
38085
+ }
38090
38086
  }
38091
38087
  /** @hidden @internal */
38092
38088
  handleKeyDown(event) {
@@ -38120,15 +38116,14 @@ class IgxComboBaseDirective {
38120
38116
  onBlur() {
38121
38117
  if (this.collapsed) {
38122
38118
  this._onTouchedCallback();
38123
- if (this.ngControl && this.ngControl.invalid) {
38124
- this.valid = IgxInputState.INVALID;
38125
- }
38126
- else {
38127
- this.valid = IgxInputState.INITIAL;
38128
- }
38119
+ this.validateComboState();
38129
38120
  }
38130
38121
  }
38131
38122
  /** @hidden @internal */
38123
+ onFocus() {
38124
+ this._onTouchedCallback();
38125
+ }
38126
+ /** @hidden @internal */
38132
38127
  setActiveDescendant() {
38133
38128
  this.activeDescendant = this.dropdown.focusedItem?.id || '';
38134
38129
  }
@@ -38136,6 +38131,14 @@ class IgxComboBaseDirective {
38136
38131
  toggleCaseSensitive() {
38137
38132
  this.filteringOptions = Object.assign({}, this.filteringOptions, { caseSensitive: !this.filteringOptions.caseSensitive });
38138
38133
  }
38134
+ validateComboState() {
38135
+ if (this.ngControl && this.ngControl.invalid) {
38136
+ this.valid = IgxInputState.INVALID;
38137
+ }
38138
+ else {
38139
+ this.valid = IgxInputState.INITIAL;
38140
+ }
38141
+ }
38139
38142
  get isTouchedOrDirty() {
38140
38143
  return (this.ngControl.control.touched || this.ngControl.control.dirty);
38141
38144
  }
@@ -39012,7 +39015,7 @@ class IgxComboComponent extends IgxComboBaseDirective {
39012
39015
  IgxComboAPIService,
39013
39016
  { provide: IGX_COMBO_COMPONENT, useExisting: IgxComboComponent },
39014
39017
  { provide: NG_VALUE_ACCESSOR, useExisting: IgxComboComponent, multi: true }
39015
- ], viewQueries: [{ propertyName: "dropdown", first: true, predicate: IgxComboDropDownComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<igx-input-group #inputGroup [type]=\"type\" (click)=\"onClick($event)\">\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-hint, [igxHint]\">\n <ng-content select=\"igx-hint, [igxHint]\"></ng-content>\n </ng-container>\n <input igxInput #comboInput name=\"comboInput\" type=\"text\" [value]=\"displayValue\" readonly\n [attr.placeholder]=\"placeholder\" [disabled]=\"disabled\"\n role=\"combobox\" aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"!dropdown.collapsed\" [attr.aria-controls]=\"dropdown.listId\"\n [attr.aria-labelledby]=\"ariaLabelledBy || label?.id || placeholder\"\n (blur)=\"onBlur()\" />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix\"></ng-content>\n </ng-container>\n <igx-suffix *ngIf=\"displayValue\" [attr.aria-label]=\"resourceStrings.igx_combo_clearItems_placeholder\" class=\"igx-combo__clear-button\"\n (click)=\"handleClearItems($event)\">\n <ng-container *ngIf=\"clearIconTemplate\">\n <ng-container *ngTemplateOutlet=\"clearIconTemplate\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!clearIconTemplate\" family=\"default\" name=\"input_clear\"></igx-icon>\n </igx-suffix>\n <igx-suffix class=\"igx-combo__toggle-button\">\n <ng-container *ngIf=\"toggleIconTemplate\">\n <ng-container *ngTemplateOutlet=\"toggleIconTemplate; context: {$implicit: collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\" family=\"default\" [name]=\"toggleIcon\"></igx-icon>\n </igx-suffix>\n</igx-input-group>\n<igx-combo-drop-down #igxComboDropDown class=\"igx-combo__drop-down\"\n [labelledBy]=\"ariaLabelledBy || label?.id || placeholder || ''\"\n [width]=\"itemsWidth || '100%'\" (opening)=\"handleOpening($event)\" (closing)=\"handleClosing($event)\"\n (opened)=\"handleOpened()\" (closed)=\"handleClosed()\">\n <div class=\"igx-combo__search\">\n <igx-input-group *ngIf=\"displaySearchInput\">\n <input igxInput #searchInput name=\"searchInput\" autocomplete=\"off\" type=\"text\"\n [(ngModel)]=\"searchValue\" (ngModelChange)=\"handleInputChange($event)\" (keyup)=\"handleKeyUp($event)\"\n (keydown)=\"handleKeyDown($event)\" (focus)=\"dropdown.onBlur($event)\" [attr.placeholder]=\"getSearchPlaceholderText()\"\n aria-autocomplete=\"list\" role=\"searchbox\" aria-label=\"search\"/>\n <igx-suffix *ngIf=\"showSearchCaseIcon\" (click)=\"toggleCaseSensitive()\">\n <span [ngClass]=\"filteringOptions.caseSensitive? 'igx-combo__case-icon--active' : 'igx-combo__case-icon'\">\n <igx-icon\n family=\"default\"\n name=\"case_sensitive\"\n [active]=\"filteringOptions.caseSensitive\">\n </igx-icon>\n </span>\n </igx-suffix>\n </igx-input-group>\n </div>\n <ng-container *ngTemplateOutlet=\"headerTemplate\">\n </ng-container>\n <div #dropdownItemContainer class=\"igx-combo__content\" [style.overflow]=\"'hidden'\"\n [style.maxHeight.rem]=\"itemsMaxHeightInRem\" [igxDropDownItemNavigation]=\"dropdown\" (focus)=\"dropdown.onFocus()\"\n [tabindex]=\"dropdown.collapsed ? -1 : 0\" [attr.id]=\"dropdown.id\" aria-multiselectable=\"true\"\n [attr.aria-activedescendant]=\"activeDescendant\">\n <igx-combo-item [itemHeight]=\"itemHeight\" *igxFor=\"let item of data\n | comboFiltering:filterValue:displayKey:filteringOptions:filterFunction:disableFiltering\n | comboGrouping:groupKey:valueKey:groupSortingDirection:compareCollator;\n index as rowIndex; containerSize: itemsMaxHeight; scrollOrientation: 'vertical'; itemSize: itemHeight\"\n [value]=\"item\" [isHeader]=\"item?.isHeader\" [index]=\"rowIndex\" [role]=\"item?.isHeader? 'group' : 'option'\">\n <ng-container *ngIf=\"item?.isHeader\">\n <ng-container\n *ngTemplateOutlet=\"headerItemTemplate ? headerItemTemplate : headerItemBase;\n context: {$implicit: item, data: data, valueKey: valueKey, groupKey: groupKey, displayKey: displayKey}\">\n </ng-container>\n </ng-container>\n <!-- if item is 'null' it should be displayed and !!(item?.isHeader) would resolve it to 'false' and not display it -->\n <ng-container *ngIf=\"!item?.isHeader\">\n <ng-container #listItem\n *ngTemplateOutlet=\"template; context: {$implicit: item, data: data, valueKey: valueKey, displayKey: displayKey};\">\n </ng-container>\n </ng-container>\n </igx-combo-item>\n </div>\n <div class=\"igx-combo__add\" *ngIf=\"filteredData.length === 0 || isAddButtonVisible()\">\n <div class=\"igx-combo__empty\" *ngIf=\"filteredData.length === 0\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate ? emptyTemplate : empty\">\n </ng-container>\n </div>\n <igx-combo-add-item [itemHeight]=\"itemHeight\" *ngIf=\"isAddButtonVisible()\"\n [tabindex]=\"dropdown.collapsed ? -1 : customValueFlag ? 1 : -1\" class=\"igx-combo__add-item\" role=\"button\"\n [attr.aria-label]=\"resourceStrings.igx_combo_addCustomValues_placeholder\" [index]=\"virtualScrollContainer.igxForOf.length\">\n <ng-container *ngTemplateOutlet=\"addItemTemplate ? addItemTemplate : addItemDefault\">\n </ng-container>\n </igx-combo-add-item>\n </div>\n <ng-container *ngTemplateOutlet=\"footerTemplate\">\n </ng-container>\n</igx-combo-drop-down>\n<ng-template #complex let-display let-data=\"data\" let-key=\"displayKey\">\n {{display[key]}}\n</ng-template>\n<ng-template #primitive let-display>\n {{display}}\n</ng-template>\n<ng-template #empty>\n <span>{{resourceStrings.igx_combo_empty_message}}</span>\n</ng-template>\n<ng-template #addItemDefault let-control>\n <button type=\"button\" igxButton=\"flat\" igxRipple>{{ resourceStrings.igx_combo_addCustomValues_placeholder }}</button>\n</ng-template>\n<ng-template #headerItemBase let-item let-key=\"valueKey\" let-groupKey=\"groupKey\">\n {{ item[key] }}\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxComboDropDownComponent, selector: "igx-combo-drop-down", inputs: ["singleMode"] }, { kind: "directive", type: IgxDropDownItemNavigationDirective, selector: "[igxDropDownItemNavigation]", inputs: ["igxDropDownItemNavigation"] }, { kind: "directive", type: IgxForOfDirective, selector: "[igxFor][igxForOf]", inputs: ["igxForOf", "igxForSizePropName", "igxForScrollOrientation", "igxForScrollContainer", "igxForContainerSize", "igxForItemSize", "igxForTotalItemCount", "igxForTrackBy"], outputs: ["chunkLoad", "scrollbarVisibilityChanged", "contentSizeChange", "dataChanged", "beforeViewDestroyed", "chunkPreload"] }, { kind: "component", type: IgxComboItemComponent, selector: "igx-combo-item", inputs: ["itemHeight", "ariaLabel", "singleMode"] }, { kind: "component", type: IgxComboAddItemComponent, selector: "igx-combo-add-item" }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "directive", type: IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }, { kind: "pipe", type: IgxComboFilteringPipe, name: "comboFiltering" }, { kind: "pipe", type: IgxComboGroupingPipe, name: "comboGrouping" }] }); }
39018
+ ], viewQueries: [{ propertyName: "dropdown", first: true, predicate: IgxComboDropDownComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<igx-input-group #inputGroup [type]=\"type\" (click)=\"onClick($event)\">\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-hint, [igxHint]\">\n <ng-content select=\"igx-hint, [igxHint]\"></ng-content>\n </ng-container>\n <input igxInput #comboInput name=\"comboInput\" type=\"text\" [value]=\"displayValue\" readonly\n [attr.placeholder]=\"placeholder\" [disabled]=\"disabled\"\n role=\"combobox\" aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"!dropdown.collapsed\" [attr.aria-controls]=\"dropdown.listId\"\n [attr.aria-labelledby]=\"ariaLabelledBy || label?.id || placeholder\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\" />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix\"></ng-content>\n </ng-container>\n <igx-suffix *ngIf=\"displayValue\" [attr.aria-label]=\"resourceStrings.igx_combo_clearItems_placeholder\" class=\"igx-combo__clear-button\"\n (click)=\"handleClearItems($event)\">\n <ng-container *ngIf=\"clearIconTemplate\">\n <ng-container *ngTemplateOutlet=\"clearIconTemplate\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!clearIconTemplate\" family=\"default\" name=\"input_clear\"></igx-icon>\n </igx-suffix>\n <igx-suffix class=\"igx-combo__toggle-button\">\n <ng-container *ngIf=\"toggleIconTemplate\">\n <ng-container *ngTemplateOutlet=\"toggleIconTemplate; context: {$implicit: collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\" family=\"default\" [name]=\"toggleIcon\"></igx-icon>\n </igx-suffix>\n</igx-input-group>\n<igx-combo-drop-down #igxComboDropDown class=\"igx-combo__drop-down\"\n [labelledBy]=\"ariaLabelledBy || label?.id || placeholder || ''\"\n [width]=\"itemsWidth || '100%'\" (opening)=\"handleOpening($event)\" (closing)=\"handleClosing($event)\"\n (opened)=\"handleOpened()\" (closed)=\"handleClosed()\">\n <div class=\"igx-combo__search\">\n <igx-input-group *ngIf=\"displaySearchInput\">\n <input igxInput #searchInput name=\"searchInput\" autocomplete=\"off\" type=\"text\"\n [(ngModel)]=\"searchValue\" (ngModelChange)=\"handleInputChange($event)\" (keyup)=\"handleKeyUp($event)\"\n (keydown)=\"handleKeyDown($event)\" (focus)=\"dropdown.onBlur($event)\" [attr.placeholder]=\"getSearchPlaceholderText()\"\n aria-autocomplete=\"list\" role=\"searchbox\" aria-label=\"search\"/>\n <igx-suffix *ngIf=\"showSearchCaseIcon\" (click)=\"toggleCaseSensitive()\">\n <span [ngClass]=\"filteringOptions.caseSensitive? 'igx-combo__case-icon--active' : 'igx-combo__case-icon'\">\n <igx-icon\n family=\"default\"\n name=\"case_sensitive\"\n [active]=\"filteringOptions.caseSensitive\">\n </igx-icon>\n </span>\n </igx-suffix>\n </igx-input-group>\n </div>\n <ng-container *ngTemplateOutlet=\"headerTemplate\">\n </ng-container>\n <div #dropdownItemContainer class=\"igx-combo__content\" [style.overflow]=\"'hidden'\"\n [style.maxHeight.rem]=\"itemsMaxHeightInRem\" [igxDropDownItemNavigation]=\"dropdown\" (focus)=\"dropdown.onFocus()\"\n [tabindex]=\"dropdown.collapsed ? -1 : 0\" [attr.id]=\"dropdown.id\" aria-multiselectable=\"true\"\n [attr.aria-activedescendant]=\"activeDescendant\">\n <igx-combo-item [itemHeight]=\"itemHeight\" *igxFor=\"let item of data\n | comboFiltering:filterValue:displayKey:filteringOptions:filterFunction:disableFiltering\n | comboGrouping:groupKey:valueKey:groupSortingDirection:compareCollator;\n index as rowIndex; containerSize: itemsMaxHeight; scrollOrientation: 'vertical'; itemSize: itemHeight\"\n [value]=\"item\" [isHeader]=\"item?.isHeader\" [index]=\"rowIndex\" [role]=\"item?.isHeader? 'group' : 'option'\">\n <ng-container *ngIf=\"item?.isHeader\">\n <ng-container\n *ngTemplateOutlet=\"headerItemTemplate ? headerItemTemplate : headerItemBase;\n context: {$implicit: item, data: data, valueKey: valueKey, groupKey: groupKey, displayKey: displayKey}\">\n </ng-container>\n </ng-container>\n <!-- if item is 'null' it should be displayed and !!(item?.isHeader) would resolve it to 'false' and not display it -->\n <ng-container *ngIf=\"!item?.isHeader\">\n <ng-container #listItem\n *ngTemplateOutlet=\"template; context: {$implicit: item, data: data, valueKey: valueKey, displayKey: displayKey};\">\n </ng-container>\n </ng-container>\n </igx-combo-item>\n </div>\n <div class=\"igx-combo__add\" *ngIf=\"filteredData.length === 0 || isAddButtonVisible()\">\n <div class=\"igx-combo__empty\" *ngIf=\"filteredData.length === 0\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate ? emptyTemplate : empty\">\n </ng-container>\n </div>\n <igx-combo-add-item [itemHeight]=\"itemHeight\" *ngIf=\"isAddButtonVisible()\"\n [tabindex]=\"dropdown.collapsed ? -1 : customValueFlag ? 1 : -1\" class=\"igx-combo__add-item\" role=\"button\"\n [attr.aria-label]=\"resourceStrings.igx_combo_addCustomValues_placeholder\" [index]=\"virtualScrollContainer.igxForOf.length\">\n <ng-container *ngTemplateOutlet=\"addItemTemplate ? addItemTemplate : addItemDefault\">\n </ng-container>\n </igx-combo-add-item>\n </div>\n <ng-container *ngTemplateOutlet=\"footerTemplate\">\n </ng-container>\n</igx-combo-drop-down>\n<ng-template #complex let-display let-data=\"data\" let-key=\"displayKey\">\n {{display[key]}}\n</ng-template>\n<ng-template #primitive let-display>\n {{display}}\n</ng-template>\n<ng-template #empty>\n <span>{{resourceStrings.igx_combo_empty_message}}</span>\n</ng-template>\n<ng-template #addItemDefault let-control>\n <button type=\"button\" igxButton=\"flat\" igxRipple>{{ resourceStrings.igx_combo_addCustomValues_placeholder }}</button>\n</ng-template>\n<ng-template #headerItemBase let-item let-key=\"valueKey\" let-groupKey=\"groupKey\">\n {{ item[key] }}\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxComboDropDownComponent, selector: "igx-combo-drop-down", inputs: ["singleMode"] }, { kind: "directive", type: IgxDropDownItemNavigationDirective, selector: "[igxDropDownItemNavigation]", inputs: ["igxDropDownItemNavigation"] }, { kind: "directive", type: IgxForOfDirective, selector: "[igxFor][igxForOf]", inputs: ["igxForOf", "igxForSizePropName", "igxForScrollOrientation", "igxForScrollContainer", "igxForContainerSize", "igxForItemSize", "igxForTotalItemCount", "igxForTrackBy"], outputs: ["chunkLoad", "scrollbarVisibilityChanged", "contentSizeChange", "dataChanged", "beforeViewDestroyed", "chunkPreload"] }, { kind: "component", type: IgxComboItemComponent, selector: "igx-combo-item", inputs: ["itemHeight", "ariaLabel", "singleMode"] }, { kind: "component", type: IgxComboAddItemComponent, selector: "igx-combo-add-item" }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "directive", type: IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }, { kind: "pipe", type: IgxComboFilteringPipe, name: "comboFiltering" }, { kind: "pipe", type: IgxComboGroupingPipe, name: "comboGrouping" }] }); }
39016
39019
  }
39017
39020
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: IgxComboComponent, decorators: [{
39018
39021
  type: Component,
@@ -39038,7 +39041,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImpor
39038
39041
  IgxRippleDirective,
39039
39042
  IgxComboFilteringPipe,
39040
39043
  IgxComboGroupingPipe
39041
- ], template: "<igx-input-group #inputGroup [type]=\"type\" (click)=\"onClick($event)\">\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-hint, [igxHint]\">\n <ng-content select=\"igx-hint, [igxHint]\"></ng-content>\n </ng-container>\n <input igxInput #comboInput name=\"comboInput\" type=\"text\" [value]=\"displayValue\" readonly\n [attr.placeholder]=\"placeholder\" [disabled]=\"disabled\"\n role=\"combobox\" aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"!dropdown.collapsed\" [attr.aria-controls]=\"dropdown.listId\"\n [attr.aria-labelledby]=\"ariaLabelledBy || label?.id || placeholder\"\n (blur)=\"onBlur()\" />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix\"></ng-content>\n </ng-container>\n <igx-suffix *ngIf=\"displayValue\" [attr.aria-label]=\"resourceStrings.igx_combo_clearItems_placeholder\" class=\"igx-combo__clear-button\"\n (click)=\"handleClearItems($event)\">\n <ng-container *ngIf=\"clearIconTemplate\">\n <ng-container *ngTemplateOutlet=\"clearIconTemplate\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!clearIconTemplate\" family=\"default\" name=\"input_clear\"></igx-icon>\n </igx-suffix>\n <igx-suffix class=\"igx-combo__toggle-button\">\n <ng-container *ngIf=\"toggleIconTemplate\">\n <ng-container *ngTemplateOutlet=\"toggleIconTemplate; context: {$implicit: collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\" family=\"default\" [name]=\"toggleIcon\"></igx-icon>\n </igx-suffix>\n</igx-input-group>\n<igx-combo-drop-down #igxComboDropDown class=\"igx-combo__drop-down\"\n [labelledBy]=\"ariaLabelledBy || label?.id || placeholder || ''\"\n [width]=\"itemsWidth || '100%'\" (opening)=\"handleOpening($event)\" (closing)=\"handleClosing($event)\"\n (opened)=\"handleOpened()\" (closed)=\"handleClosed()\">\n <div class=\"igx-combo__search\">\n <igx-input-group *ngIf=\"displaySearchInput\">\n <input igxInput #searchInput name=\"searchInput\" autocomplete=\"off\" type=\"text\"\n [(ngModel)]=\"searchValue\" (ngModelChange)=\"handleInputChange($event)\" (keyup)=\"handleKeyUp($event)\"\n (keydown)=\"handleKeyDown($event)\" (focus)=\"dropdown.onBlur($event)\" [attr.placeholder]=\"getSearchPlaceholderText()\"\n aria-autocomplete=\"list\" role=\"searchbox\" aria-label=\"search\"/>\n <igx-suffix *ngIf=\"showSearchCaseIcon\" (click)=\"toggleCaseSensitive()\">\n <span [ngClass]=\"filteringOptions.caseSensitive? 'igx-combo__case-icon--active' : 'igx-combo__case-icon'\">\n <igx-icon\n family=\"default\"\n name=\"case_sensitive\"\n [active]=\"filteringOptions.caseSensitive\">\n </igx-icon>\n </span>\n </igx-suffix>\n </igx-input-group>\n </div>\n <ng-container *ngTemplateOutlet=\"headerTemplate\">\n </ng-container>\n <div #dropdownItemContainer class=\"igx-combo__content\" [style.overflow]=\"'hidden'\"\n [style.maxHeight.rem]=\"itemsMaxHeightInRem\" [igxDropDownItemNavigation]=\"dropdown\" (focus)=\"dropdown.onFocus()\"\n [tabindex]=\"dropdown.collapsed ? -1 : 0\" [attr.id]=\"dropdown.id\" aria-multiselectable=\"true\"\n [attr.aria-activedescendant]=\"activeDescendant\">\n <igx-combo-item [itemHeight]=\"itemHeight\" *igxFor=\"let item of data\n | comboFiltering:filterValue:displayKey:filteringOptions:filterFunction:disableFiltering\n | comboGrouping:groupKey:valueKey:groupSortingDirection:compareCollator;\n index as rowIndex; containerSize: itemsMaxHeight; scrollOrientation: 'vertical'; itemSize: itemHeight\"\n [value]=\"item\" [isHeader]=\"item?.isHeader\" [index]=\"rowIndex\" [role]=\"item?.isHeader? 'group' : 'option'\">\n <ng-container *ngIf=\"item?.isHeader\">\n <ng-container\n *ngTemplateOutlet=\"headerItemTemplate ? headerItemTemplate : headerItemBase;\n context: {$implicit: item, data: data, valueKey: valueKey, groupKey: groupKey, displayKey: displayKey}\">\n </ng-container>\n </ng-container>\n <!-- if item is 'null' it should be displayed and !!(item?.isHeader) would resolve it to 'false' and not display it -->\n <ng-container *ngIf=\"!item?.isHeader\">\n <ng-container #listItem\n *ngTemplateOutlet=\"template; context: {$implicit: item, data: data, valueKey: valueKey, displayKey: displayKey};\">\n </ng-container>\n </ng-container>\n </igx-combo-item>\n </div>\n <div class=\"igx-combo__add\" *ngIf=\"filteredData.length === 0 || isAddButtonVisible()\">\n <div class=\"igx-combo__empty\" *ngIf=\"filteredData.length === 0\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate ? emptyTemplate : empty\">\n </ng-container>\n </div>\n <igx-combo-add-item [itemHeight]=\"itemHeight\" *ngIf=\"isAddButtonVisible()\"\n [tabindex]=\"dropdown.collapsed ? -1 : customValueFlag ? 1 : -1\" class=\"igx-combo__add-item\" role=\"button\"\n [attr.aria-label]=\"resourceStrings.igx_combo_addCustomValues_placeholder\" [index]=\"virtualScrollContainer.igxForOf.length\">\n <ng-container *ngTemplateOutlet=\"addItemTemplate ? addItemTemplate : addItemDefault\">\n </ng-container>\n </igx-combo-add-item>\n </div>\n <ng-container *ngTemplateOutlet=\"footerTemplate\">\n </ng-container>\n</igx-combo-drop-down>\n<ng-template #complex let-display let-data=\"data\" let-key=\"displayKey\">\n {{display[key]}}\n</ng-template>\n<ng-template #primitive let-display>\n {{display}}\n</ng-template>\n<ng-template #empty>\n <span>{{resourceStrings.igx_combo_empty_message}}</span>\n</ng-template>\n<ng-template #addItemDefault let-control>\n <button type=\"button\" igxButton=\"flat\" igxRipple>{{ resourceStrings.igx_combo_addCustomValues_placeholder }}</button>\n</ng-template>\n<ng-template #headerItemBase let-item let-key=\"valueKey\" let-groupKey=\"groupKey\">\n {{ item[key] }}\n</ng-template>\n" }]
39044
+ ], template: "<igx-input-group #inputGroup [type]=\"type\" (click)=\"onClick($event)\">\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-hint, [igxHint]\">\n <ng-content select=\"igx-hint, [igxHint]\"></ng-content>\n </ng-container>\n <input igxInput #comboInput name=\"comboInput\" type=\"text\" [value]=\"displayValue\" readonly\n [attr.placeholder]=\"placeholder\" [disabled]=\"disabled\"\n role=\"combobox\" aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"!dropdown.collapsed\" [attr.aria-controls]=\"dropdown.listId\"\n [attr.aria-labelledby]=\"ariaLabelledBy || label?.id || placeholder\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\" />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix\"></ng-content>\n </ng-container>\n <igx-suffix *ngIf=\"displayValue\" [attr.aria-label]=\"resourceStrings.igx_combo_clearItems_placeholder\" class=\"igx-combo__clear-button\"\n (click)=\"handleClearItems($event)\">\n <ng-container *ngIf=\"clearIconTemplate\">\n <ng-container *ngTemplateOutlet=\"clearIconTemplate\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!clearIconTemplate\" family=\"default\" name=\"input_clear\"></igx-icon>\n </igx-suffix>\n <igx-suffix class=\"igx-combo__toggle-button\">\n <ng-container *ngIf=\"toggleIconTemplate\">\n <ng-container *ngTemplateOutlet=\"toggleIconTemplate; context: {$implicit: collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\" family=\"default\" [name]=\"toggleIcon\"></igx-icon>\n </igx-suffix>\n</igx-input-group>\n<igx-combo-drop-down #igxComboDropDown class=\"igx-combo__drop-down\"\n [labelledBy]=\"ariaLabelledBy || label?.id || placeholder || ''\"\n [width]=\"itemsWidth || '100%'\" (opening)=\"handleOpening($event)\" (closing)=\"handleClosing($event)\"\n (opened)=\"handleOpened()\" (closed)=\"handleClosed()\">\n <div class=\"igx-combo__search\">\n <igx-input-group *ngIf=\"displaySearchInput\">\n <input igxInput #searchInput name=\"searchInput\" autocomplete=\"off\" type=\"text\"\n [(ngModel)]=\"searchValue\" (ngModelChange)=\"handleInputChange($event)\" (keyup)=\"handleKeyUp($event)\"\n (keydown)=\"handleKeyDown($event)\" (focus)=\"dropdown.onBlur($event)\" [attr.placeholder]=\"getSearchPlaceholderText()\"\n aria-autocomplete=\"list\" role=\"searchbox\" aria-label=\"search\"/>\n <igx-suffix *ngIf=\"showSearchCaseIcon\" (click)=\"toggleCaseSensitive()\">\n <span [ngClass]=\"filteringOptions.caseSensitive? 'igx-combo__case-icon--active' : 'igx-combo__case-icon'\">\n <igx-icon\n family=\"default\"\n name=\"case_sensitive\"\n [active]=\"filteringOptions.caseSensitive\">\n </igx-icon>\n </span>\n </igx-suffix>\n </igx-input-group>\n </div>\n <ng-container *ngTemplateOutlet=\"headerTemplate\">\n </ng-container>\n <div #dropdownItemContainer class=\"igx-combo__content\" [style.overflow]=\"'hidden'\"\n [style.maxHeight.rem]=\"itemsMaxHeightInRem\" [igxDropDownItemNavigation]=\"dropdown\" (focus)=\"dropdown.onFocus()\"\n [tabindex]=\"dropdown.collapsed ? -1 : 0\" [attr.id]=\"dropdown.id\" aria-multiselectable=\"true\"\n [attr.aria-activedescendant]=\"activeDescendant\">\n <igx-combo-item [itemHeight]=\"itemHeight\" *igxFor=\"let item of data\n | comboFiltering:filterValue:displayKey:filteringOptions:filterFunction:disableFiltering\n | comboGrouping:groupKey:valueKey:groupSortingDirection:compareCollator;\n index as rowIndex; containerSize: itemsMaxHeight; scrollOrientation: 'vertical'; itemSize: itemHeight\"\n [value]=\"item\" [isHeader]=\"item?.isHeader\" [index]=\"rowIndex\" [role]=\"item?.isHeader? 'group' : 'option'\">\n <ng-container *ngIf=\"item?.isHeader\">\n <ng-container\n *ngTemplateOutlet=\"headerItemTemplate ? headerItemTemplate : headerItemBase;\n context: {$implicit: item, data: data, valueKey: valueKey, groupKey: groupKey, displayKey: displayKey}\">\n </ng-container>\n </ng-container>\n <!-- if item is 'null' it should be displayed and !!(item?.isHeader) would resolve it to 'false' and not display it -->\n <ng-container *ngIf=\"!item?.isHeader\">\n <ng-container #listItem\n *ngTemplateOutlet=\"template; context: {$implicit: item, data: data, valueKey: valueKey, displayKey: displayKey};\">\n </ng-container>\n </ng-container>\n </igx-combo-item>\n </div>\n <div class=\"igx-combo__add\" *ngIf=\"filteredData.length === 0 || isAddButtonVisible()\">\n <div class=\"igx-combo__empty\" *ngIf=\"filteredData.length === 0\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate ? emptyTemplate : empty\">\n </ng-container>\n </div>\n <igx-combo-add-item [itemHeight]=\"itemHeight\" *ngIf=\"isAddButtonVisible()\"\n [tabindex]=\"dropdown.collapsed ? -1 : customValueFlag ? 1 : -1\" class=\"igx-combo__add-item\" role=\"button\"\n [attr.aria-label]=\"resourceStrings.igx_combo_addCustomValues_placeholder\" [index]=\"virtualScrollContainer.igxForOf.length\">\n <ng-container *ngTemplateOutlet=\"addItemTemplate ? addItemTemplate : addItemDefault\">\n </ng-container>\n </igx-combo-add-item>\n </div>\n <ng-container *ngTemplateOutlet=\"footerTemplate\">\n </ng-container>\n</igx-combo-drop-down>\n<ng-template #complex let-display let-data=\"data\" let-key=\"displayKey\">\n {{display[key]}}\n</ng-template>\n<ng-template #primitive let-display>\n {{display}}\n</ng-template>\n<ng-template #empty>\n <span>{{resourceStrings.igx_combo_empty_message}}</span>\n</ng-template>\n<ng-template #addItemDefault let-control>\n <button type=\"button\" igxButton=\"flat\" igxRipple>{{ resourceStrings.igx_combo_addCustomValues_placeholder }}</button>\n</ng-template>\n<ng-template #headerItemBase let-item let-key=\"valueKey\" let-groupKey=\"groupKey\">\n {{ item[key] }}\n</ng-template>\n" }]
39042
39045
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: IgxSelectionAPIService }, { type: IgxComboAPIService }, { type: undefined, decorators: [{
39043
39046
  type: Inject,
39044
39047
  args: [DOCUMENT]
@@ -39894,6 +39897,17 @@ class PickerBaseDirective {
39894
39897
  get isDropdown() {
39895
39898
  return this.mode === PickerInteractionMode.DropDown;
39896
39899
  }
39900
+ /**
39901
+ * Returns if there's focus within the picker's element OR popup container
39902
+ * @hidden @internal
39903
+ */
39904
+ get isFocused() {
39905
+ const document = this.element.nativeElement?.getRootNode();
39906
+ if (!document?.activeElement)
39907
+ return false;
39908
+ return this.element.nativeElement.contains(document.activeElement)
39909
+ || !this.collapsed && this.toggleContainer.contains(document.activeElement);
39910
+ }
39897
39911
  constructor(element, _localeId, _inputGroupType) {
39898
39912
  this.element = element;
39899
39913
  this._localeId = _localeId;
@@ -40298,6 +40312,9 @@ class IgxDatePickerComponent extends PickerBaseDirective {
40298
40312
  get pickerResourceStrings() {
40299
40313
  return Object.assign({}, this._resourceStrings, this.resourceStrings);
40300
40314
  }
40315
+ get toggleContainer() {
40316
+ return this._calendarContainer;
40317
+ }
40301
40318
  /** @hidden @internal */
40302
40319
  onKeyDown(event) {
40303
40320
  switch (event.key) {
@@ -40617,15 +40634,12 @@ class IgxDatePickerComponent extends PickerBaseDirective {
40617
40634
  return;
40618
40635
  }
40619
40636
  this._initializeCalendarContainer(e.componentRef.instance);
40637
+ this._calendarContainer = e.componentRef.location.nativeElement;
40620
40638
  this._collapsed = false;
40621
40639
  });
40622
40640
  this._overlayService.opened.pipe(...this._overlaySubFilter).subscribe(() => {
40623
40641
  this.opened.emit({ owner: this });
40624
- // INFO: Commented out during the calendar refactoring as I couldn't
40625
- // determine why this is needed.
40626
- // if (this._calendar?.daysView?.selectedDates) {
40627
- // return;
40628
- // }
40642
+ this._calendar.wrapper?.nativeElement?.focus();
40629
40643
  if (this._targetViewDate) {
40630
40644
  this._targetViewDate.setHours(0, 0, 0, 0);
40631
40645
  // INFO: We need to set the active date to the target view date so there's something to
@@ -40641,7 +40655,8 @@ class IgxDatePickerComponent extends PickerBaseDirective {
40641
40655
  return;
40642
40656
  }
40643
40657
  // do not focus the input if clicking outside in dropdown mode
40644
- if (this.getEditElement() && !(args.event && this.isDropdown)) {
40658
+ const outsideEvent = args.event && args.event.key !== this.platform.KEYMAP.ESCAPE;
40659
+ if (this.getEditElement() && !(outsideEvent && this.isDropdown)) {
40645
40660
  this.inputDirective.focus();
40646
40661
  }
40647
40662
  else {
@@ -40654,6 +40669,8 @@ class IgxDatePickerComponent extends PickerBaseDirective {
40654
40669
  this._overlayService.detach(this._overlayId);
40655
40670
  this._collapsed = true;
40656
40671
  this._overlayId = null;
40672
+ this._calendar = null;
40673
+ this._calendarContainer = undefined;
40657
40674
  });
40658
40675
  }
40659
40676
  getMinMaxDates() {
@@ -47232,6 +47249,9 @@ class IgxTimePickerComponent extends PickerBaseDirective {
47232
47249
  get appliedFormat() {
47233
47250
  return this.inputFormat || this.dateTimeEditor?.inputFormat;
47234
47251
  }
47252
+ get toggleContainer() {
47253
+ return this.toggleRef?.element;
47254
+ }
47235
47255
  get required() {
47236
47256
  if (this._ngControl && this._ngControl.control && this._ngControl.control.validator) {
47237
47257
  // Run the validation with empty object to check if required is enabled.
@@ -57879,10 +57899,10 @@ class IgxGridFilteringRowComponent {
57879
57899
  }
57880
57900
  requestAnimationFrame(() => {
57881
57901
  const focusedElement = document.activeElement;
57882
- if (focusedElement.classList.contains('igx-chip__remove') || focusedElement.tagName === 'IGX-DAY-ITEM') {
57902
+ if (focusedElement.classList.contains('igx-chip__remove')) {
57883
57903
  return;
57884
57904
  }
57885
- if (!(focusedElement && this.editorsContain(focusedElement))
57905
+ if (!(focusedElement && this.editorFocused(focusedElement))
57886
57906
  && this.dropDownConditions.collapsed) {
57887
57907
  this.commitInput();
57888
57908
  }
@@ -57962,7 +57982,7 @@ class IgxGridFilteringRowComponent {
57962
57982
  onChipPointerdown(args, chip) {
57963
57983
  const activeElement = document.activeElement;
57964
57984
  this._cancelChipClick = chip.selected
57965
- && activeElement && this.editorsContain(activeElement);
57985
+ && activeElement && this.editorFocused(activeElement);
57966
57986
  }
57967
57987
  onChipClick(args, item) {
57968
57988
  if (this._cancelChipClick) {
@@ -58179,11 +58199,11 @@ class IgxGridFilteringRowComponent {
58179
58199
  filter() {
58180
58200
  this.filteringService.filterInternal(this.column.field);
58181
58201
  }
58182
- editorsContain(child) {
58202
+ editorFocused(activeElement) {
58183
58203
  // if the first check is false and the second is undefined this will return undefined
58184
58204
  // make sure it always returns boolean
58185
- return !!(this.inputGroup && this.inputGroup.nativeElement.contains(child)
58186
- || this.picker && this.picker.element.nativeElement.contains(child));
58205
+ return !!(this.inputGroup && this.inputGroup.nativeElement.contains(activeElement)
58206
+ || this.picker && this.picker.isFocused);
58187
58207
  }
58188
58208
  get isColumnFiltered() {
58189
58209
  return this.column.filteringExpressionsTree && this.column.filteringExpressionsTree.filteringOperands.length > 0;
@@ -92216,6 +92236,9 @@ class IgxDateRangePickerComponent extends PickerBaseDirective {
92216
92236
  get separatorClass() {
92217
92237
  return 'igx-date-range-picker__label';
92218
92238
  }
92239
+ get toggleContainer() {
92240
+ return this._calendarContainer;
92241
+ }
92219
92242
  get required() {
92220
92243
  if (this._ngControl && this._ngControl.control && this._ngControl.control.validator) {
92221
92244
  const error = this._ngControl.control.validator({});
@@ -92549,7 +92572,7 @@ class IgxDateRangePickerComponent extends PickerBaseDirective {
92549
92572
  if (args.cancel) {
92550
92573
  return;
92551
92574
  }
92552
- if (this.isDropdown && e?.event && !this.element.nativeElement.contains(e.event.target)) {
92575
+ if (this.isDropdown && e?.event && !this.isFocused) {
92553
92576
  // outside click
92554
92577
  this.updateValidityOnBlur();
92555
92578
  }
@@ -92576,10 +92599,12 @@ class IgxDateRangePickerComponent extends PickerBaseDirective {
92576
92599
  return;
92577
92600
  }
92578
92601
  this._initializeCalendarContainer(e.componentRef.instance);
92602
+ this._calendarContainer = e.componentRef.location.nativeElement;
92579
92603
  this._collapsed = false;
92580
92604
  this.updateCalendar();
92581
92605
  });
92582
92606
  this._overlayService.opened.pipe(...this._overlaySubFilter).subscribe(() => {
92607
+ this.calendar.wrapper.nativeElement.focus();
92583
92608
  this.opened.emit({ owner: this });
92584
92609
  });
92585
92610
  this._overlayService.closing.pipe(...this._overlaySubFilter).subscribe((e) => {
@@ -92589,6 +92614,8 @@ class IgxDateRangePickerComponent extends PickerBaseDirective {
92589
92614
  this._overlayService.detach(this._overlayId);
92590
92615
  this._collapsed = true;
92591
92616
  this._overlayId = null;
92617
+ this._calendar = null;
92618
+ this._calendarContainer = undefined;
92592
92619
  this.closed.emit({ owner: this });
92593
92620
  });
92594
92621
  }