Skip to content

Commit e9f3216

Browse files
authored
Merge branch 'master' into dpetev/migration-tsconfig-fix
2 parents 448f114 + 85cb244 commit e9f3216

File tree

9 files changed

+116
-12
lines changed

9 files changed

+116
-12
lines changed

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ExportUtilities } from '../exporter-common/export-utilities';
22
import { yieldingLoop } from '../../core/utils';
3+
import { IColumnInfo } from '../exporter-common/base-export-service';
34

45
/**
56
* @hidden
@@ -13,7 +14,7 @@ export class CharSeparatedValueData {
1314
private _delimiterLength = 1;
1415
private _isSpecialData = false;
1516

16-
constructor(private _data: any[], valueDelimiter: string) {
17+
constructor(private _data: any[], valueDelimiter: string, private columns: IColumnInfo[] = []) {
1718
this.setDelimiter(valueDelimiter);
1819
}
1920

@@ -46,7 +47,10 @@ export class CharSeparatedValueData {
4647
done('');
4748
}
4849

49-
const keys = ExportUtilities.getKeysFromData(this._data);
50+
const columns = this.columns?.filter(c => !c.skip)
51+
.sort((a, b) => a.startIndex - b.startIndex)
52+
.sort((a, b) => a.pinnedIndex - b.pinnedIndex);
53+
const keys = columns && columns.length ? columns.map(c => c.field) : ExportUtilities.getKeysFromData(this._data);
5054

5155
if (keys.length === 0) {
5256
done('');
@@ -55,7 +59,11 @@ export class CharSeparatedValueData {
5559
this._isSpecialData = ExportUtilities.isSpecialData(this._data[0]);
5660
this._escapeCharacters.push(this._delimiter);
5761

58-
this._headerRecord = this.processHeaderRecord(keys);
62+
const headers = columns && columns.length ?
63+
columns.map(c => c.header ?? c.field) :
64+
keys;
65+
66+
this._headerRecord = this.processHeaderRecord(headers);
5967
this.processDataRecordsAsync(this._data, keys, (dr) => {
6068
done(this._headerRecord + dr);
6169
});

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ import { CsvFileTypes, IgxCsvExporterOptions } from './csv-exporter-options';
1010
import { CSVWrapper } from './csv-verification-wrapper.spec';
1111
import { IgxTreeGridPrimaryForeignKeyComponent } from '../../test-utils/tree-grid-components.spec';
1212
import { IgxTreeGridModule, IgxTreeGridComponent } from '../../grids/tree-grid/public_api';
13-
import { ReorderedColumnsComponent, GridIDNameJobTitleComponent, ProductsComponent } from '../../test-utils/grid-samples.spec';
13+
import { ReorderedColumnsComponent,
14+
GridIDNameJobTitleComponent,
15+
ProductsComponent,
16+
ColumnsAddedOnInitComponent } from '../../test-utils/grid-samples.spec';
1417
import { SampleTestData } from '../../test-utils/sample-test-data.spec';
1518
import { first } from 'rxjs/operators';
1619
import { DefaultSortingStrategy } from '../../data-operations/sorting-strategy';
@@ -33,7 +36,8 @@ describe('CSV Grid Exporter', () => {
3336
ReorderedColumnsComponent,
3437
GridIDNameJobTitleComponent,
3538
IgxTreeGridPrimaryForeignKeyComponent,
36-
ProductsComponent
39+
ProductsComponent,
40+
ColumnsAddedOnInitComponent
3741
],
3842
imports: [IgxGridModule, IgxTreeGridModule, NoopAnimationsModule]
3943
})
@@ -365,6 +369,16 @@ describe('CSV Grid Exporter', () => {
365369
wrapper.verifyData(wrapper.gridWithAdvancedFilters, 'Should export only filtered data.');
366370
});
367371

372+
it('should map dynamically added data & columns properly (#9872).', async () => {
373+
const fix = TestBed.createComponent(ColumnsAddedOnInitComponent);
374+
fix.detectChanges();
375+
await wait();
376+
377+
const grid = fix.componentInstance.grid;
378+
const wrapper = await getExportedData(grid, options);
379+
wrapper.verifyData(wrapper.gridColumnsAddedOnInit, 'Columns should be exported in the same order as in the grid!');
380+
});
381+
368382
describe('', () => {
369383
let fix;
370384
let treeGrid: IgxTreeGridComponent;

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { EventEmitter, Injectable } from '@angular/core';
2-
import { IExportRecord, IgxBaseExporter } from '../exporter-common/base-export-service';
2+
import { DEFAULT_OWNER, 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';
@@ -49,7 +49,9 @@ export class IgxCsvExporterService extends IgxBaseExporter {
4949

5050
protected exportDataImplementation(data: IExportRecord[], options: IgxCsvExporterOptions, done: () => void) {
5151
data = data.map((item) => item.data);
52-
const csvData = new CharSeparatedValueData(data, options.valueDelimiter);
52+
const columnList = this._ownersMap.get(DEFAULT_OWNER);
53+
54+
const csvData = new CharSeparatedValueData(data, options.valueDelimiter, columnList?.columns);
5355
csvData.prepareDataAsync((r) => {
5456
this._stringData = r;
5557
this.saveFile(options);

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,4 +261,31 @@ export class CSVWrapper {
261261
`6${this._delimiter}-1${this._delimiter}Erma Walsh${this._delimiter}CEO${this._delimiter}52${this._eor}` +
262262
`10${this._delimiter}-1${this._delimiter}Eduardo Ramirez${this._delimiter}Manager${this._delimiter}53${this._eor}`;
263263
}
264+
265+
public get gridColumnsAddedOnInit() {
266+
return `CompanyName${this._delimiter}ContactName${this._delimiter}Address${this._delimiter}0${this._delimiter}` +
267+
`1${this._delimiter}2${this._eor}` +
268+
`Alfreds Futterkiste${this._delimiter}Maria Anders${this._delimiter}Obere Str. 57${this._delimiter}0${this._delimiter}` +
269+
`2500${this._delimiter}5000${this._eor}` +
270+
`Ana Trujillo Emparedados y helados${this._delimiter}Ana Trujillo${this._delimiter}Avda. de la Constitución 2222` +
271+
`${this._delimiter}0${this._delimiter}2500${this._delimiter}5000${this._eor}` +
272+
`Antonio Moreno Taquería${this._delimiter}Antonio Moreno${this._delimiter}Mataderos 2312${this._delimiter}0` +
273+
`${this._delimiter}2500${this._delimiter}5000${this._eor}` +
274+
`Around the Horn${this._delimiter}Thomas Hardy${this._delimiter}120 Hanover Sq.${this._delimiter}0${this._delimiter}` +
275+
`2500${this._delimiter}5000${this._eor}` +
276+
`Berglunds snabbköp${this._delimiter}Christina Berglund${this._delimiter}Berguvsvägen 8${this._delimiter}0` +
277+
`${this._delimiter}2500${this._delimiter}5000${this._eor}` +
278+
`Blauer See Delikatessen${this._delimiter}Hanna Moos${this._delimiter}Forsterstr. 57${this._delimiter}0${this._delimiter}` +
279+
`2500${this._delimiter}5000${this._eor}` +
280+
`Blondesddsl père et fils${this._delimiter}Frédérique Citeaux${this._delimiter}"24${this._delimiter} place Kléber"` +
281+
`${this._delimiter}0${this._delimiter}2500${this._delimiter}5000${this._eor}` +
282+
`Bólido Comidas preparadas${this._delimiter}Martín Sommer${this._delimiter}"C/ Araquil${this._delimiter} 67"` +
283+
`${this._delimiter}0${this._delimiter}2500${this._delimiter}5000${this._eor}` +
284+
`Bon app'${this._delimiter}Laurence Lebihan${this._delimiter}"12${this._delimiter} rue des Bouchers"${this._delimiter}` +
285+
`0${this._delimiter}2500${this._delimiter}5000${this._eor}` +
286+
`Bottom-Dollar Markets${this._delimiter}Elizabeth Lincoln${this._delimiter}23 Tsawassen Blvd.${this._delimiter}0` +
287+
`${this._delimiter}2500${this._delimiter}5000${this._eor}` +
288+
`B's Beverages${this._delimiter}Victoria Ashworth${this._delimiter}Fauntleroy Circus${this._delimiter}0${this._delimiter}` +
289+
`2500${this._delimiter}5000${this._eor}`;
290+
}
264291
}

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ import {
1616
GridHireDateComponent,
1717
GridExportGroupedDataComponent,
1818
MultiColumnHeadersExportComponent,
19-
GridWithEmptyColumnsComponent
19+
GridWithEmptyColumnsComponent,
20+
ColumnsAddedOnInitComponent
2021
} from '../../test-utils/grid-samples.spec';
2122
import { SampleTestData } from '../../test-utils/sample-test-data.spec';
2223
import { first } from 'rxjs/operators';
@@ -59,7 +60,8 @@ describe('Excel Exporter', () => {
5960
GridExportGroupedDataComponent,
6061
IgxHierarchicalGridExportComponent,
6162
MultiColumnHeadersExportComponent,
62-
IgxHierarchicalGridMultiColumnHeadersExportComponent
63+
IgxHierarchicalGridMultiColumnHeadersExportComponent,
64+
ColumnsAddedOnInitComponent
6365
],
6466
imports: [IgxGridModule, IgxTreeGridModule, IgxHierarchicalGridModule, NoopAnimationsModule]
6567
}).compileComponents();
@@ -691,6 +693,15 @@ describe('Excel Exporter', () => {
691693

692694
await exportAndVerify(grid, options, actualData.exportGroupedDataWithIgnoreGrouping);
693695
});
696+
697+
it('should map dynamically added data & columns properly (#9872).', async () => {
698+
const fix = TestBed.createComponent(ColumnsAddedOnInitComponent);
699+
fix.detectChanges();
700+
await wait();
701+
702+
const grid = fix.componentInstance.grid;
703+
await exportAndVerify(grid, options, actualData.columnsAddedOnInit);
704+
});
694705
});
695706

696707
describe('', () => {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ export class IgxExcelExporterService extends IgxBaseExporter {
110110
.map(a => this._ownersMap.get(a.owner).columns.length + a.level)
111111
.sort((a,b) => b - a)[0];
112112

113-
rootKeys = this._ownersMap.get(firstDataElement.owner).columns.map(c => c.header);
113+
rootKeys = this._ownersMap.get(firstDataElement.owner).columns.map(c => c.field);
114114
defaultOwner = this._ownersMap.get(firstDataElement.owner);
115115
} else {
116116
defaultOwner = this._ownersMap.get(DEFAULT_OWNER);
@@ -119,7 +119,7 @@ export class IgxExcelExporterService extends IgxBaseExporter {
119119
columnWidths = defaultOwner.columnWidths;
120120
indexOfLastPinnedColumn = defaultOwner.indexOfLastPinnedColumn;
121121
columnCount = columns.length;
122-
rootKeys = columns.map(c => c.header);
122+
rootKeys = columns.map(c => c.field);
123123
}
124124
}
125125

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,4 +1327,22 @@ export class FileContentData {
13271327

13281328
return this.createData();
13291329
}
1330+
1331+
public get columnsAddedOnInit() {
1332+
this._sharedStringsData =
1333+
`count="39" uniqueCount="39"><si><t>CompanyName</t></si><si><t>ContactName</t></si><si><t>Address</t></si><si><t>0</t></si><si><t>1</t></si><si><t>2</t></si><si><t>Alfreds Futterkiste</t></si><si><t>Maria Anders</t></si><si><t>Obere Str. 57</t></si><si><t>Ana Trujillo Emparedados y helados</t></si><si><t>Ana Trujillo</t></si><si><t>Avda. de la Constitución 2222</t></si><si><t>Antonio Moreno Taquería</t></si><si><t>Antonio Moreno</t></si><si><t>Mataderos 2312</t></si><si><t>Around the Horn</t></si><si><t>Thomas Hardy</t></si><si><t>120 Hanover Sq.</t></si><si><t>Berglunds snabbköp</t></si><si><t>Christina Berglund</t></si><si><t>Berguvsvägen 8</t></si><si><t>Blauer See Delikatessen</t></si><si><t>Hanna Moos</t></si><si><t>Forsterstr. 57</t></si><si><t>Blondesddsl père et fils</t></si><si><t>Frédérique Citeaux</t></si><si><t>24, place Kléber</t></si><si><t>Bólido Comidas preparadas</t></si><si><t>Martín Sommer</t></si><si><t>C/ Araquil, 67</t></si><si><t>Bon app&apos;</t></si><si><t>Laurence Lebihan</t></si><si><t>12, rue des Bouchers</t></si><si><t>Bottom-Dollar Markets</t></si><si><t>Elizabeth Lincoln</t></si><si><t>23 Tsawassen Blvd.</t></si><si><t>B&apos;s Beverages</t></si><si><t>Victoria Ashworth</t></si><si><t>Fauntleroy Circus</t></si>`;
1334+
1335+
this._tableData =
1336+
`ref="A1:F12" totalsRowShown="0">
1337+
<autoFilter ref="A1:F12"/><tableColumns count="6"><tableColumn id="1" name="CompanyName"/><tableColumn id="2" name="ContactName"/><tableColumn id="3" name="Address"/><tableColumn id="4" name="0"/><tableColumn id="5" name="1"/><tableColumn id="6" name="2"/></tableColumns>`;
1338+
1339+
this._worksheetData =
1340+
`<dimension ref="A1:F12"/>
1341+
<sheetViews><sheetView tabSelected="1" workbookViewId="0"></sheetView></sheetViews>
1342+
<sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/>
1343+
<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"/><col min="6" max="6" width="50" customWidth="1"/></cols>
1344+
<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><c r="F1" t="s"><v>5</v></c></row><row r="2"><c r="A2" t="s"><v>6</v></c><c r="B2" t="s"><v>7</v></c><c r="C2" t="s"><v>8</v></c><c r="D2" s="1"><v>0</v></c><c r="E2" s="1"><v>2500</v></c><c r="F2" s="1"><v>5000</v></c></row><row r="3"><c r="A3" t="s"><v>9</v></c><c r="B3" t="s"><v>10</v></c><c r="C3" t="s"><v>11</v></c><c r="D3" s="1"><v>0</v></c><c r="E3" s="1"><v>2500</v></c><c r="F3" s="1"><v>5000</v></c></row><row r="4"><c r="A4" t="s"><v>12</v></c><c r="B4" t="s"><v>13</v></c><c r="C4" t="s"><v>14</v></c><c r="D4" s="1"><v>0</v></c><c r="E4" s="1"><v>2500</v></c><c r="F4" s="1"><v>5000</v></c></row><row r="5"><c r="A5" t="s"><v>15</v></c><c r="B5" t="s"><v>16</v></c><c r="C5" t="s"><v>17</v></c><c r="D5" s="1"><v>0</v></c><c r="E5" s="1"><v>2500</v></c><c r="F5" s="1"><v>5000</v></c></row><row r="6"><c r="A6" t="s"><v>18</v></c><c r="B6" t="s"><v>19</v></c><c r="C6" t="s"><v>20</v></c><c r="D6" s="1"><v>0</v></c><c r="E6" s="1"><v>2500</v></c><c r="F6" s="1"><v>5000</v></c></row><row r="7"><c r="A7" t="s"><v>21</v></c><c r="B7" t="s"><v>22</v></c><c r="C7" t="s"><v>23</v></c><c r="D7" s="1"><v>0</v></c><c r="E7" s="1"><v>2500</v></c><c r="F7" s="1"><v>5000</v></c></row><row r="8"><c r="A8" t="s"><v>24</v></c><c r="B8" t="s"><v>25</v></c><c r="C8" t="s"><v>26</v></c><c r="D8" s="1"><v>0</v></c><c r="E8" s="1"><v>2500</v></c><c r="F8" s="1"><v>5000</v></c></row><row r="9"><c r="A9" t="s"><v>27</v></c><c r="B9" t="s"><v>28</v></c><c r="C9" t="s"><v>29</v></c><c r="D9" s="1"><v>0</v></c><c r="E9" s="1"><v>2500</v></c><c r="F9" s="1"><v>5000</v></c></row><row r="10"><c r="A10" t="s"><v>30</v></c><c r="B10" t="s"><v>31</v></c><c r="C10" t="s"><v>32</v></c><c r="D10" s="1"><v>0</v></c><c r="E10" s="1"><v>2500</v></c><c r="F10" s="1"><v>5000</v></c></row><row r="11"><c r="A11" t="s"><v>33</v></c><c r="B11" t="s"><v>34</v></c><c r="C11" t="s"><v>35</v></c><c r="D11" s="1"><v>0</v></c><c r="E11" s="1"><v>2500</v></c><c r="F11" s="1"><v>5000</v></c></row><row r="12"><c r="A12" t="s"><v>36</v></c><c r="B12" t="s"><v>37</v></c><c r="C12" t="s"><v>38</v></c><c r="D12" s="1"><v>0</v></c><c r="E12" s="1"><v>2500</v></c><c r="F12" s="1"><v>5000</v></c></row></sheetData>`;
1345+
1346+
return this.createData();
1347+
}
13301348
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ export abstract class IgxBaseExporter {
375375
rawValue = rawValue.toString();
376376
}
377377

378-
a[e.header] = shouldApplyFormatter ? e.formatter(rawValue) : rawValue;
378+
a[e.field] = shouldApplyFormatter ? e.formatter(rawValue) : rawValue;
379379
}
380380
return a;
381381
}, {});

projects/igniteui-angular/src/lib/test-utils/grid-samples.spec.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2436,3 +2436,27 @@ export class GridWithEmptyColumnsComponent {
24362436

24372437
public data = SampleTestData.personJobDataFull();
24382438
}
2439+
2440+
/** Issue 9872 */
2441+
@Component({
2442+
template: GridTemplateStrings.declareGrid('', '', ColumnDefinitions.generatedWithDataType)
2443+
})
2444+
export class ColumnsAddedOnInitComponent extends BasicGridComponent implements OnInit {
2445+
public columns = [];
2446+
public data = [];
2447+
public ngOnInit(): void {
2448+
this.columns = [
2449+
{ field: 'CompanyName' },
2450+
{ field: 'ContactName' },
2451+
{ field: 'Address' }];
2452+
this.data = SampleTestData.contactInfoData();
2453+
2454+
for (let i = 0; i < 3; i++) {
2455+
this.columns.push({ field: i.toString() }); //add columns for the horizon
2456+
this.data.forEach(
2457+
c => (c[i] = i * 2500)
2458+
); //add random quantity to each customer for each period in the horizon
2459+
}
2460+
}
2461+
2462+
}

0 commit comments

Comments
 (0)