@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.
- package/_index.scss +25 -0
- package/bundles/mtna-web-form-angular.umd.js +4982 -0
- package/bundles/mtna-web-form-angular.umd.js.map +1 -0
- package/esm2015/lib/core/animations.js +8 -0
- package/esm2015/lib/core/api-config.js +3 -0
- package/esm2015/lib/core/index.js +7 -0
- package/esm2015/lib/core/pipes/coerce-date-item.pipe.js +23 -0
- package/esm2015/lib/core/pipes/coerce-form-group.pipe.js +35 -0
- package/esm2015/lib/core/pipes/date-quarter.pipe.js +43 -0
- package/esm2015/lib/core/pipes/get-auto-complete.pipe.js +42 -0
- package/esm2015/lib/core/pipes/get-available-quarters.pipe.js +29 -0
- package/esm2015/lib/core/pipes/get-form-control-error.pipe.js +20 -0
- package/esm2015/lib/core/pipes/get-list-icon.pipe.js +53 -0
- package/esm2015/lib/core/pipes/get-object-type.pipe.js +17 -0
- package/esm2015/lib/core/pipes/get-selected-option.pipe.js +20 -0
- package/esm2015/lib/core/pipes/index.js +71 -0
- package/esm2015/lib/core/pipes/items-with-value.pipe.js +30 -0
- package/esm2015/lib/core/pipes/sanitize-html.pipe.js +23 -0
- package/esm2015/lib/core/services/api.service.js +67 -0
- package/esm2015/lib/core/services/form-manager.service.js +465 -0
- package/esm2015/lib/core/services/index.js +5 -0
- package/esm2015/lib/core/services/ng-form.service.js +150 -0
- package/esm2015/lib/core/services/ui.service.js +333 -0
- package/esm2015/lib/core/utilities/find-form-control.js +29 -0
- package/esm2015/lib/core/utilities/find-form-item.js +25 -0
- package/esm2015/lib/core/utilities/flatten-steps.js +10 -0
- package/esm2015/lib/core/utilities/generate-form-steps.js +25 -0
- package/esm2015/lib/core/utilities/index.js +9 -0
- package/esm2015/lib/core/utilities/is-form-group.js +6 -0
- package/esm2015/lib/core/utilities/serializer-util.js +358 -0
- package/esm2015/lib/core/utilities/update-step-status.js +38 -0
- package/esm2015/lib/core/validators/index.js +3 -0
- package/esm2015/lib/core/validators/instant-validation-result-error-state-matcher.js +23 -0
- package/esm2015/lib/core/validators/validation-result-validator.js +19 -0
- package/esm2015/lib/file-upload/file-upload.component.js +66 -0
- package/esm2015/lib/file-upload/index.js +2 -0
- package/esm2015/lib/form/base-form-item.model.js +2 -0
- package/esm2015/lib/form/form-disabler.component.js +38 -0
- package/esm2015/lib/form/form-item.directive.js +22 -0
- package/esm2015/lib/form/form.component.js +250 -0
- package/esm2015/lib/form/form.module.js +214 -0
- package/esm2015/lib/form/index.js +5 -0
- package/esm2015/lib/form/white-list.model.js +11 -0
- package/esm2015/lib/form-item-controls/base-form-item-control.directive.js +58 -0
- package/esm2015/lib/form-item-controls/base-parent-item-control.directive.js +42 -0
- package/esm2015/lib/form-item-controls/base-single-selection-parent.directive.js +53 -0
- package/esm2015/lib/form-item-controls/date-range.component.js +84 -0
- package/esm2015/lib/form-item-controls/date.component.js +134 -0
- package/esm2015/lib/form-item-controls/dropdown.component.js +109 -0
- package/esm2015/lib/form-item-controls/index.js +8 -0
- package/esm2015/lib/form-item-controls/input.component.js +149 -0
- package/esm2015/lib/form-item-controls/year-quarter-range.component.js +75 -0
- package/esm2015/lib/form-item-controls/year-quarter.component.js +228 -0
- package/esm2015/lib/form-stepper/form-step-group.component.js +95 -0
- package/esm2015/lib/form-stepper/form-step-group.pipe.js +20 -0
- package/esm2015/lib/form-stepper/form-step.component.js +110 -0
- package/esm2015/lib/form-stepper/form-step.util.js +28 -0
- package/esm2015/lib/form-stepper/form-stepper.component.js +115 -0
- package/esm2015/lib/form-stepper/form-stepper.module.js +53 -0
- package/esm2015/lib/form-stepper/index.js +8 -0
- package/esm2015/lib/form-stepper/models/base-form-step.model.js +6 -0
- package/esm2015/lib/form-stepper/models/form-step-group.model.js +13 -0
- package/esm2015/lib/form-stepper/models/form-step.model.js +12 -0
- package/esm2015/lib/form-stepper/models/index.js +4 -0
- package/esm2015/lib/groups/form-item-dialog-data.model.js +14 -0
- package/esm2015/lib/groups/group-components.js +646 -0
- package/esm2015/lib/groups/index.js +3 -0
- package/esm2015/lib/groups/repeatable-item.component.js +23 -0
- package/esm2015/lib/item-header/index.js +2 -0
- package/esm2015/lib/item-header/item-header.component.js +108 -0
- package/esm2015/lib/static-form-items/index.js +3 -0
- package/esm2015/lib/static-form-items/ordered-list-item.js +50 -0
- package/esm2015/lib/static-form-items/unordered-list-item.js +52 -0
- package/esm2015/lib/step-card/index.js +2 -0
- package/esm2015/lib/step-card/step-card.component.js +53 -0
- package/esm2015/mtna-web-form-angular.js +5 -0
- package/esm2015/public-api.js +10 -0
- package/fesm2015/mtna-web-form-angular.js +4614 -0
- package/fesm2015/mtna-web-form-angular.js.map +1 -0
- package/lib/_index.scss +25 -0
- package/lib/core/_all-color.scss +25 -0
- package/lib/core/_all-theme.scss +28 -0
- package/lib/core/_all-typography.scss +25 -0
- package/lib/core/_core-theme.scss +43 -0
- package/lib/core/animations.d.ts +2 -0
- package/lib/core/api-config.d.ts +5 -0
- package/lib/core/index.d.ts +6 -0
- package/lib/core/pipes/coerce-date-item.pipe.d.ts +11 -0
- package/lib/core/pipes/coerce-form-group.pipe.d.ts +23 -0
- package/lib/core/pipes/date-quarter.pipe.d.ts +7 -0
- package/lib/core/pipes/get-auto-complete.pipe.d.ts +7 -0
- package/lib/core/pipes/get-available-quarters.pipe.d.ts +8 -0
- package/lib/core/pipes/get-form-control-error.pipe.d.ts +14 -0
- package/lib/core/pipes/get-list-icon.pipe.d.ts +7 -0
- package/lib/core/pipes/get-object-type.pipe.d.ts +7 -0
- package/lib/core/pipes/get-selected-option.pipe.d.ts +8 -0
- package/lib/core/pipes/index.d.ts +28 -0
- package/lib/core/pipes/items-with-value.pipe.d.ts +13 -0
- package/lib/core/pipes/sanitize-html.pipe.d.ts +10 -0
- package/lib/core/services/api.service.d.ts +41 -0
- package/lib/core/services/form-manager.service.d.ts +184 -0
- package/lib/core/services/index.d.ts +4 -0
- package/lib/core/services/ng-form.service.d.ts +76 -0
- package/lib/core/services/ui.service.d.ts +123 -0
- package/lib/core/utilities/find-form-control.d.ts +11 -0
- package/lib/core/utilities/find-form-item.d.ts +10 -0
- package/lib/core/utilities/flatten-steps.d.ts +7 -0
- package/lib/core/utilities/generate-form-steps.d.ts +3 -0
- package/lib/core/utilities/index.d.ts +8 -0
- package/lib/core/utilities/is-form-group.d.ts +3 -0
- package/lib/core/utilities/serializer-util.d.ts +81 -0
- package/lib/core/utilities/update-step-status.d.ts +14 -0
- package/lib/core/validators/index.d.ts +2 -0
- package/lib/core/validators/instant-validation-result-error-state-matcher.d.ts +13 -0
- package/lib/core/validators/validation-result-validator.d.ts +12 -0
- package/lib/file-upload/file-upload.component.d.ts +23 -0
- package/lib/file-upload/index.d.ts +1 -0
- package/lib/form/base-form-item.model.d.ts +15 -0
- package/lib/form/form-disabler.component.d.ts +6 -0
- package/lib/form/form-item.directive.d.ts +13 -0
- package/lib/form/form.component.d.ts +89 -0
- package/lib/form/form.module.d.ts +52 -0
- package/lib/form/index.d.ts +4 -0
- package/lib/form/white-list.model.d.ts +6 -0
- package/lib/form-item-controls/_date-item-theme.scss +29 -0
- package/lib/form-item-controls/_form-control-theme.scss +28 -0
- package/lib/form-item-controls/_year-quarter-item-theme.scss +28 -0
- package/lib/form-item-controls/base-form-item-control.directive.d.ts +26 -0
- package/lib/form-item-controls/base-parent-item-control.directive.d.ts +19 -0
- package/lib/form-item-controls/base-single-selection-parent.directive.d.ts +26 -0
- package/lib/form-item-controls/date-range.component.d.ts +12 -0
- package/lib/form-item-controls/date.component.d.ts +24 -0
- package/lib/form-item-controls/dropdown.component.d.ts +9 -0
- package/lib/form-item-controls/index.d.ts +7 -0
- package/lib/form-item-controls/input.component.d.ts +14 -0
- package/lib/form-item-controls/year-quarter-range.component.d.ts +9 -0
- package/lib/form-item-controls/year-quarter.component.d.ts +33 -0
- package/lib/form-stepper/_form-step-group-theme.scss +43 -0
- package/lib/form-stepper/_form-stepper-theme.scss +72 -0
- package/lib/form-stepper/form-step-group.component.d.ts +23 -0
- package/lib/form-stepper/form-step-group.pipe.d.ts +11 -0
- package/lib/form-stepper/form-step.component.d.ts +27 -0
- package/lib/form-stepper/form-step.util.d.ts +27 -0
- package/lib/form-stepper/form-stepper.component.d.ts +35 -0
- package/lib/form-stepper/form-stepper.module.d.ts +18 -0
- package/lib/form-stepper/index.d.ts +7 -0
- package/lib/form-stepper/models/base-form-step.model.d.ts +4 -0
- package/lib/form-stepper/models/form-step-group.model.d.ts +8 -0
- package/lib/form-stepper/models/form-step.model.d.ts +11 -0
- package/lib/form-stepper/models/index.d.ts +3 -0
- package/lib/groups/_checkbox-theme.scss +62 -0
- package/lib/groups/_form-group-theme.scss +32 -0
- package/lib/groups/_multiple-choice-theme.scss +65 -0
- package/lib/groups/_repeatable-item-theme.scss +28 -0
- package/lib/groups/form-item-dialog-data.model.d.ts +13 -0
- package/lib/groups/group-components.d.ts +221 -0
- package/lib/groups/index.d.ts +2 -0
- package/lib/groups/repeatable-item.component.d.ts +5 -0
- package/lib/item-header/_item-header-theme.scss +28 -0
- package/lib/item-header/index.d.ts +1 -0
- package/lib/item-header/item-header.component.d.ts +35 -0
- package/lib/static-form-items/index.d.ts +2 -0
- package/lib/static-form-items/ordered-list-item.d.ts +11 -0
- package/lib/static-form-items/unordered-list-item.d.ts +11 -0
- package/lib/step-card/_step-card-theme.scss +42 -0
- package/lib/step-card/index.d.ts +1 -0
- package/lib/step-card/step-card.component.d.ts +21 -0
- package/mtna-web-form-angular.d.ts +5 -0
- package/package.json +43 -0
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL3VpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUsU0FBUyxFQUFvQixNQUFNLGdCQUFnQixDQUFDO0FBRzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFBMkMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV4SSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFtQnZDLGdEQUFnRDtBQUNoRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBcUI7SUFDdEQsS0FBSyxFQUFFLCtDQUErQztJQUN0RCxHQUFHLEVBQUUsQ0FBQyxJQUFvRSxFQUFFLEVBQUUsQ0FDNUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFFBQVEsQ0FBQztRQUM1QyxDQUFDLENBQUMsa0NBQWtDO1FBQ3BDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFFBQVEsRUFBRTtJQUN6RyxTQUFTLEVBQUUsOENBQThDO0lBQ3pELFdBQVcsRUFBRSxJQUFJO0lBQ2pCLEdBQUcsRUFBRSxDQUFDLElBQW9FLEVBQUUsRUFBRSxDQUM1RSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUSxDQUFDO1FBQzVDLENBQUMsQ0FBQyxxQ0FBcUM7UUFDdkMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFFBQVEsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxRQUFRLEVBQUUsRUFBRTtJQUMxRyxTQUFTLEVBQUUsOENBQThDO0lBQ3pELFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFFBQVEsRUFBRSxxQ0FBcUM7SUFDL0MsT0FBTyxFQUFFLHdEQUF3RDtJQUNqRSxRQUFRLEVBQUUsd0NBQXdDO0lBQ2xELFFBQVEsRUFBRSx5QkFBeUI7SUFDbkMsWUFBWSxFQUFFLG9DQUFvQztJQUNsRCxXQUFXLEVBQUUsc0NBQXNDO0lBQ25ELGtCQUFrQixFQUFFLCtDQUErQztDQUNwRSxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxjQUFjLENBQWUsNkJBQTZCLENBQUMsQ0FBQztBQUd0RyxNQUFNLE9BQU8sZUFBZTtJQVcxQiw4REFBOEQ7SUFDOUQsWUFBb0IsTUFBaUIsRUFBOEMsTUFBWTtRQUEzRSxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBWHJDLHlEQUF5RDtRQUNqRCxnQkFBVyxHQUFxRCxFQUFFLENBQUM7UUFDM0Usd0NBQXdDO1FBQ2hDLGVBQVUsR0FBc0QsRUFBRSxDQUFDO1FBQzNFLG9EQUFvRDtRQUM1QyxrQkFBYSxHQUFzQyxFQUFFLENBQUM7UUFDOUQscUVBQXFFO1FBQzdELHFCQUFnQixHQUFxRSxFQUFFLENBQUM7UUFLOUYsOEhBQThIO1FBQzlILGlIQUFpSDtRQUNqSCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQXNCLENBQUM7SUFDdkMsQ0FBQztJQUVELGlCQUFpQjtRQUNmLHlCQUFZLElBQUksQ0FBQyxhQUFhLEVBQUc7SUFDbkMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsUUFBUSxDQUFDLE9BQWUsRUFBRSxJQUE0QjtRQUNwRCx3Q0FBd0M7UUFDeEMsSUFBSSxLQUFLLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQzNCLDhDQUE4QztZQUM5QyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFO2dCQUMvRixLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLHNDQUFzQzthQUN2QztpQkFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFO2dCQUM5RixLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDM0M7U0FDRjtRQUNELE9BQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMzRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxFQUFVO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsbUJBQW1CLENBQUMsR0FBeUI7UUFDM0MsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDcEIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRTtvQkFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ3BFO3FCQUFNO29CQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNwQzthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxDQUFDLFNBQWtDO1FBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDdkQsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN0RSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksQ0FBQyxDQUFDO2FBQzNGO1lBQ0QsU0FBUyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDeEY7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxlQUFlLENBQUMsY0FBNkIsRUFBRSxlQUE4QixFQUFFLE9BQWdCLEVBQUUsUUFBZ0IsRUFBRSxLQUFLLEdBQUcsS0FBSztRQUM5SCxJQUFJLENBQUMsQ0FBQyxjQUFjLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoRyxPQUFPO1NBQ1I7UUFDRCxNQUFNLE1BQU0sR0FBRyxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNqRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUMvQyxLQUFLLE1BQU0sRUFBRSxJQUFJLE9BQU8sRUFBRTtnQkFDeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdEMsd0NBQXdDO2dCQUN4QyxJQUFJLFNBQVMsRUFBRTtvQkFDYixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUM1QixNQUFNLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDbEgsNERBQTREO29CQUM1RCxJQUFJLG1CQUFtQixFQUFFO3dCQUN2QixJQUFJLEtBQUssRUFBRTs0QkFDVCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQzt5QkFDL0M7d0JBQ0Qsb0VBQW9FO3dCQUNwRSx3REFBd0Q7d0JBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUN0RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDOUU7d0JBQ0QsMkJBQTJCO3dCQUMzQixJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztxQkFDOUQ7eUJBQU07d0JBQ0wsd0JBQXdCO3dCQUN4QixJQUFJLENBQUMsOEJBQThCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO3FCQUMzRDtpQkFDRjtxQkFBTTtvQkFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLG9EQUFvRCxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQzVGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyx3QkFBd0IsQ0FBQyxXQUE0Qjs7UUFDM0QsTUFBTSxRQUFRLEdBQW1DLEVBQUUsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRyxDQUFBLE1BQUEsV0FBVyxDQUFDLFNBQVMsMENBQUUsT0FBTyxLQUFJLEVBQUUsQ0FBQztRQUVwRCxLQUFLLE1BQU0sRUFBRSxJQUFJLE1BQU0sRUFBRTtZQUN2QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLElBQUksU0FBUyxFQUFFO2dCQUNiLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQ2hFLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUNqRTthQUNGO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsOERBQThELEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDbkY7U0FDRjtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUI7UUFDZixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLG9CQUFvQixDQUFDLFVBQW1DLEVBQUUsU0FBaUI7O1FBQ2pGLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDN0IsaUZBQWlGO1FBQ2pGLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQSxNQUFBLFVBQVUsQ0FBQyxPQUFPLDBDQUFFLEtBQUssQ0FBQSxDQUFDO1NBQzVFO2FBQU0sSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0QyxNQUFNLEtBQUssR0FBRyxNQUFBLE1BQUEsVUFBVSxDQUFDLE9BQU8sMENBQUUsS0FBSyxtQ0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3RELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDeEIsK0VBQStFO2dCQUMvRSxnRUFBZ0U7Z0JBQ2hFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMvSCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM5QztpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUNwRCw4RkFBOEY7Z0JBQzlGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDekc7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssdUJBQXVCLENBQUMsU0FBa0MsRUFBRSxPQUFnQixFQUFFLFFBQWdCOztRQUNwRyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQzVCLE1BQU0sUUFBUSxxQkFBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFFLENBQUM7UUFDL0QsSUFBSSxTQUFrQixDQUFDO1FBQ3ZCLElBQUksT0FBTyxFQUFFO1lBQ1gsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUM5QixTQUFTO2dCQUNQLGlCQUFpQixDQUFDLElBQUksQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTO29CQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6RjthQUFNO1lBQ0wsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUIsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFJLE1BQUEsSUFBSSxDQUFDLFNBQVMsMENBQUUsV0FBVyxDQUFBLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDMUc7UUFDRCxzREFBc0Q7UUFDdEQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN4QyxJQUFJLENBQUMsOEJBQThCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssbUJBQW1CLENBQUMsU0FBa0MsRUFBRSxPQUFnQjs7UUFDOUUsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFBLE1BQUEsU0FBUyxDQUFDLE9BQU8sMENBQUUsT0FBTyxDQUFBLEVBQUU7WUFDMUMseUNBQXlDO1lBQ3pDLElBQUksU0FBUyxDQUFDLE9BQU8sWUFBWSxTQUFTLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUMzQztpQkFBTTtnQkFDTCxNQUFBLFNBQVMsQ0FBQyxPQUFPLDBDQUFFLE1BQU0sRUFBRSxDQUFDO2FBQzdCO1NBQ0Y7YUFBTSxJQUFJLENBQUMsT0FBTyxLQUFJLE1BQUEsU0FBUyxDQUFDLE9BQU8sMENBQUUsT0FBTyxDQUFBLEVBQUU7WUFDakQsMENBQTBDO1lBQzFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLDhCQUE4QixDQUFDLFNBQWtDLEVBQUUsT0FBZ0I7UUFDekYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ3pELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckUsU0FBUyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyx5QkFBeUIsQ0FBQyxJQUE2QjtRQUM3RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBb0IsQ0FBQztRQUV4QyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbkUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDcEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdDLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxNQUFNLEVBQUUsQ0FBQztZQUNmLEtBQUssTUFBTSxRQUFRLElBQUksR0FBRyxFQUFFO2dCQUMxQixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUU7b0JBQ3ZELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ3JDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQzNDO2lCQUNGO2FBQ0Y7U0FDRjthQUFNLElBQUksTUFBTSxDQUFxQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNuRywrQkFBK0I7WUFDL0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDbEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUMzQixJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUMzQzthQUNGO1NBQ0Y7UUFDRCxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFdBQVcsQ0FBQyxJQUFnQztRQUNsRCxNQUFNLHVCQUF1QixHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUM1QixPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7U0FDeEQ7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDOzs2R0FwU1UsZUFBZSwyQ0FZaUMsc0JBQXNCO2lIQVp0RSxlQUFlLGNBREYsTUFBTTs0RkFDbkIsZUFBZTtrQkFEM0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQWFRLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbmltcG9ydCB7IGlzUHJlc2VudCwgaXNUeXBlIH0gZnJvbSAnQG10bmEvY29yZS10cyc7XG5pbXBvcnQgeyBBbm5vdGF0YWJsZU51bWJlck1hcCB9IGZyb20gJ0BtdG5hL3Bvam8tc29jaWFsLWFuZ3VsYXInO1xuaW1wb3J0IHsgQ29uZGl0aW9uYWxJdGVtLCBGb3JtSXRlbSwgRm9ybUl0ZW1JbXBsLCBpc0NvbmRpdGlvbmFsSXRlbSwgaXNPcHRpb25Hcm91cEl0ZW1JbXBsLCBpc09wdGlvbkl0ZW1JbXBsIH0gZnJvbSAnQG10bmEvd2ViLWZvcm0tdHMnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHR5cGUgeyBNdG5hV2ZGb3JtSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2dyb3Vwcy9ncm91cC1jb21wb25lbnRzJztcblxuLyoqIFJlZ2lzdHJ5IG9mIGN1c3RvbSBlcnJvciBtZXNzYWdlcyBmb3IgYSBzcGVjaWZpYyBmb3JtIGl0ZW0uIEEgY3VzdG9tIGVycm9yIGNhbiBhbHNvXG4gKiBiZSBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHN0cmluZy4gVGhlIEZvcm1JdGVtIG9iamVjdCBpcyBwYXNzZWQgdG8gYW55IFZhbGlkYXRpb25FcnJvcnNcbiAqIHRoYXQgYXJlIGZ1bmN0aW9ucywgc28gaXRlbSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBjYW4gYmUgcHJvdmlkZWQuXG4gKiBAZXhhbXBsZSB7XG4gKiBtYXg6IGBUaGlzIGZpZWxkJ3MgdmFsdWUgbXVzdCBiZSBsZXNzLmAsXG4gKiBtaW46IChpdGVtOiBGb3JtSXRlbUltcGw8YW55PikgPT4gaW5zdGFuY2VvZldob2xlTnVtYmVySXRlbShpdGVtKVxuICogPyBgVGhpcyBmaWVsZCdzIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICR7aXRlbS5taW5WYWx1ZX0uYFxuICogOiBgVGhpcyBmaWVsZCdzIHZhbHVlIG11c3QgYmUgZ3JlYXRlci5gXG4gKiB9XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTppbnRlcmZhY2Utb3Zlci10eXBlLWxpdGVyYWxcbmV4cG9ydCB0eXBlIEN1c3RvbUVycm9ycyA9IHtcbiAgW2lkOiBzdHJpbmddOiBWYWxpZGF0aW9uRXJyb3JzO1xufTtcblxuLyoqIExpc3Qgb2YgZGVmYXVsdCBlcnJvciBtZXNzYWdlcyB0byBkaXNwbGF5ICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUzogVmFsaWRhdGlvbkVycm9ycyA9IHtcbiAgZW1haWw6ICdUaGlzIGZpZWxkIG11c3QgaW5jbHVkZSBhIHZhbGlkIGVtYWlsIGZvcm1hdC4nLFxuICBtYXg6IChpdGVtPzogRm9ybUl0ZW1JbXBsPG51bWJlcj4gJiB7IG1heFZhbHVlOiBudW1iZXI7IG1pblZhbHVlOiBudW1iZXIgfSkgPT5cbiAgICAhaXNQcmVzZW50KGl0ZW0pIHx8ICFpc1ByZXNlbnQoaXRlbT8ubWF4VmFsdWUpXG4gICAgICA/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
|