Skip to content

Commit c8366c2

Browse files
authored
fix(query-builder): delete empty groups - master (#15012)
* fix(query-builder): delete empty groups
1 parent 3ac7898 commit c8366c2

File tree

2 files changed

+59
-5
lines changed

2 files changed

+59
-5
lines changed

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,6 +1918,52 @@ describe('IgxGrid - Advanced Filtering #grid - ', () => {
19181918
verifyChildrenSelection(GridFunctions.getAdvancedFilteringTreeItem(fix, [1]), false);
19191919
}));
19201920

1921+
1922+
it('Should remove all empty groups when clicking `delete` on a group\'s operator line\'s context menu.', fakeAsync(() => {
1923+
// Apply advanced filter through API.
1924+
const rootTree = new FilteringExpressionsTree(FilteringLogic.And);
1925+
rootTree.filteringOperands.push({
1926+
fieldName: 'Downloads', searchVal: 100, condition: IgxNumberFilteringOperand.instance().condition('greaterThan')
1927+
});
1928+
const firstTree = new FilteringExpressionsTree(FilteringLogic.And);
1929+
const secondTree = new FilteringExpressionsTree(FilteringLogic.Or);
1930+
const thirdTree = new FilteringExpressionsTree(FilteringLogic.And);
1931+
thirdTree.filteringOperands.push({
1932+
fieldName: 'ProductName', searchVal: 'a', condition: IgxStringFilteringOperand.instance().condition('contains'),
1933+
ignoreCase: true
1934+
});
1935+
thirdTree.filteringOperands.push({
1936+
fieldName: 'ProductName', searchVal: 's', condition: IgxStringFilteringOperand.instance().condition('contains'),
1937+
ignoreCase: true
1938+
});
1939+
secondTree.filteringOperands.push(thirdTree);
1940+
firstTree.filteringOperands.push(secondTree);
1941+
rootTree.filteringOperands.push(firstTree);
1942+
grid.advancedFilteringExpressionsTree = rootTree;
1943+
fix.detectChanges();
1944+
1945+
// Open Advanced Filtering dialog.
1946+
grid.openAdvancedFilteringDialog();
1947+
fix.detectChanges();
1948+
1949+
// Click group's outer operator line.
1950+
let middleGroupOperatorLine = GridFunctions.getAdvancedFilteringTreeGroupOperatorLine(fix, [1]);
1951+
middleGroupOperatorLine.click();
1952+
tick(200);
1953+
fix.detectChanges();
1954+
1955+
// Click on `delete` in the context menu.
1956+
let deleteBtn = fix.nativeElement.querySelector('.igx-filter-contextual-menu__delete-btn');
1957+
deleteBtn.click();
1958+
tick(200);
1959+
fix.detectChanges();
1960+
1961+
// Verify tree layout and remaining chip content
1962+
let rootGroup = GridFunctions.getAdvancedFilteringTreeRootGroup(fix);
1963+
expect(GridFunctions.getAdvancedFilteringTreeChildItems(rootGroup, true).length).toBe(1);
1964+
verifyExpressionChipContent(fix, [0], 'Downloads', 'Greater Than', '100');
1965+
}));
1966+
19211967
it('Should open the operator dropdown below its respective input-group.', fakeAsync(() => {
19221968
// Open Advanced Filtering dialog.
19231969
grid.openAdvancedFilteringDialog();

projects/igniteui-angular/src/lib/query-builder/query-builder.component.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -767,12 +767,20 @@ export class IgxQueryBuilderComponent implements AfterViewInit, OnDestroy {
767767
* @hidden @internal
768768
*/
769769
public deleteGroup() {
770-
const selectedGroup = this.contextualGroup;
771-
const parent = selectedGroup.parent;
772-
if (parent) {
773-
const index = parent.children.indexOf(selectedGroup);
770+
let selectedGroup = this.contextualGroup;
771+
let parent = selectedGroup.parent;
772+
if (!parent) {
773+
this.rootGroup = null;
774+
}
775+
776+
while (parent) {
777+
let index = parent.children.indexOf(selectedGroup);
774778
parent.children.splice(index, 1);
775-
} else {
779+
selectedGroup = parent;
780+
parent = parent.children.length === 0 ? parent.parent : null;
781+
}
782+
783+
if (this.rootGroup?.children.length === 0) {
776784
this.rootGroup = null;
777785
}
778786

0 commit comments

Comments
 (0)