Skip to content

Commit d0cadec

Browse files
authored
Merge pull request #10077 from IgniteUI/vkombov/feat-9923-master
feat(tree-grid): adding matching records only filtering strategy
2 parents 5444f84 + 50b8b08 commit d0cadec

File tree

3 files changed

+70
-1
lines changed

3 files changed

+70
-1
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ All notable changes for each version of this project will be documented in this
44

55
## 12.2.0
66

7+
### New Features
8+
- `igxTreeGrid`
9+
- Added `TreeGridMatchingRecordsOnlyFilteringStrategy`, which allows you to display only the records matching particular filtering condition without any trace for their parents.
10+
11+
## 12.1.6
12+
713
### General
814
- `igxGrid`, `igxHierarchicalGrid`, `igxTreeGrid`
915
- 'oddRowCSS' and 'evenRowCSS' properties has been deprecated

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { TreeGridFunctions } from '../../test-utils/tree-grid-functions.spec';
77
import { configureTestSuite } from '../../test-utils/configure-suite';
88
import { IgxStringFilteringOperand, IgxNumberFilteringOperand, IgxDateFilteringOperand } from '../../data-operations/filtering-condition';
99
import { FilteringStrategy } from '../../data-operations/filtering-strategy';
10-
import { TreeGridFormattedValuesFilteringStrategy } from './tree-grid.filtering.strategy';
10+
import { TreeGridFormattedValuesFilteringStrategy, TreeGridMatchingRecordsOnlyFilteringStrategy } from './tree-grid.filtering.strategy';
1111
import { FilterMode } from '../common/enums';
1212
import { GridFunctions } from '../../test-utils/grid-functions.spec';
1313
import { wait } from '../../test-utils/ui-interactions.spec';
@@ -484,6 +484,26 @@ describe('IgxTreeGrid - Filtering actions #tGrid', () => {
484484
expect(treeGrid.rowList.length).toBe(4);
485485
expect(treeGrid.filteredData.map(rec => rec.ID)).toEqual([ 847, 225, 663, 141]);
486486
}));
487+
488+
it('should display only the filtered records when using TreeGridMatchingRecordsOnlyFilteringStrategy', fakeAsync(() => {
489+
expect(treeGrid.filterStrategy).toBeUndefined();
490+
treeGrid.filter('Name', 'Trevor', IgxStringFilteringOperand.instance().condition('contains'), true);
491+
tick(30);
492+
fix.detectChanges();
493+
494+
expect(treeGrid.rowList.length).toBe(3);
495+
496+
const matchingRecordsOnlyStrategy = new TreeGridMatchingRecordsOnlyFilteringStrategy();
497+
treeGrid.filterStrategy = matchingRecordsOnlyStrategy;
498+
fix.detectChanges();
499+
500+
treeGrid.filter('Name', 'Trevor', IgxStringFilteringOperand.instance().condition('contains'), true);
501+
tick(30);
502+
fix.detectChanges();
503+
504+
expect(treeGrid.rowList.length).toBe(1);
505+
expect(treeGrid.filteredData.map(rec => rec.ID)).toEqual([141]);
506+
}));
487507
});
488508
class CustomTreeGridFilterStrategy extends FilteringStrategy {
489509

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,46 @@ export class TreeGridFormattedValuesFilteringStrategy extends TreeGridFilteringS
7474
return value;
7575
}
7676
}
77+
78+
export class TreeGridMatchingRecordsOnlyFilteringStrategy extends TreeGridFilteringStrategy {
79+
public filter(data: ITreeGridRecord[], expressionsTree: IFilteringExpressionsTree,
80+
advancedExpressionsTree?: IFilteringExpressionsTree, grid?: GridType): ITreeGridRecord[] {
81+
return this.filterImplementation(data, expressionsTree, advancedExpressionsTree, undefined, grid);
82+
}
83+
84+
private filterImplementation(data: ITreeGridRecord[], expressionsTree: IFilteringExpressionsTree,
85+
advancedExpressionsTree: IFilteringExpressionsTree, parent: ITreeGridRecord, grid?: GridType): ITreeGridRecord[] {
86+
let i: number;
87+
let rec: ITreeGridRecord;
88+
const len = data.length;
89+
const res: ITreeGridRecord[] = [];
90+
if ((FilteringExpressionsTree.empty(expressionsTree) && FilteringExpressionsTree.empty(advancedExpressionsTree)) || !len) {
91+
return data;
92+
}
93+
for (i = 0; i < len; i++) {
94+
rec = DataUtil.cloneTreeGridRecord(data[i]);
95+
rec.parent = parent;
96+
if (rec.children) {
97+
const filteredChildren = this.filterImplementation(rec.children, expressionsTree, advancedExpressionsTree, rec, grid);
98+
rec.children = filteredChildren.length > 0 ? filteredChildren : null;
99+
}
100+
if (this.matchRecord(rec, expressionsTree, grid) && this.matchRecord(rec, advancedExpressionsTree, grid)) {
101+
res.push(rec);
102+
} else if (rec.children && rec.children.length > 0) {
103+
rec = this.setCorrectLevelToFilteredRecords(rec);
104+
res.push(...rec.children);
105+
}
106+
}
107+
return res;
108+
}
109+
110+
private setCorrectLevelToFilteredRecords(rec: ITreeGridRecord): ITreeGridRecord {
111+
if (rec.children && rec.children.length > 0) {
112+
rec.children.map(child => {
113+
child.level = child.level - 1;
114+
return this.setCorrectLevelToFilteredRecords(child);
115+
});
116+
}
117+
return rec;
118+
}
119+
}

0 commit comments

Comments
 (0)