Skip to content

Commit 4632520

Browse files
Merge pull request #8283 from IgniteUI/astaev/issue8138-master
fix(grid): Exec onOpening only once for esf #8138
2 parents 555db7d + a9ca99a commit 4632520

File tree

5 files changed

+43
-16
lines changed

5 files changed

+43
-16
lines changed

projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,14 @@ export class IgxExcelStyleConditionalFilterComponent implements OnDestroy {
5353
constructor(public esf: IgxGridExcelStyleFilteringComponent) {
5454
this.esf.columnChange.pipe(takeUntil(this.destroy$)).subscribe(() => {
5555
if (this.esf.grid) {
56-
this._subMenuOverlaySettings.outlet = (this.esf.grid as any).outlet;
56+
this._subMenuOverlaySettings.outlet = this.esf.grid.outlet;
5757
}
5858
});
59-
}
59+
60+
if (this.esf.grid) {
61+
this._subMenuOverlaySettings.outlet = this.esf.grid.outlet;
62+
}
63+
}
6064

6165
ngOnDestroy(): void {
6266
this.destroy$.next(true);
@@ -147,7 +151,7 @@ export class IgxExcelStyleConditionalFilterComponent implements OnDestroy {
147151
const exprTree = this.esf.column.filteringExpressionsTree;
148152
return exprTree && exprTree.filteringOperands && exprTree.filteringOperands.length &&
149153
!((exprTree.filteringOperands[0] as IFilteringExpression).condition &&
150-
(exprTree.filteringOperands[0] as IFilteringExpression).condition.name === 'in');
154+
(exprTree.filteringOperands[0] as IFilteringExpression).condition.name === 'in');
151155
}
152156

