Skip to content

Commit 9d8d8ae

Browse files
committed
Merge branch '8.2.x' into dmdimitrov/issue6289-8.2.x
2 parents 3e45abb + a0dc7c7 commit 9d8d8ae

File tree

11 files changed

+230
-31
lines changed

11 files changed

+230
-31
lines changed

projects/igniteui-angular/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
"web-animations-js": "^2.3.2"
8080
},
8181
"devDependencies": {
82-
"igniteui-cli": "~4.2.0"
82+
"igniteui-cli": "~4.3.0"
8383
},
8484
"ng-update": {
8585
"migrations": "./migrations/migration-collection.json"

projects/igniteui-angular/src/lib/data-operations/data-util.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,14 @@ export class DataUtil {
210210
return data;
211211
}
212212

213+
public static parseValue(dataType: DataType, value: any): any {
214+
if (dataType === DataType.Number) {
215+
value = parseFloat(value);
216+
}
217+
218+
return value;
219+
}
220+
213221
private static findParentFromPath(data: any[], primaryKey: any, childDataKey: any, path: any[]): any {
214222
let collection: any[] = data;
215223
let result: any;

projects/igniteui-angular/src/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { takeUntil, first } from 'rxjs/operators';
1818
import { Subject } from 'rxjs';
1919
import { KEYS } from '../../../core/utils';
2020
import { AbsoluteScrollStrategy, AutoPositionStrategy } from '../../../services/index';
21+
import { DataUtil } from './../../../data-operations/data-util';
2122

2223
/**
2324
*@hidden
@@ -301,7 +302,7 @@ export class IgxAdvancedFilteringDialogComponent implements AfterViewInit, OnDes
301302
if (this.editedExpression) {
302303
this.editedExpression.expression.fieldName = this.selectedColumn.field;
303304
this.editedExpression.expression.condition = this.selectedColumn.filters.condition(this.selectedCondition);
304-
this.editedExpression.expression.searchVal = this.searchValue;
305+
this.editedExpression.expression.searchVal = DataUtil.parseValue(this.selectedColumn.dataType, this.searchValue);
305306

306307
this.editedExpression.inEditMode = false;
307308
this.editedExpression = null;

projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-default-expression.component.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { ExpressionUI } from '../grid-filtering.service';
1313
import { IgxButtonGroupComponent } from '../../../buttonGroup/buttonGroup.component';
1414
import { IgxDropDownItemComponent, IgxDropDownComponent } from '../../../drop-down/index';
1515
import { IgxInputGroupComponent, IgxInputDirective } from '../../../input-group/index';
16-
import { DataType } from '../../../data-operations/data-util';
16+
import { DataType, DataUtil } from '../../../data-operations/data-util';
1717
import { IFilteringOperation } from '../../../data-operations/filtering-condition';
1818
import { OverlaySettings, ConnectedPositioningStrategy, CloseScrollStrategy } from '../../../services/index';
1919
import { KEYS, IBaseEventArgs } from '../../../core/utils';
@@ -167,7 +167,7 @@ export class IgxExcelStyleDefaultExpressionComponent implements AfterViewInit {
167167
}
168168

169169
public onValuesInput(eventArgs) {
170-
this.expressionUI.expression.searchVal = this.transformValue(eventArgs.target.value);
170+
this.expressionUI.expression.searchVal = DataUtil.parseValue(this.column.dataType, eventArgs.target.value);
171171
}
172172

173173
public onLogicOperatorButtonClicked(eventArgs, buttonIndex: number) {
@@ -207,14 +207,4 @@ export class IgxExcelStyleDefaultExpressionComponent implements AfterViewInit {
207207

208208
event.stopPropagation();
209209
}
210-
211-
private transformValue(value): any {
212-
if (this.column.dataType === DataType.Number) {
213-
value = parseFloat(value);
214-
} else if (this.column.dataType === DataType.Boolean) {
215-
value = Boolean(value);
216-
}
217-
218-
return value;
219-
}
220210
}

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

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
ChangeDetectionStrategy,
1414
ViewRef
1515
} from '@angular/core';
16-
import { DataType } from '../../data-operations/data-util';
16+
import { DataType, DataUtil } from '../../data-operations/data-util';
1717
import { IgxColumnComponent } from '../column.component';
1818
import { IgxDropDownComponent, ISelectionEventArgs } from '../../drop-down/index';
1919
import { IFilteringOperation } from '../../data-operations/filtering-condition';
@@ -100,7 +100,7 @@ export class IgxGridFilteringRowComponent implements AfterViewInit {
100100
this.expression.searchVal = null;
101101
this.showHideArrowButtons();
102102
} else {
103-
this.expression.searchVal = this.transformValue(val);
103+
this.expression.searchVal = DataUtil.parseValue(this.column.dataType, val);
104104
if (this.expressionsList.find(item => item.expression === this.expression) === undefined) {
105105
this.addExpression(true);
106106
}
@@ -659,16 +659,6 @@ export class IgxGridFilteringRowComponent implements AfterViewInit {
659659
});
660660
}
661661

662-
private transformValue(value): any {
663-
if (this.column.dataType === DataType.Number) {
664-
value = parseFloat(value);
665-
} else if (this.column.dataType === DataType.Boolean) {
666-
value = Boolean(value);
667-
}
668-
669-
return value;
670-
}
671-
672662
private addExpression(isSelected: boolean) {
673663
const exprUI = new ExpressionUI();
674664
exprUI.expression = this.expression;

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

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ describe('IgxGrid - Advanced Filtering', () => {
422422
expect(GridFunctions.getCurrentCellFromGrid(grid, 1, 1).value).toBe('Ignite UI for Angular');
423423
}));
424424

425-
it('Should correctly filter by a \'number\' column through UI.', fakeAsync(() => {
425+
it('Should correctly filter by a \'Greater Than\' with \'number\' column through UI.', fakeAsync(() => {
426426
// Test prerequisites
427427
grid.height = '800px';
428428
fix.detectChanges();
@@ -464,6 +464,47 @@ describe('IgxGrid - Advanced Filtering', () => {
464464
expect(GridFunctions.getCurrentCellFromGrid(grid, 1, 1).value).toBe('NetAdvantage');
465465
}));
466466

467+
it('Should correctly filter by a \'Equals\' with \'number\' column through UI.', fakeAsync(() => {
468+
// Test prerequisites
469+
grid.height = '800px';
470+
fix.detectChanges();
471+
tick(50);
472+
473+
// Verify no filters are present.
474+
expect(grid.filteredData).toBeNull();
475+
expect(grid.rowList.length).toBe(8);
476+
expect(GridFunctions.getCurrentCellFromGrid(grid, 0, 1).value).toBe('Ignite UI for JavaScript');
477+
expect(GridFunctions.getCurrentCellFromGrid(grid, 1, 1).value).toBe('NetAdvantage');
478+
479+
// Open Advanced Filtering dialog.
480+
GridFunctions.clickAdvancedFilteringButton(fix);
481+
fix.detectChanges();
482+
483+
// Click the initial 'Add And Group' button.
484+
const addAndGroupButton = GridFunctions.getAdvancedFilteringInitialAddGroupButtons(fix)[0];
485+
addAndGroupButton.click();
486+
tick(100);
487+
fix.detectChanges();
488+
489+
selectColumnInEditModeExpression(fix, 2); // Select 'Downloads' column.
490+
selectOperatorInEditModeExpression(fix, 0); // Select 'Equals' operator.
491+
const input = GridFunctions.getAdvancedFilteringValueInput(fix).querySelector('input');
492+
sendInputNativeElement(fix, input, '127'); // Type filter value.
493+
494+
// Commit the populated expression.
495+
GridFunctions.clickAdvancedFilteringExpressionCommitButton(fix);
496+
fix.detectChanges();
497+
498+
// Apply the filters.
499+
GridFunctions.clickAdvancedFilteringApplyButton(fix);
500+
fix.detectChanges();
501+
502+
// Verify the filter results.
503+
expect(grid.filteredData.length).toEqual(1);
504+
expect(grid.rowList.length).toBe(1);
505+
expect(GridFunctions.getCurrentCellFromGrid(grid, 0, 1).value).toBe('NetAdvantage');
506+
}));
507+
467508
it('Should correctly filter by a \'boolean\' column through UI.', fakeAsync(() => {
468509
// Test prerequisites
469510
grid.height = '800px';

projects/igniteui-angular/src/lib/services/csv/csv-exporter-grid.spec.ts

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ import { SampleTestData } from '../../test-utils/sample-test-data.spec';
1515
import { first } from 'rxjs/operators';
1616
import { DefaultSortingStrategy } from '../../data-operations/sorting-strategy';
1717
import { IgxStringFilteringOperand, IgxNumberFilteringOperand } from '../../data-operations/filtering-condition';
18-
18+
import { FilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
19+
import { FilteringLogic } from '../../data-operations/filtering-expression.interface';
1920
import { configureTestSuite } from '../../test-utils/configure-suite';
2021
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
22+
import { wait } from '../../test-utils/ui-interactions.spec';
2123

2224
describe('CSV Grid Exporter', () => {
2325
configureTestSuite();
@@ -336,6 +338,37 @@ describe('CSV Grid Exporter', () => {
336338
wrapper.verifyData(wrapper.simpleGridDataFormatted, 'Columns\' formatter should not be skipped.');
337339
});
338340

341+
it('Should honor the Advanced filters when exporting', async() => {
342+
const fix = TestBed.createComponent(GridIDNameJobTitleComponent);
343+
fix.detectChanges();
344+
345+
const grid = fix.componentInstance.grid;
346+
const tree = new FilteringExpressionsTree(FilteringLogic.And);
347+
tree.filteringOperands.push({
348+
fieldName: 'Name',
349+
searchVal: 'a',
350+
condition: IgxStringFilteringOperand.instance().condition('contains'),
351+
ignoreCase: true
352+
});
353+
tree.filteringOperands.push({
354+
fieldName: 'Name',
355+
searchVal: 'r',
356+
condition: IgxStringFilteringOperand.instance().condition('contains'),
357+
ignoreCase: true
358+
});
359+
tree.filteringOperands.push({
360+
fieldName: 'ID',
361+
searchVal: 5,
362+
condition: IgxNumberFilteringOperand.instance().condition('greaterThan'),
363+
});
364+
365+
grid.advancedFilteringExpressionsTree = tree;
366+
fix.detectChanges();
367+
368+
expect(grid.filteredData.length).toBe(4);
369+
const wrapper = await getExportedData(grid, options);
370+
wrapper.verifyData(wrapper.gridWithAdvancedFilters, 'Should export only filtered data.');
371+
});
339372

340373
describe('', () => {
341374
let fix;
@@ -441,6 +474,29 @@ describe('CSV Grid Exporter', () => {
441474
wrapper = await getExportedData(treeGrid, options);
442475
wrapper.verifyData(wrapper.treeGridDataFormatted, 'Columns\' formatter should be applied.');
443476
});
477+
478+
it('Should honor the Advanced filters when exporting', async() => {
479+
const tree = new FilteringExpressionsTree(FilteringLogic.And);
480+
tree.filteringOperands.push({
481+
fieldName: 'Name',
482+
searchVal: 'a',
483+
condition: IgxStringFilteringOperand.instance().condition('contains'),
484+
ignoreCase: true
485+
});
486+
tree.filteringOperands.push({
487+
fieldName: 'Name',
488+
searchVal: 'r',
489+
condition: IgxStringFilteringOperand.instance().condition('contains'),
490+
ignoreCase: true
491+
});
492+
treeGrid.advancedFilteringExpressionsTree = tree;
493+
fix.detectChanges();
494+
await wait();
495+
expect(treeGrid.filteredData.length).toBe(5);
496+
497+
const wrapper = await getExportedData(treeGrid, options);
498+
wrapper.verifyData(wrapper.treeGridWithAdvancedFilters, 'Should export only filtered data!');
499+
});
444500
});
445501

446502
function getExportedData(grid, csvOptions: IgxCsvExporterOptions) {

projects/igniteui-angular/src/lib/services/csv/csv-verification-wrapper.spec.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,14 @@ export class CSVWrapper {
188188
`Eduardo Ramirez${this._delimiter}10${this._delimiter}Manager${this._eor}`;
189189
}
190190

191+
get gridWithAdvancedFilters() {
192+
return `ID${this._delimiter}Name${this._delimiter}JobTitle${this._eor}` +
193+
`6${this._delimiter}Erma Walsh${this._delimiter}CEO${this._eor}` +
194+
`7${this._delimiter}Debra Morton${this._delimiter}Associate Software Developer${this._eor}` +
195+
`8${this._delimiter}Erika Wells${this._delimiter}Software Development Team Lead${this._eor}` +
196+
`10${this._delimiter}Eduardo Ramirez${this._delimiter}Manager${this._eor}`;
197+
}
198+
191199
get treeGridData() {
192200
return `ID${this._delimiter}ParentID${this._delimiter}Name${this._delimiter}JobTitle${this._delimiter}Age${this._eor}` +
193201
`1${this._delimiter}-1${this._delimiter}Casey Houston${this._delimiter}Vice President${this._delimiter}32${this._eor}` +
@@ -245,4 +253,13 @@ export class CSVWrapper {
245253
`2${this._delimiter}1${this._delimiter}Gilberto Todd${this._delimiter}Director${this._delimiter}41${this._eor}` +
246254
`7${this._delimiter}2${this._delimiter}Debra Morton${this._delimiter}Associate Software Developer${this._delimiter}35${this._eor}`;
247255
}
256+
257+
get treeGridWithAdvancedFilters() {
258+
return `ID${this._delimiter}ParentID${this._delimiter}Name${this._delimiter}JobTitle${this._delimiter}Age${this._eor}` +
259+
`1${this._delimiter}-1${this._delimiter}Casey Houston${this._delimiter}Vice President${this._delimiter}32${this._eor}` +
260+
`2${this._delimiter}1${this._delimiter}Gilberto Todd${this._delimiter}Director${this._delimiter}41${this._eor}` +
261+
`7${this._delimiter}2${this._delimiter}Debra Morton${this._delimiter}Associate Software Developer${this._delimiter}35${this._eor}` +
262+
`6${this._delimiter}-1${this._delimiter}Erma Walsh${this._delimiter}CEO${this._delimiter}52${this._eor}` +
263+
`10${this._delimiter}-1${this._delimiter}Eduardo Ramirez${this._delimiter}Manager${this._delimiter}53${this._eor}`;
264+
}
248265
}

projects/igniteui-angular/src/lib/services/excel/excel-exporter-grid.spec.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import { IgxTreeGridModule, IgxTreeGridComponent } from '../../grids/tree-grid';
2121
import { IgxNumberFilteringOperand } from '../../data-operations/filtering-condition';
2222
import { wait } from '../../test-utils/ui-interactions.spec';
2323
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
24+
import { FilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
25+
import { FilteringLogic } from '../../data-operations/filtering-expression.interface';
2426

2527
describe('Excel Exporter', () => {
2628
configureTestSuite();
@@ -464,6 +466,41 @@ describe('Excel Exporter', () => {
464466
});
465467
await exportAndVerify(grid, options, actualData.simpleGridData);
466468
});
469+
470+
it('Should honor Advanced filters when exporting', async () => {
471+
const fix = TestBed.createComponent(GridIDNameJobTitleComponent);
472+
fix.detectChanges();
473+
await wait();
474+
475+
const grid = fix.componentInstance.grid;
476+
const tree = new FilteringExpressionsTree(FilteringLogic.And);
477+
tree.filteringOperands.push({
478+
fieldName: 'Name',
479+
searchVal: 'a',
480+
condition: IgxStringFilteringOperand.instance().condition('contains'),
481+
ignoreCase: true
482+
});
483+
tree.filteringOperands.push({
484+
fieldName: 'Name',
485+
searchVal: 'r',
486+
condition: IgxStringFilteringOperand.instance().condition('contains'),
487+
ignoreCase: true
488+
});
489+
tree.filteringOperands.push({
490+
fieldName: 'ID',
491+
searchVal: 5,
492+
condition: IgxNumberFilteringOperand.instance().condition('greaterThan'),
493+
});
494+
495+
grid.advancedFilteringExpressionsTree = tree;
496+
fix.detectChanges();
497+
grid.cdr.detectChanges();
498+
await wait();
499+
expect(grid.filteredData.length).toBe(4);
500+
501+
// Export and verify
502+
await exportAndVerify(grid, options, actualData.gridWithAdvancedFilters);
503+
});
467504
});
468505

469506
describe('', () => {
@@ -600,6 +637,30 @@ describe('Excel Exporter', () => {
600637
treeGrid.cdr.detectChanges();
601638
await exportAndVerify(treeGrid, options, actualData.treeGridDataFormatted);
602639
});
640+
641+
it('Should honor Advanced filters when exporting', async () => {
642+
const tree = new FilteringExpressionsTree(FilteringLogic.And);
643+
tree.filteringOperands.push({
644+
fieldName: 'Age',
645+
searchVal: 40,
646+
condition: IgxNumberFilteringOperand.instance().condition('lessThan'),
647+
ignoreCase: true
648+
});
649+
tree.filteringOperands.push({
650+
fieldName: 'Name',
651+
searchVal: 'a',
652+
condition: IgxStringFilteringOperand.instance().condition('contains'),
653+
ignoreCase: true
654+
});
655+
656+
treeGrid.advancedFilteringExpressionsTree = tree;
657+
fix.detectChanges();
658+
treeGrid.cdr.detectChanges();
659+
await wait();
660+
expect(treeGrid.filteredData.length).toBe(5);
661+
662+
await exportAndVerify(treeGrid, options, actualData.treeGridWithAdvancedFilters);
663+
});
603664
});
604665

605666
function getExportedData(grid, exportOptions: IgxExcelExporterOptions) {

0 commit comments

Comments
 (0)