igniteui-angular 12.3.16 → 12.3.19

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 (56) hide show
  1. package/README.md +252 -252
  2. package/bundles/igniteui-angular.umd.js +199 -42
  3. package/bundles/igniteui-angular.umd.js.map +1 -1
  4. package/esm2015/lib/carousel/carousel-base.js +1 -1
  5. package/esm2015/lib/carousel/public_api.js +1 -1
  6. package/esm2015/lib/data-operations/filtering-condition.js +150 -6
  7. package/esm2015/lib/grids/common/cell.interface.js +1 -1
  8. package/esm2015/lib/grids/common/crud.service.js +9 -6
  9. package/esm2015/lib/grids/common/pipes.js +2 -2
  10. package/esm2015/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.js +2 -2
  11. package/esm2015/lib/grids/filtering/excel-style/excel-style-header.component.js +2 -2
  12. package/esm2015/lib/grids/filtering/excel-style/public_api.js +1 -1
  13. package/esm2015/lib/grids/grid/grid.component.js +5 -3
  14. package/esm2015/lib/grids/grid-base.directive.js +4 -6
  15. package/esm2015/lib/grids/grid-navigation.service.js +12 -6
  16. package/esm2015/lib/grids/grid-public-cell.js +1 -1
  17. package/esm2015/lib/grids/grid-public-row.js +1 -1
  18. package/esm2015/lib/grids/grouping/group-by-area.directive.js +2 -2
  19. package/esm2015/lib/grids/hierarchical-grid/hierarchical-grid-navigation.service.js +3 -3
  20. package/esm2015/lib/grids/hierarchical-grid/hierarchical-grid.component.js +2 -2
  21. package/esm2015/lib/grids/toolbar/grid-toolbar-advanced-filtering.component.js +2 -2
  22. package/esm2015/lib/grids/toolbar/grid-toolbar-exporter.component.js +2 -2
  23. package/esm2015/lib/grids/toolbar/grid-toolbar-hiding.component.js +2 -2
  24. package/esm2015/lib/grids/toolbar/grid-toolbar-pinning.component.js +2 -2
  25. package/esm2015/lib/grids/tree-grid/tree-grid.component.js +2 -2
  26. package/esm2015/lib/grids/tree-grid/tree-grid.filtering.strategy.js +1 -1
  27. package/esm2015/lib/simple-combo/simple-combo.component.js +6 -2
  28. package/esm2015/lib/tabs/bottom-nav/bottom-nav-content.component.js +2 -2
  29. package/esm2015/lib/tabs/bottom-nav/bottom-nav-header.component.js +2 -2
  30. package/esm2015/lib/tabs/bottom-nav/bottom-nav-item.component.js +2 -2
  31. package/esm2015/lib/tabs/bottom-nav/bottom-nav.component.js +2 -2
  32. package/esm2015/lib/tabs/bottom-nav/bottom-nav.directives.js +1 -1
  33. package/esm2015/lib/tabs/bottom-nav/bottom-nav.module.js +1 -1
  34. package/esm2015/lib/tabs/bottom-nav/public_api.js +1 -1
  35. package/esm2015/lib/tabs/public_api.js +1 -1
  36. package/esm2015/lib/tabs/tab-content.directive.js +1 -1
  37. package/esm2015/lib/tabs/tab-header.directive.js +1 -1
  38. package/esm2015/lib/tabs/tab-item.directive.js +1 -1
  39. package/esm2015/lib/tabs/tabs/public_api.js +1 -1
  40. package/esm2015/lib/tabs/tabs/tab-content.component.js +2 -2
  41. package/esm2015/lib/tabs/tabs/tab-header.component.js +2 -2
  42. package/esm2015/lib/tabs/tabs/tab-item.component.js +2 -2
  43. package/esm2015/lib/tabs/tabs/tabs.component.js +2 -2
  44. package/esm2015/lib/tabs/tabs/tabs.directives.js +1 -1
  45. package/esm2015/lib/tabs/tabs/tabs.module.js +1 -1
  46. package/esm2015/lib/tabs/tabs.base.js +1 -1
  47. package/esm2015/lib/tabs/tabs.directive.js +1 -1
  48. package/fesm2015/igniteui-angular.js +200 -43
  49. package/fesm2015/igniteui-angular.js.map +1 -1
  50. package/igniteui-angular.metadata.json +1 -1
  51. package/lib/data-operations/filtering-condition.d.ts +1 -1
  52. package/lib/grids/common/pipes.d.ts +1 -1
  53. package/lib/grids/grouping/group-by-area.directive.d.ts +1 -1
  54. package/lib/simple-combo/simple-combo.component.d.ts +2 -0
  55. package/migrations/update-12_1_0/changes/classes.json +28 -28
  56. package/package.json +1 -1
@@ -2863,13 +2863,9 @@ class IgxDateFilteringOperand extends IgxBaseDateTimeFilteringOperand {
2863
2863
  }].concat(this.operations);
2864
2864
  }
2865
2865
  }
2866
- class IgxDateTimeFilteringOperand extends IgxDateFilteringOperand {
2866
+ class IgxDateTimeFilteringOperand extends IgxBaseDateTimeFilteringOperand {
2867
2867
  constructor() {
2868
2868
  super();
2869
- let index = this.operations.indexOf(this.condition('equals'));
2870
- this.operations.splice(index, 1);
2871
- index = this.operations.indexOf(this.condition('doesNotEqual'));
2872
- this.operations.splice(index, 1);
2873
2869
  this.operations = [{
2874
2870
  name: 'equals',
2875
2871
  isUnary: false,
@@ -2906,6 +2902,154 @@ class IgxDateTimeFilteringOperand extends IgxDateFilteringOperand {
2906
2902
  targetp.minutes !== searchp.minutes ||
2907
2903
  targetp.seconds !== searchp.seconds;
2908
2904
  }
2905
+ }, {
2906
+ name: 'before',
2907
+ isUnary: false,
2908
+ iconName: 'is-before',
2909
+ logic: (target, searchVal) => {
2910
+ if (!target) {
2911
+ return false;
2912
+ }
2913
+ this.validateInputData(target);
2914
+ return target < searchVal;
2915
+ }
2916
+ }, {
2917
+ name: 'after',
2918
+ isUnary: false,
2919
+ iconName: 'is-after',
2920
+ logic: (target, searchVal) => {
2921
+ if (!target) {
2922
+ return false;
2923
+ }
2924
+ this.validateInputData(target);
2925
+ return target > searchVal;
2926
+ }
2927
+ }, {
2928
+ name: 'today',
2929
+ isUnary: true,
2930
+ iconName: 'today',
2931
+ logic: (target) => {
2932
+ if (!target) {
2933
+ return false;
2934
+ }
2935
+ this.validateInputData(target);
2936
+ const d = IgxDateTimeFilteringOperand.getDateParts(target, 'yMd');
2937
+ const now = IgxDateTimeFilteringOperand.getDateParts(new Date(), 'yMd');
2938
+ return d.year === now.year &&
2939
+ d.month === now.month &&
2940
+ d.day === now.day;
2941
+ }
2942
+ }, {
2943
+ name: 'yesterday',
2944
+ isUnary: true,
2945
+ iconName: 'yesterday',
2946
+ logic: (target) => {
2947
+ if (!target) {
2948
+ return false;
2949
+ }
2950
+ this.validateInputData(target);
2951
+ const td = IgxDateTimeFilteringOperand.getDateParts(target, 'yMd');
2952
+ const y = ((d) => new Date(d.setDate(d.getDate() - 1)))(new Date());
2953
+ const yesterday = IgxDateTimeFilteringOperand.getDateParts(y, 'yMd');
2954
+ return td.year === yesterday.year &&
2955
+ td.month === yesterday.month &&
2956
+ td.day === yesterday.day;
2957
+ }
2958
+ }, {
2959
+ name: 'thisMonth',
2960
+ isUnary: true,
2961
+ iconName: 'this-month',
2962
+ logic: (target) => {
2963
+ if (!target) {
2964
+ return false;
2965
+ }
2966
+ this.validateInputData(target);
2967
+ const d = IgxDateTimeFilteringOperand.getDateParts(target, 'yM');
2968
+ const now = IgxDateTimeFilteringOperand.getDateParts(new Date(), 'yM');
2969
+ return d.year === now.year &&
2970
+ d.month === now.month;
2971
+ }
2972
+ }, {
2973
+ name: 'lastMonth',
2974
+ isUnary: true,
2975
+ iconName: 'last-month',
2976
+ logic: (target) => {
2977
+ if (!target) {
2978
+ return false;
2979
+ }
2980
+ this.validateInputData(target);
2981
+ const d = IgxDateTimeFilteringOperand.getDateParts(target, 'yM');
2982
+ const now = IgxDateTimeFilteringOperand.getDateParts(new Date(), 'yM');
2983
+ if (!now.month) {
2984
+ now.month = 11;
2985
+ now.year -= 1;
2986
+ }
2987
+ else {
2988
+ now.month--;
2989
+ }
2990
+ return d.year === now.year &&
2991
+ d.month === now.month;
2992
+ }
2993
+ }, {
2994
+ name: 'nextMonth',
2995
+ isUnary: true,
2996
+ iconName: 'next-month',
2997
+ logic: (target) => {
2998
+ if (!target) {
2999
+ return false;
3000
+ }
3001
+ this.validateInputData(target);
3002
+ const d = IgxDateTimeFilteringOperand.getDateParts(target, 'yM');
3003
+ const now = IgxDateTimeFilteringOperand.getDateParts(new Date(), 'yM');
3004
+ if (now.month === 11) {
3005
+ now.month = 0;
3006
+ now.year += 1;
3007
+ }
3008
+ else {
3009
+ now.month++;
3010
+ }
3011
+ return d.year === now.year &&
3012
+ d.month === now.month;
3013
+ }
3014
+ }, {
3015
+ name: 'thisYear',
3016
+ isUnary: true,
3017
+ iconName: 'this-year',
3018
+ logic: (target) => {
3019
+ if (!target) {
3020
+ return false;
3021
+ }
3022
+ this.validateInputData(target);
3023
+ const d = IgxDateTimeFilteringOperand.getDateParts(target, 'y');
3024
+ const now = IgxDateTimeFilteringOperand.getDateParts(new Date(), 'y');
3025
+ return d.year === now.year;
3026
+ }
3027
+ }, {
3028
+ name: 'lastYear',
3029
+ isUnary: true,
3030
+ iconName: 'last-year',
3031
+ logic: (target) => {
3032
+ if (!target) {
3033
+ return false;
3034
+ }
3035
+ this.validateInputData(target);
3036
+ const d = IgxDateTimeFilteringOperand.getDateParts(target, 'y');
3037
+ const now = IgxDateTimeFilteringOperand.getDateParts(new Date(), 'y');
3038
+ return d.year === now.year - 1;
3039
+ }
3040
+ }, {
3041
+ name: 'nextYear',
3042
+ isUnary: true,
3043
+ iconName: 'next-year',
3044
+ logic: (target) => {
3045
+ if (!target) {
3046
+ return false;
3047
+ }
3048
+ this.validateInputData(target);
3049
+ const d = IgxDateTimeFilteringOperand.getDateParts(target, 'y');
3050
+ const now = IgxDateTimeFilteringOperand.getDateParts(new Date(), 'y');
3051
+ return d.year === now.year + 1;
3052
+ }
2909
3053
  }].concat(this.operations);
2910
3054
  }
2911
3055
  }
@@ -6514,7 +6658,8 @@ class IgxRowAddCrudState extends IgxRowCrudState {
6514
6658
  * @hidden @internal
6515
6659
  */
6516
6660
  endRowTransaction(commit, event) {
6517
- if (this.row && this.row.getClassName() === IgxAddRow.name) {
6661
+ const isAddRow = this.row && this.row.getClassName() === IgxAddRow.name;
6662
+ if (isAddRow) {
6518
6663
  this.grid.rowAdded.pipe(first$1()).subscribe((addRowArgs) => {
6519
6664
  const rowData = addRowArgs.data;
6520
6665
  const pinnedIndex = this.grid.pinnedRecords.findIndex(x => x[this.primaryKey] === rowData[this.primaryKey]);
@@ -6530,10 +6675,12 @@ class IgxRowAddCrudState extends IgxRowCrudState {
6530
6675
  if (args.cancel) {
6531
6676
  return args;
6532
6677
  }
6533
- this.endAddRow();
6534
- if (commit) {
6535
- this.grid.rowAddedNotifier.next({ data: args.newValue });
6536
- this.grid.rowAdded.emit({ data: args.newValue });
6678
+ if (isAddRow) {
6679
+ this.endAddRow();
6680
+ if (commit) {
6681
+ this.grid.rowAddedNotifier.next({ data: args.newValue });
6682
+ this.grid.rowAdded.emit({ data: args.newValue });
6683
+ }
6537
6684
  }
6538
6685
  return args;
6539
6686
  }
@@ -37080,6 +37227,10 @@ class IgxSimpleComboComponent extends IgxComboBaseDirective {
37080
37227
  super.onBlur();
37081
37228
  }
37082
37229
  /** @hidden @internal */
37230
+ onFocus() {
37231
+ this._internalFilter = this.comboInput.value || '';
37232
+ }
37233
+ /** @hidden @internal */
37083
37234
  getEditElement() {
37084
37235
  return this.comboInput.nativeElement;
37085
37236
  }
@@ -37215,7 +37366,7 @@ class IgxSimpleComboComponent extends IgxComboBaseDirective {
37215
37366
  IgxSimpleComboComponent.decorators = [
37216
37367
  { type: Component, args: [{
37217
37368
  selector: 'igx-simple-combo',
37218
- 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 | comboClean\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",
37369
+ 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\" (focus)=\"onFocus()\" (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 | comboClean\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",
37219
37370
  providers: [
37220
37371
  IgxComboAPIService,
37221
37372
  { provide: IGX_COMBO_COMPONENT, useExisting: IgxSimpleComboComponent },
@@ -41547,7 +41698,7 @@ IgxExcelStyleHeaderComponent.decorators = [
41547
41698
  { type: Component, args: [{
41548
41699
  preserveWhitespaces: false,
41549
41700
  selector: 'igx-excel-style-header',
41550
- template: "<header *ngIf=\"esf.column\"\r\n class=\"igx-excel-filter__menu-header\">\r\n <h4>{{ esf.column.header || esf.column.field }}</h4>\r\n <div class=\"igx-excel-filter__menu-header-actions\">\r\n <button *ngIf=\"showSelecting\"\r\n igxButton=\"icon\"\r\n (click)=\"esf.onSelect()\"\r\n [ngClass]=\"esf.selectedClass()\"\r\n [attr.aria-label]=\"esf.column.selected ? esf.grid.resourceStrings.igx_grid_excel_deselect : esf.grid.resourceStrings.igx_grid_excel_select\"\r\n >\r\n <igx-icon>done</igx-icon>\r\n </button>\r\n <button *ngIf=\"showPinning\"\r\n igxButton=\"icon\"\r\n (click)=\"esf.onPin()\"\r\n [attr.aria-label]=\"esf.column.pinned ? esf.grid.resourceStrings.igx_grid_excel_unpin : esf.grid.resourceStrings.igx_grid_excel_pin\"\r\n >\r\n <igx-icon family=\"imx-icons\" [name]=\"esf.column.pinned ? 'unpin-left' : 'pin-left'\"></igx-icon>\r\n </button>\r\n <button *ngIf=\"showHiding\"\r\n igxButton=\"icon\"\r\n (click)=\"esf.onHideToggle()\"\r\n [attr.aria-label]=\"esf.column.hidden ? esf.grid.resourceStrings.igx_grid_excel_show : esf.grid.resourceStrings.igx_grid_excel_hide\"\r\n >\r\n <igx-icon>{{ esf.column.hidden ? 'visibility' : 'visibility_off' }}</igx-icon>\r\n </button>\r\n </div>\r\n</header>\r\n"
41701
+ template: "<header *ngIf=\"esf.column\"\n class=\"igx-excel-filter__menu-header\">\n <h4>{{ esf.column.header || esf.column.field }}</h4>\n <div class=\"igx-excel-filter__menu-header-actions\">\n <button *ngIf=\"showSelecting\"\n igxButton=\"icon\"\n (click)=\"esf.onSelect()\"\n [ngClass]=\"esf.selectedClass()\"\n [attr.aria-label]=\"esf.column.selected ? esf.grid.resourceStrings.igx_grid_excel_deselect : esf.grid.resourceStrings.igx_grid_excel_select\"\n >\n <igx-icon>done</igx-icon>\n </button>\n <button *ngIf=\"showPinning\"\n igxButton=\"icon\"\n (click)=\"esf.onPin()\"\n [attr.aria-label]=\"esf.column.pinned ? esf.grid.resourceStrings.igx_grid_excel_unpin : esf.grid.resourceStrings.igx_grid_excel_pin\"\n >\n <igx-icon family=\"imx-icons\" [name]=\"esf.column.pinned ? 'unpin-left' : 'pin-left'\"></igx-icon>\n </button>\n <button *ngIf=\"showHiding\"\n igxButton=\"icon\"\n (click)=\"esf.onHideToggle()\"\n [attr.aria-label]=\"esf.column.hidden ? esf.grid.resourceStrings.igx_grid_excel_show : esf.grid.resourceStrings.igx_grid_excel_hide\"\n >\n <igx-icon>{{ esf.column.hidden ? 'visibility' : 'visibility_off' }}</igx-icon>\n </button>\n </div>\n</header>\n"
41551
41702
  },] }
41552
41703
  ];
41553
41704
  IgxExcelStyleHeaderComponent.ctorParameters = () => [
@@ -43649,8 +43800,10 @@ class IgxGridNavigationService {
43649
43800
  });
43650
43801
  }
43651
43802
  else {
43652
- const range = { rowStart: this.activeNode.row, rowEnd: this.activeNode.row,
43653
- columnStart: this.activeNode.column, columnEnd: this.activeNode.column };
43803
+ const range = {
43804
+ rowStart: this.activeNode.row, rowEnd: this.activeNode.row,
43805
+ columnStart: this.activeNode.column, columnEnd: this.activeNode.column
43806
+ };
43654
43807
  this.grid.selectRange(range);
43655
43808
  this.grid.notifyChanges();
43656
43809
  }
@@ -44161,11 +44314,15 @@ class IgxGridNavigationService {
44161
44314
  .find(c => this.isColumnFullyVisible(c.visibleIndex))) === null || _a === void 0 ? void 0 : _a.visibleIndex;
44162
44315
  const column = this.grid.visibleColumns.find((col) => !col.columnLayout && col.visibleIndex === colIndex);
44163
44316
  const rowInd = rowIndex ? rowIndex : (_b = this.grid.rowList.find(r => !this.shouldPerformVerticalScroll(r.index, colIndex))) === null || _b === void 0 ? void 0 : _b.index;
44164
- const node = { row: rowInd !== null && rowInd !== void 0 ? rowInd : 0,
44317
+ const node = {
44318
+ row: rowInd !== null && rowInd !== void 0 ? rowInd : 0,
44165
44319
  column: (_c = column === null || column === void 0 ? void 0 : column.visibleIndex) !== null && _c !== void 0 ? _c : 0, level: (_d = column === null || column === void 0 ? void 0 : column.level) !== null && _d !== void 0 ? _d : 0,
44166
44320
  mchCache: column ? { level: column.level, visibleIndex: column.visibleIndex } : {},
44167
- layout: column && column.columnLayoutChild ? { rowStart: column.rowStart, colStart: column.colStart,
44168
- rowEnd: column.rowEnd, colEnd: column.colEnd, columnVisibleIndex: column.visibleIndex } : null };
44321
+ layout: column && column.columnLayoutChild ? {
44322
+ rowStart: column.rowStart, colStart: column.colStart,
44323
+ rowEnd: column.rowEnd, colEnd: column.colEnd, columnVisibleIndex: column.visibleIndex
44324
+ } : null
44325
+ };
44169
44326
  return node;
44170
44327
  }
44171
44328
  handleMCHeaderNav(key, ctrl) {
@@ -45453,7 +45610,7 @@ IgxGroupByAreaDirective.propDecorators = {
45453
45610
  class IgxGroupByMetaPipe {
45454
45611
  transform(key, grid) {
45455
45612
  const column = grid.getColumnByName(key);
45456
- return { groupable: column.groupable, title: column.header || key };
45613
+ return { groupable: !!(column === null || column === void 0 ? void 0 : column.groupable), title: (column === null || column === void 0 ? void 0 : column.header) || key };
45457
45614
  }
45458
45615
  }
45459
45616
  IgxGroupByMetaPipe.decorators = [
@@ -46510,7 +46667,7 @@ class IgxAdvancedFilteringDialogComponent {
46510
46667
  IgxAdvancedFilteringDialogComponent.decorators = [
46511
46668
  { type: Component, args: [{
46512
46669
  selector: 'igx-advanced-filtering-dialog',
46513
- template: "<article\n *ngIf=\"grid\"\n class=\"igx-advanced-filter\"\n igxDrag\n [ghost]=\"false\"\n [dragTolerance]=\"0\"\n (dragStart)=\"dragStart($event)\"\n (dragEnd)=\"dragEnd()\"\n (dragMove)=\"onDragMove($event)\"\n (keydown)=\"onKeyDown($event)\"\n [ngClass]=\"{\n 'igx-advanced-filter--cosy': grid.displayDensity === 'cosy',\n 'igx-advanced-filter--compact': grid.displayDensity === 'compact',\n 'igx-advanced-filter--inline': inline\n }\"\n>\n <header class=\"igx-advanced-filter__header\" igxDragHandle>\n <h4 class=\"igx-typography__h6\" style=\"pointer-events: none;\">\n {{ grid.resourceStrings.igx_grid_advanced_filter_title }}\n </h4>\n <div class=\"igx-filter-legend\">\n <div class=\"igx-filter-legend__item--and\">\n <span>{{ grid.resourceStrings.igx_grid_advanced_filter_and_label }}</span>\n </div>\n <div class=\"igx-filter-legend__item--or\">\n <span>{{ grid.resourceStrings.igx_grid_advanced_filter_or_label }}</span>\n </div>\n </div>\n </header>\n\n <article #expressionsContainer\n class=\"igx-advanced-filter__main\"\n (scroll)=\"onExpressionsScrolled()\">\n <ng-container *ngIf=\"!rootGroup\">\n\n <button #addRootAndGroupButton\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n (click)=\"addAndGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_and_group}}</span>\n </button>\n\n <button igxButton=\"outlined\" [displayDensity]=\"displayDensity\" (click)=\"addOrGroup()\">\n <igx-icon>add</igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_or_group}}</span>\n </button>\n\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{grid.resourceStrings.igx_grid_advanced_filter_initial_text}}\n </h6>\n </div>\n </ng-container>\n\n <ng-template #addExpressionsTemplate let-expressionItem let-afterExpression=\"afterExpression\">\n <button #addConditionButton\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_add_condition}}</span>\n </button>\n\n <button igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\">\n <igx-icon>add</igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_and_group}}</span>\n </button>\n\n <button igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\">\n <igx-icon>add</igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_or_group}}</span>\n </button>\n\n </ng-template>\n\n <ng-template #filterOperandTemplate let-expressionItem>\n <div *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip [data]=\"expressionItem\"\n [displayDensity]=\"displayDensity === 'compact' ? 'cosy' : displayDensity\"\n [removable]=\"true\"\n [selected]=\"expressionItem.selected\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem)\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">{{ expressionItem.columnHeader || expressionItem.expression.fieldName }}</span>\n <igx-prefix>\n <igx-icon family=\"imx-icons\" [name]=\"expressionItem.expression.condition.iconName\">\n </igx-icon>\n </igx-prefix>\n <span class=\"igx-filter-tree__expression-condition\">\n {{ getConditionFriendlyName(expressionItem.expression.condition.name) }}\n </span>\n <span igxSuffix *ngIf=\"!expressionItem.expression.condition.isUnary\">\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal | columnFormatter:getFormatter(expressionItem.expression.fieldName):undefined)\n : (expressionItem.expression.searchVal | date:getFormat(expressionItem.expression.fieldName):undefined:grid.locale)\n : expressionItem.expression.searchVal\n }}\n </span>\n </igx-chip>\n <div class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"(expressionItem.selected && selectedExpressions.length === 1) || expressionItem.hovered\">\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\">\n edit\n </igx-icon>\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"!expressionItem.inAddMode && (expressionItem.parent !== currentGroup || expressionItem !== currentGroup.children[currentGroup.children.length - 1])\"\n >\n add\n </igx-icon>\n </div>\n </div>\n\n <div *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select #columnSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"columnSelectOverlaySettings\"\n [placeholder]=\"grid.resourceStrings.igx_grid_advanced_filter_column_placeholder\"\n [(ngModel)]=\"selectedColumn\">\n <igx-select-item *ngFor=\"let column of filterableColumns\" [value]=\"column\">\n {{column.header || column.field}}\n </igx-select-item>\n </igx-select>\n\n <igx-select #conditionSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [placeholder]=\"grid.resourceStrings.igx_grid_filter_condition_placeholder\"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedColumn\">\n <igx-prefix *ngIf=\"selectedColumn && conditionSelect.value && selectedColumn.filters.condition(conditionSelect.value)\">\n <igx-icon family=\"imx-icons\" [name]=\"selectedColumn.filters.condition(conditionSelect.value).iconName\">\n </igx-icon>\n </igx-prefix>\n <igx-select-item *ngFor=\"let condition of getConditionList()\" [value]=\"condition\" [text]=\"getConditionFriendlyName(condition)\">\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon family=\"imx-icons\"\n [name]=\"selectedColumn.filters.condition(condition).iconName\">\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{getConditionFriendlyName(condition)}}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <igx-input-group *ngIf=\"!selectedColumn || (selectedColumn.dataType !== 'date' && selectedColumn.dataType !== 'time' && selectedColumn.dataType !== 'dateTime')\"\n type=\"box\"\n [displayDensity]=\"'compact'\">\n <input #searchValueInput\n igxInput\n [disabled]=\"!selectedColumn || !selectedCondition\n || (selectedColumn && selectedColumn.filters.condition(selectedCondition).isUnary)\"\n [type]=\"selectedColumn && selectedColumn.dataType === 'number' ? 'number' : 'text'\"\n [placeholder]=\"grid.resourceStrings.igx_grid_advanced_filter_value_placeholder\"\n [(ngModel)]=\"searchValue\"/>\n </igx-input-group>\n\n <igx-date-picker #picker *ngIf=\"selectedColumn && selectedColumn.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n [formatter]=\"selectedColumn.formatter\"\n [displayFormat]=\"selectedColumn.pipeArgs.format\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [displayDensity]=\"'compact'\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n [displayFormat]=\"selectedColumn.pipeArgs.format\"\n [placeholder]=\"grid.resourceStrings.igx_grid_filter_row_date_placeholder\"\n [disabled]=\"!selectedColumn || !selectedCondition\n || (selectedColumn && selectedColumn.filters.condition(selectedCondition).isUnary)\">\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=\"selectedColumn && selectedColumn.dataType === 'time'\"\n [inputFormat]=\"selectedColumn.defaultTimeFormat\"\n [(value)]=\"searchValue\"\n [formatter]=\"selectedColumn.formatter\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"grid.resourceStrings.igx_grid_filter_row_time_placeholder\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"!selectedColumn || !selectedCondition ||\n (selectedColumn && selectedColumn.filters.condition(selectedCondition).isUnary)\">\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 #inputGroup type=\"box\" *ngIf=\"selectedColumn && selectedColumn.dataType === 'dateTime'\"\n type=\"box\"\n [displayDensity]=\"'compact'\">\n <input #input igxInput tabindex=\"0\"\n [placeholder]=\"grid.resourceStrings.igx_grid_filter_row_date_placeholder\"\n [igxDateTimeEditor]=\"selectedColumn.defaultDateTimeFormat\"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"!selectedColumn || !selectedCondition || (selectedColumn && selectedColumn.filters.condition(selectedCondition).isUnary)\"/>\n </igx-input-group>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button igxButton=\"icon\"\n [displayDensity]=\"displayDensity\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\">\n <igx-icon>check</igx-icon>\n </button>\n <button igxButton=\"icon\"\n [displayDensity]=\"displayDensity\"\n (click)=\"cancelOperandEdit()\">\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container *ngTemplateOutlet=\"addExpressionsTemplate; context: context(expressionItem.parent, expressionItem)\"></ng-container>\n <button igxButton=\"icon\"\n [displayDensity]=\"displayDensity\"\n (click)=\"cancelOperandAdd()\">\n <igx-icon>close</igx-icon>\n </button>\n </div>\n\n </ng-template>\n\n <ng-template #expressionTreeTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem.operator === 0,\n 'igx-filter-tree__line--or': expressionItem.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <ng-container *ngFor=\"let expr of expressionItem.children\">\n <ng-container *ngTemplateOutlet=\"isExpressionGroup(expr) ? expressionTreeTemplate : filterOperandTemplate; context: context(expr)\"></ng-container>\n </ng-container>\n <div *ngIf=\"currentGroup === expressionItem\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\">\n <ng-container *ngTemplateOutlet=\"addExpressionsTemplate; context: context(expressionItem)\"></ng-container>\n <button igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [displayDensity]=\"displayDensity\"\n [disabled]=\"hasEditedExpression || expressionItem.children.length < 2\"\n (click)=\"endGroup(expressionItem)\">\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_end_group}}</span>\n </button>\n </div>\n </div>\n </div>\n\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container *ngTemplateOutlet=\"expressionTreeTemplate; context: context(rootGroup)\"></ng-container>\n </ng-container>\n\n <div igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n [ngClass]=\"{\n 'igx-filter-contextual-menu--cosy': displayDensity === 'cosy',\n 'igx-filter-contextual-menu--compact': displayDensity === 'compact'\n }\"\n >\n <button igxButton=\"icon\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup [displayDensity]=\"displayDensity\"\n [multiSelection]=\"false\"\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\">\n </igx-buttongroup>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"imx-icons\" name=\"ungroup\"></igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_ungroup}}</span>\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon>delete</igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_delete}}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n (click)=\"createAndGroup()\"\n >\n {{grid.resourceStrings.igx_grid_advanced_filter_create_and_group}}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n (click)=\"createOrGroup()\"\n >\n {{grid.resourceStrings.igx_grid_advanced_filter_create_or_group}}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{grid.resourceStrings.igx_grid_advanced_filter_delete_filters}}\n </button>\n </ng-container>\n </div>\n </article>\n\n <footer class=\"igx-excel-filter__secondary-footer\">\n <div class=\"igx-excel-filter__clear\">\n <button\n igxButton=\"flat\"\n [displayDensity]=\"displayDensity\"\n (click)=\"onClearButtonClick($event)\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}\n </button>\n </div>\n <div class=\"igx-excel-filter__cancel\">\n <button\n igxButton=\"flat\"\n [displayDensity]=\"displayDensity\"\n (click)=\"cancelChanges()\">\n {{ grid.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button\n igxButton=\"raised\"\n [displayDensity]=\"displayDensity\"\n (click)=\"onApplyButtonClick($event)\">\n {{ grid.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n </footer>\n</article>\n<div #overlayOutlet\n igxOverlayOutlet\n class=\"igx-advanced-filter__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\">\n</div>\n"
46670
+ template: "<article\n *ngIf=\"grid\"\n class=\"igx-advanced-filter\"\n igxDrag\n [ghost]=\"false\"\n [dragTolerance]=\"0\"\n (dragStart)=\"dragStart($event)\"\n (dragEnd)=\"dragEnd()\"\n (dragMove)=\"onDragMove($event)\"\n (keydown)=\"onKeyDown($event)\"\n [ngClass]=\"{\n 'igx-advanced-filter--cosy': grid.displayDensity === 'cosy',\n 'igx-advanced-filter--compact': grid.displayDensity === 'compact',\n 'igx-advanced-filter--inline': inline\n }\"\n>\n <header class=\"igx-advanced-filter__header\" igxDragHandle>\n <h4 class=\"igx-typography__h6\" style=\"pointer-events: none;\">\n {{ grid.resourceStrings.igx_grid_advanced_filter_title }}\n </h4>\n <div class=\"igx-filter-legend\">\n <div class=\"igx-filter-legend__item--and\">\n <span>{{ grid.resourceStrings.igx_grid_advanced_filter_and_label }}</span>\n </div>\n <div class=\"igx-filter-legend__item--or\">\n <span>{{ grid.resourceStrings.igx_grid_advanced_filter_or_label }}</span>\n </div>\n </div>\n </header>\n\n <article #expressionsContainer\n class=\"igx-advanced-filter__main\"\n (scroll)=\"onExpressionsScrolled()\">\n <ng-container *ngIf=\"!rootGroup\">\n\n <button #addRootAndGroupButton\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n (click)=\"addAndGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_and_group}}</span>\n </button>\n\n <button igxButton=\"outlined\" [displayDensity]=\"displayDensity\" (click)=\"addOrGroup()\">\n <igx-icon>add</igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_or_group}}</span>\n </button>\n\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{grid.resourceStrings.igx_grid_advanced_filter_initial_text}}\n </h6>\n </div>\n </ng-container>\n\n <ng-template #addExpressionsTemplate let-expressionItem let-afterExpression=\"afterExpression\">\n <button #addConditionButton\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_add_condition}}</span>\n </button>\n\n <button igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\">\n <igx-icon>add</igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_and_group}}</span>\n </button>\n\n <button igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\">\n <igx-icon>add</igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_or_group}}</span>\n </button>\n\n </ng-template>\n\n <ng-template #filterOperandTemplate let-expressionItem>\n <div *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip [data]=\"expressionItem\"\n [displayDensity]=\"displayDensity === 'compact' ? 'cosy' : displayDensity\"\n [removable]=\"true\"\n [selected]=\"expressionItem.selected\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem)\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">{{ expressionItem.columnHeader || expressionItem.expression.fieldName }}</span>\n <igx-prefix>\n <igx-icon family=\"imx-icons\" [name]=\"expressionItem.expression.condition.iconName\">\n </igx-icon>\n </igx-prefix>\n <span class=\"igx-filter-tree__expression-condition\">\n {{ getConditionFriendlyName(expressionItem.expression.condition.name) }}\n </span>\n <span igxSuffix *ngIf=\"!expressionItem.expression.condition.isUnary\">\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal | columnFormatter:getFormatter(expressionItem.expression.fieldName):undefined)\n : (expressionItem.expression.searchVal | date:getFormat(expressionItem.expression.fieldName):undefined:grid.locale)\n : expressionItem.expression.searchVal\n }}\n </span>\n </igx-chip>\n <div class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"(expressionItem.selected && selectedExpressions.length === 1) || expressionItem.hovered\">\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\">\n edit\n </igx-icon>\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"!expressionItem.inAddMode && (expressionItem.parent !== currentGroup || expressionItem !== currentGroup.children[currentGroup.children.length - 1])\"\n >\n add\n </igx-icon>\n </div>\n </div>\n\n <div *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select #columnSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"columnSelectOverlaySettings\"\n [placeholder]=\"grid.resourceStrings.igx_grid_advanced_filter_column_placeholder\"\n [(ngModel)]=\"selectedColumn\">\n <igx-select-item *ngFor=\"let column of filterableColumns\" [value]=\"column\">\n {{column.header || column.field}}\n </igx-select-item>\n </igx-select>\n\n <igx-select #conditionSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [placeholder]=\"grid.resourceStrings.igx_grid_filter_condition_placeholder\"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedColumn\">\n <igx-prefix *ngIf=\"selectedColumn && conditionSelect.value && selectedColumn.filters.condition(conditionSelect.value)\">\n <igx-icon family=\"imx-icons\" [name]=\"selectedColumn.filters.condition(conditionSelect.value).iconName\">\n </igx-icon>\n </igx-prefix>\n <igx-select-item *ngFor=\"let condition of getConditionList()\" [value]=\"condition\" [text]=\"getConditionFriendlyName(condition)\">\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon family=\"imx-icons\"\n [name]=\"selectedColumn.filters.condition(condition).iconName\">\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{getConditionFriendlyName(condition)}}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <igx-input-group *ngIf=\"!selectedColumn || (selectedColumn.dataType !== 'date' && selectedColumn.dataType !== 'time' && selectedColumn.dataType !== 'dateTime')\"\n type=\"box\"\n [displayDensity]=\"'compact'\">\n <input #searchValueInput\n igxInput\n [disabled]=\"!selectedColumn || !selectedCondition\n || (selectedColumn && selectedColumn.filters.condition(selectedCondition).isUnary)\"\n [type]=\"selectedColumn && selectedColumn.dataType === 'number' ? 'number' : 'text'\"\n [placeholder]=\"grid.resourceStrings.igx_grid_advanced_filter_value_placeholder\"\n [(ngModel)]=\"searchValue\"/>\n </igx-input-group>\n\n <igx-date-picker #picker *ngIf=\"selectedColumn && selectedColumn.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n [formatter]=\"selectedColumn.formatter\"\n [displayFormat]=\"selectedColumn.pipeArgs.format\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [displayDensity]=\"'compact'\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n [displayFormat]=\"selectedColumn.pipeArgs.format\"\n [placeholder]=\"grid.resourceStrings.igx_grid_filter_row_date_placeholder\"\n [disabled]=\"!selectedColumn || !selectedCondition\n || (selectedColumn && selectedColumn.filters.condition(selectedCondition).isUnary)\">\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=\"selectedColumn && selectedColumn.dataType === 'time'\"\n [inputFormat]=\"selectedColumn.defaultTimeFormat\"\n [(value)]=\"searchValue\"\n [formatter]=\"selectedColumn.formatter\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"grid.resourceStrings.igx_grid_filter_row_time_placeholder\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"!selectedColumn || !selectedCondition ||\n (selectedColumn && selectedColumn.filters.condition(selectedCondition).isUnary)\">\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 #inputGroup type=\"box\" *ngIf=\"selectedColumn && selectedColumn.dataType === 'dateTime'\"\n type=\"box\"\n [displayDensity]=\"'compact'\">\n <input #input igxInput tabindex=\"0\"\n [placeholder]=\"grid.resourceStrings.igx_grid_filter_row_date_placeholder\"\n [igxDateTimeEditor]=\"selectedColumn.defaultDateTimeFormat\"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"!selectedColumn || !selectedCondition || (selectedColumn && selectedColumn.filters.condition(selectedCondition).isUnary)\"/>\n </igx-input-group>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button igxButton=\"icon\"\n [displayDensity]=\"displayDensity\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\">\n <igx-icon>check</igx-icon>\n </button>\n <button igxButton=\"icon\"\n [displayDensity]=\"displayDensity\"\n (click)=\"cancelOperandEdit()\">\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container *ngTemplateOutlet=\"addExpressionsTemplate; context: context(expressionItem.parent, expressionItem)\"></ng-container>\n <button igxButton=\"icon\"\n [displayDensity]=\"displayDensity\"\n (click)=\"cancelOperandAdd()\">\n <igx-icon>close</igx-icon>\n </button>\n </div>\n\n </ng-template>\n\n <ng-template #expressionTreeTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem.operator === 0,\n 'igx-filter-tree__line--or': expressionItem.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <ng-container *ngFor=\"let expr of expressionItem.children\">\n <ng-container *ngTemplateOutlet=\"isExpressionGroup(expr) ? expressionTreeTemplate : filterOperandTemplate; context: context(expr)\"></ng-container>\n </ng-container>\n <div *ngIf=\"currentGroup === expressionItem\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\">\n <ng-container *ngTemplateOutlet=\"addExpressionsTemplate; context: context(expressionItem)\"></ng-container>\n <button igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [displayDensity]=\"displayDensity\"\n [disabled]=\"hasEditedExpression || expressionItem.children.length < 2\"\n (click)=\"endGroup(expressionItem)\">\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_end_group}}</span>\n </button>\n </div>\n </div>\n </div>\n\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container *ngTemplateOutlet=\"expressionTreeTemplate; context: context(rootGroup)\"></ng-container>\n </ng-container>\n\n <div igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n [ngClass]=\"{\n 'igx-filter-contextual-menu--cosy': displayDensity === 'cosy',\n 'igx-filter-contextual-menu--compact': displayDensity === 'compact'\n }\"\n >\n <button igxButton=\"icon\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup [displayDensity]=\"displayDensity\"\n [multiSelection]=\"false\"\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\">\n </igx-buttongroup>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"imx-icons\" name=\"ungroup\"></igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_ungroup}}</span>\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon>delete</igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_delete}}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n (click)=\"createAndGroup()\"\n >\n {{grid.resourceStrings.igx_grid_advanced_filter_create_and_group}}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n (click)=\"createOrGroup()\"\n >\n {{grid.resourceStrings.igx_grid_advanced_filter_create_or_group}}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"displayDensity\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{grid.resourceStrings.igx_grid_advanced_filter_delete_filters}}\n </button>\n </ng-container>\n </div>\n </article>\n\n <footer class=\"igx-excel-filter__secondary-footer\">\n <div class=\"igx-excel-filter__clear\">\n <button\n igxButton=\"flat\"\n type=\"button\"\n [displayDensity]=\"displayDensity\"\n (click)=\"onClearButtonClick($event)\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}\n </button>\n </div>\n <div class=\"igx-excel-filter__cancel\">\n <button\n igxButton=\"flat\"\n type=\"button\"\n [displayDensity]=\"displayDensity\"\n (click)=\"cancelChanges()\">\n {{ grid.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button\n igxButton=\"raised\"\n type=\"button\"\n [displayDensity]=\"displayDensity\"\n (click)=\"onApplyButtonClick($event)\">\n {{ grid.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n </footer>\n</article>\n<div #overlayOutlet\n igxOverlayOutlet\n class=\"igx-advanced-filter__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\">\n</div>\n"
46514
46671
  },] }
46515
46672
  ];
46516
46673
  IgxAdvancedFilteringDialogComponent.ctorParameters = () => [
@@ -54408,14 +54565,12 @@ class IgxGridBaseDirective extends DisplayDensityBase {
54408
54565
  }
54409
54566
  _shouldAutoSize(renderedHeight) {
54410
54567
  this.tbody.nativeElement.style.display = 'none';
54411
- let res = !this.nativeElement.parentElement ||
54568
+ const res = !this.nativeElement.parentElement ||
54412
54569
  this.nativeElement.parentElement.clientHeight === 0 ||
54413
- this.nativeElement.parentElement.clientHeight === renderedHeight;
54414
- if (!this.platform.isChromium && !this.platform.isFirefox) {
54570
+ this.nativeElement.parentElement.clientHeight === renderedHeight ||
54415
54571
  // If grid causes the parent container to extend (for example when container is flex)
54416
54572
  // we should always auto-size since the actual size of the container will continuously change as the grid renders elements.
54417
- res = this.checkContainerSizeChange();
54418
- }
54573
+ this.checkContainerSizeChange();
54419
54574
  this.tbody.nativeElement.style.display = '';
54420
54575
  return res;
54421
54576
  }
@@ -57587,7 +57742,7 @@ class IgxGridRowClassesPipe {
57587
57742
  this.gridAPI = gridAPI;
57588
57743
  this.row = new IgxGridRow(this.gridAPI.grid, -1, {});
57589
57744
  }
57590
- transform(cssClasses, row, editMode, selected, dirty, deleted, dragging, index, mrl, filteredOut, _) {
57745
+ transform(cssClasses, row, editMode, selected, dirty, deleted, dragging, index, mrl, filteredOut, _rowData, _) {
57591
57746
  const result = new Set(['igx-grid__tr', index % 2 ? row.grid.evenRowCSS : row.grid.oddRowCSS]);
57592
57747
  const mapping = [
57593
57748
  [selected, 'igx-grid__tr--selected'],
@@ -62287,7 +62442,9 @@ class IgxGridComponent extends IgxGridBaseDirective {
62287
62442
  if (changes && this.columnList.length > 0) {
62288
62443
  changes.forEachAddedItem((rec) => {
62289
62444
  const col = this.getColumnByName(rec.item.fieldName);
62290
- col.hidden = true;
62445
+ if (col) {
62446
+ col.hidden = true;
62447
+ }
62291
62448
  });
62292
62449
  changes.forEachRemovedItem((rec) => {
62293
62450
  const col = this.getColumnByName(rec.item.fieldName);
@@ -62575,7 +62732,7 @@ IgxGridComponent.decorators = [
62575
62732
  IgxForOfScrollSyncService
62576
62733
  ],
62577
62734
  selector: 'igx-grid',
62578
- template: "<!-- Toolbar area -->\n<ng-content select=\"igx-grid-toolbar\"></ng-content>\n\n<!-- Group-by area -->\n<ng-container *ngIf=\"showGroupArea && (groupingExpressions.length > 0 || hasGroupableColumns)\">\n <igx-grid-group-by-area #groupArea [style.flex-basis.px]='outerWidth'\n [grid]=\"this\"\n [expressions]=\"groupingExpressions\"\n [sortingExpressions]=\"sortingExpressions\"\n [density]=\"displayDensity\"\n [dropAreaTemplate]=\"dropAreaTemplate\"\n [dropAreaMessage]=\"dropAreaMessage\"\n >\n </igx-grid-group-by-area>\n</ng-container>\n\n<!-- Grid table head row area -->\n<igx-grid-header-row class=\"igx-grid-thead\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [density]=\"displayDensity\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (scroll)=\"preventHeaderScroll($event)\"\n (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" [attr.role]=\"dataView.length ? null : 'row'\" (keydown)=\"navigation.handleNavigation($event)\" (focus)=\"navigation.focusTbody($event)\"\n (dragStop)=\"selectionService.dragMode = $event\" (scroll)='preventContainerScroll($event)'\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth || null' #tbody [attr.aria-activedescendant]=\"activeDescendant\">\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template #pinnedRecordsTemplate>\n <ng-container *ngIf='data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridAddRow:true:pipeTrigger\n | gridRowPinning:id:true:pipeTrigger\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger:true\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger:true as pinnedData'>\n <div #pinContainer *ngIf='pinnedData.length > 0'\n [ngClass]=\"{\n 'igx-grid__tr--pinned-bottom': !isRowPinningToTop,\n 'igx-grid__tr--pinned-top': isRowPinningToTop\n }\"\n class='igx-grid__tr--pinned' [style.width.px]='calcWidth'>\n <ng-container *ngFor=\"let rowData of pinnedData; let rowIndex = index\">\n <ng-container *ngTemplateOutlet=\"pinned_record_template; context: getContext(rowData, rowIndex, true)\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger\n | gridGroupBy:groupingExpressions:groupingExpansionState:groupStrategy:groupsExpanded:id:groupsRecords:pipeTrigger\n | gridPaging:paginator?.page:paginator?.perPage:id:pipeTrigger\n | gridSummary:hasSummarizedColumns:summaryCalculationMode:summaryPosition:id:showSummaryOnCollapse:pipeTrigger:summaryPipeTrigger\n | gridDetails:hasDetails:expansionStates:pipeTrigger\n | gridAddRow:false:pipeTrigger\n | gridRowPinning:id:false:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight'\n [igxForItemSize]=\"hasColumnLayouts ? rowHeight * multiRowLayoutRowSize + 1 : renderedRowHeight\"\n [igxForTrackBy]='trackChanges'\n #verticalScrollContainer (chunkPreload)=\"dataLoading($event)\" (dataChanging)=\"dataRebinding($event)\" (dataChanged)=\"dataRebound($event)\">\n <ng-template\n [igxTemplateOutlet]='getRowTemplate(rowData)'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex)'\n (cachedViewLoaded)='cachedViewLoaded($event)'\n (viewCreated)='viewCreatedHandler($event)'\n (viewMoved)='viewMovedHandler($event)'>\n </ng-template>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template #record_template let-rowIndex=\"index\" let-rowData let-disabledRow=\"disabled\">\n <igx-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [rowData]=\"rowData\" [disabled]=\"disabledRow\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-grid-row>\n </ng-template>\n <ng-template #pinned_record_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [rowData]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\"#row #pinnedRow>\n </igx-grid-row>\n </ng-template>\n <ng-template #group_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-groupby-row [gridID]=\"id\" [index]=\"rowIndex\" [groupRow]=\"rowData\" [hideGroupRowSelectors]=\"hideRowSelectors\" [rowDraggable]=\"rowDraggable\" #row>\n </igx-grid-groupby-row>\n </ng-template>\n <ng-template #summary_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-summary-row role=\"row\" [gridID]=\"id\" [summaries]=\"rowData.summaries\" [index]=\"rowIndex\"\n class=\"igx-grid__summaries--body\" #summaryRow>\n </igx-grid-summary-row>\n </ng-template>\n <ng-template #detail_template_container let-rowIndex=\"index\" let-rowData>\n <div detail='true' style=\"overflow: auto; width: 100%;\" id=\"{{id}}_{{rowIndex}}\" (pointerdown)='detailsViewFocused(detailsContainer, rowIndex)' #detailsContainer [attr.data-rowindex]='rowIndex'\n [ngClass]=\"{\n 'igx-grid__tr-container': true,\n 'igx-grid__tr-container--active': isDetailActive(rowIndex)\n }\">\n <div class=\"igx-grid__hierarchical-indent\" style='display: flex;'>\n <ng-container *ngIf=\"this.groupingExpressions.length > 0\">\n <div class=\"igx-grid__row-indentation igx-grid__row-indentation--level-{{groupingExpressions.length}}\"></div>\n </ng-container>\n <ng-template\n [ngTemplateOutlet]='detailTemplate.first'\n [ngTemplateOutletContext]='getDetailsContext(rowData, rowIndex)'>\n </ng-template>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n <igc-trial-watermark></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div #igxBodyOverlayOutlet=\"overlay-outlet\" igxOverlayOutlet></div>\n</div>\n\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summariesHeight' #tfoot>\n <div tabindex=\"0\" (focus)=\"navigation.focusFirstCell(false)\" (keydown)=\"navigation.summaryNav($event)\" [attr.aria-activedescendant]=\"activeDescendant\">\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summariesHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\" role=\"row\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"dataView.length\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalScroll()' [style.height.px]='summariesHeight'\n [style.width.px]=\"scrollSize\"></div>\n </div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='EMPTY_DATA' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-container *ngIf=\"totalRecords || pagingMode === 1\">\n <ng-content select=\"igx-paginator\"></ng-content>\n </ng-container>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n <button igxButton=\"raised\" igxRipple (click)=\"this.crudService.enterAddRowMode(null, false, $event)\">\n {{resourceStrings.igx_grid_add_row_label}}\n </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<ng-template #defaultExpandedTemplate>\n <igx-icon role=\"button\" class=\"igx-grid__group-expand-btn\"\n [ngClass]=\"{\n 'igx-grid__group-expand-btn--push': filteringService.isFilterRowVisible\n}\">unfold_less</igx-icon>\n</ng-template>\n\n <ng-template #defaultCollapsedTemplate>\n <igx-icon role=\"button\" class=\"igx-grid__group-expand-btn\"\n [ngClass]=\"{\n 'igx-grid__group-expand-btn--push': filteringService.isFilterRowVisible\n}\">unfold_more</igx-icon>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle #rowEditingOverlay>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"rowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row\n</ng-template>\n\n<ng-template #defaultRowEditActions>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(false, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}</button>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(true, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_done }}</button>\n</ng-template>\n\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"this.crudService.row?.getClassName() === 'IgxAddRow' ? rowAddText : rowEditText ? rowEditText : defaultRowEditText;\n context: { $implicit: this.crudService.row?.getClassName() !== 'IgxAddRow' ? rowChangesCount : null }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"rowEditActions ? rowEditActions : defaultRowEditActions; context: { $implicit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon>drag_indicator</igx-icon>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n"
62735
+ template: "<!-- Toolbar area -->\n<ng-content select=\"igx-grid-toolbar\"></ng-content>\n\n<!-- Group-by area -->\n<ng-container *ngIf=\"showGroupArea && (groupingExpressions.length > 0 || hasGroupableColumns)\">\n <igx-grid-group-by-area #groupArea [style.flex-basis.px]='outerWidth'\n [grid]=\"this\"\n [expressions]=\"groupingExpressions\"\n [sortingExpressions]=\"sortingExpressions\"\n [density]=\"displayDensity\"\n [dropAreaTemplate]=\"dropAreaTemplate\"\n [dropAreaMessage]=\"dropAreaMessage\"\n >\n </igx-grid-group-by-area>\n</ng-container>\n\n<!-- Grid table head row area -->\n<igx-grid-header-row class=\"igx-grid-thead\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [density]=\"displayDensity\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (scroll)=\"preventHeaderScroll($event)\"\n (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" [attr.role]=\"dataView.length ? null : 'row'\" (keydown)=\"navigation.handleNavigation($event)\" (focus)=\"navigation.focusTbody($event)\"\n (dragStop)=\"selectionService.dragMode = $event\" (scroll)='preventContainerScroll($event)'\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth || null' #tbody [attr.aria-activedescendant]=\"activeDescendant\">\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template #pinnedRecordsTemplate>\n <ng-container *ngIf='data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridAddRow:true:pipeTrigger\n | gridRowPinning:id:true:pipeTrigger\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger:true\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger:true as pinnedData'>\n <div #pinContainer *ngIf='pinnedData.length > 0'\n [ngClass]=\"{\n 'igx-grid__tr--pinned-bottom': !isRowPinningToTop,\n 'igx-grid__tr--pinned-top': isRowPinningToTop\n }\"\n class='igx-grid__tr--pinned' [style.width.px]='calcWidth'>\n <ng-container *ngFor=\"let rowData of pinnedData; let rowIndex = index\">\n <ng-container *ngTemplateOutlet=\"pinned_record_template; context: getContext(rowData, rowIndex, true)\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger\n | gridGroupBy:groupingExpressions:groupingExpansionState:groupStrategy:groupsExpanded:id:groupsRecords:pipeTrigger\n | gridPaging:paginator?.page:paginator?.perPage:id:pipeTrigger\n | gridSummary:hasSummarizedColumns:summaryCalculationMode:summaryPosition:id:showSummaryOnCollapse:pipeTrigger:summaryPipeTrigger\n | gridDetails:hasDetails:expansionStates:pipeTrigger\n | gridAddRow:false:pipeTrigger\n | gridRowPinning:id:false:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight'\n [igxForItemSize]=\"hasColumnLayouts ? rowHeight * multiRowLayoutRowSize + 1 : renderedRowHeight\"\n [igxForTrackBy]='trackChanges'\n #verticalScrollContainer (chunkPreload)=\"dataLoading($event)\" (dataChanging)=\"dataRebinding($event)\" (dataChanged)=\"dataRebound($event)\">\n <ng-template\n [igxTemplateOutlet]='getRowTemplate(rowData)'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex)'\n (cachedViewLoaded)='cachedViewLoaded($event)'\n (viewCreated)='viewCreatedHandler($event)'\n (viewMoved)='viewMovedHandler($event)'>\n </ng-template>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template #record_template let-rowIndex=\"index\" let-rowData let-disabledRow=\"disabled\">\n <igx-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [rowData]=\"rowData\" [disabled]=\"disabledRow\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-grid-row>\n </ng-template>\n <ng-template #pinned_record_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [rowData]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\"#row #pinnedRow>\n </igx-grid-row>\n </ng-template>\n <ng-template #group_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-groupby-row [gridID]=\"id\" [index]=\"rowIndex\" [groupRow]=\"rowData\" [hideGroupRowSelectors]=\"hideRowSelectors\" [rowDraggable]=\"rowDraggable\" #row>\n </igx-grid-groupby-row>\n </ng-template>\n <ng-template #summary_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-summary-row role=\"row\" [gridID]=\"id\" [summaries]=\"rowData.summaries\" [index]=\"rowIndex\"\n class=\"igx-grid__summaries--body\" #summaryRow>\n </igx-grid-summary-row>\n </ng-template>\n <ng-template #detail_template_container let-rowIndex=\"index\" let-rowData>\n <div detail='true' style=\"overflow: auto; width: 100%;\" id=\"{{id}}_{{rowIndex}}\" (pointerdown)='detailsViewFocused(detailsContainer, rowIndex)' #detailsContainer [attr.data-rowindex]='rowIndex'\n [ngClass]=\"{\n 'igx-grid__tr-container': true,\n 'igx-grid__tr-container--active': isDetailActive(rowIndex)\n }\">\n <div class=\"igx-grid__hierarchical-indent\" style='display: flex;'>\n <ng-container *ngIf=\"this.groupingExpressions.length > 0\">\n <div class=\"igx-grid__row-indentation igx-grid__row-indentation--level-{{groupingExpressions.length}}\"></div>\n </ng-container>\n <ng-template\n [ngTemplateOutlet]='detailTemplate.first'\n [ngTemplateOutletContext]='getDetailsContext(rowData, rowIndex)'>\n </ng-template>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n <igc-trial-watermark></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div #igxBodyOverlayOutlet=\"overlay-outlet\" igxOverlayOutlet></div>\n</div>\n\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summariesHeight' #tfoot>\n <div tabindex=\"0\" (focus)=\"navigation.focusFirstCell(false)\" (keydown)=\"navigation.summaryNav($event)\" [attr.aria-activedescendant]=\"activeDescendant\">\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summariesHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\" role=\"row\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"dataView.length\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalScroll()' [style.height.px]='summariesHeight'\n [style.width.px]=\"scrollSize\"></div>\n </div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='EMPTY_DATA' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-container *ngIf=\"totalRecords || pagingMode === 1\">\n <ng-content select=\"igx-paginator\"></ng-content>\n </ng-container>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n <button igxButton=\"raised\" igxRipple (click)=\"this.crudService.enterAddRowMode(null, false, $event)\">\n {{resourceStrings.igx_grid_add_row_label}}\n </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<ng-template #defaultExpandedTemplate>\n <igx-icon role=\"button\" class=\"igx-grid__group-expand-btn\"\n [ngClass]=\"{\n 'igx-grid__group-expand-btn--push': filteringService.isFilterRowVisible\n}\">unfold_less</igx-icon>\n</ng-template>\n\n <ng-template #defaultCollapsedTemplate>\n <igx-icon role=\"button\" class=\"igx-grid__group-expand-btn\"\n [ngClass]=\"{\n 'igx-grid__group-expand-btn--push': filteringService.isFilterRowVisible\n}\">unfold_more</igx-icon>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle #rowEditingOverlay>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"rowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row\n</ng-template>\n\n<ng-template #defaultRowEditActions>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(false, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}</button>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(true, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_done }}</button>\n</ng-template>\n\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"this.crudService.row?.getClassName() === 'IgxAddRow' ? rowAddText : rowEditText ? rowEditText : defaultRowEditText;\n context: { $implicit: this.crudService.row?.getClassName() !== 'IgxAddRow' ? rowChangesCount : null }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"rowEditActions ? rowEditActions : defaultRowEditActions; context: { $implicit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon>drag_indicator</igx-icon>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n"
62579
62736
  },] }
62580
62737
  ];
62581
62738
  IgxGridComponent.propDecorators = {
@@ -63403,7 +63560,7 @@ class IgxGridToolbarAdvancedFilteringComponent {
63403
63560
  IgxGridToolbarAdvancedFilteringComponent.decorators = [
63404
63561
  { type: Component, args: [{
63405
63562
  selector: 'igx-grid-toolbar-advanced-filtering',
63406
- template: "<button igxButton=\"outlined\" [displayDensity]=\"grid.displayDensity\" name=\"btnAdvancedFiltering\" igxRipple\n [title]=\"grid?.resourceStrings.igx_grid_toolbar_advanced_filtering_button_tooltip\"\n (click)=\"grid.openAdvancedFilteringDialog(overlaySettings)\"\n [ngClass]=\"grid.advancedFilteringExpressionsTree ? 'igx-grid-toolbar__adv-filter--filtered' : 'igx-grid-toolbar__adv-filter'\">\n <igx-icon>filter_list</igx-icon>\n <span #ref>\n <ng-content></ng-content>\n </span>\n <span *ngIf=\"!ref.childNodes.length\">{{ grid?.resourceStrings.igx_grid_toolbar_advanced_filtering_button_label }}</span>\n</button>\n"
63563
+ template: "<button igxButton=\"outlined\" type=\"button\" [displayDensity]=\"grid.displayDensity\" name=\"btnAdvancedFiltering\" igxRipple\n [title]=\"grid?.resourceStrings.igx_grid_toolbar_advanced_filtering_button_tooltip\"\n (click)=\"grid.openAdvancedFilteringDialog(overlaySettings)\"\n [ngClass]=\"grid.advancedFilteringExpressionsTree ? 'igx-grid-toolbar__adv-filter--filtered' : 'igx-grid-toolbar__adv-filter'\">\n <igx-icon>filter_list</igx-icon>\n <span #ref>\n <ng-content></ng-content>\n </span>\n <span *ngIf=\"!ref.childNodes.length\">{{ grid?.resourceStrings.igx_grid_toolbar_advanced_filtering_button_label }}</span>\n</button>\n"
63407
63564
  },] }
63408
63565
  ];
63409
63566
  IgxGridToolbarAdvancedFilteringComponent.ctorParameters = () => [
@@ -63649,7 +63806,7 @@ class IgxGridToolbarExporterComponent extends BaseToolbarDirective {
63649
63806
  IgxGridToolbarExporterComponent.decorators = [
63650
63807
  { type: Component, args: [{
63651
63808
  selector: 'igx-grid-toolbar-exporter',
63652
- template: "<button [title]=\"grid?.resourceStrings.igx_grid_toolbar_exporter_button_tooltip\" [disabled]=\"isExporting\"\n igxButton=\"outlined\" [displayDensity]=\"grid.displayDensity\" igxRipple #btn (click)=\"toggle(btn, toggleRef)\">\n\n <igx-icon>import_export</igx-icon>\n <span #ref>\n <ng-content></ng-content>\n </span>\n <span *ngIf=\"!ref.childNodes.length\">\n {{ grid.exportText || grid?.resourceStrings.igx_grid_toolbar_exporter_button_label }}\n </span>\n <igx-icon>arrow_drop_down</igx-icon>\n</button>\n\n<div class=\"igx-grid-toolbar__dropdown\" id=\"btnExport\">\n <ul class=\"igx-grid-toolbar__dd-list\" igxToggle #toggleRef=\"toggle\">\n <li *ngIf=\"grid.exportExcel || exportExcel\" #btnExportExcel id=\"btnExportExcel\"\n class=\"igx-grid-toolbar__dd-list-items\" igxRipple (click)=\"export('excel', toggleRef)\">\n\n <ng-template #excel>\n <ng-content select=[excelText],excel-text></ng-content>\n </ng-template>\n <excel-text *ngIf=\"!hasExcelAttr\">\n {{ grid.exportExcelText || grid?.resourceStrings.igx_grid_toolbar_exporter_excel_entry_text}}\n </excel-text>\n <ng-container *ngTemplateOutlet=\"excel\"></ng-container>\n </li>\n\n <li *ngIf=\"grid.exportCsv || exportCSV\" #btnExportCsv id=\"btnExportCsv\" class=\"igx-grid-toolbar__dd-list-items\"\n igxRipple (click)=\"export('csv', toggleRef)\">\n\n <ng-template #csv>\n <ng-content select=[csvText],csv-text></ng-content>\n </ng-template>\n <csv-text *ngIf=\"!hasCSVAttr\">\n {{ grid.exportCsvText || grid?.resourceStrings.igx_grid_toolbar_exporter_csv_entry_text }}</csv-text>\n <ng-container *ngTemplateOutlet=\"csv\"></ng-container>\n </li>\n </ul>\n</div>\n"
63809
+ template: "<button [title]=\"grid?.resourceStrings.igx_grid_toolbar_exporter_button_tooltip\" [disabled]=\"isExporting\"\n igxButton=\"outlined\" type=\"button\" [displayDensity]=\"grid.displayDensity\" igxRipple #btn (click)=\"toggle(btn, toggleRef)\">\n\n <igx-icon>import_export</igx-icon>\n <span #ref>\n <ng-content></ng-content>\n </span>\n <span *ngIf=\"!ref.childNodes.length\">\n {{ grid.exportText || grid?.resourceStrings.igx_grid_toolbar_exporter_button_label }}\n </span>\n <igx-icon>arrow_drop_down</igx-icon>\n</button>\n\n<div class=\"igx-grid-toolbar__dropdown\" id=\"btnExport\">\n <ul class=\"igx-grid-toolbar__dd-list\" igxToggle #toggleRef=\"toggle\">\n <li *ngIf=\"grid.exportExcel || exportExcel\" #btnExportExcel id=\"btnExportExcel\"\n class=\"igx-grid-toolbar__dd-list-items\" igxRipple (click)=\"export('excel', toggleRef)\">\n\n <ng-template #excel>\n <ng-content select=[excelText],excel-text></ng-content>\n </ng-template>\n <excel-text *ngIf=\"!hasExcelAttr\">\n {{ grid.exportExcelText || grid?.resourceStrings.igx_grid_toolbar_exporter_excel_entry_text}}\n </excel-text>\n <ng-container *ngTemplateOutlet=\"excel\"></ng-container>\n </li>\n\n <li *ngIf=\"grid.exportCsv || exportCSV\" #btnExportCsv id=\"btnExportCsv\" class=\"igx-grid-toolbar__dd-list-items\"\n igxRipple (click)=\"export('csv', toggleRef)\">\n\n <ng-template #csv>\n <ng-content select=[csvText],csv-text></ng-content>\n </ng-template>\n <csv-text *ngIf=\"!hasCSVAttr\">\n {{ grid.exportCsvText || grid?.resourceStrings.igx_grid_toolbar_exporter_csv_entry_text }}</csv-text>\n <ng-container *ngTemplateOutlet=\"csv\"></ng-container>\n </li>\n </ul>\n</div>\n"
63653
63810
  },] }
63654
63811
  ];
63655
63812
  IgxGridToolbarExporterComponent.ctorParameters = () => [
@@ -63687,7 +63844,7 @@ class IgxGridToolbarHidingComponent extends BaseToolbarColumnActionsDirective {
63687
63844
  IgxGridToolbarHidingComponent.decorators = [
63688
63845
  { type: Component, args: [{
63689
63846
  selector: 'igx-grid-toolbar-hiding',
63690
- template: "<ng-container *ngIf=\"grid.rendered$ | async\">\n <button [title]=\"grid?.resourceStrings.igx_grid_toolbar_hiding_button_tooltip\" #btn igxButton=\"outlined\"\n name=\"btnColumnHiding\" (click)=\"toggle(btn, ref, actions)\" [displayDensity]=\"grid.displayDensity\">\n <igx-icon>{{ !grid.hiddenColumnsCount ? 'visibility' : 'visibility_off' }}</igx-icon>\n <span>{{ grid.hiddenColumnsCount }}</span>\n <span>{{ grid.hiddenColumnsText }}</span>\n </button>\n <igx-column-actions #actions igxColumnHiding igxToggle (opened)=\"focusSearch(ref.element)\" #ref=\"toggle\"\n [grid]=\"grid\" [title]=\"grid.columnHidingTitleInternal || title || grid?.resourceStrings.igx_grid_toolbar_hiding_title\"\n [filterColumnsPrompt]=\"prompt || grid?.resourceStrings.igx_grid_toolbar_actions_filter_prompt\"\n [hideFilter]=\"hideFilter\" [filterCriteria]=\"filterCriteria\" [columnDisplayOrder]=\"columnDisplayOrder\" [columnsAreaMaxHeight]=\"columnsAreaMaxHeight\"\n [uncheckAllText]=\"uncheckAllText\" [checkAllText]=\"checkAllText\" [indentation]=\"indentetion\">\n </igx-column-actions>\n</ng-container>\n"
63847
+ template: "<ng-container *ngIf=\"grid.rendered$ | async\">\n <button [title]=\"grid?.resourceStrings.igx_grid_toolbar_hiding_button_tooltip\" #btn igxButton=\"outlined\" type=\"button\"\n name=\"btnColumnHiding\" (click)=\"toggle(btn, ref, actions)\" [displayDensity]=\"grid.displayDensity\">\n <igx-icon>{{ !grid.hiddenColumnsCount ? 'visibility' : 'visibility_off' }}</igx-icon>\n <span>{{ grid.hiddenColumnsCount }}</span>\n <span>{{ grid.hiddenColumnsText }}</span>\n </button>\n <igx-column-actions #actions igxColumnHiding igxToggle (opened)=\"focusSearch(ref.element)\" #ref=\"toggle\"\n [grid]=\"grid\" [title]=\"grid.columnHidingTitleInternal || title || grid?.resourceStrings.igx_grid_toolbar_hiding_title\"\n [filterColumnsPrompt]=\"prompt || grid?.resourceStrings.igx_grid_toolbar_actions_filter_prompt\"\n [hideFilter]=\"hideFilter\" [filterCriteria]=\"filterCriteria\" [columnDisplayOrder]=\"columnDisplayOrder\" [columnsAreaMaxHeight]=\"columnsAreaMaxHeight\"\n [uncheckAllText]=\"uncheckAllText\" [checkAllText]=\"checkAllText\" [indentation]=\"indentetion\">\n </igx-column-actions>\n</ng-container>\n"
63691
63848
  },] }
63692
63849
  ];
63693
63850
  IgxGridToolbarHidingComponent.propDecorators = {
@@ -63714,7 +63871,7 @@ class IgxGridToolbarPinningComponent extends BaseToolbarColumnActionsDirective {
63714
63871
  IgxGridToolbarPinningComponent.decorators = [
63715
63872
  { type: Component, args: [{
63716
63873
  selector: 'igx-grid-toolbar-pinning',
63717
- template: "<ng-container *ngIf=\"grid.rendered$ | async\">\n <button [title]=\"grid?.resourceStrings.igx_grid_toolbar_pinning_button_tooltip\" #btn igxButton=\"outlined\"\n name=\"btnColumnPinning\" (click)=\"toggle(btn, ref, actions)\" [displayDensity]=\"grid.displayDensity\">\n <igx-icon family=\"imx-icons\" [name]=\"!grid.pinnedColumnsCount ? 'unpin-left' : 'pin-left'\"></igx-icon>\n <span>{{ grid.pinnedColumnsCount }}</span>\n <span>{{ grid.pinnedColumnsTextInternal }}</span>\n </button>\n <igx-column-actions #actions igxColumnPinning igxToggle (opened)=\"focusSearch(ref.element)\" #ref=\"toggle\"\n [grid]=\"grid\" [title]=\"grid.columnPinningTitleInternal || title || grid?.resourceStrings.igx_grid_toolbar_pinning_title\"\n [filterColumnsPrompt]=\"prompt || grid?.resourceStrings.igx_grid_toolbar_actions_filter_prompt\"\n [hideFilter]=\"hideFilter\" [filterCriteria]=\"filterCriteria\" [columnDisplayOrder]=\"columnDisplayOrder\" [columnsAreaMaxHeight]=\"columnsAreaMaxHeight\"\n [uncheckAllText]=\"uncheckAllText\" [checkAllText]=\"checkAllText\" [indentation]=\"indentetion\">\n </igx-column-actions>\n</ng-container>\n"
63874
+ template: "<ng-container *ngIf=\"grid.rendered$ | async\">\n <button [title]=\"grid?.resourceStrings.igx_grid_toolbar_pinning_button_tooltip\" #btn igxButton=\"outlined\" type=\"button\"\n name=\"btnColumnPinning\" (click)=\"toggle(btn, ref, actions)\" [displayDensity]=\"grid.displayDensity\">\n <igx-icon family=\"imx-icons\" [name]=\"!grid.pinnedColumnsCount ? 'unpin-left' : 'pin-left'\"></igx-icon>\n <span>{{ grid.pinnedColumnsCount }}</span>\n <span>{{ grid.pinnedColumnsTextInternal }}</span>\n </button>\n <igx-column-actions #actions igxColumnPinning igxToggle (opened)=\"focusSearch(ref.element)\" #ref=\"toggle\"\n [grid]=\"grid\" [title]=\"grid.columnPinningTitleInternal || title || grid?.resourceStrings.igx_grid_toolbar_pinning_title\"\n [filterColumnsPrompt]=\"prompt || grid?.resourceStrings.igx_grid_toolbar_actions_filter_prompt\"\n [hideFilter]=\"hideFilter\" [filterCriteria]=\"filterCriteria\" [columnDisplayOrder]=\"columnDisplayOrder\" [columnsAreaMaxHeight]=\"columnsAreaMaxHeight\"\n [uncheckAllText]=\"uncheckAllText\" [checkAllText]=\"checkAllText\" [indentation]=\"indentetion\">\n </igx-column-actions>\n</ng-container>\n"
63718
63875
  },] }
63719
63876
  ];
63720
63877
  IgxGridToolbarPinningComponent.propDecorators = {
@@ -66016,7 +66173,7 @@ IgxTreeGridComponent.decorators = [
66016
66173
  changeDetection: ChangeDetectionStrategy.OnPush,
66017
66174
  preserveWhitespaces: false,
66018
66175
  selector: 'igx-tree-grid',
66019
- template: "<ng-content select=\"igx-grid-toolbar\"></ng-content>\n<ng-content select=\"igx-tree-grid-group-by-area\"></ng-content>\n<igx-grid-header-row class=\"igx-grid-thead\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" (focus)=\"navigation.focusTbody($event)\" (keydown)=\"navigation.handleNavigation($event)\"\n (dragStop)=\"selectionService.dragMode = $event\" [attr.aria-activedescendant]=\"activeDescendant\" [attr.role]=\"dataView.length ? null : 'row'\"\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth' #tbody (scroll)='preventContainerScroll($event)'>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template #pinnedRecordsTemplate>\n <ng-container *ngIf='data\n | treeGridTransaction:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | treeGridNormalizeRecord:pipeTrigger\n | treeGridAddRow:true:pipeTrigger\n | gridRowPinning:id:true:pipeTrigger\n | treeGridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:pipeTrigger:filteringPipeTrigger:true\n | treeGridSorting:sortingExpressions:sortStrategy:pipeTrigger:true as pinnedData'>\n <div #pinContainer *ngIf='pinnedData.length > 0'\n [ngClass]=\"{\n 'igx-grid__tr--pinned-bottom': !isRowPinningToTop,\n 'igx-grid__tr--pinned-top': isRowPinningToTop\n }\"\n class='igx-grid__tr--pinned' [style.width.px]='calcWidth'>\n <ng-container *ngFor=\"let rowData of pinnedData;let rowIndex = index;\">\n <ng-container *ngTemplateOutlet=\"pinned_record_template; context: getContext(rowData, rowIndex, true)\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\"></ng-container>\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"data\n | treeGridTransaction:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | treeGridHierarchizing:primaryKey:foreignKey:childDataKey:pipeTrigger\n | treeGridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:pipeTrigger:filteringPipeTrigger\n | treeGridSorting:sortingExpressions:sortStrategy:pipeTrigger\n | treeGridFlattening:expansionDepth:expansionStates:pipeTrigger\n | treeGridPaging:paginator?.page:paginator?.perPage:pipeTrigger\n | treeGridSummary:hasSummarizedColumns:summaryCalculationMode:summaryPosition:showSummaryOnCollapse:pipeTrigger:summaryPipeTrigger\n | treeGridAddRow:false:pipeTrigger\n | gridRowPinning:id:false:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight' [igxForItemSize]=\"renderedRowHeight\" #verticalScrollContainer\n (dataChanging)=\"dataRebinding($event)\" (dataChanged)=\"dataRebound($event)\">\n <ng-template [igxTemplateOutlet]='isSummaryRow(rowData) ? summary_template : record_template'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex, false)'\n (cachedViewLoaded)='cachedViewLoaded($event)'>\n </ng-template>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\"></ng-container>\n <ng-template #record_template let-rowIndex=\"index\" let-disabledRow=\"disabled\" let-rowData>\n <igx-tree-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [treeRow]=\"rowData\" [disabled]=\"disabledRow\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:row.treeRow.isFilteredOutParent:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-tree-grid-row>\n </ng-template>\n <ng-template #pinned_record_template let-rowIndex=\"index\" let-rowData>\n <igx-tree-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [treeRow]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:row.treeRow.isFilteredOutParent:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\"#row #pinnedRow>\n </igx-tree-grid-row>\n </ng-template>\n <ng-template #summary_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-summary-row [gridID]=\"id\" [summaries]=\"rowData.summaries\"\n [firstCellIndentation]=\"rowData.cellIndentation\" [index]=\"rowIndex\"\n class=\"igx-grid__summaries--body\" role=\"row\" #summaryRow>\n </igx-grid-summary-row>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n <igc-trial-watermark></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\"\n [style.height.px]='calcHeight'>\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div igxOverlayOutlet #igxBodyOverlayOutlet=\"overlay-outlet\"></div>\n</div>\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summariesHeight' #tfoot>\n <div tabindex=\"0\" (focus)=\"navigation.focusFirstCell(false)\"\n (keydown)=\"navigation.summaryNav($event)\" [attr.aria-activedescendant]=\"activeDescendant\">\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summariesHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\" role=\"row\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"dataView.length\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalScroll()' [style.height.px]='summariesHeight'\n [style.width.px]=\"scrollSize\"></div>\n </div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='[]' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-container *ngIf=\"totalRecords || pagingMode === 1\">\n <ng-content select=\"igx-paginator\"></ng-content>\n </ng-container>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n <button igxButton=\"raised\" igxRipple (click)=\"this.crudService.enterAddRowMode(null, false, $event)\">\n {{resourceStrings.igx_grid_add_row_label}}\n </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle #rowEditingOverlay>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"rowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: this.crudService.endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row\n</ng-template>\n\n<ng-template #defaultRowEditActions>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(false, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}</button>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(true, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_done }}</button>\n</ng-template>\n\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"this.crudService.row?.getClassName() === 'IgxAddRow' ? rowAddText : rowEditText ? rowEditText : defaultRowEditText;\n context: { $implicit: this.crudService.row?.getClassName() !== 'IgxAddRow' ? rowChangesCount : null }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"rowEditActions ? rowEditActions : defaultRowEditActions; context: { $implicit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon>drag_indicator</igx-icon>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n",
66176
+ template: "<ng-content select=\"igx-grid-toolbar\"></ng-content>\n<ng-content select=\"igx-tree-grid-group-by-area\"></ng-content>\n<igx-grid-header-row class=\"igx-grid-thead\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" (focus)=\"navigation.focusTbody($event)\" (keydown)=\"navigation.handleNavigation($event)\"\n (dragStop)=\"selectionService.dragMode = $event\" [attr.aria-activedescendant]=\"activeDescendant\" [attr.role]=\"dataView.length ? null : 'row'\"\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth' #tbody (scroll)='preventContainerScroll($event)'>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template #pinnedRecordsTemplate>\n <ng-container *ngIf='data\n | treeGridTransaction:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | treeGridNormalizeRecord:pipeTrigger\n | treeGridAddRow:true:pipeTrigger\n | gridRowPinning:id:true:pipeTrigger\n | treeGridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:pipeTrigger:filteringPipeTrigger:true\n | treeGridSorting:sortingExpressions:sortStrategy:pipeTrigger:true as pinnedData'>\n <div #pinContainer *ngIf='pinnedData.length > 0'\n [ngClass]=\"{\n 'igx-grid__tr--pinned-bottom': !isRowPinningToTop,\n 'igx-grid__tr--pinned-top': isRowPinningToTop\n }\"\n class='igx-grid__tr--pinned' [style.width.px]='calcWidth'>\n <ng-container *ngFor=\"let rowData of pinnedData;let rowIndex = index;\">\n <ng-container *ngTemplateOutlet=\"pinned_record_template; context: getContext(rowData, rowIndex, true)\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\"></ng-container>\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"data\n | treeGridTransaction:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | treeGridHierarchizing:primaryKey:foreignKey:childDataKey:pipeTrigger\n | treeGridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:pipeTrigger:filteringPipeTrigger\n | treeGridSorting:sortingExpressions:sortStrategy:pipeTrigger\n | treeGridFlattening:expansionDepth:expansionStates:pipeTrigger\n | treeGridPaging:paginator?.page:paginator?.perPage:pipeTrigger\n | treeGridSummary:hasSummarizedColumns:summaryCalculationMode:summaryPosition:showSummaryOnCollapse:pipeTrigger:summaryPipeTrigger\n | treeGridAddRow:false:pipeTrigger\n | gridRowPinning:id:false:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight' [igxForItemSize]=\"renderedRowHeight\" #verticalScrollContainer\n (dataChanging)=\"dataRebinding($event)\" (dataChanged)=\"dataRebound($event)\">\n <ng-template [igxTemplateOutlet]='isSummaryRow(rowData) ? summary_template : record_template'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex, false)'\n (cachedViewLoaded)='cachedViewLoaded($event)'>\n </ng-template>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\"></ng-container>\n <ng-template #record_template let-rowIndex=\"index\" let-disabledRow=\"disabled\" let-rowData>\n <igx-tree-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [treeRow]=\"rowData\" [disabled]=\"disabledRow\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:row.treeRow.isFilteredOutParent:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-tree-grid-row>\n </ng-template>\n <ng-template #pinned_record_template let-rowIndex=\"index\" let-rowData>\n <igx-tree-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [treeRow]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:row.treeRow.isFilteredOutParent:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\"#row #pinnedRow>\n </igx-tree-grid-row>\n </ng-template>\n <ng-template #summary_template let-rowIndex=\"index\" let-rowData>\n <igx-grid-summary-row [gridID]=\"id\" [summaries]=\"rowData.summaries\"\n [firstCellIndentation]=\"rowData.cellIndentation\" [index]=\"rowIndex\"\n class=\"igx-grid__summaries--body\" role=\"row\" #summaryRow>\n </igx-grid-summary-row>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n <igc-trial-watermark></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\"\n [style.height.px]='calcHeight'>\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div igxOverlayOutlet #igxBodyOverlayOutlet=\"overlay-outlet\"></div>\n</div>\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summariesHeight' #tfoot>\n <div tabindex=\"0\" (focus)=\"navigation.focusFirstCell(false)\"\n (keydown)=\"navigation.summaryNav($event)\" [attr.aria-activedescendant]=\"activeDescendant\">\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summariesHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\" role=\"row\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"dataView.length\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalScroll()' [style.height.px]='summariesHeight'\n [style.width.px]=\"scrollSize\"></div>\n </div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='[]' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-container *ngIf=\"totalRecords || pagingMode === 1\">\n <ng-content select=\"igx-paginator\"></ng-content>\n </ng-container>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n <button igxButton=\"raised\" igxRipple (click)=\"this.crudService.enterAddRowMode(null, false, $event)\">\n {{resourceStrings.igx_grid_add_row_label}}\n </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle #rowEditingOverlay>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"rowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: this.crudService.endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row\n</ng-template>\n\n<ng-template #defaultRowEditActions>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(false, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}</button>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(true, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_done }}</button>\n</ng-template>\n\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"this.crudService.row?.getClassName() === 'IgxAddRow' ? rowAddText : rowEditText ? rowEditText : defaultRowEditText;\n context: { $implicit: this.crudService.row?.getClassName() !== 'IgxAddRow' ? rowChangesCount : null }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"rowEditActions ? rowEditActions : defaultRowEditActions; context: { $implicit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon>drag_indicator</igx-icon>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n",
66020
66177
  providers: [
66021
66178
  IgxGridCRUDService,
66022
66179
  IgxGridSummaryService,
@@ -67302,8 +67459,8 @@ class IgxHierarchicalGridNavigationService extends IgxGridNavigationService {
67302
67459
  }
67303
67460
  clearActivation() {
67304
67461
  // clear if previous activation exists.
67305
- if (this.activeNode) {
67306
- this.activeNode.row = null;
67462
+ if (this.activeNode && Object.keys(this.activeNode).length) {
67463
+ this.activeNode = Object.assign({});
67307
67464
  }
67308
67465
  }
67309
67466
  hasNextTarget(grid, index, isNext) {
@@ -68887,7 +69044,7 @@ IgxHierarchicalGridComponent.decorators = [
68887
69044
  changeDetection: ChangeDetectionStrategy.OnPush,
68888
69045
  preserveWhitespaces: false,
68889
69046
  selector: 'igx-hierarchical-grid',
68890
- template: "<ng-content select=\"igx-grid-toolbar\"></ng-content>\n<ng-container #toolbarOutlet></ng-container>\n\n<igx-grid-header-row class=\"igx-grid-thead\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" (focus)=\"navigation.focusTbody($event)\"\n (keydown)=\"navigation.handleNavigation($event)\" (dragStop)=\"selectionService.dragMode = $event\"\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\" [attr.aria-activedescendant]=\"activeDescendant\" [attr.role]=\"dataView.length ? null : 'row'\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth' #tbody (scroll)='preventContainerScroll($event)'>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template #pinnedRecordsTemplate>\n <ng-container *ngIf=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridAddRow:true:pipeTrigger\n | gridRowPinning:id:true:pipeTrigger\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger:true\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger:true as pinnedData\">\n <div #pinContainer *ngIf='pinnedData.length > 0' class='igx-grid__tr--pinned'\n [ngClass]=\"{ 'igx-grid__tr--pinned-bottom': !isRowPinningToTop, 'igx-grid__tr--pinned-top': isRowPinningToTop }\"\n [style.width.px]='calcWidth'>\n <ng-container *ngFor=\"let rowData of pinnedData; let rowIndex = index\">\n <ng-container *ngTemplateOutlet=\"pinned_hierarchical_record_template; context: getContext(rowData, rowIndex, true)\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template igxGridFor let-rowData let-rowIndex=\"index\" [igxGridForOf]=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger\n | gridHierarchicalPaging:paginator?.page:paginator?.perPage:id:pipeTrigger\n | gridHierarchical:expansionStates:id:primaryKey:childLayoutKeys:pipeTrigger\n | gridAddRow:false:pipeTrigger\n | gridRowPinning:id:false:pipeTrigger\"\n [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight' [igxForItemSize]=\"renderedRowHeight\" [igxForTrackBy]='trackChanges'\n #verticalScrollContainer (chunkPreload)=\"dataLoading($event)\" (dataChanging)=\"dataRebinding($event)\" (dataChanged)=\"dataRebound($event)\">\n <ng-template\n [igxTemplateOutlet]='(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) ? child_record_template : hierarchical_record_template))'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex, false)' (viewCreated)='viewCreatedHandler($event)'\n (viewMoved)='viewMovedHandler($event)' (cachedViewLoaded)='cachedViewLoaded($event)'>\n </ng-template>\n <!-- <ng-container *igxTemplateOutlet=\"(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template)); context: getContext(rowData)\"></ng-container> -->\n </ng-template>\n <ng-template #hierarchical_record_template let-rowIndex=\"index\" let-disabledRow=\"disabled\" let-rowData>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [disabled]=\"disabledRow\" [rowData]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-hierarchical-grid-row>\n </ng-template>\n\n <ng-template #pinned_hierarchical_record_template let-rowIndex=\"index\" let-rowData>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [rowData]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row #pinnedRow>\n </igx-hierarchical-grid-row>\n </ng-template>\n <ng-template #child_record_template let-rowIndex=\"index\" let-rowData>\n <div style=\"overflow: auto; width: 100%;\" [attr.data-rowindex]='rowIndex' (scroll)='onContainerScroll()'\n [ngClass]=\"{\n 'igx-grid__tr-container': true,\n 'igx-grid__tr--highlighted':isRowHighlighted(rowData)\n }\">\n <igx-child-grid-row *ngFor=\"let layout of childLayoutList\" [parentGridID]=\"id\" [index]=\"rowIndex\"\n [rowData]=\"rowData\" [layout]='layout' #row>\n </igx-child-grid-row>\n </div>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n <igc-trial-watermark *ngIf=\"!this.parent\"></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div igxOverlayOutlet #igxBodyOverlayOutlet=\"overlay-outlet\"></div>\n</div>\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summariesHeight' #tfoot>\n <div tabindex=\"0\" (focus)=\"navigation.focusFirstCell(false)\" [attr.aria-activedescendant]=\"activeDescendant\"\n (keydown)=\"navigation.summaryNav($event)\">\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summariesHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\" role=\"row\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"dataView.length\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalScroll()' [style.height.px]='summariesHeight'\n [style.width.px]=\"scrollSize\"></div>\n </div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='[]' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-content *ngIf=\"totalRecords || pagingMode === 1\" select=\"igx-paginator\"></ng-content>\n <ng-container #paginatorOutlet></ng-container>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n <button igxButton=\"raised\" igxRipple (click)=\"this.crudService.enterAddRowMode(null, false, $event)\">\n {{resourceStrings.igx_grid_add_row_label}}\n </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<ng-template #defaultCollapsedTemplate>\n <igx-icon role=\"button\">unfold_more</igx-icon>\n</ng-template>\n\n<ng-template #defaultExpandedTemplate>\n <igx-icon role=\"button\" [active]='hasExpandedRecords() && hasExpandableChildren'>unfold_less</igx-icon>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle #rowEditingOverlay>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"resolveRowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: this.crudService.endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row\n</ng-template>\n<ng-template #defaultRowEditActions>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(false, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}</button>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(true, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_done }}</button>\n</ng-template>\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"this.crudService.row?.getClassName() === 'IgxAddRow' ? rowAddText : resolveRowEditText || defaultRowEditText;\n context: { $implicit: this.crudService.row?.getClassName() !== 'IgxAddRow' ? rowChangesCount : null }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"resolveRowEditActions || defaultRowEditActions; context: { $implicit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon>drag_indicator</igx-icon>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n",
69047
+ template: "<ng-content select=\"igx-grid-toolbar\"></ng-content>\n<ng-container #toolbarOutlet></ng-container>\n\n<igx-grid-header-row class=\"igx-grid-thead\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" (focus)=\"navigation.focusTbody($event)\"\n (keydown)=\"navigation.handleNavigation($event)\" (dragStop)=\"selectionService.dragMode = $event\"\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\" [attr.aria-activedescendant]=\"activeDescendant\" [attr.role]=\"dataView.length ? null : 'row'\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth' #tbody (scroll)='preventContainerScroll($event)'>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template #pinnedRecordsTemplate>\n <ng-container *ngIf=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridAddRow:true:pipeTrigger\n | gridRowPinning:id:true:pipeTrigger\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger:true\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger:true as pinnedData\">\n <div #pinContainer *ngIf='pinnedData.length > 0' class='igx-grid__tr--pinned'\n [ngClass]=\"{ 'igx-grid__tr--pinned-bottom': !isRowPinningToTop, 'igx-grid__tr--pinned-top': isRowPinningToTop }\"\n [style.width.px]='calcWidth'>\n <ng-container *ngFor=\"let rowData of pinnedData; let rowIndex = index\">\n <ng-container *ngTemplateOutlet=\"pinned_hierarchical_record_template; context: getContext(rowData, rowIndex, true)\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template igxGridFor let-rowData let-rowIndex=\"index\" [igxGridForOf]=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger\n | gridHierarchicalPaging:paginator?.page:paginator?.perPage:id:pipeTrigger\n | gridHierarchical:expansionStates:id:primaryKey:childLayoutKeys:pipeTrigger\n | gridAddRow:false:pipeTrigger\n | gridRowPinning:id:false:pipeTrigger\"\n [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight' [igxForItemSize]=\"renderedRowHeight\" [igxForTrackBy]='trackChanges'\n #verticalScrollContainer (chunkPreload)=\"dataLoading($event)\" (dataChanging)=\"dataRebinding($event)\" (dataChanged)=\"dataRebound($event)\">\n <ng-template\n [igxTemplateOutlet]='(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) ? child_record_template : hierarchical_record_template))'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex, false)' (viewCreated)='viewCreatedHandler($event)'\n (viewMoved)='viewMovedHandler($event)' (cachedViewLoaded)='cachedViewLoaded($event)'>\n </ng-template>\n <!-- <ng-container *igxTemplateOutlet=\"(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template)); context: getContext(rowData)\"></ng-container> -->\n </ng-template>\n <ng-template #hierarchical_record_template let-rowIndex=\"index\" let-disabledRow=\"disabled\" let-rowData>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [disabled]=\"disabledRow\" [rowData]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-hierarchical-grid-row>\n </ng-template>\n\n <ng-template #pinned_hierarchical_record_template let-rowIndex=\"index\" let-rowData>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [rowData]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row #pinnedRow>\n </igx-hierarchical-grid-row>\n </ng-template>\n <ng-template #child_record_template let-rowIndex=\"index\" let-rowData>\n <div style=\"overflow: auto; width: 100%;\" [attr.data-rowindex]='rowIndex' (scroll)='onContainerScroll()'\n [ngClass]=\"{\n 'igx-grid__tr-container': true,\n 'igx-grid__tr--highlighted':isRowHighlighted(rowData)\n }\">\n <igx-child-grid-row *ngFor=\"let layout of childLayoutList\" [parentGridID]=\"id\" [index]=\"rowIndex\"\n [rowData]=\"rowData\" [layout]='layout' #row>\n </igx-child-grid-row>\n </div>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n <igc-trial-watermark *ngIf=\"!this.parent\"></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div igxOverlayOutlet #igxBodyOverlayOutlet=\"overlay-outlet\"></div>\n</div>\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summariesHeight' #tfoot>\n <div tabindex=\"0\" (focus)=\"navigation.focusFirstCell(false)\" [attr.aria-activedescendant]=\"activeDescendant\"\n (keydown)=\"navigation.summaryNav($event)\">\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summariesHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\" role=\"row\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"dataView.length\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalScroll()' [style.height.px]='summariesHeight'\n [style.width.px]=\"scrollSize\"></div>\n </div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='[]' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-content *ngIf=\"totalRecords || pagingMode === 1\" select=\"igx-paginator\"></ng-content>\n <ng-container #paginatorOutlet></ng-container>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n <button igxButton=\"raised\" igxRipple (click)=\"this.crudService.enterAddRowMode(null, false, $event)\">\n {{resourceStrings.igx_grid_add_row_label}}\n </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<ng-template #defaultCollapsedTemplate>\n <igx-icon role=\"button\">unfold_more</igx-icon>\n</ng-template>\n\n<ng-template #defaultExpandedTemplate>\n <igx-icon role=\"button\" [active]='hasExpandedRecords() && hasExpandableChildren'>unfold_less</igx-icon>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle #rowEditingOverlay>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"resolveRowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: this.crudService.endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row\n</ng-template>\n<ng-template #defaultRowEditActions>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(false, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}</button>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(true, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_done }}</button>\n</ng-template>\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"this.crudService.row?.getClassName() === 'IgxAddRow' ? rowAddText : resolveRowEditText || defaultRowEditText;\n context: { $implicit: this.crudService.row?.getClassName() !== 'IgxAddRow' ? rowChangesCount : null }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"resolveRowEditActions || defaultRowEditActions; context: { $implicit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon>drag_indicator</igx-icon>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n",
68891
69048
  providers: [
68892
69049
  IgxGridCRUDService,
68893
69050
  IgxGridSelectionService,
@@ -72728,7 +72885,7 @@ class IgxBottomNavComponent extends IgxTabsDirective {
72728
72885
  IgxBottomNavComponent.decorators = [
72729
72886
  { type: Component, args: [{
72730
72887
  selector: 'igx-bottom-nav',
72731
- template: "<ng-container *ngFor=\"let tab of items; let i = index\">\r\n <ng-container *ngTemplateOutlet=\"tab.panelTemplate\"></ng-container>\r\n</ng-container>\r\n\r\n<div\r\n #tablist\r\n role=\"tablist\"\r\n class=\"igx-bottom-nav__menu igx-bottom-nav__menu--bottom\"\r\n aria-orientation=\"horizontal\"\r\n>\r\n <ng-container *ngFor=\"let tab of items; let i = index\">\r\n <ng-container *ngTemplateOutlet=\"tab.headerTemplate\"></ng-container>\r\n </ng-container>\r\n</div>\r\n",
72888
+ template: "<ng-container *ngFor=\"let tab of items; let i = index\">\n <ng-container *ngTemplateOutlet=\"tab.panelTemplate\"></ng-container>\n</ng-container>\n\n<div\n #tablist\n role=\"tablist\"\n class=\"igx-bottom-nav__menu igx-bottom-nav__menu--bottom\"\n aria-orientation=\"horizontal\"\n>\n <ng-container *ngFor=\"let tab of items; let i = index\">\n <ng-container *ngTemplateOutlet=\"tab.headerTemplate\"></ng-container>\n </ng-container>\n</div>\n",
72732
72889
  providers: [{ provide: IgxTabsBase, useExisting: IgxBottomNavComponent }]
72733
72890
  },] }
72734
72891
  ];
@@ -72738,7 +72895,7 @@ class IgxBottomNavItemComponent extends IgxTabItemDirective {
72738
72895
  IgxBottomNavItemComponent.decorators = [
72739
72896
  { type: Component, args: [{
72740
72897
  selector: 'igx-bottom-nav-item',
72741
- template: "<ng-template #headerTemplate>\r\n <ng-content select=\"igx-bottom-nav-header\"></ng-content>\r\n</ng-template>\r\n<ng-template #panelTemplate>\r\n <ng-content select=\"igx-bottom-nav-content\"></ng-content>\r\n</ng-template>\r\n",
72898
+ template: "<ng-template #headerTemplate>\n <ng-content select=\"igx-bottom-nav-header\"></ng-content>\n</ng-template>\n<ng-template #panelTemplate>\n <ng-content select=\"igx-bottom-nav-content\"></ng-content>\n</ng-template>\n",
72742
72899
  providers: [{ provide: IgxTabItemDirective, useExisting: IgxBottomNavItemComponent }]
72743
72900
  },] }
72744
72901
  ];
@@ -72760,7 +72917,7 @@ class IgxBottomNavHeaderComponent extends IgxTabHeaderDirective {
72760
72917
  IgxBottomNavHeaderComponent.decorators = [
72761
72918
  { type: Component, args: [{
72762
72919
  selector: 'igx-bottom-nav-header',
72763
- template: "<ng-content></ng-content>\r\n",
72920
+ template: "<ng-content></ng-content>\n",
72764
72921
  providers: [{ provide: IgxTabHeaderBase, useExisting: IgxBottomNavHeaderComponent }]
72765
72922
  },] }
72766
72923
  ];
@@ -72795,7 +72952,7 @@ class IgxBottomNavContentComponent extends IgxTabContentDirective {
72795
72952
  IgxBottomNavContentComponent.decorators = [
72796
72953
  { type: Component, args: [{
72797
72954
  selector: 'igx-bottom-nav-content',
72798
- template: "<ng-content *ngIf=\"tab.selected || tab.previous\"></ng-content>\r\n",
72955
+ template: "<ng-content *ngIf=\"tab.selected || tab.previous\"></ng-content>\n",
72799
72956
  providers: [{ provide: IgxTabContentBase, useExisting: IgxBottomNavContentComponent }]
72800
72957
  },] }
72801
72958
  ];
@@ -73079,7 +73236,7 @@ class IgxTabsComponent extends IgxTabsDirective {
73079
73236
  IgxTabsComponent.decorators = [
73080
73237
  { type: Component, args: [{
73081
73238
  selector: 'igx-tabs',
73082
- template: "<div #headerContainer class=\"igx-tabs__header\">\r\n <button\r\n #leftButton\r\n igxButton=\"icon\"\r\n igxRipple\r\n class=\"igx-tabs__header-button\"\r\n (click)=\"scrollLeft()\"\r\n >\r\n <igx-icon>navigate_before</igx-icon>\r\n </button>\r\n <div #viewPort class=\"igx-tabs__header-content\">\r\n <div\r\n #itemsWrapper\r\n class=\"igx-tabs__header-wrapper\" \r\n role=\"tablist\"\r\n >\r\n <div \r\n #itemsContainer\r\n class=\"igx-tabs__header-scroll\"\r\n [ngClass]=\"resolveHeaderScrollClasses()\"\r\n >\r\n <ng-container *ngFor=\"let tab of items; let i = index\">\r\n <ng-container *ngTemplateOutlet=\"tab.headerTemplate\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <div\r\n #selectedIndicator\r\n *ngIf=\"items.length > 0\"\r\n class=\"igx-tabs__header-active-indicator\"\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n <button\r\n #rightButton\r\n igxButton=\"icon\"\r\n igxRipple\r\n class=\"igx-tabs__header-button\"\r\n (click)=\"scrollRight()\"\r\n >\r\n <igx-icon>navigate_next</igx-icon>\r\n </button>\r\n</div>\r\n<div class=\"igx-tabs__panels\">\r\n <ng-container *ngFor=\"let tab of items; let i = index\">\r\n <ng-container *ngTemplateOutlet=\"tab.panelTemplate\"></ng-container>\r\n </ng-container>\r\n</div>\r\n",
73239
+ template: "<div #headerContainer class=\"igx-tabs__header\">\n <button\n #leftButton\n igxButton=\"icon\"\n igxRipple\n class=\"igx-tabs__header-button\"\n (click)=\"scrollLeft()\"\n >\n <igx-icon>navigate_before</igx-icon>\n </button>\n <div #viewPort class=\"igx-tabs__header-content\">\n <div\n #itemsWrapper\n class=\"igx-tabs__header-wrapper\" \n role=\"tablist\"\n >\n <div \n #itemsContainer\n class=\"igx-tabs__header-scroll\"\n [ngClass]=\"resolveHeaderScrollClasses()\"\n >\n <ng-container *ngFor=\"let tab of items; let i = index\">\n <ng-container *ngTemplateOutlet=\"tab.headerTemplate\"></ng-container>\n </ng-container>\n </div>\n <div\n #selectedIndicator\n *ngIf=\"items.length > 0\"\n class=\"igx-tabs__header-active-indicator\"\n >\n </div>\n </div>\n </div>\n <button\n #rightButton\n igxButton=\"icon\"\n igxRipple\n class=\"igx-tabs__header-button\"\n (click)=\"scrollRight()\"\n >\n <igx-icon>navigate_next</igx-icon>\n </button>\n</div>\n<div class=\"igx-tabs__panels\">\n <ng-container *ngFor=\"let tab of items; let i = index\">\n <ng-container *ngTemplateOutlet=\"tab.panelTemplate\"></ng-container>\n </ng-container>\n</div>\n",
73083
73240
  providers: [{ provide: IgxTabsBase, useExisting: IgxTabsComponent }]
73084
73241
  },] }
73085
73242
  ];
@@ -73105,7 +73262,7 @@ class IgxTabItemComponent extends IgxTabItemDirective {
73105
73262
  IgxTabItemComponent.decorators = [
73106
73263
  { type: Component, args: [{
73107
73264
  selector: 'igx-tab-item',
73108
- template: "<ng-template #headerTemplate>\r\n <ng-content select=\"igx-tab-header\"></ng-content>\r\n</ng-template>\r\n<ng-template #panelTemplate>\r\n <ng-content select=\"igx-tab-content\"></ng-content>\r\n</ng-template>\r\n",
73265
+ template: "<ng-template #headerTemplate>\n <ng-content select=\"igx-tab-header\"></ng-content>\n</ng-template>\n<ng-template #panelTemplate>\n <ng-content select=\"igx-tab-content\"></ng-content>\n</ng-template>\n",
73109
73266
  providers: [{ provide: IgxTabItemDirective, useExisting: IgxTabItemComponent }]
73110
73267
  },] }
73111
73268
  ];
@@ -73206,7 +73363,7 @@ class IgxTabHeaderComponent extends IgxTabHeaderDirective {
73206
73363
  IgxTabHeaderComponent.decorators = [
73207
73364
  { type: Component, args: [{
73208
73365
  selector: 'igx-tab-header',
73209
- template: "<ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\r\n\r\n<div class=\"igx-tabs__header-item-inner\">\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\r\n",
73366
+ template: "<ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n\n<div class=\"igx-tabs__header-item-inner\">\n <ng-content></ng-content>\n</div>\n\n<ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n",
73210
73367
  providers: [{ provide: IgxTabHeaderBase, useExisting: IgxTabHeaderComponent }]
73211
73368
  },] }
73212
73369
  ];
@@ -73249,7 +73406,7 @@ class IgxTabContentComponent extends IgxTabContentDirective {
73249
73406
  IgxTabContentComponent.decorators = [
73250
73407
  { type: Component, args: [{
73251
73408
  selector: 'igx-tab-content',
73252
- template: "<ng-content *ngIf=\"tab.selected || tab.previous\"></ng-content>\r\n",
73409
+ template: "<ng-content *ngIf=\"tab.selected || tab.previous\"></ng-content>\n",
73253
73410
  providers: [{ provide: IgxTabContentBase, useExisting: IgxTabContentComponent }]
73254
73411
  },] }
73255
73412
  ];