@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.
Files changed (182) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/action-step-handler.mjs +163 -0
  3. package/esm2022/lib/auth-client.service.mjs +69 -0
  4. package/esm2022/lib/enums/label.keys.mjs +721 -0
  5. package/esm2022/lib/form-css.helper.mjs +367 -0
  6. package/esm2022/lib/formly/baseFormlyControlComponent.mjs +52 -0
  7. package/esm2022/lib/formly/baseFormlyStepComponent.mjs +59 -0
  8. package/esm2022/lib/formly/custom-section-separator.component.mjs +32 -0
  9. package/esm2022/lib/formly/form-section-separator.component.mjs +36 -0
  10. package/esm2022/lib/formly/formly-action.mjs +56 -0
  11. package/esm2022/lib/formly/formly-checkbox/formly-checkbox.component.mjs +52 -0
  12. package/esm2022/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.mjs +261 -0
  13. package/esm2022/lib/formly/formly-download-documents/formly-download-documents.component.mjs +126 -0
  14. package/esm2022/lib/formly/formly-enrol-card/formly-enrol-card.component.mjs +120 -0
  15. package/esm2022/lib/formly/formly-field-stepper/formly-field-stepper.component.mjs +762 -0
  16. package/esm2022/lib/formly/formly-generate-documents/formly-generate-documents.component.mjs +57 -0
  17. package/esm2022/lib/formly/formly-identification.component.mjs +84 -0
  18. package/esm2022/lib/formly/formly-open-banking/formly-open-banking.component.mjs +590 -0
  19. package/esm2022/lib/formly/formly-paragraph/formly-paragraph.component.mjs +35 -0
  20. package/esm2022/lib/formly/formly-radio/formly-radio-component.mjs +49 -0
  21. package/esm2022/lib/formly/formly-row-fille.mjs +12 -0
  22. package/esm2022/lib/formly/formly-scan-id/formly-scan-id.component.mjs +284 -0
  23. package/esm2022/lib/formly/formly-sign/formly-sign.component.mjs +173 -0
  24. package/esm2022/lib/formly/formly-upload-documents/formly-upload-documents.component.mjs +198 -0
  25. package/esm2022/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.mjs +124 -0
  26. package/esm2022/lib/formly/formly-view-documents/formly-view-documents.component.mjs +245 -0
  27. package/esm2022/lib/formly/formly-view-offers/formly-view-offers.component.mjs +160 -0
  28. package/esm2022/lib/model-population.helper.mjs +265 -0
  29. package/esm2022/lib/models/application-type.model.mjs +12 -0
  30. package/esm2022/lib/models/application.model.mjs +30 -0
  31. package/esm2022/lib/models/auth/users.model.mjs +2 -0
  32. package/esm2022/lib/models/dictionary.model.mjs +20 -0
  33. package/esm2022/lib/models/flux.model.mjs +105 -0
  34. package/esm2022/lib/models/forms.model.mjs +572 -0
  35. package/esm2022/lib/models/label-info.model.mjs +2 -0
  36. package/esm2022/lib/models/label.model.mjs +2 -0
  37. package/esm2022/lib/models/language.model.mjs +3 -0
  38. package/esm2022/lib/models/list.model.mjs +2 -0
  39. package/esm2022/lib/models/partner.model.mjs +3 -0
  40. package/esm2022/lib/models/treeview.model.mjs +15 -0
  41. package/esm2022/lib/origin-form-auth.service.mjs +40 -0
  42. package/esm2022/lib/origin-form-config.model.mjs +2 -0
  43. package/esm2022/lib/origin-form-token.interceptor.mjs +35 -0
  44. package/esm2022/lib/origin-form.component.mjs +2391 -0
  45. package/esm2022/lib/origin-form.module.mjs +479 -0
  46. package/esm2022/lib/origin-form.service.mjs +14 -0
  47. package/esm2022/lib/others/check-list.database.mjs +55 -0
  48. package/esm2022/lib/others/config-service.mjs +42 -0
  49. package/esm2022/lib/others/dictionary-label-info.mjs +3 -0
  50. package/esm2022/lib/others/environment-type.mjs +21 -0
  51. package/esm2022/lib/others/external-link.directive.mjs +49 -0
  52. package/esm2022/lib/others/flux-helper.mjs +1397 -0
  53. package/esm2022/lib/others/picker.component.mjs +119 -0
  54. package/esm2022/lib/others/translation.pipe.mjs +21 -0
  55. package/esm2022/lib/others/translations-helper.mjs +258 -0
  56. package/esm2022/lib/others/utils.mjs +272 -0
  57. package/esm2022/lib/services/applicationData.service.mjs +145 -0
  58. package/esm2022/lib/services/auth-http.service.mjs +80 -0
  59. package/esm2022/lib/services/dialog.service.mjs +56 -0
  60. package/esm2022/lib/services/dictionary.service.mjs +198 -0
  61. package/esm2022/lib/services/forms.service.mjs +47 -0
  62. package/esm2022/lib/services/labels.service.mjs +29 -0
  63. package/esm2022/lib/services/language.service.mjs +24 -0
  64. package/esm2022/lib/services/open-banking.service.mjs +194 -0
  65. package/esm2022/lib/services/origin-form-signalr-handler.service.mjs +107 -0
  66. package/esm2022/lib/services/origin-form-signalr.service.mjs +105 -0
  67. package/esm2022/lib/services/otp.service.mjs +28 -0
  68. package/esm2022/lib/services/proxy.service.mjs +79 -0
  69. package/esm2022/lib/services/scroll-to-error.service.mjs +369 -0
  70. package/esm2022/lib/services/translation.service.mjs +27 -0
  71. package/esm2022/lib/shared-components/confirmation.component.mjs +34 -0
  72. package/esm2022/lib/shared-components/dictionaries-tree.component.mjs +301 -0
  73. package/esm2022/lib/shared-components/grid.component.mjs +241 -0
  74. package/esm2022/lib/shared-components/treeview/treeview.component.mjs +224 -0
  75. package/esm2022/lib/theme-css.mjs +2254 -0
  76. package/esm2022/lib/theme-injector.service.mjs +26 -0
  77. package/esm2022/public-api.mjs +4 -0
  78. package/esm2022/qbs-origin-origin-form.mjs +5 -0
  79. package/fesm2022/qbs-origin-origin-form.mjs +15215 -0
  80. package/fesm2022/qbs-origin-origin-form.mjs.map +1 -0
  81. package/index.d.ts +5 -0
  82. package/lib/action-step-handler.d.ts +49 -0
  83. package/lib/auth-client.service.d.ts +17 -0
  84. package/lib/enums/label.keys.d.ts +720 -0
  85. package/lib/form-css.helper.d.ts +28 -0
  86. package/lib/formly/baseFormlyControlComponent.d.ts +25 -0
  87. package/lib/formly/baseFormlyStepComponent.d.ts +29 -0
  88. package/lib/formly/custom-section-separator.component.d.ts +6 -0
  89. package/lib/formly/form-section-separator.component.d.ts +10 -0
  90. package/lib/formly/formly-action.d.ts +13 -0
  91. package/lib/formly/formly-checkbox/formly-checkbox.component.d.ts +15 -0
  92. package/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.d.ts +45 -0
  93. package/lib/formly/formly-download-documents/formly-download-documents.component.d.ts +22 -0
  94. package/lib/formly/formly-enrol-card/formly-enrol-card.component.d.ts +114 -0
  95. package/lib/formly/formly-field-stepper/formly-field-stepper.component.d.ts +79 -0
  96. package/lib/formly/formly-generate-documents/formly-generate-documents.component.d.ts +17 -0
  97. package/lib/formly/formly-identification.component.d.ts +19 -0
  98. package/lib/formly/formly-open-banking/formly-open-banking.component.d.ts +119 -0
  99. package/lib/formly/formly-paragraph/formly-paragraph.component.d.ts +10 -0
  100. package/lib/formly/formly-radio/formly-radio-component.d.ts +15 -0
  101. package/lib/formly/formly-row-fille.d.ts +6 -0
  102. package/lib/formly/formly-scan-id/formly-scan-id.component.d.ts +41 -0
  103. package/lib/formly/formly-sign/formly-sign.component.d.ts +36 -0
  104. package/lib/formly/formly-upload-documents/formly-upload-documents.component.d.ts +25 -0
  105. package/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.d.ts +79 -0
  106. package/lib/formly/formly-view-documents/formly-view-documents.component.d.ts +33 -0
  107. package/lib/formly/formly-view-offers/formly-view-offers.component.d.ts +23 -0
  108. package/lib/model-population.helper.d.ts +8 -0
  109. package/lib/models/application-type.model.d.ts +27 -0
  110. package/lib/models/application.model.d.ts +107 -0
  111. package/lib/models/auth/users.model.d.ts +20 -0
  112. package/lib/models/dictionary.model.d.ts +77 -0
  113. package/lib/models/flux.model.d.ts +101 -0
  114. package/lib/models/forms.model.d.ts +504 -0
  115. package/lib/models/label-info.model.d.ts +10 -0
  116. package/lib/models/label.model.d.ts +4 -0
  117. package/lib/models/language.model.d.ts +5 -0
  118. package/lib/models/list.model.d.ts +8 -0
  119. package/lib/models/partner.model.d.ts +12 -0
  120. package/lib/models/treeview.model.d.ts +17 -0
  121. package/lib/origin-form-auth.service.d.ts +15 -0
  122. package/lib/origin-form-config.model.d.ts +12 -0
  123. package/lib/origin-form-token.interceptor.d.ts +12 -0
  124. package/lib/origin-form.component.d.ts +231 -0
  125. package/lib/origin-form.module.d.ts +84 -0
  126. package/lib/origin-form.service.d.ts +6 -0
  127. package/lib/others/check-list.database.d.ts +16 -0
  128. package/lib/others/config-service.d.ts +22 -0
  129. package/lib/others/dictionary-label-info.d.ts +6 -0
  130. package/lib/others/environment-type.d.ts +8 -0
  131. package/lib/others/external-link.directive.d.ts +12 -0
  132. package/lib/others/flux-helper.d.ts +115 -0
  133. package/lib/others/picker.component.d.ts +36 -0
  134. package/lib/others/translation.pipe.d.ts +10 -0
  135. package/lib/others/translations-helper.d.ts +31 -0
  136. package/lib/others/utils.d.ts +37 -0
  137. package/lib/services/applicationData.service.d.ts +35 -0
  138. package/lib/services/auth-http.service.d.ts +21 -0
  139. package/lib/services/dialog.service.d.ts +20 -0
  140. package/lib/services/dictionary.service.d.ts +89 -0
  141. package/lib/services/forms.service.d.ts +17 -0
  142. package/lib/services/labels.service.d.ts +13 -0
  143. package/lib/services/language.service.d.ts +14 -0
  144. package/lib/services/open-banking.service.d.ts +137 -0
  145. package/lib/services/origin-form-signalr-handler.service.d.ts +29 -0
  146. package/lib/services/origin-form-signalr.service.d.ts +24 -0
  147. package/lib/services/otp.service.d.ts +22 -0
  148. package/lib/services/proxy.service.d.ts +29 -0
  149. package/lib/services/scroll-to-error.service.d.ts +54 -0
  150. package/lib/services/translation.service.d.ts +10 -0
  151. package/lib/shared-components/confirmation.component.d.ts +77 -0
  152. package/lib/shared-components/dictionaries-tree.component.d.ts +51 -0
  153. package/lib/shared-components/grid.component.d.ts +138 -0
  154. package/lib/shared-components/treeview/treeview.component.d.ts +121 -0
  155. package/lib/theme-css.d.ts +2 -0
  156. package/lib/theme-injector.service.d.ts +8 -0
  157. package/package.json +42 -0
  158. package/public-api.d.ts +3 -0
  159. package/schematics-compiled/collection.json +10 -0
  160. package/schematics-compiled/ng-add/index.d.ts +2 -0
  161. package/schematics-compiled/ng-add/index.js +67 -0
  162. package/schematics-compiled/ng-add/index.js.map +1 -0
  163. package/schematics-compiled/ng-add/schema.json +8 -0
  164. package/src/lib/assets/fonts/Figtree-Bold.ttf +0 -0
  165. package/src/lib/assets/fonts/Figtree-Light.ttf +0 -0
  166. package/src/lib/assets/fonts/Figtree-Regular.ttf +0 -0
  167. package/src/lib/assets/fonts/Sora-ExtraBold.ttf +0 -0
  168. package/src/lib/assets/fonts/Sora-Light.ttf +0 -0
  169. package/src/lib/assets/fonts/Sora-Regular.ttf +0 -0
  170. package/src/lib/assets/fonts/ttrounds-bold-webfont.woff +0 -0
  171. package/src/lib/assets/fonts/ttrounds-bold-webfont.woff2 +0 -0
  172. package/src/lib/assets/fonts/ttrounds-regular-webfont.woff +0 -0
  173. package/src/lib/assets/fonts/ttrounds-regular-webfont.woff2 +0 -0
  174. package/src/lib/assets/fonts/ttrounds-thin-webfont.woff +0 -0
  175. package/src/lib/assets/fonts/ttrounds-thin-webfont.woff2 +0 -0
  176. package/src/lib/assets/images/flag/icon-flag-de.svg +10 -0
  177. package/src/lib/assets/images/flag/icon-flag-en.svg +1 -0
  178. package/src/lib/assets/images/flag/icon-flag-es.svg +11 -0
  179. package/src/lib/assets/images/flag/icon-flag-fr.svg +1 -0
  180. package/src/lib/assets/images/flag/icon-flag-ro.svg +11 -0
  181. package/src/lib/assets/images/flag/origin-form/new-id-card.png +0 -0
  182. 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==
@@ -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=