ngx-material-entity 15.3.0 → 16.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/classes/entity.model.d.ts +2 -2
- package/components/confirm-dialog/confirm-dialog-data.d.ts +1 -1
- package/components/edit-page/edit-page.component.d.ts +4 -2
- package/components/edit-page/page-edit-data.builder.d.ts +1 -1
- package/components/input/array/array-string-chips-input/array-string-chips-input.component.d.ts +1 -0
- package/components/input/array/array-table.class.d.ts +4 -2
- package/components/input/base-input.component.d.ts +5 -1
- package/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.d.ts +1 -1
- package/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.d.ts +1 -1
- package/components/input/file/file-default-input/file-default-input.component.d.ts +0 -2
- package/components/input/file/file-image-input/file-image-input.component.d.ts +3 -2
- package/components/input/file/file-input/file-input.component.d.ts +4 -2
- package/components/input/input.component.d.ts +9 -4
- package/components/input/input.module.d.ts +2 -1
- package/components/table/display-column-value/base-display-column-value.component.d.ts +1 -1
- package/components/table/display-column-value/display-column-value.component.d.ts +1 -1
- package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +3 -1
- package/components/table/table-data.builder.d.ts +1 -1
- package/components/table/table-data.d.ts +1 -1
- package/components/table/table.component.d.ts +1 -1
- package/decorators/base/decorator-types.enum.d.ts +1 -1
- package/decorators/base/property-decorator.data.d.ts +1 -1
- package/decorators/file/file-decorator.data.d.ts +1 -1
- package/decorators/number/number-decorator.data.d.ts +1 -1
- package/decorators/string/string-decorator.data.d.ts +1 -1
- package/encapsulation/jszip.utilities.d.ts +1 -1
- package/encapsulation/uuid.utilities.d.ts +11 -0
- package/esm2022/classes/base.builder.mjs +44 -0
- package/esm2022/classes/entity.model.mjs +26 -0
- package/esm2022/components/confirm-dialog/confirm-dialog-data.builder.mjs +58 -0
- package/esm2022/components/confirm-dialog/confirm-dialog.component.mjs +60 -0
- package/esm2022/components/edit-page/edit-page.component.mjs +291 -0
- package/esm2022/components/input/array/array-date-input/array-date-input.component.mjs +23 -0
- package/esm2022/components/input/array/array-date-range-input/array-date-range-input.component.mjs +49 -0
- package/esm2022/components/input/array/array-date-time-input/array-date-time-input.component.mjs +49 -0
- package/esm2022/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +50 -0
- package/esm2022/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +69 -0
- package/esm2022/components/input/array/array-table.class.mjs +100 -0
- package/esm2022/components/input/base-input.component.mjs +88 -0
- package/esm2022/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +21 -0
- package/esm2022/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +17 -0
- package/esm2022/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +21 -0
- package/esm2022/components/input/custom/custom.component.mjs +28 -0
- package/esm2022/components/input/date/date-input/date-input.component.mjs +19 -0
- package/esm2022/components/input/date/date-range-input/date-range-input.component.mjs +68 -0
- package/esm2022/components/input/date/date-time-input/date-time-input.component.mjs +69 -0
- package/esm2022/components/input/file/file-default-input/file-default-input.component.mjs +18 -0
- package/esm2022/components/input/file/file-image-input/file-image-input.component.mjs +101 -0
- package/esm2022/components/input/file/file-input/dragDrop.directive.mjs +62 -0
- package/esm2022/components/input/file/file-input/file-input.component.mjs +206 -0
- package/esm2022/components/input/input.component.mjs +849 -0
- package/esm2022/components/input/input.module.mjs +172 -0
- package/esm2022/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +23 -0
- package/esm2022/components/input/number/number-input/number-input.component.mjs +16 -0
- package/esm2022/components/input/number/number-slider-input/number-slider-input.component.mjs +17 -0
- package/esm2022/components/input/relations/references-many-input/references-many-input.component.mjs +102 -0
- package/esm2022/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +36 -0
- package/esm2022/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +23 -0
- package/esm2022/components/input/string/string-input/string-input.component.mjs +16 -0
- package/esm2022/components/input/string/string-password-input/string-password-input.component.mjs +39 -0
- package/esm2022/components/input/string/string-textbox-input/string-textbox-input.component.mjs +17 -0
- package/esm2022/components/table/create-dialog/create-dialog-data.builder.mjs +42 -0
- package/esm2022/components/table/create-dialog/create-entity-dialog-data.builder.mjs +32 -0
- package/esm2022/components/table/create-dialog/create-entity-dialog.component.mjs +107 -0
- package/esm2022/components/table/display-column-value/base-display-column-value.component.mjs +28 -0
- package/esm2022/components/table/display-column-value/display-column-value.component.mjs +37 -0
- package/esm2022/components/table/edit-dialog/edit-data.builder.mjs +106 -0
- package/esm2022/components/table/edit-dialog/edit-entity-dialog.component.mjs +209 -0
- package/esm2022/components/table/edit-dialog/edit-entity.builder.mjs +39 -0
- package/esm2022/components/table/table-data.builder.mjs +269 -0
- package/esm2022/components/table/table.component.mjs +348 -0
- package/esm2022/decorators/array/array-decorator-internal.data.mjs +286 -0
- package/esm2022/decorators/array/array-decorator.data.mjs +21 -0
- package/esm2022/decorators/base/property-decorator-internal.data.mjs +82 -0
- package/esm2022/decorators/base/property-decorator.data.mjs +56 -0
- package/esm2022/decorators/boolean/boolean-decorator-internal.data.mjs +43 -0
- package/esm2022/decorators/boolean/boolean-decorator.data.mjs +11 -0
- package/esm2022/decorators/custom/custom-decorator-internal.data.mjs +35 -0
- package/{esm2020 → esm2022}/decorators/date/date-decorator-internal.data.mjs +43 -1
- package/esm2022/decorators/date/date-decorator.data.mjs +11 -0
- package/esm2022/decorators/file/file-decorator-internal.data.mjs +143 -0
- package/esm2022/decorators/file/file-decorator.data.mjs +64 -0
- package/esm2022/decorators/has-many/has-many-decorator-internal.data.mjs +42 -0
- package/esm2022/decorators/number/number-decorator-internal.data.mjs +76 -0
- package/esm2022/decorators/number/number-decorator.data.mjs +11 -0
- package/esm2022/decorators/object/object-decorator-internal.data.mjs +20 -0
- package/esm2022/decorators/object/object-decorator.data.mjs +22 -0
- package/esm2022/decorators/references-many/references-many-decorator-internal.data.mjs +48 -0
- package/esm2022/decorators/references-one/references-one-decorator-internal.data.mjs +24 -0
- package/esm2022/decorators/string/string-decorator-internal.data.mjs +114 -0
- package/esm2022/decorators/string/string-decorator.data.mjs +11 -0
- package/esm2022/encapsulation/uuid.utilities.mjs +15 -0
- package/esm2022/services/entity.service.mjs +276 -0
- package/esm2022/utilities/date.utilities.mjs +159 -0
- package/esm2022/utilities/entity.utilities.mjs +905 -0
- package/esm2022/utilities/file.utilities.mjs +180 -0
- package/{fesm2020 → fesm2022}/ngx-material-entity.mjs +1355 -484
- package/fesm2022/ngx-material-entity.mjs.map +1 -0
- package/package.json +11 -17
- package/utilities/date.utilities.d.ts +1 -1
- package/utilities/entity.utilities.d.ts +7 -3
- package/utilities/file.utilities.d.ts +6 -2
- package/esm2020/classes/base.builder.mjs +0 -42
- package/esm2020/classes/entity.model.mjs +0 -22
- package/esm2020/components/confirm-dialog/confirm-dialog-data.builder.mjs +0 -44
- package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +0 -57
- package/esm2020/components/edit-page/edit-page.component.mjs +0 -274
- package/esm2020/components/input/array/array-date-input/array-date-input.component.mjs +0 -26
- package/esm2020/components/input/array/array-date-range-input/array-date-range-input.component.mjs +0 -50
- package/esm2020/components/input/array/array-date-time-input/array-date-time-input.component.mjs +0 -49
- package/esm2020/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +0 -49
- package/esm2020/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +0 -70
- package/esm2020/components/input/array/array-table.class.mjs +0 -93
- package/esm2020/components/input/base-input.component.mjs +0 -64
- package/esm2020/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +0 -21
- package/esm2020/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +0 -17
- package/esm2020/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +0 -21
- package/esm2020/components/input/custom/custom.component.mjs +0 -26
- package/esm2020/components/input/date/date-input/date-input.component.mjs +0 -22
- package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +0 -71
- package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +0 -71
- package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +0 -23
- package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +0 -98
- package/esm2020/components/input/file/file-input/dragDrop.directive.mjs +0 -63
- package/esm2020/components/input/file/file-input/file-input.component.mjs +0 -195
- package/esm2020/components/input/input.component.mjs +0 -746
- package/esm2020/components/input/input.module.mjs +0 -169
- package/esm2020/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +0 -26
- package/esm2020/components/input/number/number-input/number-input.component.mjs +0 -16
- package/esm2020/components/input/number/number-slider-input/number-slider-input.component.mjs +0 -17
- package/esm2020/components/input/relations/references-many-input/references-many-input.component.mjs +0 -100
- package/esm2020/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +0 -34
- package/esm2020/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +0 -26
- package/esm2020/components/input/string/string-input/string-input.component.mjs +0 -16
- package/esm2020/components/input/string/string-password-input/string-password-input.component.mjs +0 -42
- package/esm2020/components/input/string/string-textbox-input/string-textbox-input.component.mjs +0 -17
- package/esm2020/components/table/create-dialog/create-dialog-data.builder.mjs +0 -32
- package/esm2020/components/table/create-dialog/create-entity-dialog-data.builder.mjs +0 -26
- package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +0 -100
- package/esm2020/components/table/display-column-value/base-display-column-value.component.mjs +0 -27
- package/esm2020/components/table/display-column-value/display-column-value.component.mjs +0 -33
- package/esm2020/components/table/edit-dialog/edit-data.builder.mjs +0 -76
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +0 -195
- package/esm2020/components/table/edit-dialog/edit-entity.builder.mjs +0 -29
- package/esm2020/components/table/table-data.builder.mjs +0 -205
- package/esm2020/components/table/table.component.mjs +0 -333
- package/esm2020/decorators/array/array-decorator-internal.data.mjs +0 -150
- package/esm2020/decorators/array/array-decorator.data.mjs +0 -7
- package/esm2020/decorators/base/property-decorator-internal.data.mjs +0 -58
- package/esm2020/decorators/base/property-decorator.data.mjs +0 -6
- package/esm2020/decorators/boolean/boolean-decorator-internal.data.mjs +0 -33
- package/esm2020/decorators/boolean/boolean-decorator.data.mjs +0 -7
- package/esm2020/decorators/custom/custom-decorator-internal.data.mjs +0 -27
- package/esm2020/decorators/date/date-decorator.data.mjs +0 -7
- package/esm2020/decorators/file/file-decorator-internal.data.mjs +0 -97
- package/esm2020/decorators/file/file-decorator.data.mjs +0 -7
- package/esm2020/decorators/has-many/has-many-decorator-internal.data.mjs +0 -32
- package/esm2020/decorators/number/number-decorator-internal.data.mjs +0 -54
- package/esm2020/decorators/number/number-decorator.data.mjs +0 -7
- package/esm2020/decorators/object/object-decorator-internal.data.mjs +0 -14
- package/esm2020/decorators/object/object-decorator.data.mjs +0 -7
- package/esm2020/decorators/references-many/references-many-decorator-internal.data.mjs +0 -30
- package/esm2020/decorators/references-one/references-one-decorator-internal.data.mjs +0 -16
- package/esm2020/decorators/string/string-decorator-internal.data.mjs +0 -72
- package/esm2020/decorators/string/string-decorator.data.mjs +0 -7
- package/esm2020/services/entity.service.mjs +0 -274
- package/esm2020/utilities/date.utilities.mjs +0 -159
- package/esm2020/utilities/entity.utilities.mjs +0 -896
- package/esm2020/utilities/file.utilities.mjs +0 -176
- package/fesm2015/ngx-material-entity.mjs +0 -6300
- package/fesm2015/ngx-material-entity.mjs.map +0 -1
- package/fesm2020/ngx-material-entity.mjs.map +0 -1
- /package/{esm2020 → esm2022}/components/confirm-dialog/confirm-dialog-data.mjs +0 -0
- /package/{esm2020 → esm2022}/components/edit-page/edit-data.route.mjs +0 -0
- /package/{esm2020 → esm2022}/components/edit-page/page-edit-data.builder.mjs +0 -0
- /package/{esm2020 → esm2022}/components/get-validation-error-message.function.mjs +0 -0
- /package/{esm2020 → esm2022}/components/table/create-dialog/create-entity-dialog-data.mjs +0 -0
- /package/{esm2020 → esm2022}/components/table/default.actions.mjs +0 -0
- /package/{esm2020 → esm2022}/components/table/edit-dialog/edit-entity-data.mjs +0 -0
- /package/{esm2020 → esm2022}/components/table/table-data.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/array/array.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/base/base-property.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/base/decorator-types.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/base/dropdown-value.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/boolean/boolean.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/custom/custom-decorator.data.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/custom/custom.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/date/date.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/file/file.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/has-many/has-many-decorator.data.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/has-many/has-many.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/number/number.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/object/object.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/references-many/references-many-decorator.data.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/references-many/references-many.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/references-one/references-one-decorator.data.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/references-one/references-one.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/decorators/string/string.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/encapsulation/js-2-xml.utilities.mjs +0 -0
- /package/{esm2020 → esm2022}/encapsulation/jszip.utilities.mjs +0 -0
- /package/{esm2020 → esm2022}/encapsulation/lodash.utilities.mjs +0 -0
- /package/{esm2020 → esm2022}/encapsulation/reflect.utilities.mjs +0 -0
- /package/{esm2020 → esm2022}/functions/default-false.function.mjs +0 -0
- /package/{esm2020 → esm2022}/functions/default-true.function.mjs +0 -0
- /package/{esm2020 → esm2022}/functions/is-async-function.function.mjs +0 -0
- /package/{esm2020 → esm2022}/mocks/placeholder-data.png.mjs +0 -0
- /package/{esm2020 → esm2022}/ngx-material-entity.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/services/unsaved-changes.guard.mjs +0 -0
- /package/{esm2020 → esm2022}/utilities/selection.utilities.mjs +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { Component } from '@angular/core';
|
|
4
|
+
import { ReflectUtilities } from '../../../../encapsulation/reflect.utilities';
|
|
5
|
+
import { placeholder } from '../../../../mocks/placeholder-data.png';
|
|
6
|
+
import { EntityUtilities } from '../../../../utilities/entity.utilities';
|
|
7
|
+
import { FileUtilities } from '../../../../utilities/file.utilities';
|
|
8
|
+
import { NgxMatEntityBaseInputComponent } from '../../base-input.component';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/common/http";
|
|
11
|
+
import * as i2 from "@angular/common";
|
|
12
|
+
import * as i3 from "@angular/material/button";
|
|
13
|
+
import * as i4 from "../file-input/file-input.component";
|
|
14
|
+
export class FileImageInputComponent extends NgxMatEntityBaseInputComponent {
|
|
15
|
+
http;
|
|
16
|
+
get multiPreviewImages() {
|
|
17
|
+
return ReflectUtilities.getMetadata(EntityUtilities.MULTI_PREVIEW_IMAGES_KEY, this.entity, this.key);
|
|
18
|
+
}
|
|
19
|
+
set multiPreviewImages(value) {
|
|
20
|
+
ReflectUtilities.defineMetadata(EntityUtilities.MULTI_PREVIEW_IMAGES_KEY, value, this.entity, this.key);
|
|
21
|
+
}
|
|
22
|
+
get singlePreviewImage() {
|
|
23
|
+
return ReflectUtilities.getMetadata(EntityUtilities.SINGLE_PREVIEW_IMAGE_KEY, this.entity, this.key);
|
|
24
|
+
}
|
|
25
|
+
set singlePreviewImage(value) {
|
|
26
|
+
ReflectUtilities.defineMetadata(EntityUtilities.SINGLE_PREVIEW_IMAGE_KEY, value, this.entity, this.key);
|
|
27
|
+
}
|
|
28
|
+
imageIndex = 0;
|
|
29
|
+
placeHolder = placeholder;
|
|
30
|
+
constructor(http) {
|
|
31
|
+
super();
|
|
32
|
+
this.http = http;
|
|
33
|
+
}
|
|
34
|
+
async setSinglePreviewImage() {
|
|
35
|
+
if (this.propertyValue) {
|
|
36
|
+
this.propertyValue = await FileUtilities.getFileData(this.propertyValue, this.http);
|
|
37
|
+
this.singlePreviewImage = await FileUtilities.getDataURLFromFile(this.propertyValue.file);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
this.singlePreviewImage = undefined;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async setMultiPreviewImages(index) {
|
|
44
|
+
const multiFileData = this.propertyValue;
|
|
45
|
+
const previewImages = [];
|
|
46
|
+
if (multiFileData?.length) {
|
|
47
|
+
for (let i = 0; i < multiFileData.length; i++) {
|
|
48
|
+
if (i === index) {
|
|
49
|
+
multiFileData[index] = await FileUtilities.getFileData(multiFileData[index], this.http);
|
|
50
|
+
previewImages.push(await FileUtilities.getDataURLFromFile(multiFileData[index].file));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
previewImages.push('empty');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
this.multiPreviewImages = previewImages;
|
|
58
|
+
}
|
|
59
|
+
async refreshFileData(fileData) {
|
|
60
|
+
this.propertyValue = fileData;
|
|
61
|
+
this.emitChange();
|
|
62
|
+
if (this.metadata.multiple) {
|
|
63
|
+
fileData = fileData;
|
|
64
|
+
if (!fileData?.[this.imageIndex]) {
|
|
65
|
+
this.imageIndex = 0;
|
|
66
|
+
}
|
|
67
|
+
await this.setMultiPreviewImages(this.imageIndex);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
await this.setSinglePreviewImage();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async prev() {
|
|
74
|
+
if (this.imageIndex <= 0) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
await this.setMultiPreviewImages(this.imageIndex - 1);
|
|
78
|
+
this.imageIndex--;
|
|
79
|
+
}
|
|
80
|
+
async next() {
|
|
81
|
+
if (!this.multiPreviewImages?.length) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (this.imageIndex === (this.multiPreviewImages.length - 1)) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
await this.setMultiPreviewImages(this.imageIndex + 1);
|
|
88
|
+
this.imageIndex++;
|
|
89
|
+
}
|
|
90
|
+
async setIndex(index) {
|
|
91
|
+
await this.setMultiPreviewImages(index);
|
|
92
|
+
this.imageIndex = index;
|
|
93
|
+
}
|
|
94
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: FileImageInputComponent, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
|
|
95
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: FileImageInputComponent, selector: "file-image-input", usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"!metadata.dragAndDrop && !metadata.preview\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n [entity]=\"entity\"\n [key]=\"key\"\n >\n </file-input>\n</div>\n\n<div *ngIf=\"metadata.dragAndDrop || metadata.preview\" class=\"file-input mat-elevation-z8\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n [entity]=\"entity\"\n [key]=\"key\"\n >\n </file-input>\n\n <div class=\"image-preview\" *ngIf=\"metadata.preview && metadata.multiple\">\n <i (click)=\"prev()\" [class.disabled]=\"imageIndex === 0\" class=\"prev-button fa-solid fa-angle-left\"></i>\n <img *ngIf=\"multiPreviewImages?.[imageIndex]\" class=\"mat-elevation-z2\" [src]=\"multiPreviewImages?.[imageIndex]\">\n <img *ngIf=\"!multiPreviewImages?.[imageIndex]\" class=\"mat-elevation-z2\" [src]=\"metadata.previewPlaceholderUrl ?? placeHolder\">\n <i (click)=\"next()\"\n [class.disabled]=\"!multiPreviewImages || !multiPreviewImages.length || imageIndex === (multiPreviewImages.length - 1)\"\n class=\"next-button fa-solid fa-angle-right\"\n >\n </i>\n </div>\n <div class=\"preview-nav\" *ngIf=\"metadata.preview && metadata.multiple\">\n <button type=\"button\" (click)=\"setIndex(imageIndex-4)\" mat-icon-button *ngIf=\"\n this.multiPreviewImages\n && multiPreviewImages[imageIndex-4]\n && imageIndex === (this.multiPreviewImages.length - 1)\"\n >\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 3}}</span>\n </button>\n <!-- eslint-disable-next-line @angular-eslint/template/conditional-complexity -->\n <button type=\"button\" (click)=\"setIndex(imageIndex-3)\" mat-icon-button *ngIf=\"this.multiPreviewImages\n && multiPreviewImages[imageIndex-3]\n && (\n imageIndex === (this.multiPreviewImages.length - 2)\n || imageIndex === (this.multiPreviewImages.length - 1)\n )\"\n >\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 2}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex-2)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex-2]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 1}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex-1)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex-1]\">\n <i class=\"dot\"></i>\n <span class=\"image-index\">{{imageIndex}}</span>\n </button>\n <button type=\"button\" mat-icon-button disabled>\n <i class=\"dot selected\"></i>\n <span class=\"image-index\">{{imageIndex + 1}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+1)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+1]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 2}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+2)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+2]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 3}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+3)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+3] && imageIndex <= 1\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 4}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+4)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+4] && imageIndex === 0\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 5}}</span>\n </button>\n </div>\n\n <div class=\"image-preview\" *ngIf=\"metadata.preview && !metadata.multiple\">\n <i class=\"prev-button disabled fa-solid fa-angle-left\"></i>\n <img class=\"mat-elevation-z2\" [src]=\"singlePreviewImage ?? metadata.previewPlaceholderUrl ?? placeHolder\">\n <i class=\"next-button disabled fa-solid fa-angle-right\"></i>\n </div>\n <div class=\"preview-nav\" *ngIf=\"metadata.preview && !metadata.multiple\">\n <button type=\"button\" disabled mat-icon-button>\n <span class=\"dot selected\"></span>\n <span class=\"image-index\">1</span>\n </button>\n </div>\n</div>", styles: [".file-input{margin-top:15px;margin-bottom:15px;padding:15px;border-radius:5px}.image-preview{height:250px;display:flex;align-items:center;padding-top:15px;padding-bottom:15px}.image-preview .prev-button{font-size:100px;margin-left:5px;color:#0000008a}.image-preview .next-button{font-size:100px;margin-right:5px;color:#0000008a}.image-preview .prev-button:hover,.image-preview .next-button:hover{cursor:pointer;color:#000000b3;transition:all .5s ease}.image-preview .prev-button.disabled,.image-preview .next-button.disabled{color:#00000042}.image-preview .prev-button.disabled:hover,.image-preview .next-button.disabled:hover{color:#00000042;transition:none;cursor:default}.image-preview img{max-width:calc(100% - 100px);max-height:100%;margin-left:auto;margin-right:auto;border-radius:3px}.preview-nav{text-align:center}.preview-nav button{display:inline-block;width:18px;height:18px;margin-left:5px;margin-right:5px}.preview-nav button .dot{height:100%;width:100%;background-color:#00000061;border-radius:50%;display:block}.preview-nav button .dot.selected{background-color:#0000008a}.preview-nav button .image-index{position:absolute;height:100%;width:100%;display:block;top:-11.5px;color:#fff}.preview-nav button:hover .dot{background-color:#0000008a;transition:all .3s ease}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.FileInputComponent, selector: "file-input", inputs: ["propertyValue", "entity", "key", "metadata", "getValidationErrorMessage", "isReadOnly"], outputs: ["fileDataChangeEvent"] }] });
|
|
96
|
+
}
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: FileImageInputComponent, decorators: [{
|
|
98
|
+
type: Component,
|
|
99
|
+
args: [{ selector: 'file-image-input', template: "<div *ngIf=\"!metadata.dragAndDrop && !metadata.preview\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n [entity]=\"entity\"\n [key]=\"key\"\n >\n </file-input>\n</div>\n\n<div *ngIf=\"metadata.dragAndDrop || metadata.preview\" class=\"file-input mat-elevation-z8\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n [entity]=\"entity\"\n [key]=\"key\"\n >\n </file-input>\n\n <div class=\"image-preview\" *ngIf=\"metadata.preview && metadata.multiple\">\n <i (click)=\"prev()\" [class.disabled]=\"imageIndex === 0\" class=\"prev-button fa-solid fa-angle-left\"></i>\n <img *ngIf=\"multiPreviewImages?.[imageIndex]\" class=\"mat-elevation-z2\" [src]=\"multiPreviewImages?.[imageIndex]\">\n <img *ngIf=\"!multiPreviewImages?.[imageIndex]\" class=\"mat-elevation-z2\" [src]=\"metadata.previewPlaceholderUrl ?? placeHolder\">\n <i (click)=\"next()\"\n [class.disabled]=\"!multiPreviewImages || !multiPreviewImages.length || imageIndex === (multiPreviewImages.length - 1)\"\n class=\"next-button fa-solid fa-angle-right\"\n >\n </i>\n </div>\n <div class=\"preview-nav\" *ngIf=\"metadata.preview && metadata.multiple\">\n <button type=\"button\" (click)=\"setIndex(imageIndex-4)\" mat-icon-button *ngIf=\"\n this.multiPreviewImages\n && multiPreviewImages[imageIndex-4]\n && imageIndex === (this.multiPreviewImages.length - 1)\"\n >\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 3}}</span>\n </button>\n <!-- eslint-disable-next-line @angular-eslint/template/conditional-complexity -->\n <button type=\"button\" (click)=\"setIndex(imageIndex-3)\" mat-icon-button *ngIf=\"this.multiPreviewImages\n && multiPreviewImages[imageIndex-3]\n && (\n imageIndex === (this.multiPreviewImages.length - 2)\n || imageIndex === (this.multiPreviewImages.length - 1)\n )\"\n >\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 2}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex-2)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex-2]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 1}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex-1)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex-1]\">\n <i class=\"dot\"></i>\n <span class=\"image-index\">{{imageIndex}}</span>\n </button>\n <button type=\"button\" mat-icon-button disabled>\n <i class=\"dot selected\"></i>\n <span class=\"image-index\">{{imageIndex + 1}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+1)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+1]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 2}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+2)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+2]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 3}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+3)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+3] && imageIndex <= 1\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 4}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+4)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+4] && imageIndex === 0\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 5}}</span>\n </button>\n </div>\n\n <div class=\"image-preview\" *ngIf=\"metadata.preview && !metadata.multiple\">\n <i class=\"prev-button disabled fa-solid fa-angle-left\"></i>\n <img class=\"mat-elevation-z2\" [src]=\"singlePreviewImage ?? metadata.previewPlaceholderUrl ?? placeHolder\">\n <i class=\"next-button disabled fa-solid fa-angle-right\"></i>\n </div>\n <div class=\"preview-nav\" *ngIf=\"metadata.preview && !metadata.multiple\">\n <button type=\"button\" disabled mat-icon-button>\n <span class=\"dot selected\"></span>\n <span class=\"image-index\">1</span>\n </button>\n </div>\n</div>", styles: [".file-input{margin-top:15px;margin-bottom:15px;padding:15px;border-radius:5px}.image-preview{height:250px;display:flex;align-items:center;padding-top:15px;padding-bottom:15px}.image-preview .prev-button{font-size:100px;margin-left:5px;color:#0000008a}.image-preview .next-button{font-size:100px;margin-right:5px;color:#0000008a}.image-preview .prev-button:hover,.image-preview .next-button:hover{cursor:pointer;color:#000000b3;transition:all .5s ease}.image-preview .prev-button.disabled,.image-preview .next-button.disabled{color:#00000042}.image-preview .prev-button.disabled:hover,.image-preview .next-button.disabled:hover{color:#00000042;transition:none;cursor:default}.image-preview img{max-width:calc(100% - 100px);max-height:100%;margin-left:auto;margin-right:auto;border-radius:3px}.preview-nav{text-align:center}.preview-nav button{display:inline-block;width:18px;height:18px;margin-left:5px;margin-right:5px}.preview-nav button .dot{height:100%;width:100%;background-color:#00000061;border-radius:50%;display:block}.preview-nav button .dot.selected{background-color:#0000008a}.preview-nav button .image-index{position:absolute;height:100%;width:100%;display:block;top:-11.5px;color:#fff}.preview-nav button:hover .dot{background-color:#0000008a;transition:all .3s ease}\n"] }]
|
|
100
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbWFnZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2ZpbGUvZmlsZS1pbWFnZS1pbnB1dC9maWxlLWltYWdlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NvbXBvbmVudHMvaW5wdXQvZmlsZS9maWxlLWltYWdlLWlucHV0L2ZpbGUtaW1hZ2UtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0NBQXdDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBSWxELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7QUFRNUUsTUFBTSxPQUFPLHVCQUNULFNBQVEsOEJBQTRGO0lBbUJ2RTtJQWpCN0IsSUFBSSxrQkFBa0I7UUFDbEIsT0FBTyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBeUIsQ0FBQztJQUNqSSxDQUFDO0lBQ0QsSUFBSSxrQkFBa0IsQ0FBQyxLQUEyQjtRQUM5QyxnQkFBZ0IsQ0FBQyxjQUFjLENB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SUFBSSxDQUFDLEVBQUU7WUFDdEIsT0FBTztTQUNWO1FBQ0QsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUU7WUFDbEMsT0FBTztTQUNWO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtZQUMxRCxPQUFPO1NBQ1Y7UUFDRCxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFhO1FBQ3hCLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7dUdBeEZRLHVCQUF1QjsyRkFBdkIsdUJBQXVCLCtFQ2xCcEMsNDVKQWdHTTs7MkZEOUVPLHVCQUF1QjtrQkFObkMsU0FBUzsrQkFFSSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBqc2RvYy9yZXF1aXJlLWpzZG9jICovXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhc2VFbnRpdHlUeXBlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY2xhc3Nlcy9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgRGVjb3JhdG9yVHlwZXMgfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2Jhc2UvZGVjb3JhdG9yLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgRmlsZURhdGEgfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2ZpbGUvZmlsZS1kZWNvcmF0b3IuZGF0YSc7XG5pbXBvcnQgeyBSZWZsZWN0VXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vZW5jYXBzdWxhdGlvbi9yZWZsZWN0LnV0aWxpdGllcyc7XG5pbXBvcnQgeyBwbGFjZWhvbGRlciB9IGZyb20gJy4uLy4uLy4uLy4uL21vY2tzL3BsYWNlaG9sZGVyLWRhdGEucG5nJztcbmltcG9ydCB7IEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzJztcbmltcG9ydCB7IEZpbGVVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsaXRpZXMvZmlsZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgTmd4TWF0RW50aXR5QmFzZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYmFzZS1pbnB1dC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnZmlsZS1pbWFnZS1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtaW1hZ2UtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2ZpbGUtaW1hZ2UtaW5wdXQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlSW1hZ2VJbnB1dENvbXBvbmVudDxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+XG4gICAgZXh0ZW5kcyBOZ3hNYXRFbnRpdHlCYXNlSW5wdXRDb21wb25lbnQ8RW50aXR5VHlwZSwgRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRSwgRmlsZURhdGEgfCBGaWxlRGF0YVtdPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBnZXQgbXVsdGlQcmV2aWV3SW1hZ2VzKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3RVdGlsaXRpZXMuZ2V0TWV0YWRhdGEoRW50aXR5VXRpbGl0aWVzLk1VTFRJX1BSRVZJRVdfSU1BR0VTX0tFWSwgdGhpcy5lbnRpdHksIHRoaXMua2V5KSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc2V0IG11bHRpUHJldmlld0ltYWdlcyh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5kZWZpbmVNZXRhZGF0YShFbnRpdHlVdGlsaXRpZXMuTVVMVElfUFJFVklFV19JTUFHRVNfS0VZLCB2YWx1ZSwgdGhpcy5lbnRpdHksIHRoaXMua2V5KTtcbiAgICB9XG5cbiAgICBnZXQgc2luZ2xlUHJldmlld0ltYWdlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0VXRpbGl0aWVzLmdldE1ldGFkYXRhKEVudGl0eVV0aWxpdGllcy5TSU5HTEVfUFJFVklFV19JTUFHRV9LRVksIHRoaXMuZW50aXR5LCB0aGlzLmtleSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBzZXQgc2luZ2xlUHJldmlld0ltYWdlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5kZWZpbmVNZXRhZGF0YShFbnRpdHlVdGlsaXRpZXMuU0lOR0xFX1BSRVZJRVdfSU1BR0VfS0VZLCB2YWx1ZSwgdGhpcy5lbnRpdHksIHRoaXMua2V5KTtcbiAgICB9XG5cbiAgICBpbWFnZUluZGV4OiBudW1iZXIgPSAwO1xuICAgIHBsYWNlSG9sZGVyOiBzdHJpbmcgPSBwbGFjZWhvbGRlcjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0U2luZ2xlUHJldmlld0ltYWdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5wcm9wZXJ0eVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWUgPSBhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YSwgdGhpcy5odHRwKTtcbiAgICAgICAgICAgIHRoaXMuc2luZ2xlUHJldmlld0ltYWdlID0gYXdhaXQgRmlsZVV0aWxpdGllcy5nZXREYXRhVVJMRnJvbUZpbGUodGhpcy5wcm9wZXJ0eVZhbHVlLmZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaW5nbGVQcmV2aWV3SW1hZ2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNldE11bHRpUHJldmlld0ltYWdlcyhpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG11bHRpRmlsZURhdGE6IEZpbGVEYXRhW10gfCB1bmRlZmluZWQgPSB0aGlzLnByb3BlcnR5VmFsdWUgYXMgRmlsZURhdGFbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcHJldmlld0ltYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKG11bHRpRmlsZURhdGE/Lmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG11bHRpRmlsZURhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlGaWxlRGF0YVtpbmRleF0gPSBhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKG11bHRpRmlsZURhdGFbaW5kZXhdLCB0aGlzLmh0dHApO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aWV3SW1hZ2VzLnB1c2goYXdhaXQgRmlsZVV0aWxpdGllcy5nZXREYXRhVVJMRnJvbUZpbGUobXVsdGlGaWxlRGF0YVtpbmRleF0uZmlsZSkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZpZXdJbWFnZXMucHVzaCgnZW1wdHknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tdWx0aVByZXZpZXdJbWFnZXMgPSBwcmV2aWV3SW1hZ2VzO1xuICAgIH1cblxuICAgIGFzeW5jIHJlZnJlc2hGaWxlRGF0YShmaWxlRGF0YT86IEZpbGVEYXRhIHwgRmlsZURhdGFbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWUgPSBmaWxlRGF0YTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBmaWxlRGF0YSA9IChmaWxlRGF0YSBhcyBGaWxlRGF0YVtdIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICghZmlsZURhdGE/Llt0aGlzLmltYWdlSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWFnZUluZGV4ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TXVsdGlQcmV2aWV3SW1hZ2VzKHRoaXMuaW1hZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldFNpbmdsZVByZXZpZXdJbWFnZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcHJldigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VJbmRleCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zZXRNdWx0aVByZXZpZXdJbWFnZXModGhpcy5pbWFnZUluZGV4IC0gMSk7XG4gICAgICAgIHRoaXMuaW1hZ2VJbmRleC0tO1xuICAgIH1cblxuICAgIGFzeW5jIG5leHQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aVByZXZpZXdJbWFnZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmltYWdlSW5kZXggPT09ICh0aGlzLm11bHRpUHJldmlld0ltYWdlcy5sZW5ndGggLSAxKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0TXVsdGlQcmV2aWV3SW1hZ2VzKHRoaXMuaW1hZ2VJbmRleCArIDEpO1xuICAgICAgICB0aGlzLmltYWdlSW5kZXgrKztcbiAgICB9XG5cbiAgICBhc3luYyBzZXRJbmRleChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0TXVsdGlQcmV2aWV3SW1hZ2VzKGluZGV4KTtcbiAgICAgICAgdGhpcy5pbWFnZUluZGV4ID0gaW5kZXg7XG4gICAgfVxufSIsIjxkaXYgKm5nSWY9XCIhbWV0YWRhdGEuZHJhZ0FuZERyb3AgJiYgIW1ldGFkYXRhLnByZXZpZXdcIj5cbiAgICA8ZmlsZS1pbnB1dFxuICAgICAgICAoZmlsZURhdGFDaGFuZ2VFdmVudCk9XCJyZWZyZXNoRmlsZURhdGEoJGV2ZW50KVwiXG4gICAgICAgIFtwcm9wZXJ0eVZhbHVlXT1cInByb3BlcnR5VmFsdWVcIlxuICAgICAgICBbbWV0YWRhdGFdPVwibWV0YWRhdGFcIlxuICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgW2lzUmVhZE9ubHldPVwiaXNSZWFkT25seVwiXG4gICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgW2tleV09XCJrZXlcIlxuICAgID5cbiAgICA8L2ZpbGUtaW5wdXQ+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cIm1ldGFkYXRhLmRyYWdBbmREcm9wIHx8IG1ldGFkYXRhLnByZXZpZXdcIiBjbGFzcz1cImZpbGUtaW5wdXQgbWF0LWVsZXZhdGlvbi16OFwiPlxuICAgIDxmaWxlLWlucHV0XG4gICAgICAgIChmaWxlRGF0YUNoYW5nZUV2ZW50KT1cInJlZnJlc2hGaWxlRGF0YSgkZXZlbnQpXCJcbiAgICAgICAgW3Byb3BlcnR5VmFsdWVdPVwicHJvcGVydHlWYWx1ZVwiXG4gICAgICAgIFttZXRhZGF0YV09XCJtZXRhZGF0YVwiXG4gICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICBbaXNSZWFkT25seV09XCJpc1JlYWRPbmx5XCJcbiAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICBba2V5XT1cImtleVwiXG4gICAgPlxuICAgIDwvZmlsZS1pbnB1dD5cblxuICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1wcmV2aWV3XCIgKm5nSWY9XCJtZXRhZGF0YS5wcmV2aWV3ICYmIG1ldGFkYXRhLm11bHRpcGxlXCI+XG4gICAgICAgIDxpIChjbGljayk9XCJwcmV2KClcIiBbY2xhc3MuZGlzYWJsZWRdPVwiaW1hZ2VJbmRleCA9PT0gMFwiIGNsYXNzPVwicHJldi1idXR0b24gZmEtc29saWQgZmEtYW5nbGUtbGVmdFwiPjwvaT5cbiAgICAgICAgPGltZyAqbmdJZj1cIm11bHRpUHJldmlld0ltYWdlcz8uW2ltYWdlSW5kZXhdXCIgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXoyXCIgW3NyY109XCJtdWx0aVByZXZpZXdJbWFnZXM/LltpbWFnZUluZGV4XVwiPlxuICAgICAgICA8aW1nICpuZ0lmPVwiIW11bHRpUHJldmlld0ltYWdlcz8uW2ltYWdlSW5kZXhdXCIgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXoyXCIgW3NyY109XCJtZXRhZGF0YS5wcmV2aWV3UGxhY2Vob2xkZXJVcmwgPz8gcGxhY2VIb2xkZXJcIj5cbiAgICAgICAgPGkgKGNsaWNrKT1cIm5leHQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIW11bHRpUHJldmlld0ltYWdlcyB8fCAhbXVsdGlQcmV2aWV3SW1hZ2VzLmxlbmd0aCB8fCBpbWFnZUluZGV4ID09PSAobXVsdGlQcmV2aWV3SW1hZ2VzLmxlbmd0aCAtIDEpXCJcbiAgICAgICAgICAgIGNsYXNzPVwibmV4dC1idXR0b24gZmEtc29saWQgZmEtYW5nbGUtcmlnaHRcIlxuICAgICAgICA+XG4gICAgICAgIDwvaT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1uYXZcIiAqbmdJZj1cIm1ldGFkYXRhLnByZXZpZXcgJiYgbWV0YWRhdGEubXVsdGlwbGVcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNldEluZGV4KGltYWdlSW5kZXgtNClcIiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJcbiAgICAgICAgICAgIHRoaXMubXVsdGlQcmV2aWV3SW1hZ2VzXG4gICAgICAgICAgICAmJiBtdWx0aVByZXZpZXdJbWFnZXNbaW1hZ2VJbmRleC00XVxuICAgICAgICAgICAgJiYgaW1hZ2VJbmRleCA9PT0gKHRoaXMubXVsdGlQcmV2aWV3SW1hZ2VzLmxlbmd0aCAtIDEpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3RcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImltYWdlLWluZGV4XCI+e3tpbWFnZUluZGV4IC0gM319PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPCEtLSBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL2NvbmRpdGlvbmFsLWNvbXBsZXhpdHkgLS0+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZXRJbmRleChpbWFnZUluZGV4LTMpXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwidGhpcy5tdWx0aVByZXZpZXdJbWFnZXNcbiAgICAgICAgICAgICYmIG11bHRpUHJldmlld0ltYWdlc1tpbWFnZUluZGV4LTNdXG4gICAgICAgICAgICAmJiAoXG4gICAgICAgICAgICAgICAgaW1hZ2VJbmRleCA9PT0gKHRoaXMubXVsdGlQcmV2aWV3SW1hZ2VzLmxlbmd0aCAtIDIpXG4gICAgICAgICAgICAgICAgfHwgaW1hZ2VJbmRleCA9PT0gKHRoaXMubXVsdGlQcmV2aWV3SW1hZ2VzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICApXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3RcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImltYWdlLWluZGV4XCI+e3tpbWFnZUluZGV4IC0gMn19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNldEluZGV4KGltYWdlSW5kZXgtMilcIiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJtdWx0aVByZXZpZXdJbWFnZXM/LltpbWFnZUluZGV4LTJdXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW1hZ2UtaW5kZXhcIj57e2ltYWdlSW5kZXggLSAxfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2V0SW5kZXgoaW1hZ2VJbmRleC0xKVwiIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cIm11bHRpUHJldmlld0ltYWdlcz8uW2ltYWdlSW5kZXgtMV1cIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZG90XCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbWFnZS1pbmRleFwiPnt7aW1hZ2VJbmRleH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGRpc2FibGVkPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJkb3Qgc2VsZWN0ZWRcIj48L2k+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImltYWdlLWluZGV4XCI+e3tpbWFnZUluZGV4ICsgMX19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNldEluZGV4KGltYWdlSW5kZXgrMSlcIiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJtdWx0aVByZXZpZXdJbWFnZXM/LltpbWFnZUluZGV4KzFdXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW1hZ2UtaW5kZXhcIj57e2ltYWdlSW5kZXggKyAyfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2V0SW5kZXgoaW1hZ2VJbmRleCsyKVwiIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cIm11bHRpUHJldmlld0ltYWdlcz8uW2ltYWdlSW5kZXgrMl1cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbWFnZS1pbmRleFwiPnt7aW1hZ2VJbmRleCArIDN9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZXRJbmRleChpbWFnZUluZGV4KzMpXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwibXVsdGlQcmV2aWV3SW1hZ2VzPy5baW1hZ2VJbmRleCszXSAmJiBpbWFnZUluZGV4IDw9IDFcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbWFnZS1pbmRleFwiPnt7aW1hZ2VJbmRleCArIDR9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZXRJbmRleChpbWFnZUluZGV4KzQpXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwibXVsdGlQcmV2aWV3SW1hZ2VzPy5baW1hZ2VJbmRleCs0XSAmJiBpbWFnZUluZGV4ID09PSAwXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW1hZ2UtaW5kZXhcIj57e2ltYWdlSW5kZXggKyA1fX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImltYWdlLXByZXZpZXdcIiAqbmdJZj1cIm1ldGFkYXRhLnByZXZpZXcgJiYgIW1ldGFkYXRhLm11bHRpcGxlXCI+XG4gICAgICAgIDxpIGNsYXNzPVwicHJldi1idXR0b24gZGlzYWJsZWQgZmEtc29saWQgZmEtYW5nbGUtbGVmdFwiPjwvaT5cbiAgICAgICAgPGltZyBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejJcIiBbc3JjXT1cInNpbmdsZVByZXZpZXdJbWFnZSA/PyBtZXRhZGF0YS5wcmV2aWV3UGxhY2Vob2xkZXJVcmwgPz8gcGxhY2VIb2xkZXJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJuZXh0LWJ1dHRvbiBkaXNhYmxlZCBmYS1zb2xpZCBmYS1hbmdsZS1yaWdodFwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1uYXZcIiAqbmdJZj1cIm1ldGFkYXRhLnByZXZpZXcgJiYgIW1ldGFkYXRhLm11bHRpcGxlXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRpc2FibGVkIG1hdC1pY29uLWJ1dHRvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG90IHNlbGVjdGVkXCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbWFnZS1pbmRleFwiPjE8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
|
|
@@ -0,0 +1,62 @@
|
|
|
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
|
+
/**
|
|
8
|
+
* Emits the dropped files to the parent.
|
|
9
|
+
*/
|
|
10
|
+
files = new EventEmitter();
|
|
11
|
+
constructor() { }
|
|
12
|
+
/**
|
|
13
|
+
* Prevents the event default.
|
|
14
|
+
*
|
|
15
|
+
* @param evt - The Event when dragged files hover over the parent.
|
|
16
|
+
*/
|
|
17
|
+
onDragOver(evt) {
|
|
18
|
+
evt.preventDefault();
|
|
19
|
+
evt.stopPropagation();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Prevents the event default.
|
|
23
|
+
*
|
|
24
|
+
* @param evt - The Event when dragged files leave the parent.
|
|
25
|
+
*/
|
|
26
|
+
onDragLeave(evt) {
|
|
27
|
+
evt.preventDefault();
|
|
28
|
+
evt.stopPropagation();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Prevents the event default and emits the dropped files with the output.
|
|
32
|
+
*
|
|
33
|
+
* @param evt - The Event when files are dropped.
|
|
34
|
+
*/
|
|
35
|
+
onDrop(evt) {
|
|
36
|
+
evt.preventDefault();
|
|
37
|
+
evt.stopPropagation();
|
|
38
|
+
if (evt.dataTransfer && evt.dataTransfer.files.length > 0) {
|
|
39
|
+
this.files.emit(Array.from(evt.dataTransfer.files));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: DragDropDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
43
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.0", type: DragDropDirective, selector: "[dragDrop]", outputs: { files: "files" }, host: { listeners: { "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" } }, ngImport: i0 });
|
|
44
|
+
}
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: DragDropDirective, decorators: [{
|
|
46
|
+
type: Directive,
|
|
47
|
+
args: [{
|
|
48
|
+
selector: '[dragDrop]'
|
|
49
|
+
}]
|
|
50
|
+
}], ctorParameters: function () { return []; }, propDecorators: { files: [{
|
|
51
|
+
type: Output
|
|
52
|
+
}], onDragOver: [{
|
|
53
|
+
type: HostListener,
|
|
54
|
+
args: ['dragover', ['$event']]
|
|
55
|
+
}], onDragLeave: [{
|
|
56
|
+
type: HostListener,
|
|
57
|
+
args: ['dragleave', ['$event']]
|
|
58
|
+
}], onDrop: [{
|
|
59
|
+
type: HostListener,
|
|
60
|
+
args: ['drop', ['$event']]
|
|
61
|
+
}] } });
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ0Ryb3AuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9pbnB1dC9maWxlL2ZpbGUtaW5wdXQvZHJhZ0Ryb3AuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTlFOztHQUVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQUMxQjs7T0FFRztJQUVILEtBQUssR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUV6RCxnQkFBZ0IsQ0FBQztJQUVqQjs7OztPQUlHO0lBRUgsVUFBVSxDQUFDLEdBQWM7UUFDckIsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUVILFdBQVcsQ0FBQyxHQUFjO1FBQ3RCLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyQixHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7SUFFSCxNQUFNLENBQUMsR0FBYztRQUNqQixHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckIsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3RCLElBQUksR0FBRyxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0wsQ0FBQzt1R0EzQ1EsaUJBQWlCOzJGQUFqQixpQkFBaUI7OzJGQUFqQixpQkFBaUI7a0JBSDdCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLFlBQVk7aUJBQ3pCOzBFQU1HLEtBQUs7c0JBREosTUFBTTtnQkFXUCxVQUFVO3NCQURULFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVlwQyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVlyQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogQWRkcyBkcmFnIGFuZCBkcm9wIGZ1bmN0aW9uYWxpdHkgdG8gYW4gZWxlbWVudC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbZHJhZ0Ryb3BdJ1xufSlcbmV4cG9ydCBjbGFzcyBEcmFnRHJvcERpcmVjdGl2ZSB7XG4gICAgLyoqXG4gICAgICogRW1pdHMgdGhlIGRyb3BwZWQgZmlsZXMgdG8gdGhlIHBhcmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBmaWxlczogRXZlbnRFbWl0dGVyPEZpbGVbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVbXT4oKTtcblxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50cyB0aGUgZXZlbnQgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldnQgLSBUaGUgRXZlbnQgd2hlbiBkcmFnZ2VkIGZpbGVzIGhvdmVyIG92ZXIgdGhlIHBhcmVudC5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdkcmFnb3ZlcicsIFsnJGV2ZW50J10pXG4gICAgb25EcmFnT3ZlcihldnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXZlbnRzIHRoZSBldmVudCBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGV2dCAtIFRoZSBFdmVudCB3aGVuIGRyYWdnZWQgZmlsZXMgbGVhdmUgdGhlIHBhcmVudC5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdkcmFnbGVhdmUnLCBbJyRldmVudCddKVxuICAgIG9uRHJhZ0xlYXZlKGV2dDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJldmVudHMgdGhlIGV2ZW50IGRlZmF1bHQgYW5kIGVtaXRzIHRoZSBkcm9wcGVkIGZpbGVzIHdpdGggdGhlIG91dHB1dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldnQgLSBUaGUgRXZlbnQgd2hlbiBmaWxlcyBhcmUgZHJvcHBlZC5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdkcm9wJywgWyckZXZlbnQnXSlcbiAgICBvbkRyb3AoZXZ0OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKGV2dC5kYXRhVHJhbnNmZXIgJiYgZXZ0LmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVzLmVtaXQoQXJyYXkuZnJvbShldnQuZGF0YVRyYW5zZmVyLmZpbGVzKSk7XG4gICAgICAgIH1cbiAgICB9XG59Il19
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
4
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
5
|
+
import { LodashUtilities } from '../../../../encapsulation/lodash.utilities';
|
|
6
|
+
import { ReflectUtilities } from '../../../../encapsulation/reflect.utilities';
|
|
7
|
+
import { EntityUtilities } from '../../../../utilities/entity.utilities';
|
|
8
|
+
import { FileUtilities } from '../../../../utilities/file.utilities';
|
|
9
|
+
import { NgxMatEntityConfirmDialogComponent } from '../../../confirm-dialog/confirm-dialog.component';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/material/dialog";
|
|
12
|
+
import * as i2 from "@angular/common/http";
|
|
13
|
+
import * as i3 from "@angular/common";
|
|
14
|
+
import * as i4 from "@angular/material/form-field";
|
|
15
|
+
import * as i5 from "@angular/forms";
|
|
16
|
+
import * as i6 from "@angular/material/chips";
|
|
17
|
+
import * as i7 from "@angular/material/button";
|
|
18
|
+
import * as i8 from "./dragDrop.directive";
|
|
19
|
+
export class FileInputComponent {
|
|
20
|
+
dialog;
|
|
21
|
+
http;
|
|
22
|
+
get filenames() {
|
|
23
|
+
return ReflectUtilities.getMetadata(EntityUtilities.FILENAMES_KEY, this.entity, this.key);
|
|
24
|
+
}
|
|
25
|
+
set filenames(value) {
|
|
26
|
+
ReflectUtilities.defineMetadata(EntityUtilities.FILENAMES_KEY, value, this.entity, this.key);
|
|
27
|
+
}
|
|
28
|
+
FileUtilities = FileUtilities;
|
|
29
|
+
propertyValue;
|
|
30
|
+
entity;
|
|
31
|
+
key;
|
|
32
|
+
metadata;
|
|
33
|
+
getValidationErrorMessage;
|
|
34
|
+
isReadOnly;
|
|
35
|
+
fileDataChangeEvent = new EventEmitter();
|
|
36
|
+
constructor(dialog, http) {
|
|
37
|
+
this.dialog = dialog;
|
|
38
|
+
this.http = http;
|
|
39
|
+
}
|
|
40
|
+
async ngOnInit() {
|
|
41
|
+
if (this.metadata.multiple) {
|
|
42
|
+
this.initMultiFile();
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
this.initSingleFile();
|
|
46
|
+
}
|
|
47
|
+
this.fileDataChangeEvent.emit(this.propertyValue);
|
|
48
|
+
}
|
|
49
|
+
initMultiFile() {
|
|
50
|
+
if (this.propertyValue) {
|
|
51
|
+
this.filenames = this.propertyValue.map(f => f.name);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
initSingleFile() {
|
|
55
|
+
if (this.propertyValue) {
|
|
56
|
+
this.filenames = [this.propertyValue.name];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async setFileFromInput(event) {
|
|
60
|
+
const files = event.target.files ?? [];
|
|
61
|
+
await this.setFile(Array.from(files));
|
|
62
|
+
}
|
|
63
|
+
async setFile(files) {
|
|
64
|
+
// validation done inline
|
|
65
|
+
if (files.find(f => !FileUtilities.isMimeTypeValid(f.type, this.metadata.allowedMimeTypes))) {
|
|
66
|
+
this.dialog.open(NgxMatEntityConfirmDialogComponent, {
|
|
67
|
+
data: this.metadata.mimeTypeErrorDialog,
|
|
68
|
+
autoFocus: false,
|
|
69
|
+
restoreFocus: false
|
|
70
|
+
});
|
|
71
|
+
this.resetFileInputs();
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (files.find(f => FileUtilities.transformToMegaBytes(f.size, 'B') > this.metadata.maxSize)) {
|
|
75
|
+
this.dialog.open(NgxMatEntityConfirmDialogComponent, {
|
|
76
|
+
data: this.metadata.maxSizeErrorDialog,
|
|
77
|
+
autoFocus: false,
|
|
78
|
+
restoreFocus: false
|
|
79
|
+
});
|
|
80
|
+
this.resetFileInputs();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
let fileSizeTotal = 0;
|
|
84
|
+
for (const file of files) {
|
|
85
|
+
fileSizeTotal += file.size;
|
|
86
|
+
}
|
|
87
|
+
if (FileUtilities.transformToMegaBytes(fileSizeTotal, 'B') > this.metadata.maxSizeTotal) {
|
|
88
|
+
this.dialog.open(NgxMatEntityConfirmDialogComponent, {
|
|
89
|
+
data: this.metadata.maxSizeTotalErrorDialog,
|
|
90
|
+
autoFocus: false,
|
|
91
|
+
restoreFocus: false
|
|
92
|
+
});
|
|
93
|
+
this.resetFileInputs();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (this.metadata.multiple) {
|
|
97
|
+
await this.setMultiFile(Array.from(files));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
await this.setSingleFile(files[0]);
|
|
101
|
+
}
|
|
102
|
+
this.fileDataChangeEvent.emit(this.propertyValue);
|
|
103
|
+
}
|
|
104
|
+
resetFileInputs() {
|
|
105
|
+
this.filenames = undefined;
|
|
106
|
+
this.propertyValue = undefined;
|
|
107
|
+
this.fileDataChangeEvent.emit(this.propertyValue);
|
|
108
|
+
}
|
|
109
|
+
async setMultiFile(files) {
|
|
110
|
+
const data = [];
|
|
111
|
+
for (const file of files) {
|
|
112
|
+
const fileData = {
|
|
113
|
+
file: file,
|
|
114
|
+
name: file.name,
|
|
115
|
+
type: file.type,
|
|
116
|
+
size: file.size
|
|
117
|
+
};
|
|
118
|
+
data.push(fileData);
|
|
119
|
+
}
|
|
120
|
+
this.propertyValue = LodashUtilities.cloneDeep(data);
|
|
121
|
+
this.filenames = this.propertyValue.map(f => f.name);
|
|
122
|
+
}
|
|
123
|
+
async setSingleFile(file) {
|
|
124
|
+
this.propertyValue = {
|
|
125
|
+
file: file,
|
|
126
|
+
name: file.name,
|
|
127
|
+
type: file.type,
|
|
128
|
+
size: file.size
|
|
129
|
+
};
|
|
130
|
+
this.filenames = [this.propertyValue.name];
|
|
131
|
+
}
|
|
132
|
+
removeFile(name) {
|
|
133
|
+
if (this.isReadOnly) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (this.metadata.multiple) {
|
|
137
|
+
this.filenames?.splice(this.filenames.indexOf(name), 1);
|
|
138
|
+
if (!this.filenames?.length) {
|
|
139
|
+
this.filenames = undefined;
|
|
140
|
+
}
|
|
141
|
+
const fileDataToRemove = this.propertyValue.find(f => f.name === name);
|
|
142
|
+
this.propertyValue.splice(this.propertyValue.indexOf(fileDataToRemove), 1);
|
|
143
|
+
if (!this.propertyValue.length) {
|
|
144
|
+
this.propertyValue = undefined;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
this.filenames = undefined;
|
|
149
|
+
this.propertyValue = undefined;
|
|
150
|
+
}
|
|
151
|
+
this.fileDataChangeEvent.emit(this.propertyValue);
|
|
152
|
+
}
|
|
153
|
+
async downloadFile(name) {
|
|
154
|
+
if (this.metadata.multiple && this.propertyValue.length) {
|
|
155
|
+
const foundFileData = this.propertyValue.find(f => f.name === name);
|
|
156
|
+
// the index need to be saved in a constant because we edit foundFileData
|
|
157
|
+
// => .indexOf() returns undefined.
|
|
158
|
+
const index = this.propertyValue.indexOf(foundFileData);
|
|
159
|
+
this.propertyValue[index] = await FileUtilities.getFileData(foundFileData, this.http);
|
|
160
|
+
FileUtilities.downloadSingleFile(this.propertyValue[index]);
|
|
161
|
+
}
|
|
162
|
+
else if (this.propertyValue) {
|
|
163
|
+
this.propertyValue = await FileUtilities.getFileData(this.propertyValue, this.http);
|
|
164
|
+
FileUtilities.downloadSingleFile(this.propertyValue);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
downloadAllEnabled() {
|
|
168
|
+
if (!this.metadata.multiple) {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
if (!this.propertyValue) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
if (this.propertyValue.length < 2) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
async downloadAll() {
|
|
180
|
+
if (this.propertyValue.length) {
|
|
181
|
+
// eslint-disable-next-line max-len
|
|
182
|
+
void FileUtilities.downloadMultipleFiles(this.metadata.displayName, LodashUtilities.cloneDeep(this.propertyValue), this.http);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: FileInputComponent, deps: [{ token: i1.MatDialog }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
|
|
186
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: FileInputComponent, selector: "file-input", inputs: { propertyValue: "propertyValue", entity: "entity", key: "key", metadata: "metadata", getValidationErrorMessage: "getValidationErrorMessage", isReadOnly: "isReadOnly" }, 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\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-grid #chipGrid\n [(ngModel)]=\"filenames\" name=\"file\" #model=\"ngModel\"\n [required]=\"metadata.required(entity)\"\n >\n <mat-chip-row *ngFor=\"let name of filenames\" (removed)=\"removeFile(name)\">\n {{name}}\n <span class=\"mat-mdc-chip-remove mat-mdc-chip-trailing-icon ngx-mat-grey\" (click)=\"downloadFile(name)\">\n <i class=\"fas fa-download\"></i>\n </span>\n <button *ngIf=\"!isReadOnly\" type=\"button\" matChipRemove>\n <i class=\"{{metadata.deleteIcon}}\"></i>\n </button>\n </mat-chip-row>\n <input [matChipInputFor]=\"chipGrid\" [readonly]=\"true\" hidden>\n </mat-chip-grid>\n <button *ngIf=\"downloadAllEnabled()\" type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix (click)=\"downloadAll()\">\n <i class=\"fas fa-file-zipper\"></i>\n </button>\n <button type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\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 && !isReadOnly\" class=\"drag-drop\" dragDrop (files)=\"setFile($event)\">\n <button type=\"button\" mat-icon-button [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-file-arrow-up ngx-mat-grey\"></i>\n </button>\n</div>", styles: ["mat-form-field{width:100%}.ngx-mat-grey{opacity:1;color:#0000008a}.drag-drop{display:flex;align-items:center;justify-content:center;height:200px;border:2px dashed rgba(0,0,0,.54);border-radius:15px;margin-top:5px;margin-bottom:5px}.drag-drop i{font-size:30px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatChipGrid, selector: "mat-chip-grid", inputs: ["tabIndex", "disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i6.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i6.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i6.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "editable"], outputs: ["edited"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i8.DragDropDirective, selector: "[dragDrop]", outputs: ["files"] }] });
|
|
187
|
+
}
|
|
188
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: FileInputComponent, decorators: [{
|
|
189
|
+
type: Component,
|
|
190
|
+
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\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-grid #chipGrid\n [(ngModel)]=\"filenames\" name=\"file\" #model=\"ngModel\"\n [required]=\"metadata.required(entity)\"\n >\n <mat-chip-row *ngFor=\"let name of filenames\" (removed)=\"removeFile(name)\">\n {{name}}\n <span class=\"mat-mdc-chip-remove mat-mdc-chip-trailing-icon ngx-mat-grey\" (click)=\"downloadFile(name)\">\n <i class=\"fas fa-download\"></i>\n </span>\n <button *ngIf=\"!isReadOnly\" type=\"button\" matChipRemove>\n <i class=\"{{metadata.deleteIcon}}\"></i>\n </button>\n </mat-chip-row>\n <input [matChipInputFor]=\"chipGrid\" [readonly]=\"true\" hidden>\n </mat-chip-grid>\n <button *ngIf=\"downloadAllEnabled()\" type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix (click)=\"downloadAll()\">\n <i class=\"fas fa-file-zipper\"></i>\n </button>\n <button type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\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 && !isReadOnly\" class=\"drag-drop\" dragDrop (files)=\"setFile($event)\">\n <button type=\"button\" mat-icon-button [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-file-arrow-up ngx-mat-grey\"></i>\n </button>\n</div>", styles: ["mat-form-field{width:100%}.ngx-mat-grey{opacity:1;color:#0000008a}.drag-drop{display:flex;align-items:center;justify-content:center;height:200px;border:2px dashed rgba(0,0,0,.54);border-radius:15px;margin-top:5px;margin-bottom:5px}.drag-drop i{font-size:30px}\n"] }]
|
|
191
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.HttpClient }]; }, propDecorators: { propertyValue: [{
|
|
192
|
+
type: Input
|
|
193
|
+
}], entity: [{
|
|
194
|
+
type: Input
|
|
195
|
+
}], key: [{
|
|
196
|
+
type: Input
|
|
197
|
+
}], metadata: [{
|
|
198
|
+
type: Input
|
|
199
|
+
}], getValidationErrorMessage: [{
|
|
200
|
+
type: Input
|
|
201
|
+
}], isReadOnly: [{
|
|
202
|
+
type: Input
|
|
203
|
+
}], fileDataChangeEvent: [{
|
|
204
|
+
type: Output
|
|
205
|
+
}] } });
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2ZpbGUvZmlsZS1pbnB1dC9maWxlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NvbXBvbmVudHMvaW5wdXQvZmlsZS9maWxlLWlucHV0L2ZpbGUtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0NBQXdDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUlyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7Ozs7Ozs7OztBQVF0RyxNQUFNLE9BQU8sa0JBQWtCO0lBZ0NFO0lBQW9DO0lBOUJqRSxJQUFJLFNBQVM7UUFDVCxPQUFPLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBeUIsQ0FBQztJQUN0SCxDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsS0FBMkI7UUFDckMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRCxhQUFhLEdBQXlCLGFBQWEsQ0FBQztJQUdwRCxhQUFhLENBQXFDO0lBR2xELE1BQU0sQ0FBYztJQUdwQixHQUFHLENBQW9CO0lBR3ZCLFFBQVEsQ0FBeUU7SUFHakYseUJBQXlCLENBQThCO0lBR3ZELFVBQVUsQ0FBVztJQUdyQixtQkFBbUIsR0FBd0MsSUFBSSxZQUFZLEVBQXlCLENBQUM7SUFFckcsWUFBNkIsTUFBaUIsRUFBbUIsSUFBZ0I7UUFBcEQsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUFtQixTQUFJLEdBQUosSUFBSSxDQUFZO0lBQUksQ0FBQztJQUV0RixLQUFLLENBQUMsUUFBUTtRQUNWLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3hCO2FBQ0k7WUFDRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sYUFBYTtRQUNqQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBSSxJQUFJLENBQUMsYUFBNEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEU7SUFDTCxDQUFDO0lBRU8sY0FBYztRQUNsQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFFLElBQUksQ0FBQyxhQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVEO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFZO1FBQy9CLE1BQU0sS0FBSyxHQUFtQixLQUFLLENBQUMsTUFBMkIsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzVFLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBYTtRQUN2Qix5QkFBeUI7UUFDekIsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUU7WUFDekYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUU7Z0JBQ2pELElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQjtnQkFDdkMsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLFlBQVksRUFBRSxLQUFLO2FBQ3RCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxFQUFFO2dCQUNqRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0I7Z0JBQ3RDLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixZQUFZLEVBQUUsS0FBSzthQUN0QixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkIsT0FBTztTQUNWO1FBQ0QsSUFBSSxhQUFhLEdBQVcsQ0FBQyxDQUFDO1FBQzlCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1lBQ3RCLGFBQWEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxhQUFhLENBQUMsb0JBQW9CLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFO1lBQ3JGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxFQUFFO2dCQUNqRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUI7Z0JBQzNDLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixZQUFZLEVBQUUsS0FBSzthQUN0QixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkIsT0FBTztTQUNWO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTtZQUN4QixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQzlDO2FBQ0k7WUFDRCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUMvQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFhO1FBQ3BDLE1BQU0sSUFBSSxHQUFlLEVBQUUsQ0FBQztRQUM1QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN0QixNQUFNLFFBQVEsR0FBYTtnQkFDdkIsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7YUFDbEIsQ0FBQztZQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdkI7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFVO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUc7WUFDakIsSUFBSSxFQUFFLElBQUk7WUFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDbEIsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBWTtRQUNuQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsT0FBTztTQUNWO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTtZQUN4QixJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2FBQzlCO1lBQ0QsTUFBTSxnQkFBZ0IsR0FBYyxJQUFJLENBQUMsYUFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBYSxDQUFDO1lBQzVHLElBQUksQ0FBQyxhQUE0QixDQUFDLE1BQU0sQ0FBRSxJQUFJLENBQUMsYUFBNEIsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzRyxJQUFJLENBQUUsSUFBSSxDQUFDLGFBQTRCLENBQUMsTUFBTSxFQUFFO2dCQUM1QyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQzthQUNsQztTQUNKO2FBQ0k7WUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztTQUNsQztRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLElBQVk7UUFDM0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSyxJQUFJLENBQUMsYUFBNEIsQ0FBQyxNQUFNLEVBQUU7WUFDckUsTUFBTSxhQUFhLEdBQWMsSUFBSSxDQUFDLGFBQTRCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQWEsQ0FBQztZQUMxRyx5RUFBeUU7WUFDekUsbUNBQW1DO1lBQ25DLE1BQU0sS0FBSyxHQUFZLElBQUksQ0FBQyxhQUE0QixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvRSxJQUFJLENBQUMsYUFBNEIsQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLGFBQWEsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RyxhQUFhLENBQUMsa0JBQWtCLENBQUUsSUFBSSxDQUFDLGFBQTRCLENBQUMsS0FBSyxDQUFxQixDQUFDLENBQUM7U0FDbkc7YUFDSSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQXlCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hHLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDeEQ7SUFDTCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFLLElBQUksQ0FBQyxhQUE0QixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDL0MsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDYixJQUFLLElBQUksQ0FBQyxhQUE0QixDQUFDLE1BQU0sRUFBRTtZQUMzQyxtQ0FBbUM7WUFDbkMsS0FBSyxhQUFhLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBMkIsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvSTtJQUNMLENBQUM7dUdBN0xRLGtCQUFrQjsyRkFBbEIsa0JBQWtCLDZSQ3BCL0IsNndEQXFDTTs7MkZEakJPLGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFFSSxZQUFZO3lIQWdCdEIsYUFBYTtzQkFEWixLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSztnQkFJTixHQUFHO3NCQURGLEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQUlOLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBSU4sbUJBQW1CO3NCQURsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1qc2RvYyAqL1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi9jbGFzc2VzL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsLCBGaWxlRGF0YVdpdGhGaWxlLCBJbWFnZUZpbGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvZmlsZS9maWxlLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IEZpbGVEYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9maWxlL2ZpbGUtZGVjb3JhdG9yLmRhdGEnO1xuaW1wb3J0IHsgTG9kYXNoVXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vZW5jYXBzdWxhdGlvbi9sb2Rhc2gudXRpbGl0aWVzJztcbmltcG9ydCB7IFJlZmxlY3RVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi8uLi8uLi9lbmNhcHN1bGF0aW9uL3JlZmxlY3QudXRpbGl0aWVzJztcbmltcG9ydCB7IEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzJztcbmltcG9ydCB7IEZpbGVVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsaXRpZXMvZmlsZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdmaWxlLWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZmlsZS1pbnB1dC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVJbnB1dENvbXBvbmVudDxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIGdldCBmaWxlbmFtZXMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YShFbnRpdHlVdGlsaXRpZXMuRklMRU5BTUVTX0tFWSwgdGhpcy5lbnRpdHksIHRoaXMua2V5KSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc2V0IGZpbGVuYW1lcyh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5kZWZpbmVNZXRhZGF0YShFbnRpdHlVdGlsaXRpZXMuRklMRU5BTUVTX0tFWSwgdmFsdWUsIHRoaXMuZW50aXR5LCB0aGlzLmtleSk7XG4gICAgfVxuXG4gICAgRmlsZVV0aWxpdGllczogdHlwZW9mIEZpbGVVdGlsaXRpZXMgPSBGaWxlVXRpbGl0aWVzO1xuXG4gICAgQElucHV0KClcbiAgICBwcm9wZXJ0eVZhbHVlITogRmlsZURhdGEgfCBGaWxlRGF0YVtdIHwgdW5kZWZpbmVkO1xuXG4gICAgQElucHV0KClcbiAgICBlbnRpdHkhOiBFbnRpdHlUeXBlO1xuXG4gICAgQElucHV0KClcbiAgICBrZXkhOiBrZXlvZiBFbnRpdHlUeXBlO1xuXG4gICAgQElucHV0KClcbiAgICBtZXRhZGF0YSE6IERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfCBJbWFnZUZpbGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcblxuICAgIEBJbnB1dCgpXG4gICAgZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZSE6IChtb2RlbDogTmdNb2RlbCkgPT4gc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBpc1JlYWRPbmx5ITogYm9vbGVhbjtcblxuICAgIEBPdXRwdXQoKVxuICAgIGZpbGVEYXRhQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxGaWxlRGF0YSB8IEZpbGVEYXRhW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlRGF0YSB8IEZpbGVEYXRhW10+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRpYWxvZzogTWF0RGlhbG9nLCBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQpIHsgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRNdWx0aUZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdFNpbmdsZUZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGVEYXRhQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnByb3BlcnR5VmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdE11bHRpRmlsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcGVydHlWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5maWxlbmFtZXMgPSAodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLm1hcChmID0+IGYubmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRTaW5nbGVGaWxlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wcm9wZXJ0eVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVuYW1lcyA9IFsodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhKS5uYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHNldEZpbGVGcm9tSW5wdXQoZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGZpbGVzOiBGaWxlTGlzdCB8IFtdID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlcyA/PyBbXTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRGaWxlKEFycmF5LmZyb20oZmlsZXMpKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRGaWxlKGZpbGVzOiBGaWxlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gdmFsaWRhdGlvbiBkb25lIGlubGluZVxuICAgICAgICBpZiAoZmlsZXMuZmluZChmID0+ICFGaWxlVXRpbGl0aWVzLmlzTWltZVR5cGVWYWxpZChmLnR5cGUsIHRoaXMubWV0YWRhdGEuYWxsb3dlZE1pbWVUeXBlcykpKSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLm1ldGFkYXRhLm1pbWVUeXBlRXJyb3JEaWFsb2csXG4gICAgICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRGaWxlSW5wdXRzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVzLmZpbmQoZiA9PiBGaWxlVXRpbGl0aWVzLnRyYW5zZm9ybVRvTWVnYUJ5dGVzKGYuc2l6ZSwgJ0InKSA+IHRoaXMubWV0YWRhdGEubWF4U2l6ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMubWV0YWRhdGEubWF4U2l6ZUVycm9yRGlhbG9nLFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RmlsZUlucHV0cygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlU2l6ZVRvdGFsOiBudW1iZXIgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGZpbGVTaXplVG90YWwgKz0gZmlsZS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmIChGaWxlVXRpbGl0aWVzLnRyYW5zZm9ybVRvTWVnYUJ5dGVzKGZpbGVTaXplVG90YWwsICdCJykgPiB0aGlzLm1ldGFkYXRhLm1heFNpemVUb3RhbCkge1xuICAgICAgICAgICAgdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5tZXRhZGF0YS5tYXhTaXplVG90YWxFcnJvckRpYWxvZyxcbiAgICAgICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVJbnB1dHMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tZXRhZGF0YS5tdWx0aXBsZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRNdWx0aUZpbGUoQXJyYXkuZnJvbShmaWxlcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRTaW5nbGVGaWxlKGZpbGVzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGVEYXRhQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnByb3BlcnR5VmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRGaWxlSW5wdXRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbGVuYW1lcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmZpbGVEYXRhQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnByb3BlcnR5VmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0TXVsdGlGaWxlKGZpbGVzOiBGaWxlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZGF0YTogRmlsZURhdGFbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEYXRhOiBGaWxlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGF0YS5wdXNoKGZpbGVEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWUgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKGRhdGEpO1xuICAgICAgICB0aGlzLmZpbGVuYW1lcyA9IHRoaXMucHJvcGVydHlWYWx1ZS5tYXAoZiA9PiBmLm5hbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0U2luZ2xlRmlsZShmaWxlOiBGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgICBzaXplOiBmaWxlLnNpemVcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5maWxlbmFtZXMgPSBbdGhpcy5wcm9wZXJ0eVZhbHVlLm5hbWVdO1xuICAgIH1cblxuICAgIHJlbW92ZUZpbGUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tZXRhZGF0YS5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5maWxlbmFtZXM/LnNwbGljZSh0aGlzLmZpbGVuYW1lcy5pbmRleE9mKG5hbWUpLCAxKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlbmFtZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZW5hbWVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmlsZURhdGFUb1JlbW92ZTogRmlsZURhdGEgPSAodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLmZpbmQoZiA9PiBmLm5hbWUgPT09IG5hbWUpIGFzIEZpbGVEYXRhO1xuICAgICAgICAgICAgKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5zcGxpY2UoKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5pbmRleE9mKGZpbGVEYXRhVG9SZW1vdmUpLCAxKTtcbiAgICAgICAgICAgIGlmICghKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVuYW1lcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGVEYXRhQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnByb3BlcnR5VmFsdWUpO1xuICAgIH1cblxuICAgIGFzeW5jIGRvd25sb2FkRmlsZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMubWV0YWRhdGEubXVsdGlwbGUgJiYgKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kRmlsZURhdGE6IEZpbGVEYXRhID0gKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5maW5kKGYgPT4gZi5uYW1lID09PSBuYW1lKSBhcyBGaWxlRGF0YTtcbiAgICAgICAgICAgIC8vIHRoZSBpbmRleCBuZWVkIHRvIGJlIHNhdmVkIGluIGEgY29uc3RhbnQgYmVjYXVzZSB3ZSBlZGl0IGZvdW5kRmlsZURhdGFcbiAgICAgICAgICAgIC8vID0+IC5pbmRleE9mKCkgcmV0dXJucyB1bmRlZmluZWQuXG4gICAgICAgICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5pbmRleE9mKGZvdW5kRmlsZURhdGEpO1xuICAgICAgICAgICAgKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKVtpbmRleF0gPSBhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKGZvdW5kRmlsZURhdGEsIHRoaXMuaHR0cCk7XG4gICAgICAgICAgICBGaWxlVXRpbGl0aWVzLmRvd25sb2FkU2luZ2xlRmlsZSgodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pW2luZGV4XSBhcyBGaWxlRGF0YVdpdGhGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BlcnR5VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9IGF3YWl0IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZURhdGEodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhLCB0aGlzLmh0dHApO1xuICAgICAgICAgICAgRmlsZVV0aWxpdGllcy5kb3dubG9hZFNpbmdsZUZpbGUodGhpcy5wcm9wZXJ0eVZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRvd25sb2FkQWxsRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhLm11bHRpcGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnByb3BlcnR5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgZG93bmxvYWRBbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICgodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgIHZvaWQgRmlsZVV0aWxpdGllcy5kb3dubG9hZE11bHRpcGxlRmlsZXModGhpcy5tZXRhZGF0YS5kaXNwbGF5TmFtZSwgTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLnByb3BlcnR5VmFsdWUgYXMgRmlsZURhdGFbXSksIHRoaXMuaHR0cCk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiPGlucHV0ICNmaWxlSW5wdXRcbiAgICB0eXBlPVwiZmlsZVwiIGhpZGRlblxuICAgIFttdWx0aXBsZV09XCJtZXRhZGF0YS5tdWx0aXBsZVwiXG4gICAgW2FjY2VwdF09XCJGaWxlVXRpbGl0aWVzLmdldEFjY2VwdFN0cmluZyhtZXRhZGF0YS5hbGxvd2VkTWltZVR5cGVzKVwiXG4gICAgKGNoYW5nZSk9XCJzZXRGaWxlRnJvbUlucHV0KCRldmVudClcIlxuPlxuXG48bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cImFsd2F5c1wiPlxuICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgPG1hdC1jaGlwLWdyaWQgI2NoaXBHcmlkXG4gICAgICAgIFsobmdNb2RlbCldPVwiZmlsZW5hbWVzXCIgbmFtZT1cImZpbGVcIiAjbW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSlcIlxuICAgID5cbiAgICAgICAgPG1hdC1jaGlwLXJvdyAqbmdGb3I9XCJsZXQgbmFtZSBvZiBmaWxlbmFtZXNcIiAocmVtb3ZlZCk9XCJyZW1vdmVGaWxlKG5hbWUpXCI+XG4gICAgICAgICAgICB7e25hbWV9fVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtbWRjLWNoaXAtcmVtb3ZlIG1hdC1tZGMtY2hpcC10cmFpbGluZy1pY29uIG5neC1tYXQtZ3JleVwiIChjbGljayk9XCJkb3dubG9hZEZpbGUobmFtZSlcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1kb3dubG9hZFwiPjwvaT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhaXNSZWFkT25seVwiIHR5cGU9XCJidXR0b25cIiBtYXRDaGlwUmVtb3ZlPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwie3ttZXRhZGF0YS5kZWxldGVJY29ufX1cIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtY2hpcC1yb3c+XG4gICAgICAgIDxpbnB1dCBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBHcmlkXCIgW3JlYWRvbmx5XT1cInRydWVcIiBoaWRkZW4+XG4gICAgPC9tYXQtY2hpcC1ncmlkPlxuICAgIDxidXR0b24gKm5nSWY9XCJkb3dubG9hZEFsbEVuYWJsZWQoKVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1tYXQtZ3JleVwiIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggKGNsaWNrKT1cImRvd25sb2FkQWxsKClcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZmlsZS16aXBwZXJcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtbWF0LWdyZXlcIiBtYXQtaWNvbi1idXR0b24gbWF0U3VmZml4IFtkaXNhYmxlZF09XCJpc1JlYWRPbmx5XCIgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXVwbG9hZFwiPjwvaT5cbiAgICA8L2J1dHRvbj5cbiAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuPC9tYXQtZm9ybS1maWVsZD5cblxuPGRpdiAqbmdJZj1cIm1ldGFkYXRhLmRyYWdBbmREcm9wICYmICFpc1JlYWRPbmx5XCIgY2xhc3M9XCJkcmFnLWRyb3BcIiBkcmFnRHJvcCAoZmlsZXMpPVwic2V0RmlsZSgkZXZlbnQpXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIFtkaXNhYmxlZF09XCJpc1JlYWRPbmx5XCIgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZpbGUtYXJyb3ctdXAgbmd4LW1hdC1ncmV5XCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuPC9kaXY+Il19
|