Skip to content

Commit 0e502df

Browse files
authored
Merge branch '10.1.x' into hanastasov/fix-issue-8195-10.1.x
2 parents 354ed56 + 9d067cd commit 0e502df

File tree

7 files changed

+83
-16
lines changed

7 files changed

+83
-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/excel-style/grid.excel-style-filtering.component.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,15 @@ export class IgxGridExcelStyleFilteringComponent implements OnDestroy {
493493
}
494494

495495
private generateUniqueValues(columnValues: any[]) {
496-
this.uniqueValues = Array.from(new Set(columnValues));
496+
if (this.column.dataType === DataType.String && this.column.filteringIgnoreCase) {
497+
const filteredUniqueValues = columnValues.map(s => s?.toLowerCase())
498+
.reduce((map, val, i) => map.get(val) ? map : map.set(val, columnValues[i]),
499+
new Map);
500+
501+
this.uniqueValues = Array.from(filteredUniqueValues.values());
502+
} else {
503+
this.uniqueValues = Array.from(new Set(columnValues));
504+
}
497505
}
498506

499507
private generateFilterValues(isDateColumn: boolean = false) {

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

Lines changed: 4 additions & 3 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, filter, 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';
@@ -68,6 +68,7 @@ export class IgxFilteringService implements OnDestroy {
6868

6969
public toggleFilterDropdown(element, column, classRef) {
7070
if (!this._componentOverlayId || (this.column && this.column.field !== column.field)) {
71+
this.initFilteringSettings();
7172
this.column = column;
7273
const filterIcon = this.column.filteringExpressionsTree ? 'igx-excel-filter__icon--filtered' : 'igx-excel-filter__icon';
7374
const filterIconTarget = element.querySelector('.' + filterIcon);
@@ -100,7 +101,7 @@ export class IgxFilteringService implements OnDestroy {
100101
scrollStrategy: new AbsoluteScrollStrategy()
101102
};
102103
this._overlayService.onOpening.pipe(
103-
filter((overlay) => overlay.id === this._componentOverlayId),
104+
first((overlay) => overlay.id === this._componentOverlayId),
104105
takeUntil(this.destroy$)).subscribe((eventArgs) => {
105106
const instance = this.grid.excelStyleFilteringComponent ?
106107
this.grid.excelStyleFilteringComponent :
@@ -113,7 +114,7 @@ export class IgxFilteringService implements OnDestroy {
113114
});
114115

115116
this._overlayService.onClosed.pipe(
116-
filter(overlay => overlay.id === this._componentOverlayId),
117+
first(overlay => overlay.id === this._componentOverlayId),
117118
takeUntil(this.destroy$)).subscribe((eventArgs) => {
118119
const instance = this.grid.excelStyleFilteringComponent ?
119120
this.grid.excelStyleFilteringComponent :

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4344,6 +4344,39 @@ describe('IgxGrid - Filtering actions - Excel style filtering #grid', () => {
43444344
listItems = GridFunctions.getExcelStyleSearchComponentListItems(fix, searchComponent);
43454345
expect(listItems.length).toBe(0, 'incorrect rendered list items count');
43464346
}));
4347+
4348+
it('Should ignore duplicate records when column\'\s filteringIgnoreCase is true', fakeAsync(() => {
4349+
const column = grid.getColumnByName('AnotherField');
4350+
expect(column.filteringIgnoreCase).toBeTrue();
4351+
4352+
GridFunctions.clickExcelFilterIconFromCode(fix, grid, 'AnotherField');
4353+
tick(100);
4354+
fix.detectChanges();
4355+
4356+
const searchComponent = GridFunctions.getExcelStyleSearchComponent(fix);
4357+
const listItems = GridFunctions.getExcelStyleSearchComponentListItems(fix, searchComponent);
4358+
4359+
expect(listItems.length).toBe(3, 'incorrect rendered list items count');
4360+
expect(listItems[1].innerText).toBe('Custom', 'incorrect list item label');
4361+
}));
4362+
4363+
it('Should not ignore duplicate records when column\'\s filteringIgnoreCase is false', fakeAsync(() => {
4364+
const column = grid.getColumnByName('AnotherField');
4365+
column.filteringIgnoreCase = false;
4366+
expect(column.filteringIgnoreCase).toBeFalse();
4367+
4368+
GridFunctions.clickExcelFilterIconFromCode(fix, grid, 'AnotherField');
4369+
tick(100);
4370+
fix.detectChanges();
4371+
4372+
const searchComponent = GridFunctions.getExcelStyleSearchComponent(fix);
4373+
const listItems = GridFunctions.getExcelStyleSearchComponentListItems(fix, searchComponent);
4374+
4375+
expect(listItems.length).toBe(5, 'incorrect rendered list items count');
4376+
expect(listItems[1].innerText).toBe('Custom', 'incorrect list item label');
4377+
expect(listItems[3].innerText).toBe('custoM', 'incorrect list item label');
4378+
expect(listItems[4].innerText).toBe('custom', 'incorrect list item label');
4379+
}));
43474380
});
43484381

43494382
describe('Templates: ', () => {
@@ -4524,6 +4557,30 @@ describe('IgxGrid - Filtering actions - Excel style filtering #grid', () => {
45244557
loadingIndicator = GridFunctions.getExcelFilteringLoadingIndicator(fix);
45254558
expect(loadingIndicator).toBeNull('esf loading indicator is visible');
45264559
}));
4560+
4561+
it('Done callback should be executed only once per column', fakeAsync(() => {
4562+
const compInstance = fix.componentInstance as IgxGridFilteringESFLoadOnDemandComponent;
4563+
// Open excel style custom filtering dialog and wait a bit.
4564+
GridFunctions.clickExcelFilterIcon(fix, 'ProductName');
4565+
tick(1000);
4566+
fix.detectChanges();
4567+
4568+
// Verify items in search have loaded and that the loading indicator is not visible.
4569+
expect(compInstance.doneCallbackCounter).toBe(1, 'Incorrect done callback execution count');
4570+
let listItems = GridFunctions.getExcelStyleSearchComponentListItems(fix);
4571+
expect(listItems.length).toBe(6, 'incorrect rendered list items count');
4572+
let loadingIndicator = GridFunctions.getExcelFilteringLoadingIndicator(fix);
4573+
expect(loadingIndicator).toBeNull('esf loading indicator is visible');
4574+
4575+
GridFunctions.clickExcelFilterIcon(fix, 'Downloads');
4576+
tick(1000);
4577+
fix.detectChanges();
4578+
expect(compInstance.doneCallbackCounter).toBe(2, 'Incorrect done callback execution count');
4579+
listItems = GridFunctions.getExcelStyleSearchComponentListItems(fix);
4580+
expect(listItems.length).toBe(9, 'incorrect rendered list items count');
4581+
loadingIndicator = GridFunctions.getExcelFilteringLoadingIndicator(fix);
4582+
expect(loadingIndicator).toBeNull('esf loading indicator is visible');
4583+
}));
45274584
});
45284585

45294586
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: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -997,7 +997,7 @@ export class CustomFilter extends IgxFilteringOperand {
997997
<igx-column width="100px" [field]="'ReleaseDate'" [header]="'ReleaseDate'" headerClasses="header-release-date"
998998
[filterable]="filterable" [resizable]="resizable" dataType="date">
999999
</igx-column>
1000-
<igx-column width="100px" [field]="'AnotherField'" [header]="'Anogther Field'" [filterable]="filterable"
1000+
<igx-column width="100px" [field]="'AnotherField'" [header]="'Another Field'" [filterable]="filterable"
10011001
dataType="string" [filters]="customFilter">
10021002
</igx-column>
10031003
</igx-grid>`
@@ -1105,6 +1105,7 @@ export class CustomFilteringStrategyComponent extends BasicGridComponent {
11051105
export class IgxGridFilteringESFLoadOnDemandComponent extends BasicGridComponent {
11061106
private _filteringStrategy = new FilteringStrategy();
11071107
public data = SampleTestData.excelFilteringData();
1108+
public doneCallbackCounter = 0;
11081109

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

projects/igniteui-angular/src/lib/test-utils/sample-test-data.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,15 +1515,15 @@ export class SampleTestData {
15151515
ProductName: 'Some other item with Script',
15161516
ReleaseDate: SampleTestData.timeGenerator.timedelta(SampleTestData.today, 'day', 1),
15171517
Released: null,
1518-
AnotherField: 'a'
1518+
AnotherField: 'Custom'
15191519
},
15201520
{
15211521
Downloads: 0,
15221522
ID: 7,
15231523
ProductName: null,
15241524
ReleaseDate: SampleTestData.timeGenerator.timedelta(SampleTestData.today, 'month', 1),
15251525
Released: true,
1526-
AnotherField: 'a'
1526+
AnotherField: 'custoM'
15271527
},
15281528
{
15291529
Downloads: 1000,

0 commit comments

Comments
 (0)