@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,173 @@
|
|
|
1
|
+
import { Component, ViewChild, inject, } from '@angular/core';
|
|
2
|
+
import { ConfigService } from '../../others/config-service';
|
|
3
|
+
import { FluxType } from '../../models/forms.model';
|
|
4
|
+
import { BaseFormlyStepComponent } from '../baseFormlyStepComponent';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../origin-form-auth.service";
|
|
7
|
+
import * as i2 from "../../services/dialog.service";
|
|
8
|
+
import * as i3 from "sign-lib";
|
|
9
|
+
export class FormlySignComponent extends BaseFormlyStepComponent {
|
|
10
|
+
constructor(authService, cdr, dialog) {
|
|
11
|
+
super(cdr);
|
|
12
|
+
this.authService = authService;
|
|
13
|
+
this.dialog = dialog;
|
|
14
|
+
this.canProceed = false;
|
|
15
|
+
this._signButtonStyle = {};
|
|
16
|
+
this.configService = inject(ConfigService);
|
|
17
|
+
}
|
|
18
|
+
onInit() { }
|
|
19
|
+
async onPageSelectedAsync() {
|
|
20
|
+
const styleObj = this.props?.['design']?.['.button-otpaction'];
|
|
21
|
+
if (styleObj) {
|
|
22
|
+
const camelCaseStyle = {};
|
|
23
|
+
Object.keys(styleObj).forEach((key) => {
|
|
24
|
+
const camelKey = key.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
|
|
25
|
+
camelCaseStyle[camelKey] = styleObj[key];
|
|
26
|
+
});
|
|
27
|
+
this._signButtonStyle = camelCaseStyle;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
this._signButtonStyle = {};
|
|
31
|
+
}
|
|
32
|
+
// Reset component state when page is selected
|
|
33
|
+
this.canProceed = false;
|
|
34
|
+
this.config = await this.getConfig();
|
|
35
|
+
this.addPhoneNumbertoConfig();
|
|
36
|
+
this.config = {
|
|
37
|
+
...this.config,
|
|
38
|
+
ShowConfirm: this.stepData.config.showConfirm ?? false,
|
|
39
|
+
SignMode: this.stepData.config.companySign ?? false ? 'both' : 'client',
|
|
40
|
+
...(Object.keys(this.signButtonStyle).length > 0
|
|
41
|
+
? {
|
|
42
|
+
Styles: {
|
|
43
|
+
...(this.config.Styles || {}),
|
|
44
|
+
buttonStyles: this.signButtonStyle,
|
|
45
|
+
},
|
|
46
|
+
}
|
|
47
|
+
: {}),
|
|
48
|
+
};
|
|
49
|
+
if (this.config.Styles?.buttonStyles) {
|
|
50
|
+
console.log(`🧫 FormlySignComponent: Styles for sign button are sent:`, this.config.Styles.buttonStyles);
|
|
51
|
+
console.log('config', this.config);
|
|
52
|
+
}
|
|
53
|
+
console.log(`🔷 FormlySignComponent: Initializing sign component for step ${this.stepData.identifier}`);
|
|
54
|
+
//very important to trigger input parameter pass to SignLib component
|
|
55
|
+
this.cdr.detectChanges();
|
|
56
|
+
// Wait a bit for ViewChild to be available and then initialize
|
|
57
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
58
|
+
// Ensure SignLibComponent is properly initialized
|
|
59
|
+
if (this.signLib) {
|
|
60
|
+
console.log(`🔷 FormlySignComponent: SignLibComponent found, calling ngOnInit for step ${this.stepData.identifier}`);
|
|
61
|
+
await this.signLib.ngOnInit();
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.warn(`🔷 FormlySignComponent: SignLibComponent not found for step ${this.stepData.identifier}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async retryAsync() {
|
|
68
|
+
await this.onPageSelectedAsync();
|
|
69
|
+
}
|
|
70
|
+
async getConfig() {
|
|
71
|
+
return {
|
|
72
|
+
AppDataId: this.props['appDataId'],
|
|
73
|
+
StepId: this.stepData.identifier,
|
|
74
|
+
Token: this.authService.getToken(),
|
|
75
|
+
BaseUrl: this.configService.readConfig().baseUrlGateway,
|
|
76
|
+
AutoSign: this.stepData.isVisible === false,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
addPhoneNumbertoConfig() {
|
|
80
|
+
const phoneKey = this.stepData.config.componentCollected;
|
|
81
|
+
if (phoneKey) {
|
|
82
|
+
let phoneNumber = null;
|
|
83
|
+
// Get references to parent form and model from props
|
|
84
|
+
const parentForm = this.props['parentForm'];
|
|
85
|
+
const model = this.props['getModel']();
|
|
86
|
+
const flux = this.props['flux'];
|
|
87
|
+
// First try to get from parent form control (for validated phone numbers)
|
|
88
|
+
const formControl = parentForm?.get(phoneKey);
|
|
89
|
+
phoneNumber = formControl?.value;
|
|
90
|
+
// If not found in form control, try from model
|
|
91
|
+
if (!phoneNumber && model && model[phoneKey]) {
|
|
92
|
+
phoneNumber = model[phoneKey];
|
|
93
|
+
}
|
|
94
|
+
if (!phoneNumber && phoneKey === 'validated-phone' && flux) {
|
|
95
|
+
const phoneStep = flux.find((step) => step.type === FluxType.Phone);
|
|
96
|
+
if (phoneStep &&
|
|
97
|
+
phoneStep.config &&
|
|
98
|
+
phoneStep.config.componentCollected) {
|
|
99
|
+
const originalPhoneKey = phoneStep.config.componentCollected;
|
|
100
|
+
// Try from parent form first, then model
|
|
101
|
+
phoneNumber =
|
|
102
|
+
parentForm?.get(originalPhoneKey)?.value ||
|
|
103
|
+
(model && model[originalPhoneKey]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (phoneNumber) {
|
|
107
|
+
this.config = {
|
|
108
|
+
...this.config,
|
|
109
|
+
PhoneNumber: phoneNumber,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
console.warn('🔷 FormlySignComponent: No phone number found for key:', phoneKey);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
console.warn('🔷 FormlySignComponent: No componentCollected key found in step config');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
canAdvance() {
|
|
121
|
+
if (!this.canProceed) {
|
|
122
|
+
this.dialog.popError('signComponent.viewfiles.waitForSign');
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
libEvent(event) {
|
|
128
|
+
if (event && event.toLowerCase() === 'success') {
|
|
129
|
+
this.canProceed = true;
|
|
130
|
+
}
|
|
131
|
+
this.onEvent(event);
|
|
132
|
+
}
|
|
133
|
+
get signButtonStyle() {
|
|
134
|
+
return this._signButtonStyle;
|
|
135
|
+
}
|
|
136
|
+
ngOnDestroy() {
|
|
137
|
+
console.log('🔷 FormlySignComponent: Destroying component and cleaning up SignLibComponent');
|
|
138
|
+
// Cleanup SignLibComponent if it exists
|
|
139
|
+
if (this.signLib) {
|
|
140
|
+
try {
|
|
141
|
+
// Call destroy method if it exists (check for various possible cleanup methods)
|
|
142
|
+
if (typeof this.signLib.ngOnDestroy === 'function') {
|
|
143
|
+
this.signLib.ngOnDestroy();
|
|
144
|
+
}
|
|
145
|
+
else if (typeof this.signLib.destroy === 'function') {
|
|
146
|
+
this.signLib.destroy();
|
|
147
|
+
}
|
|
148
|
+
else if (typeof this.signLib.cleanup === 'function') {
|
|
149
|
+
this.signLib.cleanup();
|
|
150
|
+
}
|
|
151
|
+
// Clear any references
|
|
152
|
+
this.signLib = null;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
console.warn('🔷 FormlySignComponent: Error during SignLibComponent cleanup:', error);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Reset component state
|
|
159
|
+
this.canProceed = false;
|
|
160
|
+
this.config = null;
|
|
161
|
+
console.log('🔷 FormlySignComponent: Component cleanup completed');
|
|
162
|
+
}
|
|
163
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlySignComponent, deps: [{ token: i1.OriginFormAuthService }, { token: i0.ChangeDetectorRef }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
164
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlySignComponent, selector: "formly-sign", viewQueries: [{ propertyName: "signLib", first: true, predicate: ["signLib"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<lib-sign #signLib [config]=\"config\" (event)=\"libEvent($event)\"> </lib-sign>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: i3.SignLibComponent, selector: "lib-sign", inputs: ["config", "instanceId"], outputs: ["event"] }] }); }
|
|
165
|
+
}
|
|
166
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlySignComponent, decorators: [{
|
|
167
|
+
type: Component,
|
|
168
|
+
args: [{ selector: 'formly-sign', template: "<lib-sign #signLib [config]=\"config\" (event)=\"libEvent($event)\"> </lib-sign>\n", styles: [":host{display:block}\n"] }]
|
|
169
|
+
}], ctorParameters: () => [{ type: i1.OriginFormAuthService }, { type: i0.ChangeDetectorRef }, { type: i2.DialogService }], propDecorators: { signLib: [{
|
|
170
|
+
type: ViewChild,
|
|
171
|
+
args: ['signLib']
|
|
172
|
+
}] } });
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXNpZ24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNpZ24vZm9ybWx5LXNpZ24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNpZ24vZm9ybWx5LXNpZ24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxHQUdQLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUc1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7O0FBT3JFLE1BQU0sT0FBTyxtQkFDWCxTQUFRLHVCQUF1QjtJQVEvQixZQUNTLFdBQWtDLEVBQ3pDLEdBQXNCLEVBQ2QsTUFBcUI7UUFFN0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBSkosZ0JBQVcsR0FBWCxXQUFXLENBQXVCO1FBRWpDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFQL0IsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUNwQixxQkFBZ0IsR0FBOEIsRUFBRSxDQUFDO1FBRXpELGtCQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBT3RDLENBQUM7SUFFUSxNQUFNLEtBQUksQ0FBQztJQUVYLEtBQUssQ0FBQyxtQkFBbUI7UUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lB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O1FBRW5CLE9BQU8sQ0FBQyxHQUFHLENBQUMscURBQXFELENBQUMsQ0FBQztJQUNyRSxDQUFDOytHQTFNVSxtQkFBbUI7bUdBQW5CLG1CQUFtQiw4S0NwQmhDLG9GQUNBOzs0RkRtQmEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGFBQWE7c0pBUUQsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBWaWV3Q2hpbGQsXG4gIGluamVjdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTaWduTGliQ29tcG9uZW50IH0gZnJvbSAnc2lnbi1saWInO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9vdGhlcnMvY29uZmlnLXNlcnZpY2UnO1xuaW1wb3J0IHsgT3JpZ2luRm9ybUF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vb3JpZ2luLWZvcm0tYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBGbHV4VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9mb3Jtcy5tb2RlbCc7XG5pbXBvcnQgeyBCYXNlRm9ybWx5U3RlcENvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2VGb3JtbHlTdGVwQ29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZm9ybWx5LXNpZ24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybWx5LXNpZ24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZm9ybWx5LXNpZ24uY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlTaWduQ29tcG9uZW50XG4gIGV4dGVuZHMgQmFzZUZvcm1seVN0ZXBDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3lcbntcbiAgQFZpZXdDaGlsZCgnc2lnbkxpYicpIHNpZ25MaWI6IFNpZ25MaWJDb21wb25lbnQ7XG4gIGNhblByb2NlZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2lnbkJ1dHRvblN0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gIHB1YmxpYyBjb25maWc6IGFueTtcbiAgY29uZmlnU2VydmljZSA9IGluamVjdChDb25maWdTZXJ2aWNlKTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGF1dGhTZXJ2aWNlOiBPcmlnaW5Gb3JtQXV0aFNlcnZpY2UsXG4gICAgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGRpYWxvZzogRGlhbG9nU2VydmljZVxuICApIHtcbiAgICBzdXBlcihjZHIpO1xuICB9XG5cbiAgb3ZlcnJpZGUgb25Jbml0KCkge31cblxuICBvdmVycmlkZSBhc3luYyBvblBhZ2VTZWxlY3RlZEFzeW5jKCkge1xuICAgIGNvbnN0IHN0eWxlT2JqID0gdGhpcy5wcm9wcz8uWydkZXNpZ24nXT8uWycuYnV0dG9uLW90cGFjdGlvbiddO1xuICAgIGlmIChzdHlsZU9iaikge1xuICAgICAgY29uc3QgY2FtZWxDYXNlU3R5bGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKHN0eWxlT2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgY2FtZWxLZXkgPSBrZXkucmVwbGFjZSgvLShbYS16XSkvZywgKGcpID0+IGdbMV0udG9VcHBlckNhc2UoKSk7XG4gICAgICAgIGNhbWVsQ2FzZVN0eWxlW2NhbWVsS2V5XSA9IHN0eWxlT2JqW2tleV07XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3NpZ25CdXR0b25TdHlsZSA9IGNhbWVsQ2FzZVN0eWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zaWduQnV0dG9uU3R5bGUgPSB7fTtcbiAgICB9XG4gICAgLy8gUmVzZXQgY29tcG9uZW50IHN0YXRlIHdoZW4gcGFnZSBpcyBzZWxlY3RlZFxuICAgIHRoaXMuY2FuUHJvY2VlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5jb25maWcgPSBhd2FpdCB0aGlzLmdldENvbmZpZygpO1xuICAgIHRoaXMuYWRkUGhvbmVOdW1iZXJ0b0NvbmZpZygpO1xuXG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIFNob3dDb25maXJtOiB0aGlzLnN0ZXBEYXRhLmNvbmZpZy5zaG93Q29uZmlybSA/PyBmYWxzZSxcbiAgICAgIFNpZ25Nb2RlOiB0aGlzLnN0ZXBEYXRhLmNvbmZpZy5jb21wYW55U2lnbiA/PyBmYWxzZSA/ICdib3RoJyA6ICdjbGllbnQnLFxuICAgICAgLi4uKE9iamVjdC5rZXlzKHRoaXMuc2lnbkJ1dHRvblN0eWxlKS5sZW5ndGggPiAwXG4gICAgICAgID8ge1xuICAgICAgICAgICAgU3R5bGVzOiB7XG4gICAgICAgICAgICAgIC4uLih0aGlzLmNvbmZpZy5TdHlsZXMgfHwge30pLFxuICAgICAgICAgICAgICBidXR0b25TdHlsZXM6IHRoaXMuc2lnbkJ1dHRvblN0eWxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jb25maWcuU3R5bGVzPy5idXR0b25TdHlsZXMpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBg8J+nqyBGb3JtbHlTaWduQ29tcG9uZW50OiBTdHlsZXMgZm9yIHNpZ24gYnV0dG9uIGFyZSBzZW50OmAsXG4gICAgICAgIHRoaXMuY29uZmlnLlN0eWxlcy5idXR0b25TdHlsZXNcbiAgICAgICk7XG4gICAgICBjb25zb2xlLmxvZygnY29uZmlnJywgdGhpcy5jb25maWcpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYPCflLcgRm9ybWx5U2lnbkNvbXBvbmVudDogSW5pdGlhbGl6aW5nIHNpZ24gY29tcG9uZW50IGZvciBzdGVwICR7dGhpcy5zdGVwRGF0YS5pZGVudGlmaWVyfWBcbiAgICApO1xuXG4gICAgLy92ZXJ5IGltcG9ydGFudCB0byB0cmlnZ2VyIGlucHV0IHBhcmFtZXRlciBwYXNzIHRvIFNpZ25MaWIgY29tcG9uZW50XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgLy8gV2FpdCBhIGJpdCBmb3IgVmlld0NoaWxkIHRvIGJlIGF2YWlsYWJsZSBhbmQgdGhlbiBpbml0aWFsaXplXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTApKTtcblxuICAgIC8vIEVuc3VyZSBTaWduTGliQ29tcG9uZW50IGlzIHByb3Blcmx5IGluaXRpYWxpemVkXG4gICAgaWYgKHRoaXMuc2lnbkxpYikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGDwn5S3IEZvcm1seVNpZ25Db21wb25lbnQ6IFNpZ25MaWJDb21wb25lbnQgZm91bmQsIGNhbGxpbmcgbmdPbkluaXQgZm9yIHN0ZXAgJHt0aGlzLnN0ZXBEYXRhLmlkZW50aWZpZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuc2lnbkxpYi5uZ09uSW5pdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGDwn5S3IEZvcm1seVNpZ25Db21wb25lbnQ6IFNpZ25MaWJDb21wb25lbnQgbm90IGZvdW5kIGZvciBzdGVwICR7dGhpcy5zdGVwRGF0YS5pZGVudGlmaWVyfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV0cnlBc3luYygpIHtcbiAgICBhd2FpdCB0aGlzLm9uUGFnZVNlbGVjdGVkQXN5bmMoKTtcbiAgfVxuXG4gIGFzeW5jIGdldENvbmZpZygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgQXBwRGF0YUlkOiB0aGlzLnByb3BzWydhcHBEYXRhSWQnXSxcbiAgICAgIFN0ZXBJZDogdGhpcy5zdGVwRGF0YS5pZGVudGlmaWVyLFxuICAgICAgVG9rZW46IHRoaXMuYXV0aFNlcnZpY2UuZ2V0VG9rZW4oKSxcbiAgICAgIEJhc2VVcmw6IHRoaXMuY29uZmlnU2VydmljZS5yZWFkQ29uZmlnKCkuYmFzZVVybEdhdGV3YXksXG4gICAgICBBdXRvU2lnbjogdGhpcy5zdGVwRGF0YS5pc1Zpc2libGUgPT09IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFkZFBob25lTnVtYmVydG9Db25maWcoKTogdm9pZCB7XG4gICAgY29uc3QgcGhvbmVLZXkgPSB0aGlzLnN0ZXBEYXRhLmNvbmZpZy5jb21wb25lbnRDb2xsZWN0ZWQ7XG5cbiAgICBpZiAocGhvbmVLZXkpIHtcbiAgICAgIGxldCBwaG9uZU51bWJlciA9IG51bGw7XG5cbiAgICAgIC8vIEdldCByZWZlcmVuY2VzIHRvIHBhcmVudCBmb3JtIGFuZCBtb2RlbCBmcm9tIHByb3BzXG4gICAgICBjb25zdCBwYXJlbnRGb3JtID0gdGhpcy5wcm9wc1sncGFyZW50Rm9ybSddO1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLnByb3BzWydnZXRNb2RlbCddKCk7XG4gICAgICBjb25zdCBmbHV4ID0gdGhpcy5wcm9wc1snZmx1eCddO1xuXG4gICAgICAvLyBGaXJzdCB0cnkgdG8gZ2V0IGZyb20gcGFyZW50IGZvcm0gY29udHJvbCAoZm9yIHZhbGlkYXRlZCBwaG9uZSBudW1iZXJzKVxuICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSBwYXJlbnRGb3JtPy5nZXQocGhvbmVLZXkpO1xuICAgICAgcGhvbmVOdW1iZXIgPSBmb3JtQ29udHJvbD8udmFsdWU7XG5cbiAgICAgIC8vIElmIG5vdCBmb3VuZCBpbiBmb3JtIGNvbnRyb2wsIHRyeSBmcm9tIG1vZGVsXG4gICAgICBpZiAoIXBob25lTnVtYmVyICYmIG1vZGVsICYmIG1vZGVsW3Bob25lS2V5XSkge1xuICAgICAgICBwaG9uZU51bWJlciA9IG1vZGVsW3Bob25lS2V5XTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwaG9uZU51bWJlciAmJiBwaG9uZUtleSA9PT0gJ3ZhbGlkYXRlZC1waG9uZScgJiYgZmx1eCkge1xuICAgICAgICBjb25zdCBwaG9uZVN0ZXAgPSBmbHV4LmZpbmQoXG4gICAgICAgICAgKHN0ZXA6IGFueSkgPT4gc3RlcC50eXBlID09PSBGbHV4VHlwZS5QaG9uZVxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcGhvbmVTdGVwICYmXG4gICAgICAgICAgcGhvbmVTdGVwLmNvbmZpZyAmJlxuICAgICAgICAgIHBob25lU3RlcC5jb25maWcuY29tcG9uZW50Q29sbGVjdGVkXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUGhvbmVLZXkgPSBwaG9uZVN0ZXAuY29uZmlnLmNvbXBvbmVudENvbGxlY3RlZDtcbiAgICAgICAgICAvLyBUcnkgZnJvbSBwYXJlbnQgZm9ybSBmaXJzdCwgdGhlbiBtb2RlbFxuICAgICAgICAgIHBob25lTnVtYmVyID1cbiAgICAgICAgICAgIHBhcmVudEZvcm0/LmdldChvcmlnaW5hbFBob25lS2V5KT8udmFsdWUgfHxcbiAgICAgICAgICAgIChtb2RlbCAmJiBtb2RlbFtvcmlnaW5hbFBob25lS2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBob25lTnVtYmVyKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgICAgIFBob25lTnVtYmVyOiBwaG9uZU51bWJlcixcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAn8J+UtyBGb3JtbHlTaWduQ29tcG9uZW50OiBObyBwaG9uZSBudW1iZXIgZm91bmQgZm9yIGtleTonLFxuICAgICAgICAgIHBob25lS2V5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ/CflLcgRm9ybWx5U2lnbkNvbXBvbmVudDogTm8gY29tcG9uZW50Q29sbGVjdGVkIGtleSBmb3VuZCBpbiBzdGVwIGNvbmZpZydcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgY2FuQWR2YW5jZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY2FuUHJvY2VlZCkge1xuICAgICAgdGhpcy5kaWFsb2cucG9wRXJyb3IoJ3NpZ25Db21wb25lbnQudmlld2ZpbGVzLndhaXRGb3JTaWduJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGliRXZlbnQoZXZlbnQ6IGFueSkge1xuICAgIGlmIChldmVudCAmJiBldmVudC50b0xvd2VyQ2FzZSgpID09PSAnc3VjY2VzcycpIHtcbiAgICAgIHRoaXMuY2FuUHJvY2VlZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMub25FdmVudChldmVudCk7XG4gIH1cblxuICBnZXQgc2lnbkJ1dHRvblN0eWxlKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIHJldHVybiB0aGlzLl9zaWduQnV0dG9uU3R5bGU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICfwn5S3IEZvcm1seVNpZ25Db21wb25lbnQ6IERlc3Ryb3lpbmcgY29tcG9uZW50IGFuZCBjbGVhbmluZyB1cCBTaWduTGliQ29tcG9uZW50J1xuICAgICk7XG5cbiAgICAvLyBDbGVhbnVwIFNpZ25MaWJDb21wb25lbnQgaWYgaXQgZXhpc3RzXG4gICAgaWYgKHRoaXMuc2lnbkxpYikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2FsbCBkZXN0cm95IG1ldGhvZCBpZiBpdCBleGlzdHMgKGNoZWNrIGZvciB2YXJpb3VzIHBvc3NpYmxlIGNsZWFudXAgbWV0aG9kcylcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5zaWduTGliIGFzIGFueSkubmdPbkRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAodGhpcy5zaWduTGliIGFzIGFueSkubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKHRoaXMuc2lnbkxpYiBhcyBhbnkpLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAodGhpcy5zaWduTGliIGFzIGFueSkuZGVzdHJveSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAodGhpcy5zaWduTGliIGFzIGFueSkuY2xlYW51cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICh0aGlzLnNpZ25MaWIgYXMgYW55KS5jbGVhbnVwKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBhbnkgcmVmZXJlbmNlc1xuICAgICAgICAodGhpcy5zaWduTGliIGFzIGFueSkgPSBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICfwn5S3IEZvcm1seVNpZ25Db21wb25lbnQ6IEVycm9yIGR1cmluZyBTaWduTGliQ29tcG9uZW50IGNsZWFudXA6JyxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc2V0IGNvbXBvbmVudCBzdGF0ZVxuICAgIHRoaXMuY2FuUHJvY2VlZCA9IGZhbHNlO1xuICAgIHRoaXMuY29uZmlnID0gbnVsbDtcblxuICAgIGNvbnNvbGUubG9nKCfwn5S3IEZvcm1seVNpZ25Db21wb25lbnQ6IENvbXBvbmVudCBjbGVhbnVwIGNvbXBsZXRlZCcpO1xuICB9XG59XG4iLCI8bGliLXNpZ24gI3NpZ25MaWIgW2NvbmZpZ109XCJjb25maWdcIiAoZXZlbnQpPVwibGliRXZlbnQoJGV2ZW50KVwiPiA8L2xpYi1zaWduPlxuIl19
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { ApplicationUploadDocumentsDto } from '../../models/application.model';
|
|
4
|
+
import { Utils } from '../../others/utils';
|
|
5
|
+
import { BaseFormlyControlComponent } from '../baseFormlyControlComponent';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../../services/dialog.service";
|
|
8
|
+
import * as i2 from "../../services/applicationData.service";
|
|
9
|
+
import * as i3 from "@angular/common";
|
|
10
|
+
import * as i4 from "@angular/material/button";
|
|
11
|
+
import * as i5 from "@angular/material/icon";
|
|
12
|
+
import * as i6 from "@angular/material/progress-spinner";
|
|
13
|
+
import * as i7 from "../../others/translation.pipe";
|
|
14
|
+
export class FormlyUploadDocumentsComponent extends BaseFormlyControlComponent {
|
|
15
|
+
constructor(dialog, appDataService, cdr) {
|
|
16
|
+
super(cdr);
|
|
17
|
+
this.dialog = dialog;
|
|
18
|
+
this.appDataService = appDataService;
|
|
19
|
+
this.mandatoryDocuments = [];
|
|
20
|
+
}
|
|
21
|
+
onInit() {
|
|
22
|
+
this.isDisabled = false;
|
|
23
|
+
if (this.controlData && this.controlData.specificControlData) {
|
|
24
|
+
this.documents = this.controlData.specificControlData.documents;
|
|
25
|
+
this.mandatoryDocuments = this.documents
|
|
26
|
+
.filter((d) => d.isMandatory)
|
|
27
|
+
.map((d) => d.documentId);
|
|
28
|
+
}
|
|
29
|
+
const appDocuments = this.props['documentsData'];
|
|
30
|
+
if (appDocuments && this.documents) {
|
|
31
|
+
this.documents.forEach((d) => {
|
|
32
|
+
const appDoc = appDocuments.find((ad) => ad.id === d.documentId);
|
|
33
|
+
d.documentName =
|
|
34
|
+
appDoc?.translations?.find(t => t.languageIso === this.langIso)?.value ||
|
|
35
|
+
appDoc?.name ||
|
|
36
|
+
d.documentId;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async submitUploadAsync(doc, uploadPayload) {
|
|
41
|
+
this.cdr.detectChanges();
|
|
42
|
+
let obs = new Observable((subscriber) => {
|
|
43
|
+
if (doc.isUploading) {
|
|
44
|
+
this.dialog.popErrorTranslation(this.controlData.errorsTranslations, this.langIso, 'waitForUpload');
|
|
45
|
+
subscriber.next();
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
doc.isUploading = true;
|
|
49
|
+
this.isDisabled = true;
|
|
50
|
+
this.appDataService.uploadDocuments(uploadPayload).subscribe({
|
|
51
|
+
next: (res) => {
|
|
52
|
+
subscriber.next();
|
|
53
|
+
doc.isUploading = false;
|
|
54
|
+
doc.isUploadSuccess = true;
|
|
55
|
+
this.cdr.detectChanges();
|
|
56
|
+
this.mandatoryDocuments = [];
|
|
57
|
+
if (res) {
|
|
58
|
+
this.isDisabled = false;
|
|
59
|
+
}
|
|
60
|
+
if (res && res.length > 0) {
|
|
61
|
+
this.documents.forEach((d) => {
|
|
62
|
+
if (res.includes(d.documentId)) {
|
|
63
|
+
this.mandatoryDocuments.push(d.documentId);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
error: (err) => {
|
|
69
|
+
subscriber.next();
|
|
70
|
+
doc.isUploading = false;
|
|
71
|
+
this.isDisabled = false;
|
|
72
|
+
this.cdr.detectChanges();
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
this.cdr.detectChanges();
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
return obs;
|
|
79
|
+
}
|
|
80
|
+
pullFromUI(doc, fileInput) {
|
|
81
|
+
return new Promise((resolve, reject) => {
|
|
82
|
+
const reader = new FileReader();
|
|
83
|
+
reader.readAsDataURL(fileInput);
|
|
84
|
+
reader.onload = () => {
|
|
85
|
+
doc.fileName = fileInput.name;
|
|
86
|
+
doc.fileData = reader.result?.toString().split(';base64,')[1] || '';
|
|
87
|
+
this.cdr.detectChanges();
|
|
88
|
+
let appDocs = this.getNewUploadPayload();
|
|
89
|
+
this.documents.forEach((d) => {
|
|
90
|
+
if (d.documentId === doc.documentId) {
|
|
91
|
+
appDocs.documents.push({
|
|
92
|
+
documentId: d.documentId,
|
|
93
|
+
fileData: doc.fileData,
|
|
94
|
+
fileName: doc.fileName,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
this.cdr.detectChanges();
|
|
99
|
+
resolve(appDocs);
|
|
100
|
+
};
|
|
101
|
+
reader.onerror = (error) => {
|
|
102
|
+
reject(error);
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
isValid() {
|
|
107
|
+
let isValid = true;
|
|
108
|
+
if (this.documents) {
|
|
109
|
+
let errorMessages = [];
|
|
110
|
+
this.documents.forEach((d) => {
|
|
111
|
+
if (this.mandatoryDocuments.includes(d.documentId)) {
|
|
112
|
+
const msg = Utils.createErrorTranslationMssageWithParameters(this.controlData.errorsTranslations, this.langIso, 'isMandatory', [d.documentName]);
|
|
113
|
+
errorMessages.push(msg);
|
|
114
|
+
isValid = false;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
if (errorMessages.length > 0) {
|
|
118
|
+
this.dialog.popError(errorMessages.join('\n'));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return isValid;
|
|
122
|
+
}
|
|
123
|
+
selectFile(event, doc) {
|
|
124
|
+
doc.fileData = undefined;
|
|
125
|
+
if (!event.target.files[0] || event.target.files[0].length === 0) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const file = event.target.files[0];
|
|
129
|
+
if (file) {
|
|
130
|
+
let invalidType = true;
|
|
131
|
+
if (doc.documentExtensions && doc.documentExtensions !== '') {
|
|
132
|
+
const docExtensions = doc.documentExtensions.split(';');
|
|
133
|
+
if (docExtensions && docExtensions.length > 0) {
|
|
134
|
+
const fileExtension = Utils.getFileExtension(file.name);
|
|
135
|
+
if (fileExtension) {
|
|
136
|
+
docExtensions.forEach((d) => {
|
|
137
|
+
if (fileExtension.toLowerCase() == d.toLowerCase()) {
|
|
138
|
+
invalidType = false;
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
invalidType = false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
invalidType = false;
|
|
149
|
+
}
|
|
150
|
+
if (invalidType) {
|
|
151
|
+
this.dialog.popErrorTranslation(this.controlData.errorsTranslations, this.langIso, 'invalidType', doc.documentExtensions);
|
|
152
|
+
event.currentTarget.value = '';
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (file.size) {
|
|
156
|
+
const sizeInKB = file.size / 1024;
|
|
157
|
+
if (sizeInKB > doc.documentMaxSize) {
|
|
158
|
+
this.dialog.popErrorTranslation(this.controlData.errorsTranslations, this.langIso, 'maxSize', doc.documentMaxSize.toString() + 'KB');
|
|
159
|
+
event.currentTarget.value = '';
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
this.pullFromUI(doc, file)
|
|
164
|
+
.then(async (res) => {
|
|
165
|
+
(await this.submitUploadAsync(doc, res)).subscribe();
|
|
166
|
+
this.cdr.detectChanges();
|
|
167
|
+
})
|
|
168
|
+
.catch((error) => {
|
|
169
|
+
console.error('Error processing file:', error);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
this.cdr.detectChanges();
|
|
173
|
+
}
|
|
174
|
+
canAdvance() {
|
|
175
|
+
this.cdr.detectChanges();
|
|
176
|
+
let canProceed = false;
|
|
177
|
+
if (this.isValid()) {
|
|
178
|
+
canProceed = true;
|
|
179
|
+
}
|
|
180
|
+
return canProceed;
|
|
181
|
+
}
|
|
182
|
+
getNewUploadPayload() {
|
|
183
|
+
let uploadPayload = new ApplicationUploadDocumentsDto();
|
|
184
|
+
uploadPayload.appDataId = this.appDataId;
|
|
185
|
+
uploadPayload.appId = this.appId;
|
|
186
|
+
uploadPayload.controlId = this.controlData.identifier;
|
|
187
|
+
uploadPayload.env = this.env;
|
|
188
|
+
uploadPayload.documents = [];
|
|
189
|
+
return uploadPayload;
|
|
190
|
+
}
|
|
191
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyUploadDocumentsComponent, deps: [{ token: i1.DialogService }, { token: i2.ApplicationDataService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
192
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyUploadDocumentsComponent, selector: "app-formly-upload-documents", usesInheritance: true, ngImport: i0, template: "<p *ngIf=\"title\">\n {{ title }}\n</p>\n\n<table>\n <thead class=\"table-head\">\n <tr>\n <th>\n {{ \"document\" | translate }}\n </th>\n <th>\n {{ \"format\" | translate }}\n </th>\n <th>\n {{ \"flux.components.uploadDocument.maxSize\" | translate }}\n </th>\n <th>\n {{ \"stepControl.mandatory\" | translate }}\n </th>\n </tr>\n </thead>\n <tbody class=\"table-detail\">\n <tr *ngFor=\"let doc of documents; let i = index\">\n <td>\n {{ doc.documentName }}\n </td>\n <td>\n {{ doc.documentExtensions }}\n </td>\n <td>\n {{ doc.documentMaxSize }}\n </td>\n <td>\n {{ (doc.isMandatory ? \"yes\" : \"no\") | translate }}\n </td>\n <td>\n <div>\n <input\n type=\"file\"\n #fileInput\n (change)=\"selectFile($event, doc)\"\n hidden\n />\n <button\n mat-flat-button\n color=\"primary\"\n (click)=\"fileInput.click()\"\n [disabled]=\"this.isDisabled\"\n >\n <mat-icon>cloud_upload</mat-icon>\n {{\n doc.fileName\n ? doc.fileName\n : (\"common.actions.upload\" | translate)\n }}\n </button>\n </div>\n </td>\n <td *ngIf=\"doc.fileName\">\n <i-tabler\n *ngIf=\"\n doc.isUploading === false &&\n doc.isUploadSuccess === true &&\n doc.fileName\n \"\n class=\"icon-25 text-white bg-primary rounded\"\n name=\"check\"\n ></i-tabler>\n <mat-spinner\n *ngIf=\"doc.isUploading === true\"\n class=\"m-x-auto upload-spinner\"\n ></mat-spinner>\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" }] }); }
|
|
193
|
+
}
|
|
194
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyUploadDocumentsComponent, decorators: [{
|
|
195
|
+
type: Component,
|
|
196
|
+
args: [{ selector: 'app-formly-upload-documents', template: "<p *ngIf=\"title\">\n {{ title }}\n</p>\n\n<table>\n <thead class=\"table-head\">\n <tr>\n <th>\n {{ \"document\" | translate }}\n </th>\n <th>\n {{ \"format\" | translate }}\n </th>\n <th>\n {{ \"flux.components.uploadDocument.maxSize\" | translate }}\n </th>\n <th>\n {{ \"stepControl.mandatory\" | translate }}\n </th>\n </tr>\n </thead>\n <tbody class=\"table-detail\">\n <tr *ngFor=\"let doc of documents; let i = index\">\n <td>\n {{ doc.documentName }}\n </td>\n <td>\n {{ doc.documentExtensions }}\n </td>\n <td>\n {{ doc.documentMaxSize }}\n </td>\n <td>\n {{ (doc.isMandatory ? \"yes\" : \"no\") | translate }}\n </td>\n <td>\n <div>\n <input\n type=\"file\"\n #fileInput\n (change)=\"selectFile($event, doc)\"\n hidden\n />\n <button\n mat-flat-button\n color=\"primary\"\n (click)=\"fileInput.click()\"\n [disabled]=\"this.isDisabled\"\n >\n <mat-icon>cloud_upload</mat-icon>\n {{\n doc.fileName\n ? doc.fileName\n : (\"common.actions.upload\" | translate)\n }}\n </button>\n </div>\n </td>\n <td *ngIf=\"doc.fileName\">\n <i-tabler\n *ngIf=\"\n doc.isUploading === false &&\n doc.isUploadSuccess === true &&\n doc.fileName\n \"\n class=\"icon-25 text-white bg-primary rounded\"\n name=\"check\"\n ></i-tabler>\n <mat-spinner\n *ngIf=\"doc.isUploading === true\"\n class=\"m-x-auto upload-spinner\"\n ></mat-spinner>\n </td>\n </tr>\n </tbody>\n</table>\n", styles: [".upload-spinner{width:30px!important}\n"] }]
|
|
197
|
+
}], ctorParameters: () => [{ type: i1.DialogService }, { type: i2.ApplicationDataService }, { type: i0.ChangeDetectorRef }] });
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXVwbG9hZC1kb2N1bWVudHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXVwbG9hZC1kb2N1bWVudHMvZm9ybWx5LXVwbG9hZC1kb2N1bWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXVwbG9hZC1kb2N1bWVudHMvZm9ybWx5LXVwbG9hZC1kb2N1bWVudHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFPN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7OztBQU8zRSxNQUFNLE9BQU8sOEJBQStCLFNBQVEsMEJBQTBCO0lBSTVFLFlBQ1UsTUFBcUIsRUFDckIsY0FBc0MsRUFDOUMsR0FBc0I7UUFFdEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBSkgsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBd0I7UUFKaEQsdUJBQWtCLEdBQWEsRUFBRSxDQUFDO0lBUWxDLENBQUM7SUFFUSxNQUFNO1FBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsU0FB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ICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHBsaWNhdGlvbkRhdGEuc2VydmljZSc7XG5pbXBvcnQge1xuICBBcHBEb2N1bWVudCxcbiAgVXBsb2FkRG9jdW1lbnREZXRhaWxzLFxufSBmcm9tICcuLi8uLi9tb2RlbHMvZm9ybXMubW9kZWwnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uVXBsb2FkRG9jdW1lbnRzRHRvIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FwcGxpY2F0aW9uLm1vZGVsJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vb3RoZXJzL3V0aWxzJztcbmltcG9ydCB7IEJhc2VGb3JtbHlDb250cm9sQ29tcG9uZW50IH0gZnJvbSAnLi4vYmFzZUZvcm1seUNvbnRyb2xDb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZm9ybWx5LXVwbG9hZC1kb2N1bWVudHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybWx5LXVwbG9hZC1kb2N1bWVudHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZm9ybWx5LXVwbG9hZC1kb2N1bWVudHMuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlVcGxvYWREb2N1bWVudHNDb21wb25lbnQgZXh0ZW5kcyBCYXNlRm9ybWx5Q29udHJvbENvbXBvbmVudCB7XG4gIGRvY3VtZW50czogVXBsb2FkRG9jdW1lbnREZXRhaWxzW107XG4gIG1hbmRhdG9yeURvY3VtZW50czogc3RyaW5nW10gPSBbXTtcbiAgaXNEaXNhYmxlZDogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkaWFsb2c6IERpYWxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcHBEYXRhU2VydmljZTogQXBwbGljYXRpb25EYXRhU2VydmljZSxcbiAgICBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHN1cGVyKGNkcik7XG4gIH1cblxuICBvdmVycmlkZSBvbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0Rpc2FibGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuY29udHJvbERhdGEgJiYgdGhpcy5jb250cm9sRGF0YS5zcGVjaWZpY0NvbnRyb2xEYXRhKSB7XG4gICAgICB0aGlzLmRvY3VtZW50cyA9IHRoaXMuY29udHJvbERhdGEuc3BlY2lmaWNDb250cm9sRGF0YS5kb2N1bWVudHMgYXMgVXBsb2FkRG9jdW1lbnREZXRhaWxzW107XG4gICAgICB0aGlzLm1hbmRhdG9yeURvY3VtZW50cyA9IHRoaXMuZG9jdW1lbnRzXG4gICAgICAgIC5maWx0ZXIoKGQpID0+IGQuaXNNYW5kYXRvcnkpXG4gICAgICAgIC5tYXAoKGQpID0+IGQuZG9jdW1lbnRJZCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwRG9jdW1lbnRzID0gdGhpcy5wcm9wc1snZG9jdW1lbnRzRGF0YSddIGFzIEFwcERvY3VtZW50W107XG4gICAgaWYgKGFwcERvY3VtZW50cyAmJiB0aGlzLmRvY3VtZW50cykge1xuICAgICAgdGhpcy5kb2N1bWVudHMuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBjb25zdCBhcHBEb2MgPSBhcHBEb2N1bWVudHMuZmluZCgoYWQpID0+IGFkLmlkID09PSBkLmRvY3VtZW50SWQpO1xuICAgICAgICBkLmRvY3VtZW50TmFtZSA9XG4gICAgICAgICAgYXBwRG9jPy50cmFuc2xhdGlvbnM/LmZpbmQodCA9PiB0Lmxhbmd1YWdlSXNvID09PSB0aGlzLmxhbmdJc28pPy52YWx1ZSB8fFxuICAgICAgICAgIGFwcERvYz8ubmFtZSB8fFxuICAgICAgICAgIGQuZG9jdW1lbnRJZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN1Ym1pdFVwbG9hZEFzeW5jKFxuICAgIGRvYzogVXBsb2FkRG9jdW1lbnREZXRhaWxzLFxuICAgIHVwbG9hZFBheWxvYWQ6IEFwcGxpY2F0aW9uVXBsb2FkRG9jdW1lbnRzRHRvXG4gICk6IFByb21pc2U8T2JzZXJ2YWJsZTxudW1iZXI+PiB7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIGxldCBvYnMgPSBuZXcgT2JzZXJ2YWJsZTxudW1iZXI+KChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICBpZiAoZG9jLmlzVXBsb2FkaW5nKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nLnBvcEVycm9yVHJhbnNsYXRpb24oXG4gICAgICAgICAgdGhpcy5jb250cm9sRGF0YS5lcnJvcnNUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5sYW5nSXNvLFxuICAgICAgICAgICd3YWl0Rm9yVXBsb2FkJ1xuICAgICAgICApO1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvYy5pc1VwbG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuYXBwRGF0YVNlcnZpY2UudXBsb2FkRG9jdW1lbnRzKHVwbG9hZFBheWxvYWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XG4gICAgICAgICAgICBkb2MuaXNVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGRvYy5pc1VwbG9hZFN1Y2Nlc3MgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLm1hbmRhdG9yeURvY3VtZW50cyA9IFtdO1xuICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudHMuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXMuaW5jbHVkZXMoZC5kb2N1bWVudElkKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5tYW5kYXRvcnlEb2N1bWVudHMucHVzaChkLmRvY3VtZW50SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XG4gICAgICAgICAgICBkb2MuaXNVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JzO1xuICB9XG5cbiAgcHVsbEZyb21VSShcbiAgICBkb2M6IFVwbG9hZERvY3VtZW50RGV0YWlscyxcbiAgICBmaWxlSW5wdXQ6IEZpbGVcbiAgKTogUHJvbWlzZTxBcHBsaWNhdGlvblVwbG9hZERvY3VtZW50c0R0bz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZUlucHV0KTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGRvYy5maWxlTmFtZSA9IGZpbGVJbnB1dC5uYW1lO1xuICAgICAgICBkb2MuZmlsZURhdGEgPSByZWFkZXIucmVzdWx0Py50b1N0cmluZygpLnNwbGl0KCc7YmFzZTY0LCcpWzFdIHx8ICcnO1xuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICBsZXQgYXBwRG9jcyA9IHRoaXMuZ2V0TmV3VXBsb2FkUGF5bG9hZCgpO1xuICAgICAgICB0aGlzLmRvY3VtZW50cy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgICAgaWYgKGQuZG9jdW1lbnRJZCA9PT0gZG9jLmRvY3VtZW50SWQpIHtcbiAgICAgICAgICAgIGFwcERvY3MuZG9jdW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICBkb2N1bWVudElkOiBkLmRvY3VtZW50SWQsXG4gICAgICAgICAgICAgIGZpbGVEYXRhOiBkb2MuZmlsZURhdGEsXG4gICAgICAgICAgICAgIGZpbGVOYW1lOiBkb2MuZmlsZU5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgcmVzb2x2ZShhcHBEb2NzKTtcbiAgICAgIH07XG4gICAgICByZWFkZXIub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgbGV0IGlzVmFsaWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLmRvY3VtZW50cykge1xuICAgICAgbGV0IGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgICB0aGlzLmRvY3VtZW50cy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm1hbmRhdG9yeURvY3VtZW50cy5pbmNsdWRlcyhkLmRvY3VtZW50SWQpKSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gVXRpbHMuY3JlYXRlRXJyb3JUcmFuc2xhdGlvbk1zc2FnZVdpdGhQYXJhbWV0ZXJzKFxuICAgICAgICAgICAgdGhpcy5jb250cm9sRGF0YS5lcnJvcnNUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgICB0aGlzLmxhbmdJc28sXG4gICAgICAgICAgICAnaXNNYW5kYXRvcnknLFxuICAgICAgICAgICAgW2QuZG9jdW1lbnROYW1lXVxuICAgICAgICAgICk7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKG1zZyk7XG4gICAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5kaWFsb2cucG9wRXJyb3IoZXJyb3JNZXNzYWdlcy5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG5cbiAgc2VsZWN0RmlsZShldmVudDogYW55LCBkb2M6IFVwbG9hZERvY3VtZW50RGV0YWlscyk6IHZvaWQge1xuICAgIGRvYy5maWxlRGF0YSA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIWV2ZW50LnRhcmdldC5maWxlc1swXSB8fCBldmVudC50YXJnZXQuZmlsZXNbMF0ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIGxldCBpbnZhbGlkVHlwZTogYm9vbGVhbiA9IHRydWU7XG4gICAgICBpZiAoZG9jLmRvY3VtZW50RXh0ZW5zaW9ucyAmJiBkb2MuZG9jdW1lbnRFeHRlbnNpb25zICE9PSAnJykge1xuICAgICAgICBjb25zdCBkb2NFeHRlbnNpb25zID0gZG9jLmRvY3VtZW50RXh0ZW5zaW9ucy5zcGxpdCgnOycpO1xuICAgICAgICBpZiAoZG9jRXh0ZW5zaW9ucyAmJiBkb2NFeHRlbnNpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gVXRpbHMuZ2V0RmlsZUV4dGVuc2lvbihmaWxlLm5hbWUpO1xuICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICBkb2NFeHRlbnNpb25zLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGZpbGVFeHRlbnNpb24udG9Mb3dlckNhc2UoKSA9PSBkLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBpbnZhbGlkVHlwZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW52YWxpZFR5cGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW52YWxpZFR5cGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnZhbGlkVHlwZSkge1xuICAgICAgICB0aGlzLmRpYWxvZy5wb3BFcnJvclRyYW5zbGF0aW9uKFxuICAgICAgICAgIHRoaXMuY29udHJvbERhdGEuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMubGFuZ0lzbyxcbiAgICAgICAgICAnaW52YWxpZFR5cGUnLFxuICAgICAgICAgIGRvYy5kb2N1bWVudEV4dGVuc2lvbnNcbiAgICAgICAgKTtcbiAgICAgICAgZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSA9ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZmlsZS5zaXplKSB7XG4gICAgICAgIGNvbnN0IHNpemVJbktCID0gZmlsZS5zaXplIC8gMTAyNDtcbiAgICAgICAgaWYgKHNpemVJbktCID4gZG9jLmRvY3VtZW50TWF4U2l6ZSkge1xuICAgICAgICAgIHRoaXMuZGlhbG9nLnBvcEVycm9yVHJhbnNsYXRpb24oXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xEYXRhLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgIHRoaXMubGFuZ0lzbyxcbiAgICAgICAgICAgICdtYXhTaXplJyxcbiAgICAgICAgICAgIGRvYy5kb2N1bWVudE1heFNpemUudG9TdHJpbmcoKSArICdLQidcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSA9ICcnO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnB1bGxGcm9tVUkoZG9jLCBmaWxlKVxuICAgICAgICAudGhlbihhc3luYyAocmVzKSA9PiB7XG4gICAgICAgICAgKGF3YWl0IHRoaXMuc3VibWl0VXBsb2FkQXN5bmMoZG9jLCByZXMpKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIGZpbGU6JywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2FuQWR2YW5jZSgpOiBib29sZWFuIHtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgbGV0IGNhblByb2NlZWQgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgY2FuUHJvY2VlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhblByb2NlZWQ7XG4gIH1cblxuICBnZXROZXdVcGxvYWRQYXlsb2FkKCk6IEFwcGxpY2F0aW9uVXBsb2FkRG9jdW1lbnRzRHRvIHtcbiAgICBsZXQgdXBsb2FkUGF5bG9hZCA9IG5ldyBBcHBsaWNhdGlvblVwbG9hZERvY3VtZW50c0R0bygpO1xuICAgIHVwbG9hZFBheWxvYWQuYXBwRGF0YUlkID0gdGhpcy5hcHBEYXRhSWQ7XG4gICAgdXBsb2FkUGF5bG9hZC5hcHBJZCA9IHRoaXMuYXBwSWQ7XG4gICAgdXBsb2FkUGF5bG9hZC5jb250cm9sSWQgPSB0aGlzLmNvbnRyb2xEYXRhLmlkZW50aWZpZXI7XG4gICAgdXBsb2FkUGF5bG9hZC5lbnYgPSB0aGlzLmVudjtcbiAgICB1cGxvYWRQYXlsb2FkLmRvY3VtZW50cyA9IFtdO1xuXG4gICAgcmV0dXJuIHVwbG9hZFBheWxvYWQ7XG4gIH1cbn1cbiIsIjxwICpuZ0lmPVwidGl0bGVcIj5cbiAge3sgdGl0bGUgfX1cbjwvcD5cblxuPHRhYmxlPlxuICA8dGhlYWQgY2xhc3M9XCJ0YWJsZS1oZWFkXCI+XG4gICAgPHRyPlxuICAgICAgPHRoPlxuICAgICAgICB7eyBcImRvY3VtZW50XCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGg+XG4gICAgICAgIHt7IFwiZm9ybWF0XCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGg+XG4gICAgICAgIHt7IFwiZmx1eC5jb21wb25lbnRzLnVwbG9hZERvY3VtZW50Lm1heFNpemVcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC90aD5cbiAgICAgIDx0aD5cbiAgICAgICAge3sgXCJzdGVwQ29udHJvbC5tYW5kYXRvcnlcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC90aD5cbiAgICA8L3RyPlxuICA8L3RoZWFkPlxuICA8dGJvZHkgY2xhc3M9XCJ0YWJsZS1kZXRhaWxcIj5cbiAgICA8dHIgKm5nRm9yPVwibGV0IGRvYyBvZiBkb2N1bWVudHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDx0ZD5cbiAgICAgICAge3sgZG9jLmRvY3VtZW50TmFtZSB9fVxuICAgICAgPC90ZD5cbiAgICAgIDx0ZD5cbiAgICAgICAge3sgZG9jLmRvY3VtZW50RXh0ZW5zaW9ucyB9fVxuICAgICAgPC90ZD5cbiAgICAgIDx0ZD5cbiAgICAgICAge3sgZG9jLmRvY3VtZW50TWF4U2l6ZSB9fVxuICAgICAgPC90ZD5cbiAgICAgIDx0ZD5cbiAgICAgICAge3sgKGRvYy5pc01hbmRhdG9yeSA/IFwieWVzXCIgOiBcIm5vXCIpIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L3RkPlxuICAgICAgPHRkPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgI2ZpbGVJbnB1dFxuICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RGaWxlKCRldmVudCwgZG9jKVwiXG4gICAgICAgICAgICBoaWRkZW5cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1mbGF0LWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpcy5pc0Rpc2FibGVkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2xvdWRfdXBsb2FkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgIGRvYy5maWxlTmFtZVxuICAgICAgICAgICAgICAgID8gZG9jLmZpbGVOYW1lXG4gICAgICAgICAgICAgICAgOiAoXCJjb21tb24uYWN0aW9ucy51cGxvYWRcIiB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICAgIDx0ZCAqbmdJZj1cImRvYy5maWxlTmFtZVwiPlxuICAgICAgICA8aS10YWJsZXJcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgZG9jLmlzVXBsb2FkaW5nID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgZG9jLmlzVXBsb2FkU3VjY2VzcyA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgZG9jLmZpbGVOYW1lXG4gICAgICAgICAgXCJcbiAgICAgICAgICBjbGFzcz1cImljb24tMjUgdGV4dC13aGl0ZSBiZy1wcmltYXJ5IHJvdW5kZWRcIlxuICAgICAgICAgIG5hbWU9XCJjaGVja1wiXG4gICAgICAgID48L2ktdGFibGVyPlxuICAgICAgICA8bWF0LXNwaW5uZXJcbiAgICAgICAgICAqbmdJZj1cImRvYy5pc1VwbG9hZGluZyA9PT0gdHJ1ZVwiXG4gICAgICAgICAgY2xhc3M9XCJtLXgtYXV0byB1cGxvYWQtc3Bpbm5lclwiXG4gICAgICAgID48L21hdC1zcGlubmVyPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L3Rib2R5PlxuPC90YWJsZT5cbiJdfQ==
|
package/esm2022/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.mjs
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Component, } from '@angular/core';
|
|
2
|
+
import { FormControl, Validators } from '@angular/forms';
|
|
3
|
+
import { BehaviorSubject } from 'rxjs';
|
|
4
|
+
import { FluxType } from '../../models/forms.model';
|
|
5
|
+
import { LabelKeys } from '../../enums/label.keys';
|
|
6
|
+
import { BaseFormlyStepComponent } from '../baseFormlyStepComponent';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../../services/otp.service";
|
|
9
|
+
import * as i2 from "../../services/dialog.service";
|
|
10
|
+
import * as i3 from "@angular/common";
|
|
11
|
+
import * as i4 from "@angular/forms";
|
|
12
|
+
import * as i5 from "@angular/material/input";
|
|
13
|
+
import * as i6 from "@angular/material/form-field";
|
|
14
|
+
import * as i7 from "@angular/material/button";
|
|
15
|
+
export class FormlyValidateContactInfoComponent extends BaseFormlyStepComponent {
|
|
16
|
+
constructor(otpService, dialog, cdr) {
|
|
17
|
+
super(cdr);
|
|
18
|
+
this.otpService = otpService;
|
|
19
|
+
this.dialog = dialog;
|
|
20
|
+
this._otpButtonStyle = {};
|
|
21
|
+
this.control = new FormControl('', [Validators.required]);
|
|
22
|
+
this.otp = new FormControl('', [Validators.required]);
|
|
23
|
+
this.sent = new BehaviorSubject(false);
|
|
24
|
+
this.popMessageKeys = LabelKeys.popMessages;
|
|
25
|
+
this.otpValidated = new BehaviorSubject(false);
|
|
26
|
+
}
|
|
27
|
+
ngAfterViewInit() { }
|
|
28
|
+
onPageSelected() {
|
|
29
|
+
const styleObj = this.props?.['design']?.['.button-otpaction'];
|
|
30
|
+
if (styleObj) {
|
|
31
|
+
const camelCaseStyle = {};
|
|
32
|
+
Object.keys(styleObj).forEach((key) => {
|
|
33
|
+
const camelKey = key.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
|
|
34
|
+
camelCaseStyle[camelKey] = styleObj[key];
|
|
35
|
+
});
|
|
36
|
+
this._otpButtonStyle = camelCaseStyle;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
this._otpButtonStyle = {};
|
|
40
|
+
}
|
|
41
|
+
const group = this.form;
|
|
42
|
+
group.addControl(this.stepData.sections[0].controls[0].identifier, this.control);
|
|
43
|
+
if (this.stepData) {
|
|
44
|
+
if (this.stepData.type == FluxType.Email) {
|
|
45
|
+
this.isEmail = true;
|
|
46
|
+
this.control.setValidators([Validators.required, Validators.email]);
|
|
47
|
+
this.control.updateValueAndValidity();
|
|
48
|
+
}
|
|
49
|
+
if (this.stepData.type == FluxType.Phone) {
|
|
50
|
+
this.isEmail = false;
|
|
51
|
+
this.control.setValidators([
|
|
52
|
+
Validators.required,
|
|
53
|
+
Validators.pattern('^(\\+40|40|0)?(7[0-8][0-9]|2[0-9]{2}|3[0-9]{2})([\\s\\.-]?\\d{3}){2}$'),
|
|
54
|
+
]);
|
|
55
|
+
this.control.updateValueAndValidity();
|
|
56
|
+
}
|
|
57
|
+
if (this.stepData.config.collected) {
|
|
58
|
+
const value = this.form.get(this.stepData.config.componentCollected)?.value;
|
|
59
|
+
this.control.setValue(value);
|
|
60
|
+
this.form
|
|
61
|
+
.get(this.stepData.config.componentCollected)
|
|
62
|
+
?.valueChanges.subscribe(() => {
|
|
63
|
+
this.control.setValue(this.form.get(this.stepData.config.componentCollected)?.value);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
this.buttonText =
|
|
67
|
+
this.stepData.type === FluxType.Email
|
|
68
|
+
? this.props['labels']?.emailButtonLabel
|
|
69
|
+
: this.props['labels']?.phoneButtonLabel;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
get otpButtonStyle() {
|
|
73
|
+
return this._otpButtonStyle;
|
|
74
|
+
}
|
|
75
|
+
sendOtp() {
|
|
76
|
+
this.control.markAsTouched();
|
|
77
|
+
if (this.control.valid) {
|
|
78
|
+
this.otpService
|
|
79
|
+
.generate({
|
|
80
|
+
phoneNumber: this.stepData.type == FluxType.Phone ? this.control.value : null,
|
|
81
|
+
emailAddress: this.stepData.type == FluxType.Email ? this.control.value : null,
|
|
82
|
+
appDataId: this.appDataId,
|
|
83
|
+
stepId: this.stepData.identifier,
|
|
84
|
+
})
|
|
85
|
+
.subscribe({
|
|
86
|
+
next: (response) => {
|
|
87
|
+
if (response.ok && response.body === true) {
|
|
88
|
+
this.sent.next(true);
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
validateOtp() {
|
|
95
|
+
this.otp.markAsTouched();
|
|
96
|
+
if (this.otp.valid) {
|
|
97
|
+
this.otpService
|
|
98
|
+
.validate({
|
|
99
|
+
otpCode: this.otp.value,
|
|
100
|
+
appDataId: this.appDataId,
|
|
101
|
+
stepId: this.stepData.identifier,
|
|
102
|
+
})
|
|
103
|
+
.subscribe({
|
|
104
|
+
next: (response) => {
|
|
105
|
+
if (response.ok && response.body === true) {
|
|
106
|
+
this.dialog.popSuccess(this.props['labels'].otpSuccessLabel);
|
|
107
|
+
this.otpValidated.next(true);
|
|
108
|
+
this.onEvent('success');
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this.dialog.popError(this.props['labels'].otpErrorLabel);
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyValidateContactInfoComponent, deps: [{ token: i1.OtpService }, { token: i2.DialogService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
118
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyValidateContactInfoComponent, selector: "app-formly-validate-contact-info", usesInheritance: true, ngImport: i0, template: "<div class=\"component-text-field\">\n <div *ngIf=\"!(sent | async); else otpTemplate\">\n <mat-form-field class=\"full-width\">\n <mat-label>\n {{ isEmail ? props[\"labels\"].emailLabel : props[\"labels\"].phoneLabel }}\n </mat-label>\n <input\n matInput\n type=\"text\"\n [formControl]=\"control\"\n [readonly]=\"stepData.config.collected\"\n />\n </mat-form-field>\n <div\n *ngIf=\"\n control.invalid &&\n (control.dirty || control.touched) &&\n control.hasError('required')\n \"\n class=\"alert alert-danger\"\n >\n {{\n isEmail\n ? props[\"labels\"].emailRequiredLabel\n : props[\"labels\"].phoneRequiredLabel\n }}\n </div>\n <div\n *ngIf=\"\n control.invalid &&\n (control.dirty || control.touched) &&\n !control.hasError('required')\n \"\n class=\"alert alert-danger\"\n >\n {{\n isEmail\n ? props[\"labels\"].emailErrorLabel\n : props[\"labels\"].phoneErrorLabel\n }}\n </div>\n <button\n mat-button\n type=\"button\"\n [ngStyle]=\"otpButtonStyle\"\n (click)=\"sendOtp()\"\n >\n {{ buttonText }}\n </button>\n </div>\n</div>\n\n<ng-template #otpTemplate>\n <mat-form-field class=\"full-width\">\n <mat-label>\n {{ props[\"labels\"].otpLabel }}\n </mat-label>\n <input matInput type=\"text\" [formControl]=\"otp\" />\n </mat-form-field>\n <button\n mat-button\n type=\"button\"\n *ngIf=\"!(otpValidated | async)\"\n [ngStyle]=\"otpButtonStyle\"\n (click)=\"validateOtp()\"\n >\n {{ props[\"labels\"].otpButtonLabel }}\n </button>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.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: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
|
|
119
|
+
}
|
|
120
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyValidateContactInfoComponent, decorators: [{
|
|
121
|
+
type: Component,
|
|
122
|
+
args: [{ selector: 'app-formly-validate-contact-info', template: "<div class=\"component-text-field\">\n <div *ngIf=\"!(sent | async); else otpTemplate\">\n <mat-form-field class=\"full-width\">\n <mat-label>\n {{ isEmail ? props[\"labels\"].emailLabel : props[\"labels\"].phoneLabel }}\n </mat-label>\n <input\n matInput\n type=\"text\"\n [formControl]=\"control\"\n [readonly]=\"stepData.config.collected\"\n />\n </mat-form-field>\n <div\n *ngIf=\"\n control.invalid &&\n (control.dirty || control.touched) &&\n control.hasError('required')\n \"\n class=\"alert alert-danger\"\n >\n {{\n isEmail\n ? props[\"labels\"].emailRequiredLabel\n : props[\"labels\"].phoneRequiredLabel\n }}\n </div>\n <div\n *ngIf=\"\n control.invalid &&\n (control.dirty || control.touched) &&\n !control.hasError('required')\n \"\n class=\"alert alert-danger\"\n >\n {{\n isEmail\n ? props[\"labels\"].emailErrorLabel\n : props[\"labels\"].phoneErrorLabel\n }}\n </div>\n <button\n mat-button\n type=\"button\"\n [ngStyle]=\"otpButtonStyle\"\n (click)=\"sendOtp()\"\n >\n {{ buttonText }}\n </button>\n </div>\n</div>\n\n<ng-template #otpTemplate>\n <mat-form-field class=\"full-width\">\n <mat-label>\n {{ props[\"labels\"].otpLabel }}\n </mat-label>\n <input matInput type=\"text\" [formControl]=\"otp\" />\n </mat-form-field>\n <button\n mat-button\n type=\"button\"\n *ngIf=\"!(otpValidated | async)\"\n [ngStyle]=\"otpButtonStyle\"\n (click)=\"validateOtp()\"\n >\n {{ props[\"labels\"].otpButtonLabel }}\n </button>\n</ng-template>\n" }]
|
|
123
|
+
}], ctorParameters: () => [{ type: i1.OtpService }, { type: i2.DialogService }, { type: i0.ChangeDetectorRef }] });
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXZhbGlkYXRlLWNvbnRhY3QtaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL2Zvcm1seS9mb3JtbHktdmFsaWRhdGUtY29udGFjdC1pbmZvL2Zvcm1seS12YWxpZGF0ZS1jb250YWN0LWluZm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXZhbGlkYXRlLWNvbnRhY3QtaW5mby9mb3JtbHktdmFsaWRhdGUtY29udGFjdC1pbmZvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEdBSVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7OztBQU9yRSxNQUFNLE9BQU8sa0NBQ1gsU0FBUSx1QkFBdUI7SUFhL0IsWUFDVSxVQUFzQixFQUN0QixNQUFxQixFQUM3QixHQUFzQjtRQUV0QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFKSCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFadkIsb0JBQWUsR0FBOEIsRUFBRSxDQUFDO1FBQ3hELFlBQU8sR0FBZ0IsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFD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LFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUMzRCxDQUFDO2dCQUNILENBQUM7YUFDRixDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQzsrR0FuSVUsa0NBQWtDO21HQUFsQyxrQ0FBa0MsK0ZDbkIvQyxzdERBcUVBOzs0RkRsRGEsa0NBQWtDO2tCQUw5QyxTQUFTOytCQUNFLGtDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT3RwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL290cC5zZXJ2aWNlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRmx1eFR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvZm9ybXMubW9kZWwnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IExhYmVsS2V5cyB9IGZyb20gJy4uLy4uL2VudW1zL2xhYmVsLmtleXMnO1xuaW1wb3J0IHsgQmFzZUZvcm1seVN0ZXBDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlRm9ybWx5U3RlcENvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1mb3JtbHktdmFsaWRhdGUtY29udGFjdC1pbmZvJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm1seS12YWxpZGF0ZS1jb250YWN0LWluZm8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZm9ybWx5LXZhbGlkYXRlLWNvbnRhY3QtaW5mby5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seVZhbGlkYXRlQ29udGFjdEluZm9Db21wb25lbnRcbiAgZXh0ZW5kcyBCYXNlRm9ybWx5U3RlcENvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdFxue1xuICBwcml2YXRlIF9vdHBCdXR0b25TdHlsZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBjb250cm9sOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgb3RwOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcblxuICBzZW50OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgaXNFbWFpbDogYm9vbGVhbjtcbiAgcG9wTWVzc2FnZUtleXMgPSBMYWJlbEtleXMucG9wTWVzc2FnZXM7XG4gIG90cFZhbGlkYXRlZDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIGJ1dHRvblRleHQ6ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgb3RwU2VydmljZTogT3RwU2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogRGlhbG9nU2VydmljZSxcbiAgICBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHN1cGVyKGNkcik7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7fVxuXG4gIG92ZXJyaWRlIG9uUGFnZVNlbGVjdGVkKCkge1xuICAgIGNvbnN0IHN0eWxlT2JqID0gdGhpcy5wcm9wcz8uWydkZXNpZ24nXT8uWycuYnV0dG9uLW90cGFjdGlvbiddO1xuICAgIGlmIChzdHlsZU9iaikge1xuICAgICAgY29uc3QgY2FtZWxDYXNlU3R5bGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKHN0eWxlT2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgY2FtZWxLZXkgPSBrZXkucmVwbGFjZSgvLShbYS16XSkvZywgKGcpID0+IGdbMV0udG9VcHBlckNhc2UoKSk7XG4gICAgICAgIGNhbWVsQ2FzZVN0eWxlW2NhbWVsS2V5XSA9IHN0eWxlT2JqW2tleV07XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX290cEJ1dHRvblN0eWxlID0gY2FtZWxDYXNlU3R5bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX290cEJ1dHRvblN0eWxlID0ge307XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5mb3JtIGFzIEZvcm1Hcm91cDtcbiAgICBncm91cC5hZGRDb250cm9sKFxuICAgICAgdGhpcy5zdGVwRGF0YS5zZWN0aW9uc1swXS5jb250cm9sc1swXS5pZGVudGlmaWVyLFxuICAgICAgdGhpcy5jb250cm9sXG4gICAgKTtcblxuICAgIGlmICh0aGlzLnN0ZXBEYXRhKSB7XG4gICAgICBpZiAodGhpcy5zdGVwRGF0YS50eXBlID09IEZsdXhUeXBlLkVtYWlsKSB7XG4gICAgICAgIHRoaXMuaXNFbWFpbCA9IHRydWU7XG4gICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLmVtYWlsXSk7XG4gICAgICAgIHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0ZXBEYXRhLnR5cGUgPT0gRmx1eFR5cGUuUGhvbmUpIHtcbiAgICAgICAgdGhpcy5pc0VtYWlsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWxpZGF0b3JzKFtcbiAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgICAgIFZhbGlkYXRvcnMucGF0dGVybihcbiAgICAgICAgICAgICdeKFxcXFwrNDB8NDB8MCk/KDdbMC04XVswLTldfDJbMC05XXsyfXwzWzAtOV17Mn0pKFtcXFxcc1xcXFwuLV0/XFxcXGR7M30pezJ9JCdcbiAgICAgICAgICApLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RlcERhdGEuY29uZmlnLmNvbGxlY3RlZCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybS5nZXQoXG4gICAgICAgICAgdGhpcy5zdGVwRGF0YS5jb25maWcuY29tcG9uZW50Q29sbGVjdGVkXG4gICAgICAgICk/LnZhbHVlO1xuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuXG4gICAgICAgIHRoaXMuZm9ybVxuICAgICAgICAgIC5nZXQodGhpcy5zdGVwRGF0YS5jb25maWcuY29tcG9uZW50Q29sbGVjdGVkKVxuICAgICAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoXG4gICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5zdGVwRGF0YS5jb25maWcuY29tcG9uZW50Q29sbGVjdGVkKT8udmFsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnV0dG9uVGV4dCA9XG4gICAgICAgIHRoaXMuc3RlcERhdGEudHlwZSA9PT0gRmx1eFR5cGUuRW1haWxcbiAgICAgICAgICA/IHRoaXMucHJvcHNbJ2xhYmVscyddPy5lbWFpbEJ1dHRvbkxhYmVsXG4gICAgICAgICAgOiB0aGlzLnByb3BzWydsYWJlbHMnXT8ucGhvbmVCdXR0b25MYWJlbDtcbiAgICB9XG4gIH1cblxuICBnZXQgb3RwQnV0dG9uU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHRoaXMuX290cEJ1dHRvblN0eWxlO1xuICB9XG5cbiAgc2VuZE90cCgpIHtcbiAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuXG4gICAgaWYgKHRoaXMuY29udHJvbC52YWxpZCkge1xuICAgICAgdGhpcy5vdHBTZXJ2aWNlXG4gICAgICAgIC5nZW5lcmF0ZSh7XG4gICAgICAgICAgcGhvbmVOdW1iZXI6XG4gICAgICAgICAgICB0aGlzLnN0ZXBEYXRhLnR5cGUgPT0gRmx1eFR5cGUuUGhvbmUgPyB0aGlzLmNvbnRyb2wudmFsdWUgOiBudWxsLFxuICAgICAgICAgIGVtYWlsQWRkcmVzczpcbiAgICAgICAgICAgIHRoaXMuc3RlcERhdGEudHlwZSA9PSBGbHV4VHlwZS5FbWFpbCA/IHRoaXMuY29udHJvbC52YWx1ZSA6IG51bGwsXG4gICAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFJZCxcbiAgICAgICAgICBzdGVwSWQ6IHRoaXMuc3RlcERhdGEuaWRlbnRpZmllcixcbiAgICAgICAgfSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2sgJiYgcmVzcG9uc2UuYm9keSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICB0aGlzLnNlbnQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZU90cCgpIHtcbiAgICB0aGlzLm90cC5tYXJrQXNUb3VjaGVkKCk7XG5cbiAgICBpZiAodGhpcy5vdHAudmFsaWQpIHtcbiAgICAgIHRoaXMub3RwU2VydmljZVxuICAgICAgICAudmFsaWRhdGUoe1xuICAgICAgICAgIG90cENvZGU6IHRoaXMub3RwLnZhbHVlLFxuICAgICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhSWQsXG4gICAgICAgICAgc3RlcElkOiB0aGlzLnN0ZXBEYXRhLmlkZW50aWZpZXIsXG4gICAgICAgIH0pXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rICYmIHJlc3BvbnNlLmJvZHkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5kaWFsb2cucG9wU3VjY2Vzcyh0aGlzLnByb3BzWydsYWJlbHMnXS5vdHBTdWNjZXNzTGFiZWwpO1xuICAgICAgICAgICAgICB0aGlzLm90cFZhbGlkYXRlZC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICB0aGlzLm9uRXZlbnQoJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlhbG9nLnBvcEVycm9yKHRoaXMucHJvcHNbJ2xhYmVscyddLm90cEVycm9yTGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbXBvbmVudC10ZXh0LWZpZWxkXCI+XG4gIDxkaXYgKm5nSWY9XCIhKHNlbnQgfCBhc3luYyk7IGVsc2Ugb3RwVGVtcGxhdGVcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICA8bWF0LWxhYmVsPlxuICAgICAgICB7eyBpc0VtYWlsID8gcHJvcHNbXCJsYWJlbHNcIl0uZW1haWxMYWJlbCA6IHByb3BzW1wibGFiZWxzXCJdLnBob25lTGFiZWwgfX1cbiAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIG1hdElucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxuICAgICAgICBbcmVhZG9ubHldPVwic3RlcERhdGEuY29uZmlnLmNvbGxlY3RlZFwiXG4gICAgICAvPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgY29udHJvbC5pbnZhbGlkICYmXG4gICAgICAgIChjb250cm9sLmRpcnR5IHx8IGNvbnRyb2wudG91Y2hlZCkgJiZcbiAgICAgICAgY29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKVxuICAgICAgXCJcbiAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCJcbiAgICA+XG4gICAgICB7e1xuICAgICAgICBpc0VtYWlsXG4gICAgICAgICAgPyBwcm9wc1tcImxhYmVsc1wiXS5lbWFpbFJlcXVpcmVkTGFiZWxcbiAgICAgICAgICA6IHByb3BzW1wibGFiZWxzXCJdLnBob25lUmVxdWlyZWRMYWJlbFxuICAgICAgfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cIlxuICAgICAgICBjb250cm9sLmludmFsaWQgJiZcbiAgICAgICAgKGNvbnRyb2wuZGlydHkgfHwgY29udHJvbC50b3VjaGVkKSAmJlxuICAgICAgICAhY29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKVxuICAgICAgXCJcbiAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCJcbiAgICA+XG4gICAgICB7e1xuICAgICAgICBpc0VtYWlsXG4gICAgICAgICAgPyBwcm9wc1tcImxhYmVsc1wiXS5lbWFpbEVycm9yTGFiZWxcbiAgICAgICAgICA6IHByb3BzW1wibGFiZWxzXCJdLnBob25lRXJyb3JMYWJlbFxuICAgICAgfX1cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBtYXQtYnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtuZ1N0eWxlXT1cIm90cEJ1dHRvblN0eWxlXCJcbiAgICAgIChjbGljayk9XCJzZW5kT3RwKClcIlxuICAgID5cbiAgICAgIHt7IGJ1dHRvblRleHQgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNvdHBUZW1wbGF0ZT5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgIDxtYXQtbGFiZWw+XG4gICAgICB7eyBwcm9wc1tcImxhYmVsc1wiXS5vdHBMYWJlbCB9fVxuICAgIDwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFtmb3JtQ29udHJvbF09XCJvdHBcIiAvPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuICA8YnV0dG9uXG4gICAgbWF0LWJ1dHRvblxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgICpuZ0lmPVwiIShvdHBWYWxpZGF0ZWQgfCBhc3luYylcIlxuICAgIFtuZ1N0eWxlXT1cIm90cEJ1dHRvblN0eWxlXCJcbiAgICAoY2xpY2spPVwidmFsaWRhdGVPdHAoKVwiXG4gID5cbiAgICB7eyBwcm9wc1tcImxhYmVsc1wiXS5vdHBCdXR0b25MYWJlbCB9fVxuICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|