Skip to content

Commit 15ebe23

Browse files
authored
Merge pull request #5501 from IgniteUI/nrobakova/fix-issue-5494
Clear grouping and filtering when removing a column
2 parents e627e45 + 4f1f224 commit 15ebe23

File tree

8 files changed

+116
-21
lines changed

8 files changed

+116
-21
lines changed

projects/igniteui-angular/src/lib/grids/api.service.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -328,13 +328,6 @@ export class GridBaseAPIService <T extends IgxGridBaseComponent & IGridDataBinda
328328
}
329329

330330
public clear_filter(fieldName: string) {
331-
if (fieldName) {
332-
const column = this.get_column_by_name(fieldName);
333-
if (!column) {
334-
return;
335-
}
336-
}
337-
338331
const grid = this.grid;
339332
grid.endEdit(false);
340333
const filteringState = grid.filteringExpressionsTree;
@@ -426,6 +419,9 @@ export class GridBaseAPIService <T extends IgxGridBaseComponent & IGridDataBinda
426419
protected remove_grouping_expression(fieldName) {
427420
}
428421

422+
public clear_groupby(name?: string | Array<string>) {
423+
}
424+
429425
public should_apply_number_style(column: IgxColumnComponent): boolean {
430426
return column.dataType === DataType.Number;
431427
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,10 @@ export class IgxFilteringService implements OnDestroy {
218218
if (!this.columnToExpressionsMap.has(columnId)) {
219219
const column = this.grid.columns.find((col) => col.field === columnId);
220220
const expressionUIs = new Array<ExpressionUI>();
221-
222-
this.generateExpressionsList(column.filteringExpressionsTree, this.grid.filteringExpressionsTree.operator, expressionUIs);
223-
this.columnToExpressionsMap.set(columnId, expressionUIs);
224-
221+
if (column) {
222+
this.generateExpressionsList(column.filteringExpressionsTree, this.grid.filteringExpressionsTree.operator, expressionUIs);
223+
this.columnToExpressionsMap.set(columnId, expressionUIs);
224+
}
225225
return expressionUIs;
226226
}
227227

@@ -322,7 +322,7 @@ export class IgxFilteringService implements OnDestroy {
322322
}
323323

324324
const column = this.grid.columns.find((col) => col.field === columnId);
325-
const isComplex = this.isFilteringTreeComplex(column.filteringExpressionsTree);
325+
const isComplex = column && this.isFilteringTreeComplex(column.filteringExpressionsTree);
326326
if (isComplex) {
327327
this.columnsWithComplexFilter.add(columnId);
328328
}

projects/igniteui-angular/src/lib/grids/grid-base.component.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4314,13 +4314,22 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements
43144314
diff.forEachRemovedItem((record: IterableChangeRecord<IgxColumnComponent | IgxColumnGroupComponent>) => {
43154315
const isColumnGroup = record.item instanceof IgxColumnGroupComponent;
43164316
if (!isColumnGroup) {
4317+
// Clear Grouping
4318+
this.gridAPI.clear_groupby(record.item.field);
4319+
43174320
// Clear Filtering
43184321
this.gridAPI.clear_filter(record.item.field);
43194322

4323+
// Close filter row
4324+
if ( this.filteringService.isFilterRowVisible
4325+
&& this.filteringService.filteredColumn
4326+
&& this.filteringService.filteredColumn.field === record.item.field) {
4327+
this.filteringRow.close();
4328+
}
4329+
43204330
// Clear Sorting
43214331
this.gridAPI.clear_sort(record.item.field);
43224332
}
4323-
43244333
removed = true;
43254334
});
43264335

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

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import { IgxGridComponent } from './grid.component';
55
import { IgxGridModule } from './index';
66
import { GridTemplateStrings, ColumnDefinitions } from '../../test-utils/template-strings.spec';
77
import { SampleTestData } from '../../test-utils/sample-test-data.spec';
8-
import { ColumnHiddenFromMarkupComponent, ColumnCellFormatterComponent } from '../../test-utils/grid-samples.spec';
8+
import { ColumnHiddenFromMarkupComponent, ColumnCellFormatterComponent, DynamicColumnsComponent } from '../../test-utils/grid-samples.spec';
99
import { wait } from '../../test-utils/ui-interactions.spec';
1010
import { configureTestSuite } from '../../test-utils/configure-suite';
1111
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
12+
import { IgxStringFilteringOperand, SortingDirection } from 'igniteui-angular';
1213

1314
describe('IgxGrid - Column properties', () => {
1415
configureTestSuite();
@@ -24,7 +25,8 @@ describe('IgxGrid - Column properties', () => {
2425
TemplatedInputColumnsComponent,
2526
ColumnCellFormatterComponent,
2627
ColumnHaederClassesComponent,
27-
ColumnHiddenFromMarkupComponent
28+
ColumnHiddenFromMarkupComponent,
29+
DynamicColumnsComponent
2830
],
2931
imports: [IgxGridModule, NoopAnimationsModule]
3032
})
@@ -301,6 +303,63 @@ describe('IgxGrid - Column properties', () => {
301303
expect(grid.getCellByColumn(i, 'Name').value).toBe(expectedVal[i]);
302304
}
303305
});
306+
307+
it('should clear filter when a columns is removed dynamically', () => {
308+
const fix = TestBed.createComponent(DynamicColumnsComponent);
309+
fix.detectChanges();
310+
311+
const columns = fix.componentInstance.columns;
312+
const grid = fix.componentInstance.grid;
313+
grid.allowFiltering = true;
314+
fix.detectChanges();
315+
316+
expect(grid.columns.length).toBe(7);
317+
318+
grid.filter('CompanyName', 'NoItemsFound', IgxStringFilteringOperand.instance().condition('contains'), true);
319+
fix.detectChanges();
320+
321+
expect(grid.rowList.length).toEqual(0);
322+
323+
expect(() => {
324+
fix.componentInstance.columns = columns.slice(2, columns.length - 1);
325+
fix.detectChanges();
326+
}).not.toThrow();
327+
328+
expect(grid.rowList.length).toBeGreaterThan(10);
329+
expect(grid.columns.length).toBe(4);
330+
});
331+
332+
it('should clear grouping when a columns is removed dynamically', () => {
333+
const fix = TestBed.createComponent(DynamicColumnsComponent);
334+
fix.detectChanges();
335+
336+
const columns = fix.componentInstance.columns;
337+
const grid = fix.componentInstance.grid;
338+
grid.getColumnByName('CompanyName').groupable = true;
339+
grid.getColumnByName('Address').groupable = true;
340+
grid.getColumnByName('City').groupable = true;
341+
fix.detectChanges();
342+
343+
grid.groupBy({
344+
fieldName: 'CompanyName', dir: SortingDirection.Asc, ignoreCase: false
345+
});
346+
347+
fix.detectChanges();
348+
349+
let groupRows = grid.nativeElement.querySelectorAll('igx-grid-groupby-row');
350+
351+
expect(groupRows.length).toBeGreaterThan(0);
352+
353+
expect(() => {
354+
fix.componentInstance.columns = columns.slice(2, columns.length - 1);
355+
fix.detectChanges();
356+
}).not.toThrow();
357+
358+
groupRows = grid.nativeElement.querySelectorAll('igx-grid-groupby-row');
359+
360+
expect(groupRows.length).toBe(0);
361+
expect(grid.columns.length).toBe(4);
362+
});
304363
});
305364

306365
@Component({

projects/igniteui-angular/src/lib/grids/grid/grid.component.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
<igx-chips-area (onReorder)="chipsOrderChanged($event)" (onMoveEnd)="chipsMovingEnded()">
88
<ng-container *ngFor="let expr of chipsGoupingExpressions; let last = last;">
99
<igx-chip [id]="expr.fieldName" [attr.title]="getGroupByChipTitle(expr)"
10-
[removable]="getColumnByName(expr.fieldName).groupable"
11-
[draggable]="getColumnByName(expr.fieldName).groupable" [displayDensity]="displayDensity"
10+
[removable]="getColumnGroupable(expr.fieldName)"
11+
[draggable]="getColumnGroupable(expr.fieldName)" [displayDensity]="displayDensity"
1212
(onKeyDown)="onChipKeyDown($event)" (onRemove)="onChipRemoved($event)"
13-
(onClick)="getColumnByName(expr.fieldName).groupable ? onChipClicked($event): null"
14-
[disabled]='!getColumnByName(expr.fieldName).groupable'>
13+
(onClick)="getColumnGroupable(expr.fieldName) ? onChipClicked($event): null"
14+
[disabled]='!getColumnGroupable(expr.fieldName)'>
1515
<span>{{ getGroupByChipTitle(expr) }}</span>
1616
<igx-icon igxSuffix>{{ expr.dir == 1 ? 'arrow_upward' : 'arrow_downward' }}</igx-icon>
1717
</igx-chip>

projects/igniteui-angular/src/lib/grids/grid/grid.component.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -902,7 +902,16 @@ export class IgxGridComponent extends IgxGridBaseComponent implements IGridDataB
902902
* @hidden
903903
*/
904904
public getGroupByChipTitle(expression: IGroupingExpression): string {
905-
return this.getColumnByName(expression.fieldName).header || expression.fieldName;
905+
const column = this.getColumnByName(expression.fieldName);
906+
return (column && column.header) || expression.fieldName;
907+
}
908+
909+
/**
910+
* @hidden
911+
*/
912+
public getColumnGroupable(fieldName: string): boolean {
913+
const column = this.getColumnByName(fieldName);
914+
return column && column.groupable;
906915
}
907916

908917
/**

projects/igniteui-angular/src/lib/grids/grid/groupby-row.component.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
ViewChild,
1010
} from '@angular/core';
1111
import { IGroupByRecord } from '../../data-operations/groupby-record.interface';
12+
import { DataType } from '../../data-operations/data-util';
1213
import { GridBaseAPIService } from '../api.service';
1314
import { IgxGridBaseComponent, IGridDataBindable } from '../grid-base.component';
1415
import { IgxGridSelectionService, ISelectionNode } from '../../core/grid-selection';
@@ -250,7 +251,8 @@ export class IgxGridGroupByRowComponent {
250251
* @hidden
251252
*/
252253
get dataType(): any {
253-
return this.grid.getColumnByName(this.groupRow.expression.fieldName).dataType;
254+
const column = this.grid.getColumnByName(this.groupRow.expression.fieldName);
255+
return (column && column.dataType) || DataType.String;
254256
}
255257

256258
private handleTabKey(shift: boolean, activeNode: ISelectionNode) {

projects/igniteui-angular/src/lib/test-utils/grid-samples.spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,3 +1099,23 @@ export class IgxGridClipboardComponent extends BasicGridComponent {
10991099
public data = SampleTestData.excelFilteringData();
11001100
formatter = (value: any) => `** ${value} **`;
11011101
}
1102+
1103+
@Component({
1104+
template: GridTemplateStrings.declareGrid(` [height]="height" [width]="width"`, ``,
1105+
ColumnDefinitions.generatedWithDataType)
1106+
})
1107+
export class DynamicColumnsComponent extends GridWithSizeComponent {
1108+
public columns = [
1109+
{ field: 'ID', width: 100 , dataType: 'number'},
1110+
{ field: 'CompanyName', width: 300 , dataType: 'string'},
1111+
{ field: 'ContactName', width: 200 , dataType: 'string'},
1112+
{ field: 'ContactTitle', width: 200 , dataType: 'string'},
1113+
{ field: 'Address', width: 300 , dataType: 'string'},
1114+
{ field: 'City', width: 100 , dataType: 'string'},
1115+
{ field: 'Region', width: 100 , dataType: 'string'}
1116+
];
1117+
1118+
data = SampleTestData.contactInfoDataFull();
1119+
width = '800px';
1120+
height = '800px';
1121+
}

0 commit comments

Comments
 (0)