igniteui-angular 12.2.6 → 12.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/LICENSE +16 -0
  2. package/README.md +12 -11
  3. package/bundles/igniteui-angular.umd.js +1810 -1419
  4. package/bundles/igniteui-angular.umd.js.map +1 -1
  5. package/esm2015/igniteui-angular.js +97 -97
  6. package/esm2015/lib/accordion/accordion.component.js +23 -6
  7. package/esm2015/lib/combo/combo-dropdown.component.js +9 -4
  8. package/esm2015/lib/combo/combo-item.component.js +4 -3
  9. package/esm2015/lib/combo/combo.api.js +3 -3
  10. package/esm2015/lib/combo/combo.common.js +1016 -2
  11. package/esm2015/lib/combo/combo.component.js +91 -1135
  12. package/esm2015/lib/combo/combo.pipes.js +3 -3
  13. package/esm2015/lib/data-operations/sorting-strategy.js +12 -3
  14. package/esm2015/lib/grids/filtering/base/grid-filtering-row.component.js +12 -4
  15. package/esm2015/lib/grids/filtering/excel-style/excel-style-date-expression.component.js +2 -2
  16. package/esm2015/lib/grids/filtering/excel-style/grid.excel-style-filtering.component.js +2 -2
  17. package/esm2015/lib/grids/grid-base.directive.js +2 -2
  18. package/esm2015/lib/grids/tree-grid/tree-grid.component.js +3 -3
  19. package/esm2015/lib/simple-combo/public_api.js +2 -0
  20. package/esm2015/lib/simple-combo/simple-combo.component.js +390 -0
  21. package/esm2015/public_api.js +2 -1
  22. package/fesm2015/igniteui-angular.js +1373 -1002
  23. package/fesm2015/igniteui-angular.js.map +1 -1
  24. package/igniteui-angular.d.ts +96 -96
  25. package/igniteui-angular.metadata.json +1 -1
  26. package/lib/accordion/accordion.component.d.ts +1 -0
  27. package/lib/combo/combo-dropdown.component.d.ts +2 -0
  28. package/lib/combo/combo-item.component.d.ts +2 -0
  29. package/lib/combo/combo.common.d.ts +730 -4
  30. package/lib/combo/combo.component.d.ts +38 -791
  31. package/lib/combo/combo.pipes.d.ts +1 -1
  32. package/lib/simple-combo/public_api.d.ts +1 -0
  33. package/lib/simple-combo/simple-combo.component.d.ts +126 -0
  34. package/migrations/update-13_0_0/changes/members.json +26 -0
  35. package/package.json +1 -1
  36. package/public_api.d.ts +1 -0
  37. package/schematics/tsconfig.tsbuildinfo +1 -1
@@ -1711,8 +1711,17 @@ class IgxSorting {
1711
1711
  fullResult.data.push(groupItem);
1712
1712
  }
1713
1713
  if (expanded) {
1714
- metadata.push(...fullResult.metadata.slice(fullResult.metadata.length - group.length));
1715
- result.push(...fullResult.data.slice(fullResult.data.length - group.length));
1714
+ // Replaced object destructing as in a single big group scenario
1715
+ // it hits the max number of arguments for a function the underlying JS engine
1716
+ // supports.
1717
+ let j = fullResult.metadata.length - group.length;
1718
+ for (; j < fullResult.metadata.length; j++) {
1719
+ metadata.push(fullResult.metadata[j]);
1720
+ }
1721
+ j = fullResult.data.length - group.length;
1722
+ for (; j < fullResult.data.length; j++) {
1723
+ result.push(fullResult.data[j]);
1724
+ }
1716
1725
  }
1717
1726
  }
1718
1727
  i += group.length;
