ngx-material-entity 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/capsulation/lodash.utilities.d.ts +62 -0
- package/capsulation/reflect.utilities.d.ts +56 -0
- package/classes/base.builder.d.ts +2 -1
- package/classes/date.utilities.d.ts +16 -4
- package/classes/entity.model.d.ts +7 -1
- package/classes/entity.service.d.ts +38 -1
- package/classes/entity.utilities.d.ts +43 -16
- package/classes/file.utilities.d.ts +52 -0
- package/components/input/add-array-item-dialog-data.builder.d.ts +3 -2
- package/components/input/add-array-item-dialog-data.d.ts +2 -1
- package/components/input/array/array-date-input/array-date-input.component.d.ts +22 -0
- package/components/input/array/array-date-range-input/array-date-range-input.component.d.ts +30 -0
- package/components/input/array/array-date-time-input/array-date-time-input.component.d.ts +32 -0
- package/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.d.ts +58 -0
- package/components/input/array/array-string-chips-input/array-string-chips-input.component.d.ts +51 -0
- package/components/input/array/array-table.class.d.ts +48 -0
- package/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.d.ts +17 -0
- package/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.d.ts +17 -0
- package/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.d.ts +17 -0
- package/components/input/date/date-input/date-input.component.d.ts +21 -0
- package/components/input/date/date-range-input/date-range-input.component.d.ts +27 -0
- package/components/input/date/date-time-input/date-time-input.component.d.ts +38 -0
- package/components/input/file/file-default-input/file-default-input.component.d.ts +21 -0
- package/components/input/file/file-image-input/file-image-input.component.d.ts +30 -0
- package/components/input/file/file-input/dragDrop.directive.d.ts +32 -0
- package/components/input/file/file-input/file-input.component.d.ts +32 -0
- package/components/input/input.component.d.ts +37 -92
- package/components/input/input.module.d.ts +37 -16
- package/components/input/number/number-dropdown-input/number-dropdown-input.component.d.ts +17 -0
- package/components/input/number/number-input/number-input.component.d.ts +17 -0
- package/components/input/string/string-autocomplete-input/string-autocomplete-input.component.d.ts +25 -0
- package/components/input/string/string-dropdown-input/string-dropdown-input.component.d.ts +17 -0
- package/components/input/string/string-input/string-input.component.d.ts +17 -0
- package/components/input/string/string-textbox-input/string-textbox-input.component.d.ts +17 -0
- package/components/table/create-dialog/create-entity-dialog-data.builder.d.ts +3 -2
- package/components/table/create-dialog/create-entity-dialog-data.d.ts +2 -1
- package/components/table/create-dialog/create-entity-dialog.component.d.ts +7 -2
- package/components/table/edit-dialog/edit-dialog-data.builder.d.ts +3 -2
- package/components/table/edit-dialog/edit-entity-dialog-data.d.ts +2 -1
- package/components/table/edit-dialog/edit-entity-dialog.builder.d.ts +3 -2
- package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +5 -2
- package/components/table/table-data.builder.d.ts +5 -5
- package/components/table/table-data.d.ts +6 -6
- package/components/table/table.component.d.ts +2 -1
- package/decorators/array/array-decorator-internal.data.d.ts +71 -6
- package/decorators/array/array-decorator.data.d.ts +178 -12
- package/decorators/array/array.decorator.d.ts +3 -2
- package/decorators/base/base-property.decorator.d.ts +2 -3
- package/decorators/base/decorator-types.enum.d.ts +9 -3
- package/decorators/date/date-decorator-internal.data.d.ts +2 -2
- package/decorators/date/date.decorator.d.ts +8 -0
- package/decorators/file/file-decorator-internal.data.d.ts +92 -0
- package/decorators/file/file-decorator.data.d.ts +92 -0
- package/decorators/file/file.decorator.d.ts +9 -0
- package/decorators/object/object-decorator-internal.data.d.ts +2 -2
- package/decorators/object/object-decorator.data.d.ts +3 -3
- package/decorators/object/object.decorator.d.ts +2 -1
- package/esm2020/capsulation/lodash.utilities.mjs +75 -0
- package/esm2020/capsulation/reflect.utilities.mjs +69 -0
- package/esm2020/classes/base.builder.mjs +2 -3
- package/esm2020/classes/date.utilities.mjs +33 -13
- package/esm2020/classes/entity.model.mjs +1 -1
- package/esm2020/classes/entity.service.mjs +103 -6
- package/esm2020/classes/entity.utilities.mjs +202 -71
- package/esm2020/classes/file.utilities.mjs +123 -0
- package/esm2020/components/confirm-dialog/confirm-dialog-data.builder.mjs +4 -4
- package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +3 -3
- package/esm2020/components/input/add-array-item-dialog-data.builder.mjs +2 -2
- package/esm2020/components/input/add-array-item-dialog-data.mjs +1 -1
- package/esm2020/components/input/array/array-date-input/array-date-input.component.mjs +44 -0
- package/esm2020/components/input/array/array-date-range-input/array-date-range-input.component.mjs +68 -0
- package/esm2020/components/input/array/array-date-time-input/array-date-time-input.component.mjs +65 -0
- package/esm2020/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +131 -0
- package/esm2020/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +116 -0
- package/esm2020/components/input/array/array-table.class.mjs +92 -0
- package/esm2020/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +38 -0
- package/esm2020/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +35 -0
- package/esm2020/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +38 -0
- package/esm2020/components/input/date/date-input/date-input.component.mjs +38 -0
- package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +63 -0
- package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +74 -0
- package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +39 -0
- package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +95 -0
- package/esm2020/components/input/file/file-input/dragDrop.directive.mjs +64 -0
- package/esm2020/components/input/file/file-input/file-input.component.mjs +152 -0
- package/esm2020/components/input/input.component.mjs +124 -234
- package/esm2020/components/input/input.module.mjs +66 -3
- package/esm2020/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +36 -0
- package/esm2020/components/input/number/number-input/number-input.component.mjs +34 -0
- package/esm2020/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +52 -0
- package/esm2020/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +36 -0
- package/esm2020/components/input/string/string-input/string-input.component.mjs +34 -0
- package/esm2020/components/input/string/string-textbox-input/string-textbox-input.component.mjs +35 -0
- package/esm2020/components/table/create-dialog/create-dialog-data.builder.mjs +2 -2
- package/esm2020/components/table/create-dialog/create-entity-dialog-data.builder.mjs +1 -1
- package/esm2020/components/table/create-dialog/create-entity-dialog-data.mjs +1 -1
- package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +15 -8
- package/esm2020/components/table/edit-dialog/edit-dialog-data.builder.mjs +2 -2
- package/esm2020/components/table/edit-dialog/edit-entity-dialog-data.mjs +1 -1
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.builder.mjs +2 -2
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +18 -10
- package/esm2020/components/table/table-data.builder.mjs +3 -3
- package/esm2020/components/table/table-data.mjs +1 -1
- package/esm2020/components/table/table.component.mjs +21 -23
- package/esm2020/decorators/array/array-decorator-internal.data.mjs +102 -14
- package/esm2020/decorators/array/array-decorator.data.mjs +2 -2
- package/esm2020/decorators/array/array.decorator.mjs +8 -2
- package/esm2020/decorators/base/base-property.decorator.mjs +4 -3
- package/esm2020/decorators/base/decorator-types.enum.mjs +6 -1
- package/esm2020/decorators/base/property-decorator-internal.data.mjs +10 -10
- package/esm2020/decorators/base/property-decorator.data.mjs +1 -1
- package/esm2020/decorators/boolean/boolean-decorator-internal.data.mjs +3 -3
- package/esm2020/decorators/date/date-decorator-internal.data.mjs +5 -5
- package/esm2020/decorators/date/date.decorator.mjs +21 -0
- package/esm2020/decorators/file/file-decorator-internal.data.mjs +98 -0
- package/esm2020/decorators/file/file-decorator.data.mjs +7 -0
- package/esm2020/decorators/file/file.decorator.mjs +22 -0
- package/esm2020/decorators/object/object-decorator-internal.data.mjs +1 -1
- package/esm2020/decorators/object/object-decorator.data.mjs +1 -1
- package/esm2020/decorators/object/object.decorator.mjs +1 -1
- package/esm2020/decorators/string/string.decorator.mjs +1 -1
- package/esm2020/mocks/placeholder-data.png.mjs +3 -0
- package/esm2020/public-api.mjs +6 -1
- package/fesm2015/ngx-material-entity.mjs +2452 -459
- package/fesm2015/ngx-material-entity.mjs.map +1 -1
- package/fesm2020/ngx-material-entity.mjs +2370 -464
- package/fesm2020/ngx-material-entity.mjs.map +1 -1
- package/mocks/placeholder-data.png.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +5 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Directive, EventEmitter, HostListener, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Adds drag and drop functionality to an element.
|
|
5
|
+
*/
|
|
6
|
+
export class DragDropDirective {
|
|
7
|
+
constructor() {
|
|
8
|
+
/**
|
|
9
|
+
* Emits the dropped files to the parent.
|
|
10
|
+
*/
|
|
11
|
+
this.files = new EventEmitter();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Prevents the event default.
|
|
15
|
+
*
|
|
16
|
+
* @param evt - The Event when dragged files hover over the parent.
|
|
17
|
+
*/
|
|
18
|
+
onDragOver(evt) {
|
|
19
|
+
evt.preventDefault();
|
|
20
|
+
evt.stopPropagation();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Prevents the event default.
|
|
24
|
+
*
|
|
25
|
+
* @param evt - The Event when dragged files leave the parent.
|
|
26
|
+
*/
|
|
27
|
+
onDragLeave(evt) {
|
|
28
|
+
evt.preventDefault();
|
|
29
|
+
evt.stopPropagation();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Prevents the event default and emits the dropped files with the output.
|
|
33
|
+
*
|
|
34
|
+
* @param evt - The Event when files are dropped.
|
|
35
|
+
*/
|
|
36
|
+
onDrop(evt) {
|
|
37
|
+
evt.preventDefault();
|
|
38
|
+
evt.stopPropagation();
|
|
39
|
+
if (evt.dataTransfer && evt.dataTransfer.files.length > 0) {
|
|
40
|
+
this.files.emit(Array.from(evt.dataTransfer.files));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
DragDropDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DragDropDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
45
|
+
DragDropDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: DragDropDirective, selector: "[dragDrop]", outputs: { files: "files" }, host: { listeners: { "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" } }, ngImport: i0 });
|
|
46
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DragDropDirective, decorators: [{
|
|
47
|
+
type: Directive,
|
|
48
|
+
args: [{
|
|
49
|
+
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
50
|
+
selector: '[dragDrop]'
|
|
51
|
+
}]
|
|
52
|
+
}], ctorParameters: function () { return []; }, propDecorators: { files: [{
|
|
53
|
+
type: Output
|
|
54
|
+
}], onDragOver: [{
|
|
55
|
+
type: HostListener,
|
|
56
|
+
args: ['dragover', ['$event']]
|
|
57
|
+
}], onDragLeave: [{
|
|
58
|
+
type: HostListener,
|
|
59
|
+
args: ['dragleave', ['$event']]
|
|
60
|
+
}], onDrop: [{
|
|
61
|
+
type: HostListener,
|
|
62
|
+
args: ['drop', ['$event']]
|
|
63
|
+
}] } });
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ0Ryb3AuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9pbnB1dC9maWxlL2ZpbGUtaW5wdXQvZHJhZ0Ryb3AuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTlFOztHQUVHO0FBS0gsTUFBTSxPQUFPLGlCQUFpQjtJQU8xQjtRQU5BOztXQUVHO1FBRUgsVUFBSyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO0lBRXpDLENBQUM7SUFFakI7Ozs7T0FJRztJQUVILFVBQVUsQ0FBQyxHQUFjO1FBQ3JCLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyQixHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7SUFFSCxXQUFXLENBQUMsR0FBYztRQUN0QixHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckIsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBRUgsTUFBTSxDQUFDLEdBQWM7UUFDakIsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN0QixJQUFJLEdBQUcsQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN2RDtJQUNMLENBQUM7OytHQTNDUSxpQkFBaUI7bUdBQWpCLGlCQUFpQjs0RkFBakIsaUJBQWlCO2tCQUo3QixTQUFTO21CQUFDO29CQUNQLDhEQUE4RDtvQkFDOUQsUUFBUSxFQUFFLFlBQVk7aUJBQ3pCOzBFQU1HLEtBQUs7c0JBREosTUFBTTtnQkFXUCxVQUFVO3NCQURULFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVlwQyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVlyQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogQWRkcyBkcmFnIGFuZCBkcm9wIGZ1bmN0aW9uYWxpdHkgdG8gYW4gZWxlbWVudC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1tkcmFnRHJvcF0nXG59KVxuZXhwb3J0IGNsYXNzIERyYWdEcm9wRGlyZWN0aXZlIHtcbiAgICAvKipcbiAgICAgKiBFbWl0cyB0aGUgZHJvcHBlZCBmaWxlcyB0byB0aGUgcGFyZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGZpbGVzOiBFdmVudEVtaXR0ZXI8RmlsZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7IH1cblxuICAgIC8qKlxuICAgICAqIFByZXZlbnRzIHRoZSBldmVudCBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGV2dCAtIFRoZSBFdmVudCB3aGVuIGRyYWdnZWQgZmlsZXMgaG92ZXIgb3ZlciB0aGUgcGFyZW50LlxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2RyYWdvdmVyJywgWyckZXZlbnQnXSlcbiAgICBvbkRyYWdPdmVyKGV2dDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJldmVudHMgdGhlIGV2ZW50IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZ0IC0gVGhlIEV2ZW50IHdoZW4gZHJhZ2dlZCBmaWxlcyBsZWF2ZSB0aGUgcGFyZW50LlxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIFsnJGV2ZW50J10pXG4gICAgb25EcmFnTGVhdmUoZXZ0OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50cyB0aGUgZXZlbnQgZGVmYXVsdCBhbmQgZW1pdHMgdGhlIGRyb3BwZWQgZmlsZXMgd2l0aCB0aGUgb3V0cHV0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGV2dCAtIFRoZSBFdmVudCB3aGVuIGZpbGVzIGFyZSBkcm9wcGVkLlxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2Ryb3AnLCBbJyRldmVudCddKVxuICAgIG9uRHJvcChldnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoZXZ0LmRhdGFUcmFuc2ZlciAmJiBldnQuZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZXMuZW1pdChBcnJheS5mcm9tKGV2dC5kYXRhVHJhbnNmZXIuZmlsZXMpKTtcbiAgICAgICAgfVxuICAgIH1cbn0iXX0=
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
2
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
3
|
+
import { DecoratorTypes } from '../../../../decorators/base/decorator-types.enum';
|
|
4
|
+
import { EntityUtilities } from '../../../../classes/entity.utilities';
|
|
5
|
+
import { FileUtilities } from '../../../../classes/file.utilities';
|
|
6
|
+
import { LodashUtilities } from '../../../../capsulation/lodash.utilities';
|
|
7
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
8
|
+
import { NgxMatEntityConfirmDialogComponent } from '../../../confirm-dialog/confirm-dialog.component';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/material/dialog";
|
|
11
|
+
import * as i2 from "@angular/material/form-field";
|
|
12
|
+
import * as i3 from "@angular/material/chips";
|
|
13
|
+
import * as i4 from "@angular/material/button";
|
|
14
|
+
import * as i5 from "@angular/forms";
|
|
15
|
+
import * as i6 from "@angular/common";
|
|
16
|
+
import * as i7 from "./dragDrop.directive";
|
|
17
|
+
export class FileInputComponent {
|
|
18
|
+
constructor(dialog) {
|
|
19
|
+
this.dialog = dialog;
|
|
20
|
+
this.FileUtilities = FileUtilities;
|
|
21
|
+
this.fileDataChangeEvent = new EventEmitter();
|
|
22
|
+
}
|
|
23
|
+
async ngOnInit() {
|
|
24
|
+
this.metadata = EntityUtilities.getPropertyMetadata(this.entity, this.key, DecoratorTypes.FILE_DEFAULT);
|
|
25
|
+
if (this.metadata.multiple) {
|
|
26
|
+
this.initMultiFile();
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.initSingleFile();
|
|
30
|
+
}
|
|
31
|
+
this.fileDataChangeEvent.emit(this.singleFileData ?? this.multiFileData);
|
|
32
|
+
}
|
|
33
|
+
initMultiFile() {
|
|
34
|
+
this.multiFileData = this.entity[this.key];
|
|
35
|
+
if (this.multiFileData) {
|
|
36
|
+
this.filenames = this.multiFileData.map(f => f.name);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
initSingleFile() {
|
|
40
|
+
this.singleFileData = this.entity[this.key];
|
|
41
|
+
if (this.singleFileData) {
|
|
42
|
+
this.filenames = LodashUtilities.cloneDeep([this.singleFileData.name]);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async setFileFromInput(event) {
|
|
46
|
+
const files = event.target.files ?? [];
|
|
47
|
+
await this.setFile(Array.from(files));
|
|
48
|
+
}
|
|
49
|
+
async setFile(files) {
|
|
50
|
+
// validation done inline
|
|
51
|
+
if (files.find(f => !FileUtilities.isMimeTypeValid(f.type, this.metadata.allowedMimeTypes))) {
|
|
52
|
+
this.dialog.open(NgxMatEntityConfirmDialogComponent, {
|
|
53
|
+
data: this.metadata.mimeTypeErrorDialog,
|
|
54
|
+
autoFocus: false,
|
|
55
|
+
restoreFocus: false
|
|
56
|
+
});
|
|
57
|
+
this.resetFileInputs();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (files.find(f => f.size > (this.metadata.maxSize * 1000000))) {
|
|
61
|
+
this.dialog.open(NgxMatEntityConfirmDialogComponent, {
|
|
62
|
+
data: this.metadata.maxSizeErrorDialog,
|
|
63
|
+
autoFocus: false,
|
|
64
|
+
restoreFocus: false
|
|
65
|
+
});
|
|
66
|
+
this.resetFileInputs();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
let fileSizeTotal = 0;
|
|
70
|
+
for (const file of files) {
|
|
71
|
+
fileSizeTotal += file.size;
|
|
72
|
+
}
|
|
73
|
+
if (fileSizeTotal > (this.metadata.maxSizeTotal * 1000000)) {
|
|
74
|
+
this.dialog.open(NgxMatEntityConfirmDialogComponent, {
|
|
75
|
+
data: this.metadata.maxSizeTotalErrorDialog,
|
|
76
|
+
autoFocus: false,
|
|
77
|
+
restoreFocus: false
|
|
78
|
+
});
|
|
79
|
+
this.resetFileInputs();
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (this.metadata.multiple) {
|
|
83
|
+
await this.setMultiFile(Array.from(files));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
await this.setSingleFile(files[0]);
|
|
87
|
+
}
|
|
88
|
+
this.fileDataChangeEvent.emit(this.singleFileData ?? this.multiFileData);
|
|
89
|
+
}
|
|
90
|
+
resetFileInputs() {
|
|
91
|
+
this.filenames = undefined;
|
|
92
|
+
this.singleFileData = undefined;
|
|
93
|
+
this.multiFileData = undefined;
|
|
94
|
+
this.fileDataChangeEvent.emit();
|
|
95
|
+
}
|
|
96
|
+
async setMultiFile(files) {
|
|
97
|
+
const data = [];
|
|
98
|
+
for (const file of files) {
|
|
99
|
+
const fileData = {
|
|
100
|
+
file: file,
|
|
101
|
+
name: file.name,
|
|
102
|
+
type: file.type,
|
|
103
|
+
size: file.size
|
|
104
|
+
};
|
|
105
|
+
data.push(fileData);
|
|
106
|
+
}
|
|
107
|
+
this.multiFileData = LodashUtilities.cloneDeep(data);
|
|
108
|
+
this.filenames = this.multiFileData.map(f => f.name);
|
|
109
|
+
}
|
|
110
|
+
async setSingleFile(file) {
|
|
111
|
+
this.singleFileData = {
|
|
112
|
+
file: file,
|
|
113
|
+
name: file.name,
|
|
114
|
+
type: file.type,
|
|
115
|
+
size: file.size
|
|
116
|
+
};
|
|
117
|
+
this.filenames = LodashUtilities.cloneDeep([this.singleFileData.name]);
|
|
118
|
+
}
|
|
119
|
+
removeFile(name) {
|
|
120
|
+
if (this.metadata.multiple) {
|
|
121
|
+
this.filenames?.splice(this.filenames.indexOf(name), 1);
|
|
122
|
+
if (!this.filenames?.length) {
|
|
123
|
+
this.filenames = undefined;
|
|
124
|
+
}
|
|
125
|
+
const fileDataToRemove = this.multiFileData?.find(f => f.name === name);
|
|
126
|
+
this.multiFileData?.splice(this.multiFileData.indexOf(fileDataToRemove), 1);
|
|
127
|
+
if (!this.multiFileData?.length) {
|
|
128
|
+
this.multiFileData = undefined;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
this.filenames = undefined;
|
|
133
|
+
this.singleFileData = undefined;
|
|
134
|
+
}
|
|
135
|
+
this.fileDataChangeEvent.emit(this.singleFileData ?? this.multiFileData);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
FileInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FileInputComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
139
|
+
FileInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: FileInputComponent, selector: "file-input", inputs: { entity: "entity", key: "key", getValidationErrorMessage: "getValidationErrorMessage" }, outputs: { fileDataChangeEvent: "fileDataChangeEvent" }, ngImport: i0, template: "<input #fileInput\n type=\"file\" hidden\n [multiple]=\"metadata.multiple\"\n [accept]=\"FileUtilities.getAcceptString(metadata.allowedMimeTypes)\"\n (change)=\"setFileFromInput($event)\"\n>\n\n<mat-form-field floatLabel=\"always\" (click)=\"fileInput.click()\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-list #chipList\n [(ngModel)]=\"filenames\"\n [name]=\"key.toString()\"\n #model=\"ngModel\"\n [required]=\"metadata.required\"\n >\n <mat-chip *ngFor=\"let name of filenames\" (removed)=\"removeFile(name)\">\n {{name}}\n <button matChipRemove>\n <i class=\"{{metadata.deleteIcon}}\"></i>\n </button>\n </mat-chip>\n <input [matChipInputFor]=\"chipList\" [readonly]=\"true\">\n </mat-chip-list>\n <button mat-icon-button matSuffix>\n <i class=\"fas fa-upload\"></i>\n </button>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>\n\n<div *ngIf=\"metadata.dragAndDrop\" class=\"dropdown\" dragDrop (files)=\"setFile($event)\">\n <i class=\"fas fa-file-arrow-up\"></i>\n</div>", styles: ["mat-form-field{width:100%}input:hover,mat-form-field:hover{cursor:pointer}i{color:#757575}.dropdown{display:flex;align-items:center;justify-content:center;height:200px;border:2px dashed #757575;border-radius:15px;margin-top:5px;margin-bottom:5px}.dropdown i{font-size:30px}\n"], components: [{ type: i2.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i3.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i2.MatLabel, selector: "mat-label" }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i3.MatChipRemove, selector: "[matChipRemove]" }, { type: i3.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i2.MatSuffix, selector: "[matSuffix]" }, { type: i2.MatError, selector: "mat-error", inputs: ["id"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.DragDropDirective, selector: "[dragDrop]", outputs: ["files"] }] });
|
|
140
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FileInputComponent, decorators: [{
|
|
141
|
+
type: Component,
|
|
142
|
+
args: [{ selector: 'file-input', template: "<input #fileInput\n type=\"file\" hidden\n [multiple]=\"metadata.multiple\"\n [accept]=\"FileUtilities.getAcceptString(metadata.allowedMimeTypes)\"\n (change)=\"setFileFromInput($event)\"\n>\n\n<mat-form-field floatLabel=\"always\" (click)=\"fileInput.click()\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-list #chipList\n [(ngModel)]=\"filenames\"\n [name]=\"key.toString()\"\n #model=\"ngModel\"\n [required]=\"metadata.required\"\n >\n <mat-chip *ngFor=\"let name of filenames\" (removed)=\"removeFile(name)\">\n {{name}}\n <button matChipRemove>\n <i class=\"{{metadata.deleteIcon}}\"></i>\n </button>\n </mat-chip>\n <input [matChipInputFor]=\"chipList\" [readonly]=\"true\">\n </mat-chip-list>\n <button mat-icon-button matSuffix>\n <i class=\"fas fa-upload\"></i>\n </button>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>\n\n<div *ngIf=\"metadata.dragAndDrop\" class=\"dropdown\" dragDrop (files)=\"setFile($event)\">\n <i class=\"fas fa-file-arrow-up\"></i>\n</div>", styles: ["mat-form-field{width:100%}input:hover,mat-form-field:hover{cursor:pointer}i{color:#757575}.dropdown{display:flex;align-items:center;justify-content:center;height:200px;border:2px dashed #757575;border-radius:15px;margin-top:5px;margin-bottom:5px}.dropdown i{font-size:30px}\n"] }]
|
|
143
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialog }]; }, propDecorators: { entity: [{
|
|
144
|
+
type: Input
|
|
145
|
+
}], key: [{
|
|
146
|
+
type: Input
|
|
147
|
+
}], getValidationErrorMessage: [{
|
|
148
|
+
type: Input
|
|
149
|
+
}], fileDataChangeEvent: [{
|
|
150
|
+
type: Output
|
|
151
|
+
}] } });
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2ZpbGUvZmlsZS1pbnB1dC9maWxlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NvbXBvbmVudHMvaW5wdXQvZmlsZS9maWxlLWlucHV0L2ZpbGUtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0NBQXdDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7Ozs7Ozs7O0FBU3RHLE1BQU0sT0FBTyxrQkFBa0I7SUFzQjNCLFlBQTZCLE1BQWlCO1FBQWpCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFoQjlDLGtCQUFhLEdBQUcsYUFBYSxDQUFDO1FBWTlCLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO0lBSWQsQ0FBQztJQUVuRCxLQUFLLENBQUMsUUFBUTtRQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxN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Q0FBQyxDQUFDLENBQUM7WUFDNUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFO2dCQUM3QixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQzthQUNsQztTQUNKO2FBQ0k7WUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztTQUNuQztRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0UsQ0FBQzs7Z0hBakpRLGtCQUFrQjtvR0FBbEIsa0JBQWtCLDZNQ25CL0IsaXBDQStCTTs0RkRaTyxrQkFBa0I7a0JBTjlCLFNBQVM7K0JBRUksWUFBWTtnR0FhdEIsTUFBTTtzQkFETCxLQUFLO2dCQUlOLEdBQUc7c0JBREYsS0FBSztnQkFJTix5QkFBeUI7c0JBRHhCLEtBQUs7Z0JBSU4sbUJBQW1CO3NCQURsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1qc2RvYyAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERlY29yYXRvclR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9iYXNlL2RlY29yYXRvci10eXBlcy5lbnVtJztcbmltcG9ydCB7IEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uLy4uLy4uLy4uL2NsYXNzZXMvZW50aXR5LnV0aWxpdGllcyc7XG5pbXBvcnQgeyBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9maWxlL2ZpbGUtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRmlsZVV0aWxpdGllcyB9IGZyb20gJy4uLy4uLy4uLy4uL2NsYXNzZXMvZmlsZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgRmlsZURhdGEgfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2ZpbGUvZmlsZS1kZWNvcmF0b3IuZGF0YSc7XG5pbXBvcnQgeyBMb2Rhc2hVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi8uLi8uLi9jYXBzdWxhdGlvbi9sb2Rhc2gudXRpbGl0aWVzJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29uZmlybS1kaWFsb2cvY29uZmlybS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IEJhc2VFbnRpdHlUeXBlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY2xhc3Nlcy9lbnRpdHkubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnZmlsZS1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2ZpbGUtaW5wdXQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlSW5wdXRDb21wb25lbnQ8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBzaW5nbGVGaWxlRGF0YT86IEZpbGVEYXRhO1xuICAgIG11bHRpRmlsZURhdGE/OiBGaWxlRGF0YVtdO1xuICAgIGZpbGVuYW1lcz86IHN0cmluZ1tdO1xuXG4gICAgRmlsZVV0aWxpdGllcyA9IEZpbGVVdGlsaXRpZXM7XG5cbiAgICBASW5wdXQoKVxuICAgIGVudGl0eSE6IEVudGl0eVR5cGU7XG5cbiAgICBASW5wdXQoKVxuICAgIGtleSE6IGtleW9mIEVudGl0eVR5cGU7XG5cbiAgICBASW5wdXQoKVxuICAgIGdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UhOiAobW9kZWw6IE5nTW9kZWwpID0+IHN0cmluZztcblxuICAgIEBPdXRwdXQoKVxuICAgIGZpbGVEYXRhQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVEYXRhIHwgRmlsZURhdGFbXT4oKTtcblxuICAgIG1ldGFkYXRhITogRGVmYXVsdEZpbGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nOiBNYXREaWFsb2cpIHsgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YSh0aGlzLmVudGl0eSwgdGhpcy5rZXksIERlY29yYXRvclR5cGVzLkZJTEVfREVGQVVMVCk7XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRNdWx0aUZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdFNpbmdsZUZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGVEYXRhQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnNpbmdsZUZpbGVEYXRhID8/IHRoaXMubXVsdGlGaWxlRGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0TXVsdGlGaWxlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm11bHRpRmlsZURhdGEgPSB0aGlzLmVudGl0eVt0aGlzLmtleV0gYXMgRmlsZURhdGFbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlGaWxlRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5maWxlbmFtZXMgPSB0aGlzLm11bHRpRmlsZURhdGEubWFwKGYgPT4gZi5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFNpbmdsZUZpbGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2luZ2xlRmlsZURhdGEgPSB0aGlzLmVudGl0eVt0aGlzLmtleV0gYXMgRmlsZURhdGEgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLnNpbmdsZUZpbGVEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVuYW1lcyA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAoW3RoaXMuc2luZ2xlRmlsZURhdGEubmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0RmlsZUZyb21JbnB1dChldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZmlsZXMgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzID8/IFtdO1xuICAgICAgICBhd2FpdCB0aGlzLnNldEZpbGUoQXJyYXkuZnJvbShmaWxlcykpO1xuICAgIH1cblxuICAgIGFzeW5jIHNldEZpbGUoZmlsZXM6IEZpbGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyB2YWxpZGF0aW9uIGRvbmUgaW5saW5lXG4gICAgICAgIGlmIChmaWxlcy5maW5kKGYgPT4gIUZpbGVVdGlsaXRpZXMuaXNNaW1lVHlwZVZhbGlkKGYudHlwZSwgdGhpcy5tZXRhZGF0YS5hbGxvd2VkTWltZVR5cGVzKSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMubWV0YWRhdGEubWltZVR5cGVFcnJvckRpYWxvZyxcbiAgICAgICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVJbnB1dHMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZXMuZmluZChmID0+IGYuc2l6ZSA+ICh0aGlzLm1ldGFkYXRhLm1heFNpemUgKiAxMDAwMDAwKSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMubWV0YWRhdGEubWF4U2l6ZUVycm9yRGlhbG9nLFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RmlsZUlucHV0cygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlU2l6ZVRvdGFsID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBmaWxlU2l6ZVRvdGFsICs9IGZpbGUuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZVNpemVUb3RhbCA+ICh0aGlzLm1ldGFkYXRhLm1heFNpemVUb3RhbCAqIDEwMDAwMDApKSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLm1ldGFkYXRhLm1heFNpemVUb3RhbEVycm9yRGlhbG9nLFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RmlsZUlucHV0cygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldE11bHRpRmlsZShBcnJheS5mcm9tKGZpbGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldFNpbmdsZUZpbGUoZmlsZXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsZURhdGFDaGFuZ2VFdmVudC5lbWl0KHRoaXMuc2luZ2xlRmlsZURhdGEgPz8gdGhpcy5tdWx0aUZpbGVEYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0RmlsZUlucHV0cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWxlbmFtZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc2luZ2xlRmlsZURhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubXVsdGlGaWxlRGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5maWxlRGF0YUNoYW5nZUV2ZW50LmVtaXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNldE11bHRpRmlsZShmaWxlczogRmlsZVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhdGE6IEZpbGVEYXRhW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGF0YTogRmlsZURhdGEgPSB7XG4gICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRhdGEucHVzaChmaWxlRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tdWx0aUZpbGVEYXRhID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcChkYXRhKTtcbiAgICAgICAgdGhpcy5maWxlbmFtZXMgPSB0aGlzLm11bHRpRmlsZURhdGEubWFwKGYgPT4gZi5uYW1lKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNldFNpbmdsZUZpbGUoZmlsZTogRmlsZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnNpbmdsZUZpbGVEYXRhID0ge1xuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmZpbGVuYW1lcyA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAoW3RoaXMuc2luZ2xlRmlsZURhdGEubmFtZV0pO1xuICAgIH1cblxuICAgIHJlbW92ZUZpbGUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVuYW1lcz8uc3BsaWNlKHRoaXMuZmlsZW5hbWVzLmluZGV4T2YobmFtZSksIDEpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVuYW1lcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlbmFtZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWxlRGF0YVRvUmVtb3ZlID0gdGhpcy5tdWx0aUZpbGVEYXRhPy5maW5kKGYgPT4gZi5uYW1lID09PSBuYW1lKSBhcyBGaWxlRGF0YTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlGaWxlRGF0YT8uc3BsaWNlKHRoaXMubXVsdGlGaWxlRGF0YS5pbmRleE9mKGZpbGVEYXRhVG9SZW1vdmUpLCAxKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5tdWx0aUZpbGVEYXRhPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm11bHRpRmlsZURhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVuYW1lcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc2luZ2xlRmlsZURhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWxlRGF0YUNoYW5nZUV2ZW50LmVtaXQodGhpcy5zaW5nbGVGaWxlRGF0YSA/PyB0aGlzLm11bHRpRmlsZURhdGEpO1xuICAgIH1cbn0iLCI8aW5wdXQgI2ZpbGVJbnB1dFxuICAgIHR5cGU9XCJmaWxlXCIgaGlkZGVuXG4gICAgW211bHRpcGxlXT1cIm1ldGFkYXRhLm11bHRpcGxlXCJcbiAgICBbYWNjZXB0XT1cIkZpbGVVdGlsaXRpZXMuZ2V0QWNjZXB0U3RyaW5nKG1ldGFkYXRhLmFsbG93ZWRNaW1lVHlwZXMpXCJcbiAgICAoY2hhbmdlKT1cInNldEZpbGVGcm9tSW5wdXQoJGV2ZW50KVwiXG4+XG5cbjxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwiYWx3YXlzXCIgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCI+XG4gICAgPG1hdC1sYWJlbD57e21ldGFkYXRhLmRpc3BsYXlOYW1lfX08L21hdC1sYWJlbD5cbiAgICA8bWF0LWNoaXAtbGlzdCAjY2hpcExpc3RcbiAgICAgICAgWyhuZ01vZGVsKV09XCJmaWxlbmFtZXNcIlxuICAgICAgICBbbmFtZV09XCJrZXkudG9TdHJpbmcoKVwiXG4gICAgICAgICNtb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWRcIlxuICAgID5cbiAgICAgICAgPG1hdC1jaGlwICpuZ0Zvcj1cImxldCBuYW1lIG9mIGZpbGVuYW1lc1wiIChyZW1vdmVkKT1cInJlbW92ZUZpbGUobmFtZSlcIj5cbiAgICAgICAgICAgIHt7bmFtZX19XG4gICAgICAgICAgICA8YnV0dG9uIG1hdENoaXBSZW1vdmU+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ7e21ldGFkYXRhLmRlbGV0ZUljb259fVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L21hdC1jaGlwPlxuICAgICAgICA8aW5wdXQgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiIFtyZWFkb25seV09XCJ0cnVlXCI+XG4gICAgPC9tYXQtY2hpcC1saXN0PlxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeD5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdXBsb2FkXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG48L21hdC1mb3JtLWZpZWxkPlxuXG48ZGl2ICpuZ0lmPVwibWV0YWRhdGEuZHJhZ0FuZERyb3BcIiBjbGFzcz1cImRyb3Bkb3duXCIgZHJhZ0Ryb3AgKGZpbGVzKT1cInNldEZpbGUoJGV2ZW50KVwiPlxuICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZpbGUtYXJyb3ctdXBcIj48L2k+XG48L2Rpdj4iXX0=
|