@wemake4u/form-player-se 1.0.47 → 1.0.49

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.
Files changed (87) hide show
  1. package/THIRD_PARTY_LICENSES.txt +6 -0
  2. package/esm2022/lib/builtIn/function.json +16 -0
  3. package/esm2022/lib/components/actionsCellRenderer/actionsCellRenderer.component.mjs +18 -14
  4. package/esm2022/lib/components/badge/badge.component.mjs +16 -0
  5. package/esm2022/lib/components/hostCellRenderer/hostCellRenderer.component.mjs +10 -8
  6. package/esm2022/lib/controls/factory.mjs +7 -1
  7. package/esm2022/lib/controls/navigator.mjs +4 -0
  8. package/esm2022/lib/controls/treerlist.mjs +4 -0
  9. package/esm2022/lib/dialog/dialog.component.mjs +10 -8
  10. package/esm2022/lib/directives/collapse.directive.mjs +3 -3
  11. package/esm2022/lib/directives/date.directive.mjs +139 -44
  12. package/esm2022/lib/directives/dialog.directive.mjs +7 -1
  13. package/esm2022/lib/directives/dropdown.directive.mjs +13 -8
  14. package/esm2022/lib/directives/file.directive.mjs +212 -0
  15. package/esm2022/lib/directives/filemanager.directive.mjs +233 -0
  16. package/esm2022/lib/directives/filepicker.directive.mjs +40 -0
  17. package/esm2022/lib/directives/jsonfile.directive.mjs +59 -0
  18. package/esm2022/lib/directives/navigator.directive.mjs +76 -0
  19. package/esm2022/lib/directives/repeat.directive.mjs +8 -7
  20. package/esm2022/lib/directives/tab.badge.directive.mjs +95 -0
  21. package/esm2022/lib/directives/tabitem.directive.mjs +7 -4
  22. package/esm2022/lib/dynamic-fields/dynamic-fields.component.mjs +62 -149
  23. package/esm2022/lib/dynamic-form/dynamic-form.component.mjs +11 -8
  24. package/esm2022/lib/locale/locale-de.mjs +6 -2
  25. package/esm2022/lib/locale/locale-en.mjs +6 -2
  26. package/esm2022/lib/locale/locale-es.mjs +6 -2
  27. package/esm2022/lib/locale/locale-fr.mjs +6 -2
  28. package/esm2022/lib/locale/locale-it.mjs +6 -2
  29. package/esm2022/lib/locale/locale-pt.mjs +6 -2
  30. package/esm2022/lib/pipes/times.mjs +14 -0
  31. package/esm2022/lib/services/builder.service.mjs +43 -89
  32. package/esm2022/lib/services/compute.service.mjs +9 -9
  33. package/esm2022/lib/services/dialog.service.mjs +35 -4
  34. package/esm2022/lib/services/disable.service.mjs +30 -11
  35. package/esm2022/lib/services/event.service.mjs +14 -12
  36. package/esm2022/lib/services/form.service.mjs +32 -46
  37. package/esm2022/lib/services/function.service.mjs +6 -2
  38. package/esm2022/lib/services/grid.service.mjs +20 -14
  39. package/esm2022/lib/services/lifetime.service.mjs +36 -0
  40. package/esm2022/lib/services/programmability.service.mjs +22 -18
  41. package/esm2022/lib/services/status.service.mjs +88 -25
  42. package/esm2022/lib/services/validation.service.mjs +7 -7
  43. package/esm2022/lib/utils/FormArrayEx.mjs +63 -0
  44. package/esm2022/lib/utils/window.mjs +3 -2
  45. package/fesm2022/wemake4u-form-player-se.mjs +1460 -509
  46. package/fesm2022/wemake4u-form-player-se.mjs.map +1 -1
  47. package/lib/components/badge/badge.component.d.ts +13 -0
  48. package/lib/components/deleteRowRenderer/deleteRowRenderer.component.d.ts +4 -0
  49. package/lib/components/objectURLRenderer/objectURLRenderer.component.d.ts +4 -0
  50. package/lib/components/setFilter/setFilter.component.d.ts +4 -0
  51. package/lib/controls/navigator.d.ts +3 -0
  52. package/lib/controls/treerlist.d.ts +3 -0
  53. package/lib/dialog/dialog.component.d.ts +30 -2
  54. package/lib/directives/collapse.directive.d.ts +3 -2
  55. package/lib/directives/date.directive.d.ts +15 -4
  56. package/lib/directives/dropdown.directive.d.ts +2 -2
  57. package/lib/directives/file.directive.d.ts +31 -0
  58. package/lib/directives/filemanager.directive.d.ts +47 -0
  59. package/lib/directives/filepicker.directive.d.ts +23 -0
  60. package/lib/directives/jsonfile.directive.d.ts +14 -0
  61. package/lib/directives/navigator.directive.d.ts +22 -0
  62. package/lib/directives/tab.badge.directive.d.ts +28 -0
  63. package/lib/directives/tabitem.directive.d.ts +2 -1
  64. package/lib/dynamic-fields/dynamic-fields.component.d.ts +38 -11
  65. package/lib/dynamic-form/dynamic-form.component.d.ts +29 -1
  66. package/lib/locale/locale-de.d.ts +4 -0
  67. package/lib/locale/locale-en.d.ts +4 -0
  68. package/lib/locale/locale-es.d.ts +4 -0
  69. package/lib/locale/locale-fr.d.ts +4 -0
  70. package/lib/locale/locale-it.d.ts +4 -0
  71. package/lib/locale/locale-pt.d.ts +4 -0
  72. package/lib/locale/locale.d.ts +28 -0
  73. package/lib/pipes/times.d.ts +7 -0
  74. package/lib/services/builder.service.d.ts +6 -10
  75. package/lib/services/compute.service.d.ts +2 -1
  76. package/lib/services/dialog.service.d.ts +10 -3
  77. package/lib/services/disable.service.d.ts +5 -1
  78. package/lib/services/event.service.d.ts +1 -1
  79. package/lib/services/form.service.d.ts +5 -2
  80. package/lib/services/function.service.d.ts +1 -0
  81. package/lib/services/grid.service.d.ts +1 -1
  82. package/lib/services/lifetime.service.d.ts +12 -0
  83. package/lib/services/programmability.service.d.ts +3 -1
  84. package/lib/services/status.service.d.ts +18 -4
  85. package/lib/services/validation.service.d.ts +2 -1
  86. package/lib/utils/FormArrayEx.d.ts +26 -0
  87. package/package.json +3 -2
@@ -0,0 +1,212 @@
1
+ import { Directive, Input } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { finalize, isObservable, take } from 'rxjs';
4
+ import { downloadBlob, downloadFile } from '@wemake4u/interact';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../services/toast.service";
7
+ export class FileHandlerDirective {
8
+ toastService;
9
+ destroyRef;
10
+ constructor(toastService, destroyRef) {
11
+ this.toastService = toastService;
12
+ this.destroyRef = destroyRef;
13
+ }
14
+ downloadHandler;
15
+ getExtension(file) {
16
+ const name = file?.name?.trim();
17
+ if (!name) {
18
+ return '';
19
+ }
20
+ const index = name.lastIndexOf('.');
21
+ if (index < 0 || index === name.length - 1) {
22
+ return '';
23
+ }
24
+ return name.substring(index + 1).toUpperCase();
25
+ }
26
+ getIcon(file) {
27
+ const extension = this.getExtension(file).toLowerCase();
28
+ return FILE_ICONS[extension] ?? 'fa-file';
29
+ }
30
+ getSize(file) {
31
+ const size = file?.size;
32
+ if (typeof size !== 'number' ||
33
+ !Number.isFinite(size) ||
34
+ size < 0) {
35
+ return '';
36
+ }
37
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
38
+ let value = size;
39
+ let unit = 0;
40
+ while (value >= 1024 &&
41
+ unit < units.length - 1) {
42
+ value /= 1024;
43
+ unit++;
44
+ }
45
+ const decimals = unit === 0
46
+ ? 0
47
+ : value < 10
48
+ ? 1
49
+ : 0;
50
+ return `${value.toFixed(decimals)} ${units[unit]}`;
51
+ }
52
+ canDownload(file) {
53
+ return this.isLocal(file)
54
+ || (this.isHandled(file) && !this.isDownloading(file));
55
+ }
56
+ isLocal(file) {
57
+ return file instanceof File;
58
+ }
59
+ downloadLocal(file) {
60
+ downloadBlob(file, file.name);
61
+ }
62
+ isHandled(file) {
63
+ return !this.isLocal(file)
64
+ && typeof file === 'object'
65
+ && file !== null
66
+ && 'name' in file
67
+ && 'type' in file
68
+ && typeof file.name === 'string'
69
+ && this.downloadHandler != null;
70
+ }
71
+ downloadHandled(file) {
72
+ if (!this.downloadHandler || !this.isHandled(file))
73
+ return;
74
+ const downloadResult = this.downloadHandler(file);
75
+ if (typeof downloadResult === 'string') {
76
+ this.downloadUrl(downloadResult, file.name);
77
+ }
78
+ if (isObservable(downloadResult)) {
79
+ this.downloadingHandled.add(file);
80
+ downloadResult
81
+ .pipe(take(1), finalize(() => this.downloadingHandled.delete(file)), takeUntilDestroyed(this.destroyRef))
82
+ .subscribe({
83
+ next: (result) => {
84
+ if (this.isBase64(result)) {
85
+ downloadFile(result, file.name, file.type);
86
+ }
87
+ else if (this.isUri(result)) {
88
+ this.downloadUrl(result, file.name);
89
+ }
90
+ },
91
+ error: error => {
92
+ this.logError(error);
93
+ }
94
+ });
95
+ }
96
+ }
97
+ isDownloading(file) {
98
+ return this.downloadingHandled.has(file);
99
+ }
100
+ downloadingHandled = new WeakSet();
101
+ downloadUrl(url, fileName) {
102
+ const link = document.createElement('a');
103
+ link.href = url;
104
+ link.download = fileName;
105
+ link.target = '_blank';
106
+ link.click();
107
+ }
108
+ isBase64(value) {
109
+ if (!value) {
110
+ return false;
111
+ }
112
+ // Data URI
113
+ if (value.startsWith('data:')) {
114
+ return value.includes(';base64,');
115
+ }
116
+ // Lunghezza multipla di 4
117
+ if (value.length % 4 !== 0) {
118
+ return false;
119
+ }
120
+ // Caratteri validi Base64
121
+ if (!/^[A-Za-z0-9+/]*={0,2}$/.test(value)) {
122
+ return false;
123
+ }
124
+ try {
125
+ atob(value);
126
+ return true;
127
+ }
128
+ catch {
129
+ return false;
130
+ }
131
+ }
132
+ isUri(value) {
133
+ try {
134
+ new URL(value, window.location.origin);
135
+ return true;
136
+ }
137
+ catch {
138
+ return false;
139
+ }
140
+ }
141
+ logError(error) {
142
+ if (!error)
143
+ return;
144
+ console.error(error);
145
+ if (error.message)
146
+ this.toastService.notifyError(error.message);
147
+ }
148
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileHandlerDirective, deps: [{ token: i1.ToastService }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Directive });
149
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: FileHandlerDirective, isStandalone: true, selector: "[fileHandler]", inputs: { downloadHandler: "downloadHandler" }, exportAs: ["fileHandler"], ngImport: i0 });
150
+ }
151
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileHandlerDirective, decorators: [{
152
+ type: Directive,
153
+ args: [{
154
+ selector: '[fileHandler]',
155
+ exportAs: 'fileHandler',
156
+ standalone: true
157
+ }]
158
+ }], ctorParameters: () => [{ type: i1.ToastService }, { type: i0.DestroyRef }], propDecorators: { downloadHandler: [{
159
+ type: Input
160
+ }] } });
161
+ const FILE_ICONS = {
162
+ zip: 'fa-file-zipper',
163
+ rar: 'fa-file-zipper',
164
+ '7z': 'fa-file-zipper',
165
+ tar: 'fa-file-zipper',
166
+ gz: 'fa-file-zipper',
167
+ doc: 'fa-file-word',
168
+ docx: 'fa-file-word',
169
+ ppt: 'fa-file-powerpoint',
170
+ pptx: 'fa-file-powerpoint',
171
+ txt: 'fa-file-lines',
172
+ log: 'fa-file-lines',
173
+ md: 'fa-file-lines',
174
+ pdf: 'fa-file-pdf',
175
+ jpg: 'fa-file-image',
176
+ jpeg: 'fa-file-image',
177
+ png: 'fa-file-image',
178
+ gif: 'fa-file-image',
179
+ bmp: 'fa-file-image',
180
+ svg: 'fa-file-image',
181
+ webp: 'fa-file-image',
182
+ xls: 'fa-file-excel',
183
+ xlsx: 'fa-file-excel',
184
+ csv: 'fa-file-csv',
185
+ mp3: 'fa-file-audio',
186
+ wav: 'fa-file-audio',
187
+ ogg: 'fa-file-audio',
188
+ flac: 'fa-file-audio',
189
+ aac: 'fa-file-audio',
190
+ m4a: 'fa-file-audio',
191
+ wma: 'fa-file-audio',
192
+ mp4: 'fa-file-video',
193
+ avi: 'fa-file-video',
194
+ mov: 'fa-file-video',
195
+ wmv: 'fa-file-video',
196
+ mkv: 'fa-file-video',
197
+ webm: 'fa-file-video',
198
+ mpeg: 'fa-file-video',
199
+ mpg: 'fa-file-video',
200
+ m4v: 'fa-file-video',
201
+ html: 'fa-file-code',
202
+ css: 'fa-file-code',
203
+ js: 'fa-file-code',
204
+ ts: 'fa-file-code',
205
+ json: 'fa-file-code',
206
+ xml: 'fa-file-code',
207
+ cs: 'fa-file-code',
208
+ java: 'fa-file-code',
209
+ py: 'fa-file-code',
210
+ sql: 'fa-file-code'
211
+ };
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2lyaW8vc3JjL2xpYi9kaXJlY3RpdmVzL2ZpbGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFBOzs7QUFPL0QsTUFBTSxPQUFPLG9CQUFvQjtJQUduQjtJQUNBO0lBRlosWUFDWSxZQUEwQixFQUMxQixVQUFzQjtRQUR0QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixlQUFVLEdBQVYsVUFBVSxDQUFZO0lBQzlCLENBQUM7SUFHTCxlQUFlLENBQTJDO0lBRTFELFlBQVksQ0FBQyxJQUFzQjtRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRWhDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFcEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakQsQ0FBQztJ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LGVBQWU7SUFDcEIsR0FBRyxFQUFFLGVBQWU7SUFDcEIsR0FBRyxFQUFFLGVBQWU7SUFDcEIsSUFBSSxFQUFFLGVBQWU7SUFDckIsSUFBSSxFQUFFLGVBQWU7SUFDckIsR0FBRyxFQUFFLGVBQWU7SUFDcEIsR0FBRyxFQUFFLGVBQWU7SUFFcEIsSUFBSSxFQUFFLGNBQWM7SUFDcEIsR0FBRyxFQUFFLGNBQWM7SUFDbkIsRUFBRSxFQUFFLGNBQWM7SUFDbEIsRUFBRSxFQUFFLGNBQWM7SUFDbEIsSUFBSSxFQUFFLGNBQWM7SUFDcEIsR0FBRyxFQUFFLGNBQWM7SUFDbkIsRUFBRSxFQUFFLGNBQWM7SUFDbEIsSUFBSSxFQUFFLGNBQWM7SUFDcEIsRUFBRSxFQUFFLGNBQWM7SUFDbEIsR0FBRyxFQUFFLGNBQWM7Q0FDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc3Ryb3lSZWYsIERpcmVjdGl2ZSwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQgeyBmaW5hbGl6ZSwgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCB0YWtlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBkb3dubG9hZEJsb2IsIGRvd25sb2FkRmlsZSB9IGZyb20gJ0B3ZW1ha2U0dS9pbnRlcmFjdCdcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2ZpbGVIYW5kbGVyXScsXHJcbiAgZXhwb3J0QXM6ICdmaWxlSGFuZGxlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsZUhhbmRsZXJEaXJlY3RpdmUge1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByb3RlY3RlZCBkZXN0cm95UmVmOiBEZXN0cm95UmVmXHJcbiAgKSB7IH1cclxuXHJcbiAgQElucHV0KClcclxuICBkb3dubG9hZEhhbmRsZXI/OiAoZmlsZTogYW55KSA9PiBPYnNlcnZhYmxlPGFueT4gfCBzdHJpbmc7XHJcblxyXG4gIGdldEV4dGVuc2lvbihmaWxlPzogRmlsZUluZm8gfCBudWxsKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5hbWUgPSBmaWxlPy5uYW1lPy50cmltKCk7XHJcblxyXG4gICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID09PSBuYW1lLmxlbmd0aCAtIDEpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpLnRvVXBwZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRJY29uKGZpbGU6IEZpbGUpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5nZXRFeHRlbnNpb24oZmlsZSkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiBGSUxFX0lDT05TW2V4dGVuc2lvbl0gPz8gJ2ZhLWZpbGUnO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2l6ZShmaWxlPzogRmlsZUluZm8gfCBudWxsKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNpemUgPSBmaWxlPy5zaXplO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgdHlwZW9mIHNpemUgIT09ICdudW1iZXInIHx8XHJcbiAgICAgICFOdW1iZXIuaXNGaW5pdGUoc2l6ZSkgfHxcclxuICAgICAgc2l6ZSA8IDBcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTtcclxuXHJcbiAgICBsZXQgdmFsdWUgPSBzaXplO1xyXG4gICAgbGV0IHVuaXQgPSAwO1xyXG5cclxuICAgIHdoaWxlIChcclxuICAgICAgdmFsdWUgPj0gMTAyNCAmJlxyXG4gICAgICB1bml0IDwgdW5pdHMubGVuZ3RoIC0gMVxyXG4gICAgKSB7XHJcbiAgICAgIHZhbHVlIC89IDEwMjQ7XHJcbiAgICAgIHVuaXQrKztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkZWNpbWFscyA9XHJcbiAgICAgIHVuaXQgPT09IDBcclxuICAgICAgICA/IDBcclxuICAgICAgICA6IHZhbHVlIDwgMTBcclxuICAgICAgICAgID8gMVxyXG4gICAgICAgICAgOiAwO1xyXG5cclxuICAgIHJldHVybiBgJHt2YWx1ZS50b0ZpeGVkKGRlY2ltYWxzKX0gJHt1bml0c1t1bml0XX1gO1xyXG4gIH1cclxuXHJcbiAgY2FuRG93bmxvYWQoZmlsZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0xvY2FsKGZpbGUpXHJcbiAgICAgIHx8ICh0aGlzLmlzSGFuZGxlZChmaWxlKSAmJiAhdGhpcy5pc0Rvd25sb2FkaW5nKGZpbGUpKTtcclxuICB9XHJcblxyXG4gIGlzTG9jYWwoZmlsZTogYW55KTogZmlsZSBpcyBGaWxlIHtcclxuICAgIHJldHVybiBmaWxlIGluc3RhbmNlb2YgRmlsZTtcclxuICB9XHJcblxyXG4gIGRvd25sb2FkTG9jYWwoZmlsZTogRmlsZSk6IHZvaWQge1xyXG4gICAgZG93bmxvYWRCbG9iKGZpbGUsIGZpbGUubmFtZSk7ICAgIFxyXG4gIH1cclxuXHJcbiAgaXNIYW5kbGVkKGZpbGU6IGFueSk6IGZpbGUgaXMgeyBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZyB9IHtcclxuICAgIHJldHVybiAhdGhpcy5pc0xvY2FsKGZpbGUpXHJcbiAgICAgICYmIHR5cGVvZiBmaWxlID09PSAnb2JqZWN0J1xyXG4gICAgICAmJiBmaWxlICE9PSBudWxsXHJcbiAgICAgICYmICduYW1lJyBpbiBmaWxlXHJcbiAgICAgICYmICd0eXBlJyBpbiBmaWxlICAgICAgXHJcbiAgICAgICYmIHR5cGVvZiBmaWxlLm5hbWUgPT09ICdzdHJpbmcnXHJcbiAgICAgICYmIHRoaXMuZG93bmxvYWRIYW5kbGVyICE9IG51bGw7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEhhbmRsZWQoZmlsZTogYW55KTogdm9pZCB7XHJcblxyXG4gICAgaWYgKCF0aGlzLmRvd25sb2FkSGFuZGxlciB8fCAhdGhpcy5pc0hhbmRsZWQoZmlsZSkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBkb3dubG9hZFJlc3VsdCA9IHRoaXMuZG93bmxvYWRIYW5kbGVyKGZpbGUpO1xyXG5cclxuICAgIGlmICh0eXBlb2YgZG93bmxvYWRSZXN1bHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMuZG93bmxvYWRVcmwoZG93bmxvYWRSZXN1bHQsIGZpbGUubmFtZSk7ICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlzT2JzZXJ2YWJsZShkb3dubG9hZFJlc3VsdCkpIHtcclxuXHJcbiAgICAgIHRoaXMuZG93bmxvYWRpbmdIYW5kbGVkLmFkZChmaWxlKTtcclxuXHJcbiAgICAgIGRvd25sb2FkUmVzdWx0XHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5kb3dubG9hZGluZ0hhbmRsZWQuZGVsZXRlKGZpbGUpKSxcclxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQmFzZTY0KHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgICBkb3dubG9hZEZpbGUocmVzdWx0LCBmaWxlLm5hbWUsIGZpbGUudHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1VyaShyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZFVybChyZXN1bHQsIGZpbGUubmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ0Vycm9yKGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzRG93bmxvYWRpbmcoZmlsZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5kb3dubG9hZGluZ0hhbmRsZWQuaGFzKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkb3dubG9hZGluZ0hhbmRsZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XHJcblxyXG4gIHByaXZhdGUgZG93bmxvYWRVcmwodXJsOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rLmhyZWYgPSB1cmw7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICBsaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgbGluay5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0Jhc2U2NCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEYXRhIFVSSVxyXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlLmluY2x1ZGVzKCc7YmFzZTY0LCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEx1bmdoZXp6YSBtdWx0aXBsYSBkaSA0XHJcbiAgICBpZiAodmFsdWUubGVuZ3RoICUgNCAhPT0gMCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FyYXR0ZXJpIHZhbGlkaSBCYXNlNjRcclxuICAgIGlmICghL15bQS1aYS16MC05Ky9dKj17MCwyfSQvLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBhdG9iKHZhbHVlKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1VyaSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBuZXcgVVJMKHZhbHVlLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGxvZ0Vycm9yKGVycm9yOiBFcnJvcikge1xyXG4gICAgaWYgKCFlcnJvcikgcmV0dXJuO1xyXG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICBpZiAoZXJyb3IubWVzc2FnZSlcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2Uubm90aWZ5RXJyb3IoZXJyb3IubWVzc2FnZSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxudHlwZSBGaWxlSW5mbyA9IFBpY2s8RmlsZSwgJ25hbWUnIHwgJ3NpemUnPjtcclxuXHJcbmNvbnN0IEZJTEVfSUNPTlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgemlwOiAnZmEtZmlsZS16aXBwZXInLFxyXG4gIHJhcjogJ2ZhLWZpbGUtemlwcGVyJyxcclxuICAnN3onOiAnZmEtZmlsZS16aXBwZXInLFxyXG4gIHRhcjogJ2ZhLWZpbGUtemlwcGVyJyxcclxuICBnejogJ2ZhLWZpbGUtemlwcGVyJyxcclxuXHJcbiAgZG9jOiAnZmEtZmlsZS13b3JkJyxcclxuICBkb2N4OiAnZmEtZmlsZS13b3JkJyxcclxuXHJcbiAgcHB0OiAnZmEtZmlsZS1wb3dlcnBvaW50JyxcclxuICBwcHR4OiAnZmEtZmlsZS1wb3dlcnBvaW50JyxcclxuXHJcbiAgdHh0OiAnZmEtZmlsZS1saW5lcycsXHJcbiAgbG9nOiAnZmEtZmlsZS1saW5lcycsXHJcbiAgbWQ6ICdmYS1maWxlLWxpbmVzJyxcclxuXHJcbiAgcGRmOiAnZmEtZmlsZS1wZGYnLFxyXG5cclxuICBqcGc6ICdmYS1maWxlLWltYWdlJyxcclxuICBqcGVnOiAnZmEtZmlsZS1pbWFnZScsXHJcbiAgcG5nOiAnZmEtZmlsZS1pbWFnZScsXHJcbiAgZ2lmOiAnZmEtZmlsZS1pbWFnZScsXHJcbiAgYm1wOiAnZmEtZmlsZS1pbWFnZScsXHJcbiAgc3ZnOiAnZmEtZmlsZS1pbWFnZScsXHJcbiAgd2VicDogJ2ZhLWZpbGUtaW1hZ2UnLFxyXG5cclxuICB4bHM6ICdmYS1maWxlLWV4Y2VsJyxcclxuICB4bHN4OiAnZmEtZmlsZS1leGNlbCcsXHJcblxyXG4gIGNzdjogJ2ZhLWZpbGUtY3N2JyxcclxuXHJcbiAgbXAzOiAnZmEtZmlsZS1hdWRpbycsXHJcbiAgd2F2OiAnZmEtZmlsZS1hdWRpbycsXHJcbiAgb2dnOiAnZmEtZmlsZS1hdWRpbycsXHJcbiAgZmxhYzogJ2ZhLWZpbGUtYXVkaW8nLFxyXG4gIGFhYzogJ2ZhLWZpbGUtYXVkaW8nLFxyXG4gIG00YTogJ2ZhLWZpbGUtYXVkaW8nLFxyXG4gIHdtYTogJ2ZhLWZpbGUtYXVkaW8nLFxyXG5cclxuICBtcDQ6ICdmYS1maWxlLXZpZGVvJyxcclxuICBhdmk6ICdmYS1maWxlLXZpZGVvJyxcclxuICBtb3Y6ICdmYS1maWxlLXZpZGVvJyxcclxuICB3bXY6ICdmYS1maWxlLXZpZGVvJyxcclxuICBta3Y6ICdmYS1maWxlLXZpZGVvJyxcclxuICB3ZWJtOiAnZmEtZmlsZS12aWRlbycsXHJcbiAgbXBlZzogJ2ZhLWZpbGUtdmlkZW8nLFxyXG4gIG1wZzogJ2ZhLWZpbGUtdmlkZW8nLFxyXG4gIG00djogJ2ZhLWZpbGUtdmlkZW8nLFxyXG5cclxuICBodG1sOiAnZmEtZmlsZS1jb2RlJyxcclxuICBjc3M6ICdmYS1maWxlLWNvZGUnLFxyXG4gIGpzOiAnZmEtZmlsZS1jb2RlJyxcclxuICB0czogJ2ZhLWZpbGUtY29kZScsXHJcbiAganNvbjogJ2ZhLWZpbGUtY29kZScsXHJcbiAgeG1sOiAnZmEtZmlsZS1jb2RlJyxcclxuICBjczogJ2ZhLWZpbGUtY29kZScsXHJcbiAgamF2YTogJ2ZhLWZpbGUtY29kZScsXHJcbiAgcHk6ICdmYS1maWxlLWNvZGUnLFxyXG4gIHNxbDogJ2ZhLWZpbGUtY29kZSdcclxufTtcclxuIl19
@@ -0,0 +1,233 @@
1
+ import { Directive, Input, Self } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { Subscription, take, tap } from 'rxjs';
4
+ import { FileHandlerDirective } from './file.directive';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "ngx-sirio-lib";
8
+ import * as i3 from "../services/toast.service";
9
+ export class FileManagerDirective extends FileHandlerDirective {
10
+ ngControl;
11
+ fileUpload;
12
+ renderer;
13
+ instantUpload = false;
14
+ readonly = false;
15
+ multiple = false;
16
+ uploadHandler;
17
+ deleteHandler;
18
+ constructor(ngControl, fileUpload, renderer, toastService, destroyRef) {
19
+ super(toastService, destroyRef);
20
+ this.ngControl = ngControl;
21
+ this.fileUpload = fileUpload;
22
+ this.renderer = renderer;
23
+ }
24
+ ngOnDestroy() {
25
+ this.cleanupInstant();
26
+ }
27
+ ngOnChanges(changes) {
28
+ if (changes["instantUpload"] || changes["multiple"]
29
+ || changes["uploadHandler"] || changes["deleteHandler"]) {
30
+ this.cleanupInstant();
31
+ if (this.instantUpload && this.uploadHandler && this.deleteHandler) {
32
+ this.setupInstant();
33
+ }
34
+ this.setupButton();
35
+ }
36
+ }
37
+ canRemove(file) {
38
+ if (this.readonly || !file)
39
+ return false;
40
+ if (this.instantUpload)
41
+ return !this.isUploading(file) && !this.isDeleting(file);
42
+ return true;
43
+ }
44
+ removeFile(file) {
45
+ if (!this.canRemove(file))
46
+ return;
47
+ this.onRemovingFile(file);
48
+ }
49
+ canDownload(file) {
50
+ if (!this.instantUpload)
51
+ return super.canDownload(file);
52
+ return !this.isUploading(file)
53
+ && !this.isDeleting(file)
54
+ && super.canDownload(file);
55
+ }
56
+ isUploading(file) {
57
+ return this.getStatus(file) === UploadStatus.Uploading;
58
+ }
59
+ isDeleting(file) {
60
+ return this.getStatus(file) === UploadStatus.Deleting;
61
+ }
62
+ instantSubscription = new Subscription();
63
+ lastSingleUploaded = null;
64
+ setupInstant() {
65
+ this.instantSubscription.add(this.fileUpload.fileUploadedEvent.subscribe((e) => {
66
+ const target = e.event.target;
67
+ if (this.multiple) {
68
+ for (const file of Array.from(target.files ?? [])) {
69
+ this.onAddFile(file);
70
+ }
71
+ }
72
+ else {
73
+ if (this.lastSingleUploaded)
74
+ this.onRemoveFile(this.lastSingleUploaded);
75
+ this.lastSingleUploaded = target.files?.[0] ?? null;
76
+ this.onAddFile(this.lastSingleUploaded);
77
+ }
78
+ }));
79
+ this.instantSubscription.add(this.fileUpload.fileDeletedEvent.subscribe((e) => {
80
+ this.onRemoveFile(e.data.fileDeleted);
81
+ }));
82
+ this.lastSingleUploaded = null;
83
+ }
84
+ cleanupInstant() {
85
+ this.instantSubscription.unsubscribe();
86
+ this.instantSubscription = new Subscription();
87
+ this.lastSingleUploaded = null;
88
+ }
89
+ setupButton() {
90
+ this.instantSubscription.add(this.ngControl.control?.valueChanges.subscribe(value => {
91
+ this.refreshButton(value);
92
+ }));
93
+ setTimeout(() => this.refreshButton(this.ngControl.control?.value));
94
+ }
95
+ onAddFile(file) {
96
+ if (!file || !this.uploadHandler)
97
+ return;
98
+ this.setStatus(file, UploadStatus.Uploading);
99
+ this.uploadHandler(file)
100
+ .pipe(take(1), takeUntilDestroyed(this.destroyRef))
101
+ .subscribe({
102
+ next: result => {
103
+ this.setStatus(file, UploadStatus.Uploaded);
104
+ this.markUploaded(file, result);
105
+ },
106
+ error: error => {
107
+ this.setStatus(file, UploadStatus.Failed);
108
+ this.removeFromUploader(file);
109
+ this.logError(error);
110
+ }
111
+ });
112
+ }
113
+ onRemoveFile(file) {
114
+ if (!file)
115
+ return;
116
+ const currentStatus = this.getStatus(file);
117
+ const shouldDelete = this.deleteHandler
118
+ && (currentStatus === UploadStatus.Uploaded
119
+ || currentStatus == null);
120
+ if (!shouldDelete)
121
+ return;
122
+ this.deleteHandler?.(file)
123
+ .pipe(take(1), takeUntilDestroyed(this.destroyRef))
124
+ .subscribe({
125
+ next: result => {
126
+ this.setStatus(file, undefined);
127
+ },
128
+ error: error => {
129
+ this.logError(error);
130
+ }
131
+ });
132
+ }
133
+ onRemovingFile(file) {
134
+ if (!this.deleteHandler) {
135
+ this.removeFromUploader(file);
136
+ return;
137
+ }
138
+ const currentStatus = this.getStatus(file);
139
+ this.setStatus(file, UploadStatus.Deleting);
140
+ this.deleteHandler?.(file)
141
+ .pipe(take(1), tap(result => {
142
+ if (!result) {
143
+ throw new Error('Delete failed');
144
+ }
145
+ }), takeUntilDestroyed(this.destroyRef))
146
+ .subscribe({
147
+ next: result => {
148
+ this.setStatus(file, UploadStatus.Deleted);
149
+ this.removeFromUploader(file);
150
+ },
151
+ error: error => {
152
+ this.setStatus(file, currentStatus);
153
+ this.logError(error);
154
+ }
155
+ });
156
+ }
157
+ removeFromUploader(file) {
158
+ this.fileUpload.onFileDeleted(file);
159
+ }
160
+ refreshButton(value) {
161
+ const hideButton = (value?.length ?? 0) > 0 && !this.multiple;
162
+ const button = this.fileUpload.sirioInput?.sirioButton?.nativeElement;
163
+ if (!button)
164
+ return;
165
+ this.renderer[hideButton ? 'addClass' : 'removeClass'](button, 'd-none');
166
+ }
167
+ markUploaded(file, result) {
168
+ for (const [key, value] of Object.entries(result)) {
169
+ if (key in file) {
170
+ continue;
171
+ }
172
+ Object.defineProperty(file, key, {
173
+ value,
174
+ writable: false,
175
+ enumerable: true,
176
+ configurable: false
177
+ });
178
+ }
179
+ Object.defineProperty(file, "uploaded", {
180
+ value: true,
181
+ writable: false,
182
+ enumerable: false,
183
+ configurable: false
184
+ });
185
+ }
186
+ getStatus(file) {
187
+ return file.status;
188
+ }
189
+ setStatus(file, status) {
190
+ const key = 'status';
191
+ if (Object.prototype.hasOwnProperty.call(file, key)) {
192
+ file[key] = status;
193
+ return;
194
+ }
195
+ Object.defineProperty(file, key, {
196
+ value: status,
197
+ writable: true,
198
+ enumerable: false,
199
+ configurable: true
200
+ });
201
+ }
202
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileManagerDirective, deps: [{ token: i1.NgControl, self: true }, { token: i2.SirioFileUploadComponent }, { token: i0.Renderer2 }, { token: i3.ToastService }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Directive });
203
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: FileManagerDirective, isStandalone: true, selector: "[fileManager]", inputs: { instantUpload: "instantUpload", readonly: "readonly", multiple: "multiple", uploadHandler: "uploadHandler", deleteHandler: "deleteHandler" }, exportAs: ["fileManager"], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
204
+ }
205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileManagerDirective, decorators: [{
206
+ type: Directive,
207
+ args: [{
208
+ selector: '[fileManager]',
209
+ exportAs: 'fileManager',
210
+ standalone: true
211
+ }]
212
+ }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
213
+ type: Self
214
+ }] }, { type: i2.SirioFileUploadComponent }, { type: i0.Renderer2 }, { type: i3.ToastService }, { type: i0.DestroyRef }], propDecorators: { instantUpload: [{
215
+ type: Input
216
+ }], readonly: [{
217
+ type: Input
218
+ }], multiple: [{
219
+ type: Input
220
+ }], uploadHandler: [{
221
+ type: Input
222
+ }], deleteHandler: [{
223
+ type: Input
224
+ }] } });
225
+ export var UploadStatus;
226
+ (function (UploadStatus) {
227
+ UploadStatus[UploadStatus["Uploading"] = 0] = "Uploading";
228
+ UploadStatus[UploadStatus["Uploaded"] = 1] = "Uploaded";
229
+ UploadStatus[UploadStatus["Deleting"] = 2] = "Deleting";
230
+ UploadStatus[UploadStatus["Deleted"] = 3] = "Deleted";
231
+ UploadStatus[UploadStatus["Failed"] = 4] = "Failed";
232
+ })(UploadStatus || (UploadStatus = {}));
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZW1hbmFnZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNpcmlvL3NyYy9saWIvZGlyZWN0aXZlcy9maWxlbWFuYWdlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFNBQVMsRUFBRSxLQUFLLEVBQW1DLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDbkgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHaEUsT0FBTyxFQUFjLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7OztBQU94RCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsb0JBQW9CO0lBa0IxQztJQUNSO0lBQ0E7SUFqQlYsYUFBYSxHQUFtQixLQUFLLENBQUM7SUFHdEMsUUFBUSxHQUFtQixLQUFLLENBQUM7SUFHakMsUUFBUSxHQUFtQixLQUFLLENBQUM7SUFHakMsYUFBYSxDQUFtQztJQUdoRCxhQUFhLENBQXVDO0lBRXBELFlBQ2tCLFNBQW9CLEVBQzVCLFVBQW9DLEVBQ3BDLFFBQW1CLEVBQzNCLFlBQTBCLEVBQzFCLFVBQXNCO1FBRXRCLEtBQUssQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFOaEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUM1QixlQUFVLEdBQVYsVUFBVSxDQUEwQjtRQUNwQyxhQUFRLEdBQVIsUUFBUSxDQUFXO0lBSzdCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQztlQUM5QyxPQUFPLENB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RCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUM7UUFFckIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUM1QixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtZQUMvQixLQUFLLEVBQUUsTUFBTTtZQUNiLFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F6UlUsb0JBQW9COzRGQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBTGhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFFBQVEsRUFBRSxhQUFhO29CQUN2QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7OzBCQW1CSSxJQUFJOzRKQWZQLGFBQWE7c0JBRFosS0FBSztnQkFJTixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQUlOLGFBQWE7c0JBRFosS0FBSztnQkFJTixhQUFhO3NCQURaLEtBQUs7O0FBOFFSLE1BQU0sQ0FBTixJQUFZLFlBTVg7QUFORCxXQUFZLFlBQVk7SUFDdEIseURBQVMsQ0FBQTtJQUNULHVEQUFRLENBQUE7SUFDUix1REFBUSxDQUFBO0lBQ1IscURBQU8sQ0FBQTtJQUNQLG1EQUFNLENBQUE7QUFDUixDQUFDLEVBTlcsWUFBWSxLQUFaLFlBQVksUUFNdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXN0cm95UmVmLCBEaXJlY3RpdmUsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgUmVuZGVyZXIyLCBTZWxmLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTaXJpb0ZpbGVVcGxvYWRDb21wb25lbnQgfSBmcm9tICduZ3gtc2lyaW8tbGliJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdG9hc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbGVIYW5kbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi9maWxlLmRpcmVjdGl2ZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tmaWxlTWFuYWdlcl0nLFxyXG4gIGV4cG9ydEFzOiAnZmlsZU1hbmFnZXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIEZpbGVNYW5hZ2VyRGlyZWN0aXZlIGV4dGVuZHMgRmlsZUhhbmRsZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaW5zdGFudFVwbG9hZDogYm9vbGVhbiB8IG51bGwgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICByZWFkb25seTogYm9vbGVhbiB8IG51bGwgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBtdWx0aXBsZTogYm9vbGVhbiB8IG51bGwgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICB1cGxvYWRIYW5kbGVyPzogKGZpbGU6IEZpbGUpID0+IE9ic2VydmFibGU8YW55PjtcclxuXHJcbiAgQElucHV0KClcclxuICBkZWxldGVIYW5kbGVyPzogKGZpbGU6IEZpbGUpID0+IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQFNlbGYoKSBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sLFxyXG4gICAgcHJpdmF0ZSBmaWxlVXBsb2FkOiBTaXJpb0ZpbGVVcGxvYWRDb21wb25lbnQsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIGRlc3Ryb3lSZWY6IERlc3Ryb3lSZWZcclxuICApIHtcclxuICAgIHN1cGVyKHRvYXN0U2VydmljZSwgZGVzdHJveVJlZik7XHJcbiAgfVxyXG4gIFxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhbnVwSW5zdGFudCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbXCJpbnN0YW50VXBsb2FkXCJdIHx8IGNoYW5nZXNbXCJtdWx0aXBsZVwiXVxyXG4gICAgICB8fCBjaGFuZ2VzW1widXBsb2FkSGFuZGxlclwiXSB8fCBjaGFuZ2VzW1wiZGVsZXRlSGFuZGxlclwiXSApIHtcclxuICAgICAgdGhpcy5jbGVhbnVwSW5zdGFudCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuaW5zdGFudFVwbG9hZCAmJiB0aGlzLnVwbG9hZEhhbmRsZXIgJiYgdGhpcy5kZWxldGVIYW5kbGVyKSB7XHJcbiAgICAgICAgdGhpcy5zZXR1cEluc3RhbnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXR1cEJ1dHRvbigpOyAgICAgICAgXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5SZW1vdmUoZmlsZTogRmlsZSk6IGJvb2xlYW5cclxuICB7XHJcbiAgICBpZiAodGhpcy5yZWFkb25seSB8fCAhZmlsZSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLmluc3RhbnRVcGxvYWQpXHJcbiAgICAgIHJldHVybiAhdGhpcy5pc1VwbG9hZGluZyhmaWxlKSAmJiAhdGhpcy5pc0RlbGV0aW5nKGZpbGUpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRmlsZShmaWxlOiBGaWxlKSB7XHJcblxyXG4gICAgaWYgKCF0aGlzLmNhblJlbW92ZShmaWxlKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMub25SZW1vdmluZ0ZpbGUoZmlsZSk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBjYW5Eb3dubG9hZChmaWxlOiBGaWxlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuaW5zdGFudFVwbG9hZClcclxuICAgICAgcmV0dXJuIHN1cGVyLmNhbkRvd25sb2FkKGZpbGUpO1xyXG5cclxuICAgIHJldHVybiAhdGhpcy5pc1VwbG9hZGluZyhmaWxlKVxyXG4gICAgICAmJiAhdGhpcy5pc0RlbGV0aW5nKGZpbGUpXHJcbiAgICAgICYmIHN1cGVyLmNhbkRvd25sb2FkKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgaXNVcGxvYWRpbmcoZmlsZTogRmlsZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhdHVzKGZpbGUpID09PSBVcGxvYWRTdGF0dXMuVXBsb2FkaW5nO1xyXG4gIH1cclxuXHJcbiAgaXNEZWxldGluZyhmaWxlOiBGaWxlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRTdGF0dXMoZmlsZSkgPT09IFVwbG9hZFN0YXR1cy5EZWxldGluZztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5zdGFudFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgcHJpdmF0ZSBsYXN0U2luZ2xlVXBsb2FkZWQ6IEZpbGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEluc3RhbnQoKSB7XHJcblxyXG4gICAgdGhpcy5pbnN0YW50U3Vic2NyaXB0aW9uLmFkZChcclxuICAgICAgdGhpcy5maWxlVXBsb2FkLmZpbGVVcGxvYWRlZEV2ZW50LnN1YnNjcmliZSgoZSkgPT4ge1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBlLmV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIEFycmF5LmZyb20odGFyZ2V0LmZpbGVzID8/IFtdKSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQWRkRmlsZShmaWxlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMubGFzdFNpbmdsZVVwbG9hZGVkKVxyXG4gICAgICAgICAgICB0aGlzLm9uUmVtb3ZlRmlsZSh0aGlzLmxhc3RTaW5nbGVVcGxvYWRlZCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5sYXN0U2luZ2xlVXBsb2FkZWQgPSB0YXJnZXQuZmlsZXM/LlswXSA/PyBudWxsO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICB0aGlzLm9uQWRkRmlsZSh0aGlzLmxhc3RTaW5nbGVVcGxvYWRlZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5pbnN0YW50U3Vic2NyaXB0aW9uLmFkZChcclxuICAgICAgdGhpcy5maWxlVXBsb2FkLmZpbGVEZWxldGVkRXZlbnQuc3Vic2NyaWJlKChlKSA9PiB7ICAgICAgICBcclxuICAgICAgICB0aGlzLm9uUmVtb3ZlRmlsZShlLmRhdGEuZmlsZURlbGV0ZWQpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmxhc3RTaW5nbGVVcGxvYWRlZCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFudXBJbnN0YW50KCkge1xyXG4gICAgdGhpcy5pbnN0YW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmluc3RhbnRTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5sYXN0U2luZ2xlVXBsb2FkZWQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEJ1dHRvbigpIHtcclxuICAgIHRoaXMuaW5zdGFudFN1YnNjcmlwdGlvbi5hZGQoXHJcbiAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2w/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgIHRoaXMucmVmcmVzaEJ1dHRvbih2YWx1ZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlZnJlc2hCdXR0b24odGhpcy5uZ0NvbnRyb2wuY29udHJvbD8udmFsdWUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25BZGRGaWxlKGZpbGU6IEZpbGUgfCBudWxsKTogdm9pZCB7XHJcbiAgICBcclxuICAgIGlmICghZmlsZSB8fCAhdGhpcy51cGxvYWRIYW5kbGVyKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGhpcy5zZXRTdGF0dXMoZmlsZSwgVXBsb2FkU3RhdHVzLlVwbG9hZGluZyk7XHJcblxyXG4gICAgdGhpcy51cGxvYWRIYW5kbGVyKGZpbGUpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiByZXN1bHQgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZXRTdGF0dXMoZmlsZSwgVXBsb2FkU3RhdHVzLlVwbG9hZGVkKTtcclxuICAgICAgICAgIHRoaXMubWFya1VwbG9hZGVkKGZpbGUsIHJlc3VsdCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogZXJyb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZXRTdGF0dXMoZmlsZSwgVXBsb2FkU3RhdHVzLkZhaWxlZCk7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZUZyb21VcGxvYWRlcihmaWxlKTtcclxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25SZW1vdmVGaWxlKGZpbGU6IEZpbGUgfCBudWxsKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKCFmaWxlKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY3VycmVudFN0YXR1cyA9IHRoaXMuZ2V0U3RhdHVzKGZpbGUpO1xyXG5cclxuICAgIGNvbnN0IHNob3VsZERlbGV0ZSA9IHRoaXMuZGVsZXRlSGFuZGxlclxyXG4gICAgICAmJiAoY3VycmVudFN0YXR1cyA9PT0gVXBsb2FkU3RhdHVzLlVwbG9hZGVkXHJcbiAgICAgIHx8IGN1cnJlbnRTdGF0dXMgPT0gbnVsbCk7XHJcblxyXG4gICAgaWYgKCFzaG91bGREZWxldGUpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmRlbGV0ZUhhbmRsZXI/LihmaWxlKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogcmVzdWx0ID0+IHtcclxuICAgICAgICAgIHRoaXMuc2V0U3RhdHVzKGZpbGUsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogZXJyb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2dFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25SZW1vdmluZ0ZpbGUoZmlsZTogRmlsZSkge1xyXG5cclxuICAgIGlmICghdGhpcy5kZWxldGVIYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlRnJvbVVwbG9hZGVyKGZpbGUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY3VycmVudFN0YXR1cyA9IHRoaXMuZ2V0U3RhdHVzKGZpbGUpO1xyXG5cclxuICAgIHRoaXMuc2V0U3RhdHVzKGZpbGUsIFVwbG9hZFN0YXR1cy5EZWxldGluZyk7XHJcblxyXG4gICAgdGhpcy5kZWxldGVIYW5kbGVyPy4oZmlsZSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICB0YXAocmVzdWx0ID0+IHtcclxuICAgICAgICAgIGlmICghcmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGVsZXRlIGZhaWxlZCcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogcmVzdWx0ID0+IHtcclxuICAgICAgICAgIHRoaXMuc2V0U3RhdHVzKGZpbGUsIFVwbG9hZFN0YXR1cy5EZWxldGVkKTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbVVwbG9hZGVyKGZpbGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IGVycm9yID0+IHtcclxuICAgICAgICAgIHRoaXMuc2V0U3RhdHVzKGZpbGUsIGN1cnJlbnRTdGF0dXMpO1xyXG4gICAgICAgICAgdGhpcy5sb2dFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTsgIFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVGcm9tVXBsb2FkZXIoZmlsZTogRmlsZSkge1xyXG4gICAgdGhpcy5maWxlVXBsb2FkLm9uRmlsZURlbGV0ZWQoZmlsZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2hCdXR0b24odmFsdWU6IGFueSkge1xyXG4gICAgY29uc3QgaGlkZUJ1dHRvbiA9ICh2YWx1ZT8ubGVuZ3RoID8/IDApID4gMCAmJiAhdGhpcy5tdWx0aXBsZTtcclxuXHJcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmZpbGVVcGxvYWQuc2lyaW9JbnB1dD8uc2lyaW9CdXR0b24/Lm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgaWYgKCFidXR0b24pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyW2hpZGVCdXR0b24gPyAnYWRkQ2xhc3MnIDogJ3JlbW92ZUNsYXNzJ10oXHJcbiAgICAgIGJ1dHRvbixcclxuICAgICAgJ2Qtbm9uZSdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcmtVcGxvYWRlZChmaWxlOiBGaWxlLCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuXHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQpKSB7XHJcblxyXG4gICAgICBpZiAoa2V5IGluIGZpbGUpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpbGUsIGtleSwge1xyXG4gICAgICAgIHZhbHVlLFxyXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpbGUsIFwidXBsb2FkZWRcIiwge1xyXG4gICAgICB2YWx1ZTogdHJ1ZSxcclxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxyXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFN0YXR1cyhmaWxlOiBGaWxlKTogVXBsb2FkU3RhdHVzIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiAoZmlsZSBhcyBhbnkpLnN0YXR1cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U3RhdHVzKGZpbGU6IEZpbGUsIHN0YXR1czogVXBsb2FkU3RhdHVzIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICBjb25zdCBrZXkgPSAnc3RhdHVzJztcclxuXHJcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpbGUsIGtleSkpIHtcclxuICAgICAgKGZpbGUgYXMgYW55KVtrZXldID0gc3RhdHVzO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpbGUsIGtleSwge1xyXG4gICAgICB2YWx1ZTogc3RhdHVzLFxyXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcclxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBVcGxvYWRTdGF0dXMge1xyXG4gIFVwbG9hZGluZyxcclxuICBVcGxvYWRlZCxcclxuICBEZWxldGluZyxcclxuICBEZWxldGVkLFxyXG4gIEZhaWxlZFxyXG59XHJcbiJdfQ==
@@ -0,0 +1,40 @@
1
+ import { Directive, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class FileListReadonlyDirective {
4
+ host;
5
+ renderer;
6
+ readonly = false;
7
+ constructor(host, renderer) {
8
+ this.host = host;
9
+ this.renderer = renderer;
10
+ }
11
+ ngAfterViewChecked() {
12
+ const buttons = this.host.nativeElement.querySelectorAll('.sirio-upload-file-list button');
13
+ buttons.forEach((button, index) => {
14
+ if (this.readonly) {
15
+ this.renderer.setAttribute(button, 'disabled', '');
16
+ }
17
+ else {
18
+ this.renderer.removeAttribute(button, 'disabled');
19
+ }
20
+ });
21
+ }
22
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileListReadonlyDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
23
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: FileListReadonlyDirective, isStandalone: true, selector: "ngx-sirio-file-upload", inputs: { readonly: "readonly" }, ngImport: i0 });
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileListReadonlyDirective, decorators: [{
26
+ type: Directive,
27
+ args: [{
28
+ selector: 'ngx-sirio-file-upload',
29
+ standalone: true
30
+ }]
31
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { readonly: [{
32
+ type: Input
33
+ }] } });
34
+ export var UploadStatus;
35
+ (function (UploadStatus) {
36
+ UploadStatus[UploadStatus["Uploading"] = 0] = "Uploading";
37
+ UploadStatus[UploadStatus["Uploaded"] = 1] = "Uploaded";
38
+ UploadStatus[UploadStatus["Failed"] = 2] = "Failed";
39
+ })(UploadStatus || (UploadStatus = {}));
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXBpY2tlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2lyaW8vc3JjL2xpYi9kaXJlY3RpdmVzL2ZpbGVwaWNrZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0IsU0FBUyxFQUFjLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQzs7QUFNMUYsTUFBTSxPQUFPLHlCQUF5QjtJQU0xQjtJQUNBO0lBSlYsUUFBUSxHQUFtQixLQUFLLENBQUM7SUFFakMsWUFDVSxJQUE2QixFQUM3QixRQUFtQjtRQURuQixTQUFJLEdBQUosSUFBSSxDQUF5QjtRQUM3QixhQUFRLEdBQVIsUUFBUSxDQUFXO0lBQ3pCLENBQUM7SUFFTCxrQkFBa0I7UUFFaEIsTUFBTSxPQUFPLEdBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQ3RDLGdDQUFnQyxDQUNqQyxDQUFDO1FBRUosT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUVoQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyRCxDQUFDO2lCQUNJLENBQUM7Z0JBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELENBQUM7UUFFSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBM0JVLHlCQUF5Qjs0RkFBekIseUJBQXlCOzs0RkFBekIseUJBQXlCO2tCQUpyQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjt1R0FJQyxRQUFRO3NCQURQLEtBQUs7O0FBNkJSLE1BQU0sQ0FBTixJQUFZLFlBSVg7QUFKRCxXQUFZLFlBQVk7SUFDdEIseURBQVMsQ0FBQTtJQUNULHVEQUFRLENBQUE7SUFDUixtREFBTSxDQUFBO0FBQ1IsQ0FBQyxFQUpXLFlBQVksS0FBWixZQUFZLFFBSXZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3Q2hlY2tlZCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ25neC1zaXJpby1maWxlLXVwbG9hZCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsZUxpc3RSZWFkb25seURpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0NoZWNrZWQge1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHJlYWRvbmx5OiBib29sZWFuIHwgbnVsbCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjJcclxuICApIHsgfVxyXG5cclxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcblxyXG4gICAgY29uc3QgYnV0dG9ucyA9XHJcbiAgICAgIHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXHJcbiAgICAgICAgJy5zaXJpby11cGxvYWQtZmlsZS1saXN0IGJ1dHRvbidcclxuICAgICAgKTtcclxuXHJcbiAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbiwgaW5kZXgpID0+IHtcclxuXHJcbiAgICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYnV0dG9uLCAnZGlzYWJsZWQnLCAnJyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUoYnV0dG9uLCAnZGlzYWJsZWQnKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFVwbG9hZFN0YXR1cyB7XHJcbiAgVXBsb2FkaW5nLFxyXG4gIFVwbG9hZGVkLFxyXG4gIEZhaWxlZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZEZpbGU8VFJlc3VsdCA9IGFueT4ge1xyXG4gIGZpbGU6IEZpbGU7XHJcbiAgc3RhdHVzOiBVcGxvYWRTdGF0dXM7XHJcbiAgcHJvZ3Jlc3M6IG51bWJlcjtcclxuICByZXN1bHQ/OiBUUmVzdWx0O1xyXG4gIGVycm9yPzogYW55O1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,59 @@
1
+ import { Directive, Self } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/forms";
4
+ import * as i2 from "../services/subscribe.service";
5
+ export class JsonFileDirective {
6
+ ngControl;
7
+ subscribe;
8
+ destroyRef;
9
+ constructor(ngControl, subscribe, destroyRef) {
10
+ this.ngControl = ngControl;
11
+ this.subscribe = subscribe;
12
+ this.destroyRef = destroyRef;
13
+ }
14
+ ngOnInit() {
15
+ const control = this.ngControl.control;
16
+ if (!control)
17
+ return;
18
+ this.subscribe.subscribeChanges(control.valueChanges, control, undefined, this.destroyRef, (_, n) => this.defineJson(n));
19
+ }
20
+ defineJson(value) {
21
+ if (!Array.isArray(value)) {
22
+ return;
23
+ }
24
+ for (const item of value) {
25
+ if (!(item instanceof File)) {
26
+ continue;
27
+ }
28
+ if (typeof item.toJSON === 'function') {
29
+ continue;
30
+ }
31
+ Object.defineProperty(item, 'toJSON', {
32
+ value() {
33
+ return {
34
+ ...this,
35
+ name: this.name,
36
+ size: this.size,
37
+ type: this.type,
38
+ lastModified: this.lastModified
39
+ };
40
+ },
41
+ writable: true,
42
+ configurable: true,
43
+ enumerable: false
44
+ });
45
+ }
46
+ }
47
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: JsonFileDirective, deps: [{ token: i1.NgControl, self: true }, { token: i2.SubscribeService }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Directive });
48
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: JsonFileDirective, isStandalone: true, selector: "ngx-sirio-file-upload", ngImport: i0 });
49
+ }
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: JsonFileDirective, decorators: [{
51
+ type: Directive,
52
+ args: [{
53
+ selector: 'ngx-sirio-file-upload',
54
+ standalone: true
55
+ }]
56
+ }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
57
+ type: Self
58
+ }] }, { type: i2.SubscribeService }, { type: i0.DestroyRef }] });
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmZpbGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNpcmlvL3NyYy9saWIvZGlyZWN0aXZlcy9qc29uZmlsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFNBQVMsRUFBVSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFRcEUsTUFBTSxPQUFPLGlCQUFpQjtJQUdWO0lBQ1I7SUFDQTtJQUhWLFlBQ2tCLFNBQW9CLEVBQzVCLFNBQTJCLEVBQzNCLFVBQXNCO1FBRmQsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUM1QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixlQUFVLEdBQVYsVUFBVSxDQUFZO0lBQzVCLENBQUM7SUFFTCxRQUFRO1FBRU4sTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFFdkMsSUFBSSxDQUFDLE9BQU87WUFDVixPQUFPO1FBRVQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUzSCxDQUFDO0lBRU8sVUFBVSxDQUFDLEtBQVU7UUFFM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQixPQUFPO1FBQ1QsQ0FBQztRQUVELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFFekIsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLFNBQVM7WUFDWCxDQUFDO1lBRUQsSUFBSSxPQUFRLElBQVksQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQy9DLFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUNwQyxLQUFLO29CQUNILE9BQU87d0JBQ0wsR0FBRyxJQUFJO3dCQUNQLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTt3QkFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO3dCQUNmLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtxQkFDaEMsQ0FBQztnQkFDSixDQUFDO2dCQUNELFFBQVEsRUFBRSxJQUFJO2dCQUNkLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsS0FBSzthQUNsQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQzt3R0FsRFUsaUJBQWlCOzRGQUFqQixpQkFBaUI7OzRGQUFqQixpQkFBaUI7a0JBSjdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtvQkFDakMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzswQkFJSSxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzdHJveVJlZiwgRGlyZWN0aXZlLCBPbkluaXQsIFNlbGYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJzY3JpYmVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc3Vic2NyaWJlLnNlcnZpY2UnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtc2lyaW8tZmlsZS11cGxvYWQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIEpzb25GaWxlRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAU2VsZigpIHByaXZhdGUgbmdDb250cm9sOiBOZ0NvbnRyb2wsXHJcbiAgICBwcml2YXRlIHN1YnNjcmliZTogU3Vic2NyaWJlU2VydmljZSxcclxuICAgIHByaXZhdGUgZGVzdHJveVJlZjogRGVzdHJveVJlZlxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLm5nQ29udHJvbC5jb250cm9sO1xyXG5cclxuICAgIGlmICghY29udHJvbClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaWJlLnN1YnNjcmliZUNoYW5nZXMoY29udHJvbC52YWx1ZUNoYW5nZXMsIGNvbnRyb2wsIHVuZGVmaW5lZCwgdGhpcy5kZXN0cm95UmVmLCAoXywgbikgPT4gdGhpcy5kZWZpbmVKc29uKG4pKTtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZmluZUpzb24odmFsdWU6IGFueSk6IHZvaWQge1xyXG5cclxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xyXG5cclxuICAgICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIEZpbGUpKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0eXBlb2YgKGl0ZW0gYXMgYW55KS50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0ZW0sICd0b0pTT04nLCB7XHJcbiAgICAgICAgdmFsdWUoKSB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi50aGlzLFxyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIHNpemU6IHRoaXMuc2l6ZSxcclxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxyXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHRoaXMubGFzdE1vZGlmaWVkXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICAgIFxyXG59XHJcbiJdfQ==