@ctrl/ngx-csv 2.1.1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -23
- package/csv.directive.d.ts +4 -3
- package/csv.module.d.ts +5 -0
- package/ctrl-ngx-csv.d.ts +1 -0
- package/esm2020/csv.directive.mjs +50 -0
- package/esm2020/csv.module.mjs +16 -0
- package/esm2020/ctrl-ngx-csv.mjs +5 -0
- package/esm2020/public_api.mjs +4 -0
- package/esm2020/util.mjs +53 -0
- package/fesm2015/{ctrl-ngx-csv.js → ctrl-ngx-csv.mjs} +43 -71
- package/fesm2015/ctrl-ngx-csv.mjs.map +1 -0
- package/fesm2020/ctrl-ngx-csv.mjs +122 -0
- package/fesm2020/ctrl-ngx-csv.mjs.map +1 -0
- package/package.json +23 -15
- package/bundles/ctrl-ngx-csv.umd.js +0 -383
- package/bundles/ctrl-ngx-csv.umd.js.map +0 -1
- package/bundles/ctrl-ngx-csv.umd.min.js +0 -16
- package/bundles/ctrl-ngx-csv.umd.min.js.map +0 -1
- package/ctrl-ngx-csv.metadata.json +0 -1
- package/esm2015/csv.directive.js +0 -83
- package/esm2015/csv.module.js +0 -13
- package/esm2015/ctrl-ngx-csv.js +0 -5
- package/esm2015/public_api.js +0 -4
- package/esm2015/util.js +0 -53
- package/esm5/csv.directive.js +0 -88
- package/esm5/csv.module.js +0 -16
- package/esm5/ctrl-ngx-csv.js +0 -5
- package/esm5/public_api.js +0 -4
- package/esm5/util.js +0 -67
- package/fesm2015/ctrl-ngx-csv.js.map +0 -1
- package/fesm5/ctrl-ngx-csv.js +0 -171
- package/fesm5/ctrl-ngx-csv.js.map +0 -1
package/README.md
CHANGED
@@ -1,22 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
</a>
|
7
|
-
<a href="https://travis-ci.org/TypeCtrl/ngx-csv">
|
8
|
-
<img src="https://travis-ci.org/TypeCtrl/ngx-csv.svg?branch=master" alt="travis">
|
9
|
-
</a>
|
10
|
-
<a href="https://codecov.io/github/typectrl/ngx-csv">
|
11
|
-
<img src="https://img.shields.io/codecov/c/github/typectrl/ngx-csv.svg" alt="codecov">
|
12
|
-
</a>
|
13
|
-
<br>
|
14
|
-
<br>
|
15
|
-
</div>
|
1
|
+
# @ctrl/ngx-csv
|
2
|
+
|
3
|
+
[](https://www.npmjs.com/package/@ctrl/ngx-csv)
|
4
|
+
[](https://circleci.com/gh/scttcper/ngx-csv)
|
5
|
+
[](https://codecov.io/gh/scttcper/ngx-csv)
|
16
6
|
|
17
7
|
> Easily generate a CSV download in the browser with Angular
|
18
8
|
|
19
|
-
**Demo**: https://ngx-csv.
|
9
|
+
**Demo**: https://ngx-csv.vercel.app
|
20
10
|
|
21
11
|
### Install
|
22
12
|
|
@@ -24,6 +14,17 @@
|
|
24
14
|
npm install @ctrl/ngx-csv
|
25
15
|
```
|
26
16
|
|
17
|
+
## Dependencies
|
18
|
+
|
19
|
+
Latest version available for each version of Angular
|
20
|
+
|
21
|
+
| ngx-trend | Angular |
|
22
|
+
| --------- | ------- |
|
23
|
+
| 2.1.1 | 8.x |
|
24
|
+
| 3.0.1 | 9.x |
|
25
|
+
| 4.0.0 | 10.x |
|
26
|
+
| current | >= 12.x |
|
27
|
+
|
27
28
|
### Import
|
28
29
|
|
29
30
|
```ts
|
@@ -40,12 +41,12 @@ Add the csvLink directive to your `<a>` tag
|
|
40
41
|
|
41
42
|
### Input
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
- **data**: The body of the csv
|
45
|
+
- **headers**: Set the first line of the csv
|
46
|
+
- **delimiter**: Set the seperator between values. Default `','`
|
47
|
+
- **filename**: Set the filename of the csv. Default `data.csv`
|
48
|
+
- **uFEFF**: Adds a Byte order mark to setup the csv as UTF-8. Default `true`
|
49
|
+
- **target**: Element target. Default `\_blank
|
49
50
|
|
50
51
|
### Accepted Data Formats
|
51
52
|
|
@@ -106,4 +107,4 @@ const data = [
|
|
106
107
|
|
107
108
|
### See Also
|
108
109
|
|
109
|
-
|
110
|
+
- [react-csv](https://github.com/abdennour/react-csv)
|
package/csv.directive.d.ts
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import { OnChanges } from '@angular/core';
|
2
2
|
import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
|
3
3
|
import { HeaderObj } from './util';
|
4
|
+
import * as i0 from "@angular/core";
|
4
5
|
export declare class CsvDirective implements OnChanges {
|
5
6
|
private sanitizer;
|
6
7
|
/** the body of the csv */
|
@@ -12,7 +13,7 @@ export declare class CsvDirective implements OnChanges {
|
|
12
13
|
/** Set the seperator between values */
|
13
14
|
delimiter: string;
|
14
15
|
/** Set the filename of the csv. Default is `data.csv` */
|
15
|
-
filename: string;
|
16
|
+
set filename(a: string);
|
16
17
|
/** adds a Byte order mark to setup the csv as UTF-8 */
|
17
18
|
uFEFF: boolean;
|
18
19
|
href?: SafeResourceUrl;
|
@@ -20,7 +21,7 @@ export declare class CsvDirective implements OnChanges {
|
|
20
21
|
download: string;
|
21
22
|
target: string;
|
22
23
|
constructor(sanitizer: DomSanitizer);
|
23
|
-
onClick(): void;
|
24
|
-
isIEBrowser(): boolean;
|
25
24
|
ngOnChanges(): void;
|
25
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CsvDirective, never>;
|
26
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<CsvDirective, "[csvLink]", never, { "data": "data"; "headers": "headers"; "delimiter": "delimiter"; "filename": "filename"; "uFEFF": "uFEFF"; "target": "target"; }, {}, never>;
|
26
27
|
}
|
package/csv.module.d.ts
CHANGED
@@ -1,2 +1,7 @@
|
|
1
|
+
import * as i0 from "@angular/core";
|
2
|
+
import * as i1 from "./csv.directive";
|
1
3
|
export declare class CsvModule {
|
4
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CsvModule, never>;
|
5
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<CsvModule, [typeof i1.CsvDirective], never, [typeof i1.CsvDirective]>;
|
6
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<CsvModule>;
|
2
7
|
}
|
package/ctrl-ngx-csv.d.ts
CHANGED
@@ -0,0 +1,50 @@
|
|
1
|
+
import { Directive, HostBinding, Input } from '@angular/core';
|
2
|
+
import { buildURI } from './util';
|
3
|
+
import * as i0 from "@angular/core";
|
4
|
+
import * as i1 from "@angular/platform-browser";
|
5
|
+
export class CsvDirective {
|
6
|
+
constructor(sanitizer) {
|
7
|
+
this.sanitizer = sanitizer;
|
8
|
+
/** the body of the csv */
|
9
|
+
this.data = [];
|
10
|
+
/** Set the seperator between values */
|
11
|
+
this.delimiter = ',';
|
12
|
+
/** adds a Byte order mark to setup the csv as UTF-8 */
|
13
|
+
this.uFEFF = true;
|
14
|
+
/** filename */
|
15
|
+
this.download = 'data.csv';
|
16
|
+
this.target = '_blank';
|
17
|
+
}
|
18
|
+
/** Set the filename of the csv. Default is `data.csv` */
|
19
|
+
set filename(a) {
|
20
|
+
this.download = a;
|
21
|
+
}
|
22
|
+
ngOnChanges() {
|
23
|
+
this.href = this.sanitizer.bypassSecurityTrustResourceUrl(buildURI(this.data, this.uFEFF, this.headers, this.delimiter));
|
24
|
+
}
|
25
|
+
}
|
26
|
+
CsvDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvDirective, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Directive });
|
27
|
+
CsvDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.0", type: CsvDirective, selector: "[csvLink]", inputs: { data: "data", headers: "headers", delimiter: "delimiter", filename: "filename", uFEFF: "uFEFF", target: "target" }, host: { properties: { "href": "this.href", "download": "this.download", "target": "this.target" } }, usesOnChanges: true, ngImport: i0 });
|
28
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvDirective, decorators: [{
|
29
|
+
type: Directive,
|
30
|
+
args: [{ selector: '[csvLink]' }]
|
31
|
+
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { data: [{
|
32
|
+
type: Input
|
33
|
+
}], headers: [{
|
34
|
+
type: Input
|
35
|
+
}], delimiter: [{
|
36
|
+
type: Input
|
37
|
+
}], filename: [{
|
38
|
+
type: Input
|
39
|
+
}], uFEFF: [{
|
40
|
+
type: Input
|
41
|
+
}], href: [{
|
42
|
+
type: HostBinding
|
43
|
+
}], download: [{
|
44
|
+
type: HostBinding
|
45
|
+
}], target: [{
|
46
|
+
type: Input
|
47
|
+
}, {
|
48
|
+
type: HostBinding
|
49
|
+
}] } });
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY3N2LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFHekUsT0FBTyxFQUFFLFFBQVEsRUFBYSxNQUFNLFFBQVEsQ0FBQzs7O0FBRzdDLE1BQU0sT0FBTyxZQUFZO0lBbUJ2QixZQUFvQixTQUF1QjtRQUF2QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBbEIzQywwQkFBMEI7UUFDakIsU0FBSSxHQUE4RCxFQUFFLENBQUM7UUFHOUUsdUNBQXVDO1FBQzlCLGNBQVMsR0FBRyxHQUFHLENBQUM7UUFNekIsd0RBQXdEO1FBQy9DLFVBQUssR0FBRyxJQUFJLENBQUM7UUFFdEIsZUFBZTtRQUNBLGFBQVEsR0FBRyxVQUFVLENBQUM7UUFDYixXQUFNLEdBQUcsUUFBUSxDQUFDO0lBRUksQ0FBQztJQVovQyx5REFBeUQ7SUFDekQsSUFDSSxRQUFRLENBQUMsQ0FBUztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBVUQsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsQ0FDdkQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDOUQsQ0FBQztJQUNKLENBQUM7O3lHQXpCVSxZQUFZOzZGQUFaLFlBQVk7MkZBQVosWUFBWTtrQkFEeEIsU0FBUzttQkFBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7bUdBR3pCLElBQUk7c0JBQVosS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFHRixRQUFRO3NCQURYLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUNTLElBQUk7c0JBQWxCLFdBQVc7Z0JBRUcsUUFBUTtzQkFBdEIsV0FBVztnQkFDWSxNQUFNO3NCQUE3QixLQUFLOztzQkFBSSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0QmluZGluZywgSW5wdXQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlUmVzb3VyY2VVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuaW1wb3J0IHsgYnVpbGRVUkksIEhlYWRlck9iaiB9IGZyb20gJy4vdXRpbCc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjc3ZMaW5rXScgfSlcbmV4cG9ydCBjbGFzcyBDc3ZEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKiogdGhlIGJvZHkgb2YgdGhlIGNzdiAqL1xuICBASW5wdXQoKSBkYXRhOiBzdHJpbmcgfCBzdHJpbmdbXVtdIHwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdIHwgYW55W10gPSBbXTtcbiAgLyoqIFNldCB0aGUgZmlyc3QgbGluZSBvZiB0aGUgY3N2ICovXG4gIEBJbnB1dCgpIGhlYWRlcnM/OiBzdHJpbmdbXSB8IEhlYWRlck9ialtdO1xuICAvKiogU2V0IHRoZSBzZXBlcmF0b3IgYmV0d2VlbiB2YWx1ZXMgKi9cbiAgQElucHV0KCkgZGVsaW1pdGVyID0gJywnO1xuICAvKiogU2V0IHRoZSBmaWxlbmFtZSBvZiB0aGUgY3N2LiBEZWZhdWx0IGlzIGBkYXRhLmNzdmAgKi9cbiAgQElucHV0KClcbiAgc2V0IGZpbGVuYW1lKGE6IHN0cmluZykge1xuICAgIHRoaXMuZG93bmxvYWQgPSBhO1xuICB9XG4gIC8qKiBhZGRzIGEgQnl0ZSBvcmRlciBtYXJrIHRvIHNldHVwIHRoZSBjc3YgYXMgVVRGLTggICovXG4gIEBJbnB1dCgpIHVGRUZGID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCkgaHJlZj86IFNhZmVSZXNvdXJjZVVybDtcbiAgLyoqIGZpbGVuYW1lICovXG4gIEBIb3N0QmluZGluZygpIGRvd25sb2FkID0gJ2RhdGEuY3N2JztcbiAgQElucHV0KCkgQEhvc3RCaW5kaW5nKCkgdGFyZ2V0ID0gJ19ibGFuayc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLmhyZWYgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoXG4gICAgICBidWlsZFVSSSh0aGlzLmRhdGEsIHRoaXMudUZFRkYsIHRoaXMuaGVhZGVycywgdGhpcy5kZWxpbWl0ZXIpLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import { NgModule } from '@angular/core';
|
2
|
+
import { CsvDirective } from './csv.directive';
|
3
|
+
import * as i0 from "@angular/core";
|
4
|
+
export class CsvModule {
|
5
|
+
}
|
6
|
+
CsvModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
7
|
+
CsvModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvModule, declarations: [CsvDirective], exports: [CsvDirective] });
|
8
|
+
CsvModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvModule });
|
9
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvModule, decorators: [{
|
10
|
+
type: NgModule,
|
11
|
+
args: [{
|
12
|
+
declarations: [CsvDirective],
|
13
|
+
exports: [CsvDirective],
|
14
|
+
}]
|
15
|
+
}] });
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY3N2Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFNL0MsTUFBTSxPQUFPLFNBQVM7O3NHQUFULFNBQVM7dUdBQVQsU0FBUyxpQkFITCxZQUFZLGFBQ2pCLFlBQVk7dUdBRVgsU0FBUzsyRkFBVCxTQUFTO2tCQUpyQixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDNUIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENzdkRpcmVjdGl2ZSB9IGZyb20gJy4vY3N2LmRpcmVjdGl2ZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW0NzdkRpcmVjdGl2ZV0sXG4gIGV4cG9ydHM6IFtDc3ZEaXJlY3RpdmVdLFxufSlcbmV4cG9ydCBjbGFzcyBDc3ZNb2R1bGUge31cbiJdfQ==
|
@@ -0,0 +1,5 @@
|
|
1
|
+
/**
|
2
|
+
* Generated bundle index. Do not edit.
|
3
|
+
*/
|
4
|
+
export * from './public_api';
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RybC1uZ3gtY3N2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jdHJsLW5neC1jc3YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWNfYXBpJztcbiJdfQ==
|
@@ -0,0 +1,4 @@
|
|
1
|
+
export { CsvModule } from './csv.module';
|
2
|
+
export { CsvDirective } from './csv.directive';
|
3
|
+
export * from './util';
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcHVibGljX2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxjQUFjLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENzdk1vZHVsZSB9IGZyb20gJy4vY3N2Lm1vZHVsZSc7XG5leHBvcnQgeyBDc3ZEaXJlY3RpdmUgfSBmcm9tICcuL2Nzdi5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbiJdfQ==
|
package/esm2020/util.mjs
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
export const isJsons = (array) => Array.isArray(array) &&
|
2
|
+
array.every(row => typeof row === 'object' && !(row instanceof Array));
|
3
|
+
export const isArrays = (array) => Array.isArray(array) && array.every(row => Array.isArray(row));
|
4
|
+
export function jsonsHeaders(array) {
|
5
|
+
return Array.from(new Set(array.map(item => Object.keys(item)).reduce((a, b) => [...a, ...b], [])));
|
6
|
+
}
|
7
|
+
export function jsons2arrays(jsons, headers) {
|
8
|
+
headers = headers || jsonsHeaders(jsons);
|
9
|
+
// allow headers to have custom labels, defaulting to having the header data key be the label
|
10
|
+
let headerLabels = headers;
|
11
|
+
let headerKeys = headers;
|
12
|
+
if (isJsons(headers)) {
|
13
|
+
headerLabels = headers.map(header => header.label);
|
14
|
+
headerKeys = headers.map(header => header.key);
|
15
|
+
}
|
16
|
+
const data = jsons.map(object => headerKeys.map(header => (header in object ? object[header] : '')));
|
17
|
+
return [headerLabels, ...data];
|
18
|
+
}
|
19
|
+
export const elementOrEmpty = (element) => element || element === 0 ? element : '';
|
20
|
+
export function joiner(data, delimiter = ',') {
|
21
|
+
return data
|
22
|
+
.map((row, index) => row.map((element) => '"' + elementOrEmpty(element) + '"').join(delimiter))
|
23
|
+
.join(`\n`);
|
24
|
+
}
|
25
|
+
export function arrays2csv(data, headers, delimiter) {
|
26
|
+
return joiner(headers ? [headers, ...data] : data, delimiter);
|
27
|
+
}
|
28
|
+
export function jsons2csv(data, headers, delimiter) {
|
29
|
+
return joiner(jsons2arrays(data, headers), delimiter);
|
30
|
+
}
|
31
|
+
export function string2csv(data, headers, delimiter) {
|
32
|
+
return headers ? `${headers.join(delimiter)}\n${data}` : data;
|
33
|
+
}
|
34
|
+
export function toCSV(data, headers, delimiter) {
|
35
|
+
if (isJsons(data)) {
|
36
|
+
return jsons2csv(data, headers, delimiter);
|
37
|
+
}
|
38
|
+
if (isArrays(data)) {
|
39
|
+
return arrays2csv(data, headers, delimiter);
|
40
|
+
}
|
41
|
+
if (typeof data === 'string') {
|
42
|
+
return string2csv(data, headers, delimiter);
|
43
|
+
}
|
44
|
+
throw new TypeError(`Data should be a "String", "Array of arrays" OR "Array of objects" `);
|
45
|
+
}
|
46
|
+
export function blob(data, uFEFF = true, headers, delimiter) {
|
47
|
+
const csv = toCSV(data, headers, delimiter);
|
48
|
+
return new Blob([uFEFF ? '\uFEFF' : '', csv], { type: 'text/csv' });
|
49
|
+
}
|
50
|
+
export function buildURI(data, uFEFF = true, headers, delimiter) {
|
51
|
+
return URL.createObjectURL(blob(data, uFEFF, headers, delimiter));
|
52
|
+
}
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUN0QyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNwQixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUN2QyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFlO0lBQzFDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FDZixJQUFJLEdBQUcsQ0FDTCxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDeEUsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQzFCLEtBQWtDLEVBQ2xDLE9BQWdDO0lBRWhDLE9BQU8sR0FBRyxPQUFPLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXpDLDZGQUE2RjtJQUM3RixJQUFJLFlBQVksR0FBYSxPQUFtQixDQUFDO0lBQ2pELElB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LENBQ2xCLElBQStELEVBQy9ELEtBQUssR0FBRyxJQUFJLEVBQ1osT0FBZ0MsRUFDaEMsU0FBa0I7SUFFbEIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsSUFBK0QsRUFDL0QsS0FBSyxHQUFHLElBQUksRUFDWixPQUFnQyxFQUNoQyxTQUFrQjtJQUVsQixPQUFPLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHByZWZlci1hcnJvdy9wcmVmZXItYXJyb3ctZnVuY3Rpb25zICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlck9iaiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgaXNKc29ucyA9IChhcnJheTogYW55W10pID0+XG4gIEFycmF5LmlzQXJyYXkoYXJyYXkpICYmXG4gIGFycmF5LmV2ZXJ5KHJvdyA9PiB0eXBlb2Ygcm93ID09PSAnb2JqZWN0JyAmJiAhKHJvdyBpbnN0YW5jZW9mIEFycmF5KSk7XG5cbmV4cG9ydCBjb25zdCBpc0FycmF5cyA9IChhcnJheTogYW55W10pID0+XG4gIEFycmF5LmlzQXJyYXkoYXJyYXkpICYmIGFycmF5LmV2ZXJ5KHJvdyA9PiBBcnJheS5pc0FycmF5KHJvdykpO1xuXG5leHBvcnQgZnVuY3Rpb24ganNvbnNIZWFkZXJzKGFycmF5OiBvYmplY3RbXSkge1xuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KFxuICAgICAgYXJyYXkubWFwKGl0ZW0gPT4gT2JqZWN0LmtleXMoaXRlbSkpLnJlZHVjZSgoYSwgYikgPT4gWy4uLmEsIC4uLmJdLCBbXSksXG4gICAgKSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpzb25zMmFycmF5cyhcbiAganNvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1bXSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4pIHtcbiAgaGVhZGVycyA9IGhlYWRlcnMgfHwganNvbnNIZWFkZXJzKGpzb25zKTtcblxuICAvLyBhbGxvdyBoZWFkZXJzIHRvIGhhdmUgY3VzdG9tIGxhYmVscywgZGVmYXVsdGluZyB0byBoYXZpbmcgdGhlIGhlYWRlciBkYXRhIGtleSBiZSB0aGUgbGFiZWxcbiAgbGV0IGhlYWRlckxhYmVsczogc3RyaW5nW10gPSBoZWFkZXJzIGFzIHN0cmluZ1tdO1xuICBsZXQgaGVhZGVyS2V5czogc3RyaW5nW10gPSBoZWFkZXJzIGFzIHN0cmluZ1tdO1xuICBpZiAoaXNKc29ucyhoZWFkZXJzKSkge1xuICAgIGhlYWRlckxhYmVscyA9IChoZWFkZXJzIGFzIEhlYWRlck9ialtdKS5tYXAoaGVhZGVyID0+IGhlYWRlci5sYWJlbCk7XG4gICAgaGVhZGVyS2V5cyA9IChoZWFkZXJzIGFzIEhlYWRlck9ialtdKS5tYXAoaGVhZGVyID0+IGhlYWRlci5rZXkpO1xuICB9XG5cbiAgY29uc3QgZGF0YSA9IGpzb25zLm1hcChvYmplY3QgPT5cbiAgICBoZWFkZXJLZXlzLm1hcChoZWFkZXIgPT4gKGhlYWRlciBpbiBvYmplY3QgPyBvYmplY3RbaGVhZGVyXSA6ICcnKSksXG4gICk7XG4gIHJldHVybiBbaGVhZGVyTGFiZWxzLCAuLi5kYXRhXTtcbn1cblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRPckVtcHR5ID0gKGVsZW1lbnQ6IGFueSkgPT5cbiAgZWxlbWVudCB8fCBlbGVtZW50ID09PSAwID8gZWxlbWVudCA6ICcnO1xuXG5leHBvcnQgZnVuY3Rpb24gam9pbmVyKGRhdGE6IGFueSwgZGVsaW1pdGVyID0gJywnKSB7XG4gIHJldHVybiBkYXRhXG4gICAgLm1hcCgocm93OiBhbnksIGluZGV4OiBudW1iZXIpID0+XG4gICAgICByb3cubWFwKChlbGVtZW50OiBhbnkpID0+ICdcIicgKyBlbGVtZW50T3JFbXB0eShlbGVtZW50KSArICdcIicpLmpvaW4oZGVsaW1pdGVyKSxcbiAgICApXG4gICAgLmpvaW4oYFxcbmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlzMmNzdihcbiAgZGF0YTogc3RyaW5nW11bXSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4gIGRlbGltaXRlcj86IHN0cmluZyxcbikge1xuICByZXR1cm4gam9pbmVyKGhlYWRlcnMgPyBbaGVhZGVycywgLi4uZGF0YV0gOiBkYXRhLCBkZWxpbWl0ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvbnMyY3N2KFxuICBkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9W10sXG4gIGhlYWRlcnM/OiBzdHJpbmdbXSB8IEhlYWRlck9ialtdLFxuICBkZWxpbWl0ZXI/OiBzdHJpbmcsXG4pIHtcbiAgcmV0dXJuIGpvaW5lcihqc29uczJhcnJheXMoZGF0YSwgaGVhZGVycyksIGRlbGltaXRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmcyY3N2KFxuICBkYXRhOiBzdHJpbmcsXG4gIGhlYWRlcnM/OiBzdHJpbmdbXSxcbiAgZGVsaW1pdGVyPzogc3RyaW5nLFxuKSB7XG4gIHJldHVybiBoZWFkZXJzID8gYCR7aGVhZGVycy5qb2luKGRlbGltaXRlcil9XFxuJHtkYXRhfWAgOiBkYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9DU1YoXG4gIGRhdGE6IHN0cmluZyB8IHN0cmluZ1tdW10gfCB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9W10gfCBhbnlbXSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4gIGRlbGltaXRlcj86IHN0cmluZyxcbikge1xuICBpZiAoaXNKc29ucyhkYXRhIGFzIGFueSkpIHtcbiAgICByZXR1cm4ganNvbnMyY3N2KGRhdGEgYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdLCBoZWFkZXJzLCBkZWxpbWl0ZXIpO1xuICB9XG4gIGlmIChpc0FycmF5cyhkYXRhIGFzIGFueSkpIHtcbiAgICByZXR1cm4gYXJyYXlzMmNzdihkYXRhIGFzIHN0cmluZ1tdW10sIGhlYWRlcnMsIGRlbGltaXRlcik7XG4gIH1cbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHJpbmcyY3N2KGRhdGEsIGhlYWRlcnMgYXMgc3RyaW5nW10sIGRlbGltaXRlcik7XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBgRGF0YSBzaG91bGQgYmUgYSBcIlN0cmluZ1wiLCBcIkFycmF5IG9mIGFycmF5c1wiIE9SIFwiQXJyYXkgb2Ygb2JqZWN0c1wiIGAsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBibG9iKFxuICBkYXRhOiBzdHJpbmcgfCBzdHJpbmdbXVtdIHwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdIHwgYW55W10sXG4gIHVGRUZGID0gdHJ1ZSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4gIGRlbGltaXRlcj86IHN0cmluZyxcbikge1xuICBjb25zdCBjc3YgPSB0b0NTVihkYXRhLCBoZWFkZXJzLCBkZWxpbWl0ZXIpO1xuICByZXR1cm4gbmV3IEJsb2IoW3VGRUZGID8gJ1xcdUZFRkYnIDogJycsIGNzdl0sIHsgdHlwZTogJ3RleHQvY3N2JyB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVVJJKFxuICBkYXRhOiBzdHJpbmcgfCBzdHJpbmdbXVtdIHwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdIHwgYW55W10sXG4gIHVGRUZGID0gdHJ1ZSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4gIGRlbGltaXRlcj86IHN0cmluZyxcbikge1xuICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKGRhdGEsIHVGRUZGLCBoZWFkZXJzLCBkZWxpbWl0ZXIpKTtcbn1cbiJdfQ==
|
@@ -1,6 +1,6 @@
|
|
1
|
-
import
|
2
|
-
import { Input, HostBinding,
|
3
|
-
import
|
1
|
+
import * as i0 from '@angular/core';
|
2
|
+
import { Directive, Input, HostBinding, NgModule } from '@angular/core';
|
3
|
+
import * as i1 from '@angular/platform-browser';
|
4
4
|
|
5
5
|
const isJsons = (array) => Array.isArray(array) &&
|
6
6
|
array.every(row => typeof row === 'object' && !(row instanceof Array));
|
@@ -55,7 +55,7 @@ function buildURI(data, uFEFF = true, headers, delimiter) {
|
|
55
55
|
return URL.createObjectURL(blob(data, uFEFF, headers, delimiter));
|
56
56
|
}
|
57
57
|
|
58
|
-
|
58
|
+
class CsvDirective {
|
59
59
|
constructor(sanitizer) {
|
60
60
|
this.sanitizer = sanitizer;
|
61
61
|
/** the body of the csv */
|
@@ -66,85 +66,57 @@ let CsvDirective = class CsvDirective {
|
|
66
66
|
this.uFEFF = true;
|
67
67
|
/** filename */
|
68
68
|
this.download = 'data.csv';
|
69
|
-
this.target =
|
69
|
+
this.target = '_blank';
|
70
70
|
}
|
71
71
|
/** Set the filename of the csv. Default is `data.csv` */
|
72
72
|
set filename(a) {
|
73
73
|
this.download = a;
|
74
74
|
}
|
75
|
-
onClick() {
|
76
|
-
// IE handling
|
77
|
-
if (this.isIEBrowser()) {
|
78
|
-
const file = blob(this.data, this.uFEFF, this.headers, this.delimiter);
|
79
|
-
window.navigator.msSaveBlob(file, this.download);
|
80
|
-
}
|
81
|
-
}
|
82
|
-
isIEBrowser() {
|
83
|
-
return !!window.navigator.msSaveOrOpenBlob;
|
84
|
-
}
|
85
75
|
ngOnChanges() {
|
86
76
|
this.href = this.sanitizer.bypassSecurityTrustResourceUrl(buildURI(this.data, this.uFEFF, this.headers, this.delimiter));
|
87
77
|
}
|
88
|
-
}
|
89
|
-
CsvDirective
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
],
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
]
|
113
|
-
__decorate([
|
114
|
-
HostBinding(),
|
115
|
-
__metadata("design:type", Object)
|
116
|
-
], CsvDirective.prototype, "href", void 0);
|
117
|
-
__decorate([
|
118
|
-
HostBinding(),
|
119
|
-
__metadata("design:type", Object)
|
120
|
-
], CsvDirective.prototype, "download", void 0);
|
121
|
-
__decorate([
|
122
|
-
Input(), HostBinding(),
|
123
|
-
__metadata("design:type", Object)
|
124
|
-
], CsvDirective.prototype, "target", void 0);
|
125
|
-
__decorate([
|
126
|
-
HostListener('click'),
|
127
|
-
__metadata("design:type", Function),
|
128
|
-
__metadata("design:paramtypes", []),
|
129
|
-
__metadata("design:returntype", void 0)
|
130
|
-
], CsvDirective.prototype, "onClick", null);
|
131
|
-
CsvDirective = __decorate([
|
132
|
-
Directive({ selector: '[csvLink]' }),
|
133
|
-
__metadata("design:paramtypes", [DomSanitizer])
|
134
|
-
], CsvDirective);
|
78
|
+
}
|
79
|
+
CsvDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvDirective, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Directive });
|
80
|
+
CsvDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.0", type: CsvDirective, selector: "[csvLink]", inputs: { data: "data", headers: "headers", delimiter: "delimiter", filename: "filename", uFEFF: "uFEFF", target: "target" }, host: { properties: { "href": "this.href", "download": "this.download", "target": "this.target" } }, usesOnChanges: true, ngImport: i0 });
|
81
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvDirective, decorators: [{
|
82
|
+
type: Directive,
|
83
|
+
args: [{ selector: '[csvLink]' }]
|
84
|
+
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { data: [{
|
85
|
+
type: Input
|
86
|
+
}], headers: [{
|
87
|
+
type: Input
|
88
|
+
}], delimiter: [{
|
89
|
+
type: Input
|
90
|
+
}], filename: [{
|
91
|
+
type: Input
|
92
|
+
}], uFEFF: [{
|
93
|
+
type: Input
|
94
|
+
}], href: [{
|
95
|
+
type: HostBinding
|
96
|
+
}], download: [{
|
97
|
+
type: HostBinding
|
98
|
+
}], target: [{
|
99
|
+
type: Input
|
100
|
+
}, {
|
101
|
+
type: HostBinding
|
102
|
+
}] } });
|
135
103
|
|
136
|
-
|
137
|
-
}
|
138
|
-
CsvModule =
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
104
|
+
class CsvModule {
|
105
|
+
}
|
106
|
+
CsvModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
107
|
+
CsvModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvModule, declarations: [CsvDirective], exports: [CsvDirective] });
|
108
|
+
CsvModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvModule });
|
109
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvModule, decorators: [{
|
110
|
+
type: NgModule,
|
111
|
+
args: [{
|
112
|
+
declarations: [CsvDirective],
|
113
|
+
exports: [CsvDirective],
|
114
|
+
}]
|
115
|
+
}] });
|
144
116
|
|
145
117
|
/**
|
146
118
|
* Generated bundle index. Do not edit.
|
147
119
|
*/
|
148
120
|
|
149
121
|
export { CsvDirective, CsvModule, arrays2csv, blob, buildURI, elementOrEmpty, isArrays, isJsons, joiner, jsons2arrays, jsons2csv, jsonsHeaders, string2csv, toCSV };
|
150
|
-
//# sourceMappingURL=ctrl-ngx-csv.
|
122
|
+
//# sourceMappingURL=ctrl-ngx-csv.mjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ctrl-ngx-csv.mjs","sources":["../../src/lib/util.ts","../../src/lib/csv.directive.ts","../../src/lib/csv.module.ts","../../src/lib/ctrl-ngx-csv.ts"],"sourcesContent":["/* eslint-disable prefer-arrow/prefer-arrow-functions */\nexport interface HeaderObj {\n label: string;\n key: string;\n}\n\nexport const isJsons = (array: any[]) =>\n Array.isArray(array) &&\n array.every(row => typeof row === 'object' && !(row instanceof Array));\n\nexport const isArrays = (array: any[]) =>\n Array.isArray(array) && array.every(row => Array.isArray(row));\n\nexport function jsonsHeaders(array: object[]) {\n return Array.from(\n new Set(\n array.map(item => Object.keys(item)).reduce((a, b) => [...a, ...b], []),\n ),\n );\n}\n\nexport function jsons2arrays(\n jsons: { [key: string]: string }[],\n headers?: string[] | HeaderObj[],\n) {\n headers = headers || jsonsHeaders(jsons);\n\n // allow headers to have custom labels, defaulting to having the header data key be the label\n let headerLabels: string[] = headers as string[];\n let headerKeys: string[] = headers as string[];\n if (isJsons(headers)) {\n headerLabels = (headers as HeaderObj[]).map(header => header.label);\n headerKeys = (headers as HeaderObj[]).map(header => header.key);\n }\n\n const data = jsons.map(object =>\n headerKeys.map(header => (header in object ? object[header] : '')),\n );\n return [headerLabels, ...data];\n}\n\nexport const elementOrEmpty = (element: any) =>\n element || element === 0 ? element : '';\n\nexport function joiner(data: any, delimiter = ',') {\n return data\n .map((row: any, index: number) =>\n row.map((element: any) => '\"' + elementOrEmpty(element) + '\"').join(delimiter),\n )\n .join(`\\n`);\n}\n\nexport function arrays2csv(\n data: string[][],\n headers?: string[] | HeaderObj[],\n delimiter?: string,\n) {\n return joiner(headers ? [headers, ...data] : data, delimiter);\n}\n\nexport function jsons2csv(\n data: { [key: string]: string }[],\n headers?: string[] | HeaderObj[],\n delimiter?: string,\n) {\n return joiner(jsons2arrays(data, headers), delimiter);\n}\n\nexport function string2csv(\n data: string,\n headers?: string[],\n delimiter?: string,\n) {\n return headers ? `${headers.join(delimiter)}\\n${data}` : data;\n}\n\nexport function toCSV(\n data: string | string[][] | { [key: string]: string }[] | any[],\n headers?: string[] | HeaderObj[],\n delimiter?: string,\n) {\n if (isJsons(data as any)) {\n return jsons2csv(data as { [key: string]: string }[], headers, delimiter);\n }\n if (isArrays(data as any)) {\n return arrays2csv(data as string[][], headers, delimiter);\n }\n if (typeof data === 'string') {\n return string2csv(data, headers as string[], delimiter);\n }\n throw new TypeError(\n `Data should be a \"String\", \"Array of arrays\" OR \"Array of objects\" `,\n );\n}\n\nexport function blob(\n data: string | string[][] | { [key: string]: string }[] | any[],\n uFEFF = true,\n headers?: string[] | HeaderObj[],\n delimiter?: string,\n) {\n const csv = toCSV(data, headers, delimiter);\n return new Blob([uFEFF ? '\\uFEFF' : '', csv], { type: 'text/csv' });\n}\n\nexport function buildURI(\n data: string | string[][] | { [key: string]: string }[] | any[],\n uFEFF = true,\n headers?: string[] | HeaderObj[],\n delimiter?: string,\n) {\n return URL.createObjectURL(blob(data, uFEFF, headers, delimiter));\n}\n","import { Directive, HostBinding, Input, OnChanges } from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\n\nimport { buildURI, HeaderObj } from './util';\n\n@Directive({ selector: '[csvLink]' })\nexport class CsvDirective implements OnChanges {\n /** the body of the csv */\n @Input() data: string | string[][] | { [key: string]: string }[] | any[] = [];\n /** Set the first line of the csv */\n @Input() headers?: string[] | HeaderObj[];\n /** Set the seperator between values */\n @Input() delimiter = ',';\n /** Set the filename of the csv. Default is `data.csv` */\n @Input()\n set filename(a: string) {\n this.download = a;\n }\n /** adds a Byte order mark to setup the csv as UTF-8 */\n @Input() uFEFF = true;\n @HostBinding() href?: SafeResourceUrl;\n /** filename */\n @HostBinding() download = 'data.csv';\n @Input() @HostBinding() target = '_blank';\n\n constructor(private sanitizer: DomSanitizer) {}\n\n ngOnChanges() {\n this.href = this.sanitizer.bypassSecurityTrustResourceUrl(\n buildURI(this.data, this.uFEFF, this.headers, this.delimiter),\n );\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { CsvDirective } from './csv.directive';\n\n@NgModule({\n declarations: [CsvDirective],\n exports: [CsvDirective],\n})\nexport class CsvModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,122 @@
|
|
1
|
+
import * as i0 from '@angular/core';
|
2
|
+
import { Directive, Input, HostBinding, NgModule } from '@angular/core';
|
3
|
+
import * as i1 from '@angular/platform-browser';
|
4
|
+
|
5
|
+
const isJsons = (array) => Array.isArray(array) &&
|
6
|
+
array.every(row => typeof row === 'object' && !(row instanceof Array));
|
7
|
+
const isArrays = (array) => Array.isArray(array) && array.every(row => Array.isArray(row));
|
8
|
+
function jsonsHeaders(array) {
|
9
|
+
return Array.from(new Set(array.map(item => Object.keys(item)).reduce((a, b) => [...a, ...b], [])));
|
10
|
+
}
|
11
|
+
function jsons2arrays(jsons, headers) {
|
12
|
+
headers = headers || jsonsHeaders(jsons);
|
13
|
+
// allow headers to have custom labels, defaulting to having the header data key be the label
|
14
|
+
let headerLabels = headers;
|
15
|
+
let headerKeys = headers;
|
16
|
+
if (isJsons(headers)) {
|
17
|
+
headerLabels = headers.map(header => header.label);
|
18
|
+
headerKeys = headers.map(header => header.key);
|
19
|
+
}
|
20
|
+
const data = jsons.map(object => headerKeys.map(header => (header in object ? object[header] : '')));
|
21
|
+
return [headerLabels, ...data];
|
22
|
+
}
|
23
|
+
const elementOrEmpty = (element) => element || element === 0 ? element : '';
|
24
|
+
function joiner(data, delimiter = ',') {
|
25
|
+
return data
|
26
|
+
.map((row, index) => row.map((element) => '"' + elementOrEmpty(element) + '"').join(delimiter))
|
27
|
+
.join(`\n`);
|
28
|
+
}
|
29
|
+
function arrays2csv(data, headers, delimiter) {
|
30
|
+
return joiner(headers ? [headers, ...data] : data, delimiter);
|
31
|
+
}
|
32
|
+
function jsons2csv(data, headers, delimiter) {
|
33
|
+
return joiner(jsons2arrays(data, headers), delimiter);
|
34
|
+
}
|
35
|
+
function string2csv(data, headers, delimiter) {
|
36
|
+
return headers ? `${headers.join(delimiter)}\n${data}` : data;
|
37
|
+
}
|
38
|
+
function toCSV(data, headers, delimiter) {
|
39
|
+
if (isJsons(data)) {
|
40
|
+
return jsons2csv(data, headers, delimiter);
|
41
|
+
}
|
42
|
+
if (isArrays(data)) {
|
43
|
+
return arrays2csv(data, headers, delimiter);
|
44
|
+
}
|
45
|
+
if (typeof data === 'string') {
|
46
|
+
return string2csv(data, headers, delimiter);
|
47
|
+
}
|
48
|
+
throw new TypeError(`Data should be a "String", "Array of arrays" OR "Array of objects" `);
|
49
|
+
}
|
50
|
+
function blob(data, uFEFF = true, headers, delimiter) {
|
51
|
+
const csv = toCSV(data, headers, delimiter);
|
52
|
+
return new Blob([uFEFF ? '\uFEFF' : '', csv], { type: 'text/csv' });
|
53
|
+
}
|
54
|
+
function buildURI(data, uFEFF = true, headers, delimiter) {
|
55
|
+
return URL.createObjectURL(blob(data, uFEFF, headers, delimiter));
|
56
|
+
}
|
57
|
+
|
58
|
+
class CsvDirective {
|
59
|
+
constructor(sanitizer) {
|
60
|
+
this.sanitizer = sanitizer;
|
61
|
+
/** the body of the csv */
|
62
|
+
this.data = [];
|
63
|
+
/** Set the seperator between values */
|
64
|
+
this.delimiter = ',';
|
65
|
+
/** adds a Byte order mark to setup the csv as UTF-8 */
|
66
|
+
this.uFEFF = true;
|
67
|
+
/** filename */
|
68
|
+
this.download = 'data.csv';
|
69
|
+
this.target = '_blank';
|
70
|
+
}
|
71
|
+
/** Set the filename of the csv. Default is `data.csv` */
|
72
|
+
set filename(a) {
|
73
|
+
this.download = a;
|
74
|
+
}
|
75
|
+
ngOnChanges() {
|
76
|
+
this.href = this.sanitizer.bypassSecurityTrustResourceUrl(buildURI(this.data, this.uFEFF, this.headers, this.delimiter));
|
77
|
+
}
|
78
|
+
}
|
79
|
+
CsvDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvDirective, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Directive });
|
80
|
+
CsvDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.0", type: CsvDirective, selector: "[csvLink]", inputs: { data: "data", headers: "headers", delimiter: "delimiter", filename: "filename", uFEFF: "uFEFF", target: "target" }, host: { properties: { "href": "this.href", "download": "this.download", "target": "this.target" } }, usesOnChanges: true, ngImport: i0 });
|
81
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvDirective, decorators: [{
|
82
|
+
type: Directive,
|
83
|
+
args: [{ selector: '[csvLink]' }]
|
84
|
+
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { data: [{
|
85
|
+
type: Input
|
86
|
+
}], headers: [{
|
87
|
+
type: Input
|
88
|
+
}], delimiter: [{
|
89
|
+
type: Input
|
90
|
+
}], filename: [{
|
91
|
+
type: Input
|
92
|
+
}], uFEFF: [{
|
93
|
+
type: Input
|
94
|
+
}], href: [{
|
95
|
+
type: HostBinding
|
96
|
+
}], download: [{
|
97
|
+
type: HostBinding
|
98
|
+
}], target: [{
|
99
|
+
type: Input
|
100
|
+
}, {
|
101
|
+
type: HostBinding
|
102
|
+
}] } });
|
103
|
+
|
104
|
+
class CsvModule {
|
105
|
+
}
|
106
|
+
CsvModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
107
|
+
CsvModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvModule, declarations: [CsvDirective], exports: [CsvDirective] });
|
108
|
+
CsvModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvModule });
|
109
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CsvModule, decorators: [{
|
110
|
+
type: NgModule,
|
111
|
+
args: [{
|
112
|
+
declarations: [CsvDirective],
|
113
|
+
exports: [CsvDirective],
|
114
|
+
}]
|
115
|
+
}] });
|
116
|
+
|
117
|
+
/**
|
118
|
+
* Generated bundle index. Do not edit.
|
119
|
+
*/
|
120
|
+
|
121
|
+
export { CsvDirective, CsvModule, arrays2csv, blob, buildURI, elementOrEmpty, isArrays, isJsons, joiner, jsons2arrays, jsons2csv, jsonsHeaders, string2csv, toCSV };
|
122
|
+
//# sourceMappingURL=ctrl-ngx-csv.mjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ctrl-ngx-csv.mjs","sources":["../../src/lib/util.ts","../../src/lib/csv.directive.ts","../../src/lib/csv.module.ts","../../src/lib/ctrl-ngx-csv.ts"],"sourcesContent":["/* eslint-disable prefer-arrow/prefer-arrow-functions */\nexport interface HeaderObj {\n label: string;\n key: string;\n}\n\nexport const isJsons = (array: any[]) =>\n Array.isArray(array) &&\n array.every(row => typeof row === 'object' && !(row instanceof Array));\n\nexport const isArrays = (array: any[]) =>\n Array.isArray(array) && array.every(row => Array.isArray(row));\n\nexport function jsonsHeaders(array: object[]) {\n return Array.from(\n new Set(\n array.map(item => Object.keys(item)).reduce((a, b) => [...a, ...b], []),\n ),\n );\n}\n\nexport function jsons2arrays(\n jsons: { [key: string]: string }[],\n headers?: string[] | HeaderObj[],\n) {\n headers = headers || jsonsHeaders(jsons);\n\n // allow headers to have custom labels, defaulting to having the header data key be the label\n let headerLabels: string[] = headers as string[];\n let headerKeys: string[] = headers as string[];\n if (isJsons(headers)) {\n headerLabels = (headers as HeaderObj[]).map(header => header.label);\n headerKeys = (headers as HeaderObj[]).map(header => header.key);\n }\n\n const data = jsons.map(object =>\n headerKeys.map(header => (header in object ? object[header] : '')),\n );\n return [headerLabels, ...data];\n}\n\nexport const elementOrEmpty = (element: any) =>\n element || element === 0 ? element : '';\n\nexport function joiner(data: any, delimiter = ',') {\n return data\n .map((row: any, index: number) =>\n row.map((element: any) => '\"' + elementOrEmpty(element) + '\"').join(delimiter),\n )\n .join(`\\n`);\n}\n\nexport function arrays2csv(\n data: string[][],\n headers?: string[] | HeaderObj[],\n delimiter?: string,\n) {\n return joiner(headers ? [headers, ...data] : data, delimiter);\n}\n\nexport function jsons2csv(\n data: { [key: string]: string }[],\n headers?: string[] | HeaderObj[],\n delimiter?: string,\n) {\n return joiner(jsons2arrays(data, headers), delimiter);\n}\n\nexport function string2csv(\n data: string,\n headers?: string[],\n delimiter?: string,\n) {\n return headers ? `${headers.join(delimiter)}\\n${data}` : data;\n}\n\nexport function toCSV(\n data: string | string[][] | { [key: string]: string }[] | any[],\n headers?: string[] | HeaderObj[],\n delimiter?: string,\n) {\n if (isJsons(data as any)) {\n return jsons2csv(data as { [key: string]: string }[], headers, delimiter);\n }\n if (isArrays(data as any)) {\n return arrays2csv(data as string[][], headers, delimiter);\n }\n if (typeof data === 'string') {\n return string2csv(data, headers as string[], delimiter);\n }\n throw new TypeError(\n `Data should be a \"String\", \"Array of arrays\" OR \"Array of objects\" `,\n );\n}\n\nexport function blob(\n data: string | string[][] | { [key: string]: string }[] | any[],\n uFEFF = true,\n headers?: string[] | HeaderObj[],\n delimiter?: string,\n) {\n const csv = toCSV(data, headers, delimiter);\n return new Blob([uFEFF ? '\\uFEFF' : '', csv], { type: 'text/csv' });\n}\n\nexport function buildURI(\n data: string | string[][] | { [key: string]: string }[] | any[],\n uFEFF = true,\n headers?: string[] | HeaderObj[],\n delimiter?: string,\n) {\n return URL.createObjectURL(blob(data, uFEFF, headers, delimiter));\n}\n","import { Directive, HostBinding, Input, OnChanges } from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\n\nimport { buildURI, HeaderObj } from './util';\n\n@Directive({ selector: '[csvLink]' })\nexport class CsvDirective implements OnChanges {\n /** the body of the csv */\n @Input() data: string | string[][] | { [key: string]: string }[] | any[] = [];\n /** Set the first line of the csv */\n @Input() headers?: string[] | HeaderObj[];\n /** Set the seperator between values */\n @Input() delimiter = ',';\n /** Set the filename of the csv. Default is `data.csv` */\n @Input()\n set filename(a: string) {\n this.download = a;\n }\n /** adds a Byte order mark to setup the csv as UTF-8 */\n @Input() uFEFF = true;\n @HostBinding() href?: SafeResourceUrl;\n /** filename */\n @HostBinding() download = 'data.csv';\n @Input() @HostBinding() target = '_blank';\n\n constructor(private sanitizer: DomSanitizer) {}\n\n ngOnChanges() {\n this.href = this.sanitizer.bypassSecurityTrustResourceUrl(\n buildURI(this.data, this.uFEFF, this.headers, this.delimiter),\n );\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { CsvDirective } from './csv.directive';\n\n@NgModule({\n declarations: [CsvDirective],\n exports: [CsvDirective],\n})\nexport class CsvModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -5,32 +5,40 @@
|
|
5
5
|
"publishConfig": {
|
6
6
|
"access": "public"
|
7
7
|
},
|
8
|
-
"version": "
|
8
|
+
"version": "5.0.0",
|
9
9
|
"peerDependencies": {
|
10
|
-
"@angular/core": ">=
|
11
|
-
"@angular/platform-browser": ">=8.0.0"
|
10
|
+
"@angular/core": ">=12.0.0-0"
|
12
11
|
},
|
13
|
-
"repository": "
|
14
|
-
"homepage": "https://
|
12
|
+
"repository": "scttcper/ngx-csv",
|
13
|
+
"homepage": "https://ngx-csv.vercel.app",
|
15
14
|
"license": "MIT",
|
16
|
-
"bugs": "https://github.com/typectrl/ngx-csv/issues",
|
17
15
|
"keywords": [
|
18
16
|
"ngx",
|
19
17
|
"angular",
|
20
18
|
"angular-component",
|
21
19
|
"csv"
|
22
20
|
],
|
23
|
-
"
|
24
|
-
"
|
25
|
-
"
|
26
|
-
"
|
27
|
-
"
|
28
|
-
"fesm5": "fesm5/ctrl-ngx-csv.js",
|
29
|
-
"fesm2015": "fesm2015/ctrl-ngx-csv.js",
|
21
|
+
"module": "fesm2015/ctrl-ngx-csv.mjs",
|
22
|
+
"es2020": "fesm2020/ctrl-ngx-csv.mjs",
|
23
|
+
"esm2020": "esm2020/ctrl-ngx-csv.mjs",
|
24
|
+
"fesm2020": "fesm2020/ctrl-ngx-csv.mjs",
|
25
|
+
"fesm2015": "fesm2015/ctrl-ngx-csv.mjs",
|
30
26
|
"typings": "ctrl-ngx-csv.d.ts",
|
31
|
-
"
|
27
|
+
"exports": {
|
28
|
+
"./package.json": {
|
29
|
+
"default": "./package.json"
|
30
|
+
},
|
31
|
+
".": {
|
32
|
+
"types": "./ctrl-ngx-csv.d.ts",
|
33
|
+
"esm2020": "./esm2020/ctrl-ngx-csv.mjs",
|
34
|
+
"es2020": "./fesm2020/ctrl-ngx-csv.mjs",
|
35
|
+
"es2015": "./fesm2015/ctrl-ngx-csv.mjs",
|
36
|
+
"node": "./fesm2015/ctrl-ngx-csv.mjs",
|
37
|
+
"default": "./fesm2020/ctrl-ngx-csv.mjs"
|
38
|
+
}
|
39
|
+
},
|
32
40
|
"sideEffects": false,
|
33
41
|
"dependencies": {
|
34
|
-
"tslib": "^
|
42
|
+
"tslib": "^2.3.0"
|
35
43
|
}
|
36
44
|
}
|