Skip to content

Commit 48c6e32

Browse files
committed
fix(PivotCSV): Fixed exporter when row dimensions exist.
1 parent 4b4d90a commit 48c6e32

File tree

3 files changed

+38
-8
lines changed

3 files changed

+38
-8
lines changed

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ export class CharSeparatedValueData {
4343
}
4444

4545
public prepareDataAsync(done: (result: string) => void) {
46-
const columns = this.columns?.filter(c => c.headerType !== ExportHeaderType.MultiColumnHeader)
47-
.filter(c => !c.skip)
46+
const columns = this.columns?.filter(c => !c.skip)
4847
.sort((a, b) => a.startIndex - b.startIndex)
4948
.sort((a, b) => a.pinnedIndex - b.pinnedIndex);
5049
const keys = columns && columns.length ? columns.map(c => c.field) : ExportUtilities.getKeysFromData(this._data);
@@ -54,7 +53,7 @@ export class CharSeparatedValueData {
5453

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

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