From 93f3964ce4f4c465b38066ff8d64298c35153a09 Mon Sep 17 00:00:00 2001 From: teodosiah Date: Wed, 26 Mar 2025 13:55:29 +0200 Subject: [PATCH 1/5] fix(query-builder): add test for mutated fields collection --- .../lib/query-builder/query-builder.component.spec.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts b/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts index 3590621ab81..e8a8faa37ad 100644 --- a/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts +++ b/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts @@ -119,6 +119,16 @@ describe('IgxQueryBuilder', () => { expect(mainEntityContainer.children[1].children[1].tagName).toBe('IGX-COMBO'); expect(nestedEntityContainer.children[1].children[1].tagName).toBe('IGX-SELECT'); })); + + it('Should return proper fields collection without additional props.', fakeAsync(() => { + queryBuilder.expressionTree = QueryBuilderFunctions.generateExpressionTree(); + fix.detectChanges(); + + queryBuilder.entities[0].fields.forEach(field => { + expect(field.filters).toBeUndefined(); + expect(field.pipeArgs).toBeUndefined(); + }); + })); }); describe('Interactions', () => { From fdac91a9ef80a49a2d7276b7deb0413a0ac13b70 Mon Sep 17 00:00:00 2001 From: teodosiah Date: Wed, 26 Mar 2025 14:37:41 +0200 Subject: [PATCH 2/5] fix(query-builder): prevent changing fields collection --- .../query-builder-tree.component.ts | 44 ++++++++----------- .../query-builder.component.spec.ts | 11 +---- 2 files changed, 20 insertions(+), 35 deletions(-) diff --git a/projects/igniteui-angular/src/lib/query-builder/query-builder-tree.component.ts b/projects/igniteui-angular/src/lib/query-builder/query-builder-tree.component.ts index 9db62b22161..7ed471fbed7 100644 --- a/projects/igniteui-angular/src/lib/query-builder/query-builder-tree.component.ts +++ b/projects/igniteui-angular/src/lib/query-builder/query-builder-tree.component.ts @@ -176,13 +176,8 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy { if (!this._fields && this.isAdvancedFiltering()) { this._fields = this.entities[0].fields; } - - if (this._fields) { - this._fields.forEach(field => { - this.setFilters(field); - this.setFormat(field); - }); - } + + this._fields = this._fields.map(f => ({...f, filters: this.getFilters(f), pipeArgs: this.getPipeArgs(f) })); } /** @@ -1180,7 +1175,7 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy { if (!this.selectedField) { this.fieldSelect.input.nativeElement.focus(); } else if (this.selectedField.filters.condition(this.selectedCondition)?.isUnary) { - this.conditionSelect.input.nativeElement.focus(); + this.conditionSelect?.input.nativeElement.focus(); } else { const input = this.searchValueInput?.nativeElement || this.picker?.getEditElement(); input?.focus(); @@ -1483,16 +1478,19 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy { return ctx; } - private setFormat(field: FieldType) { - if (!field.pipeArgs) { - field.pipeArgs = { digitsInfo: DEFAULT_PIPE_DIGITS_INFO }; + private getPipeArgs(field: FieldType) { + let pipeArgs = {...field.pipeArgs}; + if (!pipeArgs) { + pipeArgs = { digitsInfo: DEFAULT_PIPE_DIGITS_INFO }; } - if (!field.pipeArgs.format) { - field.pipeArgs.format = field.dataType === DataType.Time ? + if (!pipeArgs.format) { + pipeArgs.format = field.dataType === DataType.Time ? DEFAULT_PIPE_TIME_FORMAT : field.dataType === DataType.DateTime ? DEFAULT_PIPE_DATE_TIME_FORMAT : DEFAULT_PIPE_DATE_FORMAT; } + + return pipeArgs; } private selectDefaultCondition() { @@ -1501,30 +1499,24 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy { } } - private setFilters(field: FieldType) { + private getFilters(field: FieldType) { if (!field.filters) { switch (field.dataType) { case DataType.Boolean: - field.filters = IgxBooleanFilteringOperand.instance(); - break; + return IgxBooleanFilteringOperand.instance(); case DataType.Number: case DataType.Currency: case DataType.Percent: - field.filters = IgxNumberFilteringOperand.instance(); - break; + return IgxNumberFilteringOperand.instance(); case DataType.Date: - field.filters = IgxDateFilteringOperand.instance(); - break; + return IgxDateFilteringOperand.instance(); case DataType.Time: - field.filters = IgxTimeFilteringOperand.instance(); - break; + return IgxTimeFilteringOperand.instance(); case DataType.DateTime: - field.filters = IgxDateTimeFilteringOperand.instance(); - break; + return IgxDateTimeFilteringOperand.instance(); case DataType.String: default: - field.filters = IgxStringFilteringOperand.instance(); - break; + return IgxStringFilteringOperand.instance(); } } } diff --git a/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts b/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts index 6dee17398c4..52ffc62619b 100644 --- a/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts +++ b/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts @@ -3269,8 +3269,7 @@ export class IgxQueryBuilderSampleTestComponent implements OnInit {

{{selectedField.field}}

{{selectedCondition}}

} @else if (selectedField?.field === 'OrderId' && selectedCondition === 'equals') { - + } @else { @@ -3299,6 +3298,7 @@ export class IgxQueryBuilderCustomTemplateSampleTestComponent implements OnInit public ngOnInit(): void { this.entities = SampleEntities.map(a => ({ ...a })); + this.entities[1].fields[0].formatter = (value: any, rowData: any) => rowData === 'equals' ? (Array.from(value)[0] as any).id : value; const tree = new FilteringExpressionsTree(FilteringLogic.And, null, 'Orders', ['*']); tree.filteringOperands.push({ @@ -3316,11 +3316,4 @@ export class IgxQueryBuilderCustomTemplateSampleTestComponent implements OnInit { id: 1, field: 'B' } ]; } - - public handleChange(ev, selectedField, searchVal) { - if (selectedField.field === 'OrderId') { - searchVal.value = ev.newValue[0]; - selectedField.formatter = (value: any, rowData: any) => rowData === 'equals' ? (Array.from(value)[0] as any).id : value; - } - } } From af540d091fe8c1a92c433fd336e9f97d2876c962 Mon Sep 17 00:00:00 2001 From: teodosiah Date: Wed, 26 Mar 2025 14:55:55 +0200 Subject: [PATCH 3/5] fix(query-builder): disable mouse drag test --- .../src/lib/query-builder/query-builder.component.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts b/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts index 52ffc62619b..5077f7a4946 100644 --- a/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts +++ b/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts @@ -2471,7 +2471,7 @@ describe('IgxQueryBuilder', () => { expect(chipComponents[1].nativeElement.getBoundingClientRect().height).toBe(0); }); - it('Should render drop ghost properly when mouse dragged.', fakeAsync(() => { + xit('Should render drop ghost properly when mouse dragged.', fakeAsync(() => { const draggedChip = chipComponents[1].componentInstance; const draggedChipCenter = QueryBuilderFunctions.getElementCenter(draggedChip.chipArea.nativeElement); const dragDir = draggedChip.dragDirective; From aaa5d5dff22a2c5094318b9955f388c7a003f573 Mon Sep 17 00:00:00 2001 From: teodosiah Date: Wed, 26 Mar 2025 16:13:20 +0200 Subject: [PATCH 4/5] fix(query-builder): fix Advanced filtering failing tests --- .../src/lib/query-builder/query-builder-tree.component.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/igniteui-angular/src/lib/query-builder/query-builder-tree.component.ts b/projects/igniteui-angular/src/lib/query-builder/query-builder-tree.component.ts index 7ed471fbed7..93f5c668f93 100644 --- a/projects/igniteui-angular/src/lib/query-builder/query-builder-tree.component.ts +++ b/projects/igniteui-angular/src/lib/query-builder/query-builder-tree.component.ts @@ -172,12 +172,12 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy { @Input() public set fields(fields: FieldType[]) { this._fields = fields; - + + this._fields = this._fields?.map(f => ({...f, filters: this.getFilters(f), pipeArgs: this.getPipeArgs(f) })); + if (!this._fields && this.isAdvancedFiltering()) { this._fields = this.entities[0].fields; } - - this._fields = this._fields.map(f => ({...f, filters: this.getFilters(f), pipeArgs: this.getPipeArgs(f) })); } /** From 4d43521d3c4cd814838d08f38a4ce29b10ff4336 Mon Sep 17 00:00:00 2001 From: teodosiah Date: Thu, 27 Mar 2025 11:10:25 +0200 Subject: [PATCH 5/5] fix(query-builder): enable xit QB test --- .../src/lib/query-builder/query-builder.component.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts b/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts index 5077f7a4946..52ffc62619b 100644 --- a/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts +++ b/projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts @@ -2471,7 +2471,7 @@ describe('IgxQueryBuilder', () => { expect(chipComponents[1].nativeElement.getBoundingClientRect().height).toBe(0); }); - xit('Should render drop ghost properly when mouse dragged.', fakeAsync(() => { + it('Should render drop ghost properly when mouse dragged.', fakeAsync(() => { const draggedChip = chipComponents[1].componentInstance; const draggedChipCenter = QueryBuilderFunctions.getElementCenter(draggedChip.chipArea.nativeElement); const dragDir = draggedChip.dragDirective;