@@ -27577,6 +27586,7 @@ class IgxAccordionComponent {
27577
27586
  /** @hidden @internal **/
27578
27587
  ngAfterViewInit() {
27579
27588
  this._expandedPanels = new Set(this._panels.filter(panel => !panel.collapsed));
27589
+ this._expandingPanels = new Set();
27580
27590
  this._panels.changes.pipe(takeUntil(this._destroy$)).subscribe(() => {
27581
27591
  this.subToChanges();
27582
27592
  });
@@ -27679,6 +27689,7 @@ class IgxAccordionComponent {
27679
27689
  this._panels.forEach(panel => {
27680
27690
  panel.contentExpanded.pipe(takeUntil(this._unsubChildren$)).subscribe((args) => {
27681
27691
  this._expandedPanels.add(args.owner);
27692
+ this._expandingPanels.delete(args.owner);
27682
27693
  const evArgs = Object.assign(Object.assign({}, args), { owner: this, panel: args.owner });
27683
27694
  this.panelExpanded.emit(evArgs);
27684
27695
  });
@@ -27686,21 +27697,36 @@ class IgxAccordionComponent {
27686
27697
  if (args.cancel) {
27687
27698
  return;
27688
27699
  }
27700
+ const evArgs = Object.assign(Object.assign({}, args), { owner: this, panel: args.owner });
27701
+ this.panelExpanding.emit(evArgs);
27702
+ if (evArgs.cancel) {
27703
+ args.cancel = true;
27704
+ return;
27705
+ }
27689
27706
  if (this.singleBranchExpand) {
27690
27707
  this._expandedPanels.forEach(p => {
27691
27708
  if (!p.header.disabled) {
27692
27709
  p.collapse();
27693
27710
  }
27694
27711
  });
27695
- }
27696
- const evArgs = Object.assign(Object.assign({}, args), { owner: this, panel: args.owner });
27697
- this.panelExpanding.emit(evArgs);
27698
- if (evArgs.cancel) {
27699
- args.cancel = true;
27712
+ this._expandingPanels.forEach(p => {
27713
+ var _a, _b;
27714
+ if (!p.header.disabled) {
27715
+ if (!p.animationSettings.closeAnimation) {
27716
+ (_a = p.openAnimationPlayer) === null || _a === void 0 ? void 0 : _a.reset();
27717
+ }
27718
+ if (!p.animationSettings.openAnimation) {
27719
+ (_b = p.closeAnimationPlayer) === null || _b === void 0 ? void 0 : _b.reset();
27720
+ }
27721
+ p.collapse();
27722
+ }
27723
+ });
27724
+ this._expandingPanels.add(args.owner);
27700
27725
  }
27701
27726
  });
27702
27727
  panel.contentCollapsed.pipe(takeUntil(this._unsubChildren$)).subscribe((args) => {
27703
27728
  this._expandedPanels.delete(args.owner);
27729
+ this._expandingPanels.delete(args.owner);
27704
27730
  const evArgs = Object.assign(Object.assign({}, args), { owner: this, panel: args.owner });
27705
27731
  this.panelCollapsed.emit(evArgs);
27706
27732
  });
@@ -34871,10 +34897,10 @@ class IgxComboAPIService {
34871
34897
  return;
34872
34898
  }
34873
34899
  if (!selected) {
34874
- this.combo.selectItems([itemID], false, event);
34900
+ this.combo.select([itemID], false, event);
34875
34901
  }
34876
34902
  else {
34877
- this.combo.deselectItems([itemID], event);
34903
+ this.combo.deselect([itemID], event);
34878
34904
  }
34879
34905
  }
34880
34906
  is_item_selected(itemID) {
@@ -34972,7 +34998,7 @@ class IgxComboItemComponent extends IgxDropDownItemComponent {
34972
34998
  IgxComboItemComponent.decorators = [
34973
34999
  { type: Component, args: [{
34974
35000
  selector: 'igx-combo-item',
34975
- 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"
35001
+ 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"
34976
35002
  },] }
34977
35003
  ];
34978
35004
  IgxComboItemComponent.ctorParameters = () => [
@@ -34982,311 +35008,25 @@ IgxComboItemComponent.ctorParameters = () => [
34982
35008
  { type: IgxSelectionAPIService, decorators: [{ type: Inject, args: [IgxSelectionAPIService,] }] }
34983
35009
  ];
34984
35010
  IgxComboItemComponent.propDecorators = {
34985
- itemHeight: [{ type: Input }, { type: HostBinding, args: ['style.height.px',] }]
35011
+ itemHeight: [{ type: Input }, { type: HostBinding, args: ['style.height.px',] }],
35012
+ singleMode: [{ type: Input }]
34986
35013
  };
34987
35014
 
34988
35015
  const IGX_COMBO_COMPONENT = new InjectionToken('IgxComboComponentToken');
34989
-
35016
+ let NEXT_ID$c = 0;
34990
35017
  /**
34991
35018
  * @hidden
35019
+ * The default number of items that should be in the combo's
35020
+ * drop-down list if no `[itemsMaxHeight]` is specified
34992
35021
  */
34993
- class IgxComboAddItemComponent extends IgxComboItemComponent {
34994
- get selected() {
34995
- return false;
34996
- }
34997
- set selected(value) {
34998
- }
34999
- /**
35000
- * @inheritdoc
35001
- */
35002
- clicked(event) {
35003
- this.comboAPI.disableTransitions = false;
35004
- this.comboAPI.add_custom_item();
35005
- }
35006
- }
35007
- IgxComboAddItemComponent.decorators = [
35008
- { type: Component, args: [{
35009
- selector: 'igx-combo-add-item',
35010
- template: '<ng-content></ng-content>',
35011
- providers: [{ provide: IgxComboItemComponent, useExisting: IgxComboAddItemComponent }]
35012
- },] }
35013
- ];
35014
-
35015
- /** @hidden */
35016
- class IgxComboDropDownComponent extends IgxDropDownComponent {
35017
- constructor(elementRef, cdr, platform, selection, combo, comboAPI, _displayDensityOptions) {
35018
- super(elementRef, cdr, platform, selection, _displayDensityOptions);
35019
- this.elementRef = elementRef;
35020
- this.cdr = cdr;
35021
- this.platform = platform;
35022
- this.selection = selection;
35023
- this.combo = combo;
35024
- this.comboAPI = comboAPI;
35025
- this._displayDensityOptions = _displayDensityOptions;
35026
- /**
35027
- * @hidden
35028
- * @internal
35029
- */
35030
- this.children = null;
35031
- this.scrollHandler = () => {
35032
- this.comboAPI.disableTransitions = true;
35033
- };
35034
- }
35035
- /** @hidden @internal */
35036
- get scrollContainer() {
35037
- return this.virtDir.dc.location.nativeElement;
35038
- }
35039
- get isScrolledToLast() {
35040
- const scrollTop = this.virtDir.scrollPosition;
35041
- const scrollHeight = this.virtDir.getScroll().scrollHeight;
35042
- return Math.floor(scrollTop + this.virtDir.igxForContainerSize) === scrollHeight;
35043
- }
35044
- get lastVisibleIndex() {
35045
- return this.combo.totalItemCount ?
35046
- Math.floor(this.combo.itemsMaxHeight / this.combo.itemHeight) :
35047
- this.items.length - 1;
35048
- }
35049
- get sortedChildren() {
35050
- if (this.children !== undefined) {
35051
- return this.children.toArray()
35052
- .sort((a, b) => a.index - b.index);
35053
- }
35054
- return null;
35055
- }
35056
- /**
35057
- * Get all non-header items
35058
- *
35059
- * ```typescript
35060
- * let myDropDownItems = this.dropdown.items;
35061
- * ```
35062
- */
35063
- get items() {
35064
- const items = [];
35065
- if (this.children !== undefined) {
35066
- const sortedChildren = this.sortedChildren;
35067
- for (const child of sortedChildren) {
35068
- if (!child.isHeader) {
35069
- items.push(child);
35070
- }
35071
- }
35072
- }
35073
- return items;
35074
- }
35075
- /**
35076
- * @hidden @internal
35077
- */
35078
- onFocus() {
35079
- this.focusedItem = this._focusedItem || this.items[0];
35080
- }
35081
- /**
35082
- * @hidden @internal
35083
- */
35084
- onBlur(_evt) {
35085
- this.focusedItem = null;
35086
- }
35087
- /**
35088
- * @hidden @internal
35089
- */
35090
- onToggleOpened() {
35091
- this.opened.emit();
35092
- }
35093
- /**
35094
- * @hidden
35095
- */
35096
- navigateFirst() {
35097
- this.navigateItem(this.virtDir.igxForOf.findIndex(e => !e.isHeader));
35098
- }
35099
- /**
35100
- * @hidden
35101
- */
35102
- navigatePrev() {
35103
- if (this._focusedItem && this._focusedItem.index === 0 && this.virtDir.state.startIndex === 0) {
35104
- this.combo.focusSearchInput(false);
35105
- }
35106
- else {
35107
- super.navigatePrev();
35108
- }
35109
- }
35110
- /**
35111
- * @hidden
35112
- */
35113
- navigateNext() {
35114
- const lastIndex = this.combo.totalItemCount ? this.combo.totalItemCount - 1 : this.virtDir.igxForOf.length - 1;
35115
- if (this._focusedItem && this._focusedItem.index === lastIndex) {
35116
- this.focusAddItemButton();
35117
- }
35118
- else {
35119
- super.navigateNext();
35120
- }
35121
- }
35122
- /**
35123
- * @hidden @internal
35124
- */
35125
- selectItem(item) {
35126
- if (item === null || item === undefined) {
35127
- return;
35128
- }
35129
- this.comboAPI.set_selected_item(item.itemID);
35130
- this._focusedItem = item;
35131
- }
35132
- /**
35133
- * @hidden @internal
35134
- */
35135
- updateScrollPosition() {
35136
- this.virtDir.getScroll().scrollTop = this._scrollPosition;
35137
- }
35138
- /**
35139
- * @hidden @internal
35140
- */
35141
- onItemActionKey(key) {
35142
- switch (key) {
35143
- case DropDownActionKey.ENTER:
35144
- this.handleEnter();
35145
- break;
35146
- case DropDownActionKey.SPACE:
35147
- this.handleSpace();
35148
- break;
35149
- case DropDownActionKey.ESCAPE:
35150
- this.close();
35151
- }
35152
- }
35153
- ngAfterViewInit() {
35154
- this.virtDir.getScroll().addEventListener('scroll', this.scrollHandler);
35155
- }
35156
- /**
35157
- * @hidden @internal
35158
- */
35159
- ngOnDestroy() {
35160
- this.virtDir.getScroll().removeEventListener('scroll', this.scrollHandler);
35161
- this.destroy$.next(true);
35162
- this.destroy$.complete();
35163
- }
35164
- scrollToHiddenItem(_newItem) { }
35165
- handleEnter() {
35166
- if (this.isAddItemFocused()) {
35167
- this.combo.addItemToCollection();
35168
- }
35169
- else {
35170
- this.close();
35171
- }
35172
- }
35173
- handleSpace() {
35174
- if (this.isAddItemFocused()) {
35175
- return;
35176
- }
35177
- else {
35178
- this.selectItem(this.focusedItem);
35179
- }
35180
- }
35181
- isAddItemFocused() {
35182
- return this.focusedItem instanceof IgxComboAddItemComponent;
35183
- }
35184
- focusAddItemButton() {
35185
- if (this.combo.isAddButtonVisible()) {
35186
- this.focusedItem = this.items[this.items.length - 1];
35187
- }
35188
- }
35189
- }
35190
- IgxComboDropDownComponent.decorators = [
35191
- { type: Component, args: [{
35192
- selector: 'igx-combo-drop-down',
35193
- 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",
35194
- providers: [{ provide: IGX_DROPDOWN_BASE, useExisting: IgxComboDropDownComponent }]
35195
- },] }
35196
- ];
35197
- IgxComboDropDownComponent.ctorParameters = () => [
35198
- { type: ElementRef },
35199
- { type: ChangeDetectorRef },
35200
- { type: PlatformUtil },
35201
- { type: IgxSelectionAPIService },
35202
- { type: undefined, decorators: [{ type: Inject, args: [IGX_COMBO_COMPONENT,] }] },
35203
- { type: IgxComboAPIService },
35204
- { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] }
35205
- ];
35206
- IgxComboDropDownComponent.propDecorators = {
35207
- children: [{ type: ContentChildren, args: [IgxComboItemComponent, { descendants: true },] }]
35022
+ const itemsInContainer = 10; // TODO: make private readonly
35023
+ /** @hidden @internal */
35024
+ const ItemHeights = {
35025
+ comfortable: 40,
35026
+ cosy: 32,
35027
+ compact: 28,
35208
35028
  };
35209
-
35210
- /**
35211
- * @hidden
35212
- */
35213
- class IgxComboFilteringPipe {
35214
- transform(collection, searchValue, displayKey, shouldFilter, filteringOptions) {
35215
- if (!collection) {
35216
- return [];
35217
- }
35218
- if (!searchValue || !shouldFilter) {
35219
- return collection;
35220
- }
35221
- else {
35222
- const searchTerm = filteringOptions.caseSensitive ? searchValue.trim() : searchValue.toLowerCase().trim();
35223
- if (displayKey != null) {
35224
- return collection.filter(e => filteringOptions.caseSensitive ? e[displayKey].includes(searchTerm) :
35225
- e[displayKey].toString().toLowerCase().includes(searchTerm));
35226
- }
35227
- else {
35228
- return collection.filter(e => filteringOptions.caseSensitive ? e.includes(searchTerm) :
35229
- e.toLowerCase().includes(searchTerm));
35230
- }
35231
- }
35232
- }
35233
- }
35234
- IgxComboFilteringPipe.decorators = [
35235
- { type: Pipe, args: [{
35236
- name: 'comboFiltering'
35237
- },] }
35238
- ];
35239
- /**
35240
- * @hidden
35241
- */
35242
- class IgxComboGroupingPipe {
35243
- constructor(combo) {
35244
- this.combo = combo;
35245
- }
35246
- transform(collection, groupKey, valueKey) {
35247
- this.combo.filteredData = collection;
35248
- if ((!groupKey && groupKey !== 0) || !collection.length) {
35249
- return collection;
35250
- }
35251
- const sorted = DataUtil.sort(cloneArray(collection), [{
35252
- fieldName: groupKey,
35253
- dir: SortingDirection.Asc,
35254
- ignoreCase: true,
35255
- strategy: DefaultSortingStrategy.instance()
35256
- }]);
35257
- const data = cloneArray(sorted);
35258
- let inserts = 0;
35259
- let currentHeader = null;
35260
- for (let i = 0; i < sorted.length; i++) {
35261
- let insertFlag = 0;
35262
- if (currentHeader !== sorted[i][groupKey]) {
35263
- currentHeader = sorted[i][groupKey];
35264
- insertFlag = 1;
35265
- }
35266
- if (insertFlag) {
35267
- data.splice(i + inserts, 0, {
35268
- [valueKey]: currentHeader,
35269
- [groupKey]: currentHeader,
35270
- isHeader: true
35271
- });
35272
- inserts++;
35273
- }
35274
- }
35275
- return data;
35276
- }
35277
- }
35278
- IgxComboGroupingPipe.decorators = [
35279
- { type: Pipe, args: [{
35280
- name: 'comboGrouping'
35281
- },] }
35282
- ];
35283
- IgxComboGroupingPipe.ctorParameters = () => [
35284
- { type: undefined, decorators: [{ type: Inject, args: [IGX_COMBO_COMPONENT,] }] }
35285
- ];
35286
-
35287
- /**
35288
- * @hidden
35289
- */
35029
+ /** @hidden @internal */
35290
35030
  var DataTypes;
35291
35031
  (function (DataTypes) {
35292
35032
  DataTypes["EMPTY"] = "empty";
@@ -35294,20 +35034,6 @@ var DataTypes;
35294
35034
  DataTypes["COMPLEX"] = "complex";
35295
35035
  DataTypes["PRIMARYKEY"] = "valueKey";
35296
35036
  })(DataTypes || (DataTypes = {}));
35297
- /**
35298
- * @hidden
35299
- */
35300
- const ItemHeights = {
35301
- comfortable: 40,
35302
- cosy: 32,
35303
- compact: 28,
35304
- };
35305
- /**
35306
- * @hidden
35307
- * The default number of items that should be in the combo's
35308
- * drop-down list if no `[itemsMaxHeight]` is specified
35309
- */
35310
- const itemsInContainer = 10;
35311
35037
  var IgxComboState;
35312
35038
  (function (IgxComboState) {
35313
35039
  /**
@@ -35323,52 +35049,31 @@ var IgxComboState;
35323
35049
  */
35324
35050
  IgxComboState[IgxComboState["INVALID"] = 2] = "INVALID";
35325
35051
  })(IgxComboState || (IgxComboState = {}));
35326
- /**
35327
- * When called with sets A & B, returns A - B (as array);
35328
- *
35329
- * @hidden
35330
- */
35331
- const diffInSets = (set1, set2) => {
35332
- const results = [];
35333
- set1.forEach(entry => {
35334
- if (!set2.has(entry)) {
35335
- results.push(entry);
35336
- }
35337
- });
35338
- return results;
35339
- };
35340
- const ɵ0$1 = diffInSets;
35341
- let NEXT_ID$c = 0;
35342
- /**
35343
- * Represents a drop-down list that provides editable functionalities, allowing users to choose an option from a predefined list.
35344
- *
35345
- * @igxModule IgxComboModule
35346
- * @igxTheme igx-combo-theme
35347
- * @igxKeywords combobox, combo selection
35348
- * @igxGroup Grids & Lists
35349
- *
35350
- * @remarks
35351
- * It provides the ability to filter items as well as perform single or multiple seleciton with the provided data.
35352
- * Additionally, it exposes keyboard navigation and custom styling capabilities.
35353
- * @example
35354
- * ```html
35355
- * <igx-combo [itemsMaxHeight]="250" [data]="locationData"
35356
- * [displayKey]="'field'" [valueKey]="'field'"
35357
- * placeholder="Location(s)" searchPlaceholder="Search...">
35358
- * </igx-combo>
35359
- * ```
35360
- */
35361
- class IgxComboComponent extends DisplayDensityBase {
35362
- constructor(elementRef, cdr, selection, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector) {
35052
+ class IgxComboBaseDirective extends DisplayDensityBase {
35053
+ constructor(elementRef, cdr, selectionService, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector) {
35363
35054
  super(_displayDensityOptions);
35364
35055
  this.elementRef = elementRef;
35365
35056
  this.cdr = cdr;
35366
- this.selection = selection;
35057
+ this.selectionService = selectionService;
35367
35058
  this.comboAPI = comboAPI;
35368
35059
  this._iconService = _iconService;
35369
35060
  this._displayDensityOptions = _displayDensityOptions;
35370
35061
  this._inputGroupType = _inputGroupType;
35371
35062
  this._injector = _injector;
35063
+ /**
35064
+ * Defines whether the caseSensitive icon should be shown in the search input
35065
+ *
35066
+ * ```typescript
35067
+ * // get
35068
+ * let myComboShowSearchCaseIcon = this.combo.showSearchCaseIcon;
35069
+ * ```
35070
+ *
35071
+ * ```html
35072
+ * <!--set-->
35073
+ * <igx-combo [showSearchCaseIcon]='true'></igx-combo>
35074
+ * ```
35075
+ */
35076
+ this.showSearchCaseIcon = false;
35372
35077
  /**
35373
35078
  * Set custom overlay settings that control how the combo's list of items is displayed.
35374
35079
  * Set:
@@ -35387,9 +35092,121 @@ class IgxComboComponent extends DisplayDensityBase {
35387
35092
  */
35388
35093
  this.overlaySettings = null;
35389
35094
  /**
35390
- * @hidden @internal
35095
+ * Gets/gets combo id.
35096
+ *
35097
+ * ```typescript
35098
+ * // get
35099
+ * let id = this.combo.id;
35100
+ * ```
35101
+ *
35102
+ * ```html
35103
+ * <!--set-->
35104
+ * <igx-combo [id]='combo1'></igx-combo>
35105
+ * ```
35391
35106
  */
35392
- this.searchInput = null;
35107
+ this.id = `igx-combo-${NEXT_ID$c++}`;
35108
+ /**
35109
+ * Controls whether custom values can be added to the collection
35110
+ *
35111
+ * ```typescript
35112
+ * // get
35113
+ * let comboAllowsCustomValues = this.combo.allowCustomValues;
35114
+ * ```
35115
+ *
35116
+ * ```html
35117
+ * <!--set-->
35118
+ * <igx-combo [allowCustomValues]='true'></igx-combo>
35119
+ * ```
35120
+ */
35121
+ this.allowCustomValues = false;
35122
+ /**
35123
+ * Determines which column in the data source is used to determine the value.
35124
+ *
35125
+ * ```typescript
35126
+ * // get
35127
+ * let myComboValueKey = this.combo.valueKey;
35128
+ * ```
35129
+ *
35130
+ * ```html
35131
+ * <!--set-->
35132
+ * <igx-combo [valueKey]='myKey'></igx-combo>
35133
+ * ```
35134
+ */
35135
+ this.valueKey = null;
35136
+ /**
35137
+ * An @Input property that enabled/disables filtering in the list. The default is `true`.
35138
+ * ```html
35139
+ * <igx-combo [filterable]="false">
35140
+ * ```
35141
+ */
35142
+ this.filterable = true;
35143
+ /** @hidden @internal */
35144
+ this.cssClass = 'igx-combo'; // Independent of display density for the time being
35145
+ /** @hidden @internal */
35146
+ this.role = 'combobox';
35147
+ /**
35148
+ * An @Input property that enabled/disables combo. The default is `false`.
35149
+ * ```html
35150
+ * <igx-combo [disabled]="'true'">
35151
+ * ```
35152
+ */
35153
+ this.disabled = false;
35154
+ /**
35155
+ * Emitted before the dropdown is opened
35156
+ *
35157
+ * ```html
35158
+ * <igx-combo opening='handleOpening($event)'></igx-combo>
35159
+ * ```
35160
+ */
35161
+ this.opening = new EventEmitter();
35162
+ /**
35163
+ * Emitted after the dropdown is opened
35164
+ *
35165
+ * ```html
35166
+ * <igx-combo (opened)='handleOpened($event)'></igx-combo>
35167
+ * ```
35168
+ */
35169
+ this.opened = new EventEmitter();
35170
+ /**
35171
+ * Emitted before the dropdown is closed
35172
+ *
35173
+ * ```html
35174
+ * <igx-combo (closing)='handleClosing($event)'></igx-combo>
35175
+ * ```
35176
+ */
35177
+ this.closing = new EventEmitter();
35178
+ /**
35179
+ * Emitted after the dropdown is closed
35180
+ *
35181
+ * ```html
35182
+ * <igx-combo (closed)='handleClosed($event)'></igx-combo>
35183
+ * ```
35184
+ */
35185
+ this.closed = new EventEmitter();
35186
+ /**
35187
+ * Emitted when an item is being added to the data collection
35188
+ *
35189
+ * ```html
35190
+ * <igx-combo (addition)='handleAdditionEvent($event)'></igx-combo>
35191
+ * ```
35192
+ */
35193
+ this.addition = new EventEmitter();
35194
+ /**
35195
+ * Emitted when the value of the search input changes (e.g. typing, pasting, clear, etc.)
35196
+ *
35197
+ * ```html
35198
+ * <igx-combo (searchInputUpdate)='handleSearchInputEvent($event)'></igx-combo>
35199
+ * ```
35200
+ */
35201
+ this.searchInputUpdate = new EventEmitter();
35202
+ /**
35203
+ * Emitted when new chunk of data is loaded from the virtualization
35204
+ *
35205
+ * ```html
35206
+ * <igx-combo (dataPreLoad)='handleDataPreloadEvent($event)'></igx-combo>
35207
+ * ```
35208
+ */
35209
+ this.dataPreLoad = new EventEmitter();
35393
35210
  /**
35394
35211
  * The custom template, if any, that should be used when rendering ITEMS in the combo list
35395
35212
  *
@@ -35553,207 +35370,34 @@ class IgxComboComponent extends DisplayDensityBase {
35553
35370
  * ```
35554
35371
  */
35555
35372
  this.clearIconTemplate = null;
35556
- /**
35557
- * Emitted when item selection is changing, before the selection completes
35558
- *
35559
- * ```html
35560
- * <igx-combo (selectionChanging)='handleSelection()'></igx-combo>
35561
- * ```
35562
- */
35563
- this.selectionChanging = new EventEmitter();
35564
- /**
35565
- * Emitted before the dropdown is opened
35566
- *
35567
- * ```html
35568
- * <igx-combo opening='handleOpening($event)'></igx-combo>
35569
- * ```
35570
- */
35571
- this.opening = new EventEmitter();
35572
- /**
35573
- * Emitted after the dropdown is opened
35574
- *
35575
- * ```html
35576
- * <igx-combo (opened)='handleOpened($event)'></igx-combo>
35577
- * ```
35578
- */
35579
- this.opened = new EventEmitter();
35580
- /**
35581
- * Emitted before the dropdown is closed
35582
- *
35583
- * ```html
35584
- * <igx-combo (closing)='handleClosing($event)'></igx-combo>
35585
- * ```
35586
- */
35587
- this.closing = new EventEmitter();
35588
- /**
35589
- * Emitted after the dropdown is closed
35590
- *
35591
- * ```html
35592
- * <igx-combo (closed)='handleClosed($event)'></igx-combo>
35593
- * ```
35594
- */
35595
- this.closed = new EventEmitter();
35596
- /**
35597
- * Emitted when an item is being added to the data collection
35598
- *
35599
- * ```html
35600
- * <igx-combo (addition)='handleAdditionEvent($event)'></igx-combo>
35601
- * ```
35602
- */
35603
- this.addition = new EventEmitter();
35604
- /**
35605
- * Emitted when the value of the search input changes (e.g. typing, pasting, clear, etc.)
35606
- *
35607
- * ```html
35608
- * <igx-combo (searchInputUpdate)='handleSearchInputEvent($event)'></igx-combo>
35609
- * ```
35610
- */
35611
- this.searchInputUpdate = new EventEmitter();
35612
- /**
35613
- * Emitted when new chunk of data is loaded from the virtualization
35614
- *
35615
- * ```html
35616
- * <igx-combo (dataPreLoad)='handleDataPreloadEvent($event)'></igx-combo>
35617
- * ```
35618
- */
35619
- this.dataPreLoad = new EventEmitter();
35620
- /**
35621
- * Gets/gets combo id.
35622
- *
35623
- * ```typescript
35624
- * // get
35625
- * let id = this.combo.id;
35626
- * ```
35627
- *
35628
- * ```html
35629
- * <!--set-->
35630
- * <igx-combo [id]='combo1'></igx-combo>
35631
- * ```
35632
- */
35633
- this.id = `igx-combo-${NEXT_ID$c++}`;
35634
- /**
35635
- * @hidden @internal
35636
- */
35637
- this.cssClass = 'igx-combo'; // Independent of display density, at the time being
35638
- /**
35639
- * @hidden @internal
35640
- */
35641
- this.role = 'combobox';
35642
- /**
35643
- * Controls whether custom values can be added to the collection
35644
- *
35645
- * ```typescript
35646
- * // get
35647
- * let comboAllowsCustomValues = this.combo.allowCustomValues;
35648
- * ```
35649
- *
35650
- * ```html
35651
- * <!--set-->
35652
- * <igx-combo [allowCustomValues]='true'></igx-combo>
35653
- * ```
35654
- */
35655
- this.allowCustomValues = false;
35656
- /**
35657
- * Defines the placeholder value for the combo dropdown search field
35658
- *
35659
- * ```typescript
35660
- * // get
35661
- * let myComboSearchPlaceholder = this.combo.searchPlaceholder;
35662
- * ```
35663
- *
35664
- * ```html
35665
- * <!--set-->
35666
- * <igx-combo [searchPlaceholder]='newPlaceHolder'></igx-combo>
35667
- * ```
35668
- */
35669
- this.searchPlaceholder = 'Enter a Search Term';
35670
- /**
35671
- * Defines whether the caseSensitive icon should be shown in the search input
35672
- *
35673
- * ```typescript
35674
- * // get
35675
- * let myComboShowSearchCaseIcon = this.combo.showSearchCaseIcon;
35676
- * ```
35677
- *
35678
- * ```html
35679
- * <!--set-->
35680
- * <igx-combo [showSearchCaseIcon]='true'></igx-combo>
35681
- * ```
35682
- */
35683
- this.showSearchCaseIcon = false;
35684
- /**
35685
- * Combo value data source property.
35686
- *
35687
- * ```typescript
35688
- * // get
35689
- * let myComboValueKey = this.combo.valueKey;
35690
- * ```
35691
- *
35692
- * ```html
35693
- * <!--set-->
35694
- * <igx-combo [valueKey]='myKey'></igx-combo>
35695
- * ```
35696
- */
35697
- this.valueKey = null;
35698
- /**
35699
- * An @Input property that enabled/disables filtering in the list. The default is `true`.
35700
- * ```html
35701
- * <igx-combo [filterable]="false">
35702
- * ```
35703
- */
35704
- this.filterable = true;
35705
- /**
35706
- * An @Input property that enabled/disables combo. The default is `false`.
35707
- * ```html
35708
- * <igx-combo [disabled]="'true'">
35709
- * ```
35710
- */
35711
- this.disabled = false;
35712
- /**
35713
- * An @Input property that controls whether the combo's search box
35714
- * should be focused after the `opened` event is called
35715
- * When `false`, the combo's list item container will be focused instead
35716
- */
35717
- this.autoFocusSearch = true;
35373
+ /** @hidden @internal */
35374
+ this.searchInput = null;
35718
35375
  this.dropdownContainer = null;
35719
- /**
35720
- * @hidden @internal
35721
- */
35376
+ /** @hidden @internal */
35722
35377
  this.customValueFlag = true;
35723
- /**
35724
- * @hidden @internal
35725
- */
35378
+ /** @hidden @internal */
35379
+ this.filterValue = '';
35380
+ /** @hidden @internal */
35726
35381
  this.defaultFallbackGroup = 'Other';
35727
- /**
35728
- * @hidden @internal
35729
- */
35382
+ /** @hidden @internal */
35730
35383
  this.filteringOptions = {
35731
35384
  caseSensitive: false
35732
35385
  };
35733
- /**
35734
- * @hidden @internal
35735
- */
35736
- this.filteringLogic = FilteringLogic.Or;
35737
- /** @hidden @internal */
35738
- this.filterValue = '';
35739
- this.stringFilters = IgxStringFilteringOperand;
35740
- this.booleanFilters = IgxBooleanFilteringOperand;
35386
+ this._data = [];
35387
+ this._value = '';
35741
35388
  this._groupKey = '';
35742
- this._prevInputValue = '';
35743
- this._dataType = '';
35744
- this._searchValue = '';
35745
- this._type = null;
35389
+ this._filteredData = [];
35390
+ this._remoteSelection = {};
35391
+ this._valid = IgxComboState.INITIAL;
35746
35392
  this.ngControl = null;
35747
35393
  this.destroy$ = new Subject();
35748
- this._data = [];
35749
- this._filteredData = [];
35394
+ this._onTouchedCallback = noop;
35395
+ this._onChangeCallback = noop;
35396
+ this._type = null;
35397
+ this._dataType = '';
35398
+ this._searchValue = '';
35750
35399
  this._itemHeight = null;
35751
35400
  this._itemsMaxHeight = null;
35752
- this._remoteSelection = {};
35753
- this._onChangeCallback = noop;
35754
- this._onTouchedCallback = noop;
35755
- this._value = '';
35756
- this._valid = IgxComboState.INITIAL;
35757
35401
  this.onStatusChanged = () => {
35758
35402
  if ((this.ngControl.control.touched || this.ngControl.control.dirty) &&
35759
35403
  (this.ngControl.control.validator || this.ngControl.control.asyncValidator)) {
@@ -35770,31 +35414,10 @@ class IgxComboComponent extends DisplayDensityBase {
35770
35414
  }
35771
35415
  this.manageRequiredAsterisk();
35772
35416
  };
35773
- this.comboAPI.register(this);
35774
- }
35775
- /**
35776
- * @hidden @internal
35777
- */
35778
- get displaySearchInput() {
35779
- return this.filterable || this.allowCustomValues;
35780
- }
35781
- /**
35782
- * @hidden @internal
35783
- */
35784
- get ariaExpanded() {
35785
- return !this.dropdown.collapsed;
35786
- }
35787
- /**
35788
- * @hidden @internal
35789
- */
35790
- get hasPopUp() {
35791
- return 'listbox';
35792
- }
35793
- /**
35794
- * @hidden @internal
35795
- */
35796
- get ariaOwns() {
35797
- return this.dropdown.id;
35417
+ this.findMatch = (element) => {
35418
+ const value = this.displayKey ? element[this.displayKey] : element;
35419
+ return value.toString().toLowerCase() === this.searchValue.trim().toLowerCase();
35420
+ };
35798
35421
  }
35799
35422
  /**
35800
35423
  * Configures the drop down list height
@@ -35840,12 +35463,6 @@ class IgxComboComponent extends DisplayDensityBase {
35840
35463
  set itemHeight(val) {
35841
35464
  this._itemHeight = val;
35842
35465
  }
35843
- /**
35844
- * @hidden @internal
35845
- */
35846
- get inputEmpty() {
35847
- return !this.value && !this.placeholder;
35848
- }
35849
35466
  /**
35850
35467
  * Combo data source.
35851
35468
  *
@@ -35864,7 +35481,7 @@ class IgxComboComponent extends DisplayDensityBase {
35864
35481
  this._displayKey = val;
35865
35482
  }
35866
35483
  /**
35867
- * Combo text data source property.
35484
+ * Determines which column in the data source is used to determine the display value.
35868
35485
  *
35869
35486
  * ```typescript
35870
35487
  * // get
@@ -35905,6 +35522,18 @@ class IgxComboComponent extends DisplayDensityBase {
35905
35522
  get groupKey() {
35906
35523
  return this._groupKey;
35907
35524
  }
35525
+ /** @hidden @internal */
35526
+ get ariaExpanded() {
35527
+ return !this.dropdown.collapsed;
35528
+ }
35529
+ /** @hidden @internal */
35530
+ get hasPopUp() {
35531
+ return 'listbox';
35532
+ }
35533
+ /** @hidden @internal */
35534
+ get ariaOwns() {
35535
+ return this.dropdown.id;
35536
+ }
35908
35537
  /**
35909
35538
  * An @Input property that sets how the combo will be styled.
35910
35539
  * The allowed values are `line`, `box`, `border` and `search`. The default is `box`.
@@ -35918,6 +35547,27 @@ class IgxComboComponent extends DisplayDensityBase {
35918
35547
  set type(val) {
35919
35548
  this._type = val;
35920
35549
  }
35550
+ /** @hidden @internal */
35551
+ get searchValue() {
35552
+ return this._searchValue;
35553
+ }
35554
+ set searchValue(val) {
35555
+ this.filterValue = val;
35556
+ this._searchValue = val;
35557
+ }
35558
+ /** @hidden @internal */
35559
+ get isRemote() {
35560
+ return this.totalItemCount > 0 &&
35561
+ this.valueKey &&
35562
+ this.dataType === DataTypes.COMPLEX;
35563
+ }
35564
+ /** @hidden @internal */
35565
+ get dataType() {
35566
+ if (this.displayKey) {
35567
+ return DataTypes.COMPLEX;
35568
+ }
35569
+ return DataTypes.PRIMITIVE;
35570
+ }
35921
35571
  /**
35922
35572
  * Gets if control is valid, when used in a form
35923
35573
  *
@@ -35942,32 +35592,15 @@ class IgxComboComponent extends DisplayDensityBase {
35942
35592
  this.comboInput.valid = IgxInputState[IgxComboState[valid]];
35943
35593
  }
35944
35594
  /**
35945
- * @hidden @internal
35946
- */
35947
- get searchValue() {
35948
- return this._searchValue;
35949
- }
35950
- set searchValue(val) {
35951
- this.filterValue = val;
35952
- this._searchValue = val;
35953
- }
35954
- /**
35955
- * @hidden @internal
35956
- */
35957
- onArrowDown(event) {
35958
- event.preventDefault();
35959
- event.stopPropagation();
35960
- this.open();
35961
- }
35962
- /**
35963
- * @hidden @internal
35595
+ * The text displayed in the combo input
35596
+ *
35597
+ * ```typescript
35598
+ * // get
35599
+ * let comboValue = this.combo.value;
35600
+ * ```
35964
35601
  */
35965
- onInputClick(event) {
35966
- event.stopPropagation();
35967
- event.preventDefault();
35968
- if (!this.disabled) {
35969
- this.toggle();
35970
- }
35602
+ get value() {
35603
+ return this._value;
35971
35604
  }
35972
35605
  /**
35973
35606
  * Defines the current state of the virtualized data. It contains `startIndex` and `chunkSize`
@@ -35991,6 +35624,16 @@ class IgxComboComponent extends DisplayDensityBase {
35991
35624
  set virtualizationState(state) {
35992
35625
  this.virtDir.state = state;
35993
35626
  }
35627
+ /**
35628
+ * Gets drop down state.
35629
+ *
35630
+ * ```typescript
35631
+ * let state = this.combo.collapsed;
35632
+ * ```
35633
+ */
35634
+ get collapsed() {
35635
+ return this.dropdown.collapsed;
35636
+ }
35994
35637
  /**
35995
35638
  * Gets total count of the virtual data items, when using remote service.
35996
35639
  *
@@ -36013,94 +35656,92 @@ class IgxComboComponent extends DisplayDensityBase {
36013
35656
  set totalItemCount(count) {
36014
35657
  this.virtDir.totalItemCount = count;
36015
35658
  }
36016
- /**
36017
- * The text displayed in the combo input
36018
- *
36019
- * ```typescript
36020
- * // get
36021
- * let comboValue = this.combo.value;
36022
- * ```
36023
- */
36024
- get value() {
36025
- return this._value;
36026
- }
36027
- /**
36028
- * @hidden @internal
36029
- */
36030
- get filteredData() {
36031
- return this.filterable ? this._filteredData : this.data;
36032
- }
36033
- /**
36034
- * @hidden @internal
36035
- */
36036
- set filteredData(val) {
36037
- this._filteredData = this.groupKey ? (val || []).filter((e) => e.isHeader !== true) : val;
36038
- this.checkMatch();
36039
- }
36040
- /**
36041
- * @hidden @internal
36042
- */
36043
- handleKeyUp(event) {
36044
- if (event.key === 'ArrowDown' || event.key === 'Down') {
36045
- this.dropdown.focusedItem = this.dropdown.items[0];
36046
- this.dropdownContainer.nativeElement.focus();
35659
+ /** @hidden @internal */
35660
+ get template() {
35661
+ this._dataType = this.dataType;
35662
+ if (this.itemTemplate) {
35663
+ return this.itemTemplate;
36047
35664
  }
36048
- else if (event.key === 'Escape' || event.key === 'Esc') {
36049
- this.toggle();
35665
+ if (this._dataType === DataTypes.COMPLEX) {
35666
+ return this.complexTemplate;
36050
35667
  }
35668
+ return this.primitiveTemplate;
36051
35669
  }
36052
- /**
36053
- * @hidden @internal
36054
- */
36055
- handleKeyDown(event) {
36056
- if (event.key === 'ArrowUp' || event.key === 'Up') {
36057
- event.preventDefault();
36058
- event.stopPropagation();
36059
- this.close();
36060
- }
35670
+ /** @hidden @internal */
35671
+ onArrowDown(event) {
35672
+ event.preventDefault();
35673
+ event.stopPropagation();
35674
+ this.open();
36061
35675
  }
36062
- /**
36063
- * @hidden @internal
36064
- */
36065
- handleInputChange(event) {
36066
- if (event !== undefined) {
36067
- const args = {
36068
- searchText: event,
36069
- owner: this,
36070
- cancel: false
36071
- };
36072
- this.searchInputUpdate.emit(args);
36073
- if (args.cancel) {
36074
- this.filterValue = null;
36075
- }
35676
+ /** @hidden @internal */
35677
+ ngOnInit() {
35678
+ this.ngControl = this._injector.get(NgControl, null);
35679
+ const targetElement = this.elementRef.nativeElement;
35680
+ this._overlaySettings = {
35681
+ target: targetElement,
35682
+ scrollStrategy: new AbsoluteScrollStrategy(),
35683
+ positionStrategy: new AutoPositionStrategy(),
35684
+ modal: false,
35685
+ closeOnOutsideClick: true,
35686
+ excludeFromOutsideClick: [targetElement]
35687
+ };
35688
+ this.selectionService.set(this.id, new Set());
35689
+ this._iconService.addSvgIconFromText(caseSensitive.name, caseSensitive.value, 'imx-icons');
35690
+ }
35691
+ /** @hidden @internal */
35692
+ ngAfterViewInit() {
35693
+ this.filteredData = [...this.data];
35694
+ if (this.ngControl) {
35695
+ this.ngControl.statusChanges.pipe(takeUntil(this.destroy$)).subscribe(this.onStatusChanged);
35696
+ this.manageRequiredAsterisk();
35697
+ this.cdr.detectChanges();
36076
35698
  }
36077
- this.checkMatch();
35699
+ this.virtDir.chunkPreload.pipe(takeUntil(this.destroy$)).subscribe((e) => {
35700
+ const eventArgs = Object.assign({}, e, { owner: this });
35701
+ this.dataPreLoad.emit(eventArgs);
35702
+ });
35703
+ }
35704
+ /** @hidden @internal */
35705
+ ngOnDestroy() {
35706
+ this.destroy$.next();
35707
+ this.destroy$.complete();
35708
+ this.comboAPI.clear();
35709
+ this.selectionService.clear(this.id);
36078
35710
  }
36079
35711
  /**
36080
- * @hidden @internal
35712
+ * A method that opens/closes the combo.
35713
+ *
35714
+ * ```html
35715
+ * <button (click)="combo.toggle()">Toggle Combo</button>
35716
+ * <igx-combo #combo></igx-combo>
35717
+ * ```
36081
35718
  */
36082
- get dataType() {
36083
- if (this.displayKey) {
36084
- return DataTypes.COMPLEX;
36085
- }
36086
- return DataTypes.PRIMITIVE;
35719
+ toggle() {
35720
+ const overlaySettings = Object.assign({}, this._overlaySettings, this.overlaySettings);
35721
+ this.dropdown.toggle(overlaySettings);
36087
35722
  }
36088
35723
  /**
36089
- * @hidden @internal
35724
+ * A method that opens the combo.
35725
+ *
35726
+ * ```html
35727
+ * <button (click)="combo.open()">Open Combo</button>
35728
+ * <igx-combo #combo></igx-combo>
35729
+ * ```
36090
35730
  */
36091
- get isRemote() {
36092
- return this.totalItemCount > 0 &&
36093
- this.valueKey &&
36094
- this.dataType === DataTypes.COMPLEX;
35731
+ open() {
35732
+ const overlaySettings = Object.assign({}, this._overlaySettings, this.overlaySettings);
35733
+ this.dropdown.open(overlaySettings);
36095
35734
  }
36096
35735
  /**
36097
- * Returns if the specified itemID is selected
35736
+ * A method that closes the combo.
36098
35737
  *
36099
- * @hidden
36100
- * @internal
35738
+ * ```html
35739
+ * <button (click)="combo.close()">Close Combo</button>
35740
+ * <igx-combo #combo></igx-combo>
35741
+ * ```
36101
35742
  */
36102
- isItemSelected(item) {
36103
- return this.selection.is_item_selected(this.id, item);
35743
+ close() {
35744
+ this.dropdown.close();
36104
35745
  }
36105
35746
  /**
36106
35747
  * Triggers change detection on the combo view
@@ -36109,27 +35750,29 @@ class IgxComboComponent extends DisplayDensityBase {
36109
35750
  this.cdr.detectChanges();
36110
35751
  }
36111
35752
  /**
36112
- * @hidden @internal
35753
+ * Get current selection state
35754
+ *
35755
+ * @returns Array of selected items
35756
+ * ```typescript
35757
+ * let selectedItems = this.combo.selectedItems();
35758
+ * ```
36113
35759
  */
36114
- isAddButtonVisible() {
36115
- // This should always return a boolean value. If this.searchValue was '', it returns '' instead of false;
36116
- return this.searchValue !== '' && this.customValueFlag;
35760
+ get selection() {
35761
+ const items = Array.from(this.selectionService.get(this.id));
35762
+ return items;
36117
35763
  }
36118
35764
  /**
36119
- * @hidden @internal
35765
+ * Returns if the specified itemID is selected
35766
+ *
35767
+ * @hidden
35768
+ * @internal
36120
35769
  */
36121
- handleSelectAll(evt) {
36122
- if (evt.checked) {
36123
- this.selectAllItems();
36124
- }
36125
- else {
36126
- this.deselectAllItems();
36127
- }
35770
+ isItemSelected(item) {
35771
+ return this.selectionService.is_item_selected(this.id, item);
36128
35772
  }
36129
- /**
36130
- * @hidden @internal
36131
- */
35773
+ /** @hidden @internal */
36132
35774
  addItemToCollection() {
35775
+ var _a;
36133
35776
  if (!this.searchValue) {
36134
35777
  return;
36135
35778
  }
@@ -36154,33 +35797,91 @@ class IgxComboComponent extends DisplayDensityBase {
36154
35797
  this.data.push(args.addedItem);
36155
35798
  // trigger re-render
36156
35799
  this.data = cloneArray(this.data);
36157
- this.selectItems(this.valueKey !== null && this.valueKey !== undefined ?
35800
+ this.select(this.valueKey !== null && this.valueKey !== undefined ?
36158
35801
  [args.addedItem[this.valueKey]] : [args.addedItem], false);
36159
35802
  this.customValueFlag = false;
36160
- this.searchInput.nativeElement.focus();
35803
+ (_a = this.searchInput) === null || _a === void 0 ? void 0 : _a.nativeElement.focus();
36161
35804
  this.dropdown.focusedItem = null;
36162
35805
  this.virtDir.scrollTo(0);
36163
35806
  }
36164
- /**
36165
- * @hidden @internal
36166
- */
36167
- focusSearchInput(opening) {
36168
- if (this.displaySearchInput && this.searchInput) {
36169
- this.searchInput.nativeElement.focus();
36170
- }
36171
- else {
36172
- if (opening) {
36173
- this.dropdownContainer.nativeElement.focus();
36174
- }
36175
- else {
36176
- this.comboInput.nativeElement.focus();
36177
- this.toggle();
35807
+ /** @hidden @internal */
35808
+ isAddButtonVisible() {
35809
+ // This should always return a boolean value. If this.searchValue was '', it returns '' instead of false;
35810
+ return this.searchValue !== '' && this.customValueFlag;
35811
+ }
35812
+ /** @hidden @internal */
35813
+ handleInputChange(event) {
35814
+ if (event !== undefined) {
35815
+ const args = {
35816
+ searchText: typeof event === 'string' ? event : event.target.value,
35817
+ owner: this,
35818
+ cancel: false
35819
+ };
35820
+ this.searchInputUpdate.emit(args);
35821
+ if (args.cancel) {
35822
+ this.filterValue = null;
36178
35823
  }
36179
35824
  }
35825
+ this.checkMatch();
36180
35826
  }
36181
35827
  /**
36182
- * @hidden @internal
35828
+ * Event handlers
35829
+ *
35830
+ * @hidden
35831
+ * @internal
36183
35832
  */
35833
+ handleOpening(e) {
35834
+ const args = { owner: this, event: e.event, cancel: e.cancel };
35835
+ this.opening.emit(args);
35836
+ e.cancel = args.cancel;
35837
+ }
35838
+ /** @hidden @internal */
35839
+ handleClosing(e) {
35840
+ var _a;
35841
+ const args = { owner: this, event: e.event, cancel: e.cancel };
35842
+ this.closing.emit(args);
35843
+ e.cancel = args.cancel;
35844
+ if (e.cancel) {
35845
+ return;
35846
+ }
35847
+ this.searchValue = '';
35848
+ if (!e.event) {
35849
+ (_a = this.comboInput) === null || _a === void 0 ? void 0 : _a.nativeElement.focus();
35850
+ }
35851
+ }
35852
+ /** @hidden @internal */
35853
+ handleClosed() {
35854
+ this.closed.emit({ owner: this });
35855
+ }
35856
+ /** @hidden @internal */
35857
+ handleKeyDown(event) {
35858
+ if (event.key === 'ArrowUp' || event.key === 'Up') {
35859
+ event.preventDefault();
35860
+ event.stopPropagation();
35861
+ this.close();
35862
+ }
35863
+ }
35864
+ /** @hidden @internal */
35865
+ registerOnChange(fn) {
35866
+ this._onChangeCallback = fn;
35867
+ }
35868
+ /** @hidden @internal */
35869
+ registerOnTouched(fn) {
35870
+ this._onTouchedCallback = fn;
35871
+ }
35872
+ /** @hidden @internal */
35873
+ setDisabledState(isDisabled) {
35874
+ this.disabled = isDisabled;
35875
+ }
35876
+ /** @hidden @internal */
35877
+ onClick(event) {
35878
+ event.stopPropagation();
35879
+ event.preventDefault();
35880
+ if (!this.disabled) {
35881
+ this.toggle();
35882
+ }
35883
+ }
35884
+ /** @hidden @internal */
36184
35885
  onBlur() {
36185
35886
  if (this.collapsed) {
36186
35887
  this._onTouchedCallback();
@@ -36192,174 +35893,600 @@ class IgxComboComponent extends DisplayDensityBase {
36192
35893
  }
36193
35894
  }
36194
35895
  }
35896
+ /** @hidden @internal */
35897
+ toggleCaseSensitive() {
35898
+ this.filteringOptions = { caseSensitive: !this.filteringOptions.caseSensitive };
35899
+ }
35900
+ /** if there is a valueKey - map the keys to data items, else - just return the keys */
35901
+ convertKeysToItems(keys) {
35902
+ if (this.comboAPI.valueKey === null) {
35903
+ return keys;
35904
+ }
35905
+ // map keys vs. filter data to retain the order of the selected items
35906
+ return keys.map(key => this.data.find(entry => entry[this.valueKey] === key)).filter(e => e !== undefined);
35907
+ }
35908
+ checkMatch() {
35909
+ const itemMatch = this.filteredData.some(this.findMatch);
35910
+ this.customValueFlag = this.allowCustomValues && !itemMatch;
35911
+ }
35912
+ manageRequiredAsterisk() {
35913
+ if (this.ngControl && this.ngControl.control.validator) {
35914
+ // Run the validation with empty object to check if required is enabled.
35915
+ const error = this.ngControl.control.validator({});
35916
+ this.inputGroup.isRequired = error && error.required;
35917
+ }
35918
+ }
35919
+ /** Contains key-value pairs of the selected valueKeys and their resp. displayKeys */
35920
+ registerRemoteEntries(ids, add = true) {
35921
+ if (add) {
35922
+ const selection = this.getValueDisplayPairs(ids);
35923
+ for (const entry of selection) {
35924
+ this._remoteSelection[entry[this.valueKey]] = entry[this.displayKey];
35925
+ }
35926
+ }
35927
+ else {
35928
+ for (const entry of ids) {
35929
+ delete this._remoteSelection[entry];
35930
+ }
35931
+ }
35932
+ }
36195
35933
  /**
36196
- * @hidden @internal
35934
+ * For `id: any[]` returns a mapped `{ [combo.valueKey]: any, [combo.displayKey]: any }[]`
36197
35935
  */
36198
- ngOnInit() {
36199
- this.ngControl = this._injector.get(NgControl, null);
36200
- const targetElement = this.elementRef.nativeElement;
36201
- this._overlaySettings = {
36202
- target: targetElement,
36203
- scrollStrategy: new AbsoluteScrollStrategy(),
36204
- positionStrategy: new AutoPositionStrategy(),
36205
- modal: false,
36206
- closeOnOutsideClick: true,
36207
- excludeFromOutsideClick: [targetElement]
35936
+ getValueDisplayPairs(ids) {
35937
+ return this.data.filter(entry => ids.indexOf(entry[this.valueKey]) > -1).map(e => ({
35938
+ [this.valueKey]: e[this.valueKey],
35939
+ [this.displayKey]: e[this.displayKey]
35940
+ }));
35941
+ }
35942
+ getRemoteSelection(newSelection, oldSelection) {
35943
+ if (!newSelection.length) {
35944
+ // If new selection is empty, clear all items
35945
+ this.registerRemoteEntries(oldSelection, false);
35946
+ return '';
35947
+ }
35948
+ const removedItems = oldSelection.filter(e => newSelection.indexOf(e) < 0);
35949
+ const addedItems = newSelection.filter(e => oldSelection.indexOf(e) < 0);
35950
+ this.registerRemoteEntries(addedItems);
35951
+ this.registerRemoteEntries(removedItems, false);
35952
+ return Object.keys(this._remoteSelection).map(e => this._remoteSelection[e]).join(', ');
35953
+ }
35954
+ }
35955
+ IgxComboBaseDirective.decorators = [
35956
+ { type: Directive }
35957
+ ];
35958
+ IgxComboBaseDirective.ctorParameters = () => [
35959
+ { type: ElementRef },
35960
+ { type: ChangeDetectorRef },
35961
+ { type: IgxSelectionAPIService },
35962
+ { type: IgxComboAPIService },
35963
+ { type: IgxIconService },
35964
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] },
35965
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [IGX_INPUT_GROUP_TYPE,] }] },
35966
+ { type: Injector, decorators: [{ type: Optional }] }
35967
+ ];
35968
+ IgxComboBaseDirective.propDecorators = {
35969
+ showSearchCaseIcon: [{ type: Input }],
35970
+ overlaySettings: [{ type: Input }],
35971
+ id: [{ type: HostBinding, args: ['attr.id',] }, { type: Input }],
35972
+ width: [{ type: HostBinding, args: ['style.width',] }, { type: Input }],
35973
+ allowCustomValues: [{ type: Input }],
35974
+ itemsMaxHeight: [{ type: Input }],
35975
+ itemHeight: [{ type: Input }],
35976
+ itemsWidth: [{ type: Input }],
35977
+ placeholder: [{ type: Input }],
35978
+ data: [{ type: Input }],
35979
+ valueKey: [{ type: Input }],
35980
+ displayKey: [{ type: Input }],
35981
+ groupKey: [{ type: Input }],
35982
+ filterable: [{ type: Input }],
35983
+ ariaLabelledBy: [{ type: Input }, { type: HostBinding, args: ['attr.aria-labelledby',] }],
35984
+ cssClass: [{ type: HostBinding, args: ['class.igx-combo',] }],
35985
+ role: [{ type: HostBinding, args: [`attr.role`,] }],
35986
+ ariaExpanded: [{ type: HostBinding, args: ['attr.aria-expanded',] }],
35987
+ hasPopUp: [{ type: HostBinding, args: ['attr.aria-haspopup',] }],
35988
+ ariaOwns: [{ type: HostBinding, args: ['attr.aria-owns',] }],
35989
+ disabled: [{ type: Input }],
35990
+ type: [{ type: Input }],
35991
+ opening: [{ type: Output }],
35992
+ opened: [{ type: Output }],
35993
+ closing: [{ type: Output }],
35994
+ closed: [{ type: Output }],
35995
+ addition: [{ type: Output }],
35996
+ searchInputUpdate: [{ type: Output }],
35997
+ dataPreLoad: [{ type: Output }],
35998
+ itemTemplate: [{ type: ContentChild, args: [IgxComboItemDirective, { read: TemplateRef },] }],
35999
+ headerTemplate: [{ type: ContentChild, args: [IgxComboHeaderDirective, { read: TemplateRef },] }],
36000
+ footerTemplate: [{ type: ContentChild, args: [IgxComboFooterDirective, { read: TemplateRef },] }],
36001
+ headerItemTemplate: [{ type: ContentChild, args: [IgxComboHeaderItemDirective, { read: TemplateRef },] }],
36002
+ addItemTemplate: [{ type: ContentChild, args: [IgxComboAddItemDirective, { read: TemplateRef },] }],
36003
+ emptyTemplate: [{ type: ContentChild, args: [IgxComboEmptyDirective, { read: TemplateRef },] }],
36004
+ toggleIconTemplate: [{ type: ContentChild, args: [IgxComboToggleIconDirective, { read: TemplateRef },] }],
36005
+ clearIconTemplate: [{ type: ContentChild, args: [IgxComboClearIconDirective, { read: TemplateRef },] }],
36006
+ inputGroup: [{ type: ViewChild, args: ['inputGroup', { read: IgxInputGroupComponent, static: true },] }],
36007
+ comboInput: [{ type: ViewChild, args: ['comboInput', { read: IgxInputDirective, static: true },] }],
36008
+ searchInput: [{ type: ViewChild, args: ['searchInput',] }],
36009
+ virtualScrollContainer: [{ type: ViewChild, args: [IgxForOfDirective, { static: true },] }],
36010
+ virtDir: [{ type: ViewChild, args: [IgxForOfDirective, { read: IgxForOfDirective, static: true },] }],
36011
+ dropdownContainer: [{ type: ViewChild, args: ['dropdownItemContainer', { static: true },] }],
36012
+ primitiveTemplate: [{ type: ViewChild, args: ['primitive', { read: TemplateRef, static: true },] }],
36013
+ complexTemplate: [{ type: ViewChild, args: ['complex', { read: TemplateRef, static: true },] }],
36014
+ onArrowDown: [{ type: HostListener, args: ['keydown.ArrowDown', ['$event'],] }, { type: HostListener, args: ['keydown.Alt.ArrowDown', ['$event'],] }]
36015
+ };
36016
+
36017
+ /**
36018
+ * @hidden
36019
+ */
36020
+ class IgxComboAddItemComponent extends IgxComboItemComponent {
36021
+ get selected() {
36022
+ return false;
36023
+ }
36024
+ set selected(value) {
36025
+ }
36026
+ /**
36027
+ * @inheritdoc
36028
+ */
36029
+ clicked(event) {
36030
+ this.comboAPI.disableTransitions = false;
36031
+ this.comboAPI.add_custom_item();
36032
+ }
36033
+ }
36034
+ IgxComboAddItemComponent.decorators = [
36035
+ { type: Component, args: [{
36036
+ selector: 'igx-combo-add-item',
36037
+ template: '<ng-content></ng-content>',
36038
+ providers: [{ provide: IgxComboItemComponent, useExisting: IgxComboAddItemComponent }]
36039
+ },] }
36040
+ ];
36041
+
36042
+ /** @hidden */
36043
+ class IgxComboDropDownComponent extends IgxDropDownComponent {
36044
+ constructor(elementRef, cdr, platform, selection, combo, comboAPI, _displayDensityOptions) {
36045
+ super(elementRef, cdr, platform, selection, _displayDensityOptions);
36046
+ this.elementRef = elementRef;
36047
+ this.cdr = cdr;
36048
+ this.platform = platform;
36049
+ this.selection = selection;
36050
+ this.combo = combo;
36051
+ this.comboAPI = comboAPI;
36052
+ this._displayDensityOptions = _displayDensityOptions;
36053
+ /** @hidden @internal */
36054
+ this.singleMode = false;
36055
+ /**
36056
+ * @hidden
36057
+ * @internal
36058
+ */
36059
+ this.children = null;
36060
+ this.scrollHandler = () => {
36061
+ this.comboAPI.disableTransitions = true;
36208
36062
  };
36209
- this.selection.set(this.id, new Set());
36210
- this._iconService.addSvgIconFromText(caseSensitive.name, caseSensitive.value, 'imx-icons');
36063
+ }
36064
+ /** @hidden @internal */
36065
+ get scrollContainer() {
36066
+ return this.virtDir.dc.location.nativeElement;
36067
+ }
36068
+ get isScrolledToLast() {
36069
+ const scrollTop = this.virtDir.scrollPosition;
36070
+ const scrollHeight = this.virtDir.getScroll().scrollHeight;
36071
+ return Math.floor(scrollTop + this.virtDir.igxForContainerSize) === scrollHeight;
36072
+ }
36073
+ get lastVisibleIndex() {
36074
+ return this.combo.totalItemCount ?
36075
+ Math.floor(this.combo.itemsMaxHeight / this.combo.itemHeight) :
36076
+ this.items.length - 1;
36077
+ }
36078
+ get sortedChildren() {
36079
+ if (this.children !== undefined) {
36080
+ return this.children.toArray()
36081
+ .sort((a, b) => a.index - b.index);
36082
+ }
36083
+ return null;
36211
36084
  }
36212
36085
  /**
36213
- * @hidden @internal
36086
+ * Get all non-header items
36087
+ *
36088
+ * ```typescript
36089
+ * let myDropDownItems = this.dropdown.items;
36090
+ * ```
36214
36091
  */
36215
- ngAfterViewInit() {
36216
- this.filteredData = [...this.data];
36217
- if (this.ngControl) {
36218
- this.ngControl.statusChanges.pipe(takeUntil(this.destroy$)).subscribe(this.onStatusChanged);
36219
- this.manageRequiredAsterisk();
36220
- this.cdr.detectChanges();
36092
+ get items() {
36093
+ const items = [];
36094
+ if (this.children !== undefined) {
36095
+ const sortedChildren = this.sortedChildren;
36096
+ for (const child of sortedChildren) {
36097
+ if (!child.isHeader) {
36098
+ items.push(child);
36099
+ }
36100
+ }
36221
36101
  }
36222
- this.virtDir.chunkPreload.pipe(takeUntil(this.destroy$)).subscribe((e) => {
36223
- const eventArgs = Object.assign({}, e, { owner: this });
36224
- this.dataPreLoad.emit(eventArgs);
36225
- });
36102
+ return items;
36226
36103
  }
36227
36104
  /**
36228
36105
  * @hidden @internal
36229
36106
  */
36230
- ngOnDestroy() {
36231
- this.destroy$.next();
36232
- this.destroy$.complete();
36233
- this.comboAPI.clear();
36234
- this.selection.clear(this.id);
36107
+ onFocus() {
36108
+ this.focusedItem = this._focusedItem || this.items[0];
36235
36109
  }
36236
36110
  /**
36237
36111
  * @hidden @internal
36238
36112
  */
36239
- writeValue(value) {
36240
- const selection = Array.isArray(value) ? value : [];
36241
- const oldSelection = this.selectedItems();
36242
- this.selection.select_items(this.id, selection, true);
36243
- this.cdr.markForCheck();
36244
- this._value = this.createDisplayText(this.selectedItems(), oldSelection);
36113
+ onBlur(_evt) {
36114
+ this.focusedItem = null;
36245
36115
  }
36246
36116
  /**
36247
36117
  * @hidden @internal
36248
36118
  */
36249
- registerOnChange(fn) {
36250
- this._onChangeCallback = fn;
36119
+ onToggleOpened() {
36120
+ this.opened.emit();
36251
36121
  }
36252
36122
  /**
36253
- * @hidden @internal
36123
+ * @hidden
36254
36124
  */
36255
- registerOnTouched(fn) {
36256
- this._onTouchedCallback = fn;
36125
+ navigateFirst() {
36126
+ this.navigateItem(this.virtDir.igxForOf.findIndex(e => !e.isHeader));
36257
36127
  }
36258
36128
  /**
36259
- * @hidden @internal
36129
+ * @hidden
36260
36130
  */
36261
- setDisabledState(isDisabled) {
36262
- this.disabled = isDisabled;
36131
+ navigatePrev() {
36132
+ if (this._focusedItem && this._focusedItem.index === 0 && this.virtDir.state.startIndex === 0) {
36133
+ this.combo.focusSearchInput(false);
36134
+ }
36135
+ else {
36136
+ super.navigatePrev();
36137
+ }
36263
36138
  }
36264
36139
  /**
36265
36140
  * @hidden
36266
36141
  */
36267
- getEditElement() {
36268
- return this.comboInput.nativeElement;
36142
+ navigateNext() {
36143
+ const lastIndex = this.combo.totalItemCount ? this.combo.totalItemCount - 1 : this.virtDir.igxForOf.length - 1;
36144
+ if (this._focusedItem && this._focusedItem.index === lastIndex) {
36145
+ this.focusAddItemButton();
36146
+ }
36147
+ else {
36148
+ super.navigateNext();
36149
+ }
36269
36150
  }
36270
36151
  /**
36271
36152
  * @hidden @internal
36272
36153
  */
36273
- get template() {
36274
- this._dataType = this.dataType;
36275
- if (this.itemTemplate) {
36276
- return this.itemTemplate;
36277
- }
36278
- if (this._dataType === DataTypes.COMPLEX) {
36279
- return this.complexTemplate;
36154
+ selectItem(item) {
36155
+ if (item === null || item === undefined) {
36156
+ return;
36280
36157
  }
36281
- return this.primitiveTemplate;
36158
+ this.comboAPI.set_selected_item(item.itemID);
36159
+ this._focusedItem = item;
36282
36160
  }
36283
36161
  /**
36284
36162
  * @hidden @internal
36285
36163
  */
36286
- get context() {
36287
- return {
36288
- $implicit: this
36289
- };
36164
+ updateScrollPosition() {
36165
+ this.virtDir.getScroll().scrollTop = this._scrollPosition;
36290
36166
  }
36291
36167
  /**
36292
36168
  * @hidden @internal
36293
36169
  */
36294
- handleClearItems(event) {
36295
- if (this.disabled) {
36170
+ onItemActionKey(key) {
36171
+ switch (key) {
36172
+ case DropDownActionKey.ENTER:
36173
+ this.handleEnter();
36174
+ break;
36175
+ case DropDownActionKey.SPACE:
36176
+ this.handleSpace();
36177
+ break;
36178
+ case DropDownActionKey.ESCAPE:
36179
+ this.close();
36180
+ }
36181
+ }
36182
+ ngAfterViewInit() {
36183
+ this.virtDir.getScroll().addEventListener('scroll', this.scrollHandler);
36184
+ }
36185
+ /**
36186
+ * @hidden @internal
36187
+ */
36188
+ ngOnDestroy() {
36189
+ this.virtDir.getScroll().removeEventListener('scroll', this.scrollHandler);
36190
+ this.destroy$.next(true);
36191
+ this.destroy$.complete();
36192
+ }
36193
+ scrollToHiddenItem(_newItem) { }
36194
+ handleEnter() {
36195
+ if (this.isAddItemFocused()) {
36196
+ this.combo.addItemToCollection();
36296
36197
  return;
36297
36198
  }
36298
- this.deselectAllItems(true, event);
36299
- if (this.collapsed) {
36300
- this.getEditElement().focus();
36199
+ if (this.singleMode && this.focusedItem) {
36200
+ this.combo.select(this.focusedItem.itemID);
36201
+ }
36202
+ this.close();
36203
+ }
36204
+ handleSpace() {
36205
+ if (this.isAddItemFocused()) {
36206
+ return;
36301
36207
  }
36302
36208
  else {
36303
- this.focusSearchInput(true);
36209
+ this.selectItem(this.focusedItem);
36210
+ }
36211
+ }
36212
+ isAddItemFocused() {
36213
+ return this.focusedItem instanceof IgxComboAddItemComponent;
36214
+ }
36215
+ focusAddItemButton() {
36216
+ if (this.combo.isAddButtonVisible()) {
36217
+ this.focusedItem = this.items[this.items.length - 1];
36304
36218
  }
36305
- event.stopPropagation();
36219
+ }
36220
+ }
36221
+ IgxComboDropDownComponent.decorators = [
36222
+ { type: Component, args: [{
36223
+ selector: 'igx-combo-drop-down',
36224
+ 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",
36225
+ providers: [{ provide: IGX_DROPDOWN_BASE, useExisting: IgxComboDropDownComponent }]
36226
+ },] }
36227
+ ];
36228
+ IgxComboDropDownComponent.ctorParameters = () => [
36229
+ { type: ElementRef },
36230
+ { type: ChangeDetectorRef },
36231
+ { type: PlatformUtil },
36232
+ { type: IgxSelectionAPIService },
36233
+ { type: undefined, decorators: [{ type: Inject, args: [IGX_COMBO_COMPONENT,] }] },
36234
+ { type: IgxComboAPIService },
36235
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] }
36236
+ ];
36237
+ IgxComboDropDownComponent.propDecorators = {
36238
+ singleMode: [{ type: Input }],
36239
+ children: [{ type: ContentChildren, args: [IgxComboItemComponent, { descendants: true },] }]
36240
+ };
36241
+
36242
+ /**
36243
+ * @hidden
36244
+ */
36245
+ class IgxComboFilteringPipe {
36246
+ transform(collection, searchValue, displayKey, filteringOptions, shouldFilter = false) {
36247
+ if (!collection) {
36248
+ return [];
36249
+ }
36250
+ if (!searchValue || !shouldFilter) {
36251
+ return collection;
36252
+ }
36253
+ else {
36254
+ const searchTerm = filteringOptions.caseSensitive ? searchValue.trim() : searchValue.toLowerCase().trim();
36255
+ if (displayKey != null) {
36256
+ return collection.filter(e => filteringOptions.caseSensitive ? e[displayKey].includes(searchTerm) :
36257
+ e[displayKey].toString().toLowerCase().includes(searchTerm));
36258
+ }
36259
+ else {
36260
+ return collection.filter(e => filteringOptions.caseSensitive ? e.includes(searchTerm) :
36261
+ e.toString().toLowerCase().includes(searchTerm));
36262
+ }
36263
+ }
36264
+ }
36265
+ }
36266
+ IgxComboFilteringPipe.decorators = [
36267
+ { type: Pipe, args: [{
36268
+ name: 'comboFiltering'
36269
+ },] }
36270
+ ];
36271
+ /**
36272
+ * @hidden
36273
+ */
36274
+ class IgxComboGroupingPipe {
36275
+ constructor(combo) {
36276
+ this.combo = combo;
36277
+ }
36278
+ transform(collection, groupKey, valueKey) {
36279
+ this.combo.filteredData = collection;
36280
+ if ((!groupKey && groupKey !== 0) || !collection.length) {
36281
+ return collection;
36282
+ }
36283
+ const sorted = DataUtil.sort(cloneArray(collection), [{
36284
+ fieldName: groupKey,
36285
+ dir: SortingDirection.Asc,
36286
+ ignoreCase: true,
36287
+ strategy: DefaultSortingStrategy.instance()
36288
+ }]);
36289
+ const data = cloneArray(sorted);
36290
+ let inserts = 0;
36291
+ let currentHeader = null;
36292
+ for (let i = 0; i < sorted.length; i++) {
36293
+ let insertFlag = 0;
36294
+ if (currentHeader !== sorted[i][groupKey]) {
36295
+ currentHeader = sorted[i][groupKey];
36296
+ insertFlag = 1;
36297
+ }
36298
+ if (insertFlag) {
36299
+ data.splice(i + inserts, 0, {
36300
+ [valueKey]: currentHeader,
36301
+ [groupKey]: currentHeader,
36302
+ isHeader: true
36303
+ });
36304
+ inserts++;
36305
+ }
36306
+ }
36307
+ return data;
36308
+ }
36309
+ }
36310
+ IgxComboGroupingPipe.decorators = [
36311
+ { type: Pipe, args: [{
36312
+ name: 'comboGrouping'
36313
+ },] }
36314
+ ];
36315
+ IgxComboGroupingPipe.ctorParameters = () => [
36316
+ { type: undefined, decorators: [{ type: Inject, args: [IGX_COMBO_COMPONENT,] }] }
36317
+ ];
36318
+
36319
+ /**
36320
+ * When called with sets A & B, returns A - B (as array);
36321
+ *
36322
+ * @hidden
36323
+ */
36324
+ const diffInSets = (set1, set2) => {
36325
+ const results = [];
36326
+ set1.forEach(entry => {
36327
+ if (!set2.has(entry)) {
36328
+ results.push(entry);
36329
+ }
36330
+ });
36331
+ return results;
36332
+ };
36333
+ const ɵ0$1 = diffInSets;
36334
+ /**
36335
+ * Represents a drop-down list that provides editable functionalities, allowing users to choose an option from a predefined list.
36336
+ *
36337
+ * @igxModule IgxComboModule
36338
+ * @igxTheme igx-combo-theme
36339
+ * @igxKeywords combobox, combo selection
36340
+ * @igxGroup Grids & Lists
36341
+ *
36342
+ * @remarks
36343
+ * It provides the ability to filter items as well as perform selection with the provided data.
36344
+ * Additionally, it exposes keyboard navigation and custom styling capabilities.
36345
+ * @example
36346
+ * ```html
36347
+ * <igx-combo [itemsMaxHeight]="250" [data]="locationData"
36348
+ * [displayKey]="'field'" [valueKey]="'field'"
36349
+ * placeholder="Location(s)" searchPlaceholder="Search...">
36350
+ * </igx-combo>
36351
+ * ```
36352
+ */
36353
+ class IgxComboComponent extends IgxComboBaseDirective {
36354
+ constructor(elementRef, cdr, selectionService, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector) {
36355
+ super(elementRef, cdr, selectionService, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector);
36356
+ this.elementRef = elementRef;
36357
+ this.cdr = cdr;
36358
+ this.selectionService = selectionService;
36359
+ this.comboAPI = comboAPI;
36360
+ this._iconService = _iconService;
36361
+ this._displayDensityOptions = _displayDensityOptions;
36362
+ this._inputGroupType = _inputGroupType;
36363
+ this._injector = _injector;
36364
+ /**
36365
+ * An @Input property that controls whether the combo's search box
36366
+ * should be focused after the `opened` event is called
36367
+ * When `false`, the combo's list item container will be focused instead
36368
+ */
36369
+ this.autoFocusSearch = true;
36370
+ /**
36371
+ * An @Input property that enabled/disables filtering in the list. The default is `true`.
36372
+ * ```html
36373
+ * <igx-combo [filterable]="false">
36374
+ * ```
36375
+ */
36376
+ this.filterable = true;
36377
+ /**
36378
+ * Defines the placeholder value for the combo dropdown search field
36379
+ *
36380
+ * ```typescript
36381
+ * // get
36382
+ * let myComboSearchPlaceholder = this.combo.searchPlaceholder;
36383
+ * ```
36384
+ *
36385
+ * ```html
36386
+ * <!--set-->
36387
+ * <igx-combo [searchPlaceholder]='newPlaceHolder'></igx-combo>
36388
+ * ```
36389
+ */
36390
+ this.searchPlaceholder = 'Enter a Search Term';
36391
+ /**
36392
+ * Emitted when item selection is changing, before the selection completes
36393
+ *
36394
+ * ```html
36395
+ * <igx-combo (selectionChanging)='handleSelection()'></igx-combo>
36396
+ * ```
36397
+ */
36398
+ this.selectionChanging = new EventEmitter();
36399
+ /**
36400
+ * @hidden @internal
36401
+ */
36402
+ this.filteringLogic = FilteringLogic.Or;
36403
+ this.stringFilters = IgxStringFilteringOperand;
36404
+ this.booleanFilters = IgxBooleanFilteringOperand;
36405
+ this._prevInputValue = '';
36406
+ this.comboAPI.register(this);
36306
36407
  }
36307
36408
  /**
36308
- * A method that opens/closes the combo.
36309
- *
36310
- * ```html
36311
- * <button (click)="combo.toggle()">Toggle Combo</button>
36312
- * <igx-combo #combo></igx-combo>
36313
- * ```
36409
+ * @hidden @internal
36314
36410
  */
36315
- toggle() {
36316
- const overlaySettings = Object.assign({}, this._overlaySettings, this.overlaySettings);
36317
- this.dropdown.toggle(overlaySettings);
36411
+ get inputEmpty() {
36412
+ return !this.value && !this.placeholder;
36413
+ }
36414
+ /** @hidden @internal */
36415
+ get filteredData() {
36416
+ return this.filterable ? this._filteredData : this.data;
36417
+ }
36418
+ /** @hidden @internal */
36419
+ set filteredData(val) {
36420
+ this._filteredData = this.groupKey ? (val || []).filter((e) => e.isHeader !== true) : val;
36421
+ this.checkMatch();
36422
+ }
36423
+ /** @hidden @internal */
36424
+ get displaySearchInput() {
36425
+ return this.filterable || this.allowCustomValues;
36318
36426
  }
36319
36427
  /**
36320
- * A method that opens the combo.
36321
- *
36322
- * ```html
36323
- * <button (click)="combo.open()">Open Combo</button>
36324
- * <igx-combo #combo></igx-combo>
36325
- * ```
36428
+ * @hidden @internal
36326
36429
  */
36327
- open() {
36328
- const overlaySettings = Object.assign({}, this._overlaySettings, this.overlaySettings);
36329
- this.dropdown.open(overlaySettings);
36430
+ handleKeyUp(event) {
36431
+ // TODO: use PlatformUtil for keyboard navigation
36432
+ if (event.key === 'ArrowDown' || event.key === 'Down') {
36433
+ this.dropdown.focusedItem = this.dropdown.items[0];
36434
+ this.dropdownContainer.nativeElement.focus();
36435
+ }
36436
+ else if (event.key === 'Escape' || event.key === 'Esc') {
36437
+ this.toggle();
36438
+ }
36330
36439
  }
36331
36440
  /**
36332
- * A method that closes the combo.
36333
- *
36334
- * ```html
36335
- * <button (click)="combo.close()">Close Combo</button>
36336
- * <igx-combo #combo></igx-combo>
36337
- * ```
36441
+ * @hidden @internal
36338
36442
  */
36339
- close() {
36340
- this.dropdown.close();
36443
+ handleSelectAll(evt) {
36444
+ if (evt.checked) {
36445
+ this.selectAllItems();
36446
+ }
36447
+ else {
36448
+ this.deselectAllItems();
36449
+ }
36341
36450
  }
36342
36451
  /**
36343
- * Gets drop down state.
36344
- *
36345
- * ```typescript
36346
- * let state = this.combo.collapsed;
36347
- * ```
36452
+ * @hidden @internal
36348
36453
  */
36349
- get collapsed() {
36350
- return this.dropdown.collapsed;
36454
+ writeValue(value) {
36455
+ const selection = Array.isArray(value) ? value : [];
36456
+ const oldSelection = this.selection;
36457
+ this.selectionService.select_items(this.id, selection, true);
36458
+ this.cdr.markForCheck();
36459
+ this._value = this.createDisplayText(this.selection, oldSelection);
36351
36460
  }
36352
36461
  /**
36353
- * Get current selection state
36354
- *
36355
- * @returns Array of selected items
36356
- * ```typescript
36357
- * let selectedItems = this.combo.selectedItems();
36358
- * ```
36462
+ * @hidden
36359
36463
  */
36360
- selectedItems() {
36361
- const items = Array.from(this.selection.get(this.id));
36362
- return items;
36464
+ getEditElement() {
36465
+ return this.comboInput.nativeElement;
36466
+ }
36467
+ /**
36468
+ * @hidden @internal
36469
+ */
36470
+ get context() {
36471
+ return {
36472
+ $implicit: this
36473
+ };
36474
+ }
36475
+ /**
36476
+ * @hidden @internal
36477
+ */
36478
+ handleClearItems(event) {
36479
+ if (this.disabled) {
36480
+ return;
36481
+ }
36482
+ this.deselectAllItems(true, event);
36483
+ if (this.collapsed) {
36484
+ this.getEditElement().focus();
36485
+ }
36486
+ else {
36487
+ this.focusSearchInput(true);
36488
+ }
36489
+ event.stopPropagation();
36363
36490
  }
36364
36491
  /**
36365
36492
  * Select defined items
@@ -36367,12 +36494,12 @@ class IgxComboComponent extends DisplayDensityBase {
36367
36494
  * @param newItems new items to be selected
36368
36495
  * @param clearCurrentSelection if true clear previous selected items
36369
36496
  * ```typescript
36370
- * this.combo.selectItems(["New York", "New Jersey"]);
36497
+ * this.combo.select(["New York", "New Jersey"]);
36371
36498
  * ```
36372
36499
  */
36373
- selectItems(newItems, clearCurrentSelection, event) {
36500
+ select(newItems, clearCurrentSelection, event) {
36374
36501
  if (newItems) {
36375
- const newSelection = this.selection.add_items(this.id, newItems, clearCurrentSelection);
36502
+ const newSelection = this.selectionService.add_items(this.id, newItems, clearCurrentSelection);
36376
36503
  this.setSelection(newSelection, event);
36377
36504
  }
36378
36505
  }
@@ -36381,12 +36508,12 @@ class IgxComboComponent extends DisplayDensityBase {
36381
36508
  *
36382
36509
  * @param items items to deselected
36383
36510
  * ```typescript
36384
- * this.combo.deselectItems(["New York", "New Jersey"]);
36511
+ * this.combo.deselect(["New York", "New Jersey"]);
36385
36512
  * ```
36386
36513
  */
36387
- deselectItems(items, event) {
36514
+ deselect(items, event) {
36388
36515
  if (items) {
36389
- const newSelection = this.selection.delete_items(this.id, items);
36516
+ const newSelection = this.selectionService.delete_items(this.id, items);
36390
36517
  this.setSelection(newSelection, event);
36391
36518
  }
36392
36519
  }
@@ -36399,8 +36526,8 @@ class IgxComboComponent extends DisplayDensityBase {
36399
36526
  * ```
36400
36527
  */
36401
36528
  selectAllItems(ignoreFilter, event) {
36402
- const allVisible = this.selection.get_all_ids(ignoreFilter ? this.data : this.filteredData, this.valueKey);
36403
- const newSelection = this.selection.add_items(this.id, allVisible);
36529
+ const allVisible = this.selectionService.get_all_ids(ignoreFilter ? this.data : this.filteredData, this.valueKey);
36530
+ const newSelection = this.selectionService.add_items(this.id, allVisible);
36404
36531
  this.setSelection(newSelection, event);
36405
36532
  }
36406
36533
  /**
@@ -36412,9 +36539,9 @@ class IgxComboComponent extends DisplayDensityBase {
36412
36539
  * ```
36413
36540
  */
36414
36541
  deselectAllItems(ignoreFilter, event) {
36415
- let newSelection = this.selection.get_empty();
36542
+ let newSelection = this.selectionService.get_empty();
36416
36543
  if (this.filteredData.length !== this.data.length && !ignoreFilter) {
36417
- newSelection = this.selection.delete_items(this.id, this.selection.get_all_ids(this.filteredData, this.valueKey));
36544
+ newSelection = this.selectionService.delete_items(this.id, this.selectionService.get_all_ids(this.filteredData, this.valueKey));
36418
36545
  }
36419
36546
  this.setSelection(newSelection, event);
36420
36547
  }
@@ -36442,26 +36569,13 @@ class IgxComboComponent extends DisplayDensityBase {
36442
36569
  return;
36443
36570
  }
36444
36571
  if (select) {
36445
- this.selectItems([itemID], false, event);
36572
+ this.select([itemID], false, event);
36446
36573
  }
36447
36574
  else {
36448
- this.deselectItems([itemID], event);
36575
+ this.deselect([itemID], event);
36449
36576
  }
36450
36577
  }
36451
- /**
36452
- * Event handlers
36453
- *
36454
- * @hidden
36455
- * @internal
36456
- */
36457
- handleOpening(e) {
36458
- const args = { owner: this, event: e.event, cancel: e.cancel };
36459
- this.opening.emit(args);
36460
- e.cancel = args.cancel;
36461
- }
36462
- /**
36463
- * @hidden @internal
36464
- */
36578
+ /** @hidden @internal */
36465
36579
  handleOpened() {
36466
36580
  this.triggerCheck();
36467
36581
  // Disabling focus of the search input should happen only when drop down opens.
@@ -36475,36 +36589,26 @@ class IgxComboComponent extends DisplayDensityBase {
36475
36589
  }
36476
36590
  this.opened.emit({ owner: this });
36477
36591
  }
36478
- /**
36479
- * @hidden @internal
36480
- */
36481
- handleClosing(e) {
36482
- const args = { owner: this, event: e.event, cancel: e.cancel };
36483
- this.closing.emit(args);
36484
- e.cancel = args.cancel;
36485
- if (e.cancel) {
36486
- return;
36592
+ /** @hidden @internal */
36593
+ focusSearchInput(opening) {
36594
+ if (this.displaySearchInput && this.searchInput) {
36595
+ this.searchInput.nativeElement.focus();
36596
+ }
36597
+ else {
36598
+ if (opening) {
36599
+ this.dropdownContainer.nativeElement.focus();
36600
+ }
36601
+ else {
36602
+ this.comboInput.nativeElement.focus();
36603
+ this.toggle();
36604
+ }
36487
36605
  }
36488
- this.searchValue = '';
36489
- this.comboInput.nativeElement.focus();
36490
- }
36491
- /**
36492
- * @hidden @internal
36493
- */
36494
- handleClosed() {
36495
- this.closed.emit({ owner: this });
36496
- }
36497
- /**
36498
- * @hidden @internal
36499
- */
36500
- toggleCaseSensitive() {
36501
- this.filteringOptions = { caseSensitive: !this.filteringOptions.caseSensitive };
36502
36606
  }
36503
36607
  setSelection(newSelection, event) {
36504
- const removed = diffInSets(this.selection.get(this.id), newSelection);
36505
- const added = diffInSets(newSelection, this.selection.get(this.id));
36608
+ const removed = diffInSets(this.selectionService.get(this.id), newSelection);
36609
+ const added = diffInSets(newSelection, this.selectionService.get(this.id));
36506
36610
  const newSelectionAsArray = Array.from(newSelection);
36507
- const oldSelectionAsArray = Array.from(this.selection.get(this.id) || []);
36611
+ const oldSelectionAsArray = Array.from(this.selectionService.get(this.id) || []);
36508
36612
  const displayText = this.createDisplayText(newSelectionAsArray, oldSelectionAsArray);
36509
36613
  const args = {
36510
36614
  newSelection: newSelectionAsArray,
@@ -36518,7 +36622,7 @@ class IgxComboComponent extends DisplayDensityBase {
36518
36622
  };
36519
36623
  this.selectionChanging.emit(args);
36520
36624
  if (!args.cancel) {
36521
- this.selection.select_items(this.id, args.newSelection, true);
36625
+ this.selectionService.select_items(this.id, args.newSelection, true);
36522
36626
  if (displayText !== args.displayText) {
36523
36627
  this._value = args.displayText;
36524
36628
  }
@@ -36528,44 +36632,10 @@ class IgxComboComponent extends DisplayDensityBase {
36528
36632
  this._onChangeCallback(args.newSelection);
36529
36633
  }
36530
36634
  }
36531
- manageRequiredAsterisk() {
36532
- if (this.ngControl && this.ngControl.control.validator) {
36533
- // Run the validation with empty object to check if required is enabled.
36534
- const error = this.ngControl.control.validator({});
36535
- this.inputGroup.isRequired = error && error.required;
36536
- }
36537
- }
36538
- /** Contains key-value pairs of the selected valueKeys and their resp. displayKeys */
36539
- registerRemoteEntries(ids, add = true) {
36540
- if (add) {
36541
- const selection = this.getValueDisplayPairs(ids);
36542
- for (const entry of selection) {
36543
- this._remoteSelection[entry[this.valueKey]] = entry[this.displayKey];
36544
- }
36545
- }
36546
- else {
36547
- for (const entry of ids) {
36548
- delete this._remoteSelection[entry];
36549
- }
36550
- }
36551
- }
36552
- /**
36553
- * For `id: any[]` returns a mapped `{ [combo.valueKey]: any, [combo.displayKey]: any }[]`
36554
- */
36555
- getValueDisplayPairs(ids) {
36556
- return this.data.filter(entry => ids.indexOf(entry[this.valueKey]) > -1).map(e => ({
36557
- [this.valueKey]: e[this.valueKey],
36558
- [this.displayKey]: e[this.displayKey]
36559
- }));
36560
- }
36561
- checkMatch() {
36562
- const displayKey = this.displayKey;
36563
- const matchFn = (e) => {
36564
- const value = displayKey ? e[displayKey] : e;
36565
- return value.toString().toLowerCase() === this.searchValue.trim().toLowerCase();
36566
- };
36567
- const itemMatch = this.filteredData.some(matchFn);
36568
- this.customValueFlag = this.allowCustomValues && !itemMatch;
36635
+ createDisplayText(newSelection, oldSelection) {
36636
+ return this.isRemote
36637
+ ? this.getRemoteSelection(newSelection, oldSelection)
36638
+ : this.concatDisplayText(newSelection);
36569
36639
  }
36570
36640
  /** Returns a string that should be populated in the combo's text box */
36571
36641
  concatDisplayText(selection) {
@@ -36574,44 +36644,11 @@ class IgxComboComponent extends DisplayDensityBase {
36574
36644
  selection.join(', ');
36575
36645
  return value;
36576
36646
  }
36577
- /**
36578
- * Constructs the combo display value
36579
- * If remote, caches the key displayText
36580
- * If not, just combine the object.displayKeys
36581
- */
36582
- createDisplayText(newSelection, oldSelection) {
36583
- let value = '';
36584
- if (this.isRemote) {
36585
- if (newSelection.length) {
36586
- const removedItems = oldSelection.filter(e => newSelection.indexOf(e) < 0);
36587
- const addedItems = newSelection.filter(e => oldSelection.indexOf(e) < 0);
36588
- this.registerRemoteEntries(addedItems);
36589
- this.registerRemoteEntries(removedItems, false);
36590
- value = Object.keys(this._remoteSelection).map(e => this._remoteSelection[e]).join(', ');
36591
- }
36592
- else {
36593
- // If new selection is empty, clear all items
36594
- this.registerRemoteEntries(oldSelection, false);
36595
- }
36596
- }
36597
- else {
36598
- value = this.concatDisplayText(newSelection);
36599
- }
36600
- return value;
36601
- }
36602
- /** if there is a valueKey - map the keys to data items, else - just return the keys */
36603
- convertKeysToItems(keys) {
36604
- if (this.comboAPI.valueKey === null) {
36605
- return keys;
36606
- }
36607
- // map keys vs. filter data to retain the order of the selected items
36608
- return keys.map(key => this.data.find(entry => entry[this.valueKey] === key)).filter(e => e !== undefined);
36609
- }
36610
36647
  }
36611
36648
  IgxComboComponent.decorators = [
36612
36649
  { type: Component, args: [{
36613
36650
  selector: 'igx-combo',
36614
- 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",
36651
+ 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",
36615
36652
  providers: [
36616
36653
  IgxComboAPIService,
36617
36654
  { provide: IGX_COMBO_COMPONENT, useExisting: IgxComboComponent },
@@ -36630,56 +36667,11 @@ IgxComboComponent.ctorParameters = () => [
36630
36667
  { type: Injector, decorators: [{ type: Optional }] }
36631
36668
  ];
36632
36669
  IgxComboComponent.propDecorators = {
36633
- overlaySettings: [{ type: Input }],
36634
- inputGroup: [{ type: ViewChild, args: ['inputGroup', { read: IgxInputGroupComponent, static: true },] }],
36635
- comboInput: [{ type: ViewChild, args: ['comboInput', { read: IgxInputDirective, static: true },] }],
36636
- dropdown: [{ type: ViewChild, args: [IgxComboDropDownComponent, { read: IgxComboDropDownComponent, static: true },] }],
36637
- searchInput: [{ type: ViewChild, args: ['searchInput',] }],
36638
- itemTemplate: [{ type: ContentChild, args: [IgxComboItemDirective, { read: TemplateRef },] }],
36639
- headerTemplate: [{ type: ContentChild, args: [IgxComboHeaderDirective, { read: TemplateRef },] }],
36640
- footerTemplate: [{ type: ContentChild, args: [IgxComboFooterDirective, { read: TemplateRef },] }],
36641
- headerItemTemplate: [{ type: ContentChild, args: [IgxComboHeaderItemDirective, { read: TemplateRef },] }],
36642
- addItemTemplate: [{ type: ContentChild, args: [IgxComboAddItemDirective, { read: TemplateRef },] }],
36643
- emptyTemplate: [{ type: ContentChild, args: [IgxComboEmptyDirective, { read: TemplateRef },] }],
36644
- toggleIconTemplate: [{ type: ContentChild, args: [IgxComboToggleIconDirective, { read: TemplateRef },] }],
36645
- clearIconTemplate: [{ type: ContentChild, args: [IgxComboClearIconDirective, { read: TemplateRef },] }],
36646
- virtualScrollContainer: [{ type: ViewChild, args: [IgxForOfDirective, { static: true },] }],
36647
- selectionChanging: [{ type: Output }],
36648
- opening: [{ type: Output }],
36649
- opened: [{ type: Output }],
36650
- closing: [{ type: Output }],
36651
- closed: [{ type: Output }],
36652
- addition: [{ type: Output }],
36653
- searchInputUpdate: [{ type: Output }],
36654
- dataPreLoad: [{ type: Output }],
36655
- id: [{ type: HostBinding, args: ['attr.id',] }, { type: Input }],
36656
- width: [{ type: HostBinding, args: ['style.width',] }, { type: Input }],
36657
- cssClass: [{ type: HostBinding, args: ['class.igx-combo',] }],
36658
- role: [{ type: HostBinding, args: [`attr.role`,] }],
36659
- ariaExpanded: [{ type: HostBinding, args: ['attr.aria-expanded',] }],
36660
- hasPopUp: [{ type: HostBinding, args: ['attr.aria-haspopup',] }],
36661
- ariaOwns: [{ type: HostBinding, args: ['attr.aria-owns',] }],
36662
- allowCustomValues: [{ type: Input }],
36663
- itemsMaxHeight: [{ type: Input }],
36664
- itemsWidth: [{ type: Input }],
36665
- itemHeight: [{ type: Input }],
36666
- placeholder: [{ type: Input }],
36667
- searchPlaceholder: [{ type: Input }],
36668
- showSearchCaseIcon: [{ type: Input }],
36669
- data: [{ type: Input }],
36670
- valueKey: [{ type: Input }],
36671
- displayKey: [{ type: Input }],
36672
- groupKey: [{ type: Input }],
36673
- filterable: [{ type: Input }],
36674
- ariaLabelledBy: [{ type: Input }, { type: HostBinding, args: ['attr.aria-labelledby',] }],
36675
- disabled: [{ type: Input }],
36676
- type: [{ type: Input }],
36677
36670
  autoFocusSearch: [{ type: Input }],
36678
- dropdownContainer: [{ type: ViewChild, args: ['dropdownItemContainer', { static: true },] }],
36679
- primitiveTemplate: [{ type: ViewChild, args: ['primitive', { read: TemplateRef, static: true },] }],
36680
- complexTemplate: [{ type: ViewChild, args: ['complex', { read: TemplateRef, static: true },] }],
36681
- virtDir: [{ type: ViewChild, args: [IgxForOfDirective, { read: IgxForOfDirective, static: true },] }],
36682
- onArrowDown: [{ type: HostListener, args: ['keydown.ArrowDown', ['$event'],] }, { type: HostListener, args: ['keydown.Alt.ArrowDown', ['$event'],] }]
36671
+ filterable: [{ type: Input }],
36672
+ searchPlaceholder: [{ type: Input }],
36673
+ selectionChanging: [{ type: Output }],
36674
+ dropdown: [{ type: ViewChild, args: [IgxComboDropDownComponent, { static: true },] }]
36683
36675
  };
36684
36676
  /**
36685
36677
  * @hidden
@@ -36699,6 +36691,8 @@ IgxComboModule.decorators = [
36699
36691
  IgxComboToggleIconDirective,
36700
36692
  IgxComboClearIconDirective],
36701
36693
  exports: [IgxComboComponent, IgxComboItemComponent, IgxComboDropDownComponent, IgxComboAddItemComponent,
36694
+ IgxComboGroupingPipe,
36695
+ IgxComboFilteringPipe,
36702
36696
  IgxComboItemDirective,
36703
36697
  IgxComboEmptyDirective,
36704
36698
  IgxComboHeaderItemDirective,
@@ -36713,6 +36707,375 @@ IgxComboModule.decorators = [
36713
36707
  },] }
36714
36708
  ];
36715
36709
 
36710
+ /**
36711
+ * Represents a drop-down list that provides filtering functionality, allowing users to choose a single option from a predefined list.
36712
+ *
36713
+ * @igxModule IgxSimpleComboModule
36714
+ * @igxTheme igx-combo-theme
36715
+ * @igxKeywords combobox, single combo selection
36716
+ * @igxGroup Grids & Lists
36717
+ *
36718
+ * @remarks
36719
+ * It provides the ability to filter items as well as perform single selection on the provided data.
36720
+ * Additionally, it exposes keyboard navigation and custom styling capabilities.
36721
+ * @example
36722
+ * ```html
36723
+ * <igx-simple-combo [itemsMaxHeight]="250" [data]="locationData"
36724
+ * [displayKey]="'field'" [valueKey]="'field'"
36725
+ * placeholder="Location" searchPlaceholder="Search...">
36726
+ * </igx-simple-combo>
36727
+ * ```
36728
+ */
36729
+ class IgxSimpleComboComponent extends IgxComboBaseDirective {
36730
+ constructor(elementRef, cdr, selectionService, comboAPI, _iconService, platformUtil, _displayDensityOptions, _inputGroupType, _injector) {
36731
+ super(elementRef, cdr, selectionService, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector);
36732
+ this.elementRef = elementRef;
36733
+ this.cdr = cdr;
36734
+ this.selectionService = selectionService;
36735
+ this.comboAPI = comboAPI;
36736
+ this._iconService = _iconService;
36737
+ this.platformUtil = platformUtil;
36738
+ this._displayDensityOptions = _displayDensityOptions;
36739
+ this._inputGroupType = _inputGroupType;
36740
+ this._injector = _injector;
36741
+ /**
36742
+ * Emitted when item selection is changing, before the selection completes
36743
+ *
36744
+ * ```html
36745
+ * <igx-simple-combo (selectionChanging)='handleSelection()'></igx-simple-combo>
36746
+ * ```
36747
+ */
36748
+ this.selectionChanging = new EventEmitter();
36749
+ /** @hidden @internal */
36750
+ this.composing = false;
36751
+ this._updateInput = true;
36752
+ this.findMatch = (element) => {
36753
+ const value = this.displayKey ? element[this.displayKey] : element;
36754
+ return value.toString().toLowerCase().includes(this.searchValue.trim().toLowerCase());
36755
+ };
36756
+ this.comboAPI.register(this);
36757
+ }
36758
+ /** @hidden @internal */
36759
+ get filteredData() {
36760
+ return this._filteredData;
36761
+ }
36762
+ /** @hidden @internal */
36763
+ set filteredData(val) {
36764
+ this._filteredData = this.groupKey ? (val || []).filter((e) => e.isHeader !== true) : val;
36765
+ this.checkMatch();
36766
+ }
36767
+ /** @hidden @internal */
36768
+ onArrowDown(event) {
36769
+ if (this.collapsed) {
36770
+ event.preventDefault();
36771
+ event.stopPropagation();
36772
+ this.open();
36773
+ }
36774
+ else {
36775
+ if (this.virtDir.igxForOf.length > 0) {
36776
+ this.dropdown.navigateFirst();
36777
+ this.dropdownContainer.nativeElement.focus();
36778
+ }
36779
+ else if (this.allowCustomValues) {
36780
+ this.addItem.element.nativeElement.focus();
36781
+ }
36782
+ }
36783
+ }
36784
+ /**
36785
+ * Select a defined item
36786
+ *
36787
+ * @param item the item to be selected
36788
+ * ```typescript
36789
+ * this.combo.select("New York");
36790
+ * ```
36791
+ */
36792
+ select(item) {
36793
+ if (item !== null && item !== undefined) {
36794
+ const newSelection = this.selectionService.add_items(this.id, item instanceof Array ? item : [item], true);
36795
+ this.setSelection(newSelection);
36796
+ }
36797
+ }
36798
+ /**
36799
+ * Deselect the currently selected item
36800
+ *
36801
+ * @param item the items to be deselected
36802
+ * ```typescript
36803
+ * this.combo.deselect("New York");
36804
+ * ```
36805
+ */
36806
+ deselect() {
36807
+ this.clearSelection();
36808
+ }
36809
+ /** @hidden @internal */
36810
+ writeValue(value) {
36811
+ const oldSelection = this.selection;
36812
+ this.selectionService.select_items(this.id, value ? [value] : [], true);
36813
+ this.cdr.markForCheck();
36814
+ this._value = this.createDisplayText(this.selection, oldSelection);
36815
+ }
36816
+ /** @hidden @internal */
36817
+ ngAfterViewInit() {
36818
+ this.virtDir.contentSizeChange.pipe(takeUntil(this.destroy$)).subscribe(() => {
36819
+ if (this.selection.length > 0) {
36820
+ const index = this.virtDir.igxForOf.findIndex(e => {
36821
+ let current = e[this.valueKey];
36822
+ if (this.valueKey === null || this.valueKey === undefined) {
36823
+ current = e;
36824
+ }
36825
+ return current === this.selection[0];
36826
+ });
36827
+ this.dropdown.navigateItem(index);
36828
+ }
36829
+ });
36830
+ this.dropdown.opened.pipe(takeUntil(this.destroy$)).subscribe(() => {
36831
+ if (this.composing) {
36832
+ this.comboInput.focus();
36833
+ }
36834
+ });
36835
+ this.dropdown.closing.pipe(takeUntil(this.destroy$)).subscribe((args) => {
36836
+ if (this.getEditElement() && !args.event) {
36837
+ this.comboInput.focus();
36838
+ }
36839
+ else {
36840
+ this.clearOnBlur();
36841
+ this._onTouchedCallback();
36842
+ }
36843
+ });
36844
+ super.ngAfterViewInit();
36845
+ }
36846
+ /** @hidden @internal */
36847
+ handleInputChange(event) {
36848
+ this.searchValue = event.target.value;
36849
+ this._onChangeCallback(this.searchValue);
36850
+ if (this.collapsed && this.comboInput.focused) {
36851
+ this.open();
36852
+ this.dropdown.navigateFirst();
36853
+ }
36854
+ if (!this.comboInput.value.trim()) {
36855
+ // handle clearing of input by space
36856
+ this.clearSelection();
36857
+ this._onChangeCallback(null);
36858
+ }
36859
+ super.handleInputChange(event);
36860
+ this.composing = true;
36861
+ }
36862
+ /** @hidden @internal */
36863
+ handleKeyDown(event) {
36864
+ if (event.key === this.platformUtil.KEYMAP.ENTER) {
36865
+ const filtered = this.filteredData.find(this.findMatch);
36866
+ if (filtered === null || filtered === undefined) {
36867
+ return;
36868
+ }
36869
+ this.select(this.dropdown.focusedItem.itemID);
36870
+ event.preventDefault();
36871
+ event.stopPropagation();
36872
+ this.close();
36873
+ // manually trigger text selection as it will not be triggered during editing
36874
+ this.textSelection.trigger();
36875
+ return;
36876
+ }
36877
+ if (event.key === this.platformUtil.KEYMAP.BACKSPACE
36878
+ || event.key === this.platformUtil.KEYMAP.DELETE) {
36879
+ this._updateInput = false;
36880
+ this.clearSelection();
36881
+ }
36882
+ if (!this.collapsed && event.key === this.platformUtil.KEYMAP.TAB) {
36883
+ this.close();
36884
+ this.clearOnBlur();
36885
+ }
36886
+ this.composing = false;
36887
+ super.handleKeyDown(event);
36888
+ }
36889
+ /** @hidden @internal */
36890
+ handleKeyUp(event) {
36891
+ if (event.key === this.platformUtil.KEYMAP.ARROW_DOWN) {
36892
+ const firstItem = this.selectionService.first_item(this.id);
36893
+ this.dropdown.focusedItem = firstItem && this.filteredData.length > 0
36894
+ ? this.dropdown.items.find(i => i.itemID === firstItem)
36895
+ : this.dropdown.items[0];
36896
+ this.dropdownContainer.nativeElement.focus();
36897
+ }
36898
+ }
36899
+ /** @hidden @internal */
36900
+ handleItemKeyDown(event) {
36901
+ if (event.key === this.platformUtil.KEYMAP.ARROW_UP && event.altKey) {
36902
+ this.close();
36903
+ this.comboInput.focus();
36904
+ return;
36905
+ }
36906
+ if (event.key === this.platformUtil.KEYMAP.ENTER) {
36907
+ this.comboInput.focus();
36908
+ }
36909
+ }
36910
+ /** @hidden @internal */
36911
+ handleItemClick() {
36912
+ this.close();
36913
+ this.comboInput.focus();
36914
+ }
36915
+ /** @hidden @internal */
36916
+ onBlur() {
36917
+ if (this.collapsed) {
36918
+ this.clearOnBlur();
36919
+ }
36920
+ super.onBlur();
36921
+ }
36922
+ /** @hidden @internal */
36923
+ getEditElement() {
36924
+ return this.comboInput.nativeElement;
36925
+ }
36926
+ /** @hidden @internal */
36927
+ handleClear(event) {
36928
+ if (this.disabled) {
36929
+ return;
36930
+ }
36931
+ this.clearSelection(true);
36932
+ if (this.collapsed) {
36933
+ this.open();
36934
+ this.dropdown.navigateFirst();
36935
+ }
36936
+ else {
36937
+ this.focusSearchInput(true);
36938
+ }
36939
+ event.stopPropagation();
36940
+ this.comboInput.value = this.filterValue = this.searchValue = '';
36941
+ this.dropdown.focusedItem = null;
36942
+ this.composing = false;
36943
+ this.comboInput.focus();
36944
+ }
36945
+ /** @hidden @internal */
36946
+ handleOpened() {
36947
+ this.triggerCheck();
36948
+ this.dropdownContainer.nativeElement.focus();
36949
+ this.opened.emit({ owner: this });
36950
+ }
36951
+ /** @hidden @internal */
36952
+ handleClosing(e) {
36953
+ const args = { owner: this, event: e.event, cancel: e.cancel };
36954
+ this.closing.emit(args);
36955
+ e.cancel = args.cancel;
36956
+ if (e.cancel) {
36957
+ return;
36958
+ }
36959
+ this.composing = false;
36960
+ // explicitly update selection and trigger text selection so that we don't have to force CD
36961
+ this.textSelection.selected = true;
36962
+ this.textSelection.trigger();
36963
+ }
36964
+ /** @hidden @internal */
36965
+ focusSearchInput(opening) {
36966
+ if (opening) {
36967
+ this.dropdownContainer.nativeElement.focus();
36968
+ }
36969
+ else {
36970
+ this.comboInput.nativeElement.focus();
36971
+ this.toggle();
36972
+ }
36973
+ }
36974
+ /** @hidden @internal */
36975
+ onClick(event) {
36976
+ super.onClick(event);
36977
+ if (this.comboInput.value.length === 0) {
36978
+ this.virtDir.scrollTo(0);
36979
+ }
36980
+ }
36981
+ setSelection(newSelection) {
36982
+ const newSelectionAsArray = newSelection ? Array.from(newSelection) : [];
36983
+ const oldSelectionAsArray = Array.from(this.selectionService.get(this.id) || []);
36984
+ const displayText = this.createDisplayText(newSelectionAsArray, oldSelectionAsArray);
36985
+ const args = {
36986
+ newSelection: newSelectionAsArray[0],
36987
+ oldSelection: oldSelectionAsArray[0],
36988
+ displayText,
36989
+ owner: this,
36990
+ cancel: false
36991
+ };
36992
+ this.selectionChanging.emit(args);
36993
+ if (!args.cancel) {
36994
+ const argsSelection = args.newSelection !== undefined
36995
+ && args.newSelection !== null
36996
+ ? [args.newSelection]
36997
+ : [];
36998
+ this.selectionService.select_items(this.id, argsSelection, true);
36999
+ if (this._updateInput) {
37000
+ this.comboInput.value = this._value = displayText !== args.displayText
37001
+ ? args.displayText
37002
+ : this.createDisplayText(argsSelection, [args.oldSelection]);
37003
+ }
37004
+ this._onChangeCallback(args.newSelection);
37005
+ this._updateInput = true;
37006
+ }
37007
+ }
37008
+ createDisplayText(newSelection, oldSelection) {
37009
+ if (this.isRemote) {
37010
+ return this.getRemoteSelection(newSelection, oldSelection);
37011
+ }
37012
+ if (this.displayKey !== null && this.displayKey !== undefined
37013
+ && newSelection.length > 0) {
37014
+ return this.convertKeysToItems(newSelection).map(e => e[this.displayKey])[0];
37015
+ }
37016
+ return newSelection[0] || '';
37017
+ }
37018
+ clearSelection(ignoreFilter) {
37019
+ let newSelection = this.selectionService.get_empty();
37020
+ if (this.filteredData.length !== this.data.length && !ignoreFilter) {
37021
+ newSelection = this.selectionService.delete_items(this.id, this.selectionService.get_all_ids(this.filteredData, this.valueKey));
37022
+ }
37023
+ this.setSelection(newSelection);
37024
+ }
37025
+ clearOnBlur() {
37026
+ const filtered = this.filteredData.find(this.findMatch);
37027
+ if ((filtered === undefined || filtered === null)) {
37028
+ this.close();
37029
+ this.clearSelection();
37030
+ this.searchValue = '';
37031
+ }
37032
+ }
37033
+ }
37034
+ IgxSimpleComboComponent.decorators = [
37035
+ { type: Component, args: [{
37036
+ selector: 'igx-simple-combo',
37037
+ template: "<igx-input-group #inputGroup [displayDensity]=\"displayDensity\" [suppressInputAutofocus]=\"true\" [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\" aria-autocomplete=\"both\"\n [attr.aria-owns]=\"dropdown.id\" [attr.aria-labelledby]=\"ariaLabelledBy\" [disabled]=\"disabled\"\n [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 *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-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 (keydown)=\"handleItemKeyDown($event)\">\n <igx-combo-item role=\"option\" [singleMode]=\"true\" [itemHeight]='itemHeight' (click)=\"handleItemClick()\" *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 #addItem [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",
37038
+ providers: [
37039
+ IgxComboAPIService,
37040
+ { provide: IGX_COMBO_COMPONENT, useExisting: IgxSimpleComboComponent },
37041
+ { provide: NG_VALUE_ACCESSOR, useExisting: IgxSimpleComboComponent, multi: true }
37042
+ ]
37043
+ },] }
37044
+ ];
37045
+ IgxSimpleComboComponent.ctorParameters = () => [
37046
+ { type: ElementRef },
37047
+ { type: ChangeDetectorRef },
37048
+ { type: IgxSelectionAPIService },
37049
+ { type: IgxComboAPIService },
37050
+ { type: IgxIconService },
37051
+ { type: PlatformUtil },
37052
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] },
37053
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [IGX_INPUT_GROUP_TYPE,] }] },
37054
+ { type: Injector, decorators: [{ type: Optional }] }
37055
+ ];
37056
+ IgxSimpleComboComponent.propDecorators = {
37057
+ dropdown: [{ type: ViewChild, args: [IgxComboDropDownComponent, { static: true },] }],
37058
+ addItem: [{ type: ViewChild, args: [IgxComboAddItemComponent,] }],
37059
+ selectionChanging: [{ type: Output }],
37060
+ textSelection: [{ type: ViewChild, args: [IgxTextSelectionDirective, { static: true },] }],
37061
+ onArrowDown: [{ type: HostListener, args: ['keydown.ArrowDown', ['$event'],] }, { type: HostListener, args: ['keydown.Alt.ArrowDown', ['$event'],] }]
37062
+ };
37063
+ class IgxSimpleComboModule {
37064
+ }
37065
+ IgxSimpleComboModule.decorators = [
37066
+ { type: NgModule, args: [{
37067
+ declarations: [IgxSimpleComboComponent],
37068
+ imports: [
37069
+ IgxComboModule, IgxRippleModule, CommonModule,
37070
+ IgxInputGroupModule, FormsModule, ReactiveFormsModule,
37071
+ IgxForOfModule, IgxToggleModule, IgxCheckboxModule,
37072
+ IgxDropDownModule, IgxButtonModule, IgxIconModule,
37073
+ IgxTextSelectionModule
37074
+ ],
37075
+ exports: [IgxSimpleComboComponent, IgxComboModule]
37076
+ },] }
37077
+ ];
37078
+
36716
37079
  /** Header orientation in `dialog` mode. */
36717
37080
  const PickerHeaderOrientation = mkenum({
36718
37081
  Horizontal: 'horizontal',
@@ -39089,7 +39452,7 @@ IgxGridExcelStyleFilteringComponent.decorators = [
39089
39452
  { type: Component, args: [{
39090
39453
  changeDetection: ChangeDetectionStrategy.OnPush,
39091
39454
  selector: 'igx-grid-excel-style-filtering',
39092
- template: "<ng-template #defaultExcelColumnOperations>\n <igx-excel-style-header\n [showHiding]=\"displayDensity !== 'comfortable' && !column?.disableHiding\"\n [showPinning]=\"displayDensity !== 'comfortable' && !column?.disablePinning\"\n [showSelecting]=\"displayDensity !== 'comfortable' && columnSelectable()\"\n >\n </igx-excel-style-header>\n\n <igx-excel-style-sorting *ngIf=\"column?.sortable\">\n </igx-excel-style-sorting>\n\n <igx-excel-style-moving *ngIf=\"column?.movable\">\n </igx-excel-style-moving>\n\n <igx-excel-style-pinning *ngIf=\"!column?.disablePinning && displayDensity==='comfortable'\">\n </igx-excel-style-pinning>\n\n <igx-excel-style-hiding *ngIf=\"!column?.disableHiding && displayDensity==='comfortable'\">\n </igx-excel-style-hiding>\n\n <igx-excel-style-selecting *ngIf=\"columnSelectable() && displayDensity==='comfortable'\">\n </igx-excel-style-selecting>\n</ng-template>\n\n<ng-template #defaultExcelFilterOperations>\n <igx-excel-style-clear-filters>\n </igx-excel-style-clear-filters>\n\n <igx-excel-style-conditional-filter>\n </igx-excel-style-conditional-filter>\n\n <igx-excel-style-search>\n </igx-excel-style-search>\n</ng-template>\n\n<article #mainDropdown\n class=\"igx-excel-filter__menu\"\n [ngClass]=\"{\n 'igx-excel-filter__menu--cosy': displayDensity === 'cosy',\n 'igx-excel-filter__menu--compact': displayDensity === 'compact'\n }\"\n [id]=\"overlayComponentId\"\n (keydown)=\"onKeyDown($event)\"\n [style.min-height]=\"minHeight\"\n [style.max-height]=\"maxHeight\">\n\n <ng-container *ngIf=\"this.excelColumnOperationsDirective; else defaultExcelColumnOperations\">\n <ng-content select=\"igx-excel-style-column-operations,[igxExcelStyleColumnOperations]\">\n </ng-content>\n </ng-container>\n\n <ng-container *ngIf=\"this.excelFilterOperationsDirective; else defaultExcelFilterOperations\">\n <ng-content select=\"igx-excel-style-filter-operations,[igxExcelStyleFilterOperations]\">\n </ng-content>\n </ng-container>\n</article>\n"
39455
+ template: "<ng-template #defaultExcelColumnOperations>\n <igx-excel-style-header\n [showHiding]=\"displayDensity !== 'comfortable' && !column?.disableHiding\"\n [showPinning]=\"displayDensity !== 'comfortable' && !column?.disablePinning\"\n [showSelecting]=\"displayDensity !== 'comfortable' && columnSelectable()\"\n >\n </igx-excel-style-header>\n\n <igx-excel-style-sorting *ngIf=\"column?.sortable\">\n </igx-excel-style-sorting>\n\n <igx-excel-style-moving *ngIf=\"column?.movable\">\n </igx-excel-style-moving>\n\n <igx-excel-style-pinning *ngIf=\"!column?.disablePinning && displayDensity==='comfortable'\">\n </igx-excel-style-pinning>\n\n <igx-excel-style-hiding *ngIf=\"!column?.disableHiding && displayDensity==='comfortable'\">\n </igx-excel-style-hiding>\n\n <igx-excel-style-selecting *ngIf=\"columnSelectable() && displayDensity==='comfortable'\">\n </igx-excel-style-selecting>\n</ng-template>\n\n<ng-template #defaultExcelFilterOperations>\n <igx-excel-style-clear-filters>\n </igx-excel-style-clear-filters>\n\n <igx-excel-style-conditional-filter>\n </igx-excel-style-conditional-filter>\n\n <igx-excel-style-search>\n </igx-excel-style-search>\n</ng-template>\n\n<article #mainDropdown\n class=\"igx-excel-filter__menu\"\n [ngClass]=\"{\n 'igx-excel-filter__menu--cosy': displayDensity === 'cosy',\n 'igx-excel-filter__menu--compact': displayDensity === 'compact'\n }\"\n [id]=\"overlayComponentId\"\n (keydown)=\"onKeyDown($event)\"\n [style.min-height]=\"minHeight\"\n [style.max-height]=\"maxHeight\"\n role=\"menu\">\n\n <ng-container *ngIf=\"this.excelColumnOperationsDirective; else defaultExcelColumnOperations\">\n <ng-content select=\"igx-excel-style-column-operations,[igxExcelStyleColumnOperations]\">\n </ng-content>\n </ng-container>\n\n <ng-container *ngIf=\"this.excelFilterOperationsDirective; else defaultExcelFilterOperations\">\n <ng-content select=\"igx-excel-style-filter-operations,[igxExcelStyleFilterOperations]\">\n </ng-content>\n </ng-container>\n</article>\n"
39093
39456
  },] }
39094
39457
  ];
39095
39458
  IgxGridExcelStyleFilteringComponent.ctorParameters = () => [
@@ -40643,7 +41006,7 @@ IgxExcelStyleDateExpressionComponent.decorators = [
40643
41006
  { type: Component, args: [{
40644
41007
  preserveWhitespaces: false,
40645
41008
  selector: 'igx-excel-style-date-expression',
40646
- template: "<igx-select #dropdownConditions\n type=\"box\"\n [displayDensity]=\"displayDensity\"\n [placeholder]=\"conditionsPlaceholder\"\n (selectionChanging)=\"onConditionsChanged($event)\"\n [overlaySettings]=\"dropDownOverlaySettings\">\n <igx-prefix>\n <igx-icon *ngIf=\"expressionUI.expression.condition\" family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n <igx-icon *ngIf=\"!expressionUI.expression.condition\">filter_list</igx-icon>\n </igx-prefix>\n <igx-select-item *ngFor=\"let condition of conditions\" [value]=\"condition\" [selected]=\"isConditionSelected(condition)\">\n <igx-icon family=\"imx-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span>{{translateCondition(condition)}}</span>\n </igx-select-item>\n</igx-select>\n\n<igx-date-picker #picker *ngIf=\"column.dataType === 'date'\"\n [(value)]=\"expressionUI.expression.searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n [displayDensity]=\"displayDensity\"\n (click)=\"picker.open()\"\n [readOnly]=\"true\"\n [placeholder]=\"inputDatePlaceholder\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\">\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n</igx-date-picker>\n\n<igx-time-picker #picker *ngIf=\"column.dataType === 'time'\"\n [inputFormat]=\"column.defaultTimeFormat\"\n [(value)]=\"expressionUI.expression.searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n [displayDensity]=\"displayDensity\"\n (click)=\"picker.open()\"\n [readOnly]=\"true\"\n [placeholder]=\"inputTimePlaceholder\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\">\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n</igx-time-picker>\n\n<igx-input-group #dropDownTarget *ngIf=\"column.dataType === 'dateTime'\" #inputGroup type=\"box\" [displayDensity]=\"displayDensity\">\n <input #input igxInput tabindex=\"0\"\n [placeholder]=\"inputDatePlaceholder\"\n [igxDateTimeEditor]=\"column.defaultDateTimeFormat\"\n [(ngModel)]=\"expressionUI.expression.searchVal\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"/>\n</igx-input-group>\n\n<button (click)=\"onRemoveButtonClick()\" igxButton=\"icon\" [displayDensity]=\"displayDensity\" *ngIf=\"!isSingle\" >\n <igx-icon>cancel</igx-icon>\n</button>\n\n<igx-buttongroup #logicOperatorButtonGroup\n *ngIf=\"!isLast\"\n [multiSelection]=\"false\">\n <span igxButton [displayDensity]=\"displayDensity\"\n #andButton\n (keydown)=\"onLogicOperatorKeyDown($event, 0)\"\n tabindex=\"0\"\n [selected]=\"expressionUI.afterOperator === 0\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 0)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_and }}\n </span>\n\n <span igxButton [displayDensity]=\"displayDensity\"\n #orButton\n tabindex=\"0\"\n (keydown)=\"onLogicOperatorKeyDown($event, 1)\"\n [selected]=\"expressionUI.afterOperator === 1\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 1)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_or }}\n </span>\n</igx-buttongroup>\n\n<div #overlayOutlet\n igxOverlayOutlet\n (pointerdown)=\"onOutletPointerDown($event)\">\n</div>\n"
41009
+ template: "<igx-select #dropdownConditions\n type=\"box\"\n [displayDensity]=\"displayDensity\"\n [placeholder]=\"conditionsPlaceholder\"\n (selectionChanging)=\"onConditionsChanged($event)\"\n [overlaySettings]=\"dropDownOverlaySettings\">\n <igx-prefix>\n <igx-icon *ngIf=\"expressionUI.expression.condition\" family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n <igx-icon *ngIf=\"!expressionUI.expression.condition\">filter_list</igx-icon>\n </igx-prefix>\n <igx-select-item *ngFor=\"let condition of conditions\" [value]=\"condition\" [text]=\"getConditionFriendlyName(condition)\" [selected]=\"isConditionSelected(condition)\">\n <igx-icon family=\"imx-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span>{{translateCondition(condition)}}</span>\n </igx-select-item>\n</igx-select>\n\n<igx-date-picker #picker *ngIf=\"column.dataType === 'date'\"\n [(value)]=\"expressionUI.expression.searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n [displayDensity]=\"displayDensity\"\n (click)=\"picker.open()\"\n [readOnly]=\"true\"\n [placeholder]=\"inputDatePlaceholder\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\">\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n</igx-date-picker>\n\n<igx-time-picker #picker *ngIf=\"column.dataType === 'time'\"\n [inputFormat]=\"column.defaultTimeFormat\"\n [(value)]=\"expressionUI.expression.searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n [displayDensity]=\"displayDensity\"\n (click)=\"picker.open()\"\n [readOnly]=\"true\"\n [placeholder]=\"inputTimePlaceholder\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\">\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n</igx-time-picker>\n\n<igx-input-group #dropDownTarget *ngIf=\"column.dataType === 'dateTime'\" #inputGroup type=\"box\" [displayDensity]=\"displayDensity\">\n <input #input igxInput tabindex=\"0\"\n [placeholder]=\"inputDatePlaceholder\"\n [igxDateTimeEditor]=\"column.defaultDateTimeFormat\"\n [(ngModel)]=\"expressionUI.expression.searchVal\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"/>\n</igx-input-group>\n\n<button (click)=\"onRemoveButtonClick()\" igxButton=\"icon\" [displayDensity]=\"displayDensity\" *ngIf=\"!isSingle\" >\n <igx-icon>cancel</igx-icon>\n</button>\n\n<igx-buttongroup #logicOperatorButtonGroup\n *ngIf=\"!isLast\"\n [multiSelection]=\"false\">\n <span igxButton [displayDensity]=\"displayDensity\"\n #andButton\n (keydown)=\"onLogicOperatorKeyDown($event, 0)\"\n tabindex=\"0\"\n [selected]=\"expressionUI.afterOperator === 0\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 0)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_and }}\n </span>\n\n <span igxButton [displayDensity]=\"displayDensity\"\n #orButton\n tabindex=\"0\"\n (keydown)=\"onLogicOperatorKeyDown($event, 1)\"\n [selected]=\"expressionUI.afterOperator === 1\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 1)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_or }}\n </span>\n</igx-buttongroup>\n\n<div #overlayOutlet\n igxOverlayOutlet\n (pointerdown)=\"onOutletPointerDown($event)\">\n</div>\n"
40647
41010
  },] }
40648
41011
  ];
40649
41012
  IgxExcelStyleDateExpressionComponent.propDecorators = {
@@ -46879,15 +47242,23 @@ class IgxGridFilteringRowComponent {
46879
47242
  set value(val) {
46880
47243
  if (!val && val !== 0) {
46881
47244
  this.expression.searchVal = null;
46882
- this.showHideArrowButtons();
47245
+ const index = this.expressionsList.findIndex(item => item.expression === this.expression);
47246
+ if (index === 0 && this.expressionsList.length === 1) {
47247
+ this.clearFiltering();
47248
+ return;
47249
+ }
46883
47250
  }
46884
47251
  else {
47252
+ const oldValue = this.expression.searchVal;
47253
+ if (isEqual(oldValue, val)) {
47254
+ return;
47255
+ }
46885
47256
  this.expression.searchVal = DataUtil.parseValue(this.column.dataType, val);
46886
47257
  if (this.expressionsList.find(item => item.expression === this.expression) === undefined) {
46887
47258
  this.addExpression(true);
46888
47259
  }
47260
+ this.filter();
46889
47261
  }
46890
- this.filter();
46891
47262
  }
46892
47263
  get displayDensity() {
46893
47264
  return this.column.grid.displayDensity === DisplayDensity.comfortable ? DisplayDensity.cosy : this.column.grid.displayDensity;
@@ -51091,7 +51462,7 @@ class IgxGridBaseDirective extends DisplayDensityBase {
51091
51462
  this.rendered$.pipe(takeUntil(this.destroy$)).subscribe(() => {
51092
51463
  if (this.paginator) {
51093
51464
  this.paginator.perPage = this._perPage !== DEFAULT_ITEMS_PER_PAGE ? this._perPage : this.paginator.perPage;
51094
- this.paginator.totalRecords = this.totalRecords;
51465
+ this.paginator.totalRecords = this.totalRecords ? this.totalRecords : this.paginator.totalRecords;
51095
51466
  this.paginator.overlaySettings = { outlet: this.outlet };
51096
51467
  }
51097
51468
  this._rendered = true;
@@ -64819,7 +65190,7 @@ class IgxTreeGridComponent extends IgxGridBaseDirective {
64819
65190
  // if a row has been added and before commiting the transaction deleted
64820
65191
  const leafRowsDirectParents = new Set();
64821
65192
  this.records.forEach(record => {
64822
- if (record && !record.children && record.parent) {
65193
+ if (record && (!record.children || record.children.length === 0) && record.parent) {
64823
65194
  leafRowsDirectParents.add(record.parent);
64824
65195
  }
64825
65196
  });
@@ -64835,7 +65206,7 @@ class IgxTreeGridComponent extends IgxGridBaseDirective {
64835
65206
  if (this.rowSelection === GridSelectionMode.multipleCascade) {
64836
65207
  const leafRowsDirectParents = new Set();
64837
65208
  this.records.forEach(record => {
64838
- if (record && !record.children && record.parent) {
65209
+ if (record && (!record.children || record.children.length === 0) && record.parent) {
64839
65210
  leafRowsDirectParents.add(record.parent);
64840
65211
  }
64841
65212
  });
@@ -76243,5 +76614,5 @@ IgxTreeModule.decorators = [
76243
76614
  * Generated bundle index. Do not edit.
76244
76615
  */
76245
76616
 
76246
- 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, IgxExpansionPanelTitleDirective as ɵba, IgxExpansionPanelDescriptionDirective as ɵbb, IgxExpansionPanelIconDirective as ɵbc, IgxBannerActionsDirective as ɵbd, IgxDaysViewNavigationService as ɵbe, IgxDayItemComponent as ɵbf, IgxMonthViewSlotsCalendar as ɵbg, IgxGetViewDateCalendar as ɵbh, IgxCarouselIndicatorDirective as ɵbi, IgxCarouselNextButtonDirective as ɵbj, IgxCarouselPrevButtonDirective as ɵbk, IgxComboAPIService as ɵbl, IGX_COMBO_COMPONENT as ɵbm, IgxComboDropDownComponent as ɵbo, IgxComboItemComponent 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, IgxComboFilteringPipe as ɵby, IgxComboGroupingPipe as ɵbz, IgxComboAddItemComponent as ɵca, PickerBaseDirective as ɵcb, IgxCalendarContainerComponent as ɵcc, IgxCalendarContainerModule as ɵcd, IgxDialogTitleDirective as ɵce, IgxDialogActionsDirective as ɵcf, IgxCellCrudState as ɵcg, IgxRowCrudState as ɵch, IgxRowAddCrudState as ɵci, IgxGridCRUDService as ɵcj, IgxColumnMovingService as ɵck, IgxExcelStyleCustomDialogComponent as ɵcl, IgxExcelStyleDefaultExpressionComponent as ɵcm, IgxExcelStyleDateExpressionComponent as ɵcn, HammerGesturesManager as ɵco, WatchChanges as ɵcp, WatchColumnChanges as ɵcq, notifyChanges as ɵcr, IgxNotificationsDirective as ɵcs, IgxGridColumnResizerComponent as ɵct, IgxColumnResizerDirective as ɵcu, IgxColumnResizingService as ɵcv, IgxRowSelectorDirective as ɵcw, IgxGroupByRowSelectorDirective as ɵcx, IgxHeadSelectorDirective as ɵcy, IgxRowDragDirective as ɵcz, IgxGridSelectionService as ɵd, IgxDragIndicatorIconDirective as ɵda, IgxRowDragGhostDirective as ɵdb, IgxRowDragModule as ɵdc, IgxGridHeaderRowComponent as ɵdd, IgxGridHeaderGroupComponent as ɵde, IgxGridHeaderComponent as ɵdf, IgxGridFilteringCellComponent as ɵdg, IgxFilteringService as ɵdh, IgxGridFilteringRowComponent as ɵdi, IgxGridGroupByAreaComponent as ɵdj, IgxGroupByAreaDirective as ɵdk, IgxGroupByMetaPipe as ɵdl, IgxTemplateOutletDirective as ɵdm, IgxTemplateOutletModule as ɵdn, IgxRowEditTemplateDirective as ɵdo, IgxRowEditTextDirective as ɵdp, IgxRowAddTextDirective as ɵdq, IgxRowEditActionsDirective as ɵdr, IgxRowEditTabStopDirective as ɵds, IgxSummaryRowComponent as ɵdt, IgxSummaryCellComponent as ɵdu, IgxRowDirective as ɵdv, IgxGridNavigationService as ɵdw, IgxGridSummaryService as ɵdx, ConnectedPositioningStrategy as ɵdy, IgxGridGroupByRowComponent as ɵdz, IgxTreeGridSelectionService as ɵea, IgxTreeGridGroupByAreaComponent as ɵeb, IgxRowLoadingIndicatorTemplateDirective as ɵec, IgxHierarchicalGridNavigationService as ɵed, IgxChildGridRowComponent as ɵee, IgxGridCellComponent as ɵef, IgxGridFooterComponent as ɵeg, IgxAdvancedFilteringDialogComponent as ɵeh, IgxColumnHidingDirective as ɵei, IgxColumnPinningDirective as ɵej, IgxGridSharedModules as ɵek, IgxProcessBarTextTemplateDirective as ɵel, IgxProgressBarGradientDirective as ɵem, DIR_DOCUMENT_FACTORY as ɵen, DIR_DOCUMENT as ɵeo, IgxDirectionality as ɵep, IgxSelectItemNavigationDirective as ɵeq, IGX_TIME_PICKER_COMPONENT as ɵer, IgxItemListDirective as ɵet, IgxTimeItemDirective as ɵeu, IgxTimePickerTemplateDirective as ɵev, IgxTimePickerActionsDirective as ɵew, TimeFormatPipe as ɵex, TimeItemPipe as ɵey, IgxGridPipesModule as ɵez, IGX_EXPANSION_PANEL_COMPONENT as ɵf, IgxGridCellStyleClassesPipe as ɵfa, IgxGridCellStylesPipe as ɵfb, IgxGridRowClassesPipe as ɵfc, IgxGridRowStylesPipe as ɵfd, IgxGridNotGroupedPipe as ɵfe, IgxGridTopLevelColumns as ɵff, IgxGridFilterConditionPipe as ɵfg, IgxGridTransactionPipe as ɵfh, IgxGridPaginatorOptionsPipe as ɵfi, IgxHasVisibleColumnsPipe as ɵfj, IgxGridRowPinningPipe as ɵfk, IgxColumnActionEnabledPipe as ɵfl, IgxFilterActionColumnsPipe as ɵfm, IgxSortActionColumnsPipe as ɵfn, IgxGridDataMapperPipe as ɵfo, IgxStringReplacePipe as ɵfp, IgxGridTransactionStatePipe as ɵfq, IgxColumnFormatterPipe as ɵfr, IgxSummaryFormatterPipe as ɵfs, IgxGridAddRowPipe as ɵft, IgxHeaderGroupWidthPipe as ɵfu, IgxHeaderGroupStylePipe as ɵfv, IgxGridColumnModule as ɵfw, IgxGridHeadersModule as ɵfx, SortingIndexPipe as ɵfy, IgxGridFilteringModule as ɵfz, IGX_TREE_COMPONENT as ɵg, IgxColumnMovingModule as ɵga, IgxColumnMovingDropDirective as ɵgb, IgxColumnMovingDragDirective as ɵgc, IgxGridResizingModule as ɵgd, IgxResizeHandleDirective as ɵge, IgxGridExcelStyleFilteringModule as ɵgf, IgxGridSelectionModule as ɵgg, IgxGridDragSelectDirective as ɵgh, IgxGridSummaryModule as ɵgi, IgxSummaryDataPipe as ɵgj, IgxGridToolbarModule as ɵgk, BaseToolbarDirective as ɵgl, BaseToolbarColumnActionsDirective as ɵgm, IgxGridRowComponent as ɵgn, IgxGridSortingPipe as ɵgo, IgxGridGroupingPipe as ɵgp, IgxGridPagingPipe as ɵgq, IgxGridFilteringPipe as ɵgr, IgxGridSummaryPipe as ɵgs, IgxGridDetailsPipe as ɵgt, IgxGridExpandableCellComponent as ɵgu, IgxTreeGridRowComponent as ɵgv, IgxTreeGridCellComponent as ɵgw, IgxTreeGridHierarchizingPipe as ɵgx, IgxTreeGridFlatteningPipe as ɵgy, IgxTreeGridSortingPipe as ɵgz, IGX_TREE_NODE_COMPONENT as ɵh, IgxTreeGridPagingPipe as ɵha, IgxTreeGridTransactionPipe as ɵhb, IgxTreeGridNormalizeRecordsPipe as ɵhc, IgxTreeGridAddRowPipe as ɵhd, IgxTreeGridFilteringPipe as ɵhe, IgxTreeGridSummaryPipe as ɵhf, IgxHierarchicalRowComponent as ɵhg, IgxHierarchicalGridCellComponent as ɵhh, IgxSliderThumbComponent as ɵhi, IgxThumbLabelComponent as ɵhj, IgxTicksComponent as ɵhk, IgxTickLabelsPipe as ɵhl, IgxTabsBase as ɵhm, IgxTabHeaderBase as ɵhn, IgxTabContentBase as ɵho, IgxSplitBarComponent as ɵhp, IgxTreeService as ɵhq, IgxTreeSelectionService as ɵhr, IgxTreeNavigationService as ɵhs, 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, isHierarchyMatch as ɵw, getHierarchy as ɵx, IgxGridActionButtonComponent as ɵy, ToggleAnimationPlayer as ɵz };
76617
+ 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, IgxExpansionPanelTitleDirective as ɵba, IgxExpansionPanelDescriptionDirective as ɵbb, IgxExpansionPanelIconDirective as ɵbc, IgxBannerActionsDirective as ɵbd, IgxDaysViewNavigationService as ɵbe, IgxDayItemComponent as ɵbf, IgxMonthViewSlotsCalendar as ɵbg, IgxGetViewDateCalendar as ɵbh, IgxCarouselIndicatorDirective as ɵbi, IgxCarouselNextButtonDirective as ɵbj, IgxCarouselPrevButtonDirective as ɵbk, IGX_COMBO_COMPONENT as ɵbl, IgxComboBaseDirective as ɵbn, IgxComboHeaderDirective as ɵbo, IgxComboFooterDirective as ɵbp, IgxComboItemDirective as ɵbq, IgxComboEmptyDirective as ɵbr, IgxComboHeaderItemDirective as ɵbs, IgxComboAddItemDirective as ɵbt, IgxComboToggleIconDirective as ɵbu, IgxComboClearIconDirective as ɵbv, IgxComboAPIService as ɵbw, IgxComboDropDownComponent as ɵbx, IgxComboItemComponent as ɵby, IgxComboFilteringPipe as ɵbz, IgxComboGroupingPipe as ɵca, IgxComboAddItemComponent as ɵcb, PickerBaseDirective as ɵcc, IgxCalendarContainerComponent as ɵcd, IgxCalendarContainerModule as ɵce, IgxDialogTitleDirective as ɵcf, IgxDialogActionsDirective as ɵcg, IgxCellCrudState as ɵch, IgxRowCrudState as ɵci, IgxRowAddCrudState as ɵcj, IgxGridCRUDService as ɵck, IgxColumnMovingService as ɵcl, IgxExcelStyleCustomDialogComponent as ɵcm, IgxExcelStyleDefaultExpressionComponent as ɵcn, IgxExcelStyleDateExpressionComponent as ɵco, HammerGesturesManager as ɵcp, WatchChanges as ɵcq, WatchColumnChanges as ɵcr, notifyChanges as ɵcs, IgxNotificationsDirective as ɵct, IgxGridColumnResizerComponent as ɵcu, IgxColumnResizerDirective as ɵcv, IgxColumnResizingService as ɵcw, IgxRowSelectorDirective as ɵcx, IgxGroupByRowSelectorDirective as ɵcy, IgxHeadSelectorDirective as ɵcz, IgxGridSelectionService as ɵd, IgxRowDragDirective as ɵda, IgxDragIndicatorIconDirective as ɵdb, IgxRowDragGhostDirective as ɵdc, IgxRowDragModule as ɵdd, IgxGridHeaderRowComponent as ɵde, IgxGridHeaderGroupComponent as ɵdf, IgxGridHeaderComponent as ɵdg, IgxGridFilteringCellComponent as ɵdh, IgxFilteringService as ɵdi, IgxGridFilteringRowComponent as ɵdj, IgxGridGroupByAreaComponent as ɵdk, IgxGroupByAreaDirective as ɵdl, IgxGroupByMetaPipe as ɵdm, IgxTemplateOutletDirective as ɵdn, IgxTemplateOutletModule as ɵdo, IgxRowEditTemplateDirective as ɵdp, IgxRowEditTextDirective as ɵdq, IgxRowAddTextDirective as ɵdr, IgxRowEditActionsDirective as ɵds, IgxRowEditTabStopDirective as ɵdt, IgxSummaryRowComponent as ɵdu, IgxSummaryCellComponent as ɵdv, IgxRowDirective as ɵdw, IgxGridNavigationService as ɵdx, IgxGridSummaryService as ɵdy, ConnectedPositioningStrategy as ɵdz, IgxGridGroupByRowComponent as ɵea, IgxTreeGridSelectionService as ɵeb, IgxTreeGridGroupByAreaComponent as ɵec, IgxRowLoadingIndicatorTemplateDirective as ɵed, IgxHierarchicalGridNavigationService as ɵee, IgxChildGridRowComponent as ɵef, IgxGridCellComponent as ɵeg, IgxGridFooterComponent as ɵeh, IgxAdvancedFilteringDialogComponent as ɵei, IgxColumnHidingDirective as ɵej, IgxColumnPinningDirective as ɵek, IgxGridSharedModules as ɵel, IgxProcessBarTextTemplateDirective as ɵem, IgxProgressBarGradientDirective as ɵen, DIR_DOCUMENT_FACTORY as ɵeo, DIR_DOCUMENT as ɵep, IgxDirectionality as ɵeq, IgxSelectItemNavigationDirective as ɵer, IGX_TIME_PICKER_COMPONENT as ɵes, IgxItemListDirective as ɵeu, IgxTimeItemDirective as ɵev, IgxTimePickerTemplateDirective as ɵew, IgxTimePickerActionsDirective as ɵex, TimeFormatPipe as ɵey, TimeItemPipe as ɵez, IGX_EXPANSION_PANEL_COMPONENT as ɵf, IgxGridPipesModule as ɵfa, IgxGridCellStyleClassesPipe as ɵfb, IgxGridCellStylesPipe as ɵfc, IgxGridRowClassesPipe as ɵfd, IgxGridRowStylesPipe as ɵfe, IgxGridNotGroupedPipe as ɵff, IgxGridTopLevelColumns as ɵfg, IgxGridFilterConditionPipe as ɵfh, IgxGridTransactionPipe as ɵfi, IgxGridPaginatorOptionsPipe as ɵfj, IgxHasVisibleColumnsPipe as ɵfk, IgxGridRowPinningPipe as ɵfl, IgxColumnActionEnabledPipe as ɵfm, IgxFilterActionColumnsPipe as ɵfn, IgxSortActionColumnsPipe as ɵfo, IgxGridDataMapperPipe as ɵfp, IgxStringReplacePipe as ɵfq, IgxGridTransactionStatePipe as ɵfr, IgxColumnFormatterPipe as ɵfs, IgxSummaryFormatterPipe as ɵft, IgxGridAddRowPipe as ɵfu, IgxHeaderGroupWidthPipe as ɵfv, IgxHeaderGroupStylePipe as ɵfw, IgxGridColumnModule as ɵfx, IgxGridHeadersModule as ɵfy, SortingIndexPipe as ɵfz, IGX_TREE_COMPONENT as ɵg, IgxGridFilteringModule as ɵga, IgxColumnMovingModule as ɵgb, IgxColumnMovingDropDirective as ɵgc, IgxColumnMovingDragDirective as ɵgd, IgxGridResizingModule as ɵge, IgxResizeHandleDirective as ɵgf, IgxGridExcelStyleFilteringModule as ɵgg, IgxGridSelectionModule as ɵgh, IgxGridDragSelectDirective as ɵgi, IgxGridSummaryModule as ɵgj, IgxSummaryDataPipe as ɵgk, IgxGridToolbarModule as ɵgl, BaseToolbarDirective as ɵgm, BaseToolbarColumnActionsDirective as ɵgn, IgxGridRowComponent as ɵgo, IgxGridSortingPipe as ɵgp, IgxGridGroupingPipe as ɵgq, IgxGridPagingPipe as ɵgr, IgxGridFilteringPipe as ɵgs, IgxGridSummaryPipe as ɵgt, IgxGridDetailsPipe as ɵgu, IgxGridExpandableCellComponent as ɵgv, IgxTreeGridRowComponent as ɵgw, IgxTreeGridCellComponent as ɵgx, IgxTreeGridHierarchizingPipe as ɵgy, IgxTreeGridFlatteningPipe as ɵgz, IGX_TREE_NODE_COMPONENT as ɵh, IgxTreeGridSortingPipe as ɵha, IgxTreeGridPagingPipe as ɵhb, IgxTreeGridTransactionPipe as ɵhc, IgxTreeGridNormalizeRecordsPipe as ɵhd, IgxTreeGridAddRowPipe as ɵhe, IgxTreeGridFilteringPipe as ɵhf, IgxTreeGridSummaryPipe as ɵhg, IgxHierarchicalRowComponent as ɵhh, IgxHierarchicalGridCellComponent as ɵhi, IgxSliderThumbComponent as ɵhj, IgxThumbLabelComponent as ɵhk, IgxTicksComponent as ɵhl, IgxTickLabelsPipe as ɵhm, IgxTabsBase as ɵhn, IgxTabHeaderBase as ɵho, IgxTabContentBase as ɵhp, IgxSplitBarComponent as ɵhq, IgxTreeService as ɵhr, IgxTreeSelectionService as ɵhs, IgxTreeNavigationService as ɵht, 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, isHierarchyMatch as ɵw, getHierarchy as ɵx, IgxGridActionButtonComponent as ɵy, ToggleAnimationPlayer as ɵz };
76247
76618
  //# sourceMappingURL=igniteui-angular.js.map