igniteui-angular 12.2.4 → 12.3.0-alpha.0

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 (41) hide show
  1. package/README.md +12 -11
  2. package/bundles/igniteui-angular.umd.js +1773 -1462
  3. package/bundles/igniteui-angular.umd.js.map +1 -1
  4. package/esm2015/igniteui-angular.js +97 -97
  5. package/esm2015/lib/combo/combo-dropdown.component.js +9 -4
  6. package/esm2015/lib/combo/combo-item.component.js +4 -3
  7. package/esm2015/lib/combo/combo.api.js +3 -3
  8. package/esm2015/lib/combo/combo.common.js +999 -2
  9. package/esm2015/lib/combo/combo.component.js +92 -1124
  10. package/esm2015/lib/combo/combo.pipes.js +3 -3
  11. package/esm2015/lib/data-operations/data-util.js +2 -3
  12. package/esm2015/lib/data-operations/grouping-strategy.js +1 -1
  13. package/esm2015/lib/grids/grid/grid.component.js +19 -2
  14. package/esm2015/lib/grids/grid/grid.pipes.js +3 -3
  15. package/esm2015/lib/services/exporter-common/base-export-service.js +2 -2
  16. package/esm2015/lib/simple-combo/public_api.js +2 -0
  17. package/esm2015/lib/simple-combo/simple-combo.component.js +298 -0
  18. package/esm2015/lib/toast/toast.component.js +46 -21
  19. package/esm2015/public_api.js +2 -1
  20. package/fesm2015/igniteui-angular.js +1305 -1025
  21. package/fesm2015/igniteui-angular.js.map +1 -1
  22. package/igniteui-angular.d.ts +96 -96
  23. package/igniteui-angular.metadata.json +1 -1
  24. package/lib/combo/combo-dropdown.component.d.ts +2 -0
  25. package/lib/combo/combo-item.component.d.ts +2 -0
  26. package/lib/combo/combo.common.d.ts +717 -4
  27. package/lib/combo/combo.component.d.ts +39 -782
  28. package/lib/combo/combo.pipes.d.ts +1 -1
  29. package/lib/data-operations/data-util.d.ts +2 -1
  30. package/lib/data-operations/grouping-strategy.d.ts +5 -2
  31. package/lib/grids/grid/grid.component.d.ts +17 -0
  32. package/lib/grids/grid/grid.pipes.d.ts +2 -1
  33. package/lib/simple-combo/public_api.d.ts +1 -0
  34. package/lib/simple-combo/simple-combo.component.d.ts +109 -0
  35. package/lib/toast/toast.component.d.ts +8 -4
  36. package/migrations/migration-collection.json +5 -0
  37. package/migrations/update-12_3_0/changes/members.json +26 -0
  38. package/migrations/update-12_3_0/index.d.ts +3 -0
  39. package/migrations/update-12_3_0/index.js +9 -0
  40. package/package.json +1 -1
  41. package/public_api.d.ts +1 -0
@@ -2064,8 +2064,7 @@ class DataUtil {
2064
2064
  };
2065
2065
  return rec;
2066
2066
  }
2067
- static group(data, state, grid = null, groupsRecords = [], fullResult = { data: [], metadata: [] }) {
2068
- const grouping = new IgxGrouping();
2067
+ static group(data, state, grouping = new IgxGrouping(), grid = null, groupsRecords = [], fullResult = { data: [], metadata: [] }) {
2069
2068
  groupsRecords.splice(0, groupsRecords.length);
2070
2069
  return grouping.groupBy(data, state, grid, groupsRecords, fullResult);
2071
2070
  }
@@ -11752,7 +11751,7 @@ class IgxBaseExporter {
11752
11751
  }
11753
11752
  if (hasGrouping && !this.options.ignoreGrouping) {
11754
11753
  const groupsRecords = [];
11755
- DataUtil.group(cloneArray(gridData), groupedGridGroupingState, grid, groupsRecords);
11754
+ DataUtil.group(cloneArray(gridData), groupedGridGroupingState, grid.groupStrategy, grid, groupsRecords);
11756
11755
  gridData = groupsRecords;
11757
11756
  }
11758
11757
  if (hasGrouping && !this.options.ignoreGrouping) {
@@ -34953,10 +34952,10 @@ class IgxComboAPIService {
34953
34952
  return;
34954
34953
  }
34955
34954
  if (!selected) {
34956
- this.combo.selectItems([itemID], false, event);
34955
+ this.combo.select([itemID], false, event);
34957
34956
  }
34958
34957
  else {
34959
- this.combo.deselectItems([itemID], event);
34958
+ this.combo.deselect([itemID], event);
34960
34959
  }
34961
34960
  }
34962
34961
  is_item_selected(itemID) {
@@ -35054,7 +35053,7 @@ class IgxComboItemComponent extends IgxDropDownItemComponent {
35054
35053
  IgxComboItemComponent.decorators = [
35055
35054
  { type: Component, args: [{
35056
35055
  selector: 'igx-combo-item',
35057
- template: "<ng-container *ngIf=\"!isHeader\">\n <igx-checkbox [checked]=\"selected\" [disableRipple]=\"true\" [disableTransitions]=\"disableTransitions\" [tabindex]=\"-1\" (click)=\"disableCheck($event)\" class=\"igx-combo__checkbox\"></igx-checkbox>\n</ng-container>\n<span class=\"igx-drop-down__inner\"><ng-content></ng-content></span>\n"
35056
+ template: "<ng-container *ngIf=\"!isHeader && !singleMode\">\n <igx-checkbox [checked]=\"selected\" [disableRipple]=\"true\" [disableTransitions]=\"disableTransitions\" [tabindex]=\"-1\" (click)=\"disableCheck($event)\" class=\"igx-combo__checkbox\"></igx-checkbox>\n</ng-container>\n<span class=\"igx-drop-down__inner\"><ng-content></ng-content></span>\n"
35058
35057
  },] }
35059
35058
  ];
35060
35059
  IgxComboItemComponent.ctorParameters = () => [
@@ -35064,311 +35063,25 @@ IgxComboItemComponent.ctorParameters = () => [
35064
35063
  { type: IgxSelectionAPIService, decorators: [{ type: Inject, args: [IgxSelectionAPIService,] }] }
35065
35064
  ];
35066
35065
  IgxComboItemComponent.propDecorators = {
35067
- itemHeight: [{ type: Input }, { type: HostBinding, args: ['style.height.px',] }]
35066
+ itemHeight: [{ type: Input }, { type: HostBinding, args: ['style.height.px',] }],
35067
+ singleMode: [{ type: Input }]
35068
35068
  };
35069
35069
 
35070
35070
  const IGX_COMBO_COMPONENT = new InjectionToken('IgxComboComponentToken');
35071
-
35071
+ let NEXT_ID$c = 0;
35072
35072
  /**
35073
35073
  * @hidden
35074
+ * The default number of items that should be in the combo's
35075
+ * drop-down list if no `[itemsMaxHeight]` is specified
35074
35076
  */
35075
- class IgxComboAddItemComponent extends IgxComboItemComponent {
35076
- get selected() {
35077
- return false;
35078
- }
35079
- set selected(value) {
35080
- }
35081
- /**
35082
- * @inheritdoc
35083
- */
35084
- clicked(event) {
35085
- this.comboAPI.disableTransitions = false;
35086
- this.comboAPI.add_custom_item();
35087
- }
35088
- }
35089
- IgxComboAddItemComponent.decorators = [
35090
- { type: Component, args: [{
35091
- selector: 'igx-combo-add-item',
35092
- template: '<ng-content></ng-content>',
35093
- providers: [{ provide: IgxComboItemComponent, useExisting: IgxComboAddItemComponent }]
35094
- },] }
35095
- ];
35096
-
35097
- /** @hidden */
35098
- class IgxComboDropDownComponent extends IgxDropDownComponent {
35099
- constructor(elementRef, cdr, platform, selection, combo, comboAPI, _displayDensityOptions) {
35100
- super(elementRef, cdr, platform, selection, _displayDensityOptions);
35101
- this.elementRef = elementRef;
35102
- this.cdr = cdr;
35103
- this.platform = platform;
35104
- this.selection = selection;
35105
- this.combo = combo;
35106
- this.comboAPI = comboAPI;
35107
- this._displayDensityOptions = _displayDensityOptions;
35108
- /**
35109
- * @hidden
35110
- * @internal
35111
- */
35112
- this.children = null;
35113
- this.scrollHandler = () => {
35114
- this.comboAPI.disableTransitions = true;
35115
- };
35116
- }
35117
- /** @hidden @internal */
35118
- get scrollContainer() {
35119
- return this.virtDir.dc.location.nativeElement;
35120
- }
35121
- get isScrolledToLast() {
35122
- const scrollTop = this.virtDir.scrollPosition;
35123
- const scrollHeight = this.virtDir.getScroll().scrollHeight;
35124
- return Math.floor(scrollTop + this.virtDir.igxForContainerSize) === scrollHeight;
35125
- }
35126
- get lastVisibleIndex() {
35127
- return this.combo.totalItemCount ?
35128
- Math.floor(this.combo.itemsMaxHeight / this.combo.itemHeight) :
35129
- this.items.length - 1;
35130
- }
35131
- get sortedChildren() {
35132
- if (this.children !== undefined) {
35133
- return this.children.toArray()
35134
- .sort((a, b) => a.index - b.index);
35135
- }
35136
- return null;
35137
- }
35138
- /**
35139
- * Get all non-header items
35140
- *
35141
- * ```typescript
35142
- * let myDropDownItems = this.dropdown.items;
35143
- * ```
35144
- */
35145
- get items() {
35146
- const items = [];
35147
- if (this.children !== undefined) {
35148
- const sortedChildren = this.sortedChildren;
35149
- for (const child of sortedChildren) {
35150
- if (!child.isHeader) {
35151
- items.push(child);
35152
- }
35153
- }
35154
- }
35155
- return items;
35156
- }
35157
- /**
35158
- * @hidden @internal
35159
- */
35160
- onFocus() {
35161
- this.focusedItem = this._focusedItem || this.items[0];
35162
- }
35163
- /**
35164
- * @hidden @internal
35165
- */
35166
- onBlur(_evt) {
35167
- this.focusedItem = null;
35168
- }
35169
- /**
35170
- * @hidden @internal
35171
- */
35172
- onToggleOpened() {
35173
- this.opened.emit();
35174
- }
35175
- /**
35176
- * @hidden
35177
- */
35178
- navigateFirst() {
35179
- this.navigateItem(this.virtDir.igxForOf.findIndex(e => !e.isHeader));
35180
- }
35181
- /**
35182
- * @hidden
35183
- */
35184
- navigatePrev() {
35185
- if (this._focusedItem && this._focusedItem.index === 0 && this.virtDir.state.startIndex === 0) {
35186
- this.combo.focusSearchInput(false);
35187
- }
35188
- else {
35189
- super.navigatePrev();
35190
- }
35191
- }
35192
- /**
35193
- * @hidden
35194
- */
35195
- navigateNext() {
35196
- const lastIndex = this.combo.totalItemCount ? this.combo.totalItemCount - 1 : this.virtDir.igxForOf.length - 1;
35197
- if (this._focusedItem && this._focusedItem.index === lastIndex) {
35198
- this.focusAddItemButton();
35199
- }
35200
- else {
35201
- super.navigateNext();
35202
- }
35203
- }
35204
- /**
35205
- * @hidden @internal
35206
- */
35207
- selectItem(item) {
35208
- if (item === null || item === undefined) {
35209
- return;
35210
- }
35211
- this.comboAPI.set_selected_item(item.itemID);
35212
- this._focusedItem = item;
35213
- }
35214
- /**
35215
- * @hidden @internal
35216
- */
35217
- updateScrollPosition() {
35218
- this.virtDir.getScroll().scrollTop = this._scrollPosition;
35219
- }
35220
- /**
35221
- * @hidden @internal
35222
- */
35223
- onItemActionKey(key) {
35224
- switch (key) {
35225
- case DropDownActionKey.ENTER:
35226
- this.handleEnter();
35227
- break;
35228
- case DropDownActionKey.SPACE:
35229
- this.handleSpace();
35230
- break;
35231
- case DropDownActionKey.ESCAPE:
35232
- this.close();
35233
- }
35234
- }
35235
- ngAfterViewInit() {
35236
- this.virtDir.getScroll().addEventListener('scroll', this.scrollHandler);
35237
- }
35238
- /**
35239
- * @hidden @internal
35240
- */
35241
- ngOnDestroy() {
35242
- this.virtDir.getScroll().removeEventListener('scroll', this.scrollHandler);
35243
- this.destroy$.next(true);
35244
- this.destroy$.complete();
35245
- }
35246
- scrollToHiddenItem(_newItem) { }
35247
- handleEnter() {
35248
- if (this.isAddItemFocused()) {
35249
- this.combo.addItemToCollection();
35250
- }
35251
- else {
35252
- this.close();
35253
- }
35254
- }
35255
- handleSpace() {
35256
- if (this.isAddItemFocused()) {
35257
- return;
35258
- }
35259
- else {
35260
- this.selectItem(this.focusedItem);
35261
- }
35262
- }
35263
- isAddItemFocused() {
35264
- return this.focusedItem instanceof IgxComboAddItemComponent;
35265
- }
35266
- focusAddItemButton() {
35267
- if (this.combo.isAddButtonVisible()) {
35268
- this.focusedItem = this.items[this.items.length - 1];
35269
- }
35270
- }
35271
- }
35272
- IgxComboDropDownComponent.decorators = [
35273
- { type: Component, args: [{
35274
- selector: 'igx-combo-drop-down',
35275
- template: "<div class=\"igx-drop-down__list\" [style.width]=\"width\"\nigxToggle\n(appended)=\"onToggleContentAppended($event)\"\n(opening)=\"onToggleOpening($event)\" (opened)=\"onToggleOpened()\"\n(closing)=\"onToggleClosing($event)\" (closed)=\"onToggleClosed()\">\n <div class=\"igx-drop-down__list-scroll\" #scrollContainer [attr.id]=\"this.listId\" role=\"listbox\" [attr.aria-label]=\"this.listId\"\n [style.height]=\"height\"\n [style.maxHeight]=\"maxHeight\">\n <ng-container *ngIf=\"!collapsed\">\n <ng-content></ng-content>\n </ng-container>\n </div>\n</div>\n",
35276
- providers: [{ provide: IGX_DROPDOWN_BASE, useExisting: IgxComboDropDownComponent }]
35277
- },] }
35278
- ];
35279
- IgxComboDropDownComponent.ctorParameters = () => [
35280
- { type: ElementRef },
35281
- { type: ChangeDetectorRef },
35282
- { type: PlatformUtil },
35283
- { type: IgxSelectionAPIService },
35284
- { type: undefined, decorators: [{ type: Inject, args: [IGX_COMBO_COMPONENT,] }] },
35285
- { type: IgxComboAPIService },
35286
- { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] }
35287
- ];
35288
- IgxComboDropDownComponent.propDecorators = {
35289
- children: [{ type: ContentChildren, args: [IgxComboItemComponent, { descendants: true },] }]
35077
+ const itemsInContainer = 10; // TODO: make private readonly
35078
+ /** @hidden @internal */
35079
+ const ItemHeights = {
35080
+ comfortable: 40,
35081
+ cosy: 32,
35082
+ compact: 28,
35290
35083
  };
35291
-
35292
- /**
35293
- * @hidden
35294
- */
35295
- class IgxComboFilteringPipe {
35296
- transform(collection, searchValue, displayKey, shouldFilter, filteringOptions) {
35297
- if (!collection) {
35298
- return [];
35299
- }
35300
- if (!searchValue || !shouldFilter) {
35301
- return collection;
35302
- }
35303
- else {
35304
- const searchTerm = filteringOptions.caseSensitive ? searchValue.trim() : searchValue.toLowerCase().trim();
35305
- if (displayKey != null) {
35306
- return collection.filter(e => filteringOptions.caseSensitive ? e[displayKey].includes(searchTerm) :
35307
- e[displayKey].toString().toLowerCase().includes(searchTerm));
35308
- }
35309
- else {
35310
- return collection.filter(e => filteringOptions.caseSensitive ? e.includes(searchTerm) :
35311
- e.toLowerCase().includes(searchTerm));
35312
- }
35313
- }
35314
- }
35315
- }
35316
- IgxComboFilteringPipe.decorators = [
35317
- { type: Pipe, args: [{
35318
- name: 'comboFiltering'
35319
- },] }
35320
- ];
35321
- /**
35322
- * @hidden
35323
- */
35324
- class IgxComboGroupingPipe {
35325
- constructor(combo) {
35326
- this.combo = combo;
35327
- }
35328
- transform(collection, groupKey, valueKey) {
35329
- this.combo.filteredData = collection;
35330
- if ((!groupKey && groupKey !== 0) || !collection.length) {
35331
- return collection;
35332
- }
35333
- const sorted = DataUtil.sort(cloneArray(collection), [{
35334
- fieldName: groupKey,
35335
- dir: SortingDirection.Asc,
35336
- ignoreCase: true,
35337
- strategy: DefaultSortingStrategy.instance()
35338
- }]);
35339
- const data = cloneArray(sorted);
35340
- let inserts = 0;
35341
- let currentHeader = null;
35342
- for (let i = 0; i < sorted.length; i++) {
35343
- let insertFlag = 0;
35344
- if (currentHeader !== sorted[i][groupKey]) {
35345
- currentHeader = sorted[i][groupKey];
35346
- insertFlag = 1;
35347
- }
35348
- if (insertFlag) {
35349
- data.splice(i + inserts, 0, {
35350
- [valueKey]: currentHeader,
35351
- [groupKey]: currentHeader,
35352
- isHeader: true
35353
- });
35354
- inserts++;
35355
- }
35356
- }
35357
- return data;
35358
- }
35359
- }
35360
- IgxComboGroupingPipe.decorators = [
35361
- { type: Pipe, args: [{
35362
- name: 'comboGrouping'
35363
- },] }
35364
- ];
35365
- IgxComboGroupingPipe.ctorParameters = () => [
35366
- { type: undefined, decorators: [{ type: Inject, args: [IGX_COMBO_COMPONENT,] }] }
35367
- ];
35368
-
35369
- /**
35370
- * @hidden
35371
- */
35084
+ /** @hidden @internal */
35372
35085
  var DataTypes;
35373
35086
  (function (DataTypes) {
35374
35087
  DataTypes["EMPTY"] = "empty";
@@ -35376,20 +35089,6 @@ var DataTypes;
35376
35089
  DataTypes["COMPLEX"] = "complex";
35377
35090
  DataTypes["PRIMARYKEY"] = "valueKey";
35378
35091
  })(DataTypes || (DataTypes = {}));
35379
- /**
35380
- * @hidden
35381
- */
35382
- const ItemHeights = {
35383
- comfortable: 40,
35384
- cosy: 32,
35385
- compact: 28,
35386
- };
35387
- /**
35388
- * @hidden
35389
- * The default number of items that should be in the combo's
35390
- * drop-down list if no `[itemsMaxHeight]` is specified
35391
- */
35392
- const itemsInContainer = 10;
35393
35092
  var IgxComboState;
35394
35093
  (function (IgxComboState) {
35395
35094
  /**
@@ -35405,47 +35104,12 @@ var IgxComboState;
35405
35104
  */
35406
35105
  IgxComboState[IgxComboState["INVALID"] = 2] = "INVALID";
35407
35106
  })(IgxComboState || (IgxComboState = {}));
35408
- /**
35409
- * When called with sets A & B, returns A - B (as array);
35410
- *
35411
- * @hidden
35412
- */
35413
- const diffInSets = (set1, set2) => {
35414
- const results = [];
35415
- set1.forEach(entry => {
35416
- if (!set2.has(entry)) {
35417
- results.push(entry);
35418
- }
35419
- });
35420
- return results;
35421
- };
35422
- const ɵ0$1 = diffInSets;
35423
- let NEXT_ID$c = 0;
35424
- /**
35425
- * Represents a drop-down list that provides editable functionalities, allowing users to choose an option from a predefined list.
35426
- *
35427
- * @igxModule IgxComboModule
35428
- * @igxTheme igx-combo-theme
35429
- * @igxKeywords combobox, combo selection
35430
- * @igxGroup Grids & Lists
35431
- *
35432
- * @remarks
35433
- * It provides the ability to filter items as well as perform single or multiple seleciton with the provided data.
35434
- * Additionally, it exposes keyboard navigation and custom styling capabilities.
35435
- * @example
35436
- * ```html
35437
- * <igx-combo [itemsMaxHeight]="250" [data]="locationData"
35438
- * [displayKey]="'field'" [valueKey]="'field'"
35439
- * placeholder="Location(s)" searchPlaceholder="Search...">
35440
- * </igx-combo>
35441
- * ```
35442
- */
35443
- class IgxComboComponent extends DisplayDensityBase {
35444
- constructor(elementRef, cdr, selection, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector) {
35107
+ class IgxComboBaseDirective extends DisplayDensityBase {
35108
+ constructor(elementRef, cdr, selectionService, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector) {
35445
35109
  super(_displayDensityOptions);
35446
35110
  this.elementRef = elementRef;
35447
35111
  this.cdr = cdr;
35448
- this.selection = selection;
35112
+ this.selectionService = selectionService;
35449
35113
  this.comboAPI = comboAPI;
35450
35114
  this._iconService = _iconService;
35451
35115
  this._displayDensityOptions = _displayDensityOptions;
@@ -35469,9 +35133,123 @@ class IgxComboComponent extends DisplayDensityBase {
35469
35133
  */
35470
35134
  this.overlaySettings = null;
35471
35135
  /**
35472
- * @hidden @internal
35136
+ * Gets/gets combo id.
35137
+ *
35138
+ * ```typescript
35139
+ * // get
35140
+ * let id = this.combo.id;
35141
+ * ```
35142
+ *
35143
+ * ```html
35144
+ * <!--set-->
35145
+ * <igx-combo [id]='combo1'></igx-combo>
35146
+ * ```
35473
35147
  */
35474
- this.searchInput = null;
35148
+ this.id = `igx-combo-${NEXT_ID$c++}`;
35149
+ /**
35150
+ * Controls whether custom values can be added to the collection
35151
+ *
35152
+ * ```typescript
35153
+ * // get
35154
+ * let comboAllowsCustomValues = this.combo.allowCustomValues;
35155
+ * ```
35156
+ *
35157
+ * ```html
35158
+ * <!--set-->
35159
+ * <igx-combo [allowCustomValues]='true'></igx-combo>
35160
+ * ```
35161
+ */
35162
+ this.allowCustomValues = false;
35163
+ /**
35164
+ * Determines which column in the data source is used to determine the value.
35165
+ *
35166
+ * ```typescript
35167
+ * // get
35168
+ * let myComboValueKey = this.combo.valueKey;
35169
+ * ```
35170
+ *
35171
+ * ```html
35172
+ * <!--set-->
35173
+ * <igx-combo [valueKey]='myKey'></igx-combo>
35174
+ * ```
35175
+ */
35176
+ this.valueKey = null;
35177
+ /** @hidden @internal */
35178
+ this.cssClass = 'igx-combo'; // Independent of display density for the time being
35179
+ /** @hidden @internal */
35180
+ this.role = 'combobox';
35181
+ /**
35182
+ * An @Input property that enabled/disables combo. The default is `false`.
35183
+ * ```html
35184
+ * <igx-combo [disabled]="'true'">
35185
+ * ```
35186
+ */
35187
+ this.disabled = false;
35188
+ /**
35189
+ * Emitted when item selection is changing, before the selection completes
35190
+ *
35191
+ * ```html
35192
+ * <igx-combo (selectionChanging)='handleSelection()'></igx-combo>
35193
+ * ```
35194
+ */
35195
+ // TODO: any for old/new selection?
35196
+ this.selectionChanging = new EventEmitter();
35197
+ /**
35198
+ * Emitted before the dropdown is opened
35199
+ *
35200
+ * ```html
35201
+ * <igx-combo opening='handleOpening($event)'></igx-combo>
35202
+ * ```
35203
+ */
35204
+ this.opening = new EventEmitter();
35205
+ /**
35206
+ * Emitted after the dropdown is opened
35207
+ *
35208
+ * ```html
35209
+ * <igx-combo (opened)='handleOpened($event)'></igx-combo>
35210
+ * ```
35211
+ */
35212
+ this.opened = new EventEmitter();
35213
+ /**
35214
+ * Emitted before the dropdown is closed
35215
+ *
35216
+ * ```html
35217
+ * <igx-combo (closing)='handleClosing($event)'></igx-combo>
35218
+ * ```
35219
+ */
35220
+ this.closing = new EventEmitter();
35221
+ /**
35222
+ * Emitted after the dropdown is closed
35223
+ *
35224
+ * ```html
35225
+ * <igx-combo (closed)='handleClosed($event)'></igx-combo>
35226
+ * ```
35227
+ */
35228
+ this.closed = new EventEmitter();
35229
+ /**
35230
+ * Emitted when an item is being added to the data collection
35231
+ *
35232
+ * ```html
35233
+ * <igx-combo (addition)='handleAdditionEvent($event)'></igx-combo>
35234
+ * ```
35235
+ */
35236
+ this.addition = new EventEmitter();
35237
+ /**
35238
+ * Emitted when the value of the search input changes (e.g. typing, pasting, clear, etc.)
35239
+ *
35240
+ * ```html
35241
+ * <igx-combo (searchInputUpdate)='handleSearchInputEvent($event)'></igx-combo>
35242
+ * ```
35243
+ */
35244
+ this.searchInputUpdate = new EventEmitter();
35245
+ /**
35246
+ * Emitted when new chunk of data is loaded from the virtualization
35247
+ *
35248
+ * ```html
35249
+ * <igx-combo (dataPreLoad)='handleDataPreloadEvent($event)'></igx-combo>
35250
+ * ```
35251
+ */
35252
+ this.dataPreLoad = new EventEmitter();
35475
35253
  /**
35476
35254
  * The custom template, if any, that should be used when rendering ITEMS in the combo list
35477
35255
  *
@@ -35635,207 +35413,34 @@ class IgxComboComponent extends DisplayDensityBase {
35635
35413
  * ```
35636
35414
  */
35637
35415
  this.clearIconTemplate = null;
35638
- /**
35639
- * Emitted when item selection is changing, before the selection completes
35640
- *
35641
- * ```html
35642
- * <igx-combo (selectionChanging)='handleSelection()'></igx-combo>
35643
- * ```
35644
- */
35645
- this.selectionChanging = new EventEmitter();
35646
- /**
35647
- * Emitted before the dropdown is opened
35648
- *
35649
- * ```html
35650
- * <igx-combo opening='handleOpening($event)'></igx-combo>
35651
- * ```
35652
- */
35653
- this.opening = new EventEmitter();
35654
- /**
35655
- * Emitted after the dropdown is opened
35656
- *
35657
- * ```html
35658
- * <igx-combo (opened)='handleOpened($event)'></igx-combo>
35659
- * ```
35660
- */
35661
- this.opened = new EventEmitter();
35662
- /**
35663
- * Emitted before the dropdown is closed
35664
- *
35665
- * ```html
35666
- * <igx-combo (closing)='handleClosing($event)'></igx-combo>
35667
- * ```
35668
- */
35669
- this.closing = new EventEmitter();
35670
- /**
35671
- * Emitted after the dropdown is closed
35672
- *
35673
- * ```html
35674
- * <igx-combo (closed)='handleClosed($event)'></igx-combo>
35675
- * ```
35676
- */
35677
- this.closed = new EventEmitter();
35678
- /**
35679
- * Emitted when an item is being added to the data collection
35680
- *
35681
- * ```html
35682
- * <igx-combo (addition)='handleAdditionEvent($event)'></igx-combo>
35683
- * ```
35684
- */
35685
- this.addition = new EventEmitter();
35686
- /**
35687
- * Emitted when the value of the search input changes (e.g. typing, pasting, clear, etc.)
35688
- *
35689
- * ```html
35690
- * <igx-combo (searchInputUpdate)='handleSearchInputEvent($event)'></igx-combo>
35691
- * ```
35692
- */
35693
- this.searchInputUpdate = new EventEmitter();
35694
- /**
35695
- * Emitted when new chunk of data is loaded from the virtualization
35696
- *
35697
- * ```html
35698
- * <igx-combo (dataPreLoad)='handleDataPreloadEvent($event)'></igx-combo>
35699
- * ```
35700
- */
35701
- this.dataPreLoad = new EventEmitter();
35702
- /**
35703
- * Gets/gets combo id.
35704
- *
35705
- * ```typescript
35706
- * // get
35707
- * let id = this.combo.id;
35708
- * ```
35709
- *
35710
- * ```html
35711
- * <!--set-->
35712
- * <igx-combo [id]='combo1'></igx-combo>
35713
- * ```
35714
- */
35715
- this.id = `igx-combo-${NEXT_ID$c++}`;
35716
- /**
35717
- * @hidden @internal
35718
- */
35719
- this.cssClass = 'igx-combo'; // Independent of display density, at the time being
35720
- /**
35721
- * @hidden @internal
35722
- */
35723
- this.role = 'combobox';
35724
- /**
35725
- * Controls whether custom values can be added to the collection
35726
- *
35727
- * ```typescript
35728
- * // get
35729
- * let comboAllowsCustomValues = this.combo.allowCustomValues;
35730
- * ```
35731
- *
35732
- * ```html
35733
- * <!--set-->
35734
- * <igx-combo [allowCustomValues]='true'></igx-combo>
35735
- * ```
35736
- */
35737
- this.allowCustomValues = false;
35738
- /**
35739
- * Defines the placeholder value for the combo dropdown search field
35740
- *
35741
- * ```typescript
35742
- * // get
35743
- * let myComboSearchPlaceholder = this.combo.searchPlaceholder;
35744
- * ```
35745
- *
35746
- * ```html
35747
- * <!--set-->
35748
- * <igx-combo [searchPlaceholder]='newPlaceHolder'></igx-combo>
35749
- * ```
35750
- */
35751
- this.searchPlaceholder = 'Enter a Search Term';
35752
- /**
35753
- * Defines whether the caseSensitive icon should be shown in the search input
35754
- *
35755
- * ```typescript
35756
- * // get
35757
- * let myComboShowSearchCaseIcon = this.combo.showSearchCaseIcon;
35758
- * ```
35759
- *
35760
- * ```html
35761
- * <!--set-->
35762
- * <igx-combo [showSearchCaseIcon]='true'></igx-combo>
35763
- * ```
35764
- */
35765
- this.showSearchCaseIcon = false;
35766
- /**
35767
- * Combo value data source property.
35768
- *
35769
- * ```typescript
35770
- * // get
35771
- * let myComboValueKey = this.combo.valueKey;
35772
- * ```
35773
- *
35774
- * ```html
35775
- * <!--set-->
35776
- * <igx-combo [valueKey]='myKey'></igx-combo>
35777
- * ```
35778
- */
35779
- this.valueKey = null;
35780
- /**
35781
- * An @Input property that enabled/disables filtering in the list. The default is `true`.
35782
- * ```html
35783
- * <igx-combo [filterable]="false">
35784
- * ```
35785
- */
35786
- this.filterable = true;
35787
- /**
35788
- * An @Input property that enabled/disables combo. The default is `false`.
35789
- * ```html
35790
- * <igx-combo [disabled]="'true'">
35791
- * ```
35792
- */
35793
- this.disabled = false;
35794
- /**
35795
- * An @Input property that controls whether the combo's search box
35796
- * should be focused after the `opened` event is called
35797
- * When `false`, the combo's list item container will be focused instead
35798
- */
35799
- this.autoFocusSearch = true;
35416
+ /** @hidden @internal */
35417
+ this.searchInput = null;
35800
35418
  this.dropdownContainer = null;
35801
- /**
35802
- * @hidden @internal
35803
- */
35419
+ /** @hidden @internal */
35804
35420
  this.customValueFlag = true;
35805
- /**
35806
- * @hidden @internal
35807
- */
35421
+ /** @hidden @internal */
35422
+ this.filterValue = '';
35423
+ /** @hidden @internal */
35808
35424
  this.defaultFallbackGroup = 'Other';
35809
- /**
35810
- * @hidden @internal
35811
- */
35425
+ /** @hidden @internal */
35812
35426
  this.filteringOptions = {
35813
35427
  caseSensitive: false
35814
35428
  };
35815
- /**
35816
- * @hidden @internal
35817
- */
35818
- this.filteringLogic = FilteringLogic.Or;
35819
- /** @hidden @internal */
35820
- this.filterValue = '';
35821
- this.stringFilters = IgxStringFilteringOperand;
35822
- this.booleanFilters = IgxBooleanFilteringOperand;
35429
+ this._data = [];
35430
+ this._value = '';
35823
35431
  this._groupKey = '';
35824
- this._prevInputValue = '';
35825
- this._dataType = '';
35826
- this._searchValue = '';
35827
- this._type = null;
35432
+ this._filteredData = [];
35433
+ this._remoteSelection = {};
35434
+ this._valid = IgxComboState.INITIAL;
35828
35435
  this.ngControl = null;
35829
35436
  this.destroy$ = new Subject();
35830
- this._data = [];
35831
- this._filteredData = [];
35437
+ this._onTouchedCallback = noop;
35438
+ this._onChangeCallback = noop;
35439
+ this._type = null;
35440
+ this._dataType = '';
35441
+ this._searchValue = '';
35832
35442
  this._itemHeight = null;
35833
35443
  this._itemsMaxHeight = null;
35834
- this._remoteSelection = {};
35835
- this._onChangeCallback = noop;
35836
- this._onTouchedCallback = noop;
35837
- this._value = '';
35838
- this._valid = IgxComboState.INITIAL;
35839
35444
  this.onStatusChanged = () => {
35840
35445
  if ((this.ngControl.control.touched || this.ngControl.control.dirty) &&
35841
35446
  (this.ngControl.control.validator || this.ngControl.control.asyncValidator)) {
@@ -35852,31 +35457,10 @@ class IgxComboComponent extends DisplayDensityBase {
35852
35457
  }
35853
35458
  this.manageRequiredAsterisk();
35854
35459
  };
35855
- this.comboAPI.register(this);
35856
- }
35857
- /**
35858
- * @hidden @internal
35859
- */
35860
- get displaySearchInput() {
35861
- return this.filterable || this.allowCustomValues;
35862
- }
35863
- /**
35864
- * @hidden @internal
35865
- */
35866
- get ariaExpanded() {
35867
- return !this.dropdown.collapsed;
35868
- }
35869
- /**
35870
- * @hidden @internal
35871
- */
35872
- get hasPopUp() {
35873
- return 'listbox';
35874
- }
35875
- /**
35876
- * @hidden @internal
35877
- */
35878
- get ariaOwns() {
35879
- return this.dropdown.id;
35460
+ this.findMatch = (element) => {
35461
+ const value = this.displayKey ? element[this.displayKey] : element;
35462
+ return value.toString().toLowerCase() === this.searchValue.trim().toLowerCase();
35463
+ };
35880
35464
  }
35881
35465
  /**
35882
35466
  * Configures the drop down list height
@@ -35922,12 +35506,6 @@ class IgxComboComponent extends DisplayDensityBase {
35922
35506
  set itemHeight(val) {
35923
35507
  this._itemHeight = val;
35924
35508
  }
35925
- /**
35926
- * @hidden @internal
35927
- */
35928
- get inputEmpty() {
35929
- return !this.value && !this.placeholder;
35930
- }
35931
35509
  /**
35932
35510
  * Combo data source.
35933
35511
  *
@@ -35946,7 +35524,7 @@ class IgxComboComponent extends DisplayDensityBase {
35946
35524
  this._displayKey = val;
35947
35525
  }
35948
35526
  /**
35949
- * Combo text data source property.
35527
+ * Determines which column in the data source is used to determine the display value.
35950
35528
  *
35951
35529
  * ```typescript
35952
35530
  * // get
@@ -35987,6 +35565,18 @@ class IgxComboComponent extends DisplayDensityBase {
35987
35565
  get groupKey() {
35988
35566
  return this._groupKey;
35989
35567
  }
35568
+ /** @hidden @internal */
35569
+ get ariaExpanded() {
35570
+ return !this.dropdown.collapsed;
35571
+ }
35572
+ /** @hidden @internal */
35573
+ get hasPopUp() {
35574
+ return 'listbox';
35575
+ }
35576
+ /** @hidden @internal */
35577
+ get ariaOwns() {
35578
+ return this.dropdown.id;
35579
+ }
35990
35580
  /**
35991
35581
  * An @Input property that sets how the combo will be styled.
35992
35582
  * The allowed values are `line`, `box`, `border` and `search`. The default is `box`.
@@ -36000,6 +35590,27 @@ class IgxComboComponent extends DisplayDensityBase {
36000
35590
  set type(val) {
36001
35591
  this._type = val;
36002
35592
  }
35593
+ /** @hidden @internal */
35594
+ get searchValue() {
35595
+ return this._searchValue;
35596
+ }
35597
+ set searchValue(val) {
35598
+ this.filterValue = val;
35599
+ this._searchValue = val;
35600
+ }
35601
+ /** @hidden @internal */
35602
+ get isRemote() {
35603
+ return this.totalItemCount > 0 &&
35604
+ this.valueKey &&
35605
+ this.dataType === DataTypes.COMPLEX;
35606
+ }
35607
+ /** @hidden @internal */
35608
+ get dataType() {
35609
+ if (this.displayKey) {
35610
+ return DataTypes.COMPLEX;
35611
+ }
35612
+ return DataTypes.PRIMITIVE;
35613
+ }
36003
35614
  /**
36004
35615
  * Gets if control is valid, when used in a form
36005
35616
  *
@@ -36024,32 +35635,15 @@ class IgxComboComponent extends DisplayDensityBase {
36024
35635
  this.comboInput.valid = IgxInputState[IgxComboState[valid]];
36025
35636
  }
36026
35637
  /**
36027
- * @hidden @internal
36028
- */
36029
- get searchValue() {
36030
- return this._searchValue;
36031
- }
36032
- set searchValue(val) {
36033
- this.filterValue = val;
36034
- this._searchValue = val;
36035
- }
36036
- /**
36037
- * @hidden @internal
36038
- */
36039
- onArrowDown(event) {
36040
- event.preventDefault();
36041
- event.stopPropagation();
36042
- this.open();
36043
- }
36044
- /**
36045
- * @hidden @internal
35638
+ * The text displayed in the combo input
35639
+ *
35640
+ * ```typescript
35641
+ * // get
35642
+ * let comboValue = this.combo.value;
35643
+ * ```
36046
35644
  */
36047
- onInputClick(event) {
36048
- event.stopPropagation();
36049
- event.preventDefault();
36050
- if (!this.disabled) {
36051
- this.toggle();
36052
- }
35645
+ get value() {
35646
+ return this._value;
36053
35647
  }
36054
35648
  /**
36055
35649
  * Defines the current state of the virtualized data. It contains `startIndex` and `chunkSize`
@@ -36073,6 +35667,16 @@ class IgxComboComponent extends DisplayDensityBase {
36073
35667
  set virtualizationState(state) {
36074
35668
  this.virtDir.state = state;
36075
35669
  }
35670
+ /**
35671
+ * Gets drop down state.
35672
+ *
35673
+ * ```typescript
35674
+ * let state = this.combo.collapsed;
35675
+ * ```
35676
+ */
35677
+ get collapsed() {
35678
+ return this.dropdown.collapsed;
35679
+ }
36076
35680
  /**
36077
35681
  * Gets total count of the virtual data items, when using remote service.
36078
35682
  *
@@ -36095,94 +35699,92 @@ class IgxComboComponent extends DisplayDensityBase {
36095
35699
  set totalItemCount(count) {
36096
35700
  this.virtDir.totalItemCount = count;
36097
35701
  }
36098
- /**
36099
- * The text displayed in the combo input
36100
- *
36101
- * ```typescript
36102
- * // get
36103
- * let comboValue = this.combo.value;
36104
- * ```
36105
- */
36106
- get value() {
36107
- return this._value;
36108
- }
36109
- /**
36110
- * @hidden @internal
36111
- */
36112
- get filteredData() {
36113
- return this.filterable ? this._filteredData : this.data;
36114
- }
36115
- /**
36116
- * @hidden @internal
36117
- */
36118
- set filteredData(val) {
36119
- this._filteredData = this.groupKey ? (val || []).filter((e) => e.isHeader !== true) : val;
36120
- this.checkMatch();
36121
- }
36122
- /**
36123
- * @hidden @internal
36124
- */
36125
- handleKeyUp(event) {
36126
- if (event.key === 'ArrowDown' || event.key === 'Down') {
36127
- this.dropdown.focusedItem = this.dropdown.items[0];
36128
- this.dropdownContainer.nativeElement.focus();
35702
+ /** @hidden @internal */
35703
+ get template() {
35704
+ this._dataType = this.dataType;
35705
+ if (this.itemTemplate) {
35706
+ return this.itemTemplate;
36129
35707
  }
36130
- else if (event.key === 'Escape' || event.key === 'Esc') {
36131
- this.toggle();
35708
+ if (this._dataType === DataTypes.COMPLEX) {
35709
+ return this.complexTemplate;
36132
35710
  }
35711
+ return this.primitiveTemplate;
36133
35712
  }
36134
- /**
36135
- * @hidden @internal
36136
- */
36137
- handleKeyDown(event) {
36138
- if (event.key === 'ArrowUp' || event.key === 'Up') {
36139
- event.preventDefault();
36140
- event.stopPropagation();
36141
- this.close();
36142
- }
35713
+ /** @hidden @internal */
35714
+ onArrowDown(event) {
35715
+ event.preventDefault();
35716
+ event.stopPropagation();
35717
+ this.open();
36143
35718
  }
36144
- /**
36145
- * @hidden @internal
36146
- */
36147
- handleInputChange(event) {
36148
- if (event !== undefined) {
36149
- const args = {
36150
- searchText: event,
36151
- owner: this,
36152
- cancel: false
36153
- };
36154
- this.searchInputUpdate.emit(args);
36155
- if (args.cancel) {
36156
- this.filterValue = null;
36157
- }
35719
+ /** @hidden @internal */
35720
+ ngOnInit() {
35721
+ this.ngControl = this._injector.get(NgControl, null);
35722
+ const targetElement = this.elementRef.nativeElement;
35723
+ this._overlaySettings = {
35724
+ target: targetElement,
35725
+ scrollStrategy: new AbsoluteScrollStrategy(),
35726
+ positionStrategy: new AutoPositionStrategy(),
35727
+ modal: false,
35728
+ closeOnOutsideClick: true,
35729
+ excludeFromOutsideClick: [targetElement]
35730
+ };
35731
+ this.selectionService.set(this.id, new Set());
35732
+ this._iconService.addSvgIconFromText(caseSensitive.name, caseSensitive.value, 'imx-icons');
35733
+ }
35734
+ /** @hidden @internal */
35735
+ ngAfterViewInit() {
35736
+ this.filteredData = [...this.data];
35737
+ if (this.ngControl) {
35738
+ this.ngControl.statusChanges.pipe(takeUntil(this.destroy$)).subscribe(this.onStatusChanged);
35739
+ this.manageRequiredAsterisk();
35740
+ this.cdr.detectChanges();
36158
35741
  }
36159
- this.checkMatch();
35742
+ this.virtDir.chunkPreload.pipe(takeUntil(this.destroy$)).subscribe((e) => {
35743
+ const eventArgs = Object.assign({}, e, { owner: this });
35744
+ this.dataPreLoad.emit(eventArgs);
35745
+ });
35746
+ }
35747
+ /** @hidden @internal */
35748
+ ngOnDestroy() {
35749
+ this.destroy$.next();
35750
+ this.destroy$.complete();
35751
+ this.comboAPI.clear();
35752
+ this.selectionService.clear(this.id);
36160
35753
  }
36161
35754
  /**
36162
- * @hidden @internal
35755
+ * A method that opens/closes the combo.
35756
+ *
35757
+ * ```html
35758
+ * <button (click)="combo.toggle()">Toggle Combo</button>
35759
+ * <igx-combo #combo></igx-combo>
35760
+ * ```
36163
35761
  */
36164
- get dataType() {
36165
- if (this.displayKey) {
36166
- return DataTypes.COMPLEX;
36167
- }
36168
- return DataTypes.PRIMITIVE;
35762
+ toggle() {
35763
+ const overlaySettings = Object.assign({}, this._overlaySettings, this.overlaySettings);
35764
+ this.dropdown.toggle(overlaySettings);
36169
35765
  }
36170
35766
  /**
36171
- * @hidden @internal
35767
+ * A method that opens the combo.
35768
+ *
35769
+ * ```html
35770
+ * <button (click)="combo.open()">Open Combo</button>
35771
+ * <igx-combo #combo></igx-combo>
35772
+ * ```
36172
35773
  */
36173
- get isRemote() {
36174
- return this.totalItemCount > 0 &&
36175
- this.valueKey &&
36176
- this.dataType === DataTypes.COMPLEX;
35774
+ open() {
35775
+ const overlaySettings = Object.assign({}, this._overlaySettings, this.overlaySettings);
35776
+ this.dropdown.open(overlaySettings);
36177
35777
  }
36178
35778
  /**
36179
- * Returns if the specified itemID is selected
35779
+ * A method that closes the combo.
36180
35780
  *
36181
- * @hidden
36182
- * @internal
35781
+ * ```html
35782
+ * <button (click)="combo.close()">Close Combo</button>
35783
+ * <igx-combo #combo></igx-combo>
35784
+ * ```
36183
35785
  */
36184
- isItemSelected(item) {
36185
- return this.selection.is_item_selected(this.id, item);
35786
+ close() {
35787
+ this.dropdown.close();
36186
35788
  }
36187
35789
  /**
36188
35790
  * Triggers change detection on the combo view
@@ -36191,27 +35793,29 @@ class IgxComboComponent extends DisplayDensityBase {
36191
35793
  this.cdr.detectChanges();
36192
35794
  }
36193
35795
  /**
36194
- * @hidden @internal
35796
+ * Get current selection state
35797
+ *
35798
+ * @returns Array of selected items
35799
+ * ```typescript
35800
+ * let selectedItems = this.combo.selectedItems();
35801
+ * ```
36195
35802
  */
36196
- isAddButtonVisible() {
36197
- // This should always return a boolean value. If this.searchValue was '', it returns '' instead of false;
36198
- return this.searchValue !== '' && this.customValueFlag;
35803
+ get selection() {
35804
+ const items = Array.from(this.selectionService.get(this.id));
35805
+ return items;
36199
35806
  }
36200
35807
  /**
36201
- * @hidden @internal
35808
+ * Returns if the specified itemID is selected
35809
+ *
35810
+ * @hidden
35811
+ * @internal
36202
35812
  */
36203
- handleSelectAll(evt) {
36204
- if (evt.checked) {
36205
- this.selectAllItems();
36206
- }
36207
- else {
36208
- this.deselectAllItems();
36209
- }
35813
+ isItemSelected(item) {
35814
+ return this.selectionService.is_item_selected(this.id, item);
36210
35815
  }
36211
- /**
36212
- * @hidden @internal
36213
- */
35816
+ /** @hidden @internal */
36214
35817
  addItemToCollection() {
35818
+ var _a;
36215
35819
  if (!this.searchValue) {
36216
35820
  return;
36217
35821
  }
@@ -36236,212 +35840,697 @@ class IgxComboComponent extends DisplayDensityBase {
36236
35840
  this.data.push(args.addedItem);
36237
35841
  // trigger re-render
36238
35842
  this.data = cloneArray(this.data);
36239
- this.selectItems(this.valueKey !== null && this.valueKey !== undefined ?
35843
+ this.select(this.valueKey !== null && this.valueKey !== undefined ?
36240
35844
  [args.addedItem[this.valueKey]] : [args.addedItem], false);
36241
35845
  this.customValueFlag = false;
36242
- this.searchInput.nativeElement.focus();
35846
+ (_a = this.searchInput) === null || _a === void 0 ? void 0 : _a.nativeElement.focus();
36243
35847
  this.dropdown.focusedItem = null;
36244
35848
  this.virtDir.scrollTo(0);
36245
35849
  }
36246
- /**
36247
- * @hidden @internal
36248
- */
36249
- focusSearchInput(opening) {
36250
- if (this.displaySearchInput && this.searchInput) {
36251
- this.searchInput.nativeElement.focus();
36252
- }
36253
- else {
36254
- if (opening) {
36255
- this.dropdownContainer.nativeElement.focus();
36256
- }
36257
- else {
36258
- this.comboInput.nativeElement.focus();
36259
- this.toggle();
36260
- }
36261
- }
35850
+ /** @hidden @internal */
35851
+ isAddButtonVisible() {
35852
+ // This should always return a boolean value. If this.searchValue was '', it returns '' instead of false;
35853
+ return this.searchValue !== '' && this.customValueFlag;
36262
35854
  }
36263
- /**
36264
- * @hidden @internal
36265
- */
36266
- onBlur() {
36267
- if (this.collapsed) {
36268
- this._onTouchedCallback();
36269
- if (this.ngControl && this.ngControl.invalid) {
36270
- this.valid = IgxComboState.INVALID;
36271
- }
36272
- else {
36273
- this.valid = IgxComboState.INITIAL;
35855
+ /** @hidden @internal */
35856
+ handleInputChange(event) {
35857
+ if (event !== undefined) {
35858
+ const args = {
35859
+ searchText: typeof event === 'string' ? event : event.target.value,
35860
+ owner: this,
35861
+ cancel: false
35862
+ };
35863
+ this.searchInputUpdate.emit(args);
35864
+ if (args.cancel) {
35865
+ this.filterValue = null;
36274
35866
  }
36275
35867
  }
35868
+ this.checkMatch();
36276
35869
  }
36277
35870
  /**
36278
- * @hidden @internal
35871
+ * Event handlers
35872
+ *
35873
+ * @hidden
35874
+ * @internal
36279
35875
  */
36280
- ngOnInit() {
36281
- this.ngControl = this._injector.get(NgControl, null);
36282
- const targetElement = this.elementRef.nativeElement;
36283
- this._overlaySettings = {
36284
- target: targetElement,
36285
- scrollStrategy: new AbsoluteScrollStrategy(),
36286
- positionStrategy: new AutoPositionStrategy(),
36287
- modal: false,
36288
- closeOnOutsideClick: true,
36289
- excludeFromOutsideClick: [targetElement]
36290
- };
36291
- this.selection.set(this.id, new Set());
36292
- this._iconService.addSvgIconFromText(caseSensitive.name, caseSensitive.value, 'imx-icons');
35876
+ handleOpening(e) {
35877
+ const args = { owner: this, event: e.event, cancel: e.cancel };
35878
+ this.opening.emit(args);
35879
+ e.cancel = args.cancel;
36293
35880
  }
36294
- /**
36295
- * @hidden @internal
36296
- */
36297
- ngAfterViewInit() {
36298
- this.filteredData = [...this.data];
36299
- if (this.ngControl) {
36300
- this.ngControl.statusChanges.pipe(takeUntil(this.destroy$)).subscribe(this.onStatusChanged);
36301
- this.manageRequiredAsterisk();
36302
- this.cdr.detectChanges();
36303
- }
36304
- this.virtDir.chunkPreload.pipe(takeUntil(this.destroy$)).subscribe((e) => {
36305
- const eventArgs = Object.assign({}, e, { owner: this });
36306
- this.dataPreLoad.emit(eventArgs);
36307
- });
35881
+ /** @hidden @internal */
35882
+ handleClosing(e) {
35883
+ var _a;
35884
+ const args = { owner: this, event: e.event, cancel: e.cancel };
35885
+ this.closing.emit(args);
35886
+ e.cancel = args.cancel;
35887
+ if (e.cancel) {
35888
+ return;
35889
+ }
35890
+ this.searchValue = '';
35891
+ if (!e.event) {
35892
+ (_a = this.comboInput) === null || _a === void 0 ? void 0 : _a.nativeElement.focus();
35893
+ }
35894
+ }
35895
+ /** @hidden @internal */
35896
+ handleClosed() {
35897
+ this.closed.emit({ owner: this });
35898
+ }
35899
+ /** @hidden @internal */
35900
+ handleKeyDown(event) {
35901
+ if (event.key === 'ArrowUp' || event.key === 'Up') {
35902
+ event.preventDefault();
35903
+ event.stopPropagation();
35904
+ this.close();
35905
+ }
35906
+ }
35907
+ /** @hidden @internal */
35908
+ registerOnChange(fn) {
35909
+ this._onChangeCallback = fn;
35910
+ }
35911
+ /** @hidden @internal */
35912
+ registerOnTouched(fn) {
35913
+ this._onTouchedCallback = fn;
35914
+ }
35915
+ /** @hidden @internal */
35916
+ setDisabledState(isDisabled) {
35917
+ this.disabled = isDisabled;
35918
+ }
35919
+ /** @hidden @internal */
35920
+ onClick(event) {
35921
+ event.stopPropagation();
35922
+ event.preventDefault();
35923
+ if (!this.disabled) {
35924
+ this.toggle();
35925
+ }
35926
+ }
35927
+ /** @hidden @internal */
35928
+ onBlur() {
35929
+ if (this.collapsed) {
35930
+ this._onTouchedCallback();
35931
+ if (this.ngControl && this.ngControl.invalid) {
35932
+ this.valid = IgxComboState.INVALID;
35933
+ }
35934
+ else {
35935
+ this.valid = IgxComboState.INITIAL;
35936
+ }
35937
+ }
35938
+ }
35939
+ /** if there is a valueKey - map the keys to data items, else - just return the keys */
35940
+ convertKeysToItems(keys) {
35941
+ if (this.comboAPI.valueKey === null) {
35942
+ return keys;
35943
+ }
35944
+ // map keys vs. filter data to retain the order of the selected items
35945
+ return keys.map(key => this.data.find(entry => entry[this.valueKey] === key)).filter(e => e !== undefined);
35946
+ }
35947
+ checkMatch() {
35948
+ const itemMatch = this.filteredData.some(this.findMatch);
35949
+ this.customValueFlag = this.allowCustomValues && !itemMatch;
35950
+ }
35951
+ manageRequiredAsterisk() {
35952
+ if (this.ngControl && this.ngControl.control.validator) {
35953
+ // Run the validation with empty object to check if required is enabled.
35954
+ const error = this.ngControl.control.validator({});
35955
+ this.inputGroup.isRequired = error && error.required;
35956
+ }
35957
+ }
35958
+ /** Contains key-value pairs of the selected valueKeys and their resp. displayKeys */
35959
+ registerRemoteEntries(ids, add = true) {
35960
+ if (add) {
35961
+ const selection = this.getValueDisplayPairs(ids);
35962
+ for (const entry of selection) {
35963
+ this._remoteSelection[entry[this.valueKey]] = entry[this.displayKey];
35964
+ }
35965
+ }
35966
+ else {
35967
+ for (const entry of ids) {
35968
+ delete this._remoteSelection[entry];
35969
+ }
35970
+ }
36308
35971
  }
36309
35972
  /**
36310
- * @hidden @internal
35973
+ * For `id: any[]` returns a mapped `{ [combo.valueKey]: any, [combo.displayKey]: any }[]`
36311
35974
  */
36312
- ngOnDestroy() {
36313
- this.destroy$.next();
36314
- this.destroy$.complete();
36315
- this.comboAPI.clear();
36316
- this.selection.clear(this.id);
35975
+ getValueDisplayPairs(ids) {
35976
+ return this.data.filter(entry => ids.indexOf(entry[this.valueKey]) > -1).map(e => ({
35977
+ [this.valueKey]: e[this.valueKey],
35978
+ [this.displayKey]: e[this.displayKey]
35979
+ }));
35980
+ }
35981
+ getRemoteSelection(newSelection, oldSelection) {
35982
+ if (!newSelection.length) {
35983
+ // If new selection is empty, clear all items
35984
+ this.registerRemoteEntries(oldSelection, false);
35985
+ return '';
35986
+ }
35987
+ const removedItems = oldSelection.filter(e => newSelection.indexOf(e) < 0);
35988
+ const addedItems = newSelection.filter(e => oldSelection.indexOf(e) < 0);
35989
+ this.registerRemoteEntries(addedItems);
35990
+ this.registerRemoteEntries(removedItems, false);
35991
+ return Object.keys(this._remoteSelection).map(e => this._remoteSelection[e]).join(', ');
35992
+ }
35993
+ }
35994
+ IgxComboBaseDirective.decorators = [
35995
+ { type: Directive }
35996
+ ];
35997
+ IgxComboBaseDirective.ctorParameters = () => [
35998
+ { type: ElementRef },
35999
+ { type: ChangeDetectorRef },
36000
+ { type: IgxSelectionAPIService },
36001
+ { type: IgxComboAPIService },
36002
+ { type: IgxIconService },
36003
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] },
36004
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [IGX_INPUT_GROUP_TYPE,] }] },
36005
+ { type: Injector, decorators: [{ type: Optional }] }
36006
+ ];
36007
+ IgxComboBaseDirective.propDecorators = {
36008
+ overlaySettings: [{ type: Input }],
36009
+ id: [{ type: HostBinding, args: ['attr.id',] }, { type: Input }],
36010
+ width: [{ type: HostBinding, args: ['style.width',] }, { type: Input }],
36011
+ allowCustomValues: [{ type: Input }],
36012
+ itemsMaxHeight: [{ type: Input }],
36013
+ itemHeight: [{ type: Input }],
36014
+ itemsWidth: [{ type: Input }],
36015
+ placeholder: [{ type: Input }],
36016
+ data: [{ type: Input }],
36017
+ valueKey: [{ type: Input }],
36018
+ displayKey: [{ type: Input }],
36019
+ groupKey: [{ type: Input }],
36020
+ ariaLabelledBy: [{ type: Input }, { type: HostBinding, args: ['attr.aria-labelledby',] }],
36021
+ cssClass: [{ type: HostBinding, args: ['class.igx-combo',] }],
36022
+ role: [{ type: HostBinding, args: [`attr.role`,] }],
36023
+ ariaExpanded: [{ type: HostBinding, args: ['attr.aria-expanded',] }],
36024
+ hasPopUp: [{ type: HostBinding, args: ['attr.aria-haspopup',] }],
36025
+ ariaOwns: [{ type: HostBinding, args: ['attr.aria-owns',] }],
36026
+ disabled: [{ type: Input }],
36027
+ type: [{ type: Input }],
36028
+ selectionChanging: [{ type: Output }],
36029
+ opening: [{ type: Output }],
36030
+ opened: [{ type: Output }],
36031
+ closing: [{ type: Output }],
36032
+ closed: [{ type: Output }],
36033
+ addition: [{ type: Output }],
36034
+ searchInputUpdate: [{ type: Output }],
36035
+ dataPreLoad: [{ type: Output }],
36036
+ itemTemplate: [{ type: ContentChild, args: [IgxComboItemDirective, { read: TemplateRef },] }],
36037
+ headerTemplate: [{ type: ContentChild, args: [IgxComboHeaderDirective, { read: TemplateRef },] }],
36038
+ footerTemplate: [{ type: ContentChild, args: [IgxComboFooterDirective, { read: TemplateRef },] }],
36039
+ headerItemTemplate: [{ type: ContentChild, args: [IgxComboHeaderItemDirective, { read: TemplateRef },] }],
36040
+ addItemTemplate: [{ type: ContentChild, args: [IgxComboAddItemDirective, { read: TemplateRef },] }],
36041
+ emptyTemplate: [{ type: ContentChild, args: [IgxComboEmptyDirective, { read: TemplateRef },] }],
36042
+ toggleIconTemplate: [{ type: ContentChild, args: [IgxComboToggleIconDirective, { read: TemplateRef },] }],
36043
+ clearIconTemplate: [{ type: ContentChild, args: [IgxComboClearIconDirective, { read: TemplateRef },] }],
36044
+ inputGroup: [{ type: ViewChild, args: ['inputGroup', { read: IgxInputGroupComponent, static: true },] }],
36045
+ comboInput: [{ type: ViewChild, args: ['comboInput', { read: IgxInputDirective, static: true },] }],
36046
+ searchInput: [{ type: ViewChild, args: ['searchInput',] }],
36047
+ virtualScrollContainer: [{ type: ViewChild, args: [IgxForOfDirective, { static: true },] }],
36048
+ virtDir: [{ type: ViewChild, args: [IgxForOfDirective, { read: IgxForOfDirective, static: true },] }],
36049
+ dropdownContainer: [{ type: ViewChild, args: ['dropdownItemContainer', { static: true },] }],
36050
+ primitiveTemplate: [{ type: ViewChild, args: ['primitive', { read: TemplateRef, static: true },] }],
36051
+ complexTemplate: [{ type: ViewChild, args: ['complex', { read: TemplateRef, static: true },] }],
36052
+ onArrowDown: [{ type: HostListener, args: ['keydown.ArrowDown', ['$event'],] }, { type: HostListener, args: ['keydown.Alt.ArrowDown', ['$event'],] }]
36053
+ };
36054
+
36055
+ /**
36056
+ * @hidden
36057
+ */
36058
+ class IgxComboAddItemComponent extends IgxComboItemComponent {
36059
+ get selected() {
36060
+ return false;
36061
+ }
36062
+ set selected(value) {
36317
36063
  }
36318
36064
  /**
36319
- * @hidden @internal
36065
+ * @inheritdoc
36320
36066
  */
36321
- writeValue(value) {
36322
- const selection = Array.isArray(value) ? value : [];
36323
- const oldSelection = this.selectedItems();
36324
- this.selection.select_items(this.id, selection, true);
36325
- this.cdr.markForCheck();
36326
- this._value = this.createDisplayText(this.selectedItems(), oldSelection);
36067
+ clicked(event) {
36068
+ this.comboAPI.disableTransitions = false;
36069
+ this.comboAPI.add_custom_item();
36070
+ }
36071
+ }
36072
+ IgxComboAddItemComponent.decorators = [
36073
+ { type: Component, args: [{
36074
+ selector: 'igx-combo-add-item',
36075
+ template: '<ng-content></ng-content>',
36076
+ providers: [{ provide: IgxComboItemComponent, useExisting: IgxComboAddItemComponent }]
36077
+ },] }
36078
+ ];
36079
+
36080
+ /** @hidden */
36081
+ class IgxComboDropDownComponent extends IgxDropDownComponent {
36082
+ constructor(elementRef, cdr, platform, selection, combo, comboAPI, _displayDensityOptions) {
36083
+ super(elementRef, cdr, platform, selection, _displayDensityOptions);
36084
+ this.elementRef = elementRef;
36085
+ this.cdr = cdr;
36086
+ this.platform = platform;
36087
+ this.selection = selection;
36088
+ this.combo = combo;
36089
+ this.comboAPI = comboAPI;
36090
+ this._displayDensityOptions = _displayDensityOptions;
36091
+ /** @hidden @internal */
36092
+ this.singleMode = false;
36093
+ /**
36094
+ * @hidden
36095
+ * @internal
36096
+ */
36097
+ this.children = null;
36098
+ this.scrollHandler = () => {
36099
+ this.comboAPI.disableTransitions = true;
36100
+ };
36101
+ }
36102
+ /** @hidden @internal */
36103
+ get scrollContainer() {
36104
+ return this.virtDir.dc.location.nativeElement;
36105
+ }
36106
+ get isScrolledToLast() {
36107
+ const scrollTop = this.virtDir.scrollPosition;
36108
+ const scrollHeight = this.virtDir.getScroll().scrollHeight;
36109
+ return Math.floor(scrollTop + this.virtDir.igxForContainerSize) === scrollHeight;
36110
+ }
36111
+ get lastVisibleIndex() {
36112
+ return this.combo.totalItemCount ?
36113
+ Math.floor(this.combo.itemsMaxHeight / this.combo.itemHeight) :
36114
+ this.items.length - 1;
36115
+ }
36116
+ get sortedChildren() {
36117
+ if (this.children !== undefined) {
36118
+ return this.children.toArray()
36119
+ .sort((a, b) => a.index - b.index);
36120
+ }
36121
+ return null;
36122
+ }
36123
+ /**
36124
+ * Get all non-header items
36125
+ *
36126
+ * ```typescript
36127
+ * let myDropDownItems = this.dropdown.items;
36128
+ * ```
36129
+ */
36130
+ get items() {
36131
+ const items = [];
36132
+ if (this.children !== undefined) {
36133
+ const sortedChildren = this.sortedChildren;
36134
+ for (const child of sortedChildren) {
36135
+ if (!child.isHeader) {
36136
+ items.push(child);
36137
+ }
36138
+ }
36139
+ }
36140
+ return items;
36327
36141
  }
36328
36142
  /**
36329
36143
  * @hidden @internal
36330
36144
  */
36331
- registerOnChange(fn) {
36332
- this._onChangeCallback = fn;
36145
+ onFocus() {
36146
+ this.focusedItem = this._focusedItem || this.items[0];
36333
36147
  }
36334
36148
  /**
36335
36149
  * @hidden @internal
36336
36150
  */
36337
- registerOnTouched(fn) {
36338
- this._onTouchedCallback = fn;
36151
+ onBlur(_evt) {
36152
+ this.focusedItem = null;
36339
36153
  }
36340
36154
  /**
36341
36155
  * @hidden @internal
36342
36156
  */
36343
- setDisabledState(isDisabled) {
36344
- this.disabled = isDisabled;
36157
+ onToggleOpened() {
36158
+ this.opened.emit();
36345
36159
  }
36346
36160
  /**
36347
36161
  * @hidden
36348
36162
  */
36349
- getEditElement() {
36350
- return this.comboInput.nativeElement;
36163
+ navigateFirst() {
36164
+ this.navigateItem(this.virtDir.igxForOf.findIndex(e => !e.isHeader));
36351
36165
  }
36352
36166
  /**
36353
- * @hidden @internal
36167
+ * @hidden
36354
36168
  */
36355
- get template() {
36356
- this._dataType = this.dataType;
36357
- if (this.itemTemplate) {
36358
- return this.itemTemplate;
36169
+ navigatePrev() {
36170
+ if (this._focusedItem && this._focusedItem.index === 0 && this.virtDir.state.startIndex === 0) {
36171
+ this.combo.focusSearchInput(false);
36359
36172
  }
36360
- if (this._dataType === DataTypes.COMPLEX) {
36361
- return this.complexTemplate;
36173
+ else {
36174
+ super.navigatePrev();
36175
+ }
36176
+ }
36177
+ /**
36178
+ * @hidden
36179
+ */
36180
+ navigateNext() {
36181
+ const lastIndex = this.combo.totalItemCount ? this.combo.totalItemCount - 1 : this.virtDir.igxForOf.length - 1;
36182
+ if (this._focusedItem && this._focusedItem.index === lastIndex) {
36183
+ this.focusAddItemButton();
36184
+ }
36185
+ else {
36186
+ super.navigateNext();
36362
36187
  }
36363
- return this.primitiveTemplate;
36364
36188
  }
36365
36189
  /**
36366
36190
  * @hidden @internal
36367
36191
  */
36368
- get context() {
36369
- return {
36370
- $implicit: this
36371
- };
36192
+ selectItem(item) {
36193
+ if (item === null || item === undefined) {
36194
+ return;
36195
+ }
36196
+ this.comboAPI.set_selected_item(item.itemID);
36197
+ this._focusedItem = item;
36372
36198
  }
36373
36199
  /**
36374
36200
  * @hidden @internal
36375
36201
  */
36376
- handleClearItems(event) {
36377
- if (this.disabled) {
36202
+ updateScrollPosition() {
36203
+ this.virtDir.getScroll().scrollTop = this._scrollPosition;
36204
+ }
36205
+ /**
36206
+ * @hidden @internal
36207
+ */
36208
+ onItemActionKey(key) {
36209
+ switch (key) {
36210
+ case DropDownActionKey.ENTER:
36211
+ this.handleEnter();
36212
+ break;
36213
+ case DropDownActionKey.SPACE:
36214
+ this.handleSpace();
36215
+ break;
36216
+ case DropDownActionKey.ESCAPE:
36217
+ this.close();
36218
+ }
36219
+ }
36220
+ ngAfterViewInit() {
36221
+ this.virtDir.getScroll().addEventListener('scroll', this.scrollHandler);
36222
+ }
36223
+ /**
36224
+ * @hidden @internal
36225
+ */
36226
+ ngOnDestroy() {
36227
+ this.virtDir.getScroll().removeEventListener('scroll', this.scrollHandler);
36228
+ this.destroy$.next(true);
36229
+ this.destroy$.complete();
36230
+ }
36231
+ scrollToHiddenItem(_newItem) { }
36232
+ handleEnter() {
36233
+ if (this.isAddItemFocused()) {
36234
+ this.combo.addItemToCollection();
36378
36235
  return;
36379
36236
  }
36380
- this.deselectAllItems(true, event);
36381
- if (this.collapsed) {
36382
- this.getEditElement().focus();
36237
+ if (this.singleMode && this.focusedItem) {
36238
+ this.combo.select(this.focusedItem.itemID);
36239
+ }
36240
+ this.close();
36241
+ }
36242
+ handleSpace() {
36243
+ if (this.isAddItemFocused()) {
36244
+ return;
36383
36245
  }
36384
36246
  else {
36385
- this.focusSearchInput(true);
36247
+ this.selectItem(this.focusedItem);
36386
36248
  }
36387
- event.stopPropagation();
36249
+ }
36250
+ isAddItemFocused() {
36251
+ return this.focusedItem instanceof IgxComboAddItemComponent;
36252
+ }
36253
+ focusAddItemButton() {
36254
+ if (this.combo.isAddButtonVisible()) {
36255
+ this.focusedItem = this.items[this.items.length - 1];
36256
+ }
36257
+ }
36258
+ }
36259
+ IgxComboDropDownComponent.decorators = [
36260
+ { type: Component, args: [{
36261
+ selector: 'igx-combo-drop-down',
36262
+ template: "<div class=\"igx-drop-down__list\" [style.width]=\"width\"\nigxToggle\n(appended)=\"onToggleContentAppended($event)\"\n(opening)=\"onToggleOpening($event)\" (opened)=\"onToggleOpened()\"\n(closing)=\"onToggleClosing($event)\" (closed)=\"onToggleClosed()\">\n <div class=\"igx-drop-down__list-scroll\" #scrollContainer [attr.id]=\"this.listId\" role=\"listbox\" [attr.aria-label]=\"this.listId\"\n [style.height]=\"height\"\n [style.maxHeight]=\"maxHeight\">\n <ng-container *ngIf=\"!collapsed\">\n <ng-content></ng-content>\n </ng-container>\n </div>\n</div>\n",
36263
+ providers: [{ provide: IGX_DROPDOWN_BASE, useExisting: IgxComboDropDownComponent }]
36264
+ },] }
36265
+ ];
36266
+ IgxComboDropDownComponent.ctorParameters = () => [
36267
+ { type: ElementRef },
36268
+ { type: ChangeDetectorRef },
36269
+ { type: PlatformUtil },
36270
+ { type: IgxSelectionAPIService },
36271
+ { type: undefined, decorators: [{ type: Inject, args: [IGX_COMBO_COMPONENT,] }] },
36272
+ { type: IgxComboAPIService },
36273
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] }
36274
+ ];
36275
+ IgxComboDropDownComponent.propDecorators = {
36276
+ singleMode: [{ type: Input }],
36277
+ children: [{ type: ContentChildren, args: [IgxComboItemComponent, { descendants: true },] }]
36278
+ };
36279
+
36280
+ /**
36281
+ * @hidden
36282
+ */
36283
+ class IgxComboFilteringPipe {
36284
+ transform(collection, searchValue, displayKey, filteringOptions, shouldFilter = false) {
36285
+ if (!collection) {
36286
+ return [];
36287
+ }
36288
+ if (!searchValue || !shouldFilter) {
36289
+ return collection;
36290
+ }
36291
+ else {
36292
+ const searchTerm = filteringOptions.caseSensitive ? searchValue.trim() : searchValue.toLowerCase().trim();
36293
+ if (displayKey != null) {
36294
+ return collection.filter(e => filteringOptions.caseSensitive ? e[displayKey].includes(searchTerm) :
36295
+ e[displayKey].toString().toLowerCase().includes(searchTerm));
36296
+ }
36297
+ else {
36298
+ return collection.filter(e => filteringOptions.caseSensitive ? e.includes(searchTerm) :
36299
+ e.toString().toLowerCase().includes(searchTerm));
36300
+ }
36301
+ }
36302
+ }
36303
+ }
36304
+ IgxComboFilteringPipe.decorators = [
36305
+ { type: Pipe, args: [{
36306
+ name: 'comboFiltering'
36307
+ },] }
36308
+ ];
36309
+ /**
36310
+ * @hidden
36311
+ */
36312
+ class IgxComboGroupingPipe {
36313
+ constructor(combo) {
36314
+ this.combo = combo;
36315
+ }
36316
+ transform(collection, groupKey, valueKey) {
36317
+ this.combo.filteredData = collection;
36318
+ if ((!groupKey && groupKey !== 0) || !collection.length) {
36319
+ return collection;
36320
+ }
36321
+ const sorted = DataUtil.sort(cloneArray(collection), [{
36322
+ fieldName: groupKey,
36323
+ dir: SortingDirection.Asc,
36324
+ ignoreCase: true,
36325
+ strategy: DefaultSortingStrategy.instance()
36326
+ }]);
36327
+ const data = cloneArray(sorted);
36328
+ let inserts = 0;
36329
+ let currentHeader = null;
36330
+ for (let i = 0; i < sorted.length; i++) {
36331
+ let insertFlag = 0;
36332
+ if (currentHeader !== sorted[i][groupKey]) {
36333
+ currentHeader = sorted[i][groupKey];
36334
+ insertFlag = 1;
36335
+ }
36336
+ if (insertFlag) {
36337
+ data.splice(i + inserts, 0, {
36338
+ [valueKey]: currentHeader,
36339
+ [groupKey]: currentHeader,
36340
+ isHeader: true
36341
+ });
36342
+ inserts++;
36343
+ }
36344
+ }
36345
+ return data;
36346
+ }
36347
+ }
36348
+ IgxComboGroupingPipe.decorators = [
36349
+ { type: Pipe, args: [{
36350
+ name: 'comboGrouping'
36351
+ },] }
36352
+ ];
36353
+ IgxComboGroupingPipe.ctorParameters = () => [
36354
+ { type: undefined, decorators: [{ type: Inject, args: [IGX_COMBO_COMPONENT,] }] }
36355
+ ];
36356
+
36357
+ /**
36358
+ * When called with sets A & B, returns A - B (as array);
36359
+ *
36360
+ * @hidden
36361
+ */
36362
+ const diffInSets = (set1, set2) => {
36363
+ const results = [];
36364
+ set1.forEach(entry => {
36365
+ if (!set2.has(entry)) {
36366
+ results.push(entry);
36367
+ }
36368
+ });
36369
+ return results;
36370
+ };
36371
+ const ɵ0$1 = diffInSets;
36372
+ /**
36373
+ * Represents a drop-down list that provides editable functionalities, allowing users to choose an option from a predefined list.
36374
+ *
36375
+ * @igxModule IgxComboModule
36376
+ * @igxTheme igx-combo-theme
36377
+ * @igxKeywords combobox, combo selection
36378
+ * @igxGroup Grids & Lists
36379
+ *
36380
+ * @remarks
36381
+ * It provides the ability to filter items as well as perform selection with the provided data.
36382
+ * Additionally, it exposes keyboard navigation and custom styling capabilities.
36383
+ * @example
36384
+ * ```html
36385
+ * <igx-combo [itemsMaxHeight]="250" [data]="locationData"
36386
+ * [displayKey]="'field'" [valueKey]="'field'"
36387
+ * placeholder="Location(s)" searchPlaceholder="Search...">
36388
+ * </igx-combo>
36389
+ * ```
36390
+ */
36391
+ class IgxComboComponent extends IgxComboBaseDirective {
36392
+ constructor(elementRef, cdr, selectionService, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector) {
36393
+ super(elementRef, cdr, selectionService, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector);
36394
+ this.elementRef = elementRef;
36395
+ this.cdr = cdr;
36396
+ this.selectionService = selectionService;
36397
+ this.comboAPI = comboAPI;
36398
+ this._iconService = _iconService;
36399
+ this._displayDensityOptions = _displayDensityOptions;
36400
+ this._inputGroupType = _inputGroupType;
36401
+ this._injector = _injector;
36402
+ /**
36403
+ * Defines whether the caseSensitive icon should be shown in the search input
36404
+ *
36405
+ * ```typescript
36406
+ * // get
36407
+ * let myComboShowSearchCaseIcon = this.combo.showSearchCaseIcon;
36408
+ * ```
36409
+ *
36410
+ * ```html
36411
+ * <!--set-->
36412
+ * <igx-combo [showSearchCaseIcon]='true'></igx-combo>
36413
+ * ```
36414
+ */
36415
+ this.showSearchCaseIcon = false;
36416
+ /**
36417
+ * An @Input property that controls whether the combo's search box
36418
+ * should be focused after the `opened` event is called
36419
+ * When `false`, the combo's list item container will be focused instead
36420
+ */
36421
+ this.autoFocusSearch = true;
36422
+ /**
36423
+ * An @Input property that enabled/disables filtering in the list. The default is `true`.
36424
+ * ```html
36425
+ * <igx-combo [filterable]="false">
36426
+ * ```
36427
+ */
36428
+ this.filterable = true;
36429
+ /**
36430
+ * Defines the placeholder value for the combo dropdown search field
36431
+ *
36432
+ * ```typescript
36433
+ * // get
36434
+ * let myComboSearchPlaceholder = this.combo.searchPlaceholder;
36435
+ * ```
36436
+ *
36437
+ * ```html
36438
+ * <!--set-->
36439
+ * <igx-combo [searchPlaceholder]='newPlaceHolder'></igx-combo>
36440
+ * ```
36441
+ */
36442
+ this.searchPlaceholder = 'Enter a Search Term';
36443
+ /**
36444
+ * @hidden @internal
36445
+ */
36446
+ this.filteringLogic = FilteringLogic.Or;
36447
+ this.stringFilters = IgxStringFilteringOperand;
36448
+ this.booleanFilters = IgxBooleanFilteringOperand;
36449
+ this._prevInputValue = '';
36450
+ this.comboAPI.register(this);
36388
36451
  }
36389
36452
  /**
36390
- * A method that opens/closes the combo.
36391
- *
36392
- * ```html
36393
- * <button (click)="combo.toggle()">Toggle Combo</button>
36394
- * <igx-combo #combo></igx-combo>
36395
- * ```
36453
+ * @hidden @internal
36396
36454
  */
36397
- toggle() {
36398
- const overlaySettings = Object.assign({}, this._overlaySettings, this.overlaySettings);
36399
- this.dropdown.toggle(overlaySettings);
36455
+ get inputEmpty() {
36456
+ return !this.value && !this.placeholder;
36457
+ }
36458
+ /** @hidden @internal */
36459
+ get filteredData() {
36460
+ return this.filterable ? this._filteredData : this.data;
36461
+ }
36462
+ /** @hidden @internal */
36463
+ set filteredData(val) {
36464
+ this._filteredData = this.groupKey ? (val || []).filter((e) => e.isHeader !== true) : val;
36465
+ this.checkMatch();
36466
+ }
36467
+ /** @hidden @internal */
36468
+ get displaySearchInput() {
36469
+ return this.filterable || this.allowCustomValues;
36400
36470
  }
36401
36471
  /**
36402
- * A method that opens the combo.
36403
- *
36404
- * ```html
36405
- * <button (click)="combo.open()">Open Combo</button>
36406
- * <igx-combo #combo></igx-combo>
36407
- * ```
36472
+ * @hidden @internal
36408
36473
  */
36409
- open() {
36410
- const overlaySettings = Object.assign({}, this._overlaySettings, this.overlaySettings);
36411
- this.dropdown.open(overlaySettings);
36474
+ handleKeyUp(event) {
36475
+ // TODO: use PlatformUtil for keyboard navigation
36476
+ if (event.key === 'ArrowDown' || event.key === 'Down') {
36477
+ this.dropdown.focusedItem = this.dropdown.items[0];
36478
+ this.dropdownContainer.nativeElement.focus();
36479
+ }
36480
+ else if (event.key === 'Escape' || event.key === 'Esc') {
36481
+ this.toggle();
36482
+ }
36412
36483
  }
36413
36484
  /**
36414
- * A method that closes the combo.
36415
- *
36416
- * ```html
36417
- * <button (click)="combo.close()">Close Combo</button>
36418
- * <igx-combo #combo></igx-combo>
36419
- * ```
36485
+ * @hidden @internal
36420
36486
  */
36421
- close() {
36422
- this.dropdown.close();
36487
+ handleSelectAll(evt) {
36488
+ if (evt.checked) {
36489
+ this.selectAllItems();
36490
+ }
36491
+ else {
36492
+ this.deselectAllItems();
36493
+ }
36423
36494
  }
36424
36495
  /**
36425
- * Gets drop down state.
36426
- *
36427
- * ```typescript
36428
- * let state = this.combo.collapsed;
36429
- * ```
36496
+ * @hidden @internal
36430
36497
  */
36431
- get collapsed() {
36432
- return this.dropdown.collapsed;
36498
+ writeValue(value) {
36499
+ const selection = Array.isArray(value) ? value : [];
36500
+ const oldSelection = this.selection;
36501
+ this.selectionService.select_items(this.id, selection, true);
36502
+ this.cdr.markForCheck();
36503
+ this._value = this.createDisplayText(this.selection, oldSelection);
36433
36504
  }
36434
36505
  /**
36435
- * Get current selection state
36436
- *
36437
- * @returns Array of selected items
36438
- * ```typescript
36439
- * let selectedItems = this.combo.selectedItems();
36440
- * ```
36506
+ * @hidden
36441
36507
  */
36442
- selectedItems() {
36443
- const items = Array.from(this.selection.get(this.id));
36444
- return items;
36508
+ getEditElement() {
36509
+ return this.comboInput.nativeElement;
36510
+ }
36511
+ /**
36512
+ * @hidden @internal
36513
+ */
36514
+ get context() {
36515
+ return {
36516
+ $implicit: this
36517
+ };
36518
+ }
36519
+ /**
36520
+ * @hidden @internal
36521
+ */
36522
+ handleClearItems(event) {
36523
+ if (this.disabled) {
36524
+ return;
36525
+ }
36526
+ this.deselectAllItems(true, event);
36527
+ if (this.collapsed) {
36528
+ this.getEditElement().focus();
36529
+ }
36530
+ else {
36531
+ this.focusSearchInput(true);
36532
+ }
36533
+ event.stopPropagation();
36445
36534
  }
36446
36535
  /**
36447
36536
  * Select defined items
@@ -36449,12 +36538,12 @@ class IgxComboComponent extends DisplayDensityBase {
36449
36538
  * @param newItems new items to be selected
36450
36539
  * @param clearCurrentSelection if true clear previous selected items
36451
36540
  * ```typescript
36452
- * this.combo.selectItems(["New York", "New Jersey"]);
36541
+ * this.combo.select(["New York", "New Jersey"]);
36453
36542
  * ```
36454
36543
  */
36455
- selectItems(newItems, clearCurrentSelection, event) {
36544
+ select(newItems, clearCurrentSelection, event) {
36456
36545
  if (newItems) {
36457
- const newSelection = this.selection.add_items(this.id, newItems, clearCurrentSelection);
36546
+ const newSelection = this.selectionService.add_items(this.id, newItems, clearCurrentSelection);
36458
36547
  this.setSelection(newSelection, event);
36459
36548
  }
36460
36549
  }
@@ -36463,12 +36552,12 @@ class IgxComboComponent extends DisplayDensityBase {
36463
36552
  *
36464
36553
  * @param items items to deselected
36465
36554
  * ```typescript
36466
- * this.combo.deselectItems(["New York", "New Jersey"]);
36555
+ * this.combo.deselect(["New York", "New Jersey"]);
36467
36556
  * ```
36468
36557
  */
36469
- deselectItems(items, event) {
36558
+ deselect(items, event) {
36470
36559
  if (items) {
36471
- const newSelection = this.selection.delete_items(this.id, items);
36560
+ const newSelection = this.selectionService.delete_items(this.id, items);
36472
36561
  this.setSelection(newSelection, event);
36473
36562
  }
36474
36563
  }
@@ -36481,8 +36570,8 @@ class IgxComboComponent extends DisplayDensityBase {
36481
36570
  * ```
36482
36571
  */
36483
36572
  selectAllItems(ignoreFilter, event) {
36484
- const allVisible = this.selection.get_all_ids(ignoreFilter ? this.data : this.filteredData, this.valueKey);
36485
- const newSelection = this.selection.add_items(this.id, allVisible);
36573
+ const allVisible = this.selectionService.get_all_ids(ignoreFilter ? this.data : this.filteredData, this.valueKey);
36574
+ const newSelection = this.selectionService.add_items(this.id, allVisible);
36486
36575
  this.setSelection(newSelection, event);
36487
36576
  }
36488
36577
  /**
@@ -36494,9 +36583,9 @@ class IgxComboComponent extends DisplayDensityBase {
36494
36583
  * ```
36495
36584
  */
36496
36585
  deselectAllItems(ignoreFilter, event) {
36497
- let newSelection = this.selection.get_empty();
36586
+ let newSelection = this.selectionService.get_empty();
36498
36587
  if (this.filteredData.length !== this.data.length && !ignoreFilter) {
36499
- newSelection = this.selection.delete_items(this.id, this.selection.get_all_ids(this.filteredData, this.valueKey));
36588
+ newSelection = this.selectionService.delete_items(this.id, this.selectionService.get_all_ids(this.filteredData, this.valueKey));
36500
36589
  }
36501
36590
  this.setSelection(newSelection, event);
36502
36591
  }
@@ -36524,26 +36613,19 @@ class IgxComboComponent extends DisplayDensityBase {
36524
36613
  return;
36525
36614
  }
36526
36615
  if (select) {
36527
- this.selectItems([itemID], false, event);
36616
+ this.select([itemID], false, event);
36528
36617
  }
36529
36618
  else {
36530
- this.deselectItems([itemID], event);
36619
+ this.deselect([itemID], event);
36531
36620
  }
36532
36621
  }
36533
- /**
36534
- * Event handlers
36535
- *
36536
- * @hidden
36537
- * @internal
36538
- */
36539
- handleOpening(e) {
36540
- const args = { owner: this, event: e.event, cancel: e.cancel };
36541
- this.opening.emit(args);
36542
- e.cancel = args.cancel;
36543
- }
36544
36622
  /**
36545
36623
  * @hidden @internal
36546
36624
  */
36625
+ toggleCaseSensitive() {
36626
+ this.filteringOptions = { caseSensitive: !this.filteringOptions.caseSensitive };
36627
+ }
36628
+ /** @hidden @internal */
36547
36629
  handleOpened() {
36548
36630
  this.triggerCheck();
36549
36631
  // Disabling focus of the search input should happen only when drop down opens.
@@ -36557,36 +36639,26 @@ class IgxComboComponent extends DisplayDensityBase {
36557
36639
  }
36558
36640
  this.opened.emit({ owner: this });
36559
36641
  }
36560
- /**
36561
- * @hidden @internal
36562
- */
36563
- handleClosing(e) {
36564
- const args = { owner: this, event: e.event, cancel: e.cancel };
36565
- this.closing.emit(args);
36566
- e.cancel = args.cancel;
36567
- if (e.cancel) {
36568
- return;
36642
+ /** @hidden @internal */
36643
+ focusSearchInput(opening) {
36644
+ if (this.displaySearchInput && this.searchInput) {
36645
+ this.searchInput.nativeElement.focus();
36646
+ }
36647
+ else {
36648
+ if (opening) {
36649
+ this.dropdownContainer.nativeElement.focus();
36650
+ }
36651
+ else {
36652
+ this.comboInput.nativeElement.focus();
36653
+ this.toggle();
36654
+ }
36569
36655
  }
36570
- this.searchValue = '';
36571
- this.comboInput.nativeElement.focus();
36572
- }
36573
- /**
36574
- * @hidden @internal
36575
- */
36576
- handleClosed() {
36577
- this.closed.emit({ owner: this });
36578
- }
36579
- /**
36580
- * @hidden @internal
36581
- */
36582
- toggleCaseSensitive() {
36583
- this.filteringOptions = { caseSensitive: !this.filteringOptions.caseSensitive };
36584
36656
  }
36585
36657
  setSelection(newSelection, event) {
36586
- const removed = diffInSets(this.selection.get(this.id), newSelection);
36587
- const added = diffInSets(newSelection, this.selection.get(this.id));
36658
+ const removed = diffInSets(this.selectionService.get(this.id), newSelection);
36659
+ const added = diffInSets(newSelection, this.selectionService.get(this.id));
36588
36660
  const newSelectionAsArray = Array.from(newSelection);
36589
- const oldSelectionAsArray = Array.from(this.selection.get(this.id) || []);
36661
+ const oldSelectionAsArray = Array.from(this.selectionService.get(this.id) || []);
36590
36662
  const displayText = this.createDisplayText(newSelectionAsArray, oldSelectionAsArray);
36591
36663
  const args = {
36592
36664
  newSelection: newSelectionAsArray,
@@ -36600,7 +36672,7 @@ class IgxComboComponent extends DisplayDensityBase {
36600
36672
  };
36601
36673
  this.selectionChanging.emit(args);
36602
36674
  if (!args.cancel) {
36603
- this.selection.select_items(this.id, args.newSelection, true);
36675
+ this.selectionService.select_items(this.id, args.newSelection, true);
36604
36676
  if (displayText !== args.displayText) {
36605
36677
  this._value = args.displayText;
36606
36678
  }
@@ -36610,44 +36682,10 @@ class IgxComboComponent extends DisplayDensityBase {
36610
36682
  this._onChangeCallback(args.newSelection);
36611
36683
  }
36612
36684
  }
36613
- manageRequiredAsterisk() {
36614
- if (this.ngControl && this.ngControl.control.validator) {
36615
- // Run the validation with empty object to check if required is enabled.
36616
- const error = this.ngControl.control.validator({});
36617
- this.inputGroup.isRequired = error && error.required;
36618
- }
36619
- }
36620
- /** Contains key-value pairs of the selected valueKeys and their resp. displayKeys */
36621
- registerRemoteEntries(ids, add = true) {
36622
- if (add) {
36623
- const selection = this.getValueDisplayPairs(ids);
36624
- for (const entry of selection) {
36625
- this._remoteSelection[entry[this.valueKey]] = entry[this.displayKey];
36626
- }
36627
- }
36628
- else {
36629
- for (const entry of ids) {
36630
- delete this._remoteSelection[entry];
36631
- }
36632
- }
36633
- }
36634
- /**
36635
- * For `id: any[]` returns a mapped `{ [combo.valueKey]: any, [combo.displayKey]: any }[]`
36636
- */
36637
- getValueDisplayPairs(ids) {
36638
- return this.data.filter(entry => ids.indexOf(entry[this.valueKey]) > -1).map(e => ({
36639
- [this.valueKey]: e[this.valueKey],
36640
- [this.displayKey]: e[this.displayKey]
36641
- }));
36642
- }
36643
- checkMatch() {
36644
- const displayKey = this.displayKey;
36645
- const matchFn = (e) => {
36646
- const value = displayKey ? e[displayKey] : e;
36647
- return value.toString().toLowerCase() === this.searchValue.trim().toLowerCase();
36648
- };
36649
- const itemMatch = this.filteredData.some(matchFn);
36650
- this.customValueFlag = this.allowCustomValues && !itemMatch;
36685
+ createDisplayText(newSelection, oldSelection) {
36686
+ return this.isRemote
36687
+ ? this.getRemoteSelection(newSelection, oldSelection)
36688
+ : this.concatDisplayText(newSelection);
36651
36689
  }
36652
36690
  /** Returns a string that should be populated in the combo's text box */
36653
36691
  concatDisplayText(selection) {
@@ -36656,44 +36694,11 @@ class IgxComboComponent extends DisplayDensityBase {
36656
36694
  selection.join(', ');
36657
36695
  return value;
36658
36696
  }
36659
- /**
36660
- * Constructs the combo display value
36661
- * If remote, caches the key displayText
36662
- * If not, just combine the object.displayKeys
36663
- */
36664
- createDisplayText(newSelection, oldSelection) {
36665
- let value = '';
36666
- if (this.isRemote) {
36667
- if (newSelection.length) {
36668
- const removedItems = oldSelection.filter(e => newSelection.indexOf(e) < 0);
36669
- const addedItems = newSelection.filter(e => oldSelection.indexOf(e) < 0);
36670
- this.registerRemoteEntries(addedItems);
36671
- this.registerRemoteEntries(removedItems, false);
36672
- value = Object.keys(this._remoteSelection).map(e => this._remoteSelection[e]).join(', ');
36673
- }
36674
- else {
36675
- // If new selection is empty, clear all items
36676
- this.registerRemoteEntries(oldSelection, false);
36677
- }
36678
- }
36679
- else {
36680
- value = this.concatDisplayText(newSelection);
36681
- }
36682
- return value;
36683
- }
36684
- /** if there is a valueKey - map the keys to data items, else - just return the keys */
36685
- convertKeysToItems(keys) {
36686
- if (this.comboAPI.valueKey === null) {
36687
- return keys;
36688
- }
36689
- // map keys vs. filter data to retain the order of the selected items
36690
- return keys.map(key => this.data.find(entry => entry[this.valueKey] === key)).filter(e => e !== undefined);
36691
- }
36692
36697
  }
36693
36698
  IgxComboComponent.decorators = [
36694
36699
  { type: Component, args: [{
36695
36700
  selector: 'igx-combo',
36696
- template: "<igx-input-group #inputGroup [displayDensity]=\"displayDensity\" [type]=\"type\" (click)=\"onInputClick($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]=\"value\" readonly [attr.placeholder]=\"placeholder\"\n [disabled]=\"disabled\" (blur)=\"onBlur()\" />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix\"></ng-content>\n </ng-container>\n <igx-suffix *ngIf=\"value.length\" aria-label=\"Clear Selection\" 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\">\n clear\n </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: this.collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\">\n {{ dropdown.collapsed ? 'arrow_drop_down' : 'arrow_drop_up'}}\n </igx-icon>\n </igx-suffix>\n</igx-input-group>\n<igx-combo-drop-down #igxComboDropDown class=\"igx-combo__drop-down\" [displayDensity]=\"displayDensity\"\n [width]=\"itemsWidth || '100%'\" (opening)=\"handleOpening($event)\" (closing)=\"handleClosing($event)\"\n (opened)=\"handleOpened()\" (closed)=\"handleClosed()\">\n <igx-input-group *ngIf=\"displaySearchInput\" [displayDensity]=\"displayDensity\" theme=\"material\" class=\"igx-combo__search\">\n <input class=\"igx-combo-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]=\"searchPlaceholder\"\n aria-autocomplete=\"both\" [attr.aria-owns]=\"dropdown.id\" [attr.aria-labelledby]=\"ariaLabelledBy\" />\n <igx-suffix *ngIf=\"showSearchCaseIcon\">\n <igx-icon family=\"imx-icons\" name=\"case-sensitive\" [active]=\"filteringOptions.caseSensitive\"\n (click)=\"toggleCaseSensitive()\">\n </igx-icon>\n </igx-suffix>\n </igx-input-group>\n <ng-container *ngTemplateOutlet=\"headerTemplate\">\n </ng-container>\n <div #dropdownItemContainer class=\"igx-combo__content\" [style.overflow]=\"'hidden'\"\n [style.maxHeight.px]=\"itemsMaxHeight\" [igxDropDownItemNavigation]=\"dropdown\" (focus)=\"dropdown.onFocus()\"\n [tabindex]=\"dropdown.collapsed ? -1 : 0\" role=\"listbox\" [attr.id]=\"dropdown.id\">\n <igx-combo-item role=\"option\" [itemHeight]='itemHeight' *igxFor=\"let item of data\n | comboFiltering:filterValue:displayKey:filterable:filteringOptions\n | comboGrouping:groupKey:valueKey;\n index as rowIndex; containerSize: itemsMaxHeight; scrollOrientation: 'vertical'; itemSize: itemHeight\"\n [value]=\"item\" [isHeader]=\"item.isHeader\" [index]=\"rowIndex\">\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 <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 aria-label=\"Add Item\" [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>The list is empty</span>\n</ng-template>\n<ng-template #addItemDefault let-control>\n <button igxButton=\"flat\" igxRipple>Add item</button>\n</ng-template>\n<ng-template #headerItemBase let-item let-key=\"valueKey\" let-groupKey=\"groupKey\">\n {{ item[key] }}\n</ng-template>\n",
36701
+ template: "<igx-input-group #inputGroup [displayDensity]=\"displayDensity\" [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]=\"value\" readonly [attr.placeholder]=\"placeholder\"\n [disabled]=\"disabled\" (blur)=\"onBlur()\" />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix\"></ng-content>\n </ng-container>\n <igx-suffix *ngIf=\"value.length\" aria-label=\"Clear Selection\" 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\">\n clear\n </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: this.collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\">\n {{ dropdown.collapsed ? 'arrow_drop_down' : 'arrow_drop_up'}}\n </igx-icon>\n </igx-suffix>\n</igx-input-group>\n<igx-combo-drop-down #igxComboDropDown class=\"igx-combo__drop-down\" [displayDensity]=\"displayDensity\"\n [width]=\"itemsWidth || '100%'\" (opening)=\"handleOpening($event)\" (closing)=\"handleClosing($event)\"\n (opened)=\"handleOpened()\" (closed)=\"handleClosed()\">\n <igx-input-group *ngIf=\"displaySearchInput\" [displayDensity]=\"displayDensity\" theme=\"material\" class=\"igx-combo__search\">\n <input class=\"igx-combo-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]=\"searchPlaceholder\"\n aria-autocomplete=\"both\" [attr.aria-owns]=\"dropdown.id\" [attr.aria-labelledby]=\"ariaLabelledBy\" />\n <igx-suffix *ngIf=\"showSearchCaseIcon\">\n <igx-icon family=\"imx-icons\" name=\"case-sensitive\" [active]=\"filteringOptions.caseSensitive\"\n (click)=\"toggleCaseSensitive()\">\n </igx-icon>\n </igx-suffix>\n </igx-input-group>\n <ng-container *ngTemplateOutlet=\"headerTemplate\">\n </ng-container>\n <div #dropdownItemContainer class=\"igx-combo__content\" [style.overflow]=\"'hidden'\"\n [style.maxHeight.px]=\"itemsMaxHeight\" [igxDropDownItemNavigation]=\"dropdown\" (focus)=\"dropdown.onFocus()\"\n [tabindex]=\"dropdown.collapsed ? -1 : 0\" role=\"listbox\" [attr.id]=\"dropdown.id\">\n <igx-combo-item role=\"option\" [itemHeight]='itemHeight' *igxFor=\"let item of data\n | comboFiltering:filterValue:displayKey:filteringOptions:filterable\n | comboGrouping:groupKey:valueKey;\n index as rowIndex; containerSize: itemsMaxHeight; scrollOrientation: 'vertical'; itemSize: itemHeight\"\n [value]=\"item\" [isHeader]=\"item.isHeader\" [index]=\"rowIndex\">\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 <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 aria-label=\"Add Item\" [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>The list is empty</span>\n</ng-template>\n<ng-template #addItemDefault let-control>\n <button igxButton=\"flat\" igxRipple>Add item</button>\n</ng-template>\n<ng-template #headerItemBase let-item let-key=\"valueKey\" let-groupKey=\"groupKey\">\n {{ item[key] }}\n</ng-template>\n",
36697
36702
  providers: [
36698
36703
  IgxComboAPIService,
36699
36704
  { provide: IGX_COMBO_COMPONENT, useExisting: IgxComboComponent },
@@ -36712,56 +36717,11 @@ IgxComboComponent.ctorParameters = () => [
36712
36717
  { type: Injector, decorators: [{ type: Optional }] }
36713
36718
  ];
36714
36719
  IgxComboComponent.propDecorators = {
36715
- overlaySettings: [{ type: Input }],
36716
- inputGroup: [{ type: ViewChild, args: ['inputGroup', { read: IgxInputGroupComponent, static: true },] }],
36717
- comboInput: [{ type: ViewChild, args: ['comboInput', { read: IgxInputDirective, static: true },] }],
36718
- dropdown: [{ type: ViewChild, args: [IgxComboDropDownComponent, { read: IgxComboDropDownComponent, static: true },] }],
36719
- searchInput: [{ type: ViewChild, args: ['searchInput',] }],
36720
- itemTemplate: [{ type: ContentChild, args: [IgxComboItemDirective, { read: TemplateRef },] }],
36721
- headerTemplate: [{ type: ContentChild, args: [IgxComboHeaderDirective, { read: TemplateRef },] }],
36722
- footerTemplate: [{ type: ContentChild, args: [IgxComboFooterDirective, { read: TemplateRef },] }],
36723
- headerItemTemplate: [{ type: ContentChild, args: [IgxComboHeaderItemDirective, { read: TemplateRef },] }],
36724
- addItemTemplate: [{ type: ContentChild, args: [IgxComboAddItemDirective, { read: TemplateRef },] }],
36725
- emptyTemplate: [{ type: ContentChild, args: [IgxComboEmptyDirective, { read: TemplateRef },] }],
36726
- toggleIconTemplate: [{ type: ContentChild, args: [IgxComboToggleIconDirective, { read: TemplateRef },] }],
36727
- clearIconTemplate: [{ type: ContentChild, args: [IgxComboClearIconDirective, { read: TemplateRef },] }],
36728
- virtualScrollContainer: [{ type: ViewChild, args: [IgxForOfDirective, { static: true },] }],
36729
- selectionChanging: [{ type: Output }],
36730
- opening: [{ type: Output }],
36731
- opened: [{ type: Output }],
36732
- closing: [{ type: Output }],
36733
- closed: [{ type: Output }],
36734
- addition: [{ type: Output }],
36735
- searchInputUpdate: [{ type: Output }],
36736
- dataPreLoad: [{ type: Output }],
36737
- id: [{ type: HostBinding, args: ['attr.id',] }, { type: Input }],
36738
- width: [{ type: HostBinding, args: ['style.width',] }, { type: Input }],
36739
- cssClass: [{ type: HostBinding, args: ['class.igx-combo',] }],
36740
- role: [{ type: HostBinding, args: [`attr.role`,] }],
36741
- ariaExpanded: [{ type: HostBinding, args: ['attr.aria-expanded',] }],
36742
- hasPopUp: [{ type: HostBinding, args: ['attr.aria-haspopup',] }],
36743
- ariaOwns: [{ type: HostBinding, args: ['attr.aria-owns',] }],
36744
- allowCustomValues: [{ type: Input }],
36745
- itemsMaxHeight: [{ type: Input }],
36746
- itemsWidth: [{ type: Input }],
36747
- itemHeight: [{ type: Input }],
36748
- placeholder: [{ type: Input }],
36749
- searchPlaceholder: [{ type: Input }],
36750
36720
  showSearchCaseIcon: [{ type: Input }],
36751
- data: [{ type: Input }],
36752
- valueKey: [{ type: Input }],
36753
- displayKey: [{ type: Input }],
36754
- groupKey: [{ type: Input }],
36755
- filterable: [{ type: Input }],
36756
- ariaLabelledBy: [{ type: Input }, { type: HostBinding, args: ['attr.aria-labelledby',] }],
36757
- disabled: [{ type: Input }],
36758
- type: [{ type: Input }],
36759
36721
  autoFocusSearch: [{ type: Input }],
36760
- dropdownContainer: [{ type: ViewChild, args: ['dropdownItemContainer', { static: true },] }],
36761
- primitiveTemplate: [{ type: ViewChild, args: ['primitive', { read: TemplateRef, static: true },] }],
36762
- complexTemplate: [{ type: ViewChild, args: ['complex', { read: TemplateRef, static: true },] }],
36763
- virtDir: [{ type: ViewChild, args: [IgxForOfDirective, { read: IgxForOfDirective, static: true },] }],
36764
- onArrowDown: [{ type: HostListener, args: ['keydown.ArrowDown', ['$event'],] }, { type: HostListener, args: ['keydown.Alt.ArrowDown', ['$event'],] }]
36722
+ filterable: [{ type: Input }],
36723
+ searchPlaceholder: [{ type: Input }],
36724
+ dropdown: [{ type: ViewChild, args: [IgxComboDropDownComponent, { static: true },] }]
36765
36725
  };
36766
36726
  /**
36767
36727
  * @hidden
@@ -36781,6 +36741,8 @@ IgxComboModule.decorators = [
36781
36741
  IgxComboToggleIconDirective,
36782
36742
  IgxComboClearIconDirective],
36783
36743
  exports: [IgxComboComponent, IgxComboItemComponent, IgxComboDropDownComponent, IgxComboAddItemComponent,
36744
+ IgxComboGroupingPipe,
36745
+ IgxComboFilteringPipe,
36784
36746
  IgxComboItemDirective,
36785
36747
  IgxComboEmptyDirective,
36786
36748
  IgxComboHeaderItemDirective,
@@ -36795,6 +36757,284 @@ IgxComboModule.decorators = [
36795
36757
  },] }
36796
36758
  ];
36797
36759
 
36760
+ /**
36761
+ * Represents a drop-down list that provides filtering functionality, allowing users to choose a single option from a predefined list.
36762
+ *
36763
+ * @igxModule IgxSimpleComboModule
36764
+ * @igxTheme igx-combo-theme
36765
+ * @igxKeywords combobox, single combo selection
36766
+ * @igxGroup Grids & Lists
36767
+ *
36768
+ * @remarks
36769
+ * It provides the ability to filter items as well as perform single selection on the provided data.
36770
+ * Additionally, it exposes keyboard navigation and custom styling capabilities.
36771
+ * @example
36772
+ * ```html
36773
+ * <igx-simple-combo [itemsMaxHeight]="250" [data]="locationData"
36774
+ * [displayKey]="'field'" [valueKey]="'field'"
36775
+ * placeholder="Location" searchPlaceholder="Search...">
36776
+ * </igx-simple-combo>
36777
+ * ```
36778
+ */
36779
+ class IgxSimpleComboComponent extends IgxComboBaseDirective {
36780
+ constructor(elementRef, cdr, selectionService, comboAPI, _iconService, platformUtil, _displayDensityOptions, _inputGroupType, _injector) {
36781
+ super(elementRef, cdr, selectionService, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector);
36782
+ this.elementRef = elementRef;
36783
+ this.cdr = cdr;
36784
+ this.selectionService = selectionService;
36785
+ this.comboAPI = comboAPI;
36786
+ this._iconService = _iconService;
36787
+ this.platformUtil = platformUtil;
36788
+ this._displayDensityOptions = _displayDensityOptions;
36789
+ this._inputGroupType = _inputGroupType;
36790
+ this._injector = _injector;
36791
+ /**
36792
+ * Emitted when item selection is changing, before the selection completes
36793
+ *
36794
+ * ```html
36795
+ * <igx-simple-combo (selectionChanging)='handleSelection()'></igx-simple-combo>
36796
+ * ```
36797
+ */
36798
+ this.selectionChanging = new EventEmitter();
36799
+ /** @hidden @internal */
36800
+ this.composing = false;
36801
+ this._updateInput = false;
36802
+ this.findMatch = (element) => {
36803
+ const value = this.displayKey ? element[this.displayKey] : element;
36804
+ return value.toString().toLowerCase().includes(this.searchValue.trim().toLowerCase());
36805
+ };
36806
+ this.comboAPI.register(this);
36807
+ }
36808
+ /** @hidden @internal */
36809
+ get filteredData() {
36810
+ return this._filteredData;
36811
+ }
36812
+ /** @hidden @internal */
36813
+ set filteredData(val) {
36814
+ this._filteredData = this.groupKey ? (val || []).filter((e) => e.isHeader !== true) : val;
36815
+ this.checkMatch();
36816
+ }
36817
+ /**
36818
+ * Select a defined item
36819
+ *
36820
+ * @param item the item to be selected
36821
+ * ```typescript
36822
+ * this.combo.select("New York");
36823
+ * ```
36824
+ */
36825
+ select(item) {
36826
+ if (item !== null && item !== undefined) {
36827
+ const newSelection = this.selectionService.add_items(this.id, item instanceof Array ? item : [item], true);
36828
+ this.setSelection(newSelection);
36829
+ }
36830
+ }
36831
+ /**
36832
+ * Deselect a defined item
36833
+ *
36834
+ * @param item the items to be deselected
36835
+ * ```typescript
36836
+ * this.combo.deselect("New York");
36837
+ * ```
36838
+ */
36839
+ deselect(item) {
36840
+ if (item !== null && item !== undefined) {
36841
+ const newSelection = this.selectionService.delete_items(this.id, item instanceof Array ? item : [item]);
36842
+ this.setSelection(newSelection);
36843
+ }
36844
+ }
36845
+ /** @hidden @internal */
36846
+ writeValue(value) {
36847
+ const oldSelection = this.selection;
36848
+ this.selectionService.select_items(this.id, value ? [value] : [], true);
36849
+ this.cdr.markForCheck();
36850
+ this._value = this.createDisplayText(this.selection, oldSelection);
36851
+ }
36852
+ /** @hidden @internal */
36853
+ ngAfterViewInit() {
36854
+ this.dropdown.opened.pipe(takeUntil(this.destroy$)).subscribe(() => {
36855
+ if (this.composing) {
36856
+ this.comboInput.focus();
36857
+ }
36858
+ });
36859
+ this.dropdown.closed.pipe(takeUntil(this.destroy$)).subscribe(() => {
36860
+ this.composing = false;
36861
+ });
36862
+ this.dropdown.closing.pipe(takeUntil(this.destroy$)).subscribe(() => {
36863
+ const selection = this.selectionService.first_item(this.id);
36864
+ this.comboInput.value = selection !== undefined && selection !== null ? selection : '';
36865
+ });
36866
+ this.dropdown.opening.pipe(takeUntil(this.destroy$)).subscribe(() => {
36867
+ if (!this.comboInput.value.length) {
36868
+ this.clearSelection();
36869
+ }
36870
+ });
36871
+ super.ngAfterViewInit();
36872
+ }
36873
+ /** @hidden @internal */
36874
+ handleInputChange(event) {
36875
+ this.searchValue = event.target.value;
36876
+ this._onChangeCallback(this.searchValue);
36877
+ if (this.collapsed) {
36878
+ this.open();
36879
+ }
36880
+ super.handleInputChange(event);
36881
+ }
36882
+ /** @hidden @internal */
36883
+ handleKeyDown(event) {
36884
+ if (event.key === this.platformUtil.KEYMAP.ENTER) {
36885
+ const filtered = this.filteredData.find(this.findMatch);
36886
+ if (filtered === null || filtered === undefined) {
36887
+ return;
36888
+ }
36889
+ this.select(this.dropdown.items[0].itemID);
36890
+ event.preventDefault();
36891
+ event.stopPropagation();
36892
+ this.close();
36893
+ return;
36894
+ }
36895
+ if (event.key === this.platformUtil.KEYMAP.BACKSPACE
36896
+ || event.key === this.platformUtil.KEYMAP.DELETE) {
36897
+ this._updateInput = false;
36898
+ this.clearSelection();
36899
+ }
36900
+ super.handleKeyDown(event);
36901
+ this.composing = event.key !== this.platformUtil.KEYMAP.ARROW_DOWN
36902
+ && event.key !== this.platformUtil.KEYMAP.ARROW_LEFT
36903
+ && event.key !== this.platformUtil.KEYMAP.ARROW_RIGHT
36904
+ && event.key !== this.platformUtil.KEYMAP.TAB;
36905
+ }
36906
+ /** @hidden @internal */
36907
+ handleKeyUp(event) {
36908
+ if (event.key === this.platformUtil.KEYMAP.ARROW_DOWN) {
36909
+ const firstItem = this.selectionService.first_item(this.id);
36910
+ this.dropdown.focusedItem = firstItem && this.filteredData.length > 0
36911
+ ? this.dropdown.items.find(i => i.itemID === firstItem)
36912
+ : this.dropdown.items[0];
36913
+ this.dropdownContainer.nativeElement.focus();
36914
+ }
36915
+ }
36916
+ /** @hidden @internal */
36917
+ getEditElement() {
36918
+ return this.comboInput.nativeElement;
36919
+ }
36920
+ /** @hidden @internal */
36921
+ handleClear(event) {
36922
+ if (this.disabled) {
36923
+ return;
36924
+ }
36925
+ this.clearSelection(true);
36926
+ if (this.collapsed) {
36927
+ this.getEditElement().focus();
36928
+ }
36929
+ else {
36930
+ this.focusSearchInput(true);
36931
+ }
36932
+ event.stopPropagation();
36933
+ this.comboInput.value = this.filterValue = this.searchValue = '';
36934
+ this.dropdown.focusedItem = null;
36935
+ this.comboInput.focus();
36936
+ }
36937
+ /** @hidden @internal */
36938
+ handleOpened() {
36939
+ this.triggerCheck();
36940
+ this.dropdownContainer.nativeElement.focus();
36941
+ this.opened.emit({ owner: this });
36942
+ }
36943
+ /** @hidden @internal */
36944
+ focusSearchInput(opening) {
36945
+ if (opening) {
36946
+ this.dropdownContainer.nativeElement.focus();
36947
+ }
36948
+ else {
36949
+ this.comboInput.nativeElement.focus();
36950
+ this.toggle();
36951
+ }
36952
+ }
36953
+ setSelection(newSelection) {
36954
+ const newSelectionAsArray = newSelection ? Array.from(newSelection) : [];
36955
+ const oldSelectionAsArray = Array.from(this.selectionService.get(this.id) || []);
36956
+ const displayText = this.createDisplayText(newSelectionAsArray, oldSelectionAsArray);
36957
+ const args = {
36958
+ newSelection: newSelectionAsArray[0],
36959
+ oldSelection: oldSelectionAsArray[0],
36960
+ displayText,
36961
+ owner: this,
36962
+ cancel: false
36963
+ };
36964
+ this.selectionChanging.emit(args);
36965
+ if (!args.cancel) {
36966
+ const argsSelection = args.newSelection !== undefined
36967
+ && args.newSelection !== null
36968
+ ? [args.newSelection]
36969
+ : [];
36970
+ this.selectionService.select_items(this.id, argsSelection, true);
36971
+ if (this._updateInput) {
36972
+ this._value = displayText !== args.displayText
36973
+ ? args.displayText
36974
+ : this.createDisplayText([args.newSelection], [args.oldSelection]);
36975
+ }
36976
+ this._onChangeCallback(args.newSelection);
36977
+ this._updateInput = true;
36978
+ }
36979
+ }
36980
+ createDisplayText(newSelection, oldSelection) {
36981
+ if (this.isRemote) {
36982
+ return this.getRemoteSelection(newSelection, oldSelection);
36983
+ }
36984
+ return this.displayKey !== null && this.displayKey !== undefined
36985
+ ? this.convertKeysToItems(newSelection).map(e => e[this.displayKey])[0]
36986
+ : newSelection[0];
36987
+ }
36988
+ clearSelection(ignoreFilter) {
36989
+ let newSelection = this.selectionService.get_empty();
36990
+ if (this.filteredData.length !== this.data.length && !ignoreFilter) {
36991
+ newSelection = this.selectionService.delete_items(this.id, this.selectionService.get_all_ids(this.filteredData, this.valueKey));
36992
+ }
36993
+ this.setSelection(newSelection);
36994
+ }
36995
+ }
36996
+ IgxSimpleComboComponent.decorators = [
36997
+ { type: Component, args: [{
36998
+ selector: 'igx-simple-combo',
36999
+ template: "<igx-input-group #inputGroup [displayDensity]=\"displayDensity\" [type]=\"type\">\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\n <input #comboInput igxInput [value]=\"value\" (input)=\"handleInputChange($event)\" (keyup)=\"handleKeyUp($event)\"\n (keydown)=\"handleKeyDown($event)\" (blur)=\"onBlur()\" [attr.placeholder]=\"placeholder\"\n aria-autocomplete=\"both\" [attr.aria-owns]=\"dropdown.id\" [attr.aria-labelledby]=\"ariaLabelledBy\"\n [disabled]=\"disabled\" [igxTextSelection]=\"!composing\" />\n\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix\"></ng-content>\n </ng-container>\n <igx-suffix *ngIf=\"comboInput.value.length\" aria-label=\"Clear Selection\" class=\"igx-combo__clear-button\"\n (click)=\"handleClear($event)\">\n <ng-container *ngIf=\"clearIconTemplate\">\n <ng-container *ngTemplateOutlet=\"clearIconTemplate\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!clearIconTemplate\">\n clear\n </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 (click)=\"onClick($event)\" *ngIf=\"!toggleIconTemplate\">\n {{ dropdown.collapsed ? 'arrow_drop_down' : 'arrow_drop_up'}}\n </igx-icon>\n </igx-suffix>\n</igx-input-group>\n\n<igx-combo-drop-down #igxComboDropDown class=\"igx-combo__drop-down\" [displayDensity]=\"displayDensity\"\n [width]=\"itemsWidth || '100%'\" (opening)=\"handleOpening($event)\" (closing)=\"handleClosing($event)\"\n (opened)=\"handleOpened()\" (closed)=\"handleClosed()\" [singleMode]=\"true\">\n <ng-container *ngTemplateOutlet=\"headerTemplate\">\n </ng-container>\n <div #dropdownItemContainer class=\"igx-combo__content\" [style.overflow]=\"'hidden'\"\n [style.maxHeight.px]=\"itemsMaxHeight\" [igxDropDownItemNavigation]=\"dropdown\" (focus)=\"dropdown.onFocus()\"\n [tabindex]=\"dropdown.collapsed ? -1 : 0\" role=\"listbox\" [attr.id]=\"dropdown.id\">\n <igx-combo-item role=\"option\" [singleMode]=\"true\" [itemHeight]='itemHeight' (click)=\"close()\" *igxFor=\"let item of data\n | comboFiltering:filterValue:displayKey:filteringOptions:true\n | comboGrouping:groupKey:valueKey\n index as rowIndex; containerSize: itemsMaxHeight; scrollOrientation: 'vertical'; itemSize: itemHeight\"\n [value]=\"item\" [isHeader]=\"item.isHeader\" [index]=\"rowIndex\">\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 <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\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 aria-label=\"Add Item\" [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\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>The list is empty</span>\n</ng-template>\n<ng-template #addItemDefault let-control>\n <button igxButton=\"flat\" igxRipple>Add item</button>\n</ng-template>\n<ng-template #headerItemBase let-item let-key=\"valueKey\" let-groupKey=\"groupKey\">\n {{ item[key] }}\n</ng-template>\n",
37000
+ providers: [
37001
+ IgxComboAPIService,
37002
+ { provide: IGX_COMBO_COMPONENT, useExisting: IgxSimpleComboComponent },
37003
+ { provide: NG_VALUE_ACCESSOR, useExisting: IgxSimpleComboComponent, multi: true }
37004
+ ]
37005
+ },] }
37006
+ ];
37007
+ IgxSimpleComboComponent.ctorParameters = () => [
37008
+ { type: ElementRef },
37009
+ { type: ChangeDetectorRef },
37010
+ { type: IgxSelectionAPIService },
37011
+ { type: IgxComboAPIService },
37012
+ { type: IgxIconService },
37013
+ { type: PlatformUtil },
37014
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] },
37015
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [IGX_INPUT_GROUP_TYPE,] }] },
37016
+ { type: Injector, decorators: [{ type: Optional }] }
37017
+ ];
37018
+ IgxSimpleComboComponent.propDecorators = {
37019
+ dropdown: [{ type: ViewChild, args: [IgxComboDropDownComponent, { static: true },] }],
37020
+ selectionChanging: [{ type: Output }]
37021
+ };
37022
+ class IgxSimpleComboModule {
37023
+ }
37024
+ IgxSimpleComboModule.decorators = [
37025
+ { type: NgModule, args: [{
37026
+ declarations: [IgxSimpleComboComponent],
37027
+ imports: [
37028
+ IgxComboModule, IgxRippleModule, CommonModule,
37029
+ IgxInputGroupModule, FormsModule, ReactiveFormsModule,
37030
+ IgxForOfModule, IgxToggleModule, IgxCheckboxModule,
37031
+ IgxDropDownModule, IgxButtonModule, IgxIconModule,
37032
+ IgxTextSelectionModule
37033
+ ],
37034
+ exports: [IgxSimpleComboComponent, IgxComboModule]
37035
+ },] }
37036
+ ];
37037
+
36798
37038
  /** Header orientation in `dialog` mode. */
36799
37039
  const PickerHeaderOrientation = mkenum({
36800
37040
  Horizontal: 'horizontal',
@@ -61325,6 +61565,22 @@ class IgxGridComponent extends IgxGridBaseDirective {
61325
61565
  }
61326
61566
  this._hideGroupedColumns = value;
61327
61567
  }
61568
+ /**
61569
+ * Gets/Sets the grouping strategy of the grid.
61570
+ *
61571
+ * @remarks The default IgxGrouping extends from IgxSorting and a custom one can be used as a `sortStrategy` as well.
61572
+ *
61573
+ * @example
61574
+ * ```html
61575
+ * <igx-grid #grid [data]="localData" [groupStrategy]="groupStrategy"></igx-grid>
61576
+ * ```
61577
+ */
61578
+ get groupStrategy() {
61579
+ return this._groupStrategy;
61580
+ }
61581
+ set groupStrategy(value) {
61582
+ this._groupStrategy = value;
61583
+ }
61328
61584
  /**
61329
61585
  * Gets/Sets the message displayed inside the GroupBy drop area where columns can be dragged on.
61330
61586
  *
@@ -62077,7 +62333,7 @@ IgxGridComponent.decorators = [
62077
62333
  IgxForOfScrollSyncService
62078
62334
  ],
62079
62335
  selector: 'igx-grid',
62080
- template: "<!-- Toolbar area -->\n<ng-content select=\"igx-grid-toolbar\"></ng-content>\n\n<!-- Group-by area -->\n<ng-container *ngIf=\"showGroupArea && (groupingExpressions.length > 0 || hasGroupableColumns)\">\n <igx-grid-group-by-area #groupArea [style.flex-basis.px]='outerWidth'\n [grid]=\"this\"\n [expressions]=\"groupingExpressions\"\n [sortingExpressions]=\"sortingExpressions\"\n [density]=\"displayDensity\"\n [dropAreaTemplate]=\"dropAreaTemplate\"\n [dropAreaMessage]=\"dropAreaMessage\"\n >\n </igx-grid-group-by-area>\n</ng-container>\n\n<!-- Grid table head row area -->\n<igx-grid-header-row class=\"igx-grid-thead\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [density]=\"displayDensity\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (scroll)=\"preventHeaderScroll($event)\"\n (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" [attr.role]=\"dataView.length ? null : 'row'\" (keydown)=\"navigation.handleNavigation($event)\" (focus)=\"navigation.focusTbody($event)\"\n (dragStop)=\"selectionService.dragMode = $event\" (scroll)='preventContainerScroll($event)'\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth || null' #tbody [attr.aria-activedescendant]=\"activeDescendant\">\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template #pinnedRecordsTemplate>\n <ng-container *ngIf='data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridAddRow:true:pipeTrigger\n | gridRowPinning:id:true:pipeTrigger\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger:true\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger:true as pinnedData'>\n <div #pinContainer *ngIf='pinnedData.length > 0'\n [ngClass]=\"{\n 'igx-grid__tr--pinned-bottom': !isRowPinningToTop,\n 'igx-grid__tr--pinned-top': isRowPinningToTop\n }\"\n class='igx-grid__tr--pinned' [style.width.px]='calcWidth'>\n <ng-container *ngFor=\"let rowData of pinnedData; let rowIndex = index\">\n <ng-container *ngTemplateOutlet=\"pinned_record_template; context: getContext(rowData, rowIndex, true)\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger\n | gridGroupBy:groupingExpressions:groupingExpansionState:groupsExpanded:id:groupsRecords:pipeTrigger\n | gridPaging:paginator?.page:paginator?.perPage:id:pipeTrigger\n | gridSummary:hasSummarizedColumns:summaryCalculationMode:summaryPosition:id:showSummaryOnCollapse:pipeTrigger:summaryPipeTrigger\n | gridDetails:hasDetails:expansionStates:pipeTrigger\n | gridAddRow:false:pipeTrigger\n | gridRowPinning:id:false:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight'\n [igxForItemSize]=\"hasColumnLayouts ? rowHeight * multiRowLayoutRowSize + 1 : renderedRowHeight\"\n [igxForTrackBy]='trackChanges'\n #verticalScrollContainer (chunkPreload)=\"dataLoading($event)\">\n <ng-template\n [igxTemplateOutlet]='getRowTemplate(rowData)'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex)'\n (cachedViewLoaded)='cachedViewLoaded($event)'\n (viewCreated)='viewCreatedHandler($event)'\n (viewMoved)='viewMovedHandler($event)'>\n </ng-template>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template #record_template let-rowIndex=\"index\" let-rowData let-disabledRow=\"disabled\">\n <igx-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [rowData]=\"rowData\" [disabled]=\"disabledRow\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-grid-row>\n </ng-template>\n <ng-template #pinned_record_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [rowData]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\"#row #pinnedRow>\n </igx-grid-row>\n </ng-template>\n <ng-template #group_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-groupby-row [gridID]=\"id\" [index]=\"rowIndex\" [groupRow]=\"rowData\" [hideGroupRowSelectors]=\"hideRowSelectors\" [rowDraggable]=\"rowDraggable\" #row>\n </igx-grid-groupby-row>\n </ng-template>\n <ng-template #summary_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-summary-row role=\"row\" [gridID]=\"id\" [summaries]=\"rowData.summaries\" [index]=\"rowIndex\"\n class=\"igx-grid__summaries--body\" #summaryRow>\n </igx-grid-summary-row>\n </ng-template>\n <ng-template #detail_template_container let-rowIndex=\"index\" let-rowData>\n <div detail='true' style=\"overflow: auto; width: 100%;\" id=\"{{id}}_{{rowIndex}}\" (pointerdown)='detailsViewFocused(detailsContainer, rowIndex)' #detailsContainer [attr.data-rowindex]='rowIndex'\n [ngClass]=\"{\n 'igx-grid__tr-container': true,\n 'igx-grid__tr-container--active': isDetailActive(rowIndex)\n }\">\n <div class=\"igx-grid__hierarchical-indent\" style='display: flex;'>\n <ng-container *ngIf=\"this.groupingExpressions.length > 0\">\n <div class=\"igx-grid__row-indentation igx-grid__row-indentation--level-{{groupingExpressions.length}}\"></div>\n </ng-container>\n <ng-template\n [ngTemplateOutlet]='detailTemplate'\n [ngTemplateOutletContext]='getDetailsContext(rowData, rowIndex)'>\n </ng-template>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n <igc-trial-watermark></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div #igxBodyOverlayOutlet=\"overlay-outlet\" igxOverlayOutlet></div>\n</div>\n\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summariesHeight' #tfoot>\n <div tabindex=\"0\" (focus)=\"navigation.focusFirstCell(false)\" (keydown)=\"navigation.summaryNav($event)\" [attr.aria-activedescendant]=\"activeDescendant\">\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summariesHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\" role=\"row\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"dataView.length\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalScroll()' [style.height.px]='summariesHeight'\n [style.width.px]=\"scrollSize\"></div>\n </div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='EMPTY_DATA' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-container *ngIf=\"totalRecords || pagingMode === 1\">\n <ng-content select=\"igx-paginator\"></ng-content>\n </ng-container>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n <button igxButton=\"raised\" igxRipple (click)=\"this.crudService.enterAddRowMode(null, false, $event)\">\n {{resourceStrings.igx_grid_add_row_label}}\n </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<ng-template #defaultExpandedTemplate>\n <igx-icon role=\"button\" class=\"igx-grid__group-expand-btn\"\n [ngClass]=\"{\n 'igx-grid__group-expand-btn--push': filteringService.isFilterRowVisible\n}\">unfold_less</igx-icon>\n</ng-template>\n\n <ng-template #defaultCollapsedTemplate>\n <igx-icon role=\"button\" class=\"igx-grid__group-expand-btn\"\n [ngClass]=\"{\n 'igx-grid__group-expand-btn--push': filteringService.isFilterRowVisible\n}\">unfold_more</igx-icon>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle #rowEditingOverlay>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"rowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row\n</ng-template>\n\n<ng-template #defaultRowEditActions>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(false, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}</button>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(true, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_done }}</button>\n</ng-template>\n\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"this.crudService.row?.getClassName() === 'IgxAddRow' ? rowAddText : rowEditText ? rowEditText : defaultRowEditText;\n context: { $implicit: this.crudService.row?.getClassName() !== 'IgxAddRow' ? rowChangesCount : null }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"rowEditActions ? rowEditActions : defaultRowEditActions; context: { $implicit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon>drag_indicator</igx-icon>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n"
62336
+ template: "<!-- Toolbar area -->\n<ng-content select=\"igx-grid-toolbar\"></ng-content>\n\n<!-- Group-by area -->\n<ng-container *ngIf=\"showGroupArea && (groupingExpressions.length > 0 || hasGroupableColumns)\">\n <igx-grid-group-by-area #groupArea [style.flex-basis.px]='outerWidth'\n [grid]=\"this\"\n [expressions]=\"groupingExpressions\"\n [sortingExpressions]=\"sortingExpressions\"\n [density]=\"displayDensity\"\n [dropAreaTemplate]=\"dropAreaTemplate\"\n [dropAreaMessage]=\"dropAreaMessage\"\n >\n </igx-grid-group-by-area>\n</ng-container>\n\n<!-- Grid table head row area -->\n<igx-grid-header-row class=\"igx-grid-thead\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [density]=\"displayDensity\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (scroll)=\"preventHeaderScroll($event)\"\n (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" [attr.role]=\"dataView.length ? null : 'row'\" (keydown)=\"navigation.handleNavigation($event)\" (focus)=\"navigation.focusTbody($event)\"\n (dragStop)=\"selectionService.dragMode = $event\" (scroll)='preventContainerScroll($event)'\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth || null' #tbody [attr.aria-activedescendant]=\"activeDescendant\">\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template #pinnedRecordsTemplate>\n <ng-container *ngIf='data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridAddRow:true:pipeTrigger\n | gridRowPinning:id:true:pipeTrigger\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger:true\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger:true as pinnedData'>\n <div #pinContainer *ngIf='pinnedData.length > 0'\n [ngClass]=\"{\n 'igx-grid__tr--pinned-bottom': !isRowPinningToTop,\n 'igx-grid__tr--pinned-top': isRowPinningToTop\n }\"\n class='igx-grid__tr--pinned' [style.width.px]='calcWidth'>\n <ng-container *ngFor=\"let rowData of pinnedData; let rowIndex = index\">\n <ng-container *ngTemplateOutlet=\"pinned_record_template; context: getContext(rowData, rowIndex, true)\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger\n | gridGroupBy:groupingExpressions:groupingExpansionState:groupStrategy:groupsExpanded:id:groupsRecords:pipeTrigger\n | gridPaging:paginator?.page:paginator?.perPage:id:pipeTrigger\n | gridSummary:hasSummarizedColumns:summaryCalculationMode:summaryPosition:id:showSummaryOnCollapse:pipeTrigger:summaryPipeTrigger\n | gridDetails:hasDetails:expansionStates:pipeTrigger\n | gridAddRow:false:pipeTrigger\n | gridRowPinning:id:false:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight'\n [igxForItemSize]=\"hasColumnLayouts ? rowHeight * multiRowLayoutRowSize + 1 : renderedRowHeight\"\n [igxForTrackBy]='trackChanges'\n #verticalScrollContainer (chunkPreload)=\"dataLoading($event)\">\n <ng-template\n [igxTemplateOutlet]='getRowTemplate(rowData)'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex)'\n (cachedViewLoaded)='cachedViewLoaded($event)'\n (viewCreated)='viewCreatedHandler($event)'\n (viewMoved)='viewMovedHandler($event)'>\n </ng-template>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template #record_template let-rowIndex=\"index\" let-rowData let-disabledRow=\"disabled\">\n <igx-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [rowData]=\"rowData\" [disabled]=\"disabledRow\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-grid-row>\n </ng-template>\n <ng-template #pinned_record_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [rowData]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\"#row #pinnedRow>\n </igx-grid-row>\n </ng-template>\n <ng-template #group_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-groupby-row [gridID]=\"id\" [index]=\"rowIndex\" [groupRow]=\"rowData\" [hideGroupRowSelectors]=\"hideRowSelectors\" [rowDraggable]=\"rowDraggable\" #row>\n </igx-grid-groupby-row>\n </ng-template>\n <ng-template #summary_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-summary-row role=\"row\" [gridID]=\"id\" [summaries]=\"rowData.summaries\" [index]=\"rowIndex\"\n class=\"igx-grid__summaries--body\" #summaryRow>\n </igx-grid-summary-row>\n </ng-template>\n <ng-template #detail_template_container let-rowIndex=\"index\" let-rowData>\n <div detail='true' style=\"overflow: auto; width: 100%;\" id=\"{{id}}_{{rowIndex}}\" (pointerdown)='detailsViewFocused(detailsContainer, rowIndex)' #detailsContainer [attr.data-rowindex]='rowIndex'\n [ngClass]=\"{\n 'igx-grid__tr-container': true,\n 'igx-grid__tr-container--active': isDetailActive(rowIndex)\n }\">\n <div class=\"igx-grid__hierarchical-indent\" style='display: flex;'>\n <ng-container *ngIf=\"this.groupingExpressions.length > 0\">\n <div class=\"igx-grid__row-indentation igx-grid__row-indentation--level-{{groupingExpressions.length}}\"></div>\n </ng-container>\n <ng-template\n [ngTemplateOutlet]='detailTemplate'\n [ngTemplateOutletContext]='getDetailsContext(rowData, rowIndex)'>\n </ng-template>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n <igc-trial-watermark></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div #igxBodyOverlayOutlet=\"overlay-outlet\" igxOverlayOutlet></div>\n</div>\n\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summariesHeight' #tfoot>\n <div tabindex=\"0\" (focus)=\"navigation.focusFirstCell(false)\" (keydown)=\"navigation.summaryNav($event)\" [attr.aria-activedescendant]=\"activeDescendant\">\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summariesHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\" role=\"row\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"dataView.length\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalScroll()' [style.height.px]='summariesHeight'\n [style.width.px]=\"scrollSize\"></div>\n </div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='EMPTY_DATA' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-container *ngIf=\"totalRecords || pagingMode === 1\">\n <ng-content select=\"igx-paginator\"></ng-content>\n </ng-container>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n <button igxButton=\"raised\" igxRipple (click)=\"this.crudService.enterAddRowMode(null, false, $event)\">\n {{resourceStrings.igx_grid_add_row_label}}\n </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<ng-template #defaultExpandedTemplate>\n <igx-icon role=\"button\" class=\"igx-grid__group-expand-btn\"\n [ngClass]=\"{\n 'igx-grid__group-expand-btn--push': filteringService.isFilterRowVisible\n}\">unfold_less</igx-icon>\n</ng-template>\n\n <ng-template #defaultCollapsedTemplate>\n <igx-icon role=\"button\" class=\"igx-grid__group-expand-btn\"\n [ngClass]=\"{\n 'igx-grid__group-expand-btn--push': filteringService.isFilterRowVisible\n}\">unfold_more</igx-icon>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle #rowEditingOverlay>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"rowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row\n</ng-template>\n\n<ng-template #defaultRowEditActions>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(false, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}</button>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(true, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_done }}</button>\n</ng-template>\n\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"this.crudService.row?.getClassName() === 'IgxAddRow' ? rowAddText : rowEditText ? rowEditText : defaultRowEditText;\n context: { $implicit: this.crudService.row?.getClassName() !== 'IgxAddRow' ? rowChangesCount : null }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"rowEditActions ? rowEditActions : defaultRowEditActions; context: { $implicit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon>drag_indicator</igx-icon>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n"
62081
62337
  },] }
62082
62338
  ];
62083
62339
  IgxGridComponent.propDecorators = {
@@ -62103,6 +62359,7 @@ IgxGridComponent.propDecorators = {
62103
62359
  groupingExpressions: [{ type: Input }],
62104
62360
  groupingExpansionState: [{ type: Input }],
62105
62361
  hideGroupedColumns: [{ type: Input }],
62362
+ groupStrategy: [{ type: Input }],
62106
62363
  dropAreaMessage: [{ type: Input }],
62107
62364
  showGroupArea: [{ type: Input }]
62108
62365
  };
@@ -63625,7 +63882,7 @@ class IgxGridGroupingPipe {
63625
63882
  constructor(gridAPI) {
63626
63883
  this.gridAPI = gridAPI;
63627
63884
  }
63628
- transform(collection, expression, expansion, defaultExpanded, id, groupsRecords, _pipeTrigger) {
63885
+ transform(collection, expression, expansion, groupingStrategy, defaultExpanded, id, groupsRecords, _pipeTrigger) {
63629
63886
  const state = { expressions: [], expansion: [], defaultExpanded };
63630
63887
  const grid = this.gridAPI.grid;
63631
63888
  state.expressions = grid.groupingExpressions;
@@ -63642,7 +63899,7 @@ class IgxGridGroupingPipe {
63642
63899
  else {
63643
63900
  state.expansion = grid.groupingExpansionState;
63644
63901
  state.defaultExpanded = grid.groupsExpanded;
63645
- result = DataUtil.group(cloneArray(collection), state, grid, groupsRecords, fullResult);
63902
+ result = DataUtil.group(cloneArray(collection), state, groupingStrategy, grid, groupsRecords, fullResult);
63646
63903
  }
63647
63904
  grid.groupingFlatResult = result.data;
63648
63905
  grid.groupingResult = fullResult.data;
@@ -72849,30 +73106,35 @@ class IgxToastComponent extends IgxNotificationsDirective {
72849
73106
  * @hidden
72850
73107
  */
72851
73108
  this.isVisibleChange = new EventEmitter();
72852
- /**
72853
- * Sets/gets the position of the toast.
72854
- * If not set, the `position` attribute will have value `IgxToastPosition.Bottom`.
72855
- * ```html
72856
- * <igx-toast [position]="top"></igx-toast>
72857
- * ```
72858
- * ```typescript
72859
- * let toastPosition = this.toast.position;
72860
- * ```
72861
- *
72862
- * @memberof IgxToastComponent
72863
- */
72864
- this.position = 'bottom';
73109
+ this._position = 'bottom';
72865
73110
  this._positionSettings = {
72866
73111
  horizontalDirection: HorizontalAlignment.Center,
72867
- verticalDirection: this.position === 'bottom'
72868
- ? VerticalAlignment.Bottom
72869
- : this.position === 'middle'
72870
- ? VerticalAlignment.Middle
72871
- : VerticalAlignment.Top,
73112
+ verticalDirection: VerticalAlignment.Bottom,
72872
73113
  openAnimation: useAnimation(fadeIn),
72873
73114
  closeAnimation: useAnimation(fadeOut),
72874
73115
  };
72875
73116
  }
73117
+ /**
73118
+ * Sets/gets the position of the toast.
73119
+ * If not set, the `position` attribute will have value `IgxToastPosition.Bottom`.
73120
+ * ```html
73121
+ * <igx-toast [position]="top"></igx-toast>
73122
+ * ```
73123
+ * ```typescript
73124
+ * let toastPosition = this.toast.position;
73125
+ * ```
73126
+ *
73127
+ * @memberof IgxToastComponent
73128
+ */
73129
+ get position() {
73130
+ return this._position;
73131
+ }
73132
+ set position(position) {
73133
+ if (position) {
73134
+ this._position = position;
73135
+ this._positionSettings.verticalDirection = this.calculatePosition();
73136
+ }
73137
+ }
72876
73138
  /**
72877
73139
  * Get the position and animation settings used by the toast.
72878
73140
  * ```typescript
@@ -72925,10 +73187,13 @@ class IgxToastComponent extends IgxNotificationsDirective {
72925
73187
  * this.toast.open();
72926
73188
  * ```
72927
73189
  */
72928
- open(message) {
73190
+ open(message, settings) {
72929
73191
  if (message !== undefined) {
72930
73192
  this.textMessage = message;
72931
73193
  }
73194
+ if (settings !== undefined) {
73195
+ this.positionSettings = settings;
73196
+ }
72932
73197
  this.strategy = new GlobalPositionStrategy(this.positionSettings);
72933
73198
  super.open();
72934
73199
  }
@@ -72960,6 +73225,18 @@ class IgxToastComponent extends IgxNotificationsDirective {
72960
73225
  this.isVisibleChange.emit(closedEventArgs);
72961
73226
  });
72962
73227
  }
73228
+ ngOnChanges(changes) {
73229
+ if (changes['position'] && this._positionSettings) {
73230
+ this._positionSettings.verticalDirection = this.calculatePosition();
73231
+ }
73232
+ }
73233
+ calculatePosition() {
73234
+ return this.position === 'bottom'
73235
+ ? VerticalAlignment.Bottom
73236
+ : this.position === 'middle'
73237
+ ? VerticalAlignment.Middle
73238
+ : VerticalAlignment.Top;
73239
+ }
72963
73240
  }
72964
73241
  IgxToastComponent.decorators = [
72965
73242
  { type: Component, args: [{
@@ -72981,6 +73258,9 @@ IgxToastComponent.propDecorators = {
72981
73258
  position: [{ type: Input }],
72982
73259
  positionSettings: [{ type: Input }]
72983
73260
  };
73261
+ __decorate([
73262
+ DeprecateProperty('`position` is deprecated. We suggest using `positionSettings` property instead.')
73263
+ ], IgxToastComponent.prototype, "position", null);
72984
73264
  /**
72985
73265
  * @hidden
72986
73266
  */
@@ -76374,5 +76654,5 @@ IgxTreeModule.decorators = [
76374
76654
  * Generated bundle index. Do not edit.
76375
76655
  */
76376
76656
 
76377
- export { AbsolutePosition, AbsoluteScrollStrategy, AutoPositionStrategy, BaseFilteringStrategy, BaseProgressDirective, BlockScrollStrategy, ButtonGroupAlignment, Calendar, CalendarHammerConfig, CalendarSelection, CalendarView, CarouselAnimationType, CarouselHammerConfig, CarouselIndicatorsOrientation, CloseScrollStrategy, ColumnDisplayOrder, ColumnPinningPosition, ConnectedPositioningStrategy, ContainerPositionStrategy, CsvFileTypes, DEFAULT_OWNER, DataUtil, DatePart, DateRangePickerFormatPipe, DateRangeType, DefaultSortingStrategy, Direction, DisplayDensity, DisplayDensityBase, DisplayDensityToken, DragDirection, ElasticPositionStrategy, ExpansionPanelHeaderIconPosition, ExportRecordType, FilterListItem, FilterMode, FilteringExpressionsTree, FilteringExpressionsTreeType, FilteringLogic, FilteringStrategy, FormattedValuesFilteringStrategy, GlobalPositionStrategy, GridBaseAPIService, GridColumnDataType, GridInstanceType, GridPagingMode, GridSelectionMode, GridSummaryCalculationMode, GridSummaryPosition, GroupedRecords, HeaderType, HorizontalAlignment, IGX_CHECKBOX_REQUIRED_VALIDATOR, IGX_INPUT_GROUP_TYPE, IGX_SWITCH_REQUIRED_VALIDATOR, ITreeGridAggregation, IgxAccordionComponent, IgxAccordionModule, IgxActionStripComponent, IgxActionStripModule, IgxAppendDropStrategy, IgxAutocompleteDirective, IgxAutocompleteModule, IgxAvatarComponent, IgxAvatarModule, IgxAvatarSize, IgxAvatarType, IgxBadgeComponent, IgxBadgeModule, IgxBadgeType, IgxBannerComponent, IgxBannerModule, IgxBaseExporter, IgxBaseTransactionService, IgxBooleanFilteringOperand, IgxBottomNavComponent, IgxBottomNavContentComponent, IgxBottomNavHeaderComponent, IgxBottomNavHeaderIconDirective, IgxBottomNavHeaderLabelDirective, IgxBottomNavItemComponent, IgxBottomNavModule, IgxButtonDirective, IgxButtonGroupComponent, IgxButtonGroupModule, IgxButtonModule, IgxCSVTextDirective, IgxCalendarBaseDirective, IgxCalendarComponent, IgxCalendarHeaderTemplateDirective, IgxCalendarModule, IgxCalendarMonthDirective, IgxCalendarScrollMonthDirective, IgxCalendarSubheaderTemplateDirective, IgxCalendarView, IgxCalendarYearDirective, IgxCardActionsComponent, IgxCardActionsLayout, IgxCardComponent, IgxCardContentDirective, IgxCardFooterDirective, IgxCardHeaderComponent, IgxCardHeaderSubtitleDirective, IgxCardHeaderTitleDirective, IgxCardMediaDirective, IgxCardModule, IgxCardThumbnailDirective, IgxCardType, IgxCarouselComponent, IgxCarouselComponentBase, IgxCarouselModule, IgxCellEditorTemplateDirective, IgxCellFooterTemplateDirective, IgxCellHeaderTemplateDirective, IgxCellTemplateDirective, IgxCheckboxComponent, IgxCheckboxModule, IgxCheckboxRequiredDirective, IgxChipComponent, IgxChipsAreaComponent, IgxChipsModule, IgxCircularProgressBarComponent, IgxCollapsibleIndicatorTemplateDirective, IgxColumnActionsBaseDirective, IgxColumnActionsComponent, IgxColumnActionsModule, IgxColumnComponent, IgxColumnGroupComponent, IgxColumnLayoutComponent, IgxComboComponent, IgxComboModule, IgxComboState, IgxCsvExporterOptions, IgxCsvExporterService, IgxDataLoadingTemplateDirective, IgxDataRecordSorting, IgxDateFilteringOperand, IgxDatePickerComponent, IgxDatePickerModule, IgxDateRangeEndComponent, IgxDateRangeInputsBaseComponent, IgxDateRangePickerComponent, IgxDateRangePickerModule, IgxDateRangeSeparatorDirective, IgxDateRangeStartComponent, IgxDateSummaryOperand, IgxDateTimeEditorDirective, IgxDateTimeEditorModule, IgxDateTimeFilteringOperand, IgxDaysViewComponent, IgxDefaultDropStrategy, IgxDialogComponent, IgxDialogModule, IgxDisplayDensityModule, IgxDividerDirective, IgxDividerModule, IgxDividerType, IgxDragDirective, IgxDragDropModule, IgxDragHandleDirective, IgxDragIgnoreDirective, IgxDragLocation, IgxDropDirective, IgxDropDownBaseDirective, IgxDropDownComponent, IgxDropDownGroupComponent, IgxDropDownItemBaseDirective, IgxDropDownItemComponent, IgxDropDownItemNavigationDirective, IgxDropDownModule, IgxEmptyListTemplateDirective, IgxExcelExporterOptions, IgxExcelExporterService, IgxExcelStyleClearFiltersComponent, IgxExcelStyleColumnOperationsTemplateDirective, IgxExcelStyleConditionalFilterComponent, IgxExcelStyleFilterOperationsTemplateDirective, IgxExcelStyleHeaderComponent, IgxExcelStyleHeaderIconDirective, IgxExcelStyleHidingComponent, IgxExcelStyleLoadingValuesTemplateDirective, IgxExcelStyleMovingComponent, IgxExcelStylePinningComponent, IgxExcelStyleSearchComponent, IgxExcelStyleSelectingComponent, IgxExcelStyleSortingComponent, IgxExcelTextDirective, IgxExpansionPanelBodyComponent, IgxExpansionPanelComponent, IgxExpansionPanelHeaderComponent, IgxExpansionPanelModule, IgxExporterOptionsBase, IgxFilterCellTemplateDirective, IgxFilterDirective, IgxFilterModule, IgxFilterOptions, IgxFilterPipe, IgxFilteringOperand, IgxFlatTransactionFactory, IgxFlexDirective, IgxFocusDirective, IgxFocusModule, IgxForOfContext, IgxForOfDirective, IgxForOfModule, IgxGridAPIService, IgxGridActionsBaseDirective, IgxGridBaseDirective, IgxGridBodyDirective, IgxGridCell, IgxGridCommonModule, IgxGridComponent, IgxGridDetailTemplateDirective, IgxGridEditingActionsComponent, IgxGridExcelStyleFilteringComponent, IgxGridForOfDirective, IgxGridHierarchicalPagingPipe, IgxGridHierarchicalPipe, IgxGridModule, IgxGridPinningActionsComponent, IgxGridRow, IgxGridStateDirective, IgxGridStateModule, IgxGridToolbarActionsDirective, IgxGridToolbarAdvancedFilteringComponent, IgxGridToolbarComponent, IgxGridToolbarDirective, IgxGridToolbarExporterComponent, IgxGridToolbarHidingComponent, IgxGridToolbarPinningComponent, IgxGridToolbarTitleDirective, IgxGridTransaction, IgxGroupAreaDropDirective, IgxGroupByRow, IgxGroupByRowTemplateDirective, IgxGroupedTreeGridSorting, IgxGrouping, IgxHeaderCollapseIndicatorDirective, IgxHeaderExpandIndicatorDirective, IgxHierarchicalGridAPIService, IgxHierarchicalGridBaseDirective, IgxHierarchicalGridComponent, IgxHierarchicalGridModule, IgxHierarchicalGridRow, IgxHierarchicalTransactionFactory, IgxHierarchicalTransactionService, IgxHierarchicalTransactionServiceFactory, IgxHintDirective, IgxIconComponent, IgxIconModule, IgxIconService, IgxInputDirective, IgxInputGroupComponent, IgxInputGroupModule, IgxInputState, IgxInsertDropStrategy, IgxLabelDirective, IgxLayoutDirective, IgxLayoutModule, IgxLinearProgressBarComponent, IgxListActionDirective, IgxListBaseDirective, IgxListComponent, IgxListItemComponent, IgxListItemLeftPanningTemplateDirective, IgxListItemRightPanningTemplateDirective, IgxListLineDirective, IgxListLineSubTitleDirective, IgxListLineTitleDirective, IgxListModule, IgxListPanState, IgxListThumbnailDirective, IgxMaskDirective, IgxMaskModule, IgxMonthPickerBaseDirective, IgxMonthPickerComponent, IgxMonthsViewComponent, IgxNavDrawerItemDirective, IgxNavDrawerMiniTemplateDirective, IgxNavDrawerTemplateDirective, IgxNavbarActionDirective, IgxNavbarComponent, IgxNavbarModule, IgxNavbarTitleDirective, IgxNavigationCloseDirective, IgxNavigationDrawerComponent, IgxNavigationDrawerModule, IgxNavigationModule, IgxNavigationService, IgxNavigationToggleDirective, IgxNumberFilteringOperand, IgxNumberSummaryOperand, IgxOverlayOutletDirective, IgxOverlayService, IgxPageNavigationComponent, IgxPageSizeSelectorComponent, IgxPaginatorComponent, IgxPaginatorDirective, IgxPaginatorModule, IgxPaginatorTemplateDirective, IgxPickerActionsDirective, IgxPickerClearComponent, IgxPickerToggleComponent, IgxPickersCommonModule, IgxPrefixDirective, IgxPrefixModule, IgxPrependDropStrategy, IgxProgressBarModule, IgxProgressType, IgxRadioComponent, IgxRadioGroupDirective, IgxRadioModule, IgxRippleDirective, IgxRippleModule, IgxRowCollapsedIndicatorDirective, IgxRowExpandedIndicatorDirective, IgxRowIslandAPIService, IgxRowIslandComponent, IgxSelectComponent, IgxSelectFooterDirective, IgxSelectGroupComponent, IgxSelectHeaderDirective, IgxSelectItemComponent, IgxSelectModule, IgxSelectToggleIconDirective, IgxSlideComponent, IgxSliderComponent, IgxSliderModule, IgxSliderType, IgxSnackbarComponent, IgxSnackbarModule, IgxSorting, IgxSplitterComponent, IgxSplitterModule, IgxSplitterPaneComponent, IgxStringFilteringOperand, IgxSuffixDirective, IgxSuffixModule, IgxSummaryOperand, IgxSummaryRow, IgxSwitchComponent, IgxSwitchModule, IgxSwitchRequiredDirective, IgxTabContentComponent, IgxTabContentDirective, IgxTabHeaderComponent, IgxTabHeaderDirective, IgxTabHeaderIconDirective, IgxTabHeaderLabelDirective, IgxTabItemComponent, IgxTabItemDirective, IgxTabsAlignment, IgxTabsComponent, IgxTabsDirective, IgxTabsModule, IgxTextAlign, IgxTextHighlightDirective, IgxTextHighlightModule, IgxTextSelectionDirective, IgxTextSelectionModule, IgxThumbFromTemplateDirective, IgxThumbToTemplateDirective, IgxTickLabelTemplateDirective, IgxTimeFilteringOperand, IgxTimePickerComponent, IgxTimePickerModule, IgxTimeSummaryOperand, IgxToastComponent, IgxToastModule, IgxToastPosition, IgxToggleActionDirective, IgxToggleDirective, IgxToggleModule, IgxTooltipDirective, IgxTooltipModule, IgxTooltipTargetDirective, IgxTransactionService, IgxTreeComponent, IgxTreeExpandIndicatorDirective, IgxTreeGridAPIService, IgxTreeGridComponent, IgxTreeGridGroupingPipe, IgxTreeGridModule, IgxTreeGridRow, IgxTreeModule, IgxTreeNodeComponent, IgxTreeNodeLinkDirective, IgxTreeSelectMarkerDirective, IgxTreeSelectionType, IgxYearsViewComponent, LabelPosition, NoOpScrollStrategy, NoopFilteringStrategy, NoopSortingStrategy, PagingError, PickerInteractionMode, Point, RadioGroupAlignment, RadioLabelPosition, RelativePosition, RelativePositionStrategy, RowEditPositionStrategy, RowPinningPosition, ScrollMonth, ScrollStrategy, SliderHandle, SortingDirection, SplitterType, SwitchLabelPosition, TickLabelsOrientation, TicksOrientation, TransactionEventOrigin, TransactionType, TreeGridFilteringStrategy, TreeGridFormattedValuesFilteringStrategy, TreeGridMatchingRecordsOnlyFilteringStrategy, VerticalAlignment, WEEKDAYS, blink, changei18n, fadeIn, fadeOut, filteringStateDefaults, flipBottom, flipHorBck, flipHorFwd, flipLeft, flipRight, flipTop, flipVerBck, flipVerFwd, getCurrentResourceStrings, getTypeNameForDebugging, growVerIn, growVerOut, heartbeat, hierarchicalTransactionServiceFactory, isDateInRanges, isLeap, monthRange, pulsateBck, pulsateFwd, range, rotateInBl, rotateInBottom, rotateInBr, rotateInCenter, rotateInDiagonal1, rotateInDiagonal2, rotateInHor, rotateInLeft, rotateInRight, rotateInTl, rotateInTop, rotateInTr, rotateInVer, rotateOutBl, rotateOutBottom, rotateOutBr, rotateOutCenter, rotateOutDiagonal1, rotateOutDiagonal2, rotateOutHor, rotateOutLeft, rotateOutRight, rotateOutTl, rotateOutTop, rotateOutTr, rotateOutVer, scaleInBl, scaleInBottom, scaleInBr, scaleInCenter, scaleInHorCenter, scaleInHorLeft, scaleInHorRight, scaleInLeft, scaleInRight, scaleInTl, scaleInTop, scaleInTr, scaleInVerBottom, scaleInVerCenter, scaleInVerTop, scaleOutBl, scaleOutBottom, scaleOutBr, scaleOutCenter, scaleOutHorCenter, scaleOutHorLeft, scaleOutHorRight, scaleOutLeft, scaleOutRight, scaleOutTl, scaleOutTop, scaleOutTr, scaleOutVerBottom, scaleOutVerCenter, scaleOutVerTop, shakeBl, shakeBottom, shakeBr, shakeCenter, shakeHor, shakeLeft, shakeRight, shakeTl, shakeTop, shakeTr, shakeVer, slideInBl, slideInBottom, slideInBr, slideInLeft, slideInRight, slideInTl, slideInTop, slideInTr, slideOutBl, slideOutBottom, slideOutBr, slideOutLeft, slideOutRight, slideOutTl, slideOutTop, slideOutTr, swingInBottomBck, swingInBottomFwd, swingInLeftBck, swingInLeftFwd, swingInRightBck, swingInRightFwd, swingInTopBck, swingInTopFwd, swingOutBottomBck, swingOutBottomFwd, swingOutLeftBck, swingOutLefttFwd, swingOutRightBck, swingOutRightFwd, swingOutTopBck, swingOutTopFwd, toPercent, valueInRange, weekDay, ɵ1, ɵ2, IgxActionStripMenuItemDirective as ɵa, IGX_DROPDOWN_BASE as ɵb, IgxGridActionButtonComponent as ɵba, ToggleAnimationPlayer as ɵbb, IgxExpansionPanelTitleDirective as ɵbc, IgxExpansionPanelDescriptionDirective as ɵbd, IgxExpansionPanelIconDirective as ɵbe, IgxBannerActionsDirective as ɵbf, IgxDaysViewNavigationService as ɵbg, IgxDayItemComponent as ɵbh, IgxMonthViewSlotsCalendar as ɵbi, IgxGetViewDateCalendar as ɵbj, IgxCarouselIndicatorDirective as ɵbk, IgxCarouselNextButtonDirective as ɵbl, IgxCarouselPrevButtonDirective as ɵbm, IgxComboAPIService as ɵbn, IGX_COMBO_COMPONENT as ɵbo, IgxComboDropDownComponent as ɵbq, IgxComboItemComponent as ɵbr, IgxComboHeaderDirective as ɵbs, IgxComboFooterDirective as ɵbt, IgxComboItemDirective as ɵbu, IgxComboEmptyDirective as ɵbv, IgxComboHeaderItemDirective as ɵbw, IgxComboAddItemDirective as ɵbx, IgxComboToggleIconDirective as ɵby, IgxComboClearIconDirective as ɵbz, IgxComboFilteringPipe as ɵca, IgxComboGroupingPipe as ɵcb, IgxComboAddItemComponent as ɵcc, PickerBaseDirective as ɵcd, IgxCalendarContainerComponent as ɵce, IgxCalendarContainerModule as ɵcf, IgxDialogTitleDirective as ɵcg, IgxDialogActionsDirective as ɵch, IgxCellCrudState as ɵci, IgxRowCrudState as ɵcj, IgxRowAddCrudState as ɵck, IgxGridCRUDService as ɵcl, IgxColumnMovingService as ɵcm, IgxExcelStyleCustomDialogComponent as ɵcn, IgxExcelStyleDefaultExpressionComponent as ɵco, IgxExcelStyleDateExpressionComponent as ɵcp, HammerGesturesManager as ɵcq, WatchChanges as ɵcr, WatchColumnChanges as ɵcs, notifyChanges as ɵct, IgxNotificationsDirective as ɵcu, IgxGridColumnResizerComponent as ɵcv, IgxColumnResizerDirective as ɵcw, IgxColumnResizingService as ɵcx, IgxRowSelectorDirective as ɵcy, IgxGroupByRowSelectorDirective as ɵcz, IgxGridSelectionService as ɵd, IgxHeadSelectorDirective as ɵda, IgxRowDragDirective as ɵdb, IgxDragIndicatorIconDirective as ɵdc, IgxRowDragGhostDirective as ɵdd, IgxRowDragModule as ɵde, IgxGridHeaderRowComponent as ɵdf, IgxGridHeaderGroupComponent as ɵdg, IgxGridHeaderComponent as ɵdh, IgxGridFilteringCellComponent as ɵdi, IgxFilteringService as ɵdj, IgxGridFilteringRowComponent as ɵdk, IgxGridGroupByAreaComponent as ɵdl, IgxGroupByAreaDirective as ɵdm, IgxGroupByMetaPipe as ɵdn, IgxTemplateOutletDirective as ɵdo, IgxTemplateOutletModule as ɵdp, IgxRowEditTemplateDirective as ɵdq, IgxRowEditTextDirective as ɵdr, IgxRowAddTextDirective as ɵds, IgxRowEditActionsDirective as ɵdt, IgxRowEditTabStopDirective as ɵdu, IgxSummaryRowComponent as ɵdv, IgxSummaryCellComponent as ɵdw, IgxRowDirective as ɵdx, IgxGridNavigationService as ɵdy, IgxGridSummaryService as ɵdz, ConnectedPositioningStrategy as ɵea, IgxGridGroupByRowComponent as ɵeb, IgxTreeGridSelectionService as ɵec, IgxTreeGridGroupByAreaComponent as ɵed, IgxRowLoadingIndicatorTemplateDirective as ɵee, IgxHierarchicalGridNavigationService as ɵef, IgxChildGridRowComponent as ɵeg, IgxGridCellComponent as ɵeh, IgxGridFooterComponent as ɵei, IgxAdvancedFilteringDialogComponent as ɵej, IgxColumnHidingDirective as ɵek, IgxColumnPinningDirective as ɵel, IgxGridSharedModules as ɵem, IgxProcessBarTextTemplateDirective as ɵen, IgxProgressBarGradientDirective as ɵeo, DIR_DOCUMENT_FACTORY as ɵep, DIR_DOCUMENT as ɵeq, IgxDirectionality as ɵer, IgxSelectItemNavigationDirective as ɵes, IGX_TIME_PICKER_COMPONENT as ɵet, IgxItemListDirective as ɵev, IgxTimeItemDirective as ɵew, IgxTimePickerTemplateDirective as ɵex, IgxTimePickerActionsDirective as ɵey, TimeFormatPipe as ɵez, IGX_EXPANSION_PANEL_COMPONENT as ɵf, TimeItemPipe as ɵfa, IgxGridPipesModule as ɵfb, IgxGridCellStyleClassesPipe as ɵfc, IgxGridCellStylesPipe as ɵfd, IgxGridRowClassesPipe as ɵfe, IgxGridRowStylesPipe as ɵff, IgxGridNotGroupedPipe as ɵfg, IgxGridTopLevelColumns as ɵfh, IgxGridFilterConditionPipe as ɵfi, IgxGridTransactionPipe as ɵfj, IgxGridPaginatorOptionsPipe as ɵfk, IgxHasVisibleColumnsPipe as ɵfl, IgxGridRowPinningPipe as ɵfm, IgxColumnActionEnabledPipe as ɵfn, IgxFilterActionColumnsPipe as ɵfo, IgxSortActionColumnsPipe as ɵfp, IgxGridDataMapperPipe as ɵfq, IgxStringReplacePipe as ɵfr, IgxGridTransactionStatePipe as ɵfs, IgxColumnFormatterPipe as ɵft, IgxSummaryFormatterPipe as ɵfu, IgxGridAddRowPipe as ɵfv, IgxHeaderGroupWidthPipe as ɵfw, IgxHeaderGroupStylePipe as ɵfx, IgxGridColumnModule as ɵfy, IgxGridHeadersModule as ɵfz, IGX_TREE_COMPONENT as ɵg, SortingIndexPipe as ɵga, IgxGridFilteringModule as ɵgb, IgxColumnMovingModule as ɵgc, IgxColumnMovingDropDirective as ɵgd, IgxColumnMovingDragDirective as ɵge, IgxGridResizingModule as ɵgf, IgxResizeHandleDirective as ɵgg, IgxGridExcelStyleFilteringModule as ɵgh, IgxGridSelectionModule as ɵgi, IgxGridDragSelectDirective as ɵgj, IgxGridSummaryModule as ɵgk, IgxSummaryDataPipe as ɵgl, IgxGridToolbarModule as ɵgm, BaseToolbarDirective as ɵgn, BaseToolbarColumnActionsDirective as ɵgo, IgxGridRowComponent as ɵgp, IgxGridSortingPipe as ɵgq, IgxGridGroupingPipe as ɵgr, IgxGridPagingPipe as ɵgs, IgxGridFilteringPipe as ɵgt, IgxGridSummaryPipe as ɵgu, IgxGridDetailsPipe as ɵgv, IgxGridExpandableCellComponent as ɵgw, IgxTreeGridRowComponent as ɵgx, IgxTreeGridCellComponent as ɵgy, IgxTreeGridHierarchizingPipe as ɵgz, IGX_TREE_NODE_COMPONENT as ɵh, IgxTreeGridFlatteningPipe as ɵha, IgxTreeGridSortingPipe as ɵhb, IgxTreeGridPagingPipe as ɵhc, IgxTreeGridTransactionPipe as ɵhd, IgxTreeGridNormalizeRecordsPipe as ɵhe, IgxTreeGridAddRowPipe as ɵhf, IgxTreeGridFilteringPipe as ɵhg, IgxTreeGridSummaryPipe as ɵhh, IgxHierarchicalRowComponent as ɵhi, IgxHierarchicalGridCellComponent as ɵhj, IgxSliderThumbComponent as ɵhk, IgxThumbLabelComponent as ɵhl, IgxTicksComponent as ɵhm, IgxTickLabelsPipe as ɵhn, IgxTabsBase as ɵho, IgxTabHeaderBase as ɵhp, IgxTabContentBase as ɵhq, IgxSplitBarComponent as ɵhr, IgxTreeService as ɵhs, IgxTreeSelectionService as ɵht, IgxTreeNavigationService as ɵhu, PlatformUtil as ɵi, EaseIn as ɵj, EaseOut as ɵk, IgxInputGroupBase as ɵl, IgxSelectionAPIService as ɵm, IgxForOfSyncService as ɵn, IgxForOfScrollSyncService as ɵo, DisplayContainerComponent as ɵp, IgxScrollInertiaDirective as ɵq, IgxScrollInertiaModule as ɵr, VirtualHelperComponent as ɵs, VirtualHelperBaseDirective as ɵt, HVirtualHelperComponent as ɵu, MaskParsingService as ɵv, DeprecateMethod as ɵw, DeprecateProperty as ɵx, isHierarchyMatch as ɵy, getHierarchy as ɵz };
76657
+ export { AbsolutePosition, AbsoluteScrollStrategy, AutoPositionStrategy, BaseFilteringStrategy, BaseProgressDirective, BlockScrollStrategy, ButtonGroupAlignment, Calendar, CalendarHammerConfig, CalendarSelection, CalendarView, CarouselAnimationType, CarouselHammerConfig, CarouselIndicatorsOrientation, CloseScrollStrategy, ColumnDisplayOrder, ColumnPinningPosition, ConnectedPositioningStrategy, ContainerPositionStrategy, CsvFileTypes, DEFAULT_OWNER, DataUtil, DatePart, DateRangePickerFormatPipe, DateRangeType, DefaultSortingStrategy, Direction, DisplayDensity, DisplayDensityBase, DisplayDensityToken, DragDirection, ElasticPositionStrategy, ExpansionPanelHeaderIconPosition, ExportRecordType, FilterListItem, FilterMode, FilteringExpressionsTree, FilteringExpressionsTreeType, FilteringLogic, FilteringStrategy, FormattedValuesFilteringStrategy, GlobalPositionStrategy, GridBaseAPIService, GridColumnDataType, GridInstanceType, GridPagingMode, GridSelectionMode, GridSummaryCalculationMode, GridSummaryPosition, GroupedRecords, HeaderType, HorizontalAlignment, IGX_CHECKBOX_REQUIRED_VALIDATOR, IGX_INPUT_GROUP_TYPE, IGX_SWITCH_REQUIRED_VALIDATOR, ITreeGridAggregation, IgxAccordionComponent, IgxAccordionModule, IgxActionStripComponent, IgxActionStripModule, IgxAppendDropStrategy, IgxAutocompleteDirective, IgxAutocompleteModule, IgxAvatarComponent, IgxAvatarModule, IgxAvatarSize, IgxAvatarType, IgxBadgeComponent, IgxBadgeModule, IgxBadgeType, IgxBannerComponent, IgxBannerModule, IgxBaseExporter, IgxBaseTransactionService, IgxBooleanFilteringOperand, IgxBottomNavComponent, IgxBottomNavContentComponent, IgxBottomNavHeaderComponent, IgxBottomNavHeaderIconDirective, IgxBottomNavHeaderLabelDirective, IgxBottomNavItemComponent, IgxBottomNavModule, IgxButtonDirective, IgxButtonGroupComponent, IgxButtonGroupModule, IgxButtonModule, IgxCSVTextDirective, IgxCalendarBaseDirective, IgxCalendarComponent, IgxCalendarHeaderTemplateDirective, IgxCalendarModule, IgxCalendarMonthDirective, IgxCalendarScrollMonthDirective, IgxCalendarSubheaderTemplateDirective, IgxCalendarView, IgxCalendarYearDirective, IgxCardActionsComponent, IgxCardActionsLayout, IgxCardComponent, IgxCardContentDirective, IgxCardFooterDirective, IgxCardHeaderComponent, IgxCardHeaderSubtitleDirective, IgxCardHeaderTitleDirective, IgxCardMediaDirective, IgxCardModule, IgxCardThumbnailDirective, IgxCardType, IgxCarouselComponent, IgxCarouselComponentBase, IgxCarouselModule, IgxCellEditorTemplateDirective, IgxCellFooterTemplateDirective, IgxCellHeaderTemplateDirective, IgxCellTemplateDirective, IgxCheckboxComponent, IgxCheckboxModule, IgxCheckboxRequiredDirective, IgxChipComponent, IgxChipsAreaComponent, IgxChipsModule, IgxCircularProgressBarComponent, IgxCollapsibleIndicatorTemplateDirective, IgxColumnActionsBaseDirective, IgxColumnActionsComponent, IgxColumnActionsModule, IgxColumnComponent, IgxColumnGroupComponent, IgxColumnLayoutComponent, IgxComboComponent, IgxComboModule, IgxCsvExporterOptions, IgxCsvExporterService, IgxDataLoadingTemplateDirective, IgxDataRecordSorting, IgxDateFilteringOperand, IgxDatePickerComponent, IgxDatePickerModule, IgxDateRangeEndComponent, IgxDateRangeInputsBaseComponent, IgxDateRangePickerComponent, IgxDateRangePickerModule, IgxDateRangeSeparatorDirective, IgxDateRangeStartComponent, IgxDateSummaryOperand, IgxDateTimeEditorDirective, IgxDateTimeEditorModule, IgxDateTimeFilteringOperand, IgxDaysViewComponent, IgxDefaultDropStrategy, IgxDialogComponent, IgxDialogModule, IgxDisplayDensityModule, IgxDividerDirective, IgxDividerModule, IgxDividerType, IgxDragDirective, IgxDragDropModule, IgxDragHandleDirective, IgxDragIgnoreDirective, IgxDragLocation, IgxDropDirective, IgxDropDownBaseDirective, IgxDropDownComponent, IgxDropDownGroupComponent, IgxDropDownItemBaseDirective, IgxDropDownItemComponent, IgxDropDownItemNavigationDirective, IgxDropDownModule, IgxEmptyListTemplateDirective, IgxExcelExporterOptions, IgxExcelExporterService, IgxExcelStyleClearFiltersComponent, IgxExcelStyleColumnOperationsTemplateDirective, IgxExcelStyleConditionalFilterComponent, IgxExcelStyleFilterOperationsTemplateDirective, IgxExcelStyleHeaderComponent, IgxExcelStyleHeaderIconDirective, IgxExcelStyleHidingComponent, IgxExcelStyleLoadingValuesTemplateDirective, IgxExcelStyleMovingComponent, IgxExcelStylePinningComponent, IgxExcelStyleSearchComponent, IgxExcelStyleSelectingComponent, IgxExcelStyleSortingComponent, IgxExcelTextDirective, IgxExpansionPanelBodyComponent, IgxExpansionPanelComponent, IgxExpansionPanelHeaderComponent, IgxExpansionPanelModule, IgxExporterOptionsBase, IgxFilterCellTemplateDirective, IgxFilterDirective, IgxFilterModule, IgxFilterOptions, IgxFilterPipe, IgxFilteringOperand, IgxFlatTransactionFactory, IgxFlexDirective, IgxFocusDirective, IgxFocusModule, IgxForOfContext, IgxForOfDirective, IgxForOfModule, IgxGridAPIService, IgxGridActionsBaseDirective, IgxGridBaseDirective, IgxGridBodyDirective, IgxGridCell, IgxGridCommonModule, IgxGridComponent, IgxGridDetailTemplateDirective, IgxGridEditingActionsComponent, IgxGridExcelStyleFilteringComponent, IgxGridForOfDirective, IgxGridHierarchicalPagingPipe, IgxGridHierarchicalPipe, IgxGridModule, IgxGridPinningActionsComponent, IgxGridRow, IgxGridStateDirective, IgxGridStateModule, IgxGridToolbarActionsDirective, IgxGridToolbarAdvancedFilteringComponent, IgxGridToolbarComponent, IgxGridToolbarDirective, IgxGridToolbarExporterComponent, IgxGridToolbarHidingComponent, IgxGridToolbarPinningComponent, IgxGridToolbarTitleDirective, IgxGridTransaction, IgxGroupAreaDropDirective, IgxGroupByRow, IgxGroupByRowTemplateDirective, IgxGroupedTreeGridSorting, IgxGrouping, IgxHeaderCollapseIndicatorDirective, IgxHeaderExpandIndicatorDirective, IgxHierarchicalGridAPIService, IgxHierarchicalGridBaseDirective, IgxHierarchicalGridComponent, IgxHierarchicalGridModule, IgxHierarchicalGridRow, IgxHierarchicalTransactionFactory, IgxHierarchicalTransactionService, IgxHierarchicalTransactionServiceFactory, IgxHintDirective, IgxIconComponent, IgxIconModule, IgxIconService, IgxInputDirective, IgxInputGroupComponent, IgxInputGroupModule, IgxInputState, IgxInsertDropStrategy, IgxLabelDirective, IgxLayoutDirective, IgxLayoutModule, IgxLinearProgressBarComponent, IgxListActionDirective, IgxListBaseDirective, IgxListComponent, IgxListItemComponent, IgxListItemLeftPanningTemplateDirective, IgxListItemRightPanningTemplateDirective, IgxListLineDirective, IgxListLineSubTitleDirective, IgxListLineTitleDirective, IgxListModule, IgxListPanState, IgxListThumbnailDirective, IgxMaskDirective, IgxMaskModule, IgxMonthPickerBaseDirective, IgxMonthPickerComponent, IgxMonthsViewComponent, IgxNavDrawerItemDirective, IgxNavDrawerMiniTemplateDirective, IgxNavDrawerTemplateDirective, IgxNavbarActionDirective, IgxNavbarComponent, IgxNavbarModule, IgxNavbarTitleDirective, IgxNavigationCloseDirective, IgxNavigationDrawerComponent, IgxNavigationDrawerModule, IgxNavigationModule, IgxNavigationService, IgxNavigationToggleDirective, IgxNumberFilteringOperand, IgxNumberSummaryOperand, IgxOverlayOutletDirective, IgxOverlayService, IgxPageNavigationComponent, IgxPageSizeSelectorComponent, IgxPaginatorComponent, IgxPaginatorDirective, IgxPaginatorModule, IgxPaginatorTemplateDirective, IgxPickerActionsDirective, IgxPickerClearComponent, IgxPickerToggleComponent, IgxPickersCommonModule, IgxPrefixDirective, IgxPrefixModule, IgxPrependDropStrategy, IgxProgressBarModule, IgxProgressType, IgxRadioComponent, IgxRadioGroupDirective, IgxRadioModule, IgxRippleDirective, IgxRippleModule, IgxRowCollapsedIndicatorDirective, IgxRowExpandedIndicatorDirective, IgxRowIslandAPIService, IgxRowIslandComponent, IgxSelectComponent, IgxSelectFooterDirective, IgxSelectGroupComponent, IgxSelectHeaderDirective, IgxSelectItemComponent, IgxSelectModule, IgxSelectToggleIconDirective, IgxSimpleComboComponent, IgxSimpleComboModule, IgxSlideComponent, IgxSliderComponent, IgxSliderModule, IgxSliderType, IgxSnackbarComponent, IgxSnackbarModule, IgxSorting, IgxSplitterComponent, IgxSplitterModule, IgxSplitterPaneComponent, IgxStringFilteringOperand, IgxSuffixDirective, IgxSuffixModule, IgxSummaryOperand, IgxSummaryRow, IgxSwitchComponent, IgxSwitchModule, IgxSwitchRequiredDirective, IgxTabContentComponent, IgxTabContentDirective, IgxTabHeaderComponent, IgxTabHeaderDirective, IgxTabHeaderIconDirective, IgxTabHeaderLabelDirective, IgxTabItemComponent, IgxTabItemDirective, IgxTabsAlignment, IgxTabsComponent, IgxTabsDirective, IgxTabsModule, IgxTextAlign, IgxTextHighlightDirective, IgxTextHighlightModule, IgxTextSelectionDirective, IgxTextSelectionModule, IgxThumbFromTemplateDirective, IgxThumbToTemplateDirective, IgxTickLabelTemplateDirective, IgxTimeFilteringOperand, IgxTimePickerComponent, IgxTimePickerModule, IgxTimeSummaryOperand, IgxToastComponent, IgxToastModule, IgxToastPosition, IgxToggleActionDirective, IgxToggleDirective, IgxToggleModule, IgxTooltipDirective, IgxTooltipModule, IgxTooltipTargetDirective, IgxTransactionService, IgxTreeComponent, IgxTreeExpandIndicatorDirective, IgxTreeGridAPIService, IgxTreeGridComponent, IgxTreeGridGroupingPipe, IgxTreeGridModule, IgxTreeGridRow, IgxTreeModule, IgxTreeNodeComponent, IgxTreeNodeLinkDirective, IgxTreeSelectMarkerDirective, IgxTreeSelectionType, IgxYearsViewComponent, LabelPosition, NoOpScrollStrategy, NoopFilteringStrategy, NoopSortingStrategy, PagingError, PickerInteractionMode, Point, RadioGroupAlignment, RadioLabelPosition, RelativePosition, RelativePositionStrategy, RowEditPositionStrategy, RowPinningPosition, ScrollMonth, ScrollStrategy, SliderHandle, SortingDirection, SplitterType, SwitchLabelPosition, TickLabelsOrientation, TicksOrientation, TransactionEventOrigin, TransactionType, TreeGridFilteringStrategy, TreeGridFormattedValuesFilteringStrategy, TreeGridMatchingRecordsOnlyFilteringStrategy, VerticalAlignment, WEEKDAYS, blink, changei18n, fadeIn, fadeOut, filteringStateDefaults, flipBottom, flipHorBck, flipHorFwd, flipLeft, flipRight, flipTop, flipVerBck, flipVerFwd, getCurrentResourceStrings, getTypeNameForDebugging, growVerIn, growVerOut, heartbeat, hierarchicalTransactionServiceFactory, isDateInRanges, isLeap, monthRange, pulsateBck, pulsateFwd, range, rotateInBl, rotateInBottom, rotateInBr, rotateInCenter, rotateInDiagonal1, rotateInDiagonal2, rotateInHor, rotateInLeft, rotateInRight, rotateInTl, rotateInTop, rotateInTr, rotateInVer, rotateOutBl, rotateOutBottom, rotateOutBr, rotateOutCenter, rotateOutDiagonal1, rotateOutDiagonal2, rotateOutHor, rotateOutLeft, rotateOutRight, rotateOutTl, rotateOutTop, rotateOutTr, rotateOutVer, scaleInBl, scaleInBottom, scaleInBr, scaleInCenter, scaleInHorCenter, scaleInHorLeft, scaleInHorRight, scaleInLeft, scaleInRight, scaleInTl, scaleInTop, scaleInTr, scaleInVerBottom, scaleInVerCenter, scaleInVerTop, scaleOutBl, scaleOutBottom, scaleOutBr, scaleOutCenter, scaleOutHorCenter, scaleOutHorLeft, scaleOutHorRight, scaleOutLeft, scaleOutRight, scaleOutTl, scaleOutTop, scaleOutTr, scaleOutVerBottom, scaleOutVerCenter, scaleOutVerTop, shakeBl, shakeBottom, shakeBr, shakeCenter, shakeHor, shakeLeft, shakeRight, shakeTl, shakeTop, shakeTr, shakeVer, slideInBl, slideInBottom, slideInBr, slideInLeft, slideInRight, slideInTl, slideInTop, slideInTr, slideOutBl, slideOutBottom, slideOutBr, slideOutLeft, slideOutRight, slideOutTl, slideOutTop, slideOutTr, swingInBottomBck, swingInBottomFwd, swingInLeftBck, swingInLeftFwd, swingInRightBck, swingInRightFwd, swingInTopBck, swingInTopFwd, swingOutBottomBck, swingOutBottomFwd, swingOutLeftBck, swingOutLefttFwd, swingOutRightBck, swingOutRightFwd, swingOutTopBck, swingOutTopFwd, toPercent, valueInRange, weekDay, ɵ1, ɵ2, IgxActionStripMenuItemDirective as ɵa, IGX_DROPDOWN_BASE as ɵb, IgxGridActionButtonComponent as ɵba, ToggleAnimationPlayer as ɵbb, IgxExpansionPanelTitleDirective as ɵbc, IgxExpansionPanelDescriptionDirective as ɵbd, IgxExpansionPanelIconDirective as ɵbe, IgxBannerActionsDirective as ɵbf, IgxDaysViewNavigationService as ɵbg, IgxDayItemComponent as ɵbh, IgxMonthViewSlotsCalendar as ɵbi, IgxGetViewDateCalendar as ɵbj, IgxCarouselIndicatorDirective as ɵbk, IgxCarouselNextButtonDirective as ɵbl, IgxCarouselPrevButtonDirective as ɵbm, IGX_COMBO_COMPONENT as ɵbn, IgxComboBaseDirective as ɵbp, IgxComboHeaderDirective as ɵbq, IgxComboFooterDirective as ɵbr, IgxComboItemDirective as ɵbs, IgxComboEmptyDirective as ɵbt, IgxComboHeaderItemDirective as ɵbu, IgxComboAddItemDirective as ɵbv, IgxComboToggleIconDirective as ɵbw, IgxComboClearIconDirective as ɵbx, IgxComboAPIService as ɵby, IgxComboDropDownComponent as ɵbz, IgxComboItemComponent as ɵca, IgxComboFilteringPipe as ɵcb, IgxComboGroupingPipe as ɵcc, IgxComboAddItemComponent as ɵcd, PickerBaseDirective as ɵce, IgxCalendarContainerComponent as ɵcf, IgxCalendarContainerModule as ɵcg, IgxDialogTitleDirective as ɵch, IgxDialogActionsDirective as ɵci, IgxCellCrudState as ɵcj, IgxRowCrudState as ɵck, IgxRowAddCrudState as ɵcl, IgxGridCRUDService as ɵcm, IgxColumnMovingService as ɵcn, IgxExcelStyleCustomDialogComponent as ɵco, IgxExcelStyleDefaultExpressionComponent as ɵcp, IgxExcelStyleDateExpressionComponent as ɵcq, HammerGesturesManager as ɵcr, WatchChanges as ɵcs, WatchColumnChanges as ɵct, notifyChanges as ɵcu, IgxNotificationsDirective as ɵcv, IgxGridColumnResizerComponent as ɵcw, IgxColumnResizerDirective as ɵcx, IgxColumnResizingService as ɵcy, IgxRowSelectorDirective as ɵcz, IgxGridSelectionService as ɵd, IgxGroupByRowSelectorDirective as ɵda, IgxHeadSelectorDirective as ɵdb, IgxRowDragDirective as ɵdc, IgxDragIndicatorIconDirective as ɵdd, IgxRowDragGhostDirective as ɵde, IgxRowDragModule as ɵdf, IgxGridHeaderRowComponent as ɵdg, IgxGridHeaderGroupComponent as ɵdh, IgxGridHeaderComponent as ɵdi, IgxGridFilteringCellComponent as ɵdj, IgxFilteringService as ɵdk, IgxGridFilteringRowComponent as ɵdl, IgxGridGroupByAreaComponent as ɵdm, IgxGroupByAreaDirective as ɵdn, IgxGroupByMetaPipe as ɵdo, IgxTemplateOutletDirective as ɵdp, IgxTemplateOutletModule as ɵdq, IgxRowEditTemplateDirective as ɵdr, IgxRowEditTextDirective as ɵds, IgxRowAddTextDirective as ɵdt, IgxRowEditActionsDirective as ɵdu, IgxRowEditTabStopDirective as ɵdv, IgxSummaryRowComponent as ɵdw, IgxSummaryCellComponent as ɵdx, IgxRowDirective as ɵdy, IgxGridNavigationService as ɵdz, IgxGridSummaryService as ɵea, ConnectedPositioningStrategy as ɵeb, IgxGridGroupByRowComponent as ɵec, IgxTreeGridSelectionService as ɵed, IgxTreeGridGroupByAreaComponent as ɵee, IgxRowLoadingIndicatorTemplateDirective as ɵef, IgxHierarchicalGridNavigationService as ɵeg, IgxChildGridRowComponent as ɵeh, IgxGridCellComponent as ɵei, IgxGridFooterComponent as ɵej, IgxAdvancedFilteringDialogComponent as ɵek, IgxColumnHidingDirective as ɵel, IgxColumnPinningDirective as ɵem, IgxGridSharedModules as ɵen, IgxProcessBarTextTemplateDirective as ɵeo, IgxProgressBarGradientDirective as ɵep, DIR_DOCUMENT_FACTORY as ɵeq, DIR_DOCUMENT as ɵer, IgxDirectionality as ɵes, IgxSelectItemNavigationDirective as ɵet, IGX_TIME_PICKER_COMPONENT as ɵeu, IgxItemListDirective as ɵew, IgxTimeItemDirective as ɵex, IgxTimePickerTemplateDirective as ɵey, IgxTimePickerActionsDirective as ɵez, IGX_EXPANSION_PANEL_COMPONENT as ɵf, TimeFormatPipe as ɵfa, TimeItemPipe as ɵfb, IgxGridPipesModule as ɵfc, IgxGridCellStyleClassesPipe as ɵfd, IgxGridCellStylesPipe as ɵfe, IgxGridRowClassesPipe as ɵff, IgxGridRowStylesPipe as ɵfg, IgxGridNotGroupedPipe as ɵfh, IgxGridTopLevelColumns as ɵfi, IgxGridFilterConditionPipe as ɵfj, IgxGridTransactionPipe as ɵfk, IgxGridPaginatorOptionsPipe as ɵfl, IgxHasVisibleColumnsPipe as ɵfm, IgxGridRowPinningPipe as ɵfn, IgxColumnActionEnabledPipe as ɵfo, IgxFilterActionColumnsPipe as ɵfp, IgxSortActionColumnsPipe as ɵfq, IgxGridDataMapperPipe as ɵfr, IgxStringReplacePipe as ɵfs, IgxGridTransactionStatePipe as ɵft, IgxColumnFormatterPipe as ɵfu, IgxSummaryFormatterPipe as ɵfv, IgxGridAddRowPipe as ɵfw, IgxHeaderGroupWidthPipe as ɵfx, IgxHeaderGroupStylePipe as ɵfy, IgxGridColumnModule as ɵfz, IGX_TREE_COMPONENT as ɵg, IgxGridHeadersModule as ɵga, SortingIndexPipe as ɵgb, IgxGridFilteringModule as ɵgc, IgxColumnMovingModule as ɵgd, IgxColumnMovingDropDirective as ɵge, IgxColumnMovingDragDirective as ɵgf, IgxGridResizingModule as ɵgg, IgxResizeHandleDirective as ɵgh, IgxGridExcelStyleFilteringModule as ɵgi, IgxGridSelectionModule as ɵgj, IgxGridDragSelectDirective as ɵgk, IgxGridSummaryModule as ɵgl, IgxSummaryDataPipe as ɵgm, IgxGridToolbarModule as ɵgn, BaseToolbarDirective as ɵgo, BaseToolbarColumnActionsDirective as ɵgp, IgxGridRowComponent as ɵgq, IgxGridSortingPipe as ɵgr, IgxGridGroupingPipe as ɵgs, IgxGridPagingPipe as ɵgt, IgxGridFilteringPipe as ɵgu, IgxGridSummaryPipe as ɵgv, IgxGridDetailsPipe as ɵgw, IgxGridExpandableCellComponent as ɵgx, IgxTreeGridRowComponent as ɵgy, IgxTreeGridCellComponent as ɵgz, IGX_TREE_NODE_COMPONENT as ɵh, IgxTreeGridHierarchizingPipe as ɵha, IgxTreeGridFlatteningPipe as ɵhb, IgxTreeGridSortingPipe as ɵhc, IgxTreeGridPagingPipe as ɵhd, IgxTreeGridTransactionPipe as ɵhe, IgxTreeGridNormalizeRecordsPipe as ɵhf, IgxTreeGridAddRowPipe as ɵhg, IgxTreeGridFilteringPipe as ɵhh, IgxTreeGridSummaryPipe as ɵhi, IgxHierarchicalRowComponent as ɵhj, IgxHierarchicalGridCellComponent as ɵhk, IgxSliderThumbComponent as ɵhl, IgxThumbLabelComponent as ɵhm, IgxTicksComponent as ɵhn, IgxTickLabelsPipe as ɵho, IgxTabsBase as ɵhp, IgxTabHeaderBase as ɵhq, IgxTabContentBase as ɵhr, IgxSplitBarComponent as ɵhs, IgxTreeService as ɵht, IgxTreeSelectionService as ɵhu, IgxTreeNavigationService as ɵhv, PlatformUtil as ɵi, EaseIn as ɵj, EaseOut as ɵk, IgxInputGroupBase as ɵl, IgxSelectionAPIService as ɵm, IgxForOfSyncService as ɵn, IgxForOfScrollSyncService as ɵo, DisplayContainerComponent as ɵp, IgxScrollInertiaDirective as ɵq, IgxScrollInertiaModule as ɵr, VirtualHelperComponent as ɵs, VirtualHelperBaseDirective as ɵt, HVirtualHelperComponent as ɵu, MaskParsingService as ɵv, DeprecateMethod as ɵw, DeprecateProperty as ɵx, isHierarchyMatch as ɵy, getHierarchy as ɵz };
76378
76658
  //# sourceMappingURL=igniteui-angular.js.map