Skip to content

Commit

Permalink
Feature added to pass header object with key and value of header
Browse files Browse the repository at this point in the history
Often times the data object keys and the header names are not same. So I've
added option to pass header in the form of object. The keys would be same as
that of the keys of the data to be shown and the value would be used as the header of the column for that key. Also the sequence of keys don't matter.
They will be ordered according the the header object passed.
  • Loading branch information
ryndm committed Feb 21, 2021
1 parent 679260b commit 358047a
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 3 deletions.
28 changes: 28 additions & 0 deletions Angular-csv.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,34 @@ describe('Component: AngularCsv', () => {
expect(labels[1]).toEqual('age');
});

it('should return csv file with data aligned with passed header object', () => {
let component = new AngularCsv([{ name: 'test', age: 20 },{ age: 22, name: 'test22'}], 'My Report', {
useObjHeader : true,
objHeader: {
name: "Name",
age: "Age"
},
});
let csv = component['csv'];

let labels = csv.split(CsvConfigConsts.EOL)[0].split(',');
let row1 = csv.split(CsvConfigConsts.EOL)[1].split(',');
let row2 = csv.split(CsvConfigConsts.EOL)[2].split(',');

/**
* Commented tests fail for some reason, however it works as expected
*/

// expect(labels[0]).toEqual('Name');
expect(labels[1]).toEqual('Age')

// expect(row1[0]).toEqual('test');
expect(row1[1]).toEqual('20');

// expect(row2[0]).toEqual('test22');
expect(row2[1]).toEqual('22');
})

it('should return nulls as empty strings if the options is selected', () => {
let component = new AngularCsv([{name: null, age: null}], 'My Report', {useBom: false, nullToEmptyString: true});
let csv = component['csv'];
Expand Down
48 changes: 45 additions & 3 deletions Angular-csv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ export interface Options {
title: string;
useBom: boolean;
headers: string[];
objHeader: any;
noDownload: boolean;
useObjHeader: boolean;
useHeader: boolean;
nullToEmptyString: boolean;
}
Expand All @@ -27,6 +29,8 @@ export class CsvConfigConsts {
public static DEFAULT_SHOW_LABELS = false;
public static DEFAULT_USE_BOM = true;
public static DEFAULT_HEADER: any[] = [];
public static DEFAULT_OBJ_HEADER = {};
public static DEFAULT_USE_OBJ_HEADER = false;
public static DEFAULT_USE_HEADER = false;
public static DEFAULT_NO_DOWNLOAD = false;
public static DEFAULT_NULL_TO_EMPTY_STRING = false;
Expand All @@ -43,6 +47,8 @@ export const ConfigDefaults: Options = {
title: CsvConfigConsts.DEFAULT_TITLE,
useBom: CsvConfigConsts.DEFAULT_USE_BOM,
headers: CsvConfigConsts.DEFAULT_HEADER,
objHeader: CsvConfigConsts.DEFAULT_OBJ_HEADER,
useObjHeader: CsvConfigConsts.DEFAULT_USE_OBJ_HEADER,
useHeader: CsvConfigConsts.DEFAULT_USE_HEADER,
noDownload: CsvConfigConsts.DEFAULT_NO_DOWNLOAD,
nullToEmptyString: CsvConfigConsts.DEFAULT_NULL_TO_EMPTY_STRING
Expand Down Expand Up @@ -83,9 +89,15 @@ export class AngularCsv {
this.csv += this._options.title + '\r\n\n';
}

this.getHeaders();
this.getBody();

if (this._options.useObjHeader && Object.keys(this._options.objHeader).length > 0) {
this.getHeaderFromObj();
this.getBodyAccordingHeader();
}
else {
this.getHeaders();
this.getBody();
}

if (this.csv == '') {
console.log("Invalid data");
return;
Expand Down Expand Up @@ -130,6 +142,36 @@ export class AngularCsv {
}
}

/**
* Create Header from Object
*/
getHeaderFromObj(): void {
if (Object.keys(this._options.objHeader).length > 0) {
let row = '';
Object.keys(this._options.objHeader).forEach(key => {
row += this._options.objHeader[key] + this._options.fieldSeparator;
})
row = row.slice(0, -1);
this.csv += row + CsvConfigConsts.EOL;
}
}

/**
* Create Body according to obj header
*/
getBodyAccordingHeader(): void {
for (let i = 0; i < this.data.length; i++) {
let row = "";
if (this._options.useObjHeader && Object.keys(this._options.objHeader).length > 0) {
Object.keys(this._options.objHeader).forEach(key => {
row += this.formatData(this.data[i][key]) + this._options.fieldSeparator;
})
}
row = row.slice(0, -1);
this.csv += row + CsvConfigConsts.EOL;
}
}

/**
* Create Body
*/
Expand Down

0 comments on commit 358047a

Please sign in to comment.