Skip to content

Commit 4dd351e

Browse files
authored
Recreate filtering expression condition based on correct condition.Name value [master] (#16902)
* test(test): assert if correct condition is recreated based on conditionName * chore(chore): expose function to be used in tests * fix(grid): recreate condition based on condition.name
1 parent 9c27468 commit 4dd351e

2 files changed

Lines changed: 31 additions & 8 deletions

File tree

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { FilteringLogic, IFilteringExpression } from './filtering-expression.interface';
22
import { FilteringExpressionsTree, IFilteringExpressionsTree } from './filtering-expressions-tree';
3-
import { recreateTree, recreateTreeFromFields } from './expressions-tree-util';
3+
import { recreateExpression, recreateTree, recreateTreeFromFields } from './expressions-tree-util';
44
import { IgxBooleanFilteringOperand, IgxDateFilteringOperand, IgxDateTimeFilteringOperand, IgxNumberFilteringOperand, IgxStringFilteringOperand, IgxTimeFilteringOperand } from './filtering-condition';
55
import type { EntityType, FieldType } from './grid-types';
66

@@ -477,4 +477,30 @@ describe('Unit testing FilteringUtil', () => {
477477
expect(nestedCondition.condition.name).toBe('greaterThan');
478478
expect(nestedCondition.condition.logic(200, nestedCondition.searchVal)).toBe(true);
479479
});
480+
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+
480506
});

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

Lines changed: 4 additions & 7 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.conditionName || expression.condition?.name);
128+
return getFilteringCondition(dataType, expression.condition?.name || expression.conditionName);
129129
}
130130

131131
return expression.condition;
@@ -138,25 +138,22 @@ function recreateOperatorFromDataType(expression: IFilteringExpression, dataType
138138
* @param fields An array of fields to use for recreating the expression.
139139
* @returns The recreated expression.
140140
*/
141-
function recreateExpression(expression: IFilteringExpression, fields: FieldType[]): IFilteringExpression {
141+
export function recreateExpression(expression: IFilteringExpression, fields: FieldType[]): IFilteringExpression {
142142
const field = fields?.find(f => f.field === expression.fieldName);
143143

144144
if (field && !expression.condition?.logic) {
145145
if (!field.filters) {
146146
expression.condition = recreateOperatorFromDataType(expression, field.dataType);
147147
} else {
148-
expression.condition = field.filters.condition(expression.conditionName || expression.condition?.name);
148+
expression.condition = field.filters.condition(expression.condition?.name || expression.conditionName);
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-
if (!expression.conditionName) {
157-
expression.conditionName = expression.condition?.name;
158-
}
159-
156+
expression.conditionName = expression.condition?.name;
160157
expression.searchVal = recreateSearchValue(expression.searchVal, field?.dataType);
161158

162159
return expression;

0 commit comments

Comments
 (0)