153157
/**

projects/igniteui-angular/src/lib/grids/filtering/grid-filtering.service.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { FilteringExpressionsTree, IFilteringExpressionsTree } from '../../data-
33
import { IgxGridBaseDirective } from '../grid-base.directive';
44
import { IFilteringExpression, FilteringLogic } from '../../data-operations/filtering-expression.interface';
55
import { Subject } from 'rxjs';
6-
import { takeUntil, filter } from 'rxjs/operators';
6+
import { takeUntil, first } from 'rxjs/operators';
77
import { IForOfState } from '../../directives/for-of/for_of.directive';
88
import { IgxColumnComponent } from '../columns/column.component';
99
import { IFilteringOperation } from '../../data-operations/filtering-condition';
@@ -65,7 +65,8 @@ export class IgxFilteringService implements OnDestroy {
6565
}
6666

6767
public toggleFilterDropdown(element, column, classRef) {
68-
if (!this._componentOverlayId || (this.column && this.column.field !== column.field)) {
68+
if (!this._componentOverlayId || (this.column && this.column.field !== column.field)) {
69+
this.initFilteringSettings();
6970
this.column = column;
7071
const filterIcon = this.column.filteringExpressionsTree ? 'igx-excel-filter__icon--filtered' : 'igx-excel-filter__icon';
7172
const filterIconTarget = element.querySelector('.' + filterIcon);
@@ -97,8 +98,9 @@ export class IgxFilteringService implements OnDestroy {
9798
positionStrategy: new ExcelStylePositionStrategy(this._filterMenuPositionSettings),
9899
scrollStrategy: new AbsoluteScrollStrategy()
99100
};
101+
100102
this._overlayService.onOpening.pipe(
101-
filter((overlay) => overlay.id === this._componentOverlayId),
103+
first((overlay) => overlay.id === this._componentOverlayId),
102104
takeUntil(this.destroy$)).subscribe((eventArgs) => {
103105
const instance = this.grid.excelStyleFilteringComponent ?
104106
this.grid.excelStyleFilteringComponent :
@@ -111,7 +113,7 @@ export class IgxFilteringService implements OnDestroy {
111113
});
112114

113115
this._overlayService.onClosed.pipe(
114-
filter(overlay => overlay.id === this._componentOverlayId),
116+
first((overlay) => overlay.id === this._componentOverlayId),
115117
takeUntil(this.destroy$)).subscribe((eventArgs) => {
116118
const instance = this.grid.excelStyleFilteringComponent ?
117119
this.grid.excelStyleFilteringComponent :
@@ -354,7 +356,7 @@ export class IgxFilteringService implements OnDestroy {
354356
}
355357

356358
if ((currExpressionUI.beforeOperator === undefined || currExpressionUI.beforeOperator === null ||
357-
currExpressionUI.beforeOperator === FilteringLogic.Or) &&
359+
currExpressionUI.beforeOperator === FilteringLogic.Or) &&
358360
currExpressionUI.afterOperator === FilteringLogic.And) {
359361

360362
currAndBranch = new FilteringExpressionsTree(FilteringLogic.And, columnId);
@@ -481,8 +483,8 @@ export class IgxFilteringService implements OnDestroy {
481483
}
482484

483485
private generateExpressionsListRecursive(expressions: IFilteringExpressionsTree | IFilteringExpression,
484-
operator: FilteringLogic,
485-
expressionsUIs: ExpressionUI[]): void {
486+
operator: FilteringLogic,
487+
expressionsUIs: ExpressionUI[]): void {
486488
if (!expressions) {
487489
return;
488490
}

projects/igniteui-angular/src/lib/grids/grid/grid-filtering-ui.spec.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4761,6 +4761,30 @@ describe('IgxGrid - Filtering actions - Excel style filtering #grid', () => {
47614761
loadingIndicator = GridFunctions.getExcelFilteringLoadingIndicator(fix);
47624762
expect(loadingIndicator).toBeNull('esf loading indicator is visible');
47634763
}));
4764+
4765+
it('Done callback should be executed only once per column', fakeAsync(() => {
4766+
const compInstance = fix.componentInstance as IgxGridFilteringESFLoadOnDemandComponent;
4767+
// Open excel style custom filtering dialog and wait a bit.
4768+
GridFunctions.clickExcelFilterIcon(fix, 'ProductName');
4769+
tick(1000);
4770+
fix.detectChanges();
4771+
4772+
// Verify items in search have loaded and that the loading indicator is not visible.
4773+
expect(compInstance.doneCallbackCounter).toBe(1, 'Incorrect done callback execution count');
4774+
let listItems = GridFunctions.getExcelStyleSearchComponentListItems(fix);
4775+
expect(listItems.length).toBe(6, 'incorrect rendered list items count');
4776+
let loadingIndicator = GridFunctions.getExcelFilteringLoadingIndicator(fix);
4777+
expect(loadingIndicator).toBeNull('esf loading indicator is visible');
4778+
4779+
GridFunctions.clickExcelFilterIcon(fix, 'Downloads');
4780+
tick(1000);
4781+
fix.detectChanges();
4782+
expect(compInstance.doneCallbackCounter).toBe(2, 'Incorrect done callback execution count');
4783+
listItems = GridFunctions.getExcelStyleSearchComponentListItems(fix);
4784+
expect(listItems.length).toBe(9, 'incorrect rendered list items count');
4785+
loadingIndicator = GridFunctions.getExcelFilteringLoadingIndicator(fix);
4786+
expect(loadingIndicator).toBeNull('esf loading indicator is visible');
4787+
}));
47644788
});
47654789

47664790
describe(null, () => {

projects/igniteui-angular/src/lib/grids/headers/grid-header.component.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {
88
HostListener,
99
Input,
1010
NgZone,
11-
OnInit,
1211
OnDestroy
1312
} from '@angular/core';
1413
import { DataType } from '../../data-operations/data-util';
@@ -31,7 +30,7 @@ import { IgxGridExcelStyleFilteringComponent } from '../filtering/excel-style/gr
3130
selector: 'igx-grid-header',
3231
templateUrl: './grid-header.component.html'
3332
})
34-
export class IgxGridHeaderComponent implements DoCheck, OnInit, OnDestroy {
33+
export class IgxGridHeaderComponent implements DoCheck, OnDestroy {
3534

3635
private _destroy$ = new Subject<boolean>();
3736

@@ -143,10 +142,6 @@ export class IgxGridHeaderComponent implements DoCheck, OnInit, OnDestroy {
143142
public zone: NgZone
144143
) { }
145144

146-
public ngOnInit() {
147-
this.grid.filteringService.initFilteringSettings();
148-
}
149-
150145
public ngDoCheck() {
151146
this.getSortDirection();
152147
this.cdr.markForCheck();

projects/igniteui-angular/src/lib/test-utils/grid-samples.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,6 +1106,7 @@ export class CustomFilteringStrategyComponent extends BasicGridComponent {
11061106
export class IgxGridFilteringESFLoadOnDemandComponent extends BasicGridComponent {
11071107
private _filteringStrategy = new FilteringStrategy();
11081108
public data = SampleTestData.excelFilteringData();
1109+
public doneCallbackCounter = 0;
11091110

11101111
public columnValuesStrategy = (column: IgxColumnComponent,
11111112
columnExprTree: IFilteringExpressionsTree,
@@ -1114,6 +1115,7 @@ export class IgxGridFilteringESFLoadOnDemandComponent extends BasicGridComponent
11141115
const filteredData = this._filteringStrategy.filter(this.data, columnExprTree);
11151116
const columnValues = filteredData.map(record => record[column.field]);
11161117
done(columnValues);
1118+
this.doneCallbackCounter++;
11171119
}, 1000);
11181120
}
11191121
}

0 commit comments

Comments
 (0)