Skip to content

Commit dd92df4

Browse files
committed
Merge branch 'tests-refactor' of https://github.com/IgniteUI/igniteui-angular into tests-refactor
2 parents dce9df5 + 673a925 commit dd92df4

File tree

5 files changed

+93
-6
lines changed

5 files changed

+93
-6
lines changed

projects/igniteui-angular/src/lib/services/csv/char-separated-value-data.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@ export class CharSeparatedValueData {
5252
this._escapeCharacters.push(this._delimiter);
5353

5454
const headers = columns && columns.length ?
55-
columns.map(c => c.header ?? c.field) :
55+
/* When column groups are present, always use the field as it indicates the group the column belongs to.
56+
* Otherwise, in PivotGrid scenarios we can end up with many duplicated column names without a hint what they represent.
57+
*/
58+
columns.map(c => c.columnGroupParent ? c.field : c.header ?? c.field) :
5659
keys;
5760

5861
this._headerRecord = this.processHeaderRecord(headers, this._data.length);

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ import { FilteringExpressionsTree } from '../../data-operations/filtering-expres
2121
import { FilteringLogic } from '../../data-operations/filtering-expression.interface';
2222
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
2323
import { wait } from '../../test-utils/ui-interactions.spec';
24+
import { IgxPivotGridComponent } from '../../grids/pivot-grid/pivot-grid.component';
25+
import { IgxPivotGridTestBaseComponent } from '../../test-utils/pivot-grid-samples.spec';
26+
import { IgxPivotNumericAggregate } from '../../grids/pivot-grid/pivot-grid-aggregate';
2427

2528
describe('CSV Grid Exporter', () => {
2629
let exporter: IgxCsvExporterService;
@@ -516,6 +519,48 @@ describe('CSV Grid Exporter', () => {
516519
});
517520
});
518521

522+
describe('Pivot Grid CSV export', () => {
523+
let fix;
524+
let pivotGrid: IgxPivotGridComponent;
525+
beforeEach(() => {
526+
fix = TestBed.createComponent(IgxPivotGridTestBaseComponent);
527+
fix.detectChanges();
528+
pivotGrid = fix.componentInstance.pivotGrid;
529+
pivotGrid.pivotConfiguration = {
530+
columns: [
531+
{
532+
enabled: true,
533+
memberName: 'Country'
534+
}
535+
],
536+
rows: [
537+
{
538+
enabled: true,
539+
memberName: 'ProductCategory'
540+
}
541+
],
542+
values: [
543+
{
544+
enabled: true,
545+
member: 'UnitsSold',
546+
aggregate: {
547+
aggregator: IgxPivotNumericAggregate.sum,
548+
key: 'SUM',
549+
label: 'Sum',
550+
},
551+
}
552+
]
553+
};
554+
fix.detectChanges();
555+
});
556+
557+
it('should export pivot grid successfully.', async () => {
558+
await wait();
559+
const wrapper = await getExportedData(pivotGrid, options);
560+
wrapper.verifyData(wrapper.pivotGridData);
561+
});
562+
});
563+
519564
const getExportedData = (grid, csvOptions: IgxCsvExporterOptions) => {
520565
const result = new Promise<CSVWrapper>((resolve) => {
521566
exporter.exportEnded.pipe(first()).subscribe((value) => {

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

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { EventEmitter, Injectable } from '@angular/core';
2-
import { DEFAULT_OWNER, IExportRecord, IgxBaseExporter } from '../exporter-common/base-export-service';
2+
import { DEFAULT_OWNER, ExportHeaderType, IColumnInfo, IExportRecord, IgxBaseExporter } from '../exporter-common/base-export-service';
33
import { ExportUtilities } from '../exporter-common/export-utilities';
44
import { CharSeparatedValueData } from './char-separated-value-data';
55
import { CsvFileTypes, IgxCsvExporterOptions } from './csv-exporter-options';
@@ -50,10 +50,29 @@ export class IgxCsvExporterService extends IgxBaseExporter {
5050
private _stringData: string;
5151

5252
protected exportDataImplementation(data: IExportRecord[], options: IgxCsvExporterOptions, done: () => void) {
53-
data = data.map((item) => item.data);
53+
const dimensionKeys = data[0]?.dimensionKeys;
54+
data = dimensionKeys?.length ?
55+
data.map((item) => item.rawData):
56+
data.map((item) => item.data);
5457
const columnList = this._ownersMap.get(DEFAULT_OWNER);
58+
const columns = columnList?.columns.filter(c => c.headerType === ExportHeaderType.ColumnHeader);
59+
if (dimensionKeys) {
60+
const dimensionCols = dimensionKeys.map((key) => {
61+
const columnInfo: IColumnInfo = {
62+
header: key,
63+
field: key,
64+
dataType: 'string',
65+
skip: false,
66+
headerType: ExportHeaderType.ColumnHeader,
67+
columnSpan: 1,
68+
startIndex: 0
69+
};
70+
return columnInfo;
71+
});
72+
columns.unshift(...dimensionCols);
73+
}
5574

56-
const csvData = new CharSeparatedValueData(data, options.valueDelimiter, columnList?.columns);
75+
const csvData = new CharSeparatedValueData(data, options.valueDelimiter, columns);
5776
csvData.prepareDataAsync((r) => {
5877
this._stringData = r;
5978
this.saveFile(options);

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,4 +288,12 @@ export class CSVWrapper {
288288
`B's Beverages${this._delimiter}Victoria Ashworth${this._delimiter}Fauntleroy Circus${this._delimiter}0${this._delimiter}` +
289289
`2500${this._delimiter}5000${this._eor}`;
290290
}
291+
292+
public get pivotGridData() {
293+
return `ProductCategory${this._delimiter}Bulgaria${this._delimiter}USA${this._delimiter}Uruguay${this._eor}` +
294+
`Accessories${this._delimiter}${this._delimiter}293${this._delimiter}${this._eor}` +
295+
`Bikes${this._delimiter}${this._delimiter}${this._delimiter}68${this._eor}` +
296+
`Clothing${this._delimiter}774${this._delimiter}296${this._delimiter}456${this._eor}` +
297+
`Components${this._delimiter}${this._delimiter}240${this._delimiter}${this._eor}`;
298+
}
291299
}

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ export interface IExportRecord {
4444
summaryKey?: string;
4545
hierarchicalOwner?: string;
4646
references?: IColumnInfo[];
47+
/* Adding `rawData` and `dimesnionKeys` properties to support properly exporting pivot grid data to CSV. */
48+
rawData?: any;
49+
dimensionKeys?: string[];
4750
}
4851

4952
export interface IColumnList {
@@ -448,13 +451,18 @@ export abstract class IgxBaseExporter {
448451
if (!isSpecialData) {
449452
const owner = record.owner === undefined ? DEFAULT_OWNER : record.owner;
450453
const ownerCols = this._ownersMap.get(owner).columns;
454+
const hasRowHeaders = ownerCols.some(c => c.headerType === ExportHeaderType.RowHeader);
451455

452456
if (record.type !== ExportRecordType.HeaderRecord) {
453457
const columns = ownerCols
454458
.filter(c => c.headerType === ExportHeaderType.ColumnHeader && !c.skip)
455459
.sort((a, b) => a.startIndex - b.startIndex)
456460
.sort((a, b) => a.pinnedIndex - b.pinnedIndex);
457461

462+
if (hasRowHeaders) {
463+
record.rawData = record.data;
464+
}
465+
458466
record.data = columns.reduce((a, e) => {
459467
if (!e.skip) {
460468
let rawValue = resolveNestedPath(record.data, e.field);
@@ -592,6 +600,10 @@ export abstract class IgxBaseExporter {
592600

593601
this.flatRecords.push(pivotGridRecord);
594602
}
603+
604+
if (this.flatRecords.length) {
605+
this.flatRecords[0].dimensionKeys = Object.values(this.pivotGridRowDimensionsMap);
606+
}
595607
}
596608

597609
private prepareHierarchicalGridData(grid: GridType, hasFiltering: boolean, hasSorting: boolean) {
@@ -1342,8 +1354,8 @@ export abstract class IgxBaseExporter {
13421354

13431355
for (const k of Object.keys(groupedRecords)) {
13441356
groupedRecords[k] = groupedRecords[k].filter(row => mapKeys.every(mk => Object.keys(row).includes(mk))
1345-
&& mapValues.every(mv => Object.values(row).includes(mv)));
1346-
1357+
&& mapValues.every(mv => Object.values(row).includes(mv)));
1358+
13471359
if (groupedRecords[k].length === 0) {
13481360
delete groupedRecords[k];
13491361
}

0 commit comments

Comments
 (0)