Skip to content

Commit 5fecb83

Browse files
Merge branch 'master' into ganastasov/fix-16897-master
2 parents bf2d942 + be7c9fa commit 5fecb83

11 files changed

Lines changed: 100 additions & 39 deletions

File tree

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
"express": "^5.2.1",
7878
"fflate": "^0.8.1",
7979
"igniteui-i18n-core": "^1.0.2",
80-
"igniteui-theming": "^25.0.0-beta.5",
80+
"igniteui-theming": "^25.0.0",
8181
"igniteui-trial-watermark": "^3.1.0",
8282
"jspdf": "^4.0.0",
8383
"lodash-es": "^4.17.21",

projects/igniteui-angular/core/src/data-operations/expressions-tree-util.spec.ts

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -478,29 +478,4 @@ describe('Unit testing FilteringUtil', () => {
478478
expect(nestedCondition.condition.logic(200, nestedCondition.searchVal)).toBe(true);
479479
});
480480

481-
it('should recreate string expression with correct conditionName', () => {
482-
const fields: FieldType[] = [
483-
{ field: 'Name', dataType: 'string' }
484-
];
485-
486-
// such expression will exist if user has changed the condition OR restore grid state through the IgxGridState directive
487-
const expression: IFilteringExpression = {
488-
fieldName: 'Name',
489-
conditionName: 'contains',
490-
searchVal: 'test',
491-
condition: {
492-
name: 'startsWith',
493-
iconName: 'starts_with',
494-
isUnary: false,
495-
}
496-
};
497-
498-
const result = recreateExpression(expression, fields);
499-
500-
expect(result.condition).toBe(IgxStringFilteringOperand.instance().condition('startsWith'));
501-
expect(result.condition.logic).toBeDefined();
502-
expect(result.conditionName).toBe('startsWith');
503-
expect(result.searchVal).toBe('test');
504-
});
505-
506481
});

projects/igniteui-angular/core/src/data-operations/expressions-tree-util.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ function getFilteringCondition(dataType: string, name: string): IFilteringOperat
125125
*/
126126
function recreateOperatorFromDataType(expression: IFilteringExpression, dataType: string): IFilteringOperation {
127127
if (!expression.condition?.logic) {
128-
return getFilteringCondition(dataType, expression.condition?.name || expression.conditionName);
128+
return getFilteringCondition(dataType, expression.conditionName || expression.condition?.name);
129129
}
130130

131131
return expression.condition;
@@ -145,15 +145,18 @@ export function recreateExpression(expression: IFilteringExpression, fields: Fie
145145
if (!field.filters) {
146146
expression.condition = recreateOperatorFromDataType(expression, field.dataType);
147147
} else {
148-
expression.condition = field.filters.condition(expression.condition?.name || expression.conditionName);
148+
expression.condition = field.filters.condition(expression.conditionName || expression.condition?.name);
149149
}
150150
}
151151

152152
if (!expression.condition && expression.conditionName) {
153153
throw Error('Wrong `conditionName`, `condition` or `field` provided! It is possible that there is a type mismatch between the condition type and field type.');
154154
}
155155

156-
expression.conditionName = expression.condition?.name;
156+
if (!expression.conditionName) {
157+
expression.conditionName = expression.condition?.name;
158+
}
159+
157160
expression.searchVal = recreateSearchValue(expression.searchVal, field?.dataType);
158161

159162
return expression;

projects/igniteui-angular/grids/core/src/filtering/base/grid-filtering-row.component.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,7 @@ export class IgxGridFilteringRowComponent implements OnInit, AfterViewInit, OnDe
611611
public onConditionsChanged(eventArgs) {
612612
const value = (eventArgs.newSelection as IgxDropDownItemComponent).value;
613613
this.expression.condition = this.getCondition(value);
614+
this.expression.conditionName = value;
614615
if (this.expression.condition.isUnary) {
615616
// update grid's filtering on the next cycle to ensure the drop-down is closed
616617
// if the drop-down is not closed this event handler will be invoked multiple times

projects/igniteui-angular/grids/core/src/filtering/excel-style/excel-style-default-expression.component.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ export class IgxExcelStyleDefaultExpressionComponent implements AfterViewInit {
133133
public onConditionsChanged(eventArgs: any) {
134134
const value = (eventArgs.newSelection as IgxSelectComponent).value;
135135
this.expressionUI.expression.condition = this.getCondition(value);
136+
this.expressionUI.expression.conditionName = value;
136137

137138
this.focus();
138139
}

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { IgxDataLoadingTemplateDirective, IgxEmptyListTemplateDirective, IgxList
1212
import { IgxButtonDirective, IgxForOfDirective } from 'igniteui-angular/directives';
1313
import { IgxTreeComponent, IgxTreeNodeComponent, ITreeNodeSelectionEvent } from 'igniteui-angular/tree';
1414
import { IgxCircularProgressBarComponent } from 'igniteui-angular/progressbar';
15-
import { cloneHierarchicalArray, FilteringExpressionsTree, FilteringLogic, GridColumnDataType, IgxBooleanFilteringOperand, IgxDateFilteringOperand, IgxDateTimeFilteringOperand, IgxNumberFilteringOperand, IgxStringFilteringOperand, IgxTimeFilteringOperand, PlatformUtil, ɵSize } from 'igniteui-angular/core';
15+
import { cloneHierarchicalArray, columnFieldPath, FilteringExpressionsTree, FilteringLogic, GridColumnDataType, IgxBooleanFilteringOperand, IgxDateFilteringOperand, IgxDateTimeFilteringOperand, IgxNumberFilteringOperand, IgxStringFilteringOperand, IgxTimeFilteringOperand, PlatformUtil, resolveNestedPath, ɵSize } from 'igniteui-angular/core';
1616
import { Navigate } from 'igniteui-angular/drop-down';
1717

1818
@Directive({
@@ -601,13 +601,15 @@ export class IgxExcelStyleSearchComponent implements AfterViewInit, OnDestroy {
601601
searchVal = new Set(selectedItems.map(e => e.value.toLocaleTimeString()));
602602
break;
603603
case GridColumnDataType.String:
604-
if (this.esf.column.filteringIgnoreCase) {
604+
if (this.esf.column.filteringIgnoreCase && !this.isHierarchical()) {
605605
const selectedValues = new Set(selectedItems.map(item => item.value.toLowerCase()));
606606
searchVal = new Set();
607607

608608
this.esf.grid.data.forEach(item => {
609-
if (typeof item[this.esf.column.field] === "string" && selectedValues.has(item[this.esf.column.field]?.toLowerCase())) {
610-
searchVal.add(item[this.esf.column.field]);
609+
const fieldPaths = columnFieldPath(this.esf.column.field)
610+
const itemValue = resolveNestedPath(item, fieldPaths);
611+
if (typeof itemValue === "string" && selectedValues.has(itemValue.toLowerCase())) {
612+
searchVal.add(itemValue);
611613
}
612614
});
613615
break;

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ describe('IgxGrid - Filtering Row UI actions #grid', () => {
132132
tick();
133133
fix.detectChanges();
134134

135+
136+
let operands =
137+
(grid.filteringExpressionsTree.filteringOperands[0] as IFilteringExpressionsTree)
138+
.filteringOperands as IFilteringExpression[];
139+
verifyFilteringExpression(operands[0], 'ProductName', 'startsWith', 'Net');
135140
verifyFilterUIPosition(filterUIRow, grid);
136141
verifyFilterRowUI(input, close, reset, false);
137142
expect(grid.rowList.length).toEqual(1);
@@ -143,6 +148,10 @@ describe('IgxGrid - Filtering Row UI actions #grid', () => {
143148
tick();
144149
fix.detectChanges();
145150

151+
operands =
152+
(grid.filteringExpressionsTree.filteringOperands[0] as IFilteringExpressionsTree)
153+
.filteringOperands as IFilteringExpression[];
154+
verifyFilteringExpression(operands[0], 'ProductName', 'endsWith', 'script');
146155
expect(grid.rowList.length).toEqual(2);
147156
verifyFilterRowUI(input, close, reset, false);
148157

@@ -3824,6 +3833,33 @@ describe('IgxGrid - Filtering actions - Excel style filtering #grid', () => {
38243833
expect(filterIcon).toBeDefined();
38253834
}));
38263835

3836+
it('Should keep conditionName in sync when changing condition in ESF custom dialog.', fakeAsync(() => {
3837+
GridFunctions.clickExcelFilterIconFromCode(fix, grid, 'ProductName');
3838+
3839+
GridFunctions.clickExcelFilterCascadeButton(fix);
3840+
tick();
3841+
fix.detectChanges();
3842+
3843+
// Open custom dialog with 'contains' condition (index 0 in cascade menu for string column)
3844+
GridFunctions.clickOperatorFromCascadeMenu(fix, 0);
3845+
tick(100);
3846+
3847+
// set first expression's value
3848+
GridFunctions.setInputValueESF(fix, 0, 'Net');
3849+
tick(100);
3850+
3851+
// change first expression's operator from 'contains' to 'startsWith' (index 2 for string column)
3852+
GridFunctions.setOperatorESF(fix, 0, 2);
3853+
tick(100);
3854+
3855+
GridFunctions.clickApplyExcelStyleCustomFiltering(fix);
3856+
3857+
const operands =
3858+
(grid.filteringExpressionsTree.filteringOperands[0] as IFilteringExpressionsTree)
3859+
.filteringOperands as IFilteringExpression[];
3860+
verifyFilteringExpression(operands[0], 'ProductName', 'startsWith', 'Net');
3861+
}));
3862+
38273863
it('Should filter grid via custom dialog.', fakeAsync(() => {
38283864
GridFunctions.clickExcelFilterIconFromCode(fix, grid, 'Downloads');
38293865

@@ -7538,6 +7574,7 @@ const verifyGridSubmenuSize = (gridNativeElement: HTMLElement, expectedSize: ɵS
75387574
const verifyFilteringExpression = (operand: IFilteringExpression, fieldName: string, conditionName: string, searchVal: any) => {
75397575
expect(operand.fieldName).toBe(fieldName);
75407576
expect(operand.condition.name).toBe(conditionName);
7577+
expect(operand.conditionName).toBe(conditionName);
75417578
expect(operand.searchVal).toEqual(searchVal);
75427579
};
75437580

projects/igniteui-angular/grids/grid/src/grid.nested.props.spec.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { TestBed, ComponentFixture, fakeAsync, waitForAsync } from '@angular/core/testing';
1+
import { TestBed, ComponentFixture, fakeAsync, waitForAsync, tick } from '@angular/core/testing';
22
import { IgxGridComponent } from './grid.component';
33
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
44
import { Component, DebugElement, ViewChild } from '@angular/core';
@@ -318,6 +318,29 @@ describe('Grid - nested data source properties #grid', () => {
318318

319319
expect(first(copiedData).user.name.first).toMatch('Updated!');
320320
});
321+
322+
it('should correctly filter with ESF', fakeAsync(() => {
323+
setupData(DATA);
324+
grid.getColumnByName('user').field = 'user.name.first';
325+
fixture.detectChanges();
326+
grid.allowFiltering = true;
327+
grid.filterMode="excelStyleFilter";
328+
fixture.detectChanges();
329+
330+
GridFunctions.clickExcelFilterIcon(fixture, 'user.name.first');
331+
fixture.detectChanges();
332+
tick();
333+
const excelMenu = GridFunctions.getExcelStyleFilteringComponent(fixture, 'igx-grid');
334+
const checkboxes: any[] = Array.from(GridFunctions.getExcelStyleFilteringCheckboxes(fixture, excelMenu, 'igx-grid'));
335+
checkboxes[1].click();
336+
fixture.detectChanges();
337+
tick();
338+
339+
GridFunctions.clickApplyExcelStyleFiltering(fixture, null, 'igx-grid');
340+
fixture.detectChanges();
341+
tick();
342+
expect(grid.filteredSortedData.length).toBeGreaterThan(0);
343+
}));
321344
});
322345
});
323346

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,25 @@ describe('IgxTreeGrid - Filtering actions #tGrid', () => {
770770

771771
expect(console.error).not.toHaveBeenCalled();
772772
}));
773+
774+
it('Should filter hierarchical data when an item is unselected.', fakeAsync(() => {
775+
tGrid.filterStrategy = new TreeGridFilteringStrategy(['ID', "Name"]);
776+
GridFunctions.clickExcelFilterIcon(fix, 'Name');
777+
fix.detectChanges();
778+
tick();
779+
780+
const excelMenu = GridFunctions.getExcelStyleFilteringComponent(fix, 'igx-tree-grid');
781+
const checkboxes: any[] = Array.from(GridFunctions.getExcelStyleFilteringCheckboxes(fix, excelMenu, 'igx-tree-grid'));
782+
checkboxes[1].click();
783+
fix.detectChanges();
784+
tick();
785+
786+
GridFunctions.clickApplyExcelStyleFiltering(fix, null, 'igx-tree-grid');
787+
fix.detectChanges();
788+
tick();
789+
790+
expect(tGrid.filteredSortedData.length).toBeGreaterThan(0);
791+
}));
773792
});
774793

775794
describe('Tree grid ESF templates', () => {

0 commit comments

Comments
 (0)