• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

IgniteUI / igniteui-angular / 13331632524

14 Feb 2025 02:51PM CUT coverage: 22.015% (-69.6%) from 91.622%
13331632524

Pull #15372

github

web-flow
Merge d52d57714 into bcb78ae0a
Pull Request #15372: chore(*): test ci passing

1990 of 15592 branches covered (12.76%)

431 of 964 new or added lines in 18 files covered. (44.71%)

19956 existing lines in 307 files now uncovered.

6452 of 29307 relevant lines covered (22.02%)

249.17 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid.filtering.strategy.ts
1
import { parseDate, resolveNestedPath } from '../../core/utils';
2
import { DataUtil } from '../../data-operations/data-util';
3
import { FilteringExpressionsTree, IFilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
4
import { BaseFilteringStrategy, IgxFilterItem } from '../../data-operations/filtering-strategy';
5
import { SortingDirection } from '../../data-operations/sorting-strategy';
6
import { ColumnType, GridType } from '../common/grid.interface';
7
import { IgxTreeGridAPIService } from './tree-grid-api.service';
8
import { ITreeGridRecord } from './tree-grid.interfaces';
9

10
export class TreeGridFilteringStrategy extends BaseFilteringStrategy {
11

UNCOV
12
    constructor(public hierarchicalFilterFields?: string[]) {
×
UNCOV
13
        super();
×
14
    }
15

16
    public filter(data: ITreeGridRecord[], expressionsTree: IFilteringExpressionsTree,
17
        advancedExpressionsTree?: IFilteringExpressionsTree, grid?: GridType): ITreeGridRecord[] {
UNCOV
18
        return this.filterImpl(data, expressionsTree, advancedExpressionsTree, undefined, grid);
×
19
    }
20

21
    protected getFieldValue(rec: any, fieldName: string, isDate = false, isTime = false, grid?: GridType): any {
×
UNCOV
22
        const column = grid?.getColumnByName(fieldName);
×
UNCOV
23
        const hierarchicalRecord = rec as ITreeGridRecord;
×
UNCOV
24
        let value = this.isHierarchicalFilterField(fieldName) ?
×
25
            this.getHierarchicalFieldValue(hierarchicalRecord, fieldName) :
26
            resolveNestedPath(hierarchicalRecord.data, fieldName);
27

UNCOV
28
        value = column?.formatter && this.shouldFormatFilterValues(column) ?
×
29
            column.formatter(value, rec.data) :
30
            value && (isDate || isTime) ? parseDate(value) : value;
×
31

UNCOV
32
        return value;
×
33
    }
34

35
    private getHierarchicalFieldValue(record: ITreeGridRecord, field: string) {
UNCOV
36
        const value = resolveNestedPath(record.data, field);
×
37

UNCOV
38
        return record.parent ?
×
39
            `${this.getHierarchicalFieldValue(record.parent, field)}${value ? `.[${value}]` : ''}` :
×
40
            `[${value}]`;
41
    }
42

43
    private filterImpl(data: ITreeGridRecord[], expressionsTree: IFilteringExpressionsTree,
44
        advancedExpressionsTree: IFilteringExpressionsTree, parent: ITreeGridRecord, grid?: GridType): ITreeGridRecord[] {
45
        let i: number;
46
        let rec: ITreeGridRecord;
UNCOV
47
        const len = data.length;
×
UNCOV
48
        const res: ITreeGridRecord[] = [];
×
UNCOV
49
        if ((FilteringExpressionsTree.empty(expressionsTree) && FilteringExpressionsTree.empty(advancedExpressionsTree)) || !len) {
×
UNCOV
50
            return data;
×
51
        }
UNCOV
52
        for (i = 0; i < len; i++) {
×
UNCOV
53
            rec = DataUtil.cloneTreeGridRecord(data[i]);
×
UNCOV
54
            rec.parent = parent;
×
UNCOV
55
            if (rec.children) {
×
UNCOV
56
                const filteredChildren = this.filterImpl(rec.children, expressionsTree, advancedExpressionsTree, rec, grid);
×
UNCOV
57
                rec.children = filteredChildren.length > 0 ? filteredChildren : null;
×
58
            }
59

UNCOV
60
            if (this.matchRecord(rec, expressionsTree, grid) && this.matchRecord(rec, advancedExpressionsTree, grid)) {
×
UNCOV
61
                res.push(rec);
×
UNCOV
62
            } else if (rec.children && rec.children.length > 0) {
×
UNCOV
63
                rec.isFilteredOutParent = true;
×
UNCOV
64
                res.push(rec);
×
65
            }
66
        }
UNCOV
67
        return res;
×
68
    }
69

70
    private isHierarchicalFilterField(field: string) {
UNCOV
71
        return this.hierarchicalFilterFields && this.hierarchicalFilterFields.indexOf(field) !== -1;
×
72
    }
73

74
    public override getFilterItems(column: ColumnType, tree: IFilteringExpressionsTree): Promise<IgxFilterItem[]> {
UNCOV
75
        if (!this.isHierarchicalFilterField(column.field)) {
×
UNCOV
76
            return super.getFilterItems(column, tree);
×
77
        }
78

UNCOV
79
        let data = (column.grid.gridAPI as IgxTreeGridAPIService).filterTreeDataByExpressions(tree);
×
UNCOV
80
        data = DataUtil.treeGridSort(
×
81
            data,
82
            [{ fieldName: column.field, dir: SortingDirection.Asc, ignoreCase: column.sortingIgnoreCase }],
83
            column.grid.sortStrategy,
84
            null,
85
            column.grid);
86

UNCOV
87
        const items = this.getHierarchicalFilterItems(data, column);
×
88

89

UNCOV
90
        return Promise.resolve(items);
×
91
    }
92

93
    private getHierarchicalFilterItems(records: ITreeGridRecord[], column: ColumnType, parent?: IgxFilterItem): IgxFilterItem[] {
UNCOV
94
        return records?.map(record => {
×
UNCOV
95
            let value = resolveNestedPath(record.data, column.field);
×
UNCOV
96
            const applyFormatter = column.formatter && this.shouldFormatFilterValues(column);
×
97

UNCOV
98
            value = applyFormatter ?
×
99
                column.formatter(value, record.data) :
100
                value;
101

UNCOV
102
            const hierarchicalValue = parent ?
×
103
                (value || value === 0) ? `${parent.value}.[${value}]` : value :
×
104
                `[${value}]`;
105

UNCOV
106
            const filterItem: IgxFilterItem = { value: hierarchicalValue };
×
UNCOV
107
            filterItem.label = this.getFilterItemLabel(column, value, !applyFormatter, record.data);
×
UNCOV
108
            filterItem.children = this.getHierarchicalFilterItems(record.children, column, filterItem);
×
UNCOV
109
            return filterItem;
×
110
        });
111
    }
112
}
113

114
export class TreeGridFormattedValuesFilteringStrategy extends TreeGridFilteringStrategy {
115
    /**
116
     * Creates a new instance of FormattedValuesFilteringStrategy.
117
     *
118
     * @param fields An array of column field names that should be formatted.
119
     * If omitted the values of all columns which has formatter will be formatted.
120
     */
UNCOV
121
    constructor(private fields?: string[]) {
×
UNCOV
122
        super();
×
123
    }
124

125
    protected override shouldFormatFilterValues(column: ColumnType): boolean {
UNCOV
126
        return !this.fields || this.fields.length === 0 || this.fields.some(f => f === column.field);
×
127
    }
128
}
129

130
export class TreeGridMatchingRecordsOnlyFilteringStrategy extends TreeGridFilteringStrategy {
131
    public override filter(data: ITreeGridRecord[], expressionsTree: IFilteringExpressionsTree,
132
        advancedExpressionsTree?: IFilteringExpressionsTree, grid?: GridType): ITreeGridRecord[] {
UNCOV
133
        return this.filterImplementation(data, expressionsTree, advancedExpressionsTree, undefined, grid);
×
134
    }
135

136
    private filterImplementation(data: ITreeGridRecord[], expressionsTree: IFilteringExpressionsTree,
137
        advancedExpressionsTree: IFilteringExpressionsTree, parent: ITreeGridRecord, grid?: GridType): ITreeGridRecord[] {
138
        let i: number;
139
        let rec: ITreeGridRecord;
UNCOV
140
        const len = data.length;
×
UNCOV
141
        const res: ITreeGridRecord[] = [];
×
UNCOV
142
        if ((FilteringExpressionsTree.empty(expressionsTree) && FilteringExpressionsTree.empty(advancedExpressionsTree)) || !len) {
×
UNCOV
143
            return data;
×
144
        }
UNCOV
145
        for (i = 0; i < len; i++) {
×
UNCOV
146
            rec = DataUtil.cloneTreeGridRecord(data[i]);
×
UNCOV
147
            rec.parent = parent;
×
UNCOV
148
            if (rec.children) {
×
UNCOV
149
                const filteredChildren = this.filterImplementation(rec.children, expressionsTree, advancedExpressionsTree, rec, grid);
×
UNCOV
150
                rec.children = filteredChildren.length > 0 ? filteredChildren : null;
×
151
            }
UNCOV
152
            if (this.matchRecord(rec, expressionsTree, grid) && this.matchRecord(rec, advancedExpressionsTree, grid)) {
×
UNCOV
153
                res.push(rec);
×
UNCOV
154
            } else if (rec.children && rec.children.length > 0) {
×
UNCOV
155
                rec = this.setCorrectLevelToFilteredRecords(rec);
×
UNCOV
156
                res.push(...rec.children);
×
157
            }
158
        }
UNCOV
159
        return res;
×
160
    }
161

162
    private setCorrectLevelToFilteredRecords(rec: ITreeGridRecord): ITreeGridRecord {
UNCOV
163
        if (rec.children && rec.children.length > 0) {
×
UNCOV
164
            rec.children.map(child => {
×
UNCOV
165
                child.level = child.level - 1;
×
UNCOV
166
                return this.setCorrectLevelToFilteredRecords(child);
×
167
            });
168
        }
UNCOV
169
        return rec;
×
170
    }
171
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc