@dealpos-npm/ng-dealpos-library 4.4.7 → 4.4.8

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.
@@ -1,14 +1,18 @@
1
- import { EventEmitter } from '@angular/core';
1
+ import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import { ConvertCsvService } from '@dealpos-npm/ng-dealpos-library/services/csv-parser';
3
3
  import { HttpService } from '@dealpos-npm/ng-dealpos-library/services/http';
4
4
  import { Uppy } from '@uppy/core';
5
5
  import '@uppy/core/dist/style.min.css';
6
6
  import '@uppy/dashboard/dist/style.min.css';
7
7
  import * as i0 from "@angular/core";
8
- export declare class UppyComponent {
8
+ export declare class UppyComponent implements OnChanges {
9
9
  sampleUrl: string;
10
10
  subtitle: string;
11
11
  showSample: boolean;
12
+ /**
13
+ * For manually resetting Uppy after a successful upload
14
+ */
15
+ clear: import("@angular/core").InputSignal<boolean>;
12
16
  showSubtitle: boolean;
13
17
  uppyCoreConfiguration: import("@angular/core").InputSignal<any>;
14
18
  dashboardPropsConfiguration: import("@angular/core").InputSignal<any>;
@@ -39,6 +43,7 @@ export declare class UppyComponent {
39
43
  height: number;
40
44
  };
41
45
  constructor();
46
+ ngOnChanges(changes: SimpleChanges): void;
42
47
  /**
43
48
  * Converts a given number of bytes into a human-readable string.
44
49
  * @param bytes The number of bytes to convert.
@@ -47,5 +52,5 @@ export declare class UppyComponent {
47
52
  */
48
53
  formatFileSize(bytes: number, decimalPoints?: number): string;
49
54
  static ɵfac: i0.ɵɵFactoryDeclaration<UppyComponent, never>;
50
- static ɵcmp: i0.ɵɵComponentDeclaration<UppyComponent, "POS-uppy", never, { "sampleUrl": { "alias": "sampleUrl"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "uppyCoreConfiguration": { "alias": "uppyCoreConfiguration"; "required": false; "isSignal": true; }; "dashboardPropsConfiguration": { "alias": "dashboardPropsConfiguration"; "required": false; "isSignal": true; }; }, { "fileUploaded": "fileUploaded"; "fileUploadComplete": "fileUploadComplete"; "fileRemoved": "fileRemoved"; "onParser": "onParser"; "multipleFilesUploaded": "multipleFilesUploaded"; }, never, never, true, never>;
55
+ static ɵcmp: i0.ɵɵComponentDeclaration<UppyComponent, "POS-uppy", never, { "sampleUrl": { "alias": "sampleUrl"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "showSample": { "alias": "showSample"; "required": false; }; "clear": { "alias": "clear"; "required": false; "isSignal": true; }; "uppyCoreConfiguration": { "alias": "uppyCoreConfiguration"; "required": false; "isSignal": true; }; "dashboardPropsConfiguration": { "alias": "dashboardPropsConfiguration"; "required": false; "isSignal": true; }; }, { "fileUploaded": "fileUploaded"; "fileUploadComplete": "fileUploadComplete"; "fileRemoved": "fileRemoved"; "onParser": "onParser"; "multipleFilesUploaded": "multipleFilesUploaded"; }, never, never, true, never>;
51
56
  }
@@ -1,5 +1,5 @@
1
1
  import { CommonModule } from '@angular/common';
2
- import { Component, effect, EventEmitter, inject, input, Input, Output, signal } from '@angular/core';
2
+ import { Component, effect, EventEmitter, inject, input, Input, Output, signal, } from '@angular/core';
3
3
  import { ConvertCsvService } from '@dealpos-npm/ng-dealpos-library/services/csv-parser';
4
4
  import { HttpService } from '@dealpos-npm/ng-dealpos-library/services/http';
5
5
  import { UppyAngularDashboardModule } from '@uppy/angular';
@@ -12,12 +12,26 @@ import * as i0 from "@angular/core";
12
12
  import * as i1 from "@uppy/angular";
13
13
  import * as i2 from "@angular/common";
14
14
  export class UppyComponent {
15
- static { this.sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; }
15
+ static { this.sizes = [
16
+ 'Bytes',
17
+ 'KB',
18
+ 'MB',
19
+ 'GB',
20
+ 'TB',
21
+ 'PB',
22
+ 'EB',
23
+ 'ZB',
24
+ 'YB',
25
+ ]; }
16
26
  static { this.kilobyte = 1024; }
17
27
  constructor() {
18
28
  this.sampleUrl = '';
19
29
  this.subtitle = '';
20
30
  this.showSample = true;
31
+ /**
32
+ * For manually resetting Uppy after a successful upload
33
+ */
34
+ this.clear = input(false);
21
35
  this.showSubtitle = true;
22
36
  this.uppyCoreConfiguration = input();
23
37
  this.dashboardPropsConfiguration = input();
@@ -28,7 +42,10 @@ export class UppyComponent {
28
42
  this.multipleFilesUploaded = new EventEmitter();
29
43
  this.http = inject(HttpService);
30
44
  this.csvParser = inject(ConvertCsvService);
31
- this.rowSummary = signal({ rowCount: 0, rowEmpty: 0 });
45
+ this.rowSummary = signal({
46
+ rowCount: 0,
47
+ rowEmpty: 0,
48
+ });
32
49
  this.file = signal(null);
33
50
  this.multipleFiles = signal([]);
34
51
  this.uppy = new Uppy({
@@ -37,21 +54,22 @@ export class UppyComponent {
37
54
  allowMultipleUploadBatches: false,
38
55
  restrictions: {
39
56
  allowedFileTypes: ['.csv'],
40
- maxTotalFileSize: 1000000
57
+ maxTotalFileSize: 1000000,
41
58
  },
42
- }).use(Compressor, { mimeType: 'image/jpeg', convertSize: Infinity, convertTypes: ['image/png'] });
43
- // .use(
44
- // Url, {
45
- // companionUrl: COMPANION_URL,
46
- // companionAllowedHosts: COMPANION_ALLOWED_HOSTS
47
- // }
48
- // );
59
+ }).use(Compressor, {
60
+ mimeType: 'image/jpeg',
61
+ convertSize: Infinity,
62
+ convertTypes: ['image/png'],
63
+ });
49
64
  this.dashboardProps = {
50
65
  hideUploadButton: true,
51
- height: 350
66
+ height: 350,
52
67
  };
53
68
  effect(() => this.uppy.setOptions({ ...this.uppyCoreConfiguration() }));
54
- effect(() => this.dashboardProps = ({ ...this.dashboardProps, ...this.dashboardPropsConfiguration() }));
69
+ effect(() => (this.dashboardProps = {
70
+ ...this.dashboardProps,
71
+ ...this.dashboardPropsConfiguration(),
72
+ }));
55
73
  this.uppy.on('upload', (_, uppyFiles) => {
56
74
  const file = uppyFiles[0]?.data;
57
75
  this.showSample = false;
@@ -66,11 +84,17 @@ export class UppyComponent {
66
84
  const withOutHeader = _chunk.split(/\r?\n/).slice(1);
67
85
  if (withOutHeader[withOutHeader.length - 1] === '')
68
86
  withOutHeader.pop();
69
- this.rowSummary.update(res => ({ ...res, rowCount: withOutHeader.length }));
70
- withOutHeader.forEach(row => {
71
- const emptyRow = row.split(',').every(row => row === '');
87
+ this.rowSummary.update((res) => ({
88
+ ...res,
89
+ rowCount: withOutHeader.length,
90
+ }));
91
+ withOutHeader.forEach((row) => {
92
+ const emptyRow = row.split(',').every((row) => row === '');
72
93
  if (emptyRow)
73
- this.rowSummary.update(res => ({ ...res, rowEmpty: res.rowEmpty + 1 }));
94
+ this.rowSummary.update((res) => ({
95
+ ...res,
96
+ rowEmpty: res.rowEmpty + 1,
97
+ }));
74
98
  });
75
99
  return _chunk; // Return the original chunk to continue parsing
76
100
  },
@@ -83,7 +107,7 @@ export class UppyComponent {
83
107
  });
84
108
  });
85
109
  this.uppy.on('complete', (uppyFiles) => {
86
- const multipleFiles = uppyFiles.successful?.map(d => ({ file: d.data, id: d.id })) ?? [];
110
+ const multipleFiles = uppyFiles.successful?.map((d) => ({ file: d.data, id: d.id })) ?? [];
87
111
  const file = uppyFiles.successful[0]?.data;
88
112
  this.showSample = false;
89
113
  this.showSubtitle = false;
@@ -104,12 +128,17 @@ export class UppyComponent {
104
128
  this.showSubtitle = true;
105
129
  this.file.set(null);
106
130
  const currentFiles = this.multipleFiles();
107
- const updatedFiles = currentFiles.filter(r => r.id != f.id);
131
+ const updatedFiles = currentFiles.filter((r) => r.id != f.id);
108
132
  this.multipleFiles.set(updatedFiles);
109
133
  this.fileRemoved.emit(f.id);
110
134
  this.rowSummary.set({ rowCount: 0, rowEmpty: 0 });
111
135
  });
112
136
  }
137
+ ngOnChanges(changes) {
138
+ if (changes['clear']?.currentValue == true) {
139
+ this.uppy.clear();
140
+ }
141
+ }
113
142
  /**
114
143
  * Converts a given number of bytes into a human-readable string.
115
144
  * @param bytes The number of bytes to convert.
@@ -121,11 +150,11 @@ export class UppyComponent {
121
150
  return `0 bytes`;
122
151
  }
123
152
  const i = Math.floor(Math.log(bytes) / Math.log(UppyComponent.kilobyte));
124
- const size = (bytes / Math.pow(UppyComponent.kilobyte, i));
153
+ const size = bytes / Math.pow(UppyComponent.kilobyte, i);
125
154
  return `${size.toFixed(decimalPoints)} ${UppyComponent.sizes[i]}`;
126
155
  }
127
156
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: UppyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
128
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: UppyComponent, isStandalone: true, selector: "POS-uppy", inputs: { sampleUrl: { classPropertyName: "sampleUrl", publicName: "sampleUrl", isSignal: false, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: false, isRequired: false, transformFunction: null }, uppyCoreConfiguration: { classPropertyName: "uppyCoreConfiguration", publicName: "uppyCoreConfiguration", isSignal: true, isRequired: false, transformFunction: null }, dashboardPropsConfiguration: { classPropertyName: "dashboardPropsConfiguration", publicName: "dashboardPropsConfiguration", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fileUploaded: "fileUploaded", fileUploadComplete: "fileUploadComplete", fileRemoved: "fileRemoved", onParser: "onParser", multipleFilesUploaded: "multipleFilesUploaded" }, ngImport: i0, template: "<div class=\"position-relative\">\r\n <uppy-dashboard [uppy]=\"uppy\" [props]=\"dashboardProps\"> </uppy-dashboard>\r\n <small *ngIf=\"subtitle && showSubtitle\" class=\"subtitle position-absolute\">{{subtitle}}</small>\r\n <a *ngIf=\"sampleUrl && showSample\" class=\"sample position-absolute\" [class.top-58]=\"subtitle\" role=\"button\"\r\n [href]=\"sampleUrl\">\r\n <i class=\"fa-solid fa-download ms-3\"></i> Download Template\r\n </a>\r\n\r\n @if (file() && file()?.type === 'text/csv') {\r\n <div class=\"alert alert-warning d-flex flex-column gap-2\" style=\"margin: 1rem 0 0 0;\" role=\"alert\">\r\n <h4 class=\"alert-heading\">CSV File Content Summary</h4>\r\n <hr>\r\n <p class=\"fs-6 m-0\">{{rowSummary().rowCount}} rows found <ng-container *ngIf=\"rowSummary().rowEmpty > 0\">-\r\n {{rowSummary().rowEmpty}} empty in the CSV you uploaded</ng-container></p>\r\n </div>\r\n\r\n }\r\n</div>", styles: ["::ng-deep .uppy-Dashboard-AddFiles-info{display:none!important}::ng-deep .uppy-Dashboard-AddFiles-list{flex:none;flex-direction:row;flex-wrap:wrap;justify-content:center;max-width:600px;margin-top:15px;padding-top:0;overflow-y:visible}.sample,.subtitle{top:56%;width:100%;text-align:center}.top-58{top:61%}\n"], dependencies: [{ kind: "ngmodule", type: UppyAngularDashboardModule }, { kind: "component", type: i1.DashboardComponent, selector: "uppy-dashboard", inputs: ["uppy", "props"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
157
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: UppyComponent, isStandalone: true, selector: "POS-uppy", inputs: { sampleUrl: { classPropertyName: "sampleUrl", publicName: "sampleUrl", isSignal: false, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: false, isRequired: false, transformFunction: null }, showSample: { classPropertyName: "showSample", publicName: "showSample", isSignal: false, isRequired: false, transformFunction: null }, clear: { classPropertyName: "clear", publicName: "clear", isSignal: true, isRequired: false, transformFunction: null }, uppyCoreConfiguration: { classPropertyName: "uppyCoreConfiguration", publicName: "uppyCoreConfiguration", isSignal: true, isRequired: false, transformFunction: null }, dashboardPropsConfiguration: { classPropertyName: "dashboardPropsConfiguration", publicName: "dashboardPropsConfiguration", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fileUploaded: "fileUploaded", fileUploadComplete: "fileUploadComplete", fileRemoved: "fileRemoved", onParser: "onParser", multipleFilesUploaded: "multipleFilesUploaded" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"position-relative\">\r\n <uppy-dashboard [uppy]=\"uppy\" [props]=\"dashboardProps\"> </uppy-dashboard>\r\n <small *ngIf=\"subtitle && showSubtitle\" class=\"subtitle position-absolute\">{{subtitle}}</small>\r\n <a *ngIf=\"sampleUrl && showSample\" class=\"sample position-absolute\" [class.top-58]=\"subtitle\" role=\"button\"\r\n [href]=\"sampleUrl\">\r\n <i class=\"fa-solid fa-download ms-3\"></i> Download Template\r\n </a>\r\n\r\n @if (file() && file()?.type === 'text/csv') {\r\n <div class=\"alert alert-warning d-flex flex-column gap-2\" style=\"margin: 1rem 0 0 0;\" role=\"alert\">\r\n <h4 class=\"alert-heading\">CSV File Content Summary</h4>\r\n <hr>\r\n <p class=\"fs-6 m-0\">{{rowSummary().rowCount}} rows found <ng-container *ngIf=\"rowSummary().rowEmpty > 0\">-\r\n {{rowSummary().rowEmpty}} empty in the CSV you uploaded</ng-container></p>\r\n </div>\r\n\r\n }\r\n</div>", styles: ["::ng-deep .uppy-Dashboard-AddFiles-info{display:none!important}::ng-deep .uppy-Dashboard-AddFiles-list{flex:none;flex-direction:row;flex-wrap:wrap;justify-content:center;max-width:600px;margin-top:15px;padding-top:0;overflow-y:visible}.sample,.subtitle{top:56%;width:100%;text-align:center}.top-58{top:61%}\n"], dependencies: [{ kind: "ngmodule", type: UppyAngularDashboardModule }, { kind: "component", type: i1.DashboardComponent, selector: "uppy-dashboard", inputs: ["uppy", "props"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
129
158
  }
130
159
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: UppyComponent, decorators: [{
131
160
  type: Component,
@@ -134,6 +163,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
134
163
  type: Input
135
164
  }], subtitle: [{
136
165
  type: Input
166
+ }], showSample: [{
167
+ type: Input
137
168
  }], fileUploaded: [{
138
169
  type: Output
139
170
  }], fileUploadComplete: [{
@@ -145,4 +176,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
145
176
  }], multipleFilesUploaded: [{
146
177
  type: Output
147
178
  }] } });
148
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBweS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZWFscG9zLW5wbS9uZy1kZWFscG9zLWxpYnJhcnkvY29tcG9uZW50cy91cHB5LWZpbGUtdXBsb2FkL3NyYy91cHB5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RlYWxwb3MtbnBtL25nLWRlYWxwb3MtbGlicmFyeS9jb21wb25lbnRzL3VwcHktZmlsZS11cGxvYWQvc3JjL3VwcHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsQyxPQUFPLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sb0NBQW9DLENBQUM7QUFHNUMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDOzs7O0FBUzdCLE1BQU0sT0FBTyxhQUFhO2FBcUJULFVBQUssR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFVLEFBQXJFLENBQXFFO2FBQzFF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USxDQUFDLENBQUMsQ0FBQTtRQUN4RSxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN6RCxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDbkUsQ0FBQzs4R0FqSVUsYUFBYTtrR0FBYixhQUFhLGczQkNyQjFCLGc5QkFpQk0sNldEQU0sMEJBQTBCLHlJQUFFLFlBQVk7OzJGQUl2QyxhQUFhO2tCQVB6QixTQUFTOytCQUNFLFVBQVUsY0FDUixJQUFJLFdBQ1AsQ0FBQywwQkFBMEIsRUFBRSxZQUFZLENBQUM7d0RBSzFDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFLSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBlZmZlY3QsIEV2ZW50RW1pdHRlciwgaW5qZWN0LCBpbnB1dCwgSW5wdXQsIE91dHB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJ0BkZWFscG9zLW5wbS9uZy1kZWFscG9zLWxpYnJhcnkvY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQ29udmVydENzdlNlcnZpY2UgfSBmcm9tICdAZGVhbHBvcy1ucG0vbmctZGVhbHBvcy1saWJyYXJ5L3NlcnZpY2VzL2Nzdi1wYXJzZXInO1xyXG5pbXBvcnQgeyBIdHRwU2VydmljZSB9IGZyb20gJ0BkZWFscG9zLW5wbS9uZy1kZWFscG9zLWxpYnJhcnkvc2VydmljZXMvaHR0cCc7XHJcbmltcG9ydCB7IFVwcHlBbmd1bGFyRGFzaGJvYXJkTW9kdWxlIH0gZnJvbSAnQHVwcHkvYW5ndWxhcic7XHJcbmltcG9ydCBDb21wcmVzc29yIGZyb20gJ0B1cHB5L2NvbXByZXNzb3InO1xyXG5pbXBvcnQgeyBVcHB5IH0gZnJvbSAnQHVwcHkvY29yZSc7XHJcbmltcG9ydCAnQHVwcHkvY29yZS9kaXN0L3N0eWxlLm1pbi5jc3MnO1xyXG5pbXBvcnQgJ0B1cHB5L2Rhc2hib2FyZC9kaXN0L3N0eWxlLm1pbi5jc3MnO1xyXG5pbXBvcnQgVHJhbnNsb2FkaXQsIHsgQ09NUEFOSU9OX0FMTE9XRURfSE9TVFMsIENPTVBBTklPTl9VUkwgfSBmcm9tICdAdXBweS90cmFuc2xvYWRpdCc7XHJcbmltcG9ydCBVcmwgZnJvbSAnQHVwcHkvdXJsL2xpYi9VcmwnO1xyXG5pbXBvcnQgUGFwYSBmcm9tICdwYXBhcGFyc2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdQT1MtdXBweScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbVXBweUFuZ3VsYXJEYXNoYm9hcmRNb2R1bGUsIENvbW1vbk1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3VwcHkuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi91cHB5LmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVXBweUNvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgc2FtcGxlVXJsOiBzdHJpbmcgPSAnJ1xyXG4gIEBJbnB1dCgpIHN1YnRpdGxlOiBzdHJpbmcgPSAnJ1xyXG4gIHNob3dTYW1wbGU6IGJvb2xlYW4gPSB0cnVlXHJcbiAgc2hvd1N1YnRpdGxlOiBib29sZWFuID0gdHJ1ZTtcclxuICB1cHB5Q29yZUNvbmZpZ3VyYXRpb24gPSBpbnB1dDxhbnk+KCk7XHJcbiAgZGFzaGJvYXJkUHJvcHNDb25maWd1cmF0aW9uID0gaW5wdXQ8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBmaWxlVXBsb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEJsb2IgfCBGaWxlPigpXHJcbiAgQE91dHB1dCgpIGZpbGVVcGxvYWRDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8QmxvYiB8IEZpbGU+KClcclxuICBAT3V0cHV0KCkgZmlsZVJlbW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKVxyXG4gIEBPdXRwdXQoKSBvblBhcnNlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXHJcbiAgQE91dHB1dCgpIG11bHRpcGxlRmlsZXNVcGxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e2ZpbGU6IEJsb2IgfCBGaWxlLCBpZDogc3RyaW5nfVtdPigpXHJcblxyXG4gIGh0dHAgPSBpbmplY3QoSHR0cFNlcnZpY2UpXHJcbiAgY3N2UGFyc2VyID0gaW5qZWN0KENvbnZlcnRDc3ZTZXJ2aWNlKVxyXG5cclxuICByb3dTdW1tYXJ5ID0gc2lnbmFsPHtyb3dDb3VudDogbnVtYmVyLCByb3dFbXB0eTogbnVtYmVyfT4oe3Jvd0NvdW50OiAwLCByb3dFbXB0eTogMH0pXHJcblxyXG4gIGZpbGUgPSBzaWduYWw8RmlsZSB8IG51bGw+KG51bGwpXHJcbiAgbXVsdGlwbGVGaWxlcyA9IHNpZ25hbDx7ZmlsZTogQmxvYiB8IEZpbGUsIGlkOiBzdHJpbmd9W10+KFtdKVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXSBhcyBjb25zdFxyXG4gIHByaXZhdGUgc3RhdGljIGtpbG9ieXRlID0gMTAyNFxyXG5cclxuICB1cHB5OiBVcHB5ID0gbmV3IFVwcHkoeyBcclxuICAgIGRlYnVnOiB0cnVlLCBcclxuICAgIGF1dG9Qcm9jZWVkOiB0cnVlLCBcclxuICAgIGFsbG93TXVsdGlwbGVVcGxvYWRCYXRjaGVzOiBmYWxzZSxcclxuICAgIHJlc3RyaWN0aW9uczoge1xyXG4gICAgICBhbGxvd2VkRmlsZVR5cGVzOiBbJy5jc3YnXSxcclxuICAgICAgbWF4VG90YWxGaWxlU2l6ZTogMTAwMDAwMFxyXG4gICAgfSxcclxuICB9KS51c2UoQ29tcHJlc3Nvciwge21pbWVUeXBlOiAnaW1hZ2UvanBlZycsIGNvbnZlcnRTaXplOiBJbmZpbml0eSwgY29udmVydFR5cGVzOiBbJ2ltYWdlL3BuZyddfSlcclxuICAvLyAudXNlKFxyXG4gIC8vICAgVXJsLCB7XHJcbiAgLy8gICAgIGNvbXBhbmlvblVybDogQ09NUEFOSU9OX1VSTCxcclxuICAvLyAgICAgY29tcGFuaW9uQWxsb3dlZEhvc3RzOiBDT01QQU5JT05fQUxMT1dFRF9IT1NUU1xyXG4gIC8vICAgfVxyXG4gIC8vICk7XHJcbiAgXHJcbiAgZGFzaGJvYXJkUHJvcHMgPSB7XHJcbiAgICBoaWRlVXBsb2FkQnV0dG9uOiB0cnVlLFxyXG4gICAgaGVpZ2h0OiAzNTBcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgZWZmZWN0KCgpID0+IHRoaXMudXBweS5zZXRPcHRpb25zKHsuLi50aGlzLnVwcHlDb3JlQ29uZmlndXJhdGlvbigpfSkpXHJcbiAgICBlZmZlY3QoKCkgPT4gdGhpcy5kYXNoYm9hcmRQcm9wcyA9ICh7Li4udGhpcy5kYXNoYm9hcmRQcm9wcywgLi4udGhpcy5kYXNoYm9hcmRQcm9wc0NvbmZpZ3VyYXRpb24oKX0pKVxyXG5cclxuICAgIHRoaXMudXBweS5vbigndXBsb2FkJywgKF8sIHVwcHlGaWxlcykgPT4ge1xyXG4gICAgICBjb25zdCBmaWxlID0gdXBweUZpbGVzWzBdPy5kYXRhIGFzIEZpbGVcclxuICAgICAgdGhpcy5zaG93U2FtcGxlID0gZmFsc2VcclxuICAgICAgdGhpcy5zaG93U3VidGl0bGUgPSBmYWxzZVxyXG5cclxuICAgICAgY29uc29sZS5sb2coXywgdXBweUZpbGVzLCBmaWxlKVxyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRlZC5lbWl0KGZpbGUpXHJcbiAgICAgIHRoaXMuZmlsZS5zZXQodXBweUZpbGVzWzBdLmRhdGEgYXMgRmlsZSlcclxuXHJcbiAgICAgIFBhcGEucGFyc2UoZmlsZSwge1xyXG4gICAgICAgIHNraXBFbXB0eUxpbmVzOiAnZ3JlZWR5JyxcclxuICAgICAgICBoZWFkZXI6IHRydWUsXHJcbiAgICAgICAgYmVmb3JlRmlyc3RDaHVuazogKF9jaHVuaykgPT4ge1xyXG4gIFxyXG4gICAgICAgICAgY29uc3Qgd2l0aE91dEhlYWRlciA9IF9jaHVuay5zcGxpdCgvXFxyP1xcbi8pLnNsaWNlKDEpXHJcbiAgICAgICAgICBpZiAod2l0aE91dEhlYWRlclt3aXRoT3V0SGVhZGVyLmxlbmd0aCAtIDFdID09PSAnJykgd2l0aE91dEhlYWRlci5wb3AoKVxyXG4gICAgICAgICAgdGhpcy5yb3dTdW1tYXJ5LnVwZGF0ZShyZXMgPT4gKHsuLi5yZXMsIHJvd0NvdW50OiB3aXRoT3V0SGVhZGVyLmxlbmd0aH0pKVxyXG4gICAgICAgICAgd2l0aE91dEhlYWRlci5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgXHJcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5Um93ID0gcm93LnNwbGl0KCcsJykuZXZlcnkocm93ID0+IHJvdyA9PT0gJycpXHJcbiAgXHJcbiAgICAgICAgICAgIGlmIChlbXB0eVJvdykgdGhpcy5yb3dTdW1tYXJ5LnVwZGF0ZShyZXMgPT4gKHsuLi5yZXMsIHJvd0VtcHR5OiByZXMucm93RW1wdHkgKyAxfSkpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgcmV0dXJuIF9jaHVuazsgLy8gUmV0dXJuIHRoZSBvcmlnaW5hbCBjaHVuayB0byBjb250aW51ZSBwYXJzaW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcihlcnJvciwgZmlsZSkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJywgZXJyb3IsIGZpbGUpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKHJlc3VsdHMsIF9maWxlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9uUGFyc2VyLmVtaXQocmVzdWx0cy5kYXRhKVxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMudXBweS5vbignY29tcGxldGUnLCAodXBweUZpbGVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IG11bHRpcGxlRmlsZXMgPSB1cHB5RmlsZXMuc3VjY2Vzc2Z1bD8ubWFwKGQgPT4gKHtmaWxlOiBkLmRhdGEsIGlkOiBkLmlkfSkpID8/IFtdXHJcbiAgICAgIGNvbnN0IGZpbGUgPSB1cHB5RmlsZXMuc3VjY2Vzc2Z1bCFbMF0/LmRhdGFcclxuICAgICAgdGhpcy5zaG93U2FtcGxlID0gZmFsc2VcclxuICAgICAgdGhpcy5zaG93U3VidGl0bGUgPSBmYWxzZVxyXG5cclxuICAgICAgY29uc29sZS5sb2coZmlsZSlcclxuICAgICAgdGhpcy5maWxlVXBsb2FkQ29tcGxldGUuZW1pdChmaWxlKVxyXG4gICAgICB0aGlzLm11bHRpcGxlRmlsZXNVcGxvYWRlZC5lbWl0KG11bHRpcGxlRmlsZXMpXHJcbiAgICAgIHRoaXMuZmlsZS5zZXQoZmlsZSBhcyBGaWxlKVxyXG4gICAgICB0aGlzLm11bHRpcGxlRmlsZXMuc2V0KG11bHRpcGxlRmlsZXMpXHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMudXBweS5vbigndHJhbnNsb2FkaXQ6dXBsb2FkJywgKHgsIHkpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coeCwgeSlcclxuICAgIH0pO1xyXG4gICAgdGhpcy51cHB5Lm9uKCd0cmFuc2xvYWRpdDpyZXN1bHQnLCAoc3RlcE5hbWUsIHJlc3VsdCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhzdGVwTmFtZSwgcmVzdWx0KVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51cHB5Lm9uKCdmaWxlLXJlbW92ZWQnLCAoZikgPT4ge1xyXG4gICAgICB0aGlzLnNob3dTYW1wbGUgPSB0cnVlXHJcbiAgICAgIHRoaXMuc2hvd1N1YnRpdGxlID0gdHJ1ZVxyXG4gICAgICB0aGlzLmZpbGUuc2V0KG51bGwpXHJcbiAgICAgIGNvbnN0IGN1cnJlbnRGaWxlcyA9IHRoaXMubXVsdGlwbGVGaWxlcygpO1xyXG4gICAgICBjb25zdCB1cGRhdGVkRmlsZXMgPSBjdXJyZW50RmlsZXMuZmlsdGVyKHIgPT4gci5pZCAhPSBmLmlkKVxyXG4gICAgICB0aGlzLm11bHRpcGxlRmlsZXMuc2V0KHVwZGF0ZWRGaWxlcylcclxuICAgICAgdGhpcy5maWxlUmVtb3ZlZC5lbWl0KGYuaWQpICBcclxuICAgICAgdGhpcy5yb3dTdW1tYXJ5LnNldCh7cm93Q291bnQ6IDAsIHJvd0VtcHR5OiAwfSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydHMgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgaW50byBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZy5cclxuICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBjb252ZXJ0LlxyXG4gICAqIEBwYXJhbSBkZWNpbWFsUG9pbnRzIFRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gZGlzcGxheS4gRGVmYXVsdHMgdG8gMi5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyBpbiB0aGUgZm9ybSBvZiBcIlguWFggW3VuaXRdXCIgd2hlcmUgWCBpcyB0aGUgbnVtZXJpY2FsIHZhbHVlIGFuZCB1bml0IGlzIHRoZSBhcHByb3ByaWF0ZSB1bml0IG9mIG1lYXN1cmVtZW50IChCeXRlcywgS0IsIE1CLCBHQiwgZXRjLikuXHJcbiAgICovXHJcbiAgZm9ybWF0RmlsZVNpemUoYnl0ZXM6IG51bWJlciwgZGVjaW1hbFBvaW50cyA9IDIpOiBzdHJpbmcge1xyXG4gICAgaWYoYnl0ZXMgPT09IDApIHtcclxuICAgICAgcmV0dXJuIGAwIGJ5dGVzYFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKFVwcHlDb21wb25lbnQua2lsb2J5dGUpKVxyXG4gICAgY29uc3Qgc2l6ZSA9IChieXRlcyAvIE1hdGgucG93KFVwcHlDb21wb25lbnQua2lsb2J5dGUsaSkpXHJcbiAgICByZXR1cm4gYCR7c2l6ZS50b0ZpeGVkKGRlY2ltYWxQb2ludHMpfSAke1VwcHlDb21wb25lbnQuc2l6ZXNbaV19YFxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgIDx1cHB5LWRhc2hib2FyZCBbdXBweV09XCJ1cHB5XCIgW3Byb3BzXT1cImRhc2hib2FyZFByb3BzXCI+IDwvdXBweS1kYXNoYm9hcmQ+XHJcbiAgICA8c21hbGwgKm5nSWY9XCJzdWJ0aXRsZSAmJiBzaG93U3VidGl0bGVcIiBjbGFzcz1cInN1YnRpdGxlIHBvc2l0aW9uLWFic29sdXRlXCI+e3tzdWJ0aXRsZX19PC9zbWFsbD5cclxuICAgIDxhICpuZ0lmPVwic2FtcGxlVXJsICYmIHNob3dTYW1wbGVcIiBjbGFzcz1cInNhbXBsZSBwb3NpdGlvbi1hYnNvbHV0ZVwiIFtjbGFzcy50b3AtNThdPVwic3VidGl0bGVcIiByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICBbaHJlZl09XCJzYW1wbGVVcmxcIj5cclxuICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLWRvd25sb2FkIG1zLTNcIj48L2k+IERvd25sb2FkIFRlbXBsYXRlXHJcbiAgICA8L2E+XHJcblxyXG4gICAgQGlmIChmaWxlKCkgJiYgZmlsZSgpPy50eXBlID09PSAndGV4dC9jc3YnKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZyBkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTJcIiBzdHlsZT1cIm1hcmdpbjogMXJlbSAwIDAgMDtcIiByb2xlPVwiYWxlcnRcIj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJhbGVydC1oZWFkaW5nXCI+Q1NWIEZpbGUgQ29udGVudCBTdW1tYXJ5PC9oND5cclxuICAgICAgICA8aHI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJmcy02IG0tMFwiPnt7cm93U3VtbWFyeSgpLnJvd0NvdW50fX0gcm93cyBmb3VuZCA8bmctY29udGFpbmVyICpuZ0lmPVwicm93U3VtbWFyeSgpLnJvd0VtcHR5ID4gMFwiPi1cclxuICAgICAgICAgICAgICAgIHt7cm93U3VtbWFyeSgpLnJvd0VtcHR5fX0gZW1wdHkgaW4gdGhlIENTViB5b3UgdXBsb2FkZWQ8L25nLWNvbnRhaW5lcj48L3A+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICB9XHJcbjwvZGl2PiJdfQ==
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBweS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZWFscG9zLW5wbS9uZy1kZWFscG9zLWxpYnJhcnkvY29tcG9uZW50cy91cHB5LWZpbGUtdXBsb2FkL3NyYy91cHB5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RlYWxwb3MtbnBtL25nLWRlYWxwb3MtbGlicmFyeS9jb21wb25lbnRzL3VwcHktZmlsZS11cGxvYWQvc3JjL3VwcHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsQyxPQUFPLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sb0NBQW9DLENBQUM7QUFLNUMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDOzs7O0FBUzdCLE1BQU0sT0FBTyxhQUFhO2FBK0JULFVBQUssR0FBRztRQUNyQixPQUFPO1FBQ1AsSUFBSTtRQUNKLElBQUk7UUFDSixJQUFJO1FBQ0osSUFBSTtRQUNKLElBQUk7UUFDSixJQUFJO1FBQ0osSUFBSTtRQUNKLElBQUk7S0FDSSxBQVZVLENBVVQ7YUFDSSxh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N0MsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BFLENBQUM7OEdBdEtVLGFBQWE7a0dBQWIsYUFBYSxxb0NDakMxQixnOUJBaUJNLDZXRFlNLDBCQUEwQix5SUFBRSxZQUFZOzsyRkFJdkMsYUFBYTtrQkFQekIsU0FBUzsrQkFDRSxVQUFVLGNBQ1IsSUFBSSxXQUNQLENBQUMsMEJBQTBCLEVBQUUsWUFBWSxDQUFDO3dEQUsxQyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRU4sVUFBVTtzQkFEVCxLQUFLO2dCQVNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBlZmZlY3QsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGluamVjdCxcclxuICBpbnB1dCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT3V0cHV0LFxyXG4gIHNpZ25hbCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb252ZXJ0Q3N2U2VydmljZSB9IGZyb20gJ0BkZWFscG9zLW5wbS9uZy1kZWFscG9zLWxpYnJhcnkvc2VydmljZXMvY3N2LXBhcnNlcic7XHJcbmltcG9ydCB7IEh0dHBTZXJ2aWNlIH0gZnJvbSAnQGRlYWxwb3MtbnBtL25nLWRlYWxwb3MtbGlicmFyeS9zZXJ2aWNlcy9odHRwJztcclxuaW1wb3J0IHsgVXBweUFuZ3VsYXJEYXNoYm9hcmRNb2R1bGUgfSBmcm9tICdAdXBweS9hbmd1bGFyJztcclxuaW1wb3J0IENvbXByZXNzb3IgZnJvbSAnQHVwcHkvY29tcHJlc3Nvcic7XHJcbmltcG9ydCB7IFVwcHkgfSBmcm9tICdAdXBweS9jb3JlJztcclxuaW1wb3J0ICdAdXBweS9jb3JlL2Rpc3Qvc3R5bGUubWluLmNzcyc7XHJcbmltcG9ydCAnQHVwcHkvZGFzaGJvYXJkL2Rpc3Qvc3R5bGUubWluLmNzcyc7XHJcbmltcG9ydCBUcmFuc2xvYWRpdCwge1xyXG4gIENPTVBBTklPTl9BTExPV0VEX0hPU1RTLFxyXG4gIENPTVBBTklPTl9VUkwsXHJcbn0gZnJvbSAnQHVwcHkvdHJhbnNsb2FkaXQnO1xyXG5pbXBvcnQgUGFwYSBmcm9tICdwYXBhcGFyc2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdQT1MtdXBweScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbVXBweUFuZ3VsYXJEYXNoYm9hcmRNb2R1bGUsIENvbW1vbk1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3VwcHkuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi91cHB5LmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVwcHlDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIHNhbXBsZVVybDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgc3VidGl0bGU6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2hvd1NhbXBsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqXHJcbiAgICogRm9yIG1hbnVhbGx5IHJlc2V0dGluZyBVcHB5IGFmdGVyIGEgc3VjY2Vzc2Z1bCB1cGxvYWRcclxuICAgKi9cclxuICBjbGVhciA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBzaG93U3VidGl0bGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHVwcHlDb3JlQ29uZmlndXJhdGlvbiA9IGlucHV0PGFueT4oKTtcclxuICBkYXNoYm9hcmRQcm9wc0NvbmZpZ3VyYXRpb24gPSBpbnB1dDxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZpbGVVcGxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QmxvYiB8IEZpbGU+KCk7XHJcbiAgQE91dHB1dCgpIGZpbGVVcGxvYWRDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8QmxvYiB8IEZpbGU+KCk7XHJcbiAgQE91dHB1dCgpIGZpbGVSZW1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIG9uUGFyc2VyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG11bHRpcGxlRmlsZXNVcGxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8XHJcbiAgICB7IGZpbGU6IEJsb2IgfCBGaWxlOyBpZDogc3RyaW5nIH1bXVxyXG4gID4oKTtcclxuXHJcbiAgaHR0cCA9IGluamVjdChIdHRwU2VydmljZSk7XHJcbiAgY3N2UGFyc2VyID0gaW5qZWN0KENvbnZlcnRDc3ZTZXJ2aWNlKTtcclxuXHJcbiAgcm93U3VtbWFyeSA9IHNpZ25hbDx7IHJvd0NvdW50OiBudW1iZXI7IHJvd0VtcHR5OiBudW1iZXIgfT4oe1xyXG4gICAgcm93Q291bnQ6IDAsXHJcbiAgICByb3dFbXB0eTogMCxcclxuICB9KTtcclxuXHJcbiAgZmlsZSA9IHNpZ25hbDxGaWxlIHwgbnVsbD4obnVsbCk7XHJcbiAgbXVsdGlwbGVGaWxlcyA9IHNpZ25hbDx7IGZpbGU6IEJsb2IgfCBGaWxlOyBpZDogc3RyaW5nIH1bXT4oW10pO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBzaXplcyA9IFtcclxuICAgICdCeXRlcycsXHJcbiAgICAnS0InLFxyXG4gICAgJ01CJyxcclxuICAgICdHQicsXHJcbiAgICAnVEInLFxyXG4gICAgJ1BCJyxcclxuICAgICdFQicsXHJcbiAgICAnWkInLFxyXG4gICAgJ1lCJyxcclxuICBdIGFzIGNvbnN0O1xyXG4gIHByaXZhdGUgc3RhdGljIGtpbG9ieXRlID0gMTAyNDtcclxuXHJcbiAgdXBweTogVXBweSA9IG5ldyBVcHB5KHtcclxuICAgIGRlYnVnOiB0cnVlLFxyXG4gICAgYXV0b1Byb2NlZWQ6IHRydWUsXHJcbiAgICBhbGxvd011bHRpcGxlVXBsb2FkQmF0Y2hlczogZmFsc2UsXHJcbiAgICByZXN0cmljdGlvbnM6IHtcclxuICAgICAgYWxsb3dlZEZpbGVUeXBlczogWycuY3N2J10sXHJcbiAgICAgIG1heFRvdGFsRmlsZVNpemU6IDEwMDAwMDAsXHJcbiAgICB9LFxyXG4gIH0pLnVzZShDb21wcmVzc29yLCB7XHJcbiAgICBtaW1lVHlwZTogJ2ltYWdlL2pwZWcnLFxyXG4gICAgY29udmVydFNpemU6IEluZmluaXR5LFxyXG4gICAgY29udmVydFR5cGVzOiBbJ2ltYWdlL3BuZyddLFxyXG4gIH0pO1xyXG5cclxuICBkYXNoYm9hcmRQcm9wcyA9IHtcclxuICAgIGhpZGVVcGxvYWRCdXR0b246IHRydWUsXHJcbiAgICBoZWlnaHQ6IDM1MCxcclxuICB9O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIGVmZmVjdCgoKSA9PiB0aGlzLnVwcHkuc2V0T3B0aW9ucyh7IC4uLnRoaXMudXBweUNvcmVDb25maWd1cmF0aW9uKCkgfSkpO1xyXG4gICAgZWZmZWN0KFxyXG4gICAgICAoKSA9PlxyXG4gICAgICAgICh0aGlzLmRhc2hib2FyZFByb3BzID0ge1xyXG4gICAgICAgICAgLi4udGhpcy5kYXNoYm9hcmRQcm9wcyxcclxuICAgICAgICAgIC4uLnRoaXMuZGFzaGJvYXJkUHJvcHNDb25maWd1cmF0aW9uKCksXHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy51cHB5Lm9uKCd1cGxvYWQnLCAoXywgdXBweUZpbGVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSB1cHB5RmlsZXNbMF0/LmRhdGEgYXMgRmlsZTtcclxuICAgICAgdGhpcy5zaG93U2FtcGxlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2hvd1N1YnRpdGxlID0gZmFsc2U7XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyhfLCB1cHB5RmlsZXMsIGZpbGUpO1xyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRlZC5lbWl0KGZpbGUpO1xyXG4gICAgICB0aGlzLmZpbGUuc2V0KHVwcHlGaWxlc1swXS5kYXRhIGFzIEZpbGUpO1xyXG5cclxuICAgICAgUGFwYS5wYXJzZShmaWxlLCB7XHJcbiAgICAgICAgc2tpcEVtcHR5TGluZXM6ICdncmVlZHknLFxyXG4gICAgICAgIGhlYWRlcjogdHJ1ZSxcclxuICAgICAgICBiZWZvcmVGaXJzdENodW5rOiAoX2NodW5rKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB3aXRoT3V0SGVhZGVyID0gX2NodW5rLnNwbGl0KC9cXHI/XFxuLykuc2xpY2UoMSk7XHJcbiAgICAgICAgICBpZiAod2l0aE91dEhlYWRlclt3aXRoT3V0SGVhZGVyLmxlbmd0aCAtIDFdID09PSAnJylcclxuICAgICAgICAgICAgd2l0aE91dEhlYWRlci5wb3AoKTtcclxuICAgICAgICAgIHRoaXMucm93U3VtbWFyeS51cGRhdGUoKHJlcykgPT4gKHtcclxuICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICByb3dDb3VudDogd2l0aE91dEhlYWRlci5sZW5ndGgsXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICB3aXRoT3V0SGVhZGVyLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbXB0eVJvdyA9IHJvdy5zcGxpdCgnLCcpLmV2ZXJ5KChyb3cpID0+IHJvdyA9PT0gJycpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVtcHR5Um93KVxyXG4gICAgICAgICAgICAgIHRoaXMucm93U3VtbWFyeS51cGRhdGUoKHJlcykgPT4gKHtcclxuICAgICAgICAgICAgICAgIC4uLnJlcyxcclxuICAgICAgICAgICAgICAgIHJvd0VtcHR5OiByZXMucm93RW1wdHkgKyAxLFxyXG4gICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuIF9jaHVuazsgLy8gUmV0dXJuIHRoZSBvcmlnaW5hbCBjaHVuayB0byBjb250aW51ZSBwYXJzaW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcihlcnJvciwgZmlsZSkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJywgZXJyb3IsIGZpbGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6IChyZXN1bHRzLCBfZmlsZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vblBhcnNlci5lbWl0KHJlc3VsdHMuZGF0YSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnVwcHkub24oJ2NvbXBsZXRlJywgKHVwcHlGaWxlcykgPT4ge1xyXG4gICAgICBjb25zdCBtdWx0aXBsZUZpbGVzID1cclxuICAgICAgICB1cHB5RmlsZXMuc3VjY2Vzc2Z1bD8ubWFwKChkKSA9PiAoeyBmaWxlOiBkLmRhdGEsIGlkOiBkLmlkIH0pKSA/PyBbXTtcclxuICAgICAgY29uc3QgZmlsZSA9IHVwcHlGaWxlcy5zdWNjZXNzZnVsIVswXT8uZGF0YTtcclxuICAgICAgdGhpcy5zaG93U2FtcGxlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2hvd1N1YnRpdGxlID0gZmFsc2U7XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyhmaWxlKTtcclxuICAgICAgdGhpcy5maWxlVXBsb2FkQ29tcGxldGUuZW1pdChmaWxlKTtcclxuICAgICAgdGhpcy5tdWx0aXBsZUZpbGVzVXBsb2FkZWQuZW1pdChtdWx0aXBsZUZpbGVzKTtcclxuICAgICAgdGhpcy5maWxlLnNldChmaWxlIGFzIEZpbGUpO1xyXG4gICAgICB0aGlzLm11bHRpcGxlRmlsZXMuc2V0KG11bHRpcGxlRmlsZXMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51cHB5Lm9uKCd0cmFuc2xvYWRpdDp1cGxvYWQnLCAoeCwgeSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyh4LCB5KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy51cHB5Lm9uKCd0cmFuc2xvYWRpdDpyZXN1bHQnLCAoc3RlcE5hbWUsIHJlc3VsdCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhzdGVwTmFtZSwgcmVzdWx0KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudXBweS5vbignZmlsZS1yZW1vdmVkJywgKGYpID0+IHtcclxuICAgICAgdGhpcy5zaG93U2FtcGxlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5zaG93U3VidGl0bGUgPSB0cnVlO1xyXG4gICAgICB0aGlzLmZpbGUuc2V0KG51bGwpO1xyXG4gICAgICBjb25zdCBjdXJyZW50RmlsZXMgPSB0aGlzLm11bHRpcGxlRmlsZXMoKTtcclxuICAgICAgY29uc3QgdXBkYXRlZEZpbGVzID0gY3VycmVudEZpbGVzLmZpbHRlcigocikgPT4gci5pZCAhPSBmLmlkKTtcclxuICAgICAgdGhpcy5tdWx0aXBsZUZpbGVzLnNldCh1cGRhdGVkRmlsZXMpO1xyXG4gICAgICB0aGlzLmZpbGVSZW1vdmVkLmVtaXQoZi5pZCk7XHJcbiAgICAgIHRoaXMucm93U3VtbWFyeS5zZXQoeyByb3dDb3VudDogMCwgcm93RW1wdHk6IDAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydjbGVhciddPy5jdXJyZW50VmFsdWUgPT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnVwcHkuY2xlYXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnRzIGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGludG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuXHJcbiAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29udmVydC5cclxuICAgKiBAcGFyYW0gZGVjaW1hbFBvaW50cyBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIGRpc3BsYXkuIERlZmF1bHRzIHRvIDIuXHJcbiAgICogQHJldHVybnMgQSBzdHJpbmcgaW4gdGhlIGZvcm0gb2YgXCJYLlhYIFt1bml0XVwiIHdoZXJlIFggaXMgdGhlIG51bWVyaWNhbCB2YWx1ZSBhbmQgdW5pdCBpcyB0aGUgYXBwcm9wcmlhdGUgdW5pdCBvZiBtZWFzdXJlbWVudCAoQnl0ZXMsIEtCLCBNQiwgR0IsIGV0Yy4pLlxyXG4gICAqL1xyXG4gIGZvcm1hdEZpbGVTaXplKGJ5dGVzOiBudW1iZXIsIGRlY2ltYWxQb2ludHMgPSAyKTogc3RyaW5nIHtcclxuICAgIGlmIChieXRlcyA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gYDAgYnl0ZXNgO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKFVwcHlDb21wb25lbnQua2lsb2J5dGUpKTtcclxuICAgIGNvbnN0IHNpemUgPSBieXRlcyAvIE1hdGgucG93KFVwcHlDb21wb25lbnQua2lsb2J5dGUsIGkpO1xyXG4gICAgcmV0dXJuIGAke3NpemUudG9GaXhlZChkZWNpbWFsUG9pbnRzKX0gJHtVcHB5Q29tcG9uZW50LnNpemVzW2ldfWA7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgPHVwcHktZGFzaGJvYXJkIFt1cHB5XT1cInVwcHlcIiBbcHJvcHNdPVwiZGFzaGJvYXJkUHJvcHNcIj4gPC91cHB5LWRhc2hib2FyZD5cclxuICAgIDxzbWFsbCAqbmdJZj1cInN1YnRpdGxlICYmIHNob3dTdWJ0aXRsZVwiIGNsYXNzPVwic3VidGl0bGUgcG9zaXRpb24tYWJzb2x1dGVcIj57e3N1YnRpdGxlfX08L3NtYWxsPlxyXG4gICAgPGEgKm5nSWY9XCJzYW1wbGVVcmwgJiYgc2hvd1NhbXBsZVwiIGNsYXNzPVwic2FtcGxlIHBvc2l0aW9uLWFic29sdXRlXCIgW2NsYXNzLnRvcC01OF09XCJzdWJ0aXRsZVwiIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgIFtocmVmXT1cInNhbXBsZVVybFwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtZG93bmxvYWQgbXMtM1wiPjwvaT4gRG93bmxvYWQgVGVtcGxhdGVcclxuICAgIDwvYT5cclxuXHJcbiAgICBAaWYgKGZpbGUoKSAmJiBmaWxlKCk/LnR5cGUgPT09ICd0ZXh0L2NzdicpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nIGQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMlwiIHN0eWxlPVwibWFyZ2luOiAxcmVtIDAgMCAwO1wiIHJvbGU9XCJhbGVydFwiPlxyXG4gICAgICAgIDxoNCBjbGFzcz1cImFsZXJ0LWhlYWRpbmdcIj5DU1YgRmlsZSBDb250ZW50IFN1bW1hcnk8L2g0PlxyXG4gICAgICAgIDxocj5cclxuICAgICAgICA8cCBjbGFzcz1cImZzLTYgbS0wXCI+e3tyb3dTdW1tYXJ5KCkucm93Q291bnR9fSByb3dzIGZvdW5kIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dTdW1tYXJ5KCkucm93RW1wdHkgPiAwXCI+LVxyXG4gICAgICAgICAgICAgICAge3tyb3dTdW1tYXJ5KCkucm93RW1wdHl9fSBlbXB0eSBpbiB0aGUgQ1NWIHlvdSB1cGxvYWRlZDwvbmctY29udGFpbmVyPjwvcD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIH1cclxuPC9kaXY+Il19
@@ -13,12 +13,26 @@ import '@uppy/dashboard/dist/style.min.css';
13
13
  import Papa from 'papaparse';
14
14
 
15
15
  class UppyComponent {
16
- static { this.sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; }
16
+ static { this.sizes = [
17
+ 'Bytes',
18
+ 'KB',
19
+ 'MB',
20
+ 'GB',
21
+ 'TB',
22
+ 'PB',
23
+ 'EB',
24
+ 'ZB',
25
+ 'YB',
26
+ ]; }
17
27
  static { this.kilobyte = 1024; }
18
28
  constructor() {
19
29
  this.sampleUrl = '';
20
30
  this.subtitle = '';
21
31
  this.showSample = true;
32
+ /**
33
+ * For manually resetting Uppy after a successful upload
34
+ */
35
+ this.clear = input(false);
22
36
  this.showSubtitle = true;
23
37
  this.uppyCoreConfiguration = input();
24
38
  this.dashboardPropsConfiguration = input();
@@ -29,7 +43,10 @@ class UppyComponent {
29
43
  this.multipleFilesUploaded = new EventEmitter();
30
44
  this.http = inject(HttpService);
31
45
  this.csvParser = inject(ConvertCsvService);
32
- this.rowSummary = signal({ rowCount: 0, rowEmpty: 0 });
46
+ this.rowSummary = signal({
47
+ rowCount: 0,
48
+ rowEmpty: 0,
49
+ });
33
50
  this.file = signal(null);
34
51
  this.multipleFiles = signal([]);
35
52
  this.uppy = new Uppy({
@@ -38,21 +55,22 @@ class UppyComponent {
38
55
  allowMultipleUploadBatches: false,
39
56
  restrictions: {
40
57
  allowedFileTypes: ['.csv'],
41
- maxTotalFileSize: 1000000
58
+ maxTotalFileSize: 1000000,
42
59
  },
43
- }).use(Compressor, { mimeType: 'image/jpeg', convertSize: Infinity, convertTypes: ['image/png'] });
44
- // .use(
45
- // Url, {
46
- // companionUrl: COMPANION_URL,
47
- // companionAllowedHosts: COMPANION_ALLOWED_HOSTS
48
- // }
49
- // );
60
+ }).use(Compressor, {
61
+ mimeType: 'image/jpeg',
62
+ convertSize: Infinity,
63
+ convertTypes: ['image/png'],
64
+ });
50
65
  this.dashboardProps = {
51
66
  hideUploadButton: true,
52
- height: 350
67
+ height: 350,
53
68
  };
54
69
  effect(() => this.uppy.setOptions({ ...this.uppyCoreConfiguration() }));
55
- effect(() => this.dashboardProps = ({ ...this.dashboardProps, ...this.dashboardPropsConfiguration() }));
70
+ effect(() => (this.dashboardProps = {
71
+ ...this.dashboardProps,
72
+ ...this.dashboardPropsConfiguration(),
73
+ }));
56
74
  this.uppy.on('upload', (_, uppyFiles) => {
57
75
  const file = uppyFiles[0]?.data;
58
76
  this.showSample = false;
@@ -67,11 +85,17 @@ class UppyComponent {
67
85
  const withOutHeader = _chunk.split(/\r?\n/).slice(1);
68
86
  if (withOutHeader[withOutHeader.length - 1] === '')
69
87
  withOutHeader.pop();
70
- this.rowSummary.update(res => ({ ...res, rowCount: withOutHeader.length }));
71
- withOutHeader.forEach(row => {
72
- const emptyRow = row.split(',').every(row => row === '');
88
+ this.rowSummary.update((res) => ({
89
+ ...res,
90
+ rowCount: withOutHeader.length,
91
+ }));
92
+ withOutHeader.forEach((row) => {
93
+ const emptyRow = row.split(',').every((row) => row === '');
73
94
  if (emptyRow)
74
- this.rowSummary.update(res => ({ ...res, rowEmpty: res.rowEmpty + 1 }));
95
+ this.rowSummary.update((res) => ({
96
+ ...res,
97
+ rowEmpty: res.rowEmpty + 1,
98
+ }));
75
99
  });
76
100
  return _chunk; // Return the original chunk to continue parsing
77
101
  },
@@ -84,7 +108,7 @@ class UppyComponent {
84
108
  });
85
109
  });
86
110
  this.uppy.on('complete', (uppyFiles) => {
87
- const multipleFiles = uppyFiles.successful?.map(d => ({ file: d.data, id: d.id })) ?? [];
111
+ const multipleFiles = uppyFiles.successful?.map((d) => ({ file: d.data, id: d.id })) ?? [];
88
112
  const file = uppyFiles.successful[0]?.data;
89
113
  this.showSample = false;
90
114
  this.showSubtitle = false;
@@ -105,12 +129,17 @@ class UppyComponent {
105
129
  this.showSubtitle = true;
106
130
  this.file.set(null);
107
131
  const currentFiles = this.multipleFiles();
108
- const updatedFiles = currentFiles.filter(r => r.id != f.id);
132
+ const updatedFiles = currentFiles.filter((r) => r.id != f.id);
109
133
  this.multipleFiles.set(updatedFiles);
110
134
  this.fileRemoved.emit(f.id);
111
135
  this.rowSummary.set({ rowCount: 0, rowEmpty: 0 });
112
136
  });
113
137
  }
138
+ ngOnChanges(changes) {
139
+ if (changes['clear']?.currentValue == true) {
140
+ this.uppy.clear();
141
+ }
142
+ }
114
143
  /**
115
144
  * Converts a given number of bytes into a human-readable string.
116
145
  * @param bytes The number of bytes to convert.
@@ -122,11 +151,11 @@ class UppyComponent {
122
151
  return `0 bytes`;
123
152
  }
124
153
  const i = Math.floor(Math.log(bytes) / Math.log(UppyComponent.kilobyte));
125
- const size = (bytes / Math.pow(UppyComponent.kilobyte, i));
154
+ const size = bytes / Math.pow(UppyComponent.kilobyte, i);
126
155
  return `${size.toFixed(decimalPoints)} ${UppyComponent.sizes[i]}`;
127
156
  }
128
157
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: UppyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
129
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: UppyComponent, isStandalone: true, selector: "POS-uppy", inputs: { sampleUrl: { classPropertyName: "sampleUrl", publicName: "sampleUrl", isSignal: false, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: false, isRequired: false, transformFunction: null }, uppyCoreConfiguration: { classPropertyName: "uppyCoreConfiguration", publicName: "uppyCoreConfiguration", isSignal: true, isRequired: false, transformFunction: null }, dashboardPropsConfiguration: { classPropertyName: "dashboardPropsConfiguration", publicName: "dashboardPropsConfiguration", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fileUploaded: "fileUploaded", fileUploadComplete: "fileUploadComplete", fileRemoved: "fileRemoved", onParser: "onParser", multipleFilesUploaded: "multipleFilesUploaded" }, ngImport: i0, template: "<div class=\"position-relative\">\r\n <uppy-dashboard [uppy]=\"uppy\" [props]=\"dashboardProps\"> </uppy-dashboard>\r\n <small *ngIf=\"subtitle && showSubtitle\" class=\"subtitle position-absolute\">{{subtitle}}</small>\r\n <a *ngIf=\"sampleUrl && showSample\" class=\"sample position-absolute\" [class.top-58]=\"subtitle\" role=\"button\"\r\n [href]=\"sampleUrl\">\r\n <i class=\"fa-solid fa-download ms-3\"></i> Download Template\r\n </a>\r\n\r\n @if (file() && file()?.type === 'text/csv') {\r\n <div class=\"alert alert-warning d-flex flex-column gap-2\" style=\"margin: 1rem 0 0 0;\" role=\"alert\">\r\n <h4 class=\"alert-heading\">CSV File Content Summary</h4>\r\n <hr>\r\n <p class=\"fs-6 m-0\">{{rowSummary().rowCount}} rows found <ng-container *ngIf=\"rowSummary().rowEmpty > 0\">-\r\n {{rowSummary().rowEmpty}} empty in the CSV you uploaded</ng-container></p>\r\n </div>\r\n\r\n }\r\n</div>", styles: ["::ng-deep .uppy-Dashboard-AddFiles-info{display:none!important}::ng-deep .uppy-Dashboard-AddFiles-list{flex:none;flex-direction:row;flex-wrap:wrap;justify-content:center;max-width:600px;margin-top:15px;padding-top:0;overflow-y:visible}.sample,.subtitle{top:56%;width:100%;text-align:center}.top-58{top:61%}\n"], dependencies: [{ kind: "ngmodule", type: UppyAngularDashboardModule }, { kind: "component", type: i1.DashboardComponent, selector: "uppy-dashboard", inputs: ["uppy", "props"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
158
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: UppyComponent, isStandalone: true, selector: "POS-uppy", inputs: { sampleUrl: { classPropertyName: "sampleUrl", publicName: "sampleUrl", isSignal: false, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: false, isRequired: false, transformFunction: null }, showSample: { classPropertyName: "showSample", publicName: "showSample", isSignal: false, isRequired: false, transformFunction: null }, clear: { classPropertyName: "clear", publicName: "clear", isSignal: true, isRequired: false, transformFunction: null }, uppyCoreConfiguration: { classPropertyName: "uppyCoreConfiguration", publicName: "uppyCoreConfiguration", isSignal: true, isRequired: false, transformFunction: null }, dashboardPropsConfiguration: { classPropertyName: "dashboardPropsConfiguration", publicName: "dashboardPropsConfiguration", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fileUploaded: "fileUploaded", fileUploadComplete: "fileUploadComplete", fileRemoved: "fileRemoved", onParser: "onParser", multipleFilesUploaded: "multipleFilesUploaded" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"position-relative\">\r\n <uppy-dashboard [uppy]=\"uppy\" [props]=\"dashboardProps\"> </uppy-dashboard>\r\n <small *ngIf=\"subtitle && showSubtitle\" class=\"subtitle position-absolute\">{{subtitle}}</small>\r\n <a *ngIf=\"sampleUrl && showSample\" class=\"sample position-absolute\" [class.top-58]=\"subtitle\" role=\"button\"\r\n [href]=\"sampleUrl\">\r\n <i class=\"fa-solid fa-download ms-3\"></i> Download Template\r\n </a>\r\n\r\n @if (file() && file()?.type === 'text/csv') {\r\n <div class=\"alert alert-warning d-flex flex-column gap-2\" style=\"margin: 1rem 0 0 0;\" role=\"alert\">\r\n <h4 class=\"alert-heading\">CSV File Content Summary</h4>\r\n <hr>\r\n <p class=\"fs-6 m-0\">{{rowSummary().rowCount}} rows found <ng-container *ngIf=\"rowSummary().rowEmpty > 0\">-\r\n {{rowSummary().rowEmpty}} empty in the CSV you uploaded</ng-container></p>\r\n </div>\r\n\r\n }\r\n</div>", styles: ["::ng-deep .uppy-Dashboard-AddFiles-info{display:none!important}::ng-deep .uppy-Dashboard-AddFiles-list{flex:none;flex-direction:row;flex-wrap:wrap;justify-content:center;max-width:600px;margin-top:15px;padding-top:0;overflow-y:visible}.sample,.subtitle{top:56%;width:100%;text-align:center}.top-58{top:61%}\n"], dependencies: [{ kind: "ngmodule", type: UppyAngularDashboardModule }, { kind: "component", type: i1.DashboardComponent, selector: "uppy-dashboard", inputs: ["uppy", "props"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
130
159
  }
131
160
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: UppyComponent, decorators: [{
132
161
  type: Component,
@@ -135,6 +164,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
135
164
  type: Input
136
165
  }], subtitle: [{
137
166
  type: Input
167
+ }], showSample: [{
168
+ type: Input
138
169
  }], fileUploaded: [{
139
170
  type: Output
140
171
  }], fileUploadComplete: [{
@@ -1 +1 @@
1
- {"version":3,"file":"dealpos-npm-ng-dealpos-library-components-uppy-file-upload.mjs","sources":["../../../projects/dealpos-npm/ng-dealpos-library/components/uppy-file-upload/src/uppy.component.ts","../../../projects/dealpos-npm/ng-dealpos-library/components/uppy-file-upload/src/uppy.component.html","../../../projects/dealpos-npm/ng-dealpos-library/components/uppy-file-upload/dealpos-npm-ng-dealpos-library-components-uppy-file-upload.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { Component, effect, EventEmitter, inject, input, Input, Output, signal } from '@angular/core';\r\nimport { Constants } from '@dealpos-npm/ng-dealpos-library/constants';\r\nimport { ConvertCsvService } from '@dealpos-npm/ng-dealpos-library/services/csv-parser';\r\nimport { HttpService } from '@dealpos-npm/ng-dealpos-library/services/http';\r\nimport { UppyAngularDashboardModule } from '@uppy/angular';\r\nimport Compressor from '@uppy/compressor';\r\nimport { Uppy } from '@uppy/core';\r\nimport '@uppy/core/dist/style.min.css';\r\nimport '@uppy/dashboard/dist/style.min.css';\r\nimport Transloadit, { COMPANION_ALLOWED_HOSTS, COMPANION_URL } from '@uppy/transloadit';\r\nimport Url from '@uppy/url/lib/Url';\r\nimport Papa from 'papaparse';\r\n\r\n@Component({\r\n selector: 'POS-uppy',\r\n standalone: true,\r\n imports: [UppyAngularDashboardModule, CommonModule],\r\n templateUrl: './uppy.component.html',\r\n styleUrl: './uppy.component.scss'\r\n})\r\nexport class UppyComponent {\r\n @Input() sampleUrl: string = ''\r\n @Input() subtitle: string = ''\r\n showSample: boolean = true\r\n showSubtitle: boolean = true;\r\n uppyCoreConfiguration = input<any>();\r\n dashboardPropsConfiguration = input<any>();\r\n @Output() fileUploaded = new EventEmitter<Blob | File>()\r\n @Output() fileUploadComplete = new EventEmitter<Blob | File>()\r\n @Output() fileRemoved = new EventEmitter<string>()\r\n @Output() onParser = new EventEmitter<any>()\r\n @Output() multipleFilesUploaded = new EventEmitter<{file: Blob | File, id: string}[]>()\r\n\r\n http = inject(HttpService)\r\n csvParser = inject(ConvertCsvService)\r\n\r\n rowSummary = signal<{rowCount: number, rowEmpty: number}>({rowCount: 0, rowEmpty: 0})\r\n\r\n file = signal<File | null>(null)\r\n multipleFiles = signal<{file: Blob | File, id: string}[]>([])\r\n\r\n private static sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] as const\r\n private static kilobyte = 1024\r\n\r\n uppy: Uppy = new Uppy({ \r\n debug: true, \r\n autoProceed: true, \r\n allowMultipleUploadBatches: false,\r\n restrictions: {\r\n allowedFileTypes: ['.csv'],\r\n maxTotalFileSize: 1000000\r\n },\r\n }).use(Compressor, {mimeType: 'image/jpeg', convertSize: Infinity, convertTypes: ['image/png']})\r\n // .use(\r\n // Url, {\r\n // companionUrl: COMPANION_URL,\r\n // companionAllowedHosts: COMPANION_ALLOWED_HOSTS\r\n // }\r\n // );\r\n \r\n dashboardProps = {\r\n hideUploadButton: true,\r\n height: 350\r\n }\r\n\r\n constructor() {\r\n effect(() => this.uppy.setOptions({...this.uppyCoreConfiguration()}))\r\n effect(() => this.dashboardProps = ({...this.dashboardProps, ...this.dashboardPropsConfiguration()}))\r\n\r\n this.uppy.on('upload', (_, uppyFiles) => {\r\n const file = uppyFiles[0]?.data as File\r\n this.showSample = false\r\n this.showSubtitle = false\r\n\r\n console.log(_, uppyFiles, file)\r\n this.fileUploaded.emit(file)\r\n this.file.set(uppyFiles[0].data as File)\r\n\r\n Papa.parse(file, {\r\n skipEmptyLines: 'greedy',\r\n header: true,\r\n beforeFirstChunk: (_chunk) => {\r\n \r\n const withOutHeader = _chunk.split(/\\r?\\n/).slice(1)\r\n if (withOutHeader[withOutHeader.length - 1] === '') withOutHeader.pop()\r\n this.rowSummary.update(res => ({...res, rowCount: withOutHeader.length}))\r\n withOutHeader.forEach(row => {\r\n \r\n const emptyRow = row.split(',').every(row => row === '')\r\n \r\n if (emptyRow) this.rowSummary.update(res => ({...res, rowEmpty: res.rowEmpty + 1}))\r\n })\r\n return _chunk; // Return the original chunk to continue parsing\r\n },\r\n error(error, file) {\r\n console.log('ERROR', error, file)\r\n },\r\n complete: (results, _file) => {\r\n this.onParser.emit(results.data)\r\n },\r\n })\r\n })\r\n\r\n this.uppy.on('complete', (uppyFiles) => {\r\n const multipleFiles = uppyFiles.successful?.map(d => ({file: d.data, id: d.id})) ?? []\r\n const file = uppyFiles.successful![0]?.data\r\n this.showSample = false\r\n this.showSubtitle = false\r\n\r\n console.log(file)\r\n this.fileUploadComplete.emit(file)\r\n this.multipleFilesUploaded.emit(multipleFiles)\r\n this.file.set(file as File)\r\n this.multipleFiles.set(multipleFiles)\r\n })\r\n\r\n this.uppy.on('transloadit:upload', (x, y) => {\r\n console.log(x, y)\r\n });\r\n this.uppy.on('transloadit:result', (stepName, result) => {\r\n console.log(stepName, result)\r\n });\r\n\r\n this.uppy.on('file-removed', (f) => {\r\n this.showSample = true\r\n this.showSubtitle = true\r\n this.file.set(null)\r\n const currentFiles = this.multipleFiles();\r\n const updatedFiles = currentFiles.filter(r => r.id != f.id)\r\n this.multipleFiles.set(updatedFiles)\r\n this.fileRemoved.emit(f.id) \r\n this.rowSummary.set({rowCount: 0, rowEmpty: 0})\r\n });\r\n }\r\n\r\n /**\r\n * Converts a given number of bytes into a human-readable string.\r\n * @param bytes The number of bytes to convert.\r\n * @param decimalPoints The number of decimal places to display. Defaults to 2.\r\n * @returns A string in the form of \"X.XX [unit]\" where X is the numerical value and unit is the appropriate unit of measurement (Bytes, KB, MB, GB, etc.).\r\n */\r\n formatFileSize(bytes: number, decimalPoints = 2): string {\r\n if(bytes === 0) {\r\n return `0 bytes`\r\n }\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(UppyComponent.kilobyte))\r\n const size = (bytes / Math.pow(UppyComponent.kilobyte,i))\r\n return `${size.toFixed(decimalPoints)} ${UppyComponent.sizes[i]}`\r\n }\r\n}\r\n","<div class=\"position-relative\">\r\n <uppy-dashboard [uppy]=\"uppy\" [props]=\"dashboardProps\"> </uppy-dashboard>\r\n <small *ngIf=\"subtitle && showSubtitle\" class=\"subtitle position-absolute\">{{subtitle}}</small>\r\n <a *ngIf=\"sampleUrl && showSample\" class=\"sample position-absolute\" [class.top-58]=\"subtitle\" role=\"button\"\r\n [href]=\"sampleUrl\">\r\n <i class=\"fa-solid fa-download ms-3\"></i> Download Template\r\n </a>\r\n\r\n @if (file() && file()?.type === 'text/csv') {\r\n <div class=\"alert alert-warning d-flex flex-column gap-2\" style=\"margin: 1rem 0 0 0;\" role=\"alert\">\r\n <h4 class=\"alert-heading\">CSV File Content Summary</h4>\r\n <hr>\r\n <p class=\"fs-6 m-0\">{{rowSummary().rowCount}} rows found <ng-container *ngIf=\"rowSummary().rowEmpty > 0\">-\r\n {{rowSummary().rowEmpty}} empty in the CSV you uploaded</ng-container></p>\r\n </div>\r\n\r\n }\r\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dealpos-npm-ng-dealpos-library-components-uppy-file-upload.mjs","sources":["../../../projects/dealpos-npm/ng-dealpos-library/components/uppy-file-upload/src/uppy.component.ts","../../../projects/dealpos-npm/ng-dealpos-library/components/uppy-file-upload/src/uppy.component.html","../../../projects/dealpos-npm/ng-dealpos-library/components/uppy-file-upload/dealpos-npm-ng-dealpos-library-components-uppy-file-upload.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n effect,\r\n EventEmitter,\r\n inject,\r\n input,\r\n Input,\r\n OnChanges,\r\n Output,\r\n signal,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { ConvertCsvService } from '@dealpos-npm/ng-dealpos-library/services/csv-parser';\r\nimport { HttpService } from '@dealpos-npm/ng-dealpos-library/services/http';\r\nimport { UppyAngularDashboardModule } from '@uppy/angular';\r\nimport Compressor from '@uppy/compressor';\r\nimport { Uppy } from '@uppy/core';\r\nimport '@uppy/core/dist/style.min.css';\r\nimport '@uppy/dashboard/dist/style.min.css';\r\nimport Transloadit, {\r\n COMPANION_ALLOWED_HOSTS,\r\n COMPANION_URL,\r\n} from '@uppy/transloadit';\r\nimport Papa from 'papaparse';\r\n\r\n@Component({\r\n selector: 'POS-uppy',\r\n standalone: true,\r\n imports: [UppyAngularDashboardModule, CommonModule],\r\n templateUrl: './uppy.component.html',\r\n styleUrl: './uppy.component.scss',\r\n})\r\nexport class UppyComponent implements OnChanges {\r\n @Input() sampleUrl: string = '';\r\n @Input() subtitle: string = '';\r\n @Input()\r\n showSample: boolean = true;\r\n /**\r\n * For manually resetting Uppy after a successful upload\r\n */\r\n clear = input<boolean>(false);\r\n showSubtitle: boolean = true;\r\n uppyCoreConfiguration = input<any>();\r\n dashboardPropsConfiguration = input<any>();\r\n @Output() fileUploaded = new EventEmitter<Blob | File>();\r\n @Output() fileUploadComplete = new EventEmitter<Blob | File>();\r\n @Output() fileRemoved = new EventEmitter<string>();\r\n @Output() onParser = new EventEmitter<any>();\r\n @Output() multipleFilesUploaded = new EventEmitter<\r\n { file: Blob | File; id: string }[]\r\n >();\r\n\r\n http = inject(HttpService);\r\n csvParser = inject(ConvertCsvService);\r\n\r\n rowSummary = signal<{ rowCount: number; rowEmpty: number }>({\r\n rowCount: 0,\r\n rowEmpty: 0,\r\n });\r\n\r\n file = signal<File | null>(null);\r\n multipleFiles = signal<{ file: Blob | File; id: string }[]>([]);\r\n\r\n private static sizes = [\r\n 'Bytes',\r\n 'KB',\r\n 'MB',\r\n 'GB',\r\n 'TB',\r\n 'PB',\r\n 'EB',\r\n 'ZB',\r\n 'YB',\r\n ] as const;\r\n private static kilobyte = 1024;\r\n\r\n uppy: Uppy = new Uppy({\r\n debug: true,\r\n autoProceed: true,\r\n allowMultipleUploadBatches: false,\r\n restrictions: {\r\n allowedFileTypes: ['.csv'],\r\n maxTotalFileSize: 1000000,\r\n },\r\n }).use(Compressor, {\r\n mimeType: 'image/jpeg',\r\n convertSize: Infinity,\r\n convertTypes: ['image/png'],\r\n });\r\n\r\n dashboardProps = {\r\n hideUploadButton: true,\r\n height: 350,\r\n };\r\n\r\n constructor() {\r\n effect(() => this.uppy.setOptions({ ...this.uppyCoreConfiguration() }));\r\n effect(\r\n () =>\r\n (this.dashboardProps = {\r\n ...this.dashboardProps,\r\n ...this.dashboardPropsConfiguration(),\r\n })\r\n );\r\n\r\n this.uppy.on('upload', (_, uppyFiles) => {\r\n const file = uppyFiles[0]?.data as File;\r\n this.showSample = false;\r\n this.showSubtitle = false;\r\n\r\n console.log(_, uppyFiles, file);\r\n this.fileUploaded.emit(file);\r\n this.file.set(uppyFiles[0].data as File);\r\n\r\n Papa.parse(file, {\r\n skipEmptyLines: 'greedy',\r\n header: true,\r\n beforeFirstChunk: (_chunk) => {\r\n const withOutHeader = _chunk.split(/\\r?\\n/).slice(1);\r\n if (withOutHeader[withOutHeader.length - 1] === '')\r\n withOutHeader.pop();\r\n this.rowSummary.update((res) => ({\r\n ...res,\r\n rowCount: withOutHeader.length,\r\n }));\r\n withOutHeader.forEach((row) => {\r\n const emptyRow = row.split(',').every((row) => row === '');\r\n\r\n if (emptyRow)\r\n this.rowSummary.update((res) => ({\r\n ...res,\r\n rowEmpty: res.rowEmpty + 1,\r\n }));\r\n });\r\n return _chunk; // Return the original chunk to continue parsing\r\n },\r\n error(error, file) {\r\n console.log('ERROR', error, file);\r\n },\r\n complete: (results, _file) => {\r\n this.onParser.emit(results.data);\r\n },\r\n });\r\n });\r\n\r\n this.uppy.on('complete', (uppyFiles) => {\r\n const multipleFiles =\r\n uppyFiles.successful?.map((d) => ({ file: d.data, id: d.id })) ?? [];\r\n const file = uppyFiles.successful![0]?.data;\r\n this.showSample = false;\r\n this.showSubtitle = false;\r\n\r\n console.log(file);\r\n this.fileUploadComplete.emit(file);\r\n this.multipleFilesUploaded.emit(multipleFiles);\r\n this.file.set(file as File);\r\n this.multipleFiles.set(multipleFiles);\r\n });\r\n\r\n this.uppy.on('transloadit:upload', (x, y) => {\r\n console.log(x, y);\r\n });\r\n this.uppy.on('transloadit:result', (stepName, result) => {\r\n console.log(stepName, result);\r\n });\r\n\r\n this.uppy.on('file-removed', (f) => {\r\n this.showSample = true;\r\n this.showSubtitle = true;\r\n this.file.set(null);\r\n const currentFiles = this.multipleFiles();\r\n const updatedFiles = currentFiles.filter((r) => r.id != f.id);\r\n this.multipleFiles.set(updatedFiles);\r\n this.fileRemoved.emit(f.id);\r\n this.rowSummary.set({ rowCount: 0, rowEmpty: 0 });\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['clear']?.currentValue == true) {\r\n this.uppy.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Converts a given number of bytes into a human-readable string.\r\n * @param bytes The number of bytes to convert.\r\n * @param decimalPoints The number of decimal places to display. Defaults to 2.\r\n * @returns A string in the form of \"X.XX [unit]\" where X is the numerical value and unit is the appropriate unit of measurement (Bytes, KB, MB, GB, etc.).\r\n */\r\n formatFileSize(bytes: number, decimalPoints = 2): string {\r\n if (bytes === 0) {\r\n return `0 bytes`;\r\n }\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(UppyComponent.kilobyte));\r\n const size = bytes / Math.pow(UppyComponent.kilobyte, i);\r\n return `${size.toFixed(decimalPoints)} ${UppyComponent.sizes[i]}`;\r\n }\r\n}\r\n","<div class=\"position-relative\">\r\n <uppy-dashboard [uppy]=\"uppy\" [props]=\"dashboardProps\"> </uppy-dashboard>\r\n <small *ngIf=\"subtitle && showSubtitle\" class=\"subtitle position-absolute\">{{subtitle}}</small>\r\n <a *ngIf=\"sampleUrl && showSample\" class=\"sample position-absolute\" [class.top-58]=\"subtitle\" role=\"button\"\r\n [href]=\"sampleUrl\">\r\n <i class=\"fa-solid fa-download ms-3\"></i> Download Template\r\n </a>\r\n\r\n @if (file() && file()?.type === 'text/csv') {\r\n <div class=\"alert alert-warning d-flex flex-column gap-2\" style=\"margin: 1rem 0 0 0;\" role=\"alert\">\r\n <h4 class=\"alert-heading\">CSV File Content Summary</h4>\r\n <hr>\r\n <p class=\"fs-6 m-0\">{{rowSummary().rowCount}} rows found <ng-container *ngIf=\"rowSummary().rowEmpty > 0\">-\r\n {{rowSummary().rowEmpty}} empty in the CSV you uploaded</ng-container></p>\r\n </div>\r\n\r\n }\r\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dealpos-npm/ng-dealpos-library",
3
- "version": "4.4.7",
3
+ "version": "4.4.8",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^18.2.0",
6
6
  "@angular/core": "^18.2.0",
@@ -134,18 +134,18 @@
134
134
  "esm": "./esm2022/directives/form-or-floating-on-masked/dealpos-npm-ng-dealpos-library-directives-form-or-floating-on-masked.mjs",
135
135
  "default": "./fesm2022/dealpos-npm-ng-dealpos-library-directives-form-or-floating-on-masked.mjs"
136
136
  },
137
- "./directives/is-invalid-email-or-phone": {
138
- "types": "./directives/is-invalid-email-or-phone/index.d.ts",
139
- "esm2022": "./esm2022/directives/is-invalid-email-or-phone/dealpos-npm-ng-dealpos-library-directives-is-invalid-email-or-phone.mjs",
140
- "esm": "./esm2022/directives/is-invalid-email-or-phone/dealpos-npm-ng-dealpos-library-directives-is-invalid-email-or-phone.mjs",
141
- "default": "./fesm2022/dealpos-npm-ng-dealpos-library-directives-is-invalid-email-or-phone.mjs"
142
- },
143
137
  "./directives/numeric-input-only": {
144
138
  "types": "./directives/numeric-input-only/index.d.ts",
145
139
  "esm2022": "./esm2022/directives/numeric-input-only/dealpos-npm-ng-dealpos-library-directives-numeric-input-only.mjs",
146
140
  "esm": "./esm2022/directives/numeric-input-only/dealpos-npm-ng-dealpos-library-directives-numeric-input-only.mjs",
147
141
  "default": "./fesm2022/dealpos-npm-ng-dealpos-library-directives-numeric-input-only.mjs"
148
142
  },
143
+ "./directives/is-invalid-email-or-phone": {
144
+ "types": "./directives/is-invalid-email-or-phone/index.d.ts",
145
+ "esm2022": "./esm2022/directives/is-invalid-email-or-phone/dealpos-npm-ng-dealpos-library-directives-is-invalid-email-or-phone.mjs",
146
+ "esm": "./esm2022/directives/is-invalid-email-or-phone/dealpos-npm-ng-dealpos-library-directives-is-invalid-email-or-phone.mjs",
147
+ "default": "./fesm2022/dealpos-npm-ng-dealpos-library-directives-is-invalid-email-or-phone.mjs"
148
+ },
149
149
  "./directives/simple-keyboard": {
150
150
  "types": "./directives/simple-keyboard/index.d.ts",
151
151
  "esm2022": "./esm2022/directives/simple-keyboard/dealpos-npm-ng-dealpos-library-directives-simple-keyboard.mjs",