Skip to content

Commit 0a8b9c0

Browse files
authored
Merge pull request #14946 from IgniteUI/mkirkova/fix-14906
Filter grid correctly with case insensitive duplicate records - 18.2.x
2 parents 9f3b703 + 5250517 commit 0a8b9c0

File tree

3 files changed

+120
-10
lines changed

3 files changed

+120
-10
lines changed

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

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -221,13 +221,13 @@ export class IgxGridExcelStyleFilteringComponent extends BaseFilteringComponent
221221

222222
/**
223223
* Gets the minimum height.
224-
*
225-
* Setting value in template:
224+
*
225+
* Setting value in template:
226226
* ```ts
227-
* [minHeight]="'<number><unit (px|rem|etc..)>'"
227+
* [minHeight]="'<number><unit (px|rem|etc..)>'"
228228
* ```
229-
*
230-
* Example for setting a value:
229+
*
230+
* Example for setting a value:
231231
* ```ts
232232
* [minHeight]="'700px'"
233233
* ```
@@ -258,13 +258,13 @@ export class IgxGridExcelStyleFilteringComponent extends BaseFilteringComponent
258258

259259
/**
260260
* Gets the maximum height.
261-
*
262-
* Setting value in template:
261+
*
262+
* Setting value in template:
263263
* ```ts
264-
* [maxHeight]="'<number><unit (px|rem|etc..)>'"
264+
* [maxHeight]="'<number><unit (px|rem|etc..)>'"
265265
* ```
266-
*
267-
* Example for setting a value:
266+
*
267+
* Example for setting a value:
268268
* ```ts
269269
* [maxHeight]="'700px'"
270270
* ```
@@ -509,6 +509,11 @@ export class IgxGridExcelStyleFilteringComponent extends BaseFilteringComponent
509509
private renderValues() {
510510
this.filterValues = this.generateFilterValues();
511511
this.generateListData();
512+
this.expressionsList.forEach(expr => {
513+
if (this.column.dataType === GridColumnDataType.String && this.column.filteringIgnoreCase && expr.expression.searchVal) {
514+
this.modifyExpression(expr);
515+
}
516+
});
512517
}
513518

514519
private generateFilterValues() {
@@ -539,6 +544,16 @@ export class IgxGridExcelStyleFilteringComponent extends BaseFilteringComponent
539544
return filterValues;
540545
}
541546

547+
private modifyExpression(expr: ExpressionUI) {
548+
const lowerCaseFilterValues = new Set(Array.from(expr.expression.searchVal).map((value: string) => value.toLowerCase()));
549+
550+
this.grid.data.forEach(item => {
551+
if (lowerCaseFilterValues.has(item[this.column.field]?.toLowerCase())) {
552+
expr.expression.searchVal.add(item[this.column.field]);
553+
}
554+
});
555+
}
556+
542557
private generateListData() {
543558
this.listData = new Array<FilterListItem>();
544559
const shouldUpdateSelection = this.areExpressionsSelectable();

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5829,6 +5829,32 @@ describe('IgxGrid - Filtering actions - Excel style filtering #grid', () => {
58295829
expect(gridCellValues).toEqual(listItems);
58305830
}));
58315831

5832+
it('Should filter grid correctly with case insensitive duplicates', fakeAsync(() => {
5833+
grid.data = SampleTestData.excelFilteringDataDuplicateValues();
5834+
fix.detectChanges();
5835+
// Open excel style custom filtering dialog.
5836+
GridFunctions.clickExcelFilterIconFromCode(fix, grid, 'AnotherField');
5837+
5838+
// Type string in search box.
5839+
const searchComponent = GridFunctions.getExcelStyleSearchComponent(fix);
5840+
const inputNativeElement = GridFunctions.getExcelStyleSearchComponentInput(fix, searchComponent);
5841+
UIInteractions.clickAndSendInputElementValue(inputNativeElement, 'cust', fix);
5842+
tick(100);
5843+
fix.detectChanges();
5844+
5845+
// Click 'apply' button to apply filter.
5846+
GridFunctions.clickApplyExcelStyleFiltering(fix);
5847+
tick(100);
5848+
fix.detectChanges();
5849+
5850+
// Get the results and verify their count.
5851+
const gridCellValues = GridFunctions.getColumnCells(fix, 'AnotherField')
5852+
.map(c => c.nativeElement.innerText)
5853+
.sort();
5854+
5855+
expect(gridCellValues.length).toEqual(5);
5856+
}));
5857+
58325858
it('Should disable the apply button when there are no results.', fakeAsync(() => {
58335859
GridFunctions.clickExcelFilterIconFromCode(fix, grid, 'Downloads');
58345860

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

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1988,6 +1988,75 @@ export class SampleTestData {
19881988
}
19891989
]);
19901990

1991+
public static excelFilteringDataDuplicateValues = () => ([
1992+
{
1993+
Downloads: 254,
1994+
ID: 1,
1995+
ProductName: 'Ignite UI for JavaScript',
1996+
ReleaseDate: SampleTestData.timeGenerator.timedelta(SampleTestData.today, 'day', 1),
1997+
ReleaseDateTime: SampleTestData.timeGenerator.timedelta(SampleTestData.todayFullDate, 'hour', 1),
1998+
ReleaseTime: SampleTestData.timeGenerator.timedelta(SampleTestData.todayFullDate, 'hour', 1),
1999+
Released: false,
2000+
AnotherField: 'a',
2001+
Revenue: 100000
2002+
},
2003+
{
2004+
Downloads: 702,
2005+
ID: 2,
2006+
ProductName: 'Some other item with Script',
2007+
ReleaseDate: SampleTestData.timeGenerator.timedelta(SampleTestData.today, 'day', 1),
2008+
ReleaseDateTime: SampleTestData.timeGenerator.timedelta(SampleTestData.todayFullDate, 'second', 20),
2009+
ReleaseTime: SampleTestData.timeGenerator.timedelta(SampleTestData.todayFullDate, 'second', 20),
2010+
Released: null,
2011+
AnotherField: 'Custom',
2012+
Revenue: 60000
2013+
},
2014+
{
2015+
Downloads: 0,
2016+
ID: 3,
2017+
ProductName: null,
2018+
ReleaseDate: SampleTestData.timeGenerator.timedelta(SampleTestData.today, 'month', 1),
2019+
ReleaseDateTime: SampleTestData.timeGenerator.timedelta(SampleTestData.todayFullDate, 'minute', +10),
2020+
ReleaseTime: SampleTestData.timeGenerator.timedelta(SampleTestData.todayFullDate, 'minute', +10),
2021+
Released: true,
2022+
AnotherField: 'custoM',
2023+
Revenue: 10000
2024+
},
2025+
{
2026+
Downloads: 1000,
2027+
ID: 4,
2028+
ProductName: null,
2029+
ReleaseDate: SampleTestData.today,
2030+
ReleaseDateTime: SampleTestData.todayFullDate,
2031+
ReleaseTime: SampleTestData.todayFullDate,
2032+
Released: undefined,
2033+
AnotherField: 'custom',
2034+
Revenue: 50000
2035+
},
2036+
{
2037+
Downloads: 1000,
2038+
ID: 5,
2039+
ProductName: null,
2040+
ReleaseDate: SampleTestData.today,
2041+
ReleaseDateTime: SampleTestData.todayFullDate,
2042+
ReleaseTime: SampleTestData.todayFullDate,
2043+
Released: undefined,
2044+
AnotherField: 'custom_1',
2045+
Revenue: 50000
2046+
},
2047+
{
2048+
Downloads: 1000,
2049+
ID: 6,
2050+
ProductName: null,
2051+
ReleaseDate: SampleTestData.today,
2052+
ReleaseDateTime: SampleTestData.todayFullDate,
2053+
ReleaseTime: SampleTestData.todayFullDate,
2054+
Released: undefined,
2055+
AnotherField: 'custom_A',
2056+
Revenue: 50000
2057+
}
2058+
]);
2059+
19912060
/* Data fields: Price: number, Brand: string, Model: string, Edition: string */
19922061
public static exportGroupedDataColumns = () => ([
19932062
{ Price: 75000, Brand: 'Tesla', Model: 'Model S', Edition: 'Sport' },

0 commit comments

Comments
 (0)