@qbs-origin/origin-form 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/lib/action-step-handler.mjs +163 -0
- package/esm2022/lib/auth-client.service.mjs +69 -0
- package/esm2022/lib/enums/label.keys.mjs +721 -0
- package/esm2022/lib/form-css.helper.mjs +367 -0
- package/esm2022/lib/formly/baseFormlyControlComponent.mjs +52 -0
- package/esm2022/lib/formly/baseFormlyStepComponent.mjs +59 -0
- package/esm2022/lib/formly/custom-section-separator.component.mjs +32 -0
- package/esm2022/lib/formly/form-section-separator.component.mjs +36 -0
- package/esm2022/lib/formly/formly-action.mjs +56 -0
- package/esm2022/lib/formly/formly-checkbox/formly-checkbox.component.mjs +52 -0
- package/esm2022/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.mjs +261 -0
- package/esm2022/lib/formly/formly-download-documents/formly-download-documents.component.mjs +126 -0
- package/esm2022/lib/formly/formly-enrol-card/formly-enrol-card.component.mjs +120 -0
- package/esm2022/lib/formly/formly-field-stepper/formly-field-stepper.component.mjs +762 -0
- package/esm2022/lib/formly/formly-generate-documents/formly-generate-documents.component.mjs +57 -0
- package/esm2022/lib/formly/formly-identification.component.mjs +84 -0
- package/esm2022/lib/formly/formly-open-banking/formly-open-banking.component.mjs +590 -0
- package/esm2022/lib/formly/formly-paragraph/formly-paragraph.component.mjs +35 -0
- package/esm2022/lib/formly/formly-radio/formly-radio-component.mjs +49 -0
- package/esm2022/lib/formly/formly-row-fille.mjs +12 -0
- package/esm2022/lib/formly/formly-scan-id/formly-scan-id.component.mjs +284 -0
- package/esm2022/lib/formly/formly-sign/formly-sign.component.mjs +173 -0
- package/esm2022/lib/formly/formly-upload-documents/formly-upload-documents.component.mjs +198 -0
- package/esm2022/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.mjs +124 -0
- package/esm2022/lib/formly/formly-view-documents/formly-view-documents.component.mjs +245 -0
- package/esm2022/lib/formly/formly-view-offers/formly-view-offers.component.mjs +160 -0
- package/esm2022/lib/model-population.helper.mjs +265 -0
- package/esm2022/lib/models/application-type.model.mjs +12 -0
- package/esm2022/lib/models/application.model.mjs +30 -0
- package/esm2022/lib/models/auth/users.model.mjs +2 -0
- package/esm2022/lib/models/dictionary.model.mjs +20 -0
- package/esm2022/lib/models/flux.model.mjs +105 -0
- package/esm2022/lib/models/forms.model.mjs +572 -0
- package/esm2022/lib/models/label-info.model.mjs +2 -0
- package/esm2022/lib/models/label.model.mjs +2 -0
- package/esm2022/lib/models/language.model.mjs +3 -0
- package/esm2022/lib/models/list.model.mjs +2 -0
- package/esm2022/lib/models/partner.model.mjs +3 -0
- package/esm2022/lib/models/treeview.model.mjs +15 -0
- package/esm2022/lib/origin-form-auth.service.mjs +40 -0
- package/esm2022/lib/origin-form-config.model.mjs +2 -0
- package/esm2022/lib/origin-form-token.interceptor.mjs +35 -0
- package/esm2022/lib/origin-form.component.mjs +2391 -0
- package/esm2022/lib/origin-form.module.mjs +479 -0
- package/esm2022/lib/origin-form.service.mjs +14 -0
- package/esm2022/lib/others/check-list.database.mjs +55 -0
- package/esm2022/lib/others/config-service.mjs +42 -0
- package/esm2022/lib/others/dictionary-label-info.mjs +3 -0
- package/esm2022/lib/others/environment-type.mjs +21 -0
- package/esm2022/lib/others/external-link.directive.mjs +49 -0
- package/esm2022/lib/others/flux-helper.mjs +1397 -0
- package/esm2022/lib/others/picker.component.mjs +119 -0
- package/esm2022/lib/others/translation.pipe.mjs +21 -0
- package/esm2022/lib/others/translations-helper.mjs +258 -0
- package/esm2022/lib/others/utils.mjs +272 -0
- package/esm2022/lib/services/applicationData.service.mjs +145 -0
- package/esm2022/lib/services/auth-http.service.mjs +80 -0
- package/esm2022/lib/services/dialog.service.mjs +56 -0
- package/esm2022/lib/services/dictionary.service.mjs +198 -0
- package/esm2022/lib/services/forms.service.mjs +47 -0
- package/esm2022/lib/services/labels.service.mjs +29 -0
- package/esm2022/lib/services/language.service.mjs +24 -0
- package/esm2022/lib/services/open-banking.service.mjs +194 -0
- package/esm2022/lib/services/origin-form-signalr-handler.service.mjs +107 -0
- package/esm2022/lib/services/origin-form-signalr.service.mjs +105 -0
- package/esm2022/lib/services/otp.service.mjs +28 -0
- package/esm2022/lib/services/proxy.service.mjs +79 -0
- package/esm2022/lib/services/scroll-to-error.service.mjs +369 -0
- package/esm2022/lib/services/translation.service.mjs +27 -0
- package/esm2022/lib/shared-components/confirmation.component.mjs +34 -0
- package/esm2022/lib/shared-components/dictionaries-tree.component.mjs +301 -0
- package/esm2022/lib/shared-components/grid.component.mjs +241 -0
- package/esm2022/lib/shared-components/treeview/treeview.component.mjs +224 -0
- package/esm2022/lib/theme-css.mjs +2254 -0
- package/esm2022/lib/theme-injector.service.mjs +26 -0
- package/esm2022/public-api.mjs +4 -0
- package/esm2022/qbs-origin-origin-form.mjs +5 -0
- package/fesm2022/qbs-origin-origin-form.mjs +15215 -0
- package/fesm2022/qbs-origin-origin-form.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/action-step-handler.d.ts +49 -0
- package/lib/auth-client.service.d.ts +17 -0
- package/lib/enums/label.keys.d.ts +720 -0
- package/lib/form-css.helper.d.ts +28 -0
- package/lib/formly/baseFormlyControlComponent.d.ts +25 -0
- package/lib/formly/baseFormlyStepComponent.d.ts +29 -0
- package/lib/formly/custom-section-separator.component.d.ts +6 -0
- package/lib/formly/form-section-separator.component.d.ts +10 -0
- package/lib/formly/formly-action.d.ts +13 -0
- package/lib/formly/formly-checkbox/formly-checkbox.component.d.ts +15 -0
- package/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.d.ts +45 -0
- package/lib/formly/formly-download-documents/formly-download-documents.component.d.ts +22 -0
- package/lib/formly/formly-enrol-card/formly-enrol-card.component.d.ts +114 -0
- package/lib/formly/formly-field-stepper/formly-field-stepper.component.d.ts +79 -0
- package/lib/formly/formly-generate-documents/formly-generate-documents.component.d.ts +17 -0
- package/lib/formly/formly-identification.component.d.ts +19 -0
- package/lib/formly/formly-open-banking/formly-open-banking.component.d.ts +119 -0
- package/lib/formly/formly-paragraph/formly-paragraph.component.d.ts +10 -0
- package/lib/formly/formly-radio/formly-radio-component.d.ts +15 -0
- package/lib/formly/formly-row-fille.d.ts +6 -0
- package/lib/formly/formly-scan-id/formly-scan-id.component.d.ts +41 -0
- package/lib/formly/formly-sign/formly-sign.component.d.ts +36 -0
- package/lib/formly/formly-upload-documents/formly-upload-documents.component.d.ts +25 -0
- package/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.d.ts +79 -0
- package/lib/formly/formly-view-documents/formly-view-documents.component.d.ts +33 -0
- package/lib/formly/formly-view-offers/formly-view-offers.component.d.ts +23 -0
- package/lib/model-population.helper.d.ts +8 -0
- package/lib/models/application-type.model.d.ts +27 -0
- package/lib/models/application.model.d.ts +107 -0
- package/lib/models/auth/users.model.d.ts +20 -0
- package/lib/models/dictionary.model.d.ts +77 -0
- package/lib/models/flux.model.d.ts +101 -0
- package/lib/models/forms.model.d.ts +504 -0
- package/lib/models/label-info.model.d.ts +10 -0
- package/lib/models/label.model.d.ts +4 -0
- package/lib/models/language.model.d.ts +5 -0
- package/lib/models/list.model.d.ts +8 -0
- package/lib/models/partner.model.d.ts +12 -0
- package/lib/models/treeview.model.d.ts +17 -0
- package/lib/origin-form-auth.service.d.ts +15 -0
- package/lib/origin-form-config.model.d.ts +12 -0
- package/lib/origin-form-token.interceptor.d.ts +12 -0
- package/lib/origin-form.component.d.ts +231 -0
- package/lib/origin-form.module.d.ts +84 -0
- package/lib/origin-form.service.d.ts +6 -0
- package/lib/others/check-list.database.d.ts +16 -0
- package/lib/others/config-service.d.ts +22 -0
- package/lib/others/dictionary-label-info.d.ts +6 -0
- package/lib/others/environment-type.d.ts +8 -0
- package/lib/others/external-link.directive.d.ts +12 -0
- package/lib/others/flux-helper.d.ts +115 -0
- package/lib/others/picker.component.d.ts +36 -0
- package/lib/others/translation.pipe.d.ts +10 -0
- package/lib/others/translations-helper.d.ts +31 -0
- package/lib/others/utils.d.ts +37 -0
- package/lib/services/applicationData.service.d.ts +35 -0
- package/lib/services/auth-http.service.d.ts +21 -0
- package/lib/services/dialog.service.d.ts +20 -0
- package/lib/services/dictionary.service.d.ts +89 -0
- package/lib/services/forms.service.d.ts +17 -0
- package/lib/services/labels.service.d.ts +13 -0
- package/lib/services/language.service.d.ts +14 -0
- package/lib/services/open-banking.service.d.ts +137 -0
- package/lib/services/origin-form-signalr-handler.service.d.ts +29 -0
- package/lib/services/origin-form-signalr.service.d.ts +24 -0
- package/lib/services/otp.service.d.ts +22 -0
- package/lib/services/proxy.service.d.ts +29 -0
- package/lib/services/scroll-to-error.service.d.ts +54 -0
- package/lib/services/translation.service.d.ts +10 -0
- package/lib/shared-components/confirmation.component.d.ts +77 -0
- package/lib/shared-components/dictionaries-tree.component.d.ts +51 -0
- package/lib/shared-components/grid.component.d.ts +138 -0
- package/lib/shared-components/treeview/treeview.component.d.ts +121 -0
- package/lib/theme-css.d.ts +2 -0
- package/lib/theme-injector.service.d.ts +8 -0
- package/package.json +42 -0
- package/public-api.d.ts +3 -0
- package/schematics-compiled/collection.json +10 -0
- package/schematics-compiled/ng-add/index.d.ts +2 -0
- package/schematics-compiled/ng-add/index.js +67 -0
- package/schematics-compiled/ng-add/index.js.map +1 -0
- package/schematics-compiled/ng-add/schema.json +8 -0
- package/src/lib/assets/fonts/Figtree-Bold.ttf +0 -0
- package/src/lib/assets/fonts/Figtree-Light.ttf +0 -0
- package/src/lib/assets/fonts/Figtree-Regular.ttf +0 -0
- package/src/lib/assets/fonts/Sora-ExtraBold.ttf +0 -0
- package/src/lib/assets/fonts/Sora-Light.ttf +0 -0
- package/src/lib/assets/fonts/Sora-Regular.ttf +0 -0
- package/src/lib/assets/fonts/ttrounds-bold-webfont.woff +0 -0
- package/src/lib/assets/fonts/ttrounds-bold-webfont.woff2 +0 -0
- package/src/lib/assets/fonts/ttrounds-regular-webfont.woff +0 -0
- package/src/lib/assets/fonts/ttrounds-regular-webfont.woff2 +0 -0
- package/src/lib/assets/fonts/ttrounds-thin-webfont.woff +0 -0
- package/src/lib/assets/fonts/ttrounds-thin-webfont.woff2 +0 -0
- package/src/lib/assets/images/flag/icon-flag-de.svg +10 -0
- package/src/lib/assets/images/flag/icon-flag-en.svg +1 -0
- package/src/lib/assets/images/flag/icon-flag-es.svg +11 -0
- package/src/lib/assets/images/flag/icon-flag-fr.svg +1 -0
- package/src/lib/assets/images/flag/icon-flag-ro.svg +11 -0
- package/src/lib/assets/images/flag/origin-form/new-id-card.png +0 -0
- package/src/lib/assets/images/flag/origin-form/old-id-card.png +0 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Component, EventEmitter, Output, } from '@angular/core';
|
|
2
|
+
import { BaseFormlyStepComponent } from './baseFormlyStepComponent';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
import * as i2 from "@angular/material/progress-spinner";
|
|
6
|
+
export class FormlyActionComponent extends BaseFormlyStepComponent {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(...arguments);
|
|
9
|
+
this.actionCompleted = new EventEmitter();
|
|
10
|
+
this.loading = true;
|
|
11
|
+
}
|
|
12
|
+
ngOnChanges(changes) {
|
|
13
|
+
this.loading = false;
|
|
14
|
+
setTimeout(() => {
|
|
15
|
+
this.cdr.detectChanges();
|
|
16
|
+
}, 0);
|
|
17
|
+
}
|
|
18
|
+
ngAfterViewInit() { }
|
|
19
|
+
onPageSelected() {
|
|
20
|
+
this.onActionCompleted();
|
|
21
|
+
}
|
|
22
|
+
onActionCompleted() {
|
|
23
|
+
if (this.props['action']) {
|
|
24
|
+
this.props['action']().subscribe(() => {
|
|
25
|
+
this.loading = false;
|
|
26
|
+
this.actionCompleted.emit();
|
|
27
|
+
setTimeout(() => {
|
|
28
|
+
this.cdr.detectChanges();
|
|
29
|
+
}, 100);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyActionComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
34
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyActionComponent, selector: "formly-field-action", outputs: { actionCompleted: "actionCompleted" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
|
|
35
|
+
<div class="loader-container">
|
|
36
|
+
<mat-spinner *ngIf="loading" class="l-x-auto"></mat-spinner>
|
|
37
|
+
</div>
|
|
38
|
+
<ng-container *ngIf="!loading">
|
|
39
|
+
<ng-template #fieldComponent></ng-template>
|
|
40
|
+
</ng-container>
|
|
41
|
+
`, isInline: true, styles: [".loader-container{display:flex;justify-content:center;align-items:center;padding-top:5vh;padding-bottom:5vh}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
42
|
+
}
|
|
43
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyActionComponent, decorators: [{
|
|
44
|
+
type: Component,
|
|
45
|
+
args: [{ selector: 'formly-field-action', template: `
|
|
46
|
+
<div class="loader-container">
|
|
47
|
+
<mat-spinner *ngIf="loading" class="l-x-auto"></mat-spinner>
|
|
48
|
+
</div>
|
|
49
|
+
<ng-container *ngIf="!loading">
|
|
50
|
+
<ng-template #fieldComponent></ng-template>
|
|
51
|
+
</ng-container>
|
|
52
|
+
`, styles: [".loader-container{display:flex;justify-content:center;align-items:center;padding-top:5vh;padding-bottom:5vh}\n"] }]
|
|
53
|
+
}], propDecorators: { actionCompleted: [{
|
|
54
|
+
type: Output
|
|
55
|
+
}] } });
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LWFjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29yaWdpbi1mb3JtL3NyYy9saWIvZm9ybWx5L2Zvcm1seS1hY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFHVCxZQUFZLEVBQ1osTUFBTSxHQUdQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7O0FBd0JwRSxNQUFNLE9BQU8scUJBQ1gsU0FBUSx1QkFBdUI7SUF2QmpDOztRQTBCWSxvQkFBZSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3pFLFlBQU8sR0FBWSxJQUFJLENBQUM7S0EwQnpCO0lBeEJDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQsZUFBZSxLQUFJLENBQUM7SUFFWCxjQUFjO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzVCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQzsrR0E5QlUscUJBQXFCO21HQUFyQixxQkFBcUIsd0pBcEJ0Qjs7Ozs7OztHQU9UOzs0RkFhVSxxQkFBcUI7a0JBdEJqQyxTQUFTOytCQUNFLHFCQUFxQixZQUNyQjs7Ozs7OztHQU9UOzhCQWlCUyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZUZvcm1seVN0ZXBDb21wb25lbnQgfSBmcm9tICcuL2Jhc2VGb3JtbHlTdGVwQ29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZm9ybWx5LWZpZWxkLWFjdGlvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImxvYWRlci1jb250YWluZXJcIj5cbiAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImwteC1hdXRvXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZmllbGRDb21wb25lbnQ+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLmxvYWRlci1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgcGFkZGluZy10b3A6IDV2aDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDV2aDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlBY3Rpb25Db21wb25lbnRcbiAgZXh0ZW5kcyBCYXNlRm9ybWx5U3RlcENvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzXG57XG4gIEBPdXRwdXQoKSBhY3Rpb25Db21wbGV0ZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge31cblxuICBvdmVycmlkZSBvblBhZ2VTZWxlY3RlZCgpIHtcbiAgICB0aGlzLm9uQWN0aW9uQ29tcGxldGVkKCk7XG4gIH1cblxuICBvbkFjdGlvbkNvbXBsZXRlZCgpIHtcbiAgICBpZiAodGhpcy5wcm9wc1snYWN0aW9uJ10pIHtcbiAgICAgIHRoaXMucHJvcHNbJ2FjdGlvbiddKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aW9uQ29tcGxldGVkLmVtaXQoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LCAxMDApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { FieldType } from '@ngx-formly/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
import * as i2 from "@angular/forms";
|
|
6
|
+
import * as i3 from "ngx-markdown";
|
|
7
|
+
import * as i4 from "@angular/material/checkbox";
|
|
8
|
+
import * as i5 from "../../others/external-link.directive";
|
|
9
|
+
export class FormlyCheckboxComponent extends FieldType {
|
|
10
|
+
constructor(cd) {
|
|
11
|
+
super();
|
|
12
|
+
this.cd = cd;
|
|
13
|
+
}
|
|
14
|
+
ngOnInit() {
|
|
15
|
+
this.checkbox = this.form.get(this.field.key);
|
|
16
|
+
if (this.props['checked'] !== undefined) {
|
|
17
|
+
this.checkbox?.setValue(this.props['checked'], { emitEvent: false });
|
|
18
|
+
this.checkbox?.updateValueAndValidity();
|
|
19
|
+
}
|
|
20
|
+
if (this.props['required']) {
|
|
21
|
+
this.addCheckboxValidator();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
addCheckboxValidator() {
|
|
25
|
+
this.requiredMessage =
|
|
26
|
+
this.field.validation?.messages?.['required'] || 'This field is required';
|
|
27
|
+
this.field.validators = {
|
|
28
|
+
...this.field.validators,
|
|
29
|
+
checkboxRequired: {
|
|
30
|
+
expression: (control) => {
|
|
31
|
+
return control.value === true;
|
|
32
|
+
},
|
|
33
|
+
message: this.requiredMessage,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
this.options?.build?.(this.field);
|
|
37
|
+
this.checkbox?.updateValueAndValidity();
|
|
38
|
+
}
|
|
39
|
+
updateValue(value) {
|
|
40
|
+
if (this.checkbox) {
|
|
41
|
+
this.checkbox.setValue(value, { emitEvent: false });
|
|
42
|
+
this.cd.detectChanges();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyCheckboxComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
46
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyCheckboxComponent, selector: "formly-checkbox", usesInheritance: true, ngImport: i0, template: "<div class=\"mat-mdc-text-field-wrapper mdc-checkbox-field\" appExternalLink>\n <mat-checkbox [formControl]=\"checkbox\">\n <markdown [data]=\"props['label']\"></markdown>\n </mat-checkbox>\n\n <div *ngIf=\"showError\" class=\"text-error m-l-20\">\n {{ requiredMessage }}\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i5.ExternalLinkDirective, selector: "[appExternalLink]" }] }); }
|
|
47
|
+
}
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyCheckboxComponent, decorators: [{
|
|
49
|
+
type: Component,
|
|
50
|
+
args: [{ selector: 'formly-checkbox', template: "<div class=\"mat-mdc-text-field-wrapper mdc-checkbox-field\" appExternalLink>\n <mat-checkbox [formControl]=\"checkbox\">\n <markdown [data]=\"props['label']\"></markdown>\n </mat-checkbox>\n\n <div *ngIf=\"showError\" class=\"text-error m-l-20\">\n {{ requiredMessage }}\n </div>\n</div>\n" }]
|
|
51
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }] });
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LWNoZWNrYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29yaWdpbi1mb3JtL3NyYy9saWIvZm9ybWx5L2Zvcm1seS1jaGVja2JveC9mb3JtbHktY2hlY2tib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LWNoZWNrYm94L2Zvcm1seS1jaGVja2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUE2QixNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7QUFRN0MsTUFBTSxPQUFPLHVCQUF3QixTQUFRLFNBQVM7SUFJcEQsWUFBb0IsRUFBcUI7UUFDdkMsS0FBSyxFQUFFLENBQUM7UUFEVSxPQUFFLEdBQUYsRUFBRSxDQUFtQjtJQUV6QyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFhLENBQWdCLENBQUM7UUFFdkUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNyRSxJQUFJLENBQUMsUUFBUSxFQUFFLHNCQUFzQixFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxlQUFlO1lBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLHdCQUF3QixDQUFDO1FBRTVFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHO1lBQ3RCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQ3hCLGdCQUFnQixFQUFFO2dCQUNoQixVQUFVLEVBQUUsQ0FBQyxPQUF3QixFQUFFLEVBQUU7b0JBQ3ZDLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUM7Z0JBQ2hDLENBQUM7Z0JBQ0QsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlO2FBQzlCO1NBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVU7UUFDcEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQzsrR0EzQ1UsdUJBQXVCO21HQUF2Qix1QkFBdUIsOEVDVHBDLDhTQVNBOzs0RkRBYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Zvcm1seS1jaGVja2JveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtbHktY2hlY2tib3guY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtbHktY2hlY2tib3guY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybWx5Q2hlY2tib3hDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGUgaW1wbGVtZW50cyBPbkluaXQge1xuICBjaGVja2JveDogRm9ybUNvbnRyb2w7XG4gIHJlcXVpcmVkTWVzc2FnZTogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tib3ggPSB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQua2V5IGFzIHN0cmluZykgYXMgRm9ybUNvbnRyb2w7XG5cbiAgICBpZiAodGhpcy5wcm9wc1snY2hlY2tlZCddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hlY2tib3g/LnNldFZhbHVlKHRoaXMucHJvcHNbJ2NoZWNrZWQnXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5jaGVja2JveD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzWydyZXF1aXJlZCddKSB7XG4gICAgICB0aGlzLmFkZENoZWNrYm94VmFsaWRhdG9yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDaGVja2JveFZhbGlkYXRvcigpOiB2b2lkIHtcbiAgICB0aGlzLnJlcXVpcmVkTWVzc2FnZSA9XG4gICAgICB0aGlzLmZpZWxkLnZhbGlkYXRpb24/Lm1lc3NhZ2VzPy5bJ3JlcXVpcmVkJ10gfHwgJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnO1xuXG4gICAgdGhpcy5maWVsZC52YWxpZGF0b3JzID0ge1xuICAgICAgLi4udGhpcy5maWVsZC52YWxpZGF0b3JzLFxuICAgICAgY2hlY2tib3hSZXF1aXJlZDoge1xuICAgICAgICBleHByZXNzaW9uOiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRyb2wudmFsdWUgPT09IHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMucmVxdWlyZWRNZXNzYWdlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMub3B0aW9ucz8uYnVpbGQ/Lih0aGlzLmZpZWxkKTtcbiAgICB0aGlzLmNoZWNrYm94Py51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cblxuICB1cGRhdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tib3gpIHtcbiAgICAgIHRoaXMuY2hlY2tib3guc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVyIG1kYy1jaGVja2JveC1maWVsZFwiIGFwcEV4dGVybmFsTGluaz5cbiAgPG1hdC1jaGVja2JveCBbZm9ybUNvbnRyb2xdPVwiY2hlY2tib3hcIj5cbiAgICA8bWFya2Rvd24gW2RhdGFdPVwicHJvcHNbJ2xhYmVsJ11cIj48L21hcmtkb3duPlxuICA8L21hdC1jaGVja2JveD5cblxuICA8ZGl2ICpuZ0lmPVwic2hvd0Vycm9yXCIgY2xhc3M9XCJ0ZXh0LWVycm9yIG0tbC0yMFwiPlxuICAgIHt7IHJlcXVpcmVkTWVzc2FnZSB9fVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { Component, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
|
|
3
|
+
import { FieldType } from '@ngx-formly/core';
|
|
4
|
+
import { take } from 'rxjs';
|
|
5
|
+
import { EnvironmentType } from '../../others/environment-type';
|
|
6
|
+
import { LabelKeys } from '../../enums/label.keys';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../../services/dictionary.service";
|
|
9
|
+
import * as i2 from "@angular/common";
|
|
10
|
+
import * as i3 from "@angular/forms";
|
|
11
|
+
import * as i4 from "@angular/material/input";
|
|
12
|
+
import * as i5 from "@angular/material/form-field";
|
|
13
|
+
import * as i6 from "@angular/material/autocomplete";
|
|
14
|
+
import * as i7 from "@angular/material/core";
|
|
15
|
+
import * as i8 from "@angular/material/icon";
|
|
16
|
+
import * as i9 from "@ngx-formly/core";
|
|
17
|
+
import * as i10 from "../../shared-components/dictionaries-tree.component";
|
|
18
|
+
import * as i11 from "../../others/translation.pipe";
|
|
19
|
+
export class FormlyDictionaryDropdownTreeComponent extends FieldType {
|
|
20
|
+
constructor(dictionaryService, cdRef) {
|
|
21
|
+
super();
|
|
22
|
+
this.dictionaryService = dictionaryService;
|
|
23
|
+
this.cdRef = cdRef;
|
|
24
|
+
this.formlyKeys = LabelKeys.formly;
|
|
25
|
+
this.selectedValueText = '';
|
|
26
|
+
this.labelStyle = {};
|
|
27
|
+
this.selectedValueIds = [];
|
|
28
|
+
this.valuesIdsToShow = [];
|
|
29
|
+
this.selectedRelatedDictionaries = [];
|
|
30
|
+
this.dictionaryLabels = {};
|
|
31
|
+
// NEW: Properties for preloaded dictionary data
|
|
32
|
+
this.preloadedDictionary = null;
|
|
33
|
+
this.preloadedDictionaries = null;
|
|
34
|
+
this.usePreloadedData = false;
|
|
35
|
+
}
|
|
36
|
+
ngOnInit() {
|
|
37
|
+
if (this.props['dictionaryId']) {
|
|
38
|
+
this.dictionaryId = this.props['dictionaryId'];
|
|
39
|
+
}
|
|
40
|
+
if (this.props['valuesIdsToShow']) {
|
|
41
|
+
this.valuesIdsToShow = this.props['valuesIdsToShow'];
|
|
42
|
+
}
|
|
43
|
+
if (this.props['value']) {
|
|
44
|
+
this.selectedValueText = this.props['value'];
|
|
45
|
+
}
|
|
46
|
+
if (this.props['selectedRelatedDictionaries']) {
|
|
47
|
+
this.selectedRelatedDictionaries =
|
|
48
|
+
this.props['selectedRelatedDictionaries'];
|
|
49
|
+
}
|
|
50
|
+
if (this.props['dictionaryLabels']) {
|
|
51
|
+
this.dictionaryLabels = this.props['dictionaryLabels'];
|
|
52
|
+
}
|
|
53
|
+
// NEW: Initialize preloaded dictionary data
|
|
54
|
+
if (this.props['dictionaryData']) {
|
|
55
|
+
this.preloadedDictionary = this.props['dictionaryData'];
|
|
56
|
+
this.usePreloadedData = true;
|
|
57
|
+
}
|
|
58
|
+
if (this.props['preloadedDictionaries']) {
|
|
59
|
+
this.preloadedDictionaries = this.props['preloadedDictionaries'];
|
|
60
|
+
}
|
|
61
|
+
this.label = this.props['label'];
|
|
62
|
+
if (this.props.required) {
|
|
63
|
+
this.label += ' *';
|
|
64
|
+
}
|
|
65
|
+
this.currentLanguageIso = this.props['currentLanguageIso'];
|
|
66
|
+
this.currentLanguageId = this.props['currentLanguageId'];
|
|
67
|
+
if (this.props['design']) {
|
|
68
|
+
this.labelStyle = this.props['design']['.component-data-label'] || {};
|
|
69
|
+
}
|
|
70
|
+
if (this.props['selectedValueIds'] &&
|
|
71
|
+
Array.isArray(this.props['selectedValueIds'])) {
|
|
72
|
+
this.selectedValueIds = this.props['selectedValueIds'];
|
|
73
|
+
}
|
|
74
|
+
const initialControlValue = this.formControl.value;
|
|
75
|
+
const dictionaryDefaultValueId = this.props['dictionaryDefaultValueId'];
|
|
76
|
+
if (initialControlValue == null &&
|
|
77
|
+
dictionaryDefaultValueId != null &&
|
|
78
|
+
this.dictionaryId) {
|
|
79
|
+
const dictionary = this.props['dictionaryData'];
|
|
80
|
+
this.formControl.setValue(dictionaryDefaultValueId, {
|
|
81
|
+
emitEvent: false,
|
|
82
|
+
});
|
|
83
|
+
if (dictionary) {
|
|
84
|
+
const defaultValueDto = dictionary.values?.find((v) => v.id === dictionaryDefaultValueId);
|
|
85
|
+
if (defaultValueDto) {
|
|
86
|
+
const valueToSet = {
|
|
87
|
+
id: defaultValueDto.id,
|
|
88
|
+
name: defaultValueDto.name,
|
|
89
|
+
translations: defaultValueDto.valueTranslations?.map((t) => {
|
|
90
|
+
const languages = this.props['languages'];
|
|
91
|
+
const lang = languages?.find((l) => l.id === t.languageId);
|
|
92
|
+
return {
|
|
93
|
+
languageId: t.languageId,
|
|
94
|
+
languageIso: lang?.iso ?? '',
|
|
95
|
+
value: t.value,
|
|
96
|
+
};
|
|
97
|
+
}) || [],
|
|
98
|
+
active: defaultValueDto.active,
|
|
99
|
+
locked: defaultValueDto.locked,
|
|
100
|
+
childDictionaryId: defaultValueDto.childDictionaryId,
|
|
101
|
+
childDictionaryUUID: defaultValueDto.childDictionaryUUID,
|
|
102
|
+
referenceValues: [],
|
|
103
|
+
};
|
|
104
|
+
this.formControl.setValue(valueToSet, { emitEvent: false });
|
|
105
|
+
this.selectedValueIds = [defaultValueDto.id];
|
|
106
|
+
this.selectedValue = valueToSet;
|
|
107
|
+
this.updateSelectedValueText();
|
|
108
|
+
this.cdRef.markForCheck();
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this.updateSelectedValueText();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.warn('Dictionary data not preloaded, falling back to API call for:', this.dictionaryId);
|
|
116
|
+
this.dictionaryService
|
|
117
|
+
.getDictionary(this.dictionaryId, EnvironmentType.Config)
|
|
118
|
+
.pipe(take(1))
|
|
119
|
+
.subscribe((dto) => {
|
|
120
|
+
const defaultValueDto = dto.values?.find((v) => v.id === dictionaryDefaultValueId);
|
|
121
|
+
if (defaultValueDto) {
|
|
122
|
+
const valueToSet = {
|
|
123
|
+
id: defaultValueDto.id,
|
|
124
|
+
name: defaultValueDto.name,
|
|
125
|
+
translations: defaultValueDto.valueTranslations?.map((t) => {
|
|
126
|
+
const languages = this.props['languages'];
|
|
127
|
+
const lang = languages?.find((l) => l.id === t.languageId);
|
|
128
|
+
return {
|
|
129
|
+
languageId: t.languageId,
|
|
130
|
+
languageIso: lang?.iso ?? '',
|
|
131
|
+
value: t.value,
|
|
132
|
+
};
|
|
133
|
+
}) || [],
|
|
134
|
+
active: defaultValueDto.active,
|
|
135
|
+
locked: defaultValueDto.locked,
|
|
136
|
+
childDictionaryId: defaultValueDto.childDictionaryId,
|
|
137
|
+
childDictionaryUUID: defaultValueDto.childDictionaryUUID,
|
|
138
|
+
referenceValues: [],
|
|
139
|
+
};
|
|
140
|
+
this.formControl.setValue(valueToSet, { emitEvent: false });
|
|
141
|
+
this.selectedValueIds = [defaultValueDto.id];
|
|
142
|
+
this.selectedValue = valueToSet;
|
|
143
|
+
this.updateSelectedValueText();
|
|
144
|
+
this.cdRef.markForCheck();
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
this.updateSelectedValueText();
|
|
148
|
+
}
|
|
149
|
+
}, (error) => {
|
|
150
|
+
console.error('Formly Dict: Failed to fetch details for default value', error);
|
|
151
|
+
this.updateSelectedValueText();
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
this.updateSelectedValueText();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
ngOnChanges(changes) {
|
|
160
|
+
if (changes['model'] || changes['formControl']) {
|
|
161
|
+
this.updateSelectedValueIds();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
updateSelectedValueIds() {
|
|
165
|
+
const modelValue = this.formControl?.value;
|
|
166
|
+
if (modelValue && Array.isArray(modelValue.selectedValueIds)) {
|
|
167
|
+
this.selectedValueIds = modelValue.selectedValueIds;
|
|
168
|
+
}
|
|
169
|
+
else if (modelValue && modelValue.id) {
|
|
170
|
+
this.selectedValueIds = [modelValue.id];
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
onSelectedValueChanged(dictionaryValue) {
|
|
174
|
+
if (this.props['onSelectedValueChanged']) {
|
|
175
|
+
this.props['onSelectedValueChanged'](dictionaryValue);
|
|
176
|
+
}
|
|
177
|
+
this.updateSelectedValueText();
|
|
178
|
+
}
|
|
179
|
+
onSelectedDictionaryValuesChanged(values) {
|
|
180
|
+
if (values && values.length > 0) {
|
|
181
|
+
this.selectedValue = values[0];
|
|
182
|
+
if (this.autocompleteTrigger) {
|
|
183
|
+
this.autocompleteTrigger.closePanel();
|
|
184
|
+
}
|
|
185
|
+
this.onSelectedValueChanged(this.selectedValue);
|
|
186
|
+
if (this.autoInput) {
|
|
187
|
+
this.autoInput.nativeElement.value = this.filteredText = '';
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
filterChanged($event) {
|
|
192
|
+
if ($event.target) {
|
|
193
|
+
this.filteredText = $event.target.value;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
toggleAutocomplete(event) {
|
|
197
|
+
event.stopPropagation();
|
|
198
|
+
if (this.autocompleteTrigger) {
|
|
199
|
+
if (this.autocompleteTrigger.panelOpen) {
|
|
200
|
+
this.autocompleteTrigger.closePanel();
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
this.autocompleteTrigger.openPanel();
|
|
204
|
+
if (this.autoInput) {
|
|
205
|
+
this.autoInput.nativeElement.focus();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
openAutocomplete() {
|
|
211
|
+
if (this.autocompleteTrigger && !this.autocompleteTrigger.panelOpen) {
|
|
212
|
+
this.autocompleteTrigger.openPanel();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
updateSelectedValueText() {
|
|
216
|
+
if (!this.selectedValue) {
|
|
217
|
+
const formValue = this.formControl?.value;
|
|
218
|
+
if (formValue && typeof formValue === 'object' && formValue.id) {
|
|
219
|
+
this.selectedValue = formValue;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
const specificData = this.props?.['specificData'];
|
|
223
|
+
if (specificData && specificData.isMandatory !== true) {
|
|
224
|
+
this.props['required'] = specificData.isMandatory;
|
|
225
|
+
this.formControl.updateValueAndValidity();
|
|
226
|
+
this.formControl.setErrors(null);
|
|
227
|
+
}
|
|
228
|
+
this.selectedValueText = '';
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const translation = this.selectedValue.translations?.find((t) => t.languageId === this.currentLanguageId ||
|
|
233
|
+
t.languageIso === this.currentLanguageIso);
|
|
234
|
+
if (translation) {
|
|
235
|
+
this.selectedValueText = translation.value;
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
this.selectedValueText = this.selectedValue.name || '';
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
getDictionaryLabel(dictionaryId) {
|
|
242
|
+
return this.dictionaryLabels[dictionaryId] || '';
|
|
243
|
+
}
|
|
244
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyDictionaryDropdownTreeComponent, deps: [{ token: i1.DictionaryService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
245
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyDictionaryDropdownTreeComponent, selector: "formly-dictionary-dropdown-tree", inputs: { dictionaryId: "dictionaryId" }, outputs: { selectedValue: "selectedValue" }, viewQueries: [{ propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autoInput", first: true, predicate: ["autoInput"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<form>\n <mat-label class=\"component-data-label m-l-2\" [ngStyle]=\"labelStyle\">\n {{ label }}</mat-label\n >\n <mat-form-field class=\"full-width\">\n <input\n type=\"text\"\n placeholder=\"{{ selectedValueText }}\"\n #autoInput\n aria-label=\"Text\"\n matInput\n [matAutocomplete]=\"auto\"\n (input)=\"filterChanged($event)\"\n (focus)=\"openAutocomplete()\"\n />\n <mat-icon matSuffix (click)=\"toggleAutocomplete($event)\"\n >keyboard_arrow_down</mat-icon\n >\n <mat-autocomplete\n #matAutocomplete=\"matAutocomplete\"\n #auto=\"matAutocomplete\"\n autoActiveFirstOption\n (optionSelected)=\"\n onSelectedDictionaryValuesChanged([$event.option.value])\n \"\n >\n <mat-option disabled>{{\n formlyKeys.selectAnItem | translate\n }}</mat-option>\n <app-dictionaries-tree\n [allowCheckItems]=\"false\"\n [drawReferenceDictionariesAsSeparateNode]=\"false\"\n [drawChildDictionariesAsSeparateNode]=\"false\"\n [drawRootNode]=\"false\"\n [filterText]=\"filteredText\"\n [allowSelectNonLeafNodes]=\"true\"\n [selectedValueIds]=\"selectedValueIds\"\n [languageId]=\"currentLanguageId\"\n [valuesIdsToShow]=\"valuesIdsToShow\"\n [selectedRelatedDictionaries]=\"selectedRelatedDictionaries\"\n [dictionaryLabels]=\"dictionaryLabels\"\n [preloadedDictionary]=\"preloadedDictionary\"\n [preloadedDictionaries]=\"preloadedDictionaries\"\n [usePreloadedData]=\"usePreloadedData\"\n (selectedDictionaryValuesChanged)=\"\n onSelectedDictionaryValuesChanged($event)\n \"\n >\n </app-dictionaries-tree>\n </mat-autocomplete>\n </mat-form-field>\n\n <formly-validation-message *ngIf=\"showError\" [field]=\"field\">\n </formly-validation-message>\n</form>\n", styles: ["formly-validation-message{color:red;font-size:12px}::ng-deep .mat-mdc-autocomplete-panel>app-dictionaries-tree>app-treeview>cdk-virtual-scroll-viewport{overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.ɵFormlyValidationMessage, selector: "formly-validation-message", inputs: ["field"] }, { kind: "component", type: i10.DictionariesTreeComponent, selector: "app-dictionaries-tree", inputs: ["dictionaryId", "selectedValueIds", "allowCheckItems", "allowFilter", "drawReferenceDictionariesAsSeparateNode", "drawChildDictionariesAsSeparateNode", "drawRootNode", "filterText", "allowSelectNonLeafNodes", "languageId", "valuesIdsToShow", "hideParentArrow", "preloadedDictionary", "preloadedDictionaries", "usePreloadedData"], outputs: ["selectedDictionaryValuesChanged"] }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }] }); }
|
|
246
|
+
}
|
|
247
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyDictionaryDropdownTreeComponent, decorators: [{
|
|
248
|
+
type: Component,
|
|
249
|
+
args: [{ selector: 'formly-dictionary-dropdown-tree', template: "<form>\n <mat-label class=\"component-data-label m-l-2\" [ngStyle]=\"labelStyle\">\n {{ label }}</mat-label\n >\n <mat-form-field class=\"full-width\">\n <input\n type=\"text\"\n placeholder=\"{{ selectedValueText }}\"\n #autoInput\n aria-label=\"Text\"\n matInput\n [matAutocomplete]=\"auto\"\n (input)=\"filterChanged($event)\"\n (focus)=\"openAutocomplete()\"\n />\n <mat-icon matSuffix (click)=\"toggleAutocomplete($event)\"\n >keyboard_arrow_down</mat-icon\n >\n <mat-autocomplete\n #matAutocomplete=\"matAutocomplete\"\n #auto=\"matAutocomplete\"\n autoActiveFirstOption\n (optionSelected)=\"\n onSelectedDictionaryValuesChanged([$event.option.value])\n \"\n >\n <mat-option disabled>{{\n formlyKeys.selectAnItem | translate\n }}</mat-option>\n <app-dictionaries-tree\n [allowCheckItems]=\"false\"\n [drawReferenceDictionariesAsSeparateNode]=\"false\"\n [drawChildDictionariesAsSeparateNode]=\"false\"\n [drawRootNode]=\"false\"\n [filterText]=\"filteredText\"\n [allowSelectNonLeafNodes]=\"true\"\n [selectedValueIds]=\"selectedValueIds\"\n [languageId]=\"currentLanguageId\"\n [valuesIdsToShow]=\"valuesIdsToShow\"\n [selectedRelatedDictionaries]=\"selectedRelatedDictionaries\"\n [dictionaryLabels]=\"dictionaryLabels\"\n [preloadedDictionary]=\"preloadedDictionary\"\n [preloadedDictionaries]=\"preloadedDictionaries\"\n [usePreloadedData]=\"usePreloadedData\"\n (selectedDictionaryValuesChanged)=\"\n onSelectedDictionaryValuesChanged($event)\n \"\n >\n </app-dictionaries-tree>\n </mat-autocomplete>\n </mat-form-field>\n\n <formly-validation-message *ngIf=\"showError\" [field]=\"field\">\n </formly-validation-message>\n</form>\n", styles: ["formly-validation-message{color:red;font-size:12px}::ng-deep .mat-mdc-autocomplete-panel>app-dictionaries-tree>app-treeview>cdk-virtual-scroll-viewport{overflow:hidden}\n"] }]
|
|
250
|
+
}], ctorParameters: () => [{ type: i1.DictionaryService }, { type: i0.ChangeDetectorRef }], propDecorators: { autocompleteTrigger: [{
|
|
251
|
+
type: ViewChild,
|
|
252
|
+
args: [MatAutocompleteTrigger]
|
|
253
|
+
}], autoInput: [{
|
|
254
|
+
type: ViewChild,
|
|
255
|
+
args: ['autoInput']
|
|
256
|
+
}], dictionaryId: [{
|
|
257
|
+
type: Input
|
|
258
|
+
}], selectedValue: [{
|
|
259
|
+
type: Output
|
|
260
|
+
}] } });
|
|
261
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LWRpY3Rpb25hcnktZHJvcGRvd24tdHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL2Zvcm1seS9mb3JtbHktZGljdGlvbmFyeS1kcm9wZG93bi10cmVlL2Zvcm1seS1kaWN0aW9uYXJ5LWRyb3Bkb3duLXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LWRpY3Rpb25hcnktZHJvcGRvd24tdHJlZS9mb3JtbHktZGljdGlvbmFyeS1kcm9wZG93bi10cmVlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQVFuRCxNQUFNLE9BQU8scUNBQ1gsU0FBUSxTQUFTO0lBeUJqQixZQUNVLGlCQUFvQyxFQUNwQyxLQUF3QjtRQUVoQyxLQUFLLEVBQUUsQ0FBQztRQUhBLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFsQmxDLGVBQVUsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBSTlCLHNCQUFpQixHQUFXLEVBQUUsQ0FBQztRQUMvQixlQUFV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TUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUN2RCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osQ0FBQyxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsaUJBQWlCO1lBQ3ZDLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUM1QyxDQUFDO1FBQ0YsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUM3QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxZQUFvQjtRQUNyQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkQsQ0FBQzsrR0EvUlUscUNBQXFDO21HQUFyQyxxQ0FBcUMsbU5BSXJDLHNCQUFzQixxTEM3Qm5DLGkzREF1REE7OzRGRDlCYSxxQ0FBcUM7a0JBTGpELFNBQVM7K0JBQ0UsaUNBQWlDO3NIQVMzQyxtQkFBbUI7c0JBRGxCLFNBQVM7dUJBQUMsc0JBQXNCO2dCQUVULFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDYixZQUFZO3NCQUFwQixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGljdGlvbmFyeVZhbHVlLCBUcmFuc2xhdGlvbkR0bywgVHJhbnNsYXRpb24sIERpY3Rpb25hcnlWYWx1ZUR0bywgRGljdGlvbmFyeUR0byB9IGZyb20gJy4uLy4uL21vZGVscy9kaWN0aW9uYXJ5Lm1vZGVsJztcbmltcG9ydCB7IExhbmd1YWdlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2xhbmd1YWdlLm1vZGVsJztcbmltcG9ydCB7IEVudmlyb25tZW50VHlwZSB9IGZyb20gJy4uLy4uL290aGVycy9lbnZpcm9ubWVudC10eXBlJztcbmltcG9ydCB7IERpY3Rpb25hcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGljdGlvbmFyeS5zZXJ2aWNlJztcbmltcG9ydCB7IExhYmVsS2V5cyB9IGZyb20gJy4uLy4uL2VudW1zL2xhYmVsLmtleXMnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Zvcm1seS1kaWN0aW9uYXJ5LWRyb3Bkb3duLXRyZWUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybWx5LWRpY3Rpb25hcnktZHJvcGRvd24tdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm1seS1kaWN0aW9uYXJ5LWRyb3Bkb3duLXRyZWUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybWx5RGljdGlvbmFyeURyb3Bkb3duVHJlZUNvbXBvbmVudFxuICBleHRlbmRzIEZpZWxkVHlwZVxuICBpbXBsZW1lbnRzIE9uSW5pdFxue1xuICBAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpXG4gIGF1dG9jb21wbGV0ZVRyaWdnZXI6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXI7XG4gIEBWaWV3Q2hpbGQoJ2F1dG9JbnB1dCcpIGF1dG9JbnB1dDogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgZGljdGlvbmFyeUlkOiBzdHJpbmc7XG4gIEBPdXRwdXQoKSBzZWxlY3RlZFZhbHVlOiBEaWN0aW9uYXJ5VmFsdWU7XG4gIGZpbHRlcmVkVGV4dDogc3RyaW5nO1xuICBmb3JtbHlLZXlzID0gTGFiZWxLZXlzLmZvcm1seTtcbiAgbGFiZWw6IHN0cmluZztcbiAgY3VycmVudExhbmd1YWdlSXNvOiBzdHJpbmc7XG4gIGN1cnJlbnRMYW5ndWFnZUlkOiBudW1iZXI7XG4gIHNlbGVjdGVkVmFsdWVUZXh0OiBzdHJpbmcgPSAnJztcbiAgbGFiZWxTdHlsZTogYW55ID0ge307XG4gIHNlbGVjdGVkVmFsdWVJZHM6IG51bWJlcltdID0gW107XG4gIHZhbHVlc0lkc1RvU2hvdzogbnVtYmVyW10gPSBbXTtcbiAgc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBkaWN0aW9uYXJ5TGFiZWxzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgLy8gTkVXOiBQcm9wZXJ0aWVzIGZvciBwcmVsb2FkZWQgZGljdGlvbmFyeSBkYXRhXG4gIHByZWxvYWRlZERpY3Rpb25hcnk6IERpY3Rpb25hcnlEdG8gfCBudWxsID0gbnVsbDtcbiAgcHJlbG9hZGVkRGljdGlvbmFyaWVzOiBNYXA8c3RyaW5nLCBEaWN0aW9uYXJ5RHRvPiB8IG51bGwgPSBudWxsO1xuICB1c2VQcmVsb2FkZWREYXRhOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkaWN0aW9uYXJ5U2VydmljZTogRGljdGlvbmFyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzWydkaWN0aW9uYXJ5SWQnXSkge1xuICAgICAgdGhpcy5kaWN0aW9uYXJ5SWQgPSB0aGlzLnByb3BzWydkaWN0aW9uYXJ5SWQnXTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvcHNbJ3ZhbHVlc0lkc1RvU2hvdyddKSB7XG4gICAgICB0aGlzLnZhbHVlc0lkc1RvU2hvdyA9IHRoaXMucHJvcHNbJ3ZhbHVlc0lkc1RvU2hvdyddO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wc1sndmFsdWUnXSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlVGV4dCA9IHRoaXMucHJvcHNbJ3ZhbHVlJ107XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzWydzZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMnXSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMgPVxuICAgICAgICB0aGlzLnByb3BzWydzZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMnXTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvcHNbJ2RpY3Rpb25hcnlMYWJlbHMnXSkge1xuICAgICAgdGhpcy5kaWN0aW9uYXJ5TGFiZWxzID0gdGhpcy5wcm9wc1snZGljdGlvbmFyeUxhYmVscyddO1xuICAgIH1cblxuICAgIC8vIE5FVzogSW5pdGlhbGl6ZSBwcmVsb2FkZWQgZGljdGlvbmFyeSBkYXRhXG4gICAgaWYgKHRoaXMucHJvcHNbJ2RpY3Rpb25hcnlEYXRhJ10pIHtcbiAgICAgIHRoaXMucHJlbG9hZGVkRGljdGlvbmFyeSA9IHRoaXMucHJvcHNbJ2RpY3Rpb25hcnlEYXRhJ107XG4gICAgICB0aGlzLnVzZVByZWxvYWRlZERhdGEgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wc1sncHJlbG9hZGVkRGljdGlvbmFyaWVzJ10pIHtcbiAgICAgIHRoaXMucHJlbG9hZGVkRGljdGlvbmFyaWVzID0gdGhpcy5wcm9wc1sncHJlbG9hZGVkRGljdGlvbmFyaWVzJ107XG4gICAgfVxuXG4gICAgdGhpcy5sYWJlbCA9IHRoaXMucHJvcHNbJ2xhYmVsJ10gYXMgc3RyaW5nO1xuICAgIGlmICh0aGlzLnByb3BzLnJlcXVpcmVkKSB7XG4gICAgICB0aGlzLmxhYmVsICs9ICcgKic7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvID0gdGhpcy5wcm9wc1snY3VycmVudExhbmd1YWdlSXNvJ10gYXMgc3RyaW5nO1xuICAgIHRoaXMuY3VycmVudExhbmd1YWdlSWQgPSB0aGlzLnByb3BzWydjdXJyZW50TGFuZ3VhZ2VJZCddIGFzIG51bWJlcjtcblxuICAgIGlmICh0aGlzLnByb3BzWydkZXNpZ24nXSkge1xuICAgICAgdGhpcy5sYWJlbFN0eWxlID0gdGhpcy5wcm9wc1snZGVzaWduJ11bJy5jb21wb25lbnQtZGF0YS1sYWJlbCddIHx8IHt9O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLnByb3BzWydzZWxlY3RlZFZhbHVlSWRzJ10gJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5wcm9wc1snc2VsZWN0ZWRWYWx1ZUlkcyddKVxuICAgICkge1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlSWRzID0gdGhpcy5wcm9wc1snc2VsZWN0ZWRWYWx1ZUlkcyddO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxDb250cm9sVmFsdWUgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlO1xuICAgIGNvbnN0IGRpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZCA9IHRoaXMucHJvcHNbJ2RpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZCddIGFzXG4gICAgICB8IG51bWJlclxuICAgICAgfCBudWxsO1xuXG4gICAgaWYgKFxuICAgICAgaW5pdGlhbENvbnRyb2xWYWx1ZSA9PSBudWxsICYmXG4gICAgICBkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWQgIT0gbnVsbCAmJlxuICAgICAgdGhpcy5kaWN0aW9uYXJ5SWRcbiAgICApIHtcbiAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB0aGlzLnByb3BzWydkaWN0aW9uYXJ5RGF0YSddO1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWQsIHtcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGljdGlvbmFyeSkge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWVEdG8gPSBkaWN0aW9uYXJ5LnZhbHVlcz8uZmluZChcbiAgICAgICAgICAodjogRGljdGlvbmFyeVZhbHVlRHRvKSA9PiB2LmlkID09PSBkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZUR0bykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlVG9TZXQ6IERpY3Rpb25hcnlWYWx1ZSA9IHtcbiAgICAgICAgICAgIGlkOiBkZWZhdWx0VmFsdWVEdG8uaWQsXG4gICAgICAgICAgICBuYW1lOiBkZWZhdWx0VmFsdWVEdG8ubmFtZSxcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uczpcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlRHRvLnZhbHVlVHJhbnNsYXRpb25zPy5tYXAoXG4gICAgICAgICAgICAgICAgKHQ6IFRyYW5zbGF0aW9uRHRvKTogVHJhbnNsYXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbGFuZ3VhZ2VzID0gdGhpcy5wcm9wc1snbGFuZ3VhZ2VzJ10gYXNcbiAgICAgICAgICAgICAgICAgICAgfCBMYW5ndWFnZVtdXG4gICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbGFuZyA9IGxhbmd1YWdlcz8uZmluZCgobCkgPT4gbC5pZCA9PT0gdC5sYW5ndWFnZUlkKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlSWQ6IHQubGFuZ3VhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VJc286IGxhbmc/LmlzbyA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKSB8fCBbXSxcbiAgICAgICAgICAgIGFjdGl2ZTogZGVmYXVsdFZhbHVlRHRvLmFjdGl2ZSxcbiAgICAgICAgICAgIGxvY2tlZDogZGVmYXVsdFZhbHVlRHRvLmxvY2tlZCxcbiAgICAgICAgICAgIGNoaWxkRGljdGlvbmFyeUlkOiBkZWZhdWx0VmFsdWVEdG8uY2hpbGREaWN0aW9uYXJ5SWQsXG4gICAgICAgICAgICBjaGlsZERpY3Rpb25hcnlVVUlEOiBkZWZhdWx0VmFsdWVEdG8uY2hpbGREaWN0aW9uYXJ5VVVJRCxcbiAgICAgICAgICAgIHJlZmVyZW5jZVZhbHVlczogW10sXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWVUb1NldCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZUlkcyA9IFtkZWZhdWx0VmFsdWVEdG8uaWRdO1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlVG9TZXQ7XG4gICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZFZhbHVlVGV4dCgpO1xuICAgICAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZFZhbHVlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ0RpY3Rpb25hcnkgZGF0YSBub3QgcHJlbG9hZGVkLCBmYWxsaW5nIGJhY2sgdG8gQVBJIGNhbGwgZm9yOicsXG4gICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5SWRcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlXG4gICAgICAgICAgLmdldERpY3Rpb25hcnkodGhpcy5kaWN0aW9uYXJ5SWQsIEVudmlyb25tZW50VHlwZS5Db25maWcpXG4gICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKGR0bykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWVEdG8gPSBkdG8udmFsdWVzPy5maW5kKFxuICAgICAgICAgICAgICAgICh2OiBEaWN0aW9uYXJ5VmFsdWVEdG8pID0+IHYuaWQgPT09IGRpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlRHRvKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVUb1NldDogRGljdGlvbmFyeVZhbHVlID0ge1xuICAgICAgICAgICAgICAgICAgaWQ6IGRlZmF1bHRWYWx1ZUR0by5pZCxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGRlZmF1bHRWYWx1ZUR0by5uYW1lLFxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25zOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWVEdG8udmFsdWVUcmFuc2xhdGlvbnM/Lm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAodDogVHJhbnNsYXRpb25EdG8pOiBUcmFuc2xhdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYW5ndWFnZXMgPSB0aGlzLnByb3BzWydsYW5ndWFnZXMnXSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICB8IExhbmd1YWdlW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYW5nID0gbGFuZ3VhZ2VzPy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAobCkgPT4gbC5pZCA9PT0gdC5sYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VJZDogdC5sYW5ndWFnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZUlzbzogbGFuZz8uaXNvID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApIHx8IFtdLFxuICAgICAgICAgICAgICAgICAgYWN0aXZlOiBkZWZhdWx0VmFsdWVEdG8uYWN0aXZlLFxuICAgICAgICAgICAgICAgICAgbG9ja2VkOiBkZWZhdWx0VmFsdWVEdG8ubG9ja2VkLFxuICAgICAgICAgICAgICAgICAgY2hpbGREaWN0aW9uYXJ5SWQ6IGRlZmF1bHRWYWx1ZUR0by5jaGlsZERpY3Rpb25hcnlJZCxcbiAgICAgICAgICAgICAgICAgIGNoaWxkRGljdGlvbmFyeVVVSUQ6IGRlZmF1bHRWYWx1ZUR0by5jaGlsZERpY3Rpb25hcnlVVUlELFxuICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlVmFsdWVzOiBbXSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZVRvU2V0LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlSWRzID0gW2RlZmF1bHRWYWx1ZUR0by5pZF07XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdmFsdWVUb1NldDtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkVmFsdWVUZXh0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkVmFsdWVUZXh0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAnRm9ybWx5IERpY3Q6IEZhaWxlZCB0byBmZXRjaCBkZXRhaWxzIGZvciBkZWZhdWx0IHZhbHVlJyxcbiAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkVmFsdWVUZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZFZhbHVlVGV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snbW9kZWwnXSB8fCBjaGFuZ2VzWydmb3JtQ29udHJvbCddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkVmFsdWVJZHMoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVTZWxlY3RlZFZhbHVlSWRzKCk6IHZvaWQge1xuICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB0aGlzLmZvcm1Db250cm9sPy52YWx1ZTtcblxuICAgIGlmIChtb2RlbFZhbHVlICYmIEFycmF5LmlzQXJyYXkobW9kZWxWYWx1ZS5zZWxlY3RlZFZhbHVlSWRzKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlSWRzID0gbW9kZWxWYWx1ZS5zZWxlY3RlZFZhbHVlSWRzO1xuICAgIH0gZWxzZSBpZiAobW9kZWxWYWx1ZSAmJiBtb2RlbFZhbHVlLmlkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWVJZHMgPSBbbW9kZWxWYWx1ZS5pZF07XG4gICAgfVxuICB9XG5cbiAgb25TZWxlY3RlZFZhbHVlQ2hhbmdlZChkaWN0aW9uYXJ5VmFsdWU6IERpY3Rpb25hcnlWYWx1ZSkge1xuICAgIGlmICh0aGlzLnByb3BzWydvblNlbGVjdGVkVmFsdWVDaGFuZ2VkJ10pIHtcbiAgICAgIHRoaXMucHJvcHNbJ29uU2VsZWN0ZWRWYWx1ZUNoYW5nZWQnXShkaWN0aW9uYXJ5VmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkVmFsdWVUZXh0KCk7XG4gIH1cblxuICBvblNlbGVjdGVkRGljdGlvbmFyeVZhbHVlc0NoYW5nZWQodmFsdWVzOiBEaWN0aW9uYXJ5VmFsdWVbXSkge1xuICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlc1swXTtcbiAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXIpIHtcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVUcmlnZ2VyLmNsb3NlUGFuZWwoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25TZWxlY3RlZFZhbHVlQ2hhbmdlZCh0aGlzLnNlbGVjdGVkVmFsdWUpO1xuXG4gICAgICBpZiAodGhpcy5hdXRvSW5wdXQpIHtcbiAgICAgICAgdGhpcy5hdXRvSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuZmlsdGVyZWRUZXh0ID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyQ2hhbmdlZCgkZXZlbnQ6IGFueSkge1xuICAgIGlmICgkZXZlbnQudGFyZ2V0KSB7XG4gICAgICB0aGlzLmZpbHRlcmVkVGV4dCA9ICRldmVudC50YXJnZXQudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlQXV0b2NvbXBsZXRlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlcikge1xuICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlci5wYW5lbE9wZW4pIHtcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVUcmlnZ2VyLmNsb3NlUGFuZWwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlci5vcGVuUGFuZWwoKTtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0lucHV0KSB7XG4gICAgICAgICAgdGhpcy5hdXRvSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3BlbkF1dG9jb21wbGV0ZSgpIHtcbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGVUcmlnZ2VyICYmICF0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXIucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXIub3BlblBhbmVsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3RlZFZhbHVlVGV4dCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb3JtQ29udHJvbD8udmFsdWU7XG4gICAgICBpZiAoZm9ybVZhbHVlICYmIHR5cGVvZiBmb3JtVmFsdWUgPT09ICdvYmplY3QnICYmIGZvcm1WYWx1ZS5pZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSBmb3JtVmFsdWUgYXMgRGljdGlvbmFyeVZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3BlY2lmaWNEYXRhID0gdGhpcy5wcm9wcz8uWydzcGVjaWZpY0RhdGEnXTtcbiAgICAgICAgaWYgKHNwZWNpZmljRGF0YSAmJiBzcGVjaWZpY0RhdGEuaXNNYW5kYXRvcnkgIT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLnByb3BzWydyZXF1aXJlZCddID0gc3BlY2lmaWNEYXRhLmlzTWFuZGF0b3J5O1xuICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZVRleHQgPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5zZWxlY3RlZFZhbHVlLnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICh0KSA9PlxuICAgICAgICB0Lmxhbmd1YWdlSWQgPT09IHRoaXMuY3VycmVudExhbmd1YWdlSWQgfHxcbiAgICAgICAgdC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICApO1xuICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlVGV4dCA9IHRyYW5zbGF0aW9uLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWVUZXh0ID0gdGhpcy5zZWxlY3RlZFZhbHVlLm5hbWUgfHwgJyc7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGljdGlvbmFyeUxhYmVsKGRpY3Rpb25hcnlJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5TGFiZWxzW2RpY3Rpb25hcnlJZF0gfHwgJyc7XG4gIH1cbn1cbiIsIjxmb3JtPlxuICA8bWF0LWxhYmVsIGNsYXNzPVwiY29tcG9uZW50LWRhdGEtbGFiZWwgbS1sLTJcIiBbbmdTdHlsZV09XCJsYWJlbFN0eWxlXCI+XG4gICAge3sgbGFiZWwgfX08L21hdC1sYWJlbFxuICA+XG4gIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHBsYWNlaG9sZGVyPVwie3sgc2VsZWN0ZWRWYWx1ZVRleHQgfX1cIlxuICAgICAgI2F1dG9JbnB1dFxuICAgICAgYXJpYS1sYWJlbD1cIlRleHRcIlxuICAgICAgbWF0SW5wdXRcbiAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAoaW5wdXQpPVwiZmlsdGVyQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgIChmb2N1cyk9XCJvcGVuQXV0b2NvbXBsZXRlKClcIlxuICAgIC8+XG4gICAgPG1hdC1pY29uIG1hdFN1ZmZpeCAoY2xpY2spPVwidG9nZ2xlQXV0b2NvbXBsZXRlKCRldmVudClcIlxuICAgICAgPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uXG4gICAgPlxuICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAjbWF0QXV0b2NvbXBsZXRlPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgIGF1dG9BY3RpdmVGaXJzdE9wdGlvblxuICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIlxuICAgICAgICBvblNlbGVjdGVkRGljdGlvbmFyeVZhbHVlc0NoYW5nZWQoWyRldmVudC5vcHRpb24udmFsdWVdKVxuICAgICAgXCJcbiAgICA+XG4gICAgICA8bWF0LW9wdGlvbiBkaXNhYmxlZD57e1xuICAgICAgICBmb3JtbHlLZXlzLnNlbGVjdEFuSXRlbSB8IHRyYW5zbGF0ZVxuICAgICAgfX08L21hdC1vcHRpb24+XG4gICAgICA8YXBwLWRpY3Rpb25hcmllcy10cmVlXG4gICAgICAgIFthbGxvd0NoZWNrSXRlbXNdPVwiZmFsc2VcIlxuICAgICAgICBbZHJhd1JlZmVyZW5jZURpY3Rpb25hcmllc0FzU2VwYXJhdGVOb2RlXT1cImZhbHNlXCJcbiAgICAgICAgW2RyYXdDaGlsZERpY3Rpb25hcmllc0FzU2VwYXJhdGVOb2RlXT1cImZhbHNlXCJcbiAgICAgICAgW2RyYXdSb290Tm9kZV09XCJmYWxzZVwiXG4gICAgICAgIFtmaWx0ZXJUZXh0XT1cImZpbHRlcmVkVGV4dFwiXG4gICAgICAgIFthbGxvd1NlbGVjdE5vbkxlYWZOb2Rlc109XCJ0cnVlXCJcbiAgICAgICAgW3NlbGVjdGVkVmFsdWVJZHNdPVwic2VsZWN0ZWRWYWx1ZUlkc1wiXG4gICAgICAgIFtsYW5ndWFnZUlkXT1cImN1cnJlbnRMYW5ndWFnZUlkXCJcbiAgICAgICAgW3ZhbHVlc0lkc1RvU2hvd109XCJ2YWx1ZXNJZHNUb1Nob3dcIlxuICAgICAgICBbc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzXT1cInNlbGVjdGVkUmVsYXRlZERpY3Rpb25hcmllc1wiXG4gICAgICAgIFtkaWN0aW9uYXJ5TGFiZWxzXT1cImRpY3Rpb25hcnlMYWJlbHNcIlxuICAgICAgICBbcHJlbG9hZGVkRGljdGlvbmFyeV09XCJwcmVsb2FkZWREaWN0aW9uYXJ5XCJcbiAgICAgICAgW3ByZWxvYWRlZERpY3Rpb25hcmllc109XCJwcmVsb2FkZWREaWN0aW9uYXJpZXNcIlxuICAgICAgICBbdXNlUHJlbG9hZGVkRGF0YV09XCJ1c2VQcmVsb2FkZWREYXRhXCJcbiAgICAgICAgKHNlbGVjdGVkRGljdGlvbmFyeVZhbHVlc0NoYW5nZWQpPVwiXG4gICAgICAgICAgb25TZWxlY3RlZERpY3Rpb25hcnlWYWx1ZXNDaGFuZ2VkKCRldmVudClcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgIDwvYXBwLWRpY3Rpb25hcmllcy10cmVlPlxuICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8Zm9ybWx5LXZhbGlkYXRpb24tbWVzc2FnZSAqbmdJZj1cInNob3dFcnJvclwiIFtmaWVsZF09XCJmaWVsZFwiPlxuICA8L2Zvcm1seS12YWxpZGF0aW9uLW1lc3NhZ2U+XG48L2Zvcm0+XG4iXX0=
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { saveAs } from 'file-saver';
|
|
3
|
+
import { Utils } from '../../others/utils';
|
|
4
|
+
import { BaseFormlyControlComponent } from '../baseFormlyControlComponent';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../services/applicationData.service";
|
|
7
|
+
import * as i2 from "../../services/dialog.service";
|
|
8
|
+
import * as i3 from "@angular/common";
|
|
9
|
+
import * as i4 from "@angular/material/button";
|
|
10
|
+
import * as i5 from "@angular/material/icon";
|
|
11
|
+
import * as i6 from "@angular/material/progress-spinner";
|
|
12
|
+
import * as i7 from "../../others/translation.pipe";
|
|
13
|
+
export class FormlyDownloadDocumentsComponent extends BaseFormlyControlComponent {
|
|
14
|
+
constructor(appDataService, dialog, cdr) {
|
|
15
|
+
super(cdr);
|
|
16
|
+
this.appDataService = appDataService;
|
|
17
|
+
this.dialog = dialog;
|
|
18
|
+
}
|
|
19
|
+
onInit() {
|
|
20
|
+
if (this.isDisplayMode === true) {
|
|
21
|
+
this.getDownloadableDocuments();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
getDownloadableDocuments() {
|
|
25
|
+
const configDocs = this.controlData?.specificControlData?.documents;
|
|
26
|
+
if (configDocs) {
|
|
27
|
+
this.isLoading = true;
|
|
28
|
+
let cmd = {
|
|
29
|
+
appDataId: this.props['appDataId'],
|
|
30
|
+
controlId: this.controlData.identifier,
|
|
31
|
+
isDisplayMode: this.isDisplayMode,
|
|
32
|
+
appConfigurationUUID: this.appId,
|
|
33
|
+
environment: this.env,
|
|
34
|
+
};
|
|
35
|
+
this.appDataService.getGenerateDocuments(cmd).subscribe({
|
|
36
|
+
next: (result) => {
|
|
37
|
+
this.documents = this.orderDocumentsAsConfigured(result);
|
|
38
|
+
this.isLoading = false;
|
|
39
|
+
this.cdr.detectChanges();
|
|
40
|
+
},
|
|
41
|
+
error: (err) => {
|
|
42
|
+
this.dialog.popErrorTranslation(this.controlData.errorsTranslations, this.langIso, 'failToDownload');
|
|
43
|
+
this.isLoading = false;
|
|
44
|
+
this.cdr.detectChanges();
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
this.cdr.detectChanges();
|
|
49
|
+
}
|
|
50
|
+
orderDocumentsAsConfigured(documents) {
|
|
51
|
+
let list = [];
|
|
52
|
+
if (documents) {
|
|
53
|
+
const configuredDocuments = this.controlData?.specificControlData?.documents;
|
|
54
|
+
if (configuredDocuments) {
|
|
55
|
+
configuredDocuments.forEach((d) => {
|
|
56
|
+
const found = documents.find((f) => f.documentId === d.id);
|
|
57
|
+
if (found) {
|
|
58
|
+
list.push(found);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return list;
|
|
64
|
+
}
|
|
65
|
+
retry() {
|
|
66
|
+
this.getDownloadableDocuments();
|
|
67
|
+
}
|
|
68
|
+
onPageSelected() {
|
|
69
|
+
this.getDownloadableDocuments();
|
|
70
|
+
}
|
|
71
|
+
async downloadDocument(doc, index) {
|
|
72
|
+
this.isDownloading = true;
|
|
73
|
+
this.docIndex = index;
|
|
74
|
+
if (doc.isApiDocument === true) {
|
|
75
|
+
let apiRequest = {
|
|
76
|
+
appDataId: this.appDataId,
|
|
77
|
+
documentId: doc.documentId,
|
|
78
|
+
};
|
|
79
|
+
this.appDataService.doDocumentRequest(apiRequest).subscribe({
|
|
80
|
+
next: (docs) => {
|
|
81
|
+
if (docs?.length > 0) {
|
|
82
|
+
const match = docs.find((d) => d.documentId === doc.documentId);
|
|
83
|
+
if (match) {
|
|
84
|
+
const blob = Utils.base64toBlob(match.content);
|
|
85
|
+
saveAs(blob, match.name);
|
|
86
|
+
this.isDownloading = false;
|
|
87
|
+
this.cdr.detectChanges();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
this.dialog.popErrorTranslation(this.controlData.errorsTranslations, this.langIso, 'noDocumentsToDownload');
|
|
92
|
+
this.isDownloading = false;
|
|
93
|
+
this.cdr.detectChanges();
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
error: (err) => {
|
|
97
|
+
this.dialog.popErrorTranslation(this.controlData.errorsTranslations, this.langIso, 'failToDownload');
|
|
98
|
+
this.isDownloading = false;
|
|
99
|
+
this.cdr.detectChanges();
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this.appDataService
|
|
105
|
+
.downloadFile(this.props['appDataId'], doc.documentId, doc.fileName)
|
|
106
|
+
.subscribe({
|
|
107
|
+
next: (data) => {
|
|
108
|
+
saveAs(data, doc.fileName), (this.isDownloading = false);
|
|
109
|
+
this.cdr.detectChanges();
|
|
110
|
+
},
|
|
111
|
+
error: (err) => {
|
|
112
|
+
this.dialog.popErrorTranslation(this.controlData.errorsTranslations, this.langIso, 'failToDownload');
|
|
113
|
+
this.isDownloading = false;
|
|
114
|
+
this.cdr.detectChanges();
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyDownloadDocumentsComponent, deps: [{ token: i1.ApplicationDataService }, { token: i2.DialogService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
120
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyDownloadDocumentsComponent, selector: "app-formly-download-documents", usesInheritance: true, ngImport: i0, template: "<p *ngIf=\"title\">\n {{ title }}\n</p>\n<p *ngIf=\"isLoading === false && (!documents || documents.length === 0)\">\n {{ getErrorTranslationMessage(\"noDocumentsToDownload\") }}\n</p>\n<mat-spinner *ngIf=\"isLoading === true\" class=\"m-x-auto\"></mat-spinner>\n<table *ngIf=\"isLoading === false && documents\">\n <thead class=\"table-head\">\n <tr>\n <th>\n {{ \"document\" | translate }}\n </th>\n <th>\n {{ \"common.actions.download\" | translate }}\n </th>\n </tr>\n </thead>\n <tbody class=\"table-detail\">\n <tr *ngFor=\"let doc of documents; let i = index\">\n <td class=\"text-center\">\n {{ doc.name }}\n </td>\n <td class=\"text-center d-flex justify-content-center align-items-center\">\n <button\n (click)=\"downloadDocument(doc, i)\"\n mat-stroked-button\n color=\"primary\"\n class=\"custom-field\"\n >\n <mat-icon>download</mat-icon>\n {{ \"common.actions.download\" | translate }}\n </button>\n <div class=\"m-x-1 upload-spinner\">\n <mat-spinner\n *ngIf=\"isDownloading && docIndex === i\"\n mode=\"indeterminate\"\n [diameter]=\"30\"\n ></mat-spinner>\n </div>\n </td>\n </tr>\n </tbody>\n</table>\n", styles: [".upload-spinner{width:30px!important}\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.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }] }); }
|
|
121
|
+
}
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyDownloadDocumentsComponent, decorators: [{
|
|
123
|
+
type: Component,
|
|
124
|
+
args: [{ selector: 'app-formly-download-documents', template: "<p *ngIf=\"title\">\n {{ title }}\n</p>\n<p *ngIf=\"isLoading === false && (!documents || documents.length === 0)\">\n {{ getErrorTranslationMessage(\"noDocumentsToDownload\") }}\n</p>\n<mat-spinner *ngIf=\"isLoading === true\" class=\"m-x-auto\"></mat-spinner>\n<table *ngIf=\"isLoading === false && documents\">\n <thead class=\"table-head\">\n <tr>\n <th>\n {{ \"document\" | translate }}\n </th>\n <th>\n {{ \"common.actions.download\" | translate }}\n </th>\n </tr>\n </thead>\n <tbody class=\"table-detail\">\n <tr *ngFor=\"let doc of documents; let i = index\">\n <td class=\"text-center\">\n {{ doc.name }}\n </td>\n <td class=\"text-center d-flex justify-content-center align-items-center\">\n <button\n (click)=\"downloadDocument(doc, i)\"\n mat-stroked-button\n color=\"primary\"\n class=\"custom-field\"\n >\n <mat-icon>download</mat-icon>\n {{ \"common.actions.download\" | translate }}\n </button>\n <div class=\"m-x-1 upload-spinner\">\n <mat-spinner\n *ngIf=\"isDownloading && docIndex === i\"\n mode=\"indeterminate\"\n [diameter]=\"30\"\n ></mat-spinner>\n </div>\n </td>\n </tr>\n </tbody>\n</table>\n", styles: [".upload-spinner{width:30px!important}\n"] }]
|
|
125
|
+
}], ctorParameters: () => [{ type: i1.ApplicationDataService }, { type: i2.DialogService }, { type: i0.ChangeDetectorRef }] });
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LWRvd25sb2FkLWRvY3VtZW50cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL2Zvcm1seS9mb3JtbHktZG93bmxvYWQtZG9jdW1lbnRzL2Zvcm1seS1kb3dubG9hZC1kb2N1bWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LWRvd25sb2FkLWRvY3VtZW50cy9mb3JtbHktZG93bmxvYWQtZG9jdW1lbnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUTdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7QUFPM0UsTUFBTSxPQUFPLGdDQUFpQyxTQUFRLDBCQUEwQjtJQUk5RSxZQUNVLGNBQXNDLEVBQ3RDLE1BQXFCLEVBQzdCLEdBQXNCO1FBRXRCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUpILG1CQUFjLEdBQWQsY0FBYyxDQUF3QjtRQUN0QyxXQUFNLEdBQU4sTUFBTSxDQUFlO0lBSS9CLENBQUM7SUFFUSxNQUFNO1FBQ2IsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxDQUFDO1FBQ3BFLElBQUks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QUFjO2lCQUNoQixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUM7aUJBQ25FLFNBQVMsQ0FBQztnQkFDVCxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDYixNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLENBQUM7b0JBQ3pELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzNCLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFDbkMsSUFBSSxDQUFDLE9BQU8sRUFDWixnQkFBZ0IsQ0FDakIsQ0FBQztvQkFDRixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztvQkFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDSCxDQUFDOytHQXRJVSxnQ0FBZ0M7bUdBQWhDLGdDQUFnQyw0RkNqQjdDLDZ6Q0E0Q0E7OzRGRDNCYSxnQ0FBZ0M7a0JBTDVDLFNBQVM7K0JBQ0UsK0JBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25EYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcGxpY2F0aW9uRGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gICAgQXBpRG9jdW1lbnRSZXF1ZXN0LFxuICBBcHBsaWNhdGlvbkdldEdlbmVyYXRlZERvY3VtZW50c0R0byxcbiAgR2VuZXJhdGVkRG9jdW1lbnQsXG59IGZyb20gJy4uLy4uL21vZGVscy9hcHBsaWNhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL290aGVycy91dGlscyc7XG5pbXBvcnQgeyBCYXNlRm9ybWx5Q29udHJvbENvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2VGb3JtbHlDb250cm9sQ29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWZvcm1seS1kb3dubG9hZC1kb2N1bWVudHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybWx5LWRvd25sb2FkLWRvY3VtZW50cy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9mb3JtbHktZG93bmxvYWQtZG9jdW1lbnRzLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybWx5RG93bmxvYWREb2N1bWVudHNDb21wb25lbnQgZXh0ZW5kcyBCYXNlRm9ybWx5Q29udHJvbENvbXBvbmVudCB7XG4gIGRvY3VtZW50czogR2VuZXJhdGVkRG9jdW1lbnRbXTtcbiAgaXNEb3dubG9hZGluZzogYm9vbGVhbjtcbiAgZG9jSW5kZXg6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhcHBEYXRhU2VydmljZTogQXBwbGljYXRpb25EYXRhU2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogRGlhbG9nU2VydmljZSxcbiAgICBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHN1cGVyKGNkcik7XG4gIH1cblxuICBvdmVycmlkZSBvbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuaXNEaXNwbGF5TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5nZXREb3dubG9hZGFibGVEb2N1bWVudHMoKTtcbiAgICB9XG4gIH1cblxuICBnZXREb3dubG9hZGFibGVEb2N1bWVudHMoKSB7XG4gICAgY29uc3QgY29uZmlnRG9jcyA9IHRoaXMuY29udHJvbERhdGE/LnNwZWNpZmljQ29udHJvbERhdGE/LmRvY3VtZW50cztcbiAgICBpZiAoY29uZmlnRG9jcykge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgbGV0IGNtZDogQXBwbGljYXRpb25HZXRHZW5lcmF0ZWREb2N1bWVudHNEdG8gPSB7XG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5wcm9wc1snYXBwRGF0YUlkJ10sXG4gICAgICAgIGNvbnRyb2xJZDogdGhpcy5jb250cm9sRGF0YS5pZGVudGlmaWVyLFxuICAgICAgICBpc0Rpc3BsYXlNb2RlOiB0aGlzLmlzRGlzcGxheU1vZGUsXG4gICAgICAgIGFwcENvbmZpZ3VyYXRpb25VVUlEOiB0aGlzLmFwcElkLFxuICAgICAgICBlbnZpcm9ubWVudDogdGhpcy5lbnYsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmFwcERhdGFTZXJ2aWNlLmdldEdlbmVyYXRlRG9jdW1lbnRzKGNtZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMuZG9jdW1lbnRzID0gdGhpcy5vcmRlckRvY3VtZW50c0FzQ29uZmlndXJlZChyZXN1bHQpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuZGlhbG9nLnBvcEVycm9yVHJhbnNsYXRpb24oXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xEYXRhLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgIHRoaXMubGFuZ0lzbyxcbiAgICAgICAgICAgICdmYWlsVG9Eb3dubG9hZCdcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG9yZGVyRG9jdW1lbnRzQXNDb25maWd1cmVkKFxuICAgIGRvY3VtZW50czogR2VuZXJhdGVkRG9jdW1lbnRbXVxuICApOiBHZW5lcmF0ZWREb2N1bWVudFtdIHtcbiAgICBsZXQgbGlzdDogR2VuZXJhdGVkRG9jdW1lbnRbXSA9IFtdO1xuICAgIGlmIChkb2N1bWVudHMpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWREb2N1bWVudHMgPVxuICAgICAgICB0aGlzLmNvbnRyb2xEYXRhPy5zcGVjaWZpY0NvbnRyb2xEYXRhPy5kb2N1bWVudHM7XG4gICAgICBpZiAoY29uZmlndXJlZERvY3VtZW50cykge1xuICAgICAgICBjb25maWd1cmVkRG9jdW1lbnRzLmZvckVhY2goKGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZvdW5kID0gZG9jdW1lbnRzLmZpbmQoKGYpID0+IGYuZG9jdW1lbnRJZCA9PT0gZC5pZCk7XG4gICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICBsaXN0LnB1c2goZm91bmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgcmV0cnkoKSB7XG4gICAgdGhpcy5nZXREb3dubG9hZGFibGVEb2N1bWVudHMoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG9uUGFnZVNlbGVjdGVkKCkge1xuICAgIHRoaXMuZ2V0RG93bmxvYWRhYmxlRG9jdW1lbnRzKCk7XG4gIH1cblxuICBhc3luYyBkb3dubG9hZERvY3VtZW50KGRvYzogR2VuZXJhdGVkRG9jdW1lbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmlzRG93bmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZG9jSW5kZXggPSBpbmRleDtcbiAgICBpZiAoZG9jLmlzQXBpRG9jdW1lbnQgPT09IHRydWUpIHtcbiAgICAgIGxldCBhcGlSZXF1ZXN0OiBBcGlEb2N1bWVudFJlcXVlc3QgPSB7XG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhSWQsXG4gICAgICAgIGRvY3VtZW50SWQ6IGRvYy5kb2N1bWVudElkLFxuICAgICAgfTtcbiAgICAgIHRoaXMuYXBwRGF0YVNlcnZpY2UuZG9Eb2N1bWVudFJlcXVlc3QoYXBpUmVxdWVzdCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRvY3MpID0+IHtcbiAgICAgICAgICBpZiAoZG9jcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBkb2NzLmZpbmQoKGQpID0+IGQuZG9jdW1lbnRJZCA9PT0gZG9jLmRvY3VtZW50SWQpO1xuICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBVdGlscy5iYXNlNjR0b0Jsb2IobWF0Y2guY29udGVudCk7XG4gICAgICAgICAgICAgIHNhdmVBcyhibG9iLCBtYXRjaC5uYW1lKTtcbiAgICAgICAgICAgICAgdGhpcy5pc0Rvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaWFsb2cucG9wRXJyb3JUcmFuc2xhdGlvbihcbiAgICAgICAgICAgICAgdGhpcy5jb250cm9sRGF0YS5lcnJvcnNUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgICAgIHRoaXMubGFuZ0lzbyxcbiAgICAgICAgICAgICAgJ25vRG9jdW1lbnRzVG9Eb3dubG9hZCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmlzRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5kaWFsb2cucG9wRXJyb3JUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIHRoaXMuY29udHJvbERhdGEuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgdGhpcy5sYW5nSXNvLFxuICAgICAgICAgICAgJ2ZhaWxUb0Rvd25sb2FkJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5pc0Rvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXBwRGF0YVNlcnZpY2VcbiAgICAgICAgLmRvd25sb2FkRmlsZSh0aGlzLnByb3BzWydhcHBEYXRhSWQnXSwgZG9jLmRvY3VtZW50SWQsIGRvYy5maWxlTmFtZSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHNhdmVBcyhkYXRhLCBkb2MuZmlsZU5hbWUpLCAodGhpcy5pc0Rvd25sb2FkaW5nID0gZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLnBvcEVycm9yVHJhbnNsYXRpb24oXG4gICAgICAgICAgICAgIHRoaXMuY29udHJvbERhdGEuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgICB0aGlzLmxhbmdJc28sXG4gICAgICAgICAgICAgICdmYWlsVG9Eb3dubG9hZCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmlzRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxwICpuZ0lmPVwidGl0bGVcIj5cbiAge3sgdGl0bGUgfX1cbjwvcD5cbjxwICpuZ0lmPVwiaXNMb2FkaW5nID09PSBmYWxzZSAmJiAoIWRvY3VtZW50cyB8fCBkb2N1bWVudHMubGVuZ3RoID09PSAwKVwiPlxuICB7eyBnZXRFcnJvclRyYW5zbGF0aW9uTWVzc2FnZShcIm5vRG9jdW1lbnRzVG9Eb3dubG9hZFwiKSB9fVxuPC9wPlxuPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNMb2FkaW5nID09PSB0cnVlXCIgY2xhc3M9XCJtLXgtYXV0b1wiPjwvbWF0LXNwaW5uZXI+XG48dGFibGUgKm5nSWY9XCJpc0xvYWRpbmcgPT09IGZhbHNlICYmIGRvY3VtZW50c1wiPlxuICA8dGhlYWQgY2xhc3M9XCJ0YWJsZS1oZWFkXCI+XG4gICAgPHRyPlxuICAgICAgPHRoPlxuICAgICAgICB7eyBcImRvY3VtZW50XCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGg+XG4gICAgICAgIHt7IFwiY29tbW9uLmFjdGlvbnMuZG93bmxvYWRcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC90aD5cbiAgICA8L3RyPlxuICA8L3RoZWFkPlxuICA8dGJvZHkgY2xhc3M9XCJ0YWJsZS1kZXRhaWxcIj5cbiAgICA8dHIgKm5nRm9yPVwibGV0IGRvYyBvZiBkb2N1bWVudHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgIHt7IGRvYy5uYW1lIH19XG4gICAgICA8L3RkPlxuICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWREb2N1bWVudChkb2MsIGkpXCJcbiAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWZpZWxkXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+XG4gICAgICAgICAge3sgXCJjb21tb24uYWN0aW9ucy5kb3dubG9hZFwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibS14LTEgdXBsb2FkLXNwaW5uZXJcIj5cbiAgICAgICAgICA8bWF0LXNwaW5uZXJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNEb3dubG9hZGluZyAmJiBkb2NJbmRleCA9PT0gaVwiXG4gICAgICAgICAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXG4gICAgICAgICAgICBbZGlhbWV0ZXJdPVwiMzBcIlxuICAgICAgICAgID48L21hdC1zcGlubmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbjwvdGFibGU+XG4iXX0=
|