Skip to content

Commit 50955d6

Browse files
authored
Merge pull request #6350 from IgniteUI/astaev/issue6260-master
fix(grid): Export only filtered data #6258
2 parents e6c4c3e + 3c882de commit 50955d6

File tree

5 files changed

+173
-4
lines changed

5 files changed

+173
-4
lines changed

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) {

projects/igniteui-angular/src/lib/services/excel/test-data.service.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,23 @@ export class FileContentData {
804804
return this.createData();
805805
}
806806

807+
get treeGridWithAdvancedFilters() {
808+
this._sharedStringsData =
809+
`count="15" uniqueCount="14"><si><t>ID</t></si><si><t>ParentID</t></si><si><t>Name</t></si><si><t>JobTitle</t></si><si><t>Age</t></si><si><t>Casey Houston</t></si><si><t>Vice President</t></si><si><t>Gilberto Todd</t></si><si><t>Director</t></si><si><t>Tanya Bennett</t></si><si><t>Debra Morton</t></si><si><t>Associate Software Developer</t></si><si><t>Jack Simon</t></si><si><t>Software Developer</t></si>`;
810+
811+
this._tableData = `ref="A1:E6" totalsRowShown="0">
812+
<autoFilter ref="A1:E6"/><tableColumns count="5"><tableColumn id="1" name="ID"/><tableColumn id="2" name="ParentID"/><tableColumn id="3" name="Name"/><tableColumn id="4" name="JobTitle"/><tableColumn id="5" name="Age"/></tableColumns>`;
813+
814+
this._worksheetData = `<sheetPr><outlinePr summaryBelow="0"/></sheetPr>
815+
<dimension ref="A1:E6"/>
816+
<sheetViews><sheetView tabSelected="1" workbookViewId="0"></sheetView></sheetViews>
817+
<sheetFormatPr defaultRowHeight="15" outlineLevelRow="2" x14ac:dyDescent="0.25"/>
818+
<cols><col min="1" max="1" width="50" customWidth="1"/><col min="2" max="2" width="50" customWidth="1"/><col min="3" max="3" width="50" customWidth="1"/><col min="4" max="4" width="50" customWidth="1"/><col min="5" max="5" width="50" customWidth="1"/></cols>
819+
<sheetData><row r="1"><c r="A1" t="s"><v>0</v></c><c r="B1" t="s"><v>1</v></c><c r="C1" t="s"><v>2</v></c><c r="D1" t="s"><v>3</v></c><c r="E1" t="s"><v>4</v></c></row><row r="2"><c r="A2" s="1"><v>1</v></c><c r="B2" s="1"><v>-1</v></c><c r="C2" t="s"><v>5</v></c><c r="D2" t="s"><v>6</v></c><c r="E2" s="1"><v>32</v></c></row><row r="3" outlineLevel="1"><c r="A3" s="1"><v>2</v></c><c r="B3" s="1"><v>1</v></c><c r="C3" t="s"><v>7</v></c><c r="D3" t="s"><v>8</v></c><c r="E3" s="1"><v>41</v></c></row><row r="4" outlineLevel="2"><c r="A4" s="1"><v>3</v></c><c r="B4" s="1"><v>2</v></c><c r="C4" t="s"><v>9</v></c><c r="D4" t="s"><v>8</v></c><c r="E4" s="1"><v>29</v></c></row><row r="5" outlineLevel="2"><c r="A5" s="1"><v>7</v></c><c r="B5" s="1"><v>2</v></c><c r="C5" t="s"><v>10</v></c><c r="D5" t="s"><v>11</v></c><c r="E5" s="1"><v>35</v></c></row><row r="6" outlineLevel="1"><c r="A6" s="1"><v>4</v></c><c r="B6" s="1"><v>1</v></c><c r="C6" t="s"><v>12</v></c><c r="D6" t="s"><v>13</v></c><c r="E6" s="1"><v>33</v></c></row></sheetData>`;
820+
821+
return this.createData();
822+
}
823+
807824
public treeGridDataExpDepth(depth: number) {
808825
this._sharedStringsData =
809826
`count="21" uniqueCount="19"><si><t>ID</t></si><si><t>ParentID</t></si><si><t>Name</t></si><si><t>JobTitle</t></si><si><t>Age</t></si><si><t>Casey Houston</t></si><si><t>Vice President</t></si><si><t>Gilberto Todd</t></si><si><t>Director</t></si><si><t>Tanya Bennett</t></si><si><t>Debra Morton</t></si><si><t>Associate Software Developer</t></si><si><t>Jack Simon</t></si><si><t>Software Developer</t></si><si><t>Erma Walsh</t></si><si><t>CEO</t></si><si><t>Eduardo Ramirez</t></si><si><t>Manager</t></si><si><t>Leslie Hansen</t></si>`;
@@ -885,5 +902,21 @@ export class FileContentData {
885902

886903
return this.createData();
887904
}
905+
906+
get gridWithAdvancedFilters() {
907+
this._sharedStringsData =
908+
`count="11" uniqueCount="11"><si><t>ID</t></si><si><t>Name</t></si><si><t>JobTitle</t></si><si><t>Erma Walsh</t></si><si><t>CEO</t></si><si><t>Debra Morton</t></si><si><t>Associate Software Developer</t></si><si><t>Erika Wells</t></si><si><t>Software Development Team Lead</t></si><si><t>Eduardo Ramirez</t></si><si><t>Manager</t></si>`;
909+
910+
this._tableData = `ref="A1:C5" totalsRowShown="0">
911+
<autoFilter ref="A1:C5"/><tableColumns count="3"><tableColumn id="1" name="ID"/><tableColumn id="2" name="Name"/><tableColumn id="3" name="JobTitle"/></tableColumns>`;
912+
913+
this._worksheetData = `<dimension ref="A1:C5"/>
914+
<sheetViews><sheetView tabSelected="1" workbookViewId="0"></sheetView></sheetViews>
915+
<sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/>
916+
<cols><col min="1" max="1" width="50" customWidth="1"/><col min="2" max="2" width="50" customWidth="1"/><col min="3" max="3" width="50" customWidth="1"/></cols>
917+
<sheetData><row r="1"><c r="A1" t="s"><v>0</v></c><c r="B1" t="s"><v>1</v></c><c r="C1" t="s"><v>2</v></c></row><row r="2"><c r="A2" s="1"><v>6</v></c><c r="B2" t="s"><v>3</v></c><c r="C2" t="s"><v>4</v></c></row><row r="3"><c r="A3" s="1"><v>7</v></c><c r="B3" t="s"><v>5</v></c><c r="C3" t="s"><v>6</v></c></row><row r="4"><c r="A4" s="1"><v>8</v></c><c r="B4" t="s"><v>7</v></c><c r="C4" t="s"><v>8</v></c></row><row r="5"><c r="A5" s="1"><v>10</v></c><c r="B5" t="s"><v>9</v></c><c r="C5" t="s"><v>10</v></c></row></sheetData>`;
918+
919+
return this.createData();
920+
}
888921
/* tslint:enable max-line-length */
889922
}

projects/igniteui-angular/src/lib/services/exporter-common/base-export-service.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -250,12 +250,14 @@ export abstract class IgxBaseExporter {
250250

251251
let data = this._isTreeGrid ? this.flatRecords : grid.data;
252252

253-
if (grid.filteringExpressionsTree &&
254-
grid.filteringExpressionsTree.filteringOperands.length > 0 &&
253+
if (((grid.filteringExpressionsTree &&
254+
grid.filteringExpressionsTree.filteringOperands.length > 0) ||
255+
(grid.advancedFilteringExpressionsTree &&
256+
grid.advancedFilteringExpressionsTree.filteringOperands.length > 0)) &&
255257
!options.ignoreFiltering) {
256258
const filteringState: any = {
257259
expressionsTree: grid.filteringExpressionsTree,
258-
advancedExpressionsTree: grid.advancedExpressionsTree,
260+
advancedExpressionsTree: grid.advancedFilteringExpressionsTree,
259261
logic: grid.filteringLogic
260262
};
261263

0 commit comments

Comments
 (0)