Skip to content

Commit f37d53e

Browse files
authored
fix(grid): keep conditionName in sycn on conditon changed callback (#16922)
1 parent 0c27149 commit f37d53e

5 files changed

Lines changed: 45 additions & 28 deletions

File tree

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/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

0 commit comments

Comments
 (0)