@mtna/web-form-angular 0.0.1

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 (170) hide show
  1. package/_index.scss +25 -0
  2. package/bundles/mtna-web-form-angular.umd.js +4982 -0
  3. package/bundles/mtna-web-form-angular.umd.js.map +1 -0
  4. package/esm2015/lib/core/animations.js +8 -0
  5. package/esm2015/lib/core/api-config.js +3 -0
  6. package/esm2015/lib/core/index.js +7 -0
  7. package/esm2015/lib/core/pipes/coerce-date-item.pipe.js +23 -0
  8. package/esm2015/lib/core/pipes/coerce-form-group.pipe.js +35 -0
  9. package/esm2015/lib/core/pipes/date-quarter.pipe.js +43 -0
  10. package/esm2015/lib/core/pipes/get-auto-complete.pipe.js +42 -0
  11. package/esm2015/lib/core/pipes/get-available-quarters.pipe.js +29 -0
  12. package/esm2015/lib/core/pipes/get-form-control-error.pipe.js +20 -0
  13. package/esm2015/lib/core/pipes/get-list-icon.pipe.js +53 -0
  14. package/esm2015/lib/core/pipes/get-object-type.pipe.js +17 -0
  15. package/esm2015/lib/core/pipes/get-selected-option.pipe.js +20 -0
  16. package/esm2015/lib/core/pipes/index.js +71 -0
  17. package/esm2015/lib/core/pipes/items-with-value.pipe.js +30 -0
  18. package/esm2015/lib/core/pipes/sanitize-html.pipe.js +23 -0
  19. package/esm2015/lib/core/services/api.service.js +67 -0
  20. package/esm2015/lib/core/services/form-manager.service.js +465 -0
  21. package/esm2015/lib/core/services/index.js +5 -0
  22. package/esm2015/lib/core/services/ng-form.service.js +150 -0
  23. package/esm2015/lib/core/services/ui.service.js +333 -0
  24. package/esm2015/lib/core/utilities/find-form-control.js +29 -0
  25. package/esm2015/lib/core/utilities/find-form-item.js +25 -0
  26. package/esm2015/lib/core/utilities/flatten-steps.js +10 -0
  27. package/esm2015/lib/core/utilities/generate-form-steps.js +25 -0
  28. package/esm2015/lib/core/utilities/index.js +9 -0
  29. package/esm2015/lib/core/utilities/is-form-group.js +6 -0
  30. package/esm2015/lib/core/utilities/serializer-util.js +358 -0
  31. package/esm2015/lib/core/utilities/update-step-status.js +38 -0
  32. package/esm2015/lib/core/validators/index.js +3 -0
  33. package/esm2015/lib/core/validators/instant-validation-result-error-state-matcher.js +23 -0
  34. package/esm2015/lib/core/validators/validation-result-validator.js +19 -0
  35. package/esm2015/lib/file-upload/file-upload.component.js +66 -0
  36. package/esm2015/lib/file-upload/index.js +2 -0
  37. package/esm2015/lib/form/base-form-item.model.js +2 -0
  38. package/esm2015/lib/form/form-disabler.component.js +38 -0
  39. package/esm2015/lib/form/form-item.directive.js +22 -0
  40. package/esm2015/lib/form/form.component.js +250 -0
  41. package/esm2015/lib/form/form.module.js +214 -0
  42. package/esm2015/lib/form/index.js +5 -0
  43. package/esm2015/lib/form/white-list.model.js +11 -0
  44. package/esm2015/lib/form-item-controls/base-form-item-control.directive.js +58 -0
  45. package/esm2015/lib/form-item-controls/base-parent-item-control.directive.js +42 -0
  46. package/esm2015/lib/form-item-controls/base-single-selection-parent.directive.js +53 -0
  47. package/esm2015/lib/form-item-controls/date-range.component.js +84 -0
  48. package/esm2015/lib/form-item-controls/date.component.js +134 -0
  49. package/esm2015/lib/form-item-controls/dropdown.component.js +109 -0
  50. package/esm2015/lib/form-item-controls/index.js +8 -0
  51. package/esm2015/lib/form-item-controls/input.component.js +149 -0
  52. package/esm2015/lib/form-item-controls/year-quarter-range.component.js +75 -0
  53. package/esm2015/lib/form-item-controls/year-quarter.component.js +228 -0
  54. package/esm2015/lib/form-stepper/form-step-group.component.js +95 -0
  55. package/esm2015/lib/form-stepper/form-step-group.pipe.js +20 -0
  56. package/esm2015/lib/form-stepper/form-step.component.js +110 -0
  57. package/esm2015/lib/form-stepper/form-step.util.js +28 -0
  58. package/esm2015/lib/form-stepper/form-stepper.component.js +115 -0
  59. package/esm2015/lib/form-stepper/form-stepper.module.js +53 -0
  60. package/esm2015/lib/form-stepper/index.js +8 -0
  61. package/esm2015/lib/form-stepper/models/base-form-step.model.js +6 -0
  62. package/esm2015/lib/form-stepper/models/form-step-group.model.js +13 -0
  63. package/esm2015/lib/form-stepper/models/form-step.model.js +12 -0
  64. package/esm2015/lib/form-stepper/models/index.js +4 -0
  65. package/esm2015/lib/groups/form-item-dialog-data.model.js +14 -0
  66. package/esm2015/lib/groups/group-components.js +646 -0
  67. package/esm2015/lib/groups/index.js +3 -0
  68. package/esm2015/lib/groups/repeatable-item.component.js +23 -0
  69. package/esm2015/lib/item-header/index.js +2 -0
  70. package/esm2015/lib/item-header/item-header.component.js +108 -0
  71. package/esm2015/lib/static-form-items/index.js +3 -0
  72. package/esm2015/lib/static-form-items/ordered-list-item.js +50 -0
  73. package/esm2015/lib/static-form-items/unordered-list-item.js +52 -0
  74. package/esm2015/lib/step-card/index.js +2 -0
  75. package/esm2015/lib/step-card/step-card.component.js +53 -0
  76. package/esm2015/mtna-web-form-angular.js +5 -0
  77. package/esm2015/public-api.js +10 -0
  78. package/fesm2015/mtna-web-form-angular.js +4614 -0
  79. package/fesm2015/mtna-web-form-angular.js.map +1 -0
  80. package/lib/_index.scss +25 -0
  81. package/lib/core/_all-color.scss +25 -0
  82. package/lib/core/_all-theme.scss +28 -0
  83. package/lib/core/_all-typography.scss +25 -0
  84. package/lib/core/_core-theme.scss +43 -0
  85. package/lib/core/animations.d.ts +2 -0
  86. package/lib/core/api-config.d.ts +5 -0
  87. package/lib/core/index.d.ts +6 -0
  88. package/lib/core/pipes/coerce-date-item.pipe.d.ts +11 -0
  89. package/lib/core/pipes/coerce-form-group.pipe.d.ts +23 -0
  90. package/lib/core/pipes/date-quarter.pipe.d.ts +7 -0
  91. package/lib/core/pipes/get-auto-complete.pipe.d.ts +7 -0
  92. package/lib/core/pipes/get-available-quarters.pipe.d.ts +8 -0
  93. package/lib/core/pipes/get-form-control-error.pipe.d.ts +14 -0
  94. package/lib/core/pipes/get-list-icon.pipe.d.ts +7 -0
  95. package/lib/core/pipes/get-object-type.pipe.d.ts +7 -0
  96. package/lib/core/pipes/get-selected-option.pipe.d.ts +8 -0
  97. package/lib/core/pipes/index.d.ts +28 -0
  98. package/lib/core/pipes/items-with-value.pipe.d.ts +13 -0
  99. package/lib/core/pipes/sanitize-html.pipe.d.ts +10 -0
  100. package/lib/core/services/api.service.d.ts +41 -0
  101. package/lib/core/services/form-manager.service.d.ts +184 -0
  102. package/lib/core/services/index.d.ts +4 -0
  103. package/lib/core/services/ng-form.service.d.ts +76 -0
  104. package/lib/core/services/ui.service.d.ts +123 -0
  105. package/lib/core/utilities/find-form-control.d.ts +11 -0
  106. package/lib/core/utilities/find-form-item.d.ts +10 -0
  107. package/lib/core/utilities/flatten-steps.d.ts +7 -0
  108. package/lib/core/utilities/generate-form-steps.d.ts +3 -0
  109. package/lib/core/utilities/index.d.ts +8 -0
  110. package/lib/core/utilities/is-form-group.d.ts +3 -0
  111. package/lib/core/utilities/serializer-util.d.ts +81 -0
  112. package/lib/core/utilities/update-step-status.d.ts +14 -0
  113. package/lib/core/validators/index.d.ts +2 -0
  114. package/lib/core/validators/instant-validation-result-error-state-matcher.d.ts +13 -0
  115. package/lib/core/validators/validation-result-validator.d.ts +12 -0
  116. package/lib/file-upload/file-upload.component.d.ts +23 -0
  117. package/lib/file-upload/index.d.ts +1 -0
  118. package/lib/form/base-form-item.model.d.ts +15 -0
  119. package/lib/form/form-disabler.component.d.ts +6 -0
  120. package/lib/form/form-item.directive.d.ts +13 -0
  121. package/lib/form/form.component.d.ts +89 -0
  122. package/lib/form/form.module.d.ts +52 -0
  123. package/lib/form/index.d.ts +4 -0
  124. package/lib/form/white-list.model.d.ts +6 -0
  125. package/lib/form-item-controls/_date-item-theme.scss +29 -0
  126. package/lib/form-item-controls/_form-control-theme.scss +28 -0
  127. package/lib/form-item-controls/_year-quarter-item-theme.scss +28 -0
  128. package/lib/form-item-controls/base-form-item-control.directive.d.ts +26 -0
  129. package/lib/form-item-controls/base-parent-item-control.directive.d.ts +19 -0
  130. package/lib/form-item-controls/base-single-selection-parent.directive.d.ts +26 -0
  131. package/lib/form-item-controls/date-range.component.d.ts +12 -0
  132. package/lib/form-item-controls/date.component.d.ts +24 -0
  133. package/lib/form-item-controls/dropdown.component.d.ts +9 -0
  134. package/lib/form-item-controls/index.d.ts +7 -0
  135. package/lib/form-item-controls/input.component.d.ts +14 -0
  136. package/lib/form-item-controls/year-quarter-range.component.d.ts +9 -0
  137. package/lib/form-item-controls/year-quarter.component.d.ts +33 -0
  138. package/lib/form-stepper/_form-step-group-theme.scss +43 -0
  139. package/lib/form-stepper/_form-stepper-theme.scss +72 -0
  140. package/lib/form-stepper/form-step-group.component.d.ts +23 -0
  141. package/lib/form-stepper/form-step-group.pipe.d.ts +11 -0
  142. package/lib/form-stepper/form-step.component.d.ts +27 -0
  143. package/lib/form-stepper/form-step.util.d.ts +27 -0
  144. package/lib/form-stepper/form-stepper.component.d.ts +35 -0
  145. package/lib/form-stepper/form-stepper.module.d.ts +18 -0
  146. package/lib/form-stepper/index.d.ts +7 -0
  147. package/lib/form-stepper/models/base-form-step.model.d.ts +4 -0
  148. package/lib/form-stepper/models/form-step-group.model.d.ts +8 -0
  149. package/lib/form-stepper/models/form-step.model.d.ts +11 -0
  150. package/lib/form-stepper/models/index.d.ts +3 -0
  151. package/lib/groups/_checkbox-theme.scss +62 -0
  152. package/lib/groups/_form-group-theme.scss +32 -0
  153. package/lib/groups/_multiple-choice-theme.scss +65 -0
  154. package/lib/groups/_repeatable-item-theme.scss +28 -0
  155. package/lib/groups/form-item-dialog-data.model.d.ts +13 -0
  156. package/lib/groups/group-components.d.ts +221 -0
  157. package/lib/groups/index.d.ts +2 -0
  158. package/lib/groups/repeatable-item.component.d.ts +5 -0
  159. package/lib/item-header/_item-header-theme.scss +28 -0
  160. package/lib/item-header/index.d.ts +1 -0
  161. package/lib/item-header/item-header.component.d.ts +35 -0
  162. package/lib/static-form-items/index.d.ts +2 -0
  163. package/lib/static-form-items/ordered-list-item.d.ts +11 -0
  164. package/lib/static-form-items/unordered-list-item.d.ts +11 -0
  165. package/lib/step-card/_step-card-theme.scss +42 -0
  166. package/lib/step-card/index.d.ts +1 -0
  167. package/lib/step-card/step-card.component.d.ts +21 -0
  168. package/mtna-web-form-angular.d.ts +5 -0
  169. package/package.json +43 -0
  170. package/public-api.d.ts +9 -0
@@ -0,0 +1,150 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { skipWhile, take } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ export class MtnaWfNgFormService {
6
+ constructor() {
7
+ this.unsavedChanges$ = new BehaviorSubject(false);
8
+ }
9
+ /**
10
+ * Informs a caller when the MtnaForm is dirty and has unsaved changes.
11
+ */
12
+ get unsavedChanges() {
13
+ return this.unsavedChanges$.asObservable();
14
+ }
15
+ /**
16
+ * Add a control from the ngForm
17
+ * @param controlId id of the control being added
18
+ * @param parentIds array of ids representing the path to the parent control
19
+ * @param newControl the new form control to be added
20
+ */
21
+ addControl(controlId, parentIds, newControl) {
22
+ if (!this.ngForm) {
23
+ return;
24
+ }
25
+ const parentControl = this.ngForm.get(parentIds);
26
+ parentControl.addControl(controlId, newControl);
27
+ parentControl.markAsTouched();
28
+ parentControl.markAsDirty();
29
+ this.forceUnsavedChange();
30
+ }
31
+ /**
32
+ * Remove a control from the ngForm.
33
+ *
34
+ * @param controlId is of the control to remove
35
+ * @param parentIds rray of ids representing the path to the parent control
36
+ */
37
+ removeControl(controlId, parentIds) {
38
+ if (!this.ngForm) {
39
+ return;
40
+ }
41
+ const parentControl = this.ngForm.get(parentIds);
42
+ parentControl.removeControl(controlId);
43
+ parentControl.markAsTouched();
44
+ parentControl.markAsDirty();
45
+ this.forceUnsavedChange();
46
+ }
47
+ /**
48
+ * Get the form if it exists
49
+ * @returns the angular form or null
50
+ */
51
+ getForm() {
52
+ return this.ngForm;
53
+ }
54
+ /**
55
+ * Returns a JSON representation of form values
56
+ */
57
+ getFormValue() {
58
+ var _a;
59
+ // This includes values for disabled controls.
60
+ // We loop through MtnaForm to insert values,
61
+ // so we need the disabled controls to ensure no info loss.
62
+ return (_a = this.ngForm) === null || _a === void 0 ? void 0 : _a.getRawValue();
63
+ }
64
+ /**
65
+ * @returns Whether a form has been set on this service
66
+ */
67
+ hasForm() {
68
+ return !!this.ngForm;
69
+ }
70
+ /**
71
+ * @returns Whether the form is dirty.
72
+ */
73
+ isFormDirty() {
74
+ return !!this.ngForm && this.ngForm.dirty;
75
+ }
76
+ /**
77
+ * Unsubscribes from value changes & sets the ngForm to null.
78
+ * Should be called when any component using an MtnaForm is destroyed.
79
+ */
80
+ disposeForm() {
81
+ this.unsubscribeValueChanges();
82
+ this.ngForm = undefined;
83
+ }
84
+ /**
85
+ * Forces the unsavedChanges observable to emit true.
86
+ * Use with care, one example is when repeatable items are added/removed from the form.
87
+ */
88
+ forceUnsavedChange() {
89
+ this.unsubscribeValueChanges();
90
+ this.unsavedChanges$.next(true);
91
+ }
92
+ /**
93
+ * Marks ngForm as pristine & untouched.
94
+ */
95
+ markAsPristineAndUntouched() {
96
+ if (this.ngForm) {
97
+ this.ngForm.markAsPristine();
98
+ this.ngForm.markAsUntouched();
99
+ this.unsavedChanges$.next(this.ngForm.dirty);
100
+ this.observeNgFormChanges();
101
+ }
102
+ }
103
+ /**
104
+ * Resets the ngForm.
105
+ */
106
+ resetForm() {
107
+ if (this.ngForm) {
108
+ this.ngForm.reset();
109
+ this.unsavedChanges$.next(this.ngForm.dirty);
110
+ this.observeNgFormChanges();
111
+ }
112
+ }
113
+ /**
114
+ * Sets a FormGroup on the service so an external source may observe changes.
115
+ * @param ngForm FormGroup to be registered.
116
+ */
117
+ setForm(ngForm) {
118
+ this.ngForm = ngForm;
119
+ this.unsavedChanges$.next(this.ngForm.dirty);
120
+ if (this.ngForm.pristine) {
121
+ this.observeNgFormChanges();
122
+ }
123
+ }
124
+ /**
125
+ * Subscribes to ngForm status changes & updates the unsavedChanges observable
126
+ */
127
+ observeNgFormChanges() {
128
+ this.unsubscribeValueChanges();
129
+ if (this.ngForm) {
130
+ this.valueChangeSubscription = this.ngForm.valueChanges
131
+ .pipe(skipWhile(() => (this.ngForm ? this.ngForm.pristine : true)), take(1))
132
+ .subscribe(() => { var _a; return this.unsavedChanges$.next((_a = this.ngForm) === null || _a === void 0 ? void 0 : _a.dirty); });
133
+ }
134
+ }
135
+ /**
136
+ * Removes the ngForm status change subscription.
137
+ */
138
+ unsubscribeValueChanges() {
139
+ if (!!this.valueChangeSubscription && !this.valueChangeSubscription.closed) {
140
+ this.valueChangeSubscription.unsubscribe();
141
+ }
142
+ }
143
+ }
144
+ MtnaWfNgFormService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfNgFormService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
145
+ MtnaWfNgFormService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfNgFormService, providedIn: 'root' });
146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfNgFormService, decorators: [{
147
+ type: Injectable,
148
+ args: [{ providedIn: 'root' }]
149
+ }] });
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZm9ybS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2ViLWZvcm0tYW5ndWxhci9zcmMvbGliL2NvcmUvc2VydmljZXMvbmctZm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLGVBQWUsRUFBcUMsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFHakQsTUFBTSxPQUFPLG1CQUFtQjtJQURoQztRQUdVLG9CQUFlLEdBQXFCLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0tBMEpqRjtJQXZKQzs7T0FFRztJQUNILElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsVUFBVSxDQUFDLFNBQWlCLEVBQUUsU0FBbUIsRUFBRSxVQUEyQjtRQUM1RSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixPQUFPO1NBQ1I7UUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQWMsQ0FBQztRQUM5RCxhQUFhLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRCxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDOUIsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGFBQWEsQ0FBQyxTQUFpQixFQUFFLFNBQW1CO1FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lB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QUNSO2lCQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUUsV0FBQyxPQUFBLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQUEsSUFBSSxDQUFDLE1BQU0sMENBQUUsS0FBSyxDQUFDLENBQUEsRUFBQSxDQUFDLENBQUM7U0FDbkU7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRTtZQUMxRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDNUM7SUFDSCxDQUFDOztpSEEzSlUsbUJBQW1CO3FIQUFuQixtQkFBbUIsY0FETixNQUFNOzRGQUNuQixtQkFBbUI7a0JBRC9CLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBza2lwV2hpbGUsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTXRuYVdmTmdGb3JtU2VydmljZSB7XG4gIHByaXZhdGUgbmdGb3JtOiBGb3JtR3JvdXAgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdW5zYXZlZENoYW5nZXMkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgdmFsdWVDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5mb3JtcyBhIGNhbGxlciB3aGVuIHRoZSBNdG5hRm9ybSBpcyBkaXJ0eSBhbmQgaGFzIHVuc2F2ZWQgY2hhbmdlcy5cbiAgICovXG4gIGdldCB1bnNhdmVkQ2hhbmdlcygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy51bnNhdmVkQ2hhbmdlcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29udHJvbCBmcm9tIHRoZSBuZ0Zvcm1cbiAgICogQHBhcmFtIGNvbnRyb2xJZCBpZCBvZiB0aGUgY29udHJvbCBiZWluZyBhZGRlZFxuICAgKiBAcGFyYW0gcGFyZW50SWRzIGFycmF5IG9mIGlkcyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHBhcmVudCBjb250cm9sXG4gICAqIEBwYXJhbSBuZXdDb250cm9sIHRoZSBuZXcgZm9ybSBjb250cm9sIHRvIGJlIGFkZGVkXG4gICAqL1xuICBhZGRDb250cm9sKGNvbnRyb2xJZDogc3RyaW5nLCBwYXJlbnRJZHM6IHN0cmluZ1tdLCBuZXdDb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICBpZiAoIXRoaXMubmdGb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50Q29udHJvbCA9IHRoaXMubmdGb3JtLmdldChwYXJlbnRJZHMpIGFzIEZvcm1Hcm91cDtcbiAgICBwYXJlbnRDb250cm9sLmFkZENvbnRyb2woY29udHJvbElkLCBuZXdDb250cm9sKTtcbiAgICBwYXJlbnRDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICBwYXJlbnRDb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5mb3JjZVVuc2F2ZWRDaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjb250cm9sIGZyb20gdGhlIG5nRm9ybS5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBpcyBvZiB0aGUgY29udHJvbCB0byByZW1vdmVcbiAgICogQHBhcmFtIHBhcmVudElkcyBycmF5IG9mIGlkcyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHBhcmVudCBjb250cm9sXG4gICAqL1xuICByZW1vdmVDb250cm9sKGNvbnRyb2xJZDogc3RyaW5nLCBwYXJlbnRJZHM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCF0aGlzLm5nRm9ybSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudENvbnRyb2wgPSB0aGlzLm5nRm9ybS5nZXQocGFyZW50SWRzKSBhcyBGb3JtR3JvdXA7XG4gICAgcGFyZW50Q29udHJvbC5yZW1vdmVDb250cm9sKGNvbnRyb2xJZCk7XG4gICAgcGFyZW50Q29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgcGFyZW50Q29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgIHRoaXMuZm9yY2VVbnNhdmVkQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmb3JtIGlmIGl0IGV4aXN0c1xuICAgKiBAcmV0dXJucyB0aGUgYW5ndWxhciBmb3JtIG9yIG51bGxcbiAgICovXG4gIGdldEZvcm0oKTogRm9ybUdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5uZ0Zvcm07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgZm9ybSB2YWx1ZXNcbiAgICovXG4gIGdldEZvcm1WYWx1ZSgpIHtcbiAgICAvLyBUaGlzIGluY2x1ZGVzIHZhbHVlcyBmb3IgZGlzYWJsZWQgY29udHJvbHMuXG4gICAgLy8gV2UgbG9vcCB0aHJvdWdoIE10bmFGb3JtIHRvIGluc2VydCB2YWx1ZXMsXG4gICAgLy8gc28gd2UgbmVlZCB0aGUgZGlzYWJsZWQgY29udHJvbHMgdG8gZW5zdXJlIG5vIGluZm8gbG9zcy5cbiAgICByZXR1cm4gdGhpcy5uZ0Zvcm0/LmdldFJhd1ZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgV2hldGhlciBhIGZvcm0gaGFzIGJlZW4gc2V0IG9uIHRoaXMgc2VydmljZVxuICAgKi9cbiAgaGFzRm9ybSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLm5nRm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmb3JtIGlzIGRpcnR5LlxuICAgKi9cbiAgaXNGb3JtRGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5uZ0Zvcm0gJiYgdGhpcy5uZ0Zvcm0uZGlydHk7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGZyb20gdmFsdWUgY2hhbmdlcyAmIHNldHMgdGhlIG5nRm9ybSB0byBudWxsLlxuICAgKiBTaG91bGQgYmUgY2FsbGVkIHdoZW4gYW55IGNvbXBvbmVudCB1c2luZyBhbiBNdG5hRm9ybSBpcyBkZXN0cm95ZWQuXG4gICAqL1xuICBkaXNwb3NlRm9ybSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlVmFsdWVDaGFuZ2VzKCk7XG4gICAgdGhpcy5uZ0Zvcm0gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2VzIHRoZSB1bnNhdmVkQ2hhbmdlcyBvYnNlcnZhYmxlIHRvIGVtaXQgdHJ1ZS5cbiAgICogVXNlIHdpdGggY2FyZSwgb25lIGV4YW1wbGUgaXMgd2hlbiByZXBlYXRhYmxlIGl0ZW1zIGFyZSBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIGZvcm0uXG4gICAqL1xuICBmb3JjZVVuc2F2ZWRDaGFuZ2UoKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZVZhbHVlQ2hhbmdlcygpO1xuICAgIHRoaXMudW5zYXZlZENoYW5nZXMkLm5leHQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgbmdGb3JtIGFzIHByaXN0aW5lICYgdW50b3VjaGVkLlxuICAgKi9cbiAgbWFya0FzUHJpc3RpbmVBbmRVbnRvdWNoZWQoKSB7XG4gICAgaWYgKHRoaXMubmdGb3JtKSB7XG4gICAgICB0aGlzLm5nRm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgdGhpcy5uZ0Zvcm0ubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICB0aGlzLnVuc2F2ZWRDaGFuZ2VzJC5uZXh0KHRoaXMubmdGb3JtLmRpcnR5KTtcbiAgICAgIHRoaXMub2JzZXJ2ZU5nRm9ybUNoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBuZ0Zvcm0uXG4gICAqL1xuICByZXNldEZvcm0oKSB7XG4gICAgaWYgKHRoaXMubmdGb3JtKSB7XG4gICAgICB0aGlzLm5nRm9ybS5yZXNldCgpO1xuICAgICAgdGhpcy51bnNhdmVkQ2hhbmdlcyQubmV4dCh0aGlzLm5nRm9ybS5kaXJ0eSk7XG4gICAgICB0aGlzLm9ic2VydmVOZ0Zvcm1DaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBGb3JtR3JvdXAgb24gdGhlIHNlcnZpY2Ugc28gYW4gZXh0ZXJuYWwgc291cmNlIG1heSBvYnNlcnZlIGNoYW5nZXMuXG4gICAqIEBwYXJhbSBuZ0Zvcm0gRm9ybUdyb3VwIHRvIGJlIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBzZXRGb3JtKG5nRm9ybTogRm9ybUdyb3VwKSB7XG4gICAgdGhpcy5uZ0Zvcm0gPSBuZ0Zvcm07XG4gICAgdGhpcy51bnNhdmVkQ2hhbmdlcyQubmV4dCh0aGlzLm5nRm9ybS5kaXJ0eSk7XG4gICAgaWYgKHRoaXMubmdGb3JtLnByaXN0aW5lKSB7XG4gICAgICB0aGlzLm9ic2VydmVOZ0Zvcm1DaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gbmdGb3JtIHN0YXR1cyBjaGFuZ2VzICYgdXBkYXRlcyB0aGUgdW5zYXZlZENoYW5nZXMgb2JzZXJ2YWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBvYnNlcnZlTmdGb3JtQ2hhbmdlcygpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlVmFsdWVDaGFuZ2VzKCk7XG4gICAgaWYgKHRoaXMubmdGb3JtKSB7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5uZ0Zvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHNraXBXaGlsZSgoKSA9PiAodGhpcy5uZ0Zvcm0gPyB0aGlzLm5nRm9ybS5wcmlzdGluZSA6IHRydWUpKSxcbiAgICAgICAgICB0YWtlKDEpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVuc2F2ZWRDaGFuZ2VzJC5uZXh0KHRoaXMubmdGb3JtPy5kaXJ0eSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBuZ0Zvcm0gc3RhdHVzIGNoYW5nZSBzdWJzY3JpcHRpb24uXG4gICAqL1xuICBwcml2YXRlIHVuc3Vic2NyaWJlVmFsdWVDaGFuZ2VzKCkge1xuICAgIGlmICghIXRoaXMudmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24gJiYgIXRoaXMudmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24uY2xvc2VkKSB7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,333 @@
1
+ import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';
2
+ import { FormGroup } from '@angular/forms';
3
+ import { isPresent, isType } from '@mtna/core-ts';
4
+ import { isConditionalItem, isOptionGroupItemImpl, isOptionItemImpl } from '@mtna/web-form-ts';
5
+ import { BehaviorSubject } from 'rxjs';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/material/dialog";
8
+ /** List of default error messages to display */
9
+ export const DEFAULT_ERROR_MESSAGES = {
10
+ email: 'This field must include a valid email format.',
11
+ max: (item) => !isPresent(item) || !isPresent(item === null || item === void 0 ? void 0 : item.maxValue)
12
+ ? `This field's value must be less.`
13
+ : `${isPresent(item === null || item === void 0 ? void 0 : item.minValue) ? `Min value: ${item === null || item === void 0 ? void 0 : item.minValue} - ` : ''}Max value: ${item === null || item === void 0 ? void 0 : item.minValue}`,
14
+ maxlength: 'This field has exceeded the allowed maximum.',
15
+ maxSelected: null,
16
+ min: (item) => !isPresent(item) || !isPresent(item === null || item === void 0 ? void 0 : item.minValue)
17
+ ? `This field's value must be greater.`
18
+ : `Min value: ${item === null || item === void 0 ? void 0 : item.minValue}${!isPresent(item === null || item === void 0 ? void 0 : item.maxValue) ? '' : ` - Max value: ${item === null || item === void 0 ? void 0 : item.maxValue}`}`,
19
+ minlength: 'This field has not met the required minimum.',
20
+ minSelected: null,
21
+ nonDigit: `This field's value must be numeric.`,
22
+ pattern: `This field's input does not meet the accepted pattern.`,
23
+ positive: `This field's value cannot be negative.`,
24
+ required: 'This field is required.',
25
+ requiredTrue: `This field's value must be 'true'.`,
26
+ wholeNumber: `This field cannot contain a decimal.`,
27
+ matDatepickerParse: `This field's value is not an accepted format.`,
28
+ };
29
+ export const WEB_FORM_CUSTOM_ERRORS = new InjectionToken('mtnaWebFormCustomFormErrors');
30
+ export class MtnaWfUIService {
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ constructor(dialog, errors) {
33
+ this.dialog = dialog;
34
+ /** Map of annotation counts for each annotatable item */
35
+ this.annotations = {};
36
+ /** Map of components in the MtnaForm */
37
+ this.components = {};
38
+ /** Map of item.disabled values that have changed */
39
+ this.disabledState = {};
40
+ /** Map of toggler ID's for components that have multiple togglers */
41
+ this.multipleEnablers = {};
42
+ // Workaround for: Metadata collected contains an error that will be reported at runtime: Could not resolve type CustomErrors.
43
+ // see https://stackoverflow.com/questions/49513359/could-not-resolve-type-document-in-angular5/53715642#53715642
44
+ this.errors = errors;
45
+ }
46
+ getDisabledStates() {
47
+ return Object.assign({}, this.disabledState);
48
+ }
49
+ /**
50
+ * Returns an error message matching the error id
51
+ * @param errorId Id of the error, to find the associated error message
52
+ * @param item FormItem to pass to ValidationErrors that are functions. For instance,
53
+ * this is useful for 'min' & 'max' value limits to display more helpful messages
54
+ */
55
+ getError(errorId, item) {
56
+ // default when no custom message exists
57
+ let error = DEFAULT_ERROR_MESSAGES[errorId];
58
+ if (!!this.errors && !!item) {
59
+ // check for instance specific, via instanceId
60
+ if (isPresent(this.errors[item.instanceId]) && isPresent(this.errors[item.instanceId][errorId])) {
61
+ error = this.errors[item.instanceId][errorId];
62
+ // check for item specific, via itemId
63
+ }
64
+ else if (isPresent(this.errors[item.itemId]) && isPresent(this.errors[item.itemId][errorId])) {
65
+ error = this.errors[item.itemId][errorId];
66
+ }
67
+ }
68
+ return typeof error === 'function' ? error(item) : error;
69
+ }
70
+ /**
71
+ * Get a registered component by intance id.
72
+ * @param id the instanceId
73
+ * @returns the {@link FormItemComponent} that represents that ID or undefined if not registered.
74
+ */
75
+ getItem(id) {
76
+ return this.components[id];
77
+ }
78
+ /**
79
+ * Sets the initial map of annotation counts, and/or pushes the new count onto the component observable stream
80
+ * @param map AnnotatableNumberMap of counts mapped to their annotatableIds
81
+ */
82
+ registerAnnotations(map) {
83
+ for (const id in map) {
84
+ if (Object.prototype.hasOwnProperty.call(map, id)) {
85
+ if (!this.annotations[id]) {
86
+ this.annotations[id] = new BehaviorSubject(map[id]);
87
+ }
88
+ else {
89
+ this.annotations[id].next(map[id]);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ /**
95
+ * Maps a component to its items instanceId.
96
+ * @param component component calling this method, i.e. 'this'
97
+ */
98
+ registerSelf(component) {
99
+ this.components[component.item.instanceId] = component;
100
+ if (!!component.item.annotatableId && component.item.annotationEnabled) {
101
+ if (!this.annotations[component.item.annotatableId]) {
102
+ this.annotations[component.item.annotatableId] = new BehaviorSubject(null);
103
+ }
104
+ component.annotations$ = this.annotations[component.item.annotatableId].asObservable();
105
+ }
106
+ }
107
+ /**
108
+ * Toggles a FormItem's visiblity and enable/disable state
109
+ *
110
+ * @param enabledItemIds array of component IDs for enabled items.
111
+ * @param disabledItemIds array of component IDs for disabled items.
112
+ * @param enabled Whether the enabledItemIds are enabled.
113
+ * @param callerId instanceId of the item invoking this function
114
+ * @param reset Whether to reset the multiple enabler map of the toggled item
115
+ */
116
+ toggleFormItems(enabledItemIds, disabledItemIds, enabled, callerId, reset = false) {
117
+ if ((!enabledItemIds || !enabledItemIds.length) && (!disabledItemIds || !disabledItemIds.length)) {
118
+ return;
119
+ }
120
+ const allIds = [enabledItemIds, disabledItemIds];
121
+ for (let i = 0; i < allIds.length; i++) {
122
+ const itemIds = allIds[i];
123
+ const isEnabled = i === 0 ? enabled : !enabled;
124
+ for (const id of itemIds) {
125
+ const component = this.components[id];
126
+ // If component is registered, toggle it
127
+ if (component) {
128
+ const item = component.item;
129
+ const hasMultipleEnablers = isConditionalItem(item) && item.condition ? item.condition.itemIds.length > 1 : false;
130
+ // If item has more than 1 enabler, handle multiple enablers
131
+ if (hasMultipleEnablers) {
132
+ if (reset) {
133
+ this.multipleEnablers[item.instanceId] = null;
134
+ }
135
+ // If a map has not been registered, then build up a map to register
136
+ // Should only happen the first time an item is toggled.
137
+ if (!this.multipleEnablers[item.instanceId] && isConditionalItem(item)) {
138
+ this.multipleEnablers[item.instanceId] = this._registerCurrentEnablers(item);
139
+ }
140
+ // handle Multiple Enablers
141
+ this._handleMultipleEnablers(component, isEnabled, callerId);
142
+ }
143
+ else {
144
+ // Not multiple enablers
145
+ this._toggleDisabledStateAndControl(component, isEnabled);
146
+ }
147
+ }
148
+ else {
149
+ console.error('[toggleFormItems] component has not been registerd', id, enabled, callerId);
150
+ }
151
+ }
152
+ }
153
+ }
154
+ /**
155
+ * Generates map of all IDs currently influencing an item.
156
+ * @param toggledItem item being toggled
157
+ */
158
+ _registerCurrentEnablers(toggledItem) {
159
+ var _a;
160
+ const enablers = {};
161
+ const allIds = ((_a = toggledItem.condition) === null || _a === void 0 ? void 0 : _a.itemIds) || [];
162
+ for (const id of allIds) {
163
+ const component = this.components[id];
164
+ if (component) {
165
+ if (this._isCurrentlyToggling(component, toggledItem.instanceId)) {
166
+ enablers[component.item.instanceId] = component.item.instanceId;
167
+ }
168
+ }
169
+ else {
170
+ console.error('[registerCurrentEnablers] component has not been registered.', id);
171
+ }
172
+ }
173
+ return enablers;
174
+ }
175
+ /**
176
+ * Resets the map of components. This should be called by the form when
177
+ * it is destroyed.
178
+ */
179
+ resetComponentMap() {
180
+ this.annotations = {};
181
+ this.components = {};
182
+ this.disabledState = {};
183
+ this.multipleEnablers = {};
184
+ }
185
+ /**
186
+ * Determines if an influencer is currently toggling the specified toggledItemId.
187
+ * @param influencer Item to check whether it's currently influencing the toggledItemId
188
+ * @param toggledId InstanceId of the item being toggled
189
+ * @returns Whether the influencer is currently toggling the toggled item
190
+ */
191
+ _isCurrentlyToggling(influencer, toggledId) {
192
+ var _a, _b, _c;
193
+ const item = influencer.item;
194
+ // Item has single option property, so check if selected, or item.value is 'true'
195
+ if (isOptionItemImpl(item)) {
196
+ return item.option.selected || !!item.value || !!((_a = influencer.control) === null || _a === void 0 ? void 0 : _a.value);
197
+ }
198
+ else if (isOptionGroupItemImpl(item)) {
199
+ const value = (_c = (_b = influencer.control) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : item.value;
200
+ if (Array.isArray(value)) {
201
+ // find the index of options that contain the 'toggledId' in their enabledItems
202
+ // & check if at least 1 is selected, or its 'true' in the value
203
+ const optionIndexes = item.options.map((o, i) => (o.enabledItems.some((id) => id === toggledId) ? i : null)).filter(isPresent);
204
+ return optionIndexes.some((i) => !!value[i]);
205
+ }
206
+ else if (typeof value === 'string' && value.length) {
207
+ // if the value is a single value, get the enabling option ids and check for the value in them
208
+ return item.options.some((o) => o.option.id === value && o.enabledItems.some((id) => id === toggledId));
209
+ }
210
+ }
211
+ return false;
212
+ }
213
+ /**
214
+ * Handles component visibility for a FormItem with multiple enablers in its condition
215
+ * @param component FormItemComponent being toggled
216
+ * @param enabled Whether the component is being enabled
217
+ * @param callerId ID of the caller toggling this component
218
+ */
219
+ _handleMultipleEnablers(component, enabled, callerId) {
220
+ var _a;
221
+ const item = component.item;
222
+ const enablers = Object.assign({}, this.multipleEnablers[item.instanceId]);
223
+ let isEnabled;
224
+ if (enabled) {
225
+ enablers[callerId] = callerId;
226
+ isEnabled =
227
+ isConditionalItem(item) &&
228
+ !!item.condition &&
229
+ (!item.condition.allRequired || item.condition.itemIds.every((id) => !!enablers[id]));
230
+ }
231
+ else {
232
+ delete enablers[callerId];
233
+ isEnabled = !((isConditionalItem(item) && ((_a = item.condition) === null || _a === void 0 ? void 0 : _a.allRequired)) || !Object.keys(enablers).length);
234
+ }
235
+ // If enabled === disabled, then the state has changed
236
+ if (this._isDisabled(item) === isEnabled) {
237
+ this._toggleDisabledStateAndControl(component, isEnabled);
238
+ }
239
+ // set the new enabler map
240
+ this.multipleEnablers[item.instanceId] = enablers;
241
+ }
242
+ /**
243
+ * Enables or disables the control on a FormItemComponent
244
+ * @param component FormItemComponent to enable or disable its control
245
+ * @param enabled whether to enable the control
246
+ */
247
+ _toggleControlState(component, enabled) {
248
+ var _a, _b, _c;
249
+ if (enabled && !((_a = component.control) === null || _a === void 0 ? void 0 : _a.enabled)) {
250
+ // Enable the control if it isn't already
251
+ if (component.control instanceof FormGroup) {
252
+ this._enableIndividualControls(component);
253
+ }
254
+ else {
255
+ (_b = component.control) === null || _b === void 0 ? void 0 : _b.enable();
256
+ }
257
+ }
258
+ else if (!enabled && ((_c = component.control) === null || _c === void 0 ? void 0 : _c.enabled)) {
259
+ // Disable the control if it isn't already
260
+ component.control.disable();
261
+ }
262
+ }
263
+ /**
264
+ * Toggles both the component visiblity and the control's enable/disable status
265
+ * @param component FormItemComponent to show or hide and enable or disable
266
+ * @param enabled whether to show the component and whether to enable the component
267
+ */
268
+ _toggleDisabledStateAndControl(component, enabled) {
269
+ this.disabledState[component.item.instanceId] = !enabled;
270
+ this._toggleControlState(component, enabled);
271
+ if (isConditionalItem(component.item) && component.item.hideOnDisable) {
272
+ component.visible = enabled;
273
+ }
274
+ }
275
+ /**
276
+ * Enables controls individually using recursion.
277
+ * FormGroups should only exist for items with 'items' arrays, or
278
+ * if the component is a BaseParentItemControl
279
+ * @param comp FormItemComponent
280
+ */
281
+ _enableIndividualControls(comp) {
282
+ const group = comp.control;
283
+ if (isOptionItemImpl(comp.item) || isOptionGroupItemImpl(comp.item)) {
284
+ const map = comp.item.optionItemMap;
285
+ const self = group.get(comp.item.instanceId);
286
+ self === null || self === void 0 ? void 0 : self.enable();
287
+ for (const optionId in map) {
288
+ if (Object.prototype.hasOwnProperty.call(map, optionId)) {
289
+ const childComp = this.components[map[optionId].instanceId];
290
+ if (!this._isDisabled(childComp.item)) {
291
+ this._toggleControlState(childComp, true);
292
+ }
293
+ }
294
+ }
295
+ }
296
+ else if (isType(comp.item, 'items') && comp.item.items.length) {
297
+ // Item must have 'items' array
298
+ for (const item of comp.item.items) {
299
+ const childComp = this.components[item.instanceId];
300
+ if (!this._isDisabled(item)) {
301
+ this._toggleControlState(childComp, true);
302
+ }
303
+ }
304
+ }
305
+ group.updateValueAndValidity();
306
+ }
307
+ /**
308
+ * Determines if a component is disabled. Prioritizes the disabledState value,
309
+ * if it exists, otherwise returns the item's previous disabled value
310
+ * @param item item to check for its disabled state
311
+ */
312
+ _isDisabled(item) {
313
+ const existsInDisabledStatMap = isPresent(this.disabledState[item.instanceId]);
314
+ if (!existsInDisabledStatMap) {
315
+ return isConditionalItem(item) ? item.disabled : false;
316
+ }
317
+ else {
318
+ return this.disabledState[item.instanceId];
319
+ }
320
+ }
321
+ }
322
+ MtnaWfUIService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfUIService, deps: [{ token: i1.MatDialog }, { token: WEB_FORM_CUSTOM_ERRORS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
323
+ MtnaWfUIService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfUIService, providedIn: 'root' });
324
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfUIService, decorators: [{
325
+ type: Injectable,
326
+ args: [{ providedIn: 'root' }]
327
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: undefined, decorators: [{
328
+ type: Optional
329
+ }, {
330
+ type: Inject,
331
+ args: [WEB_FORM_CUSTOM_ERRORS]
332
+ }] }]; } });
333
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL3VpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUsU0FBUyxFQUFvQixNQUFNLGdCQUFnQixDQUFDO0FBRzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFBMkMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV4SSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFtQnZDLGdEQUFnRDtBQUNoRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBcUI7SUFDdEQsS0FBSyxFQUFFLCtDQUErQztJQUN0RCxHQUFHLEVBQUUsQ0FBQyxJQUFvRSxFQUFFLEVBQUUsQ0FDNUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFFBQVEsQ0FBQztRQUM1QyxDQUFDLENBQUMsa0NBQWtDO1FBQ3BDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFFBQVEsRUFBRTtJQUN6RyxTQUFTLEVBQUUsOENBQThDO0lBQ3pE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VUFBVSxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDOzs2R0FwU1UsZUFBZSwyQ0FZaUMsc0JBQXNCO2lIQVp0RSxlQUFlLGNBREYsTUFBTTs0RkFDbkIsZUFBZTtrQkFEM0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQWFRLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbmltcG9ydCB7IGlzUHJlc2VudCwgaXNUeXBlIH0gZnJvbSAnQG10bmEvY29yZS10cyc7XG5pbXBvcnQgeyBBbm5vdGF0YWJsZU51bWJlck1hcCB9IGZyb20gJ0BtdG5hL3Bvam8tc29jaWFsLWFuZ3VsYXInO1xuaW1wb3J0IHsgQ29uZGl0aW9uYWxJdGVtLCBGb3JtSXRlbSwgRm9ybUl0ZW1JbXBsLCBpc0NvbmRpdGlvbmFsSXRlbSwgaXNPcHRpb25Hcm91cEl0ZW1JbXBsLCBpc09wdGlvbkl0ZW1JbXBsIH0gZnJvbSAnQG10bmEvd2ViLWZvcm0tdHMnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHR5cGUgeyBNdG5hV2ZGb3JtSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2dyb3Vwcy9ncm91cC1jb21wb25lbnRzJztcblxuLyoqIFJlZ2lzdHJ5IG9mIGN1c3RvbSBlcnJvciBtZXNzYWdlcyBmb3IgYSBzcGVjaWZpYyBmb3JtIGl0ZW0uIEEgY3VzdG9tIGVycm9yIGNhbiBhbHNvXG4gKiBiZSBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHN0cmluZy4gVGhlIEZvcm1JdGVtIG9iamVjdCBpcyBwYXNzZWQgdG8gYW55IFZhbGlkYXRpb25FcnJvcnNcbiAqIHRoYXQgYXJlIGZ1bmN0aW9ucywgc28gaXRlbSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBjYW4gYmUgcHJvdmlkZWQuXG4gKiBAZXhhbXBsZSB7XG4gKiBtYXg6IGBUaGlzIGZpZWxkJ3MgdmFsdWUgbXVzdCBiZSBsZXNzLmAsXG4gKiBtaW46IChpdGVtOiBGb3JtSXRlbUltcGw8YW55PikgPT4gaW5zdGFuY2VvZldob2xlTnVtYmVySXRlbShpdGVtKVxuICogPyBgVGhpcyBmaWVsZCdzIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICR7aXRlbS5taW5WYWx1ZX0uYFxuICogOiBgVGhpcyBmaWVsZCdzIHZhbHVlIG11c3QgYmUgZ3JlYXRlci5gXG4gKiB9XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTppbnRlcmZhY2Utb3Zlci10eXBlLWxpdGVyYWxcbmV4cG9ydCB0eXBlIEN1c3RvbUVycm9ycyA9IHtcbiAgW2lkOiBzdHJpbmddOiBWYWxpZGF0aW9uRXJyb3JzO1xufTtcblxuLyoqIExpc3Qgb2YgZGVmYXVsdCBlcnJvciBtZXNzYWdlcyB0byBkaXNwbGF5ICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUzogVmFsaWRhdGlvbkVycm9ycyA9IHtcbiAgZW1haWw6ICdUaGlzIGZpZWxkIG11c3QgaW5jbHVkZSBhIHZhbGlkIGVtYWlsIGZvcm1hdC4nLFxuICBtYXg6IChpdGVtPzogRm9ybUl0ZW1JbXBsPG51bWJlcj4gJiB7IG1heFZhbHVlOiBudW1iZXI7IG1pblZhbHVlOiBudW1iZXIgfSkgPT5cbiAgICAhaXNQcmVzZW50KGl0ZW0pIHx8ICFpc1ByZXNlbnQoaXRlbT8ubWF4VmFsdWUpXG4gICAgICA/IGBUaGlzIGZpZWxkJ3MgdmFsdWUgbXVzdCBiZSBsZXNzLmBcbiAgICAgIDogYCR7aXNQcmVzZW50KGl0ZW0/Lm1pblZhbHVlKSA/IGBNaW4gdmFsdWU6ICR7aXRlbT8ubWluVmFsdWV9IC0gYCA6ICcnfU1heCB2YWx1ZTogJHtpdGVtPy5taW5WYWx1ZX1gLFxuICBtYXhsZW5ndGg6ICdUaGlzIGZpZWxkIGhhcyBleGNlZWRlZCB0aGUgYWxsb3dlZCBtYXhpbXVtLicsXG4gIG1heFNlbGVjdGVkOiBudWxsLFxuICBtaW46IChpdGVtPzogRm9ybUl0ZW1JbXBsPG51bWJlcj4gJiB7IG1heFZhbHVlOiBudW1iZXI7IG1pblZhbHVlOiBudW1iZXIgfSkgPT5cbiAgICAhaXNQcmVzZW50KGl0ZW0pIHx8ICFpc1ByZXNlbnQoaXRlbT8ubWluVmFsdWUpXG4gICAgICA/IGBUaGlzIGZpZWxkJ3MgdmFsdWUgbXVzdCBiZSBncmVhdGVyLmBcbiAgICAgIDogYE1pbiB2YWx1ZTogJHtpdGVtPy5taW5WYWx1ZX0keyFpc1ByZXNlbnQoaXRlbT8ubWF4VmFsdWUpID8gJycgOiBgIC0gTWF4IHZhbHVlOiAke2l0ZW0/Lm1heFZhbHVlfWB9YCxcbiAgbWlubGVuZ3RoOiAnVGhpcyBmaWVsZCBoYXMgbm90IG1ldCB0aGUgcmVxdWlyZWQgbWluaW11bS4nLFxuICBtaW5TZWxlY3RlZDogbnVsbCxcbiAgbm9uRGlnaXQ6IGBUaGlzIGZpZWxkJ3MgdmFsdWUgbXVzdCBiZSBudW1lcmljLmAsXG4gIHBhdHRlcm46IGBUaGlzIGZpZWxkJ3MgaW5wdXQgZG9lcyBub3QgbWVldCB0aGUgYWNjZXB0ZWQgcGF0dGVybi5gLFxuICBwb3NpdGl2ZTogYFRoaXMgZmllbGQncyB2YWx1ZSBjYW5ub3QgYmUgbmVnYXRpdmUuYCxcbiAgcmVxdWlyZWQ6ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLicsXG4gIHJlcXVpcmVkVHJ1ZTogYFRoaXMgZmllbGQncyB2YWx1ZSBtdXN0IGJlICd0cnVlJy5gLFxuICB3aG9sZU51bWJlcjogYFRoaXMgZmllbGQgY2Fubm90IGNvbnRhaW4gYSBkZWNpbWFsLmAsXG4gIG1hdERhdGVwaWNrZXJQYXJzZTogYFRoaXMgZmllbGQncyB2YWx1ZSBpcyBub3QgYW4gYWNjZXB0ZWQgZm9ybWF0LmAsXG59O1xuXG5leHBvcnQgY29uc3QgV0VCX0ZPUk1fQ1VTVE9NX0VSUk9SUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxDdXN0b21FcnJvcnM+KCdtdG5hV2ViRm9ybUN1c3RvbUZvcm1FcnJvcnMnKTtcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBNdG5hV2ZVSVNlcnZpY2Uge1xuICAvKiogTWFwIG9mIGFubm90YXRpb24gY291bnRzIGZvciBlYWNoIGFubm90YXRhYmxlIGl0ZW0gKi9cbiAgcHJpdmF0ZSBhbm5vdGF0aW9uczogeyBbaWQ6IHN0cmluZ106IEJlaGF2aW9yU3ViamVjdDxudW1iZXIgfCBudWxsPiB9ID0ge307XG4gIC8qKiBNYXAgb2YgY29tcG9uZW50cyBpbiB0aGUgTXRuYUZvcm0gKi9cbiAgcHJpdmF0ZSBjb21wb25lbnRzOiB7IFtpbnN0YW5jZUlkOiBzdHJpbmddOiBNdG5hV2ZGb3JtSXRlbUNvbXBvbmVudCB9ID0ge307XG4gIC8qKiBNYXAgb2YgaXRlbS5kaXNhYmxlZCB2YWx1ZXMgdGhhdCBoYXZlIGNoYW5nZWQgKi9cbiAgcHJpdmF0ZSBkaXNhYmxlZFN0YXRlOiB7IFtpbnN0YW5jZUlkOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgLyoqIE1hcCBvZiB0b2dnbGVyIElEJ3MgZm9yIGNvbXBvbmVudHMgdGhhdCBoYXZlIG11bHRpcGxlIHRvZ2dsZXJzICovXG4gIHByaXZhdGUgbXVsdGlwbGVFbmFibGVyczogeyBbaW5zdGFuY2VJZDogc3RyaW5nXTogeyBbdG9nZ2xlcklkOiBzdHJpbmddOiBzdHJpbmcgfSB8IG51bGwgfSA9IHt9O1xuICBwcml2YXRlIGVycm9yczogQ3VzdG9tRXJyb3JzO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csIEBPcHRpb25hbCgpIEBJbmplY3QoV0VCX0ZPUk1fQ1VTVE9NX0VSUk9SUykgZXJyb3JzPzogYW55KSB7XG4gICAgLy8gV29ya2Fyb3VuZCBmb3I6IE1ldGFkYXRhIGNvbGxlY3RlZCBjb250YWlucyBhbiBlcnJvciB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgYXQgcnVudGltZTogQ291bGQgbm90IHJlc29sdmUgdHlwZSBDdXN0b21FcnJvcnMuXG4gICAgLy8gc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5NTEzMzU5L2NvdWxkLW5vdC1yZXNvbHZlLXR5cGUtZG9jdW1lbnQtaW4tYW5ndWxhcjUvNTM3MTU2NDIjNTM3MTU2NDJcbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycyBhcyBDdXN0b21FcnJvcnM7XG4gIH1cblxuICBnZXREaXNhYmxlZFN0YXRlcygpIHtcbiAgICByZXR1cm4geyAuLi50aGlzLmRpc2FibGVkU3RhdGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UgbWF0Y2hpbmcgdGhlIGVycm9yIGlkXG4gICAqIEBwYXJhbSBlcnJvcklkIElkIG9mIHRoZSBlcnJvciwgdG8gZmluZCB0aGUgYXNzb2NpYXRlZCBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSBpdGVtIEZvcm1JdGVtIHRvIHBhc3MgdG8gVmFsaWRhdGlvbkVycm9ycyB0aGF0IGFyZSBmdW5jdGlvbnMuIEZvciBpbnN0YW5jZSxcbiAgICogdGhpcyBpcyB1c2VmdWwgZm9yICdtaW4nICYgJ21heCcgdmFsdWUgbGltaXRzIHRvIGRpc3BsYXkgbW9yZSBoZWxwZnVsIG1lc3NhZ2VzXG4gICAqL1xuICBnZXRFcnJvcihlcnJvcklkOiBzdHJpbmcsIGl0ZW0/OiBGb3JtSXRlbUltcGw8dW5rbm93bj4pOiBzdHJpbmcge1xuICAgIC8vIGRlZmF1bHQgd2hlbiBubyBjdXN0b20gbWVzc2FnZSBleGlzdHNcbiAgICBsZXQgZXJyb3IgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTW2Vycm9ySWRdO1xuICAgIGlmICghIXRoaXMuZXJyb3JzICYmICEhaXRlbSkge1xuICAgICAgLy8gY2hlY2sgZm9yIGluc3RhbmNlIHNwZWNpZmljLCB2aWEgaW5zdGFuY2VJZFxuICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmVycm9yc1tpdGVtLmluc3RhbmNlSWRdKSAmJiBpc1ByZXNlbnQodGhpcy5lcnJvcnNbaXRlbS5pbnN0YW5jZUlkXVtlcnJvcklkXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0aGlzLmVycm9yc1tpdGVtLmluc3RhbmNlSWRdW2Vycm9ySWRdO1xuICAgICAgICAvLyBjaGVjayBmb3IgaXRlbSBzcGVjaWZpYywgdmlhIGl0ZW1JZFxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQodGhpcy5lcnJvcnNbaXRlbS5pdGVtSWRdKSAmJiBpc1ByZXNlbnQodGhpcy5lcnJvcnNbaXRlbS5pdGVtSWRdW2Vycm9ySWRdKSkge1xuICAgICAgICBlcnJvciA9IHRoaXMuZXJyb3JzW2l0ZW0uaXRlbUlkXVtlcnJvcklkXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IGVycm9yKGl0ZW0pIDogZXJyb3I7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgcmVnaXN0ZXJlZCBjb21wb25lbnQgYnkgaW50YW5jZSBpZC5cbiAgICogQHBhcmFtIGlkIHRoZSBpbnN0YW5jZUlkXG4gICAqIEByZXR1cm5zIHRoZSB7QGxpbmsgRm9ybUl0ZW1Db21wb25lbnR9IHRoYXQgcmVwcmVzZW50cyB0aGF0IElEIG9yIHVuZGVmaW5lZCBpZiBub3QgcmVnaXN0ZXJlZC5cbiAgICovXG4gIGdldEl0ZW0oaWQ6IHN0cmluZyk6IE10bmFXZkZvcm1JdGVtQ29tcG9uZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRzW2lkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbml0aWFsIG1hcCBvZiBhbm5vdGF0aW9uIGNvdW50cywgYW5kL29yIHB1c2hlcyB0aGUgbmV3IGNvdW50IG9udG8gdGhlIGNvbXBvbmVudCBvYnNlcnZhYmxlIHN0cmVhbVxuICAgKiBAcGFyYW0gbWFwIEFubm90YXRhYmxlTnVtYmVyTWFwIG9mIGNvdW50cyBtYXBwZWQgdG8gdGhlaXIgYW5ub3RhdGFibGVJZHNcbiAgICovXG4gIHJlZ2lzdGVyQW5ub3RhdGlvbnMobWFwOiBBbm5vdGF0YWJsZU51bWJlck1hcCkge1xuICAgIGZvciAoY29uc3QgaWQgaW4gbWFwKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1hcCwgaWQpKSB7XG4gICAgICAgIGlmICghdGhpcy5hbm5vdGF0aW9uc1tpZF0pIHtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25zW2lkXSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyIHwgbnVsbD4obWFwW2lkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hbm5vdGF0aW9uc1tpZF0ubmV4dChtYXBbaWRdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGEgY29tcG9uZW50IHRvIGl0cyBpdGVtcyBpbnN0YW5jZUlkLlxuICAgKiBAcGFyYW0gY29tcG9uZW50IGNvbXBvbmVudCBjYWxsaW5nIHRoaXMgbWV0aG9kLCBpLmUuICd0aGlzJ1xuICAgKi9cbiAgcmVnaXN0ZXJTZWxmKGNvbXBvbmVudDogTXRuYVdmRm9ybUl0ZW1Db21wb25lbnQpIHtcbiAgICB0aGlzLmNvbXBvbmVudHNbY29tcG9uZW50Lml0ZW0uaW5zdGFuY2VJZF0gPSBjb21wb25lbnQ7XG4gICAgaWYgKCEhY29tcG9uZW50Lml0ZW0uYW5ub3RhdGFibGVJZCAmJiBjb21wb25lbnQuaXRlbS5hbm5vdGF0aW9uRW5hYmxlZCkge1xuICAgICAgaWYgKCF0aGlzLmFubm90YXRpb25zW2NvbXBvbmVudC5pdGVtLmFubm90YXRhYmxlSWRdKSB7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbnNbY29tcG9uZW50Lml0ZW0uYW5ub3RhdGFibGVJZF0gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IG51bGw+KG51bGwpO1xuICAgICAgfVxuICAgICAgY29tcG9uZW50LmFubm90YXRpb25zJCA9IHRoaXMuYW5ub3RhdGlvbnNbY29tcG9uZW50Lml0ZW0uYW5ub3RhdGFibGVJZF0uYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgYSBGb3JtSXRlbSdzIHZpc2libGl0eSBhbmQgZW5hYmxlL2Rpc2FibGUgc3RhdGVcbiAgICpcbiAgICogQHBhcmFtIGVuYWJsZWRJdGVtSWRzIGFycmF5IG9mIGNvbXBvbmVudCBJRHMgZm9yIGVuYWJsZWQgaXRlbXMuXG4gICAqIEBwYXJhbSBkaXNhYmxlZEl0ZW1JZHMgYXJyYXkgb2YgY29tcG9uZW50IElEcyBmb3IgZGlzYWJsZWQgaXRlbXMuXG4gICAqIEBwYXJhbSBlbmFibGVkIFdoZXRoZXIgdGhlIGVuYWJsZWRJdGVtSWRzIGFyZSBlbmFibGVkLlxuICAgKiBAcGFyYW0gY2FsbGVySWQgaW5zdGFuY2VJZCBvZiB0aGUgaXRlbSBpbnZva2luZyB0aGlzIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSByZXNldCBXaGV0aGVyIHRvIHJlc2V0IHRoZSBtdWx0aXBsZSBlbmFibGVyIG1hcCBvZiB0aGUgdG9nZ2xlZCBpdGVtXG4gICAqL1xuICB0b2dnbGVGb3JtSXRlbXMoZW5hYmxlZEl0ZW1JZHM6IEFycmF5PHN0cmluZz4sIGRpc2FibGVkSXRlbUlkczogQXJyYXk8c3RyaW5nPiwgZW5hYmxlZDogYm9vbGVhbiwgY2FsbGVySWQ6IHN0cmluZywgcmVzZXQgPSBmYWxzZSkge1xuICAgIGlmICgoIWVuYWJsZWRJdGVtSWRzIHx8ICFlbmFibGVkSXRlbUlkcy5sZW5ndGgpICYmICghZGlzYWJsZWRJdGVtSWRzIHx8ICFkaXNhYmxlZEl0ZW1JZHMubGVuZ3RoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbGxJZHMgPSBbZW5hYmxlZEl0ZW1JZHMsIGRpc2FibGVkSXRlbUlkc107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW1JZHMgPSBhbGxJZHNbaV07XG4gICAgICBjb25zdCBpc0VuYWJsZWQgPSBpID09PSAwID8gZW5hYmxlZCA6ICFlbmFibGVkO1xuICAgICAgZm9yIChjb25zdCBpZCBvZiBpdGVtSWRzKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tpZF07XG4gICAgICAgIC8vIElmIGNvbXBvbmVudCBpcyByZWdpc3RlcmVkLCB0b2dnbGUgaXRcbiAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb21wb25lbnQuaXRlbTtcbiAgICAgICAgICBjb25zdCBoYXNNdWx0aXBsZUVuYWJsZXJzID0gaXNDb25kaXRpb25hbEl0ZW0oaXRlbSkgJiYgaXRlbS5jb25kaXRpb24gPyBpdGVtLmNvbmRpdGlvbi5pdGVtSWRzLmxlbmd0aCA+IDEgOiBmYWxzZTtcbiAgICAgICAgICAvLyBJZiBpdGVtIGhhcyBtb3JlIHRoYW4gMSBlbmFibGVyLCBoYW5kbGUgbXVsdGlwbGUgZW5hYmxlcnNcbiAgICAgICAgICBpZiAoaGFzTXVsdGlwbGVFbmFibGVycykge1xuICAgICAgICAgICAgaWYgKHJlc2V0KSB7XG4gICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVFbmFibGVyc1tpdGVtLmluc3RhbmNlSWRdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGEgbWFwIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLCB0aGVuIGJ1aWxkIHVwIGEgbWFwIHRvIHJlZ2lzdGVyXG4gICAgICAgICAgICAvLyBTaG91bGQgb25seSBoYXBwZW4gdGhlIGZpcnN0IHRpbWUgYW4gaXRlbSBpcyB0b2dnbGVkLlxuICAgICAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlRW5hYmxlcnNbaXRlbS5pbnN0YW5jZUlkXSAmJiBpc0NvbmRpdGlvbmFsSXRlbShpdGVtKSkge1xuICAgICAgICAgICAgICB0aGlzLm11bHRpcGxlRW5hYmxlcnNbaXRlbS5pbnN0YW5jZUlkXSA9IHRoaXMuX3JlZ2lzdGVyQ3VycmVudEVuYWJsZXJzKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaGFuZGxlIE11bHRpcGxlIEVuYWJsZXJzXG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVNdWx0aXBsZUVuYWJsZXJzKGNvbXBvbmVudCwgaXNFbmFibGVkLCBjYWxsZXJJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdCBtdWx0aXBsZSBlbmFibGVyc1xuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlRGlzYWJsZWRTdGF0ZUFuZENvbnRyb2woY29tcG9uZW50LCBpc0VuYWJsZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbdG9nZ2xlRm9ybUl0ZW1zXSBjb21wb25lbnQgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZCcsIGlkLCBlbmFibGVkLCBjYWxsZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIG1hcCBvZiBhbGwgSURzIGN1cnJlbnRseSBpbmZsdWVuY2luZyBhbiBpdGVtLlxuICAgKiBAcGFyYW0gdG9nZ2xlZEl0ZW0gaXRlbSBiZWluZyB0b2dnbGVkXG4gICAqL1xuICBwcml2YXRlIF9yZWdpc3RlckN1cnJlbnRFbmFibGVycyh0b2dnbGVkSXRlbTogQ29uZGl0aW9uYWxJdGVtKTogeyBbY2FsbGVySWQ6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBlbmFibGVyczogeyBbY2FsbGVySWQ6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgY29uc3QgYWxsSWRzID0gdG9nZ2xlZEl0ZW0uY29uZGl0aW9uPy5pdGVtSWRzIHx8IFtdO1xuXG4gICAgZm9yIChjb25zdCBpZCBvZiBhbGxJZHMpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tpZF07XG4gICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0N1cnJlbnRseVRvZ2dsaW5nKGNvbXBvbmVudCwgdG9nZ2xlZEl0ZW0uaW5zdGFuY2VJZCkpIHtcbiAgICAgICAgICBlbmFibGVyc1tjb21wb25lbnQuaXRlbS5pbnN0YW5jZUlkXSA9IGNvbXBvbmVudC5pdGVtLmluc3RhbmNlSWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWdpc3RlckN1cnJlbnRFbmFibGVyc10gY29tcG9uZW50IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLicsIGlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW5hYmxlcnM7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBtYXAgb2YgY29tcG9uZW50cy4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBmb3JtIHdoZW5cbiAgICogaXQgaXMgZGVzdHJveWVkLlxuICAgKi9cbiAgcmVzZXRDb21wb25lbnRNYXAoKSB7XG4gICAgdGhpcy5hbm5vdGF0aW9ucyA9IHt9O1xuICAgIHRoaXMuY29tcG9uZW50cyA9IHt9O1xuICAgIHRoaXMuZGlzYWJsZWRTdGF0ZSA9IHt9O1xuICAgIHRoaXMubXVsdGlwbGVFbmFibGVycyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYW4gaW5mbHVlbmNlciBpcyBjdXJyZW50bHkgdG9nZ2xpbmcgdGhlIHNwZWNpZmllZCB0b2dnbGVkSXRlbUlkLlxuICAgKiBAcGFyYW0gaW5mbHVlbmNlciBJdGVtIHRvIGNoZWNrIHdoZXRoZXIgaXQncyBjdXJyZW50bHkgaW5mbHVlbmNpbmcgdGhlIHRvZ2dsZWRJdGVtSWRcbiAgICogQHBhcmFtIHRvZ2dsZWRJZCBJbnN0YW5jZUlkIG9mIHRoZSBpdGVtIGJlaW5nIHRvZ2dsZWRcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgaW5mbHVlbmNlciBpcyBjdXJyZW50bHkgdG9nZ2xpbmcgdGhlIHRvZ2dsZWQgaXRlbVxuICAgKi9cbiAgcHJpdmF0ZSBfaXNDdXJyZW50bHlUb2dnbGluZyhpbmZsdWVuY2VyOiBNdG5hV2ZGb3JtSXRlbUNvbXBvbmVudCwgdG9nZ2xlZElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBpdGVtID0gaW5mbHVlbmNlci5pdGVtO1xuICAgIC8vIEl0ZW0gaGFzIHNpbmdsZSBvcHRpb24gcHJvcGVydHksIHNvIGNoZWNrIGlmIHNlbGVjdGVkLCBvciBpdGVtLnZhbHVlIGlzICd0cnVlJ1xuICAgIGlmIChpc09wdGlvbkl0ZW1JbXBsKGl0ZW0pKSB7XG4gICAgICByZXR1cm4gaXRlbS5vcHRpb24uc2VsZWN0ZWQgfHwgISFpdGVtLnZhbHVlIHx8ICEhaW5mbHVlbmNlci5jb250cm9sPy52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGlzT3B0aW9uR3JvdXBJdGVtSW1wbChpdGVtKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbmZsdWVuY2VyLmNvbnRyb2w/LnZhbHVlID8/IGl0ZW0udmFsdWU7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZmluZCB0aGUgaW5kZXggb2Ygb3B0aW9ucyB0aGF0IGNvbnRhaW4gdGhlICd0b2dnbGVkSWQnIGluIHRoZWlyIGVuYWJsZWRJdGVtc1xuICAgICAgICAvLyAmIGNoZWNrIGlmIGF0IGxlYXN0IDEgaXMgc2VsZWN0ZWQsIG9yIGl0cyAndHJ1ZScgaW4gdGhlIHZhbHVlXG4gICAgICAgIGNvbnN0IG9wdGlvbkluZGV4ZXMgPSBpdGVtLm9wdGlvbnMubWFwKChvLCBpKSA9PiAoby5lbmFibGVkSXRlbXMuc29tZSgoaWQpID0+IGlkID09PSB0b2dnbGVkSWQpID8gaSA6IG51bGwpKS5maWx0ZXIoaXNQcmVzZW50KTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbkluZGV4ZXMuc29tZSgoaSkgPT4gISF2YWx1ZVtpXSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhIHNpbmdsZSB2YWx1ZSwgZ2V0IHRoZSBlbmFibGluZyBvcHRpb24gaWRzIGFuZCBjaGVjayBmb3IgdGhlIHZhbHVlIGluIHRoZW1cbiAgICAgICAgcmV0dXJuIGl0ZW0ub3B0aW9ucy5zb21lKChvKSA9PiBvLm9wdGlvbi5pZCA9PT0gdmFsdWUgJiYgby5lbmFibGVkSXRlbXMuc29tZSgoaWQpID0+IGlkID09PSB0b2dnbGVkSWQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY29tcG9uZW50IHZpc2liaWxpdHkgZm9yIGEgRm9ybUl0ZW0gd2l0aCBtdWx0aXBsZSBlbmFibGVycyBpbiBpdHMgY29uZGl0aW9uXG4gICAqIEBwYXJhbSBjb21wb25lbnQgRm9ybUl0ZW1Db21wb25lbnQgYmVpbmcgdG9nZ2xlZFxuICAgKiBAcGFyYW0gZW5hYmxlZCBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgYmVpbmcgZW5hYmxlZFxuICAgKiBAcGFyYW0gY2FsbGVySWQgSUQgb2YgdGhlIGNhbGxlciB0b2dnbGluZyB0aGlzIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlTXVsdGlwbGVFbmFibGVycyhjb21wb25lbnQ6IE10bmFXZkZvcm1JdGVtQ29tcG9uZW50LCBlbmFibGVkOiBib29sZWFuLCBjYWxsZXJJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaXRlbSA9IGNvbXBvbmVudC5pdGVtO1xuICAgIGNvbnN0IGVuYWJsZXJzID0geyAuLi50aGlzLm11bHRpcGxlRW5hYmxlcnNbaXRlbS5pbnN0YW5jZUlkXSB9O1xuICAgIGxldCBpc0VuYWJsZWQ6IGJvb2xlYW47XG4gICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgIGVuYWJsZXJzW2NhbGxlcklkXSA9IGNhbGxlcklkO1xuICAgICAgaXNFbmFibGVkID1cbiAgICAgICAgaXNDb25kaXRpb25hbEl0ZW0oaXRlbSkgJiZcbiAgICAgICAgISFpdGVtLmNvbmRpdGlvbiAmJlxuICAgICAgICAoIWl0ZW0uY29uZGl0aW9uLmFsbFJlcXVpcmVkIHx8IGl0ZW0uY29uZGl0aW9uLml0ZW1JZHMuZXZlcnkoKGlkKSA9PiAhIWVuYWJsZXJzW2lkXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgZW5hYmxlcnNbY2FsbGVySWRdO1xuICAgICAgaXNFbmFibGVkID0gISgoaXNDb25kaXRpb25hbEl0ZW0oaXRlbSkgJiYgaXRlbS5jb25kaXRpb24/LmFsbFJlcXVpcmVkKSB8fCAhT2JqZWN0LmtleXMoZW5hYmxlcnMpLmxlbmd0aCk7XG4gICAgfVxuICAgIC8vIElmIGVuYWJsZWQgPT09IGRpc2FibGVkLCB0aGVuIHRoZSBzdGF0ZSBoYXMgY2hhbmdlZFxuICAgIGlmICh0aGlzLl9pc0Rpc2FibGVkKGl0ZW0pID09PSBpc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3RvZ2dsZURpc2FibGVkU3RhdGVBbmRDb250cm9sKGNvbXBvbmVudCwgaXNFbmFibGVkKTtcbiAgICB9XG4gICAgLy8gc2V0IHRoZSBuZXcgZW5hYmxlciBtYXBcbiAgICB0aGlzLm11bHRpcGxlRW5hYmxlcnNbaXRlbS5pbnN0YW5jZUlkXSA9IGVuYWJsZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGNvbnRyb2wgb24gYSBGb3JtSXRlbUNvbXBvbmVudFxuICAgKiBAcGFyYW0gY29tcG9uZW50IEZvcm1JdGVtQ29tcG9uZW50IHRvIGVuYWJsZSBvciBkaXNhYmxlIGl0cyBjb250cm9sXG4gICAqIEBwYXJhbSBlbmFibGVkIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSBjb250cm9sXG4gICAqL1xuICBwcml2YXRlIF90b2dnbGVDb250cm9sU3RhdGUoY29tcG9uZW50OiBNdG5hV2ZGb3JtSXRlbUNvbXBvbmVudCwgZW5hYmxlZDogYm9vbGVhbikge1xuICAgIGlmIChlbmFibGVkICYmICFjb21wb25lbnQuY29udHJvbD8uZW5hYmxlZCkge1xuICAgICAgLy8gRW5hYmxlIHRoZSBjb250cm9sIGlmIGl0IGlzbid0IGFscmVhZHlcbiAgICAgIGlmIChjb21wb25lbnQuY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLl9lbmFibGVJbmRpdmlkdWFsQ29udHJvbHMoY29tcG9uZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC5jb250cm9sPy5lbmFibGUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFlbmFibGVkICYmIGNvbXBvbmVudC5jb250cm9sPy5lbmFibGVkKSB7XG4gICAgICAvLyBEaXNhYmxlIHRoZSBjb250cm9sIGlmIGl0IGlzbid0IGFscmVhZHlcbiAgICAgIGNvbXBvbmVudC5jb250cm9sLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyBib3RoIHRoZSBjb21wb25lbnQgdmlzaWJsaXR5IGFuZCB0aGUgY29udHJvbCdzIGVuYWJsZS9kaXNhYmxlIHN0YXR1c1xuICAgKiBAcGFyYW0gY29tcG9uZW50IEZvcm1JdGVtQ29tcG9uZW50IHRvIHNob3cgb3IgaGlkZSBhbmQgZW5hYmxlIG9yIGRpc2FibGVcbiAgICogQHBhcmFtIGVuYWJsZWQgd2hldGhlciB0byBzaG93IHRoZSBjb21wb25lbnQgYW5kIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSBjb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgX3RvZ2dsZURpc2FibGVkU3RhdGVBbmRDb250cm9sKGNvbXBvbmVudDogTXRuYVdmRm9ybUl0ZW1Db21wb25lbnQsIGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkU3RhdGVbY29tcG9uZW50Lml0ZW0uaW5zdGFuY2VJZF0gPSAhZW5hYmxlZDtcbiAgICB0aGlzLl90b2dnbGVDb250cm9sU3RhdGUoY29tcG9uZW50LCBlbmFibGVkKTtcbiAgICBpZiAoaXNDb25kaXRpb25hbEl0ZW0oY29tcG9uZW50Lml0ZW0pICYmIGNvbXBvbmVudC5pdGVtLmhpZGVPbkRpc2FibGUpIHtcbiAgICAgIGNvbXBvbmVudC52aXNpYmxlID0gZW5hYmxlZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlcyBjb250cm9scyBpbmRpdmlkdWFsbHkgdXNpbmcgcmVjdXJzaW9uLlxuICAgKiBGb3JtR3JvdXBzIHNob3VsZCBvbmx5IGV4aXN0IGZvciBpdGVtcyB3aXRoICdpdGVtcycgYXJyYXlzLCBvclxuICAgKiBpZiB0aGUgY29tcG9uZW50IGlzIGEgQmFzZVBhcmVudEl0ZW1Db250cm9sXG4gICAqIEBwYXJhbSBjb21wIEZvcm1JdGVtQ29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIF9lbmFibGVJbmRpdmlkdWFsQ29udHJvbHMoY29tcDogTXRuYVdmRm9ybUl0ZW1Db21wb25lbnQpIHtcbiAgICBjb25zdCBncm91cCA9IGNvbXAuY29udHJvbCBhcyBGb3JtR3JvdXA7XG5cbiAgICBpZiAoaXNPcHRpb25JdGVtSW1wbChjb21wLml0ZW0pIHx8IGlzT3B0aW9uR3JvdXBJdGVtSW1wbChjb21wLml0ZW0pKSB7XG4gICAgICBjb25zdCBtYXAgPSBjb21wLml0ZW0ub3B0aW9uSXRlbU1hcDtcbiAgICAgIGNvbnN0IHNlbGYgPSBncm91cC5nZXQoY29tcC5pdGVtLmluc3RhbmNlSWQpO1xuICAgICAgc2VsZj8uZW5hYmxlKCk7XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbklkIGluIG1hcCkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1hcCwgb3B0aW9uSWQpKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGRDb21wID0gdGhpcy5jb21wb25lbnRzW21hcFtvcHRpb25JZF0uaW5zdGFuY2VJZF07XG4gICAgICAgICAgaWYgKCF0aGlzLl9pc0Rpc2FibGVkKGNoaWxkQ29tcC5pdGVtKSkge1xuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ29udHJvbFN0YXRlKGNoaWxkQ29tcCwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1R5cGU8eyBpdGVtczogRm9ybUl0ZW1JbXBsPHVua25vd24+W10gfT4oY29tcC5pdGVtLCAnaXRlbXMnKSAmJiBjb21wLml0ZW0uaXRlbXMubGVuZ3RoKSB7XG4gICAgICAvLyBJdGVtIG11c3QgaGF2ZSAnaXRlbXMnIGFycmF5XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29tcC5pdGVtLml0ZW1zKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkQ29tcCA9IHRoaXMuY29tcG9uZW50c1tpdGVtLmluc3RhbmNlSWRdO1xuICAgICAgICBpZiAoIXRoaXMuX2lzRGlzYWJsZWQoaXRlbSkpIHtcbiAgICAgICAgICB0aGlzLl90b2dnbGVDb250cm9sU3RhdGUoY2hpbGRDb21wLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBncm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGNvbXBvbmVudCBpcyBkaXNhYmxlZC4gUHJpb3JpdGl6ZXMgdGhlIGRpc2FibGVkU3RhdGUgdmFsdWUsXG4gICAqIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGl0ZW0ncyBwcmV2aW91cyBkaXNhYmxlZCB2YWx1ZVxuICAgKiBAcGFyYW0gaXRlbSBpdGVtIHRvIGNoZWNrIGZvciBpdHMgZGlzYWJsZWQgc3RhdGVcbiAgICovXG4gIHByaXZhdGUgX2lzRGlzYWJsZWQoaXRlbTogQ29uZGl0aW9uYWxJdGVtIHwgRm9ybUl0ZW0pOiBib29sZWFuIHtcbiAgICBjb25zdCBleGlzdHNJbkRpc2FibGVkU3RhdE1hcCA9IGlzUHJlc2VudCh0aGlzLmRpc2FibGVkU3RhdGVbaXRlbS5pbnN0YW5jZUlkXSk7XG4gICAgaWYgKCFleGlzdHNJbkRpc2FibGVkU3RhdE1hcCkge1xuICAgICAgcmV0dXJuIGlzQ29uZGl0aW9uYWxJdGVtKGl0ZW0pID8gaXRlbS5kaXNhYmxlZCA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFN0YXRlW2l0ZW0uaW5zdGFuY2VJZF07XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,29 @@
1
+ import { isFormGroup } from './is-form-group';
2
+ /**
3
+ * Recursively find a form control by name in a form group.
4
+ * Depth first search down the tree of form groups to find a control.
5
+ *
6
+ * @note This will only work if the entire form has unique form control names.
7
+ * @param name The unique name of the form cotrol to find.
8
+ * @param group The {@link FormGroup} to search through.
9
+ * @returns the found control or null
10
+ */
11
+ export function findFormControl(name, group) {
12
+ for (const key in group.controls) {
13
+ if (Object.prototype.hasOwnProperty.call(group.controls, key)) {
14
+ const control = group.controls[key];
15
+ if (key === name) {
16
+ return control;
17
+ }
18
+ // Recurse down if it's a FormGroup
19
+ if (isFormGroup(control)) {
20
+ const found = findFormControl(name, control);
21
+ if (found) {
22
+ return found;
23
+ }
24
+ }
25
+ }
26
+ }
27
+ return null;
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC1mb3JtLWNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ZWItZm9ybS1hbmd1bGFyL3NyYy9saWIvY29yZS91dGlsaXRpZXMvZmluZC1mb3JtLWNvbnRyb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFZLEVBQUUsS0FBZ0I7SUFDNUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1FBQ2hDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDN0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7Z0JBQ2hCLE9BQU8sT0FBTyxDQUFDO2FBQ2hCO1lBRUQsbUNBQW1DO1lBQ25DLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN4QixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLEtBQUssRUFBRTtvQkFDVCxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO1NBQ0Y7S0FDRjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBpc0Zvcm1Hcm91cCB9IGZyb20gJy4vaXMtZm9ybS1ncm91cCc7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgZmluZCBhIGZvcm0gY29udHJvbCBieSBuYW1lIGluIGEgZm9ybSBncm91cC5cbiAqIERlcHRoIGZpcnN0IHNlYXJjaCBkb3duIHRoZSB0cmVlIG9mIGZvcm0gZ3JvdXBzIHRvIGZpbmQgYSBjb250cm9sLlxuICpcbiAqIEBub3RlIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIGVudGlyZSBmb3JtIGhhcyB1bmlxdWUgZm9ybSBjb250cm9sIG5hbWVzLlxuICogQHBhcmFtIG5hbWUgVGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBmb3JtIGNvdHJvbCB0byBmaW5kLlxuICogQHBhcmFtIGdyb3VwIFRoZSB7QGxpbmsgRm9ybUdyb3VwfSB0byBzZWFyY2ggdGhyb3VnaC5cbiAqIEByZXR1cm5zIHRoZSBmb3VuZCBjb250cm9sIG9yIG51bGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRGb3JtQ29udHJvbChuYW1lOiBzdHJpbmcsIGdyb3VwOiBGb3JtR3JvdXApOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gZ3JvdXAuY29udHJvbHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGdyb3VwLmNvbnRyb2xzLCBrZXkpKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZ3JvdXAuY29udHJvbHNba2V5XTtcbiAgICAgIGlmIChrZXkgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2w7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlY3Vyc2UgZG93biBpZiBpdCdzIGEgRm9ybUdyb3VwXG4gICAgICBpZiAoaXNGb3JtR3JvdXAoY29udHJvbCkpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBmaW5kRm9ybUNvbnRyb2wobmFtZSwgY29udHJvbCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbiJdfQ==
@@ -0,0 +1,25 @@
1
+ import { isType } from '@mtna/core-ts';
2
+ /**
3
+ * Recursively find a {@link FormItem} by instanceId in a {@link Form}.
4
+ * Depth first search down the tree of {@link FormItemGroup} to find an item.
5
+ *
6
+ * @param instanceId The unique ID of the {@link FormItem} to find.
7
+ * @param group The {@link Form} or {@link FormItemGroup} to search through.
8
+ * @returns the found {@link FormItem} or `null`
9
+ */
10
+ export function findFormItem(instanceId, group) {
11
+ for (const item of group.items) {
12
+ if (item.instanceId === instanceId) {
13
+ return item;
14
+ }
15
+ // If it's a FormGroup, search through it's children
16
+ if (isType(item, 'items')) {
17
+ const found = findFormItem(instanceId, item);
18
+ if (found) {
19
+ return found;
20
+ }
21
+ }
22
+ }
23
+ return null;
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC1mb3JtLWl0ZW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ZWItZm9ybS1hbmd1bGFyL3NyYy9saWIvY29yZS91dGlsaXRpZXMvZmluZC1mb3JtLWl0ZW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd2Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxVQUFrQixFQUFFLEtBQTJCO0lBQzFFLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRTtRQUM5QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxvREFBb0Q7UUFDcEQsSUFBSSxNQUFNLENBQWdCLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRTtZQUN4QyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdDLElBQUksS0FBSyxFQUFFO2dCQUNULE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtLQUNGO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNUeXBlIH0gZnJvbSAnQG10bmEvY29yZS10cyc7XG5pbXBvcnQgeyBGb3JtLCBGb3JtSXRlbSwgRm9ybUl0ZW1Hcm91cCB9IGZyb20gJ0BtdG5hL3dlYi1mb3JtLXRzJztcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBmaW5kIGEge0BsaW5rIEZvcm1JdGVtfSBieSBpbnN0YW5jZUlkIGluIGEge0BsaW5rIEZvcm19LlxuICogRGVwdGggZmlyc3Qgc2VhcmNoIGRvd24gdGhlIHRyZWUgb2Yge0BsaW5rIEZvcm1JdGVtR3JvdXB9IHRvIGZpbmQgYW4gaXRlbS5cbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2VJZCBUaGUgdW5pcXVlIElEIG9mIHRoZSB7QGxpbmsgRm9ybUl0ZW19IHRvIGZpbmQuXG4gKiBAcGFyYW0gZ3JvdXAgVGhlIHtAbGluayBGb3JtfSBvciB7QGxpbmsgRm9ybUl0ZW1Hcm91cH0gdG8gc2VhcmNoIHRocm91Z2guXG4gKiBAcmV0dXJucyB0aGUgZm91bmQge0BsaW5rIEZvcm1JdGVtfSBvciBgbnVsbGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRGb3JtSXRlbShpbnN0YW5jZUlkOiBzdHJpbmcsIGdyb3VwOiBGb3JtIHwgRm9ybUl0ZW1Hcm91cCk6IEZvcm1JdGVtIHwgbnVsbCB7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBncm91cC5pdGVtcykge1xuICAgIGlmIChpdGVtLmluc3RhbmNlSWQgPT09IGluc3RhbmNlSWQpIHtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYSBGb3JtR3JvdXAsIHNlYXJjaCB0aHJvdWdoIGl0J3MgY2hpbGRyZW5cbiAgICBpZiAoaXNUeXBlPEZvcm1JdGVtR3JvdXA+KGl0ZW0sICdpdGVtcycpKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IGZpbmRGb3JtSXRlbShpbnN0YW5jZUlkLCBpdGVtKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuIl19
@@ -0,0 +1,10 @@
1
+ import { isFormStepGroup } from '../../form-stepper/models';
2
+ /**
3
+ * Flattens formStepGroup.steps and combines all steps into single array
4
+ * @param steps Array<FormStep | FormStepGroup>
5
+ * @returns FormStep[] array of the steps and children of step groups
6
+ */
7
+ export function flattenSteps(steps) {
8
+ return steps.reduce((a, b) => a.concat(isFormStepGroup(b) ? b.steps : b), new Array());
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhdHRlbi1zdGVwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9jb3JlL3V0aWxpdGllcy9mbGF0dGVuLXN0ZXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMkIsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFckY7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBc0M7SUFDakUsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksS0FBSyxFQUFZLENBQUMsQ0FBQztBQUNuRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9ybVN0ZXAsIEZvcm1TdGVwR3JvdXAsIGlzRm9ybVN0ZXBHcm91cCB9IGZyb20gJy4uLy4uL2Zvcm0tc3RlcHBlci9tb2RlbHMnO1xuXG4vKipcbiAqIEZsYXR0ZW5zIGZvcm1TdGVwR3JvdXAuc3RlcHMgYW5kIGNvbWJpbmVzIGFsbCBzdGVwcyBpbnRvIHNpbmdsZSBhcnJheVxuICogQHBhcmFtIHN0ZXBzIEFycmF5PEZvcm1TdGVwIHwgRm9ybVN0ZXBHcm91cD5cbiAqIEByZXR1cm5zIEZvcm1TdGVwW10gYXJyYXkgb2YgdGhlIHN0ZXBzIGFuZCBjaGlsZHJlbiBvZiBzdGVwIGdyb3Vwc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlblN0ZXBzKHN0ZXBzOiBBcnJheTxGb3JtU3RlcCB8IEZvcm1TdGVwR3JvdXA+KTogQXJyYXk8Rm9ybVN0ZXA+IHtcbiAgcmV0dXJuIHN0ZXBzLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoaXNGb3JtU3RlcEdyb3VwKGIpID8gYi5zdGVwcyA6IGIpLCBuZXcgQXJyYXk8Rm9ybVN0ZXA+KCkpO1xufVxuIl19