@valtimo/process-link 12.14.1 → 13.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/fesm2022/valtimo-process-link.mjs +694 -682
- package/fesm2022/valtimo-process-link.mjs.map +1 -1
- package/lib/components/choose-process-link-type/choose-process-link-type.component.d.ts.map +1 -1
- package/lib/components/form-display-configuration/form-display-configuration.component.d.ts +1 -4
- package/lib/components/form-display-configuration/form-display-configuration.component.d.ts.map +1 -1
- package/lib/components/form-flow/form-flow.component.d.ts +1 -1
- package/lib/components/form-flow/form-flow.component.d.ts.map +1 -1
- package/lib/components/form-flow-configuration-container/form-flow-configuration-container.component.d.ts.map +1 -1
- package/lib/components/form-link-process-diagram/form-link-process-diagram.component.d.ts +1 -1
- package/lib/components/form-link-process-diagram/form-link-process-diagram.component.d.ts.map +1 -1
- package/lib/components/import-plugin-configuration/import-plugin-configuration.component.d.ts.map +1 -1
- package/lib/components/plugin-action-configuration/plugin-action-configuration.component.d.ts.map +1 -1
- package/lib/components/process-link/process-link.component.d.ts.map +1 -1
- package/lib/components/process-link-modal/process-link-modal.component.d.ts +1 -1
- package/lib/components/process-link-modal/process-link-modal.component.d.ts.map +1 -1
- package/lib/components/select-form/select-form.component.d.ts +12 -9
- package/lib/components/select-form/select-form.component.d.ts.map +1 -1
- package/lib/components/select-form-flow/select-form-flow.component.d.ts +14 -12
- package/lib/components/select-form-flow/select-form-flow.component.d.ts.map +1 -1
- package/lib/components/select-plugin-action/select-plugin-action.component.d.ts +3 -2
- package/lib/components/select-plugin-action/select-plugin-action.component.d.ts.map +1 -1
- package/lib/components/select-plugin-configuration/select-plugin-configuration.component.d.ts.map +1 -1
- package/lib/components/select-ui-component/select-ui-component.component.d.ts.map +1 -1
- package/lib/models/form-link.model.d.ts +1 -0
- package/lib/models/form-link.model.d.ts.map +1 -1
- package/lib/models/process-link.model.d.ts +48 -4
- package/lib/models/process-link.model.d.ts.map +1 -1
- package/lib/process-link.module.d.ts +11 -12
- package/lib/process-link.module.d.ts.map +1 -1
- package/lib/services/form-flow.service.d.ts +6 -8
- package/lib/services/form-flow.service.d.ts.map +1 -1
- package/lib/services/index.d.ts +2 -0
- package/lib/services/index.d.ts.map +1 -1
- package/lib/services/process-link-button.service.d.ts.map +1 -1
- package/lib/services/process-link-state.service.d.ts +20 -8
- package/lib/services/process-link-state.service.d.ts.map +1 -1
- package/lib/services/process-link-step.service.d.ts.map +1 -1
- package/lib/services/process-link.service.d.ts +6 -4
- package/lib/services/process-link.service.d.ts.map +1 -1
- package/lib/services/url-resolver.service.d.ts.map +1 -1
- package/lib/services/url-validator.service.d.ts.map +1 -1
- package/package.json +4 -6
- package/public-api.d.ts +1 -5
- package/public-api.d.ts.map +1 -1
- package/esm2022/lib/components/choose-process-link-type/choose-process-link-type.component.mjs +0 -38
- package/esm2022/lib/components/choose-process-link-type/index.mjs +0 -17
- package/esm2022/lib/components/form-display-configuration/form-display-configuration.component.mjs +0 -119
- package/esm2022/lib/components/form-flow/form-flow.component.mjs +0 -206
- package/esm2022/lib/components/form-flow-configuration-container/form-flow-configuration-container.component.mjs +0 -107
- package/esm2022/lib/components/form-flow-configuration-container/index.mjs +0 -17
- package/esm2022/lib/components/form-link-process-diagram/form-link-process-diagram.component.mjs +0 -150
- package/esm2022/lib/components/import-plugin-configuration/import-plugin-configuration.component.mjs +0 -133
- package/esm2022/lib/components/plugin-action-configuration/plugin-action-configuration.component.mjs +0 -137
- package/esm2022/lib/components/process-link/process-link.component.mjs +0 -69
- package/esm2022/lib/components/process-link-modal/process-link-modal.component.mjs +0 -91
- package/esm2022/lib/components/select-form/index.mjs +0 -17
- package/esm2022/lib/components/select-form/select-form.component.mjs +0 -172
- package/esm2022/lib/components/select-form-flow/index.mjs +0 -17
- package/esm2022/lib/components/select-form-flow/select-form-flow.component.mjs +0 -160
- package/esm2022/lib/components/select-plugin-action/select-plugin-action.component.mjs +0 -74
- package/esm2022/lib/components/select-plugin-configuration/select-plugin-configuration.component.mjs +0 -75
- package/esm2022/lib/components/select-ui-component/select-ui-component.component.mjs +0 -128
- package/esm2022/lib/components/select-url/select-url.component.mjs +0 -125
- package/esm2022/lib/constants/index.mjs +0 -18
- package/esm2022/lib/constants/injection-tokens.mjs +0 -20
- package/esm2022/lib/constants/process.link.mjs +0 -23
- package/esm2022/lib/models/form-custom-component.model.mjs +0 -17
- package/esm2022/lib/models/form-flow.model.mjs +0 -17
- package/esm2022/lib/models/form-link.model.mjs +0 -17
- package/esm2022/lib/models/index.mjs +0 -20
- package/esm2022/lib/models/process-link-url.model.mjs +0 -17
- package/esm2022/lib/models/process-link.model.mjs +0 -17
- package/esm2022/lib/process-link-routing.module.mjs +0 -44
- package/esm2022/lib/process-link.module.mjs +0 -203
- package/esm2022/lib/services/form-flow-component.service.mjs +0 -44
- package/esm2022/lib/services/form-flow.service.mjs +0 -59
- package/esm2022/lib/services/index.mjs +0 -23
- package/esm2022/lib/services/plugin-state.service.mjs +0 -90
- package/esm2022/lib/services/process-link-button.service.mjs +0 -106
- package/esm2022/lib/services/process-link-state.service.mjs +0 -173
- package/esm2022/lib/services/process-link-step.service.mjs +0 -269
- package/esm2022/lib/services/process-link.service.mjs +0 -117
- package/esm2022/lib/services/url-resolver.service.mjs +0 -18
- package/esm2022/lib/services/url-validator.service.mjs +0 -26
- package/esm2022/public-api.mjs +0 -34
- package/esm2022/valtimo-process-link.mjs +0 -5
- package/lib/components/select-url/select-url.component.d.ts +0 -31
- package/lib/components/select-url/select-url.component.d.ts.map +0 -1
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2015-2024 Ritense BV, the Netherlands.
|
|
3
|
-
*
|
|
4
|
-
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" basis,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
import { Inject, Injectable, Optional } from '@angular/core';
|
|
17
|
-
import { BehaviorSubject, map } from 'rxjs';
|
|
18
|
-
import { FORM_CUSTOM_COMPONENT_TOKEN } from '../constants';
|
|
19
|
-
import * as i0 from "@angular/core";
|
|
20
|
-
import * as i1 from "./process-link-step.service";
|
|
21
|
-
import * as i2 from "./process-link-button.service";
|
|
22
|
-
import * as i3 from "./plugin-state.service";
|
|
23
|
-
export class ProcessLinkStateService {
|
|
24
|
-
get showModal$() {
|
|
25
|
-
return this._showModal$.asObservable();
|
|
26
|
-
}
|
|
27
|
-
get elementName$() {
|
|
28
|
-
return this._elementName$.asObservable();
|
|
29
|
-
}
|
|
30
|
-
get availableProcessLinkTypes$() {
|
|
31
|
-
return this._availableProcessLinkTypes$.asObservable().pipe(map(types => {
|
|
32
|
-
if (!this.formCustomComponentConfig) {
|
|
33
|
-
return types.map(type => {
|
|
34
|
-
if (type.processLinkType === 'ui-component') {
|
|
35
|
-
type.enabled = false;
|
|
36
|
-
}
|
|
37
|
-
return type;
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
return types;
|
|
41
|
-
}));
|
|
42
|
-
}
|
|
43
|
-
get hideProgressIndicator$() {
|
|
44
|
-
return this._availableProcessLinkTypes$
|
|
45
|
-
.asObservable()
|
|
46
|
-
.pipe(map(availableTypes => Array.isArray(availableTypes) &&
|
|
47
|
-
availableTypes.length === 1 &&
|
|
48
|
-
(availableTypes[0]?.processLinkType === 'form' ||
|
|
49
|
-
availableTypes[0]?.processLinkType === 'form-flow')));
|
|
50
|
-
}
|
|
51
|
-
get selectedProcessLinkTypeId$() {
|
|
52
|
-
return this._selectedProcessLinkTypeId$.asObservable();
|
|
53
|
-
}
|
|
54
|
-
get saving$() {
|
|
55
|
-
return this._saving$.asObservable();
|
|
56
|
-
}
|
|
57
|
-
get modalParams$() {
|
|
58
|
-
return this._modalParams$.asObservable();
|
|
59
|
-
}
|
|
60
|
-
get selectedProcessLink$() {
|
|
61
|
-
return this._selectedProcessLink$.asObservable();
|
|
62
|
-
}
|
|
63
|
-
get typeOfSelectedProcessLink$() {
|
|
64
|
-
return this.selectedProcessLink$.pipe(map(processLink => processLink?.processLinkType || ''));
|
|
65
|
-
}
|
|
66
|
-
constructor(processLinkStepService, buttonService, pluginStateService, formCustomComponentConfig) {
|
|
67
|
-
this.processLinkStepService = processLinkStepService;
|
|
68
|
-
this.buttonService = buttonService;
|
|
69
|
-
this.pluginStateService = pluginStateService;
|
|
70
|
-
this.formCustomComponentConfig = formCustomComponentConfig;
|
|
71
|
-
this._showModal$ = new BehaviorSubject(false);
|
|
72
|
-
this._availableProcessLinkTypes$ = new BehaviorSubject([]);
|
|
73
|
-
this._elementName$ = new BehaviorSubject('');
|
|
74
|
-
this._selectedProcessLinkTypeId$ = new BehaviorSubject('');
|
|
75
|
-
this._viewModelEnabled$ = new BehaviorSubject(false);
|
|
76
|
-
this._url$ = new BehaviorSubject('');
|
|
77
|
-
this._saving$ = new BehaviorSubject(false);
|
|
78
|
-
this._modalParams$ = new BehaviorSubject(undefined);
|
|
79
|
-
this._selectedProcessLink$ = new BehaviorSubject(undefined);
|
|
80
|
-
this.openAvailableProcessLinkTypesSubscription();
|
|
81
|
-
}
|
|
82
|
-
ngOnDestroy() {
|
|
83
|
-
this._availableProcessLinkTypesSubscription?.unsubscribe();
|
|
84
|
-
}
|
|
85
|
-
setAvailableProcessLinkTypes(processLinkTypes) {
|
|
86
|
-
const hasOneOption = processLinkTypes.length === 1;
|
|
87
|
-
this._availableProcessLinkTypes$.next(processLinkTypes);
|
|
88
|
-
this.processLinkStepService.setHasOneProcessLinkType(hasOneOption);
|
|
89
|
-
if (hasOneOption) {
|
|
90
|
-
this.selectProcessLinkType(processLinkTypes[0].processLinkType, hasOneOption);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
setElementName(name) {
|
|
94
|
-
this._elementName$.next(name);
|
|
95
|
-
}
|
|
96
|
-
showModal() {
|
|
97
|
-
this._showModal$.next(true);
|
|
98
|
-
}
|
|
99
|
-
closeModal() {
|
|
100
|
-
this._showModal$.next(false);
|
|
101
|
-
setTimeout(() => {
|
|
102
|
-
this.reset();
|
|
103
|
-
}, 240);
|
|
104
|
-
}
|
|
105
|
-
selectProcessLinkType(processLinkTypeId, hasOneOption) {
|
|
106
|
-
this._selectedProcessLinkTypeId$.next(processLinkTypeId);
|
|
107
|
-
this.processLinkStepService.setProcessLinkTypeSteps(processLinkTypeId, hasOneOption);
|
|
108
|
-
}
|
|
109
|
-
setViewModelEnabled(viewModelEnabled) {
|
|
110
|
-
this._viewModelEnabled$.next(viewModelEnabled);
|
|
111
|
-
}
|
|
112
|
-
get viewModelEnabled$() {
|
|
113
|
-
return this._viewModelEnabled$.asObservable();
|
|
114
|
-
}
|
|
115
|
-
get url$() {
|
|
116
|
-
return this._url$.asObservable();
|
|
117
|
-
}
|
|
118
|
-
clearSelectedProcessLinkType() {
|
|
119
|
-
this._selectedProcessLinkTypeId$.next('');
|
|
120
|
-
}
|
|
121
|
-
startSaving() {
|
|
122
|
-
this._saving$.next(true);
|
|
123
|
-
this.processLinkStepService.disableSteps();
|
|
124
|
-
}
|
|
125
|
-
stopSaving() {
|
|
126
|
-
this._saving$.next(false);
|
|
127
|
-
this.processLinkStepService.enableSteps();
|
|
128
|
-
}
|
|
129
|
-
setInitial() {
|
|
130
|
-
const availableTypes = this._availableProcessLinkTypes$.getValue();
|
|
131
|
-
this.buttonService.resetButtons();
|
|
132
|
-
this.processLinkStepService.setInitialSteps(availableTypes);
|
|
133
|
-
}
|
|
134
|
-
setModalParams(params) {
|
|
135
|
-
this._modalParams$.next(params);
|
|
136
|
-
}
|
|
137
|
-
selectProcessLink(processLink) {
|
|
138
|
-
this._selectedProcessLink$.next(processLink);
|
|
139
|
-
this.pluginStateService.selectProcessLink(processLink);
|
|
140
|
-
this.setViewModelEnabled(processLink.viewModelEnabled);
|
|
141
|
-
this._url$.next(processLink.url);
|
|
142
|
-
}
|
|
143
|
-
deselectProcessLink() {
|
|
144
|
-
this._selectedProcessLink$.next(undefined);
|
|
145
|
-
this.pluginStateService.deselectProcessLink();
|
|
146
|
-
}
|
|
147
|
-
openAvailableProcessLinkTypesSubscription() {
|
|
148
|
-
this._availableProcessLinkTypesSubscription = this._availableProcessLinkTypes$.subscribe(availableProcessLinkTypes => {
|
|
149
|
-
if (availableProcessLinkTypes.length > 1) {
|
|
150
|
-
this.setInitial();
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
reset() {
|
|
155
|
-
this.setAvailableProcessLinkTypes([]);
|
|
156
|
-
this.processLinkStepService.reset();
|
|
157
|
-
this.stopSaving();
|
|
158
|
-
this.buttonService.resetButtons();
|
|
159
|
-
this.clearSelectedProcessLinkType();
|
|
160
|
-
this.deselectProcessLink();
|
|
161
|
-
}
|
|
162
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinkStateService, deps: [{ token: i1.ProcessLinkStepService }, { token: i2.ProcessLinkButtonService }, { token: i3.PluginStateService }, { token: FORM_CUSTOM_COMPONENT_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
163
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinkStateService }); }
|
|
164
|
-
}
|
|
165
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinkStateService, decorators: [{
|
|
166
|
-
type: Injectable
|
|
167
|
-
}], ctorParameters: () => [{ type: i1.ProcessLinkStepService }, { type: i2.ProcessLinkButtonService }, { type: i3.PluginStateService }, { type: undefined, decorators: [{
|
|
168
|
-
type: Optional
|
|
169
|
-
}, {
|
|
170
|
-
type: Inject,
|
|
171
|
-
args: [FORM_CUSTOM_COMPONENT_TOKEN]
|
|
172
|
-
}] }] });
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1saW5rLXN0YXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Byb2Nlc3MtbGluay9zcmMvbGliL3NlcnZpY2VzL3Byb2Nlc3MtbGluay1zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQWEsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxlQUFlLEVBQUUsR0FBRyxFQUEyQixNQUFNLE1BQU0sQ0FBQztBQUtwRSxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxjQUFjLENBQUM7Ozs7O0FBR3pELE1BQU0sT0FBTyx1QkFBdUI7SUFhbEMsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQUksMEJBQTBCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FDekQsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO2dCQUNwQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3RCLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxjQUFjLEVBQUUsQ0FBQzt3QkFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQ3ZCLENBQUM7b0JBQ0QsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTyxLQUFL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QUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixDQUFDO1FBQ0gsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSztRQUNYLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQzsrR0FoTFUsdUJBQXVCLGtJQXNFeEIsMkJBQTJCO21IQXRFMUIsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQURuQyxVQUFVOzswQkFzRU4sUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQywyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgbWFwLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtGb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnLCBNb2RhbFBhcmFtcywgUHJvY2Vzc0xpbmssIFByb2Nlc3NMaW5rVHlwZX0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7UHJvY2Vzc0xpbmtTdGVwU2VydmljZX0gZnJvbSAnLi9wcm9jZXNzLWxpbmstc3RlcC5zZXJ2aWNlJztcbmltcG9ydCB7UHJvY2Vzc0xpbmtCdXR0b25TZXJ2aWNlfSBmcm9tICcuL3Byb2Nlc3MtbGluay1idXR0b24uc2VydmljZSc7XG5pbXBvcnQge1BsdWdpblN0YXRlU2VydmljZX0gZnJvbSAnLi9wbHVnaW4tc3RhdGUuc2VydmljZSc7XG5pbXBvcnQge0ZPUk1fQ1VTVE9NX0NPTVBPTkVOVF9UT0tFTn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFByb2Nlc3NMaW5rU3RhdGVTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2hvd01vZGFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hdmFpbGFibGVQcm9jZXNzTGlua1R5cGVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8UHJvY2Vzc0xpbmtUeXBlPj4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50TmFtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RlZFByb2Nlc3NMaW5rVHlwZUlkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdNb2RlbEVuYWJsZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3VybCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zYXZpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21vZGFsUGFyYW1zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TW9kYWxQYXJhbXM+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlbGVjdGVkUHJvY2Vzc0xpbmskID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcm9jZXNzTGluaz4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIF9hdmFpbGFibGVQcm9jZXNzTGlua1R5cGVzU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xuXG4gIGdldCBzaG93TW9kYWwkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93TW9kYWwkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldCBlbGVtZW50TmFtZSQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudE5hbWUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldCBhdmFpbGFibGVQcm9jZXNzTGlua1R5cGVzJCgpOiBPYnNlcnZhYmxlPEFycmF5PFByb2Nlc3NMaW5rVHlwZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fYXZhaWxhYmxlUHJvY2Vzc0xpbmtUeXBlcyQuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgIG1hcCh0eXBlcyA9PiB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnKSB7XG4gICAgICAgICAgcmV0dXJuIHR5cGVzLm1hcCh0eXBlID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlLnByb2Nlc3NMaW5rVHlwZSA9PT0gJ3VpLWNvbXBvbmVudCcpIHtcbiAgICAgICAgICAgICAgdHlwZS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgZ2V0IGhpZGVQcm9ncmVzc0luZGljYXRvciQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2F2YWlsYWJsZVByb2Nlc3NMaW5rVHlwZXMkXG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoXG4gICAgICAgICAgYXZhaWxhYmxlVHlwZXMgPT5cbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoYXZhaWxhYmxlVHlwZXMpICYmXG4gICAgICAgICAgICBhdmFpbGFibGVUeXBlcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgIChhdmFpbGFibGVUeXBlc1swXT8ucHJvY2Vzc0xpbmtUeXBlID09PSAnZm9ybScgfHxcbiAgICAgICAgICAgICAgYXZhaWxhYmxlVHlwZXNbMF0/LnByb2Nlc3NMaW5rVHlwZSA9PT0gJ2Zvcm0tZmxvdycpXG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cbiAgZ2V0IHNlbGVjdGVkUHJvY2Vzc0xpbmtUeXBlSWQkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkUHJvY2Vzc0xpbmtUeXBlSWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldCBzYXZpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9zYXZpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldCBtb2RhbFBhcmFtcyQoKTogT2JzZXJ2YWJsZTxNb2RhbFBhcmFtcz4ge1xuICAgIHJldHVybiB0aGlzLl9tb2RhbFBhcmFtcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRQcm9jZXNzTGluayQoKTogT2JzZXJ2YWJsZTxQcm9jZXNzTGluaz4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFByb2Nlc3NMaW5rJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCB0eXBlT2ZTZWxlY3RlZFByb2Nlc3NMaW5rJCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUHJvY2Vzc0xpbmskLnBpcGUobWFwKHByb2Nlc3NMaW5rID0+IHByb2Nlc3NMaW5rPy5wcm9jZXNzTGlua1R5cGUgfHwgJycpKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvY2Vzc0xpbmtTdGVwU2VydmljZTogUHJvY2Vzc0xpbmtTdGVwU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJ1dHRvblNlcnZpY2U6IFByb2Nlc3NMaW5rQnV0dG9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpblN0YXRlU2VydmljZTogUGx1Z2luU3RhdGVTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChGT1JNX0NVU1RPTV9DT01QT05FTlRfVE9LRU4pXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnOiBGb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnXG4gICkge1xuICAgIHRoaXMub3BlbkF2YWlsYWJsZVByb2Nlc3NMaW5rVHlwZXNTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2F2YWlsYWJsZVByb2Nlc3NMaW5rVHlwZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZXRBdmFpbGFibGVQcm9jZXNzTGlua1R5cGVzKHByb2Nlc3NMaW5rVHlwZXM6IEFycmF5PFByb2Nlc3NMaW5rVHlwZT4pOiB2b2lkIHtcbiAgICBjb25zdCBoYXNPbmVPcHRpb24gPSBwcm9jZXNzTGlua1R5cGVzLmxlbmd0aCA9PT0gMTtcbiAgICB0aGlzLl9hdmFpbGFibGVQcm9jZXNzTGlua1R5cGVzJC5uZXh0KHByb2Nlc3NMaW5rVHlwZXMpO1xuICAgIHRoaXMucHJvY2Vzc0xpbmtTdGVwU2VydmljZS5zZXRIYXNPbmVQcm9jZXNzTGlua1R5cGUoaGFzT25lT3B0aW9uKTtcblxuICAgIGlmIChoYXNPbmVPcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0UHJvY2Vzc0xpbmtUeXBlKHByb2Nlc3NMaW5rVHlwZXNbMF0ucHJvY2Vzc0xpbmtUeXBlLCBoYXNPbmVPcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHNldEVsZW1lbnROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2VsZW1lbnROYW1lJC5uZXh0KG5hbWUpO1xuICB9XG5cbiAgc2hvd01vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuX3Nob3dNb2RhbCQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIGNsb3NlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5fc2hvd01vZGFsJC5uZXh0KGZhbHNlKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH0sIDI0MCk7XG4gIH1cblxuICBzZWxlY3RQcm9jZXNzTGlua1R5cGUocHJvY2Vzc0xpbmtUeXBlSWQ6IHN0cmluZywgaGFzT25lT3B0aW9uPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkUHJvY2Vzc0xpbmtUeXBlSWQkLm5leHQocHJvY2Vzc0xpbmtUeXBlSWQpO1xuICAgIHRoaXMucHJvY2Vzc0xpbmtTdGVwU2VydmljZS5zZXRQcm9jZXNzTGlua1R5cGVTdGVwcyhwcm9jZXNzTGlua1R5cGVJZCwgaGFzT25lT3B0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWaWV3TW9kZWxFbmFibGVkKHZpZXdNb2RlbEVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3TW9kZWxFbmFibGVkJC5uZXh0KHZpZXdNb2RlbEVuYWJsZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCB2aWV3TW9kZWxFbmFibGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fdmlld01vZGVsRW5hYmxlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybCQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fdXJsJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0ZWRQcm9jZXNzTGlua1R5cGUoKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0ZWRQcm9jZXNzTGlua1R5cGVJZCQubmV4dCgnJyk7XG4gIH1cblxuICBzdGFydFNhdmluZygpOiB2b2lkIHtcbiAgICB0aGlzLl9zYXZpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5wcm9jZXNzTGlua1N0ZXBTZXJ2aWNlLmRpc2FibGVTdGVwcygpO1xuICB9XG5cbiAgc3RvcFNhdmluZygpOiB2b2lkIHtcbiAgICB0aGlzLl9zYXZpbmckLm5leHQoZmFsc2UpO1xuICAgIHRoaXMucHJvY2Vzc0xpbmtTdGVwU2VydmljZS5lbmFibGVTdGVwcygpO1xuICB9XG5cbiAgc2V0SW5pdGlhbCgpOiB2b2lkIHtcbiAgICBjb25zdCBhdmFpbGFibGVUeXBlcyA9IHRoaXMuX2F2YWlsYWJsZVByb2Nlc3NMaW5rVHlwZXMkLmdldFZhbHVlKCk7XG4gICAgdGhpcy5idXR0b25TZXJ2aWNlLnJlc2V0QnV0dG9ucygpO1xuICAgIHRoaXMucHJvY2Vzc0xpbmtTdGVwU2VydmljZS5zZXRJbml0aWFsU3RlcHMoYXZhaWxhYmxlVHlwZXMpO1xuICB9XG5cbiAgc2V0TW9kYWxQYXJhbXMocGFyYW1zOiBNb2RhbFBhcmFtcyk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsUGFyYW1zJC5uZXh0KHBhcmFtcyk7XG4gIH1cblxuICBzZWxlY3RQcm9jZXNzTGluayhwcm9jZXNzTGluazogUHJvY2Vzc0xpbmspOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZFByb2Nlc3NMaW5rJC5uZXh0KHByb2Nlc3NMaW5rKTtcbiAgICB0aGlzLnBsdWdpblN0YXRlU2VydmljZS5zZWxlY3RQcm9jZXNzTGluayhwcm9jZXNzTGluayk7XG4gICAgdGhpcy5zZXRWaWV3TW9kZWxFbmFibGVkKHByb2Nlc3NMaW5rLnZpZXdNb2RlbEVuYWJsZWQpO1xuICAgIHRoaXMuX3VybCQubmV4dChwcm9jZXNzTGluay51cmwpO1xuICB9XG5cbiAgZGVzZWxlY3RQcm9jZXNzTGluaygpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZFByb2Nlc3NMaW5rJC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5wbHVnaW5TdGF0ZVNlcnZpY2UuZGVzZWxlY3RQcm9jZXNzTGluaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQXZhaWxhYmxlUHJvY2Vzc0xpbmtUeXBlc1N1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9hdmFpbGFibGVQcm9jZXNzTGlua1R5cGVzU3Vic2NyaXB0aW9uID0gdGhpcy5fYXZhaWxhYmxlUHJvY2Vzc0xpbmtUeXBlcyQuc3Vic2NyaWJlKFxuICAgICAgYXZhaWxhYmxlUHJvY2Vzc0xpbmtUeXBlcyA9PiB7XG4gICAgICAgIGlmIChhdmFpbGFibGVQcm9jZXNzTGlua1R5cGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0aGlzLnNldEluaXRpYWwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0QXZhaWxhYmxlUHJvY2Vzc0xpbmtUeXBlcyhbXSk7XG4gICAgdGhpcy5wcm9jZXNzTGlua1N0ZXBTZXJ2aWNlLnJlc2V0KCk7XG4gICAgdGhpcy5zdG9wU2F2aW5nKCk7XG4gICAgdGhpcy5idXR0b25TZXJ2aWNlLnJlc2V0QnV0dG9ucygpO1xuICAgIHRoaXMuY2xlYXJTZWxlY3RlZFByb2Nlc3NMaW5rVHlwZSgpO1xuICAgIHRoaXMuZGVzZWxlY3RQcm9jZXNzTGluaygpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2015-2024 Ritense BV, the Netherlands.
|
|
3
|
-
*
|
|
4
|
-
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" basis,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
import { Injectable } from '@angular/core';
|
|
17
|
-
import { BehaviorSubject, combineLatest, filter, map } from 'rxjs';
|
|
18
|
-
import { take } from 'rxjs/operators';
|
|
19
|
-
import * as i0 from "@angular/core";
|
|
20
|
-
import * as i1 from "@ngx-translate/core";
|
|
21
|
-
import * as i2 from "./process-link-button.service";
|
|
22
|
-
import * as i3 from "./plugin-state.service";
|
|
23
|
-
import * as i4 from "@valtimo/plugin";
|
|
24
|
-
export class ProcessLinkStepService {
|
|
25
|
-
get steps$() {
|
|
26
|
-
return combineLatest([
|
|
27
|
-
this._steps$,
|
|
28
|
-
this._disableSteps$,
|
|
29
|
-
this.translateService.stream('key'),
|
|
30
|
-
]).pipe(filter(([steps]) => !!steps), map(([steps, disableSteps]) => steps.map(step => ({
|
|
31
|
-
...step,
|
|
32
|
-
disabled: disableSteps,
|
|
33
|
-
label: this.translateService.instant(`processLinkSteps.${step.label}`),
|
|
34
|
-
...(step.secondaryLabel && {
|
|
35
|
-
secondaryLabel: this.translateService.instant(step.secondaryLabel),
|
|
36
|
-
}),
|
|
37
|
-
}))));
|
|
38
|
-
}
|
|
39
|
-
get currentStepIndex$() {
|
|
40
|
-
return this._currentStepIndex$.asObservable();
|
|
41
|
-
}
|
|
42
|
-
get currentStepId$() {
|
|
43
|
-
return combineLatest([this._steps$, this.currentStepIndex$]).pipe(filter(([steps, currentStepIndex]) => !!steps && typeof currentStepIndex === 'number'), map(([steps, currentStepIndex]) => steps.length > 0 ? steps[currentStepIndex]?.label : ''));
|
|
44
|
-
}
|
|
45
|
-
get hasOneProcessLinkType$() {
|
|
46
|
-
return this._hasOneProcessLinkType$.asObservable();
|
|
47
|
-
}
|
|
48
|
-
constructor(translateService, buttonService, pluginStateService, pluginTranslateService) {
|
|
49
|
-
this.translateService = translateService;
|
|
50
|
-
this.buttonService = buttonService;
|
|
51
|
-
this.pluginStateService = pluginStateService;
|
|
52
|
-
this.pluginTranslateService = pluginTranslateService;
|
|
53
|
-
this._steps$ = new BehaviorSubject(undefined);
|
|
54
|
-
this._currentStepIndex$ = new BehaviorSubject(0);
|
|
55
|
-
this._disableSteps$ = new BehaviorSubject(false);
|
|
56
|
-
this._hasOneProcessLinkType$ = new BehaviorSubject(false);
|
|
57
|
-
}
|
|
58
|
-
reset() {
|
|
59
|
-
this._currentStepIndex$.next(0);
|
|
60
|
-
this._steps$.next([]);
|
|
61
|
-
}
|
|
62
|
-
setInitialSteps(availableProcessLinkTypes) {
|
|
63
|
-
if (availableProcessLinkTypes.length > 1) {
|
|
64
|
-
this.setChoiceSteps();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
setFormSteps() {
|
|
68
|
-
this._steps$.next([
|
|
69
|
-
{ label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.form' },
|
|
70
|
-
{ label: 'selectForm' },
|
|
71
|
-
]);
|
|
72
|
-
this._currentStepIndex$.next(1);
|
|
73
|
-
}
|
|
74
|
-
setSingleFormStep() {
|
|
75
|
-
this._steps$.next([{ label: 'selectForm' }]);
|
|
76
|
-
this._currentStepIndex$.next(0);
|
|
77
|
-
}
|
|
78
|
-
setUIComponentStep() {
|
|
79
|
-
this._steps$.next([
|
|
80
|
-
{ label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.ui-component' },
|
|
81
|
-
{ label: 'uiComponent' },
|
|
82
|
-
]);
|
|
83
|
-
this._currentStepIndex$.next(1);
|
|
84
|
-
}
|
|
85
|
-
setFormFlowSteps() {
|
|
86
|
-
this._steps$.next([
|
|
87
|
-
{ label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.form-flow' },
|
|
88
|
-
{ label: 'selectFormFlow' },
|
|
89
|
-
]);
|
|
90
|
-
this._currentStepIndex$.next(1);
|
|
91
|
-
}
|
|
92
|
-
setSingleFormFlowStep() {
|
|
93
|
-
this._steps$.next([{ label: 'selectFormFlow' }]);
|
|
94
|
-
this._currentStepIndex$.next(0);
|
|
95
|
-
}
|
|
96
|
-
setChoosePluginConfigurationSteps() {
|
|
97
|
-
this._steps$.next([
|
|
98
|
-
{ label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.plugin' },
|
|
99
|
-
{ label: 'choosePluginConfiguration' },
|
|
100
|
-
{ label: 'choosePluginAction', disabled: true },
|
|
101
|
-
{ label: 'configurePluginAction', disabled: true },
|
|
102
|
-
]);
|
|
103
|
-
this._currentStepIndex$.next(1);
|
|
104
|
-
}
|
|
105
|
-
setSingleChoosePluginConfigurationSteps() {
|
|
106
|
-
this._steps$.next([
|
|
107
|
-
{ label: 'choosePluginConfiguration' },
|
|
108
|
-
{ label: 'choosePluginAction', disabled: true },
|
|
109
|
-
{ label: 'configurePluginAction', disabled: true },
|
|
110
|
-
]);
|
|
111
|
-
this._currentStepIndex$.next(0);
|
|
112
|
-
}
|
|
113
|
-
setChoosePluginActionSteps() {
|
|
114
|
-
combineLatest([
|
|
115
|
-
this._hasOneProcessLinkType$,
|
|
116
|
-
this.pluginStateService.selectedPluginConfiguration$,
|
|
117
|
-
])
|
|
118
|
-
.pipe(take(1))
|
|
119
|
-
.subscribe(([hasOneType, selectedConfiguration]) => {
|
|
120
|
-
if (hasOneType) {
|
|
121
|
-
this._steps$.next([
|
|
122
|
-
{ label: 'choosePluginConfiguration', secondaryLabel: selectedConfiguration.title },
|
|
123
|
-
{ label: 'choosePluginAction' },
|
|
124
|
-
{ label: 'configurePluginAction', disabled: true },
|
|
125
|
-
]);
|
|
126
|
-
this._currentStepIndex$.next(1);
|
|
127
|
-
this.buttonService.showNextButton();
|
|
128
|
-
this.buttonService.showBackButton();
|
|
129
|
-
this.buttonService.hideSaveButton();
|
|
130
|
-
this.buttonService.disableNextButton();
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
this._steps$.next([
|
|
134
|
-
{ label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.plugin' },
|
|
135
|
-
{ label: 'choosePluginConfiguration', secondaryLabel: selectedConfiguration.title },
|
|
136
|
-
{ label: 'choosePluginAction' },
|
|
137
|
-
{ label: 'configurePluginAction', disabled: true },
|
|
138
|
-
]);
|
|
139
|
-
this._currentStepIndex$.next(2);
|
|
140
|
-
this.buttonService.showNextButton();
|
|
141
|
-
this.buttonService.showBackButton();
|
|
142
|
-
this.buttonService.hideSaveButton();
|
|
143
|
-
this.buttonService.disableNextButton();
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
setConfigurePluginActionSteps() {
|
|
148
|
-
combineLatest([
|
|
149
|
-
this._hasOneProcessLinkType$,
|
|
150
|
-
this.pluginStateService.selectedPluginConfiguration$,
|
|
151
|
-
this.pluginStateService.selectedPluginFunction$,
|
|
152
|
-
])
|
|
153
|
-
.pipe(take(1))
|
|
154
|
-
.subscribe(([hasOneType, selectedConfiguration, selectedFunction]) => {
|
|
155
|
-
const selectedFunctionTranslation = this.pluginTranslateService.instant(selectedFunction.key, selectedConfiguration.pluginDefinition.key);
|
|
156
|
-
if (hasOneType) {
|
|
157
|
-
this._steps$.next([
|
|
158
|
-
{ label: 'choosePluginConfiguration', secondaryLabel: selectedConfiguration.title },
|
|
159
|
-
{ label: 'choosePluginAction', secondaryLabel: selectedFunctionTranslation },
|
|
160
|
-
{ label: 'configurePluginAction' },
|
|
161
|
-
]);
|
|
162
|
-
this._currentStepIndex$.next(2);
|
|
163
|
-
this.buttonService.hideNextButton();
|
|
164
|
-
this.buttonService.showSaveButton();
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
this._steps$.next([
|
|
168
|
-
{ label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.plugin' },
|
|
169
|
-
{ label: 'choosePluginConfiguration', secondaryLabel: selectedConfiguration.title },
|
|
170
|
-
{ label: 'choosePluginAction', secondaryLabel: selectedFunctionTranslation },
|
|
171
|
-
{ label: 'configurePluginAction' },
|
|
172
|
-
]);
|
|
173
|
-
this._currentStepIndex$.next(3);
|
|
174
|
-
this.buttonService.hideNextButton();
|
|
175
|
-
this.buttonService.showSaveButton();
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
setURLSteps() {
|
|
180
|
-
this._steps$.next([
|
|
181
|
-
{ label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.url' },
|
|
182
|
-
{ label: 'selectURL' },
|
|
183
|
-
]);
|
|
184
|
-
this._currentStepIndex$.next(1);
|
|
185
|
-
}
|
|
186
|
-
setSingleURLStep() {
|
|
187
|
-
this._steps$.next([{ label: 'selectURL' }]);
|
|
188
|
-
this._currentStepIndex$.next(0);
|
|
189
|
-
}
|
|
190
|
-
disableSteps() {
|
|
191
|
-
this._disableSteps$.next(true);
|
|
192
|
-
}
|
|
193
|
-
enableSteps() {
|
|
194
|
-
this._disableSteps$.next(false);
|
|
195
|
-
}
|
|
196
|
-
setHasOneProcessLinkType(hasOne) {
|
|
197
|
-
this._hasOneProcessLinkType$.next(hasOne);
|
|
198
|
-
}
|
|
199
|
-
setProcessLinkTypeSteps(processLinkTypeId, hasOneOption) {
|
|
200
|
-
switch (processLinkTypeId) {
|
|
201
|
-
case 'form':
|
|
202
|
-
if (hasOneOption) {
|
|
203
|
-
this.setSingleFormStep();
|
|
204
|
-
this.buttonService.hideBackButton();
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
this.setFormSteps();
|
|
208
|
-
this.buttonService.showBackButton();
|
|
209
|
-
}
|
|
210
|
-
this.buttonService.showSaveButton();
|
|
211
|
-
break;
|
|
212
|
-
case 'form-flow':
|
|
213
|
-
if (hasOneOption) {
|
|
214
|
-
this.setSingleFormFlowStep();
|
|
215
|
-
this.buttonService.hideSaveButton();
|
|
216
|
-
this.buttonService.hideBackButton();
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
this.setFormFlowSteps();
|
|
220
|
-
this.buttonService.showSaveButton();
|
|
221
|
-
this.buttonService.showBackButton();
|
|
222
|
-
}
|
|
223
|
-
break;
|
|
224
|
-
case 'plugin':
|
|
225
|
-
if (hasOneOption) {
|
|
226
|
-
this.setSingleChoosePluginConfigurationSteps();
|
|
227
|
-
this.buttonService.hideBackButton();
|
|
228
|
-
this.buttonService.showNextButton();
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
this.setChoosePluginConfigurationSteps();
|
|
232
|
-
this.buttonService.showBackButton();
|
|
233
|
-
this.buttonService.showNextButton();
|
|
234
|
-
}
|
|
235
|
-
break;
|
|
236
|
-
case 'url':
|
|
237
|
-
if (hasOneOption) {
|
|
238
|
-
this.setSingleURLStep();
|
|
239
|
-
this.buttonService.hideBackButton();
|
|
240
|
-
this.buttonService.showSaveButton();
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
this.setURLSteps();
|
|
244
|
-
this.buttonService.showBackButton();
|
|
245
|
-
this.buttonService.showSaveButton();
|
|
246
|
-
}
|
|
247
|
-
break;
|
|
248
|
-
case 'ui-component':
|
|
249
|
-
this.setUIComponentStep();
|
|
250
|
-
this.buttonService.showBackButton();
|
|
251
|
-
this.buttonService.showSaveButton();
|
|
252
|
-
break;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
setChoiceSteps() {
|
|
256
|
-
this._steps$.next([
|
|
257
|
-
{ label: 'chooseProcessLinkType' },
|
|
258
|
-
{ label: 'empty', disabled: true },
|
|
259
|
-
{ label: 'empty', disabled: true },
|
|
260
|
-
]);
|
|
261
|
-
this._currentStepIndex$.next(0);
|
|
262
|
-
}
|
|
263
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinkStepService, deps: [{ token: i1.TranslateService }, { token: i2.ProcessLinkButtonService }, { token: i3.PluginStateService }, { token: i4.PluginTranslationService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
264
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinkStepService }); }
|
|
265
|
-
}
|
|
266
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinkStepService, decorators: [{
|
|
267
|
-
type: Injectable
|
|
268
|
-
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.ProcessLinkButtonService }, { type: i3.PluginStateService }, { type: i4.PluginTranslationService }] });
|
|
269
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1saW5rLXN0ZXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vcHJvY2Vzcy1saW5rL3NyYy9saWIvc2VydmljZXMvcHJvY2Vzcy1saW5rLXN0ZXAuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYSxNQUFNLE1BQU0sQ0FBQztBQUk3RSxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQUtwQyxNQUFNLE9BQU8sc0JBQXNCO0lBTWpDLElBQUksTUFBTTtRQUNSLE9BQU8sYUFBYSxDQUFDO1lBQ25CLElBQUksQ0FBQyxPQUFPO1lBQ1osSUFBSSxDQUFDLGNBQWM7WUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDcEMsQ0FBQyxDQUFDLElBQUksQ0FDTCxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQzVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FDNUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakIsR0FBRyxJQUFJO1lBQ1AsUUFBUSxFQUFFLFlBQVk7WUFDdEIsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0RSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSTtnQkFDekIsY0FBYyxFQUFFLElBQUks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LElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU07UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDaEIsRUFBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUM7WUFDaEMsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUM7WUFDaEMsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUM7U0FDakMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDOytHQTlRVSxzQkFBc0I7bUhBQXRCLHNCQUFzQjs7NEZBQXRCLHNCQUFzQjtrQkFEbEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1N0ZXB9IGZyb20gJ2NhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXInO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7UHJvY2Vzc0xpbmtDb25maWd1cmF0aW9uU3RlcCwgUHJvY2Vzc0xpbmtUeXBlfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7UHJvY2Vzc0xpbmtCdXR0b25TZXJ2aWNlfSBmcm9tICcuL3Byb2Nlc3MtbGluay1idXR0b24uc2VydmljZSc7XG5pbXBvcnQge3Rha2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7UGx1Z2luU3RhdGVTZXJ2aWNlfSBmcm9tICcuL3BsdWdpbi1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7UGx1Z2luVHJhbnNsYXRpb25TZXJ2aWNlfSBmcm9tICdAdmFsdGltby9wbHVnaW4nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUHJvY2Vzc0xpbmtTdGVwU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0ZXBzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8U3RlcD4+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1cnJlbnRTdGVwSW5kZXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kaXNhYmxlU3RlcHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhc09uZVByb2Nlc3NMaW5rVHlwZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBnZXQgc3RlcHMkKCk6IE9ic2VydmFibGU8QXJyYXk8U3RlcD4+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLl9zdGVwcyQsXG4gICAgICB0aGlzLl9kaXNhYmxlU3RlcHMkLFxuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JyksXG4gICAgXSkucGlwZShcbiAgICAgIGZpbHRlcigoW3N0ZXBzXSkgPT4gISFzdGVwcyksXG4gICAgICBtYXAoKFtzdGVwcywgZGlzYWJsZVN0ZXBzXSkgPT5cbiAgICAgICAgc3RlcHMubWFwKHN0ZXAgPT4gKHtcbiAgICAgICAgICAuLi5zdGVwLFxuICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlU3RlcHMsXG4gICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBwcm9jZXNzTGlua1N0ZXBzLiR7c3RlcC5sYWJlbH1gKSxcbiAgICAgICAgICAuLi4oc3RlcC5zZWNvbmRhcnlMYWJlbCAmJiB7XG4gICAgICAgICAgICBzZWNvbmRhcnlMYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoc3RlcC5zZWNvbmRhcnlMYWJlbCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBnZXQgY3VycmVudFN0ZXBJbmRleCQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFN0ZXBJbmRleCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgY3VycmVudFN0ZXBJZCQoKTogT2JzZXJ2YWJsZTxQcm9jZXNzTGlua0NvbmZpZ3VyYXRpb25TdGVwIHwgJyc+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdGhpcy5fc3RlcHMkLCB0aGlzLmN1cnJlbnRTdGVwSW5kZXgkXSkucGlwZShcbiAgICAgIGZpbHRlcigoW3N0ZXBzLCBjdXJyZW50U3RlcEluZGV4XSkgPT4gISFzdGVwcyAmJiB0eXBlb2YgY3VycmVudFN0ZXBJbmRleCA9PT0gJ251bWJlcicpLFxuICAgICAgbWFwKChbc3RlcHMsIGN1cnJlbnRTdGVwSW5kZXhdKSA9PlxuICAgICAgICBzdGVwcy5sZW5ndGggPiAwID8gKHN0ZXBzW2N1cnJlbnRTdGVwSW5kZXhdPy5sYWJlbCBhcyBQcm9jZXNzTGlua0NvbmZpZ3VyYXRpb25TdGVwKSA6ICcnXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGdldCBoYXNPbmVQcm9jZXNzTGlua1R5cGUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9oYXNPbmVQcm9jZXNzTGlua1R5cGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnV0dG9uU2VydmljZTogUHJvY2Vzc0xpbmtCdXR0b25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luU3RhdGVTZXJ2aWNlOiBQbHVnaW5TdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5UcmFuc2xhdGVTZXJ2aWNlOiBQbHVnaW5UcmFuc2xhdGlvblNlcnZpY2VcbiAgKSB7fVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2N1cnJlbnRTdGVwSW5kZXgkLm5leHQoMCk7XG4gICAgdGhpcy5fc3RlcHMkLm5leHQoW10pO1xuICB9XG5cbiAgc2V0SW5pdGlhbFN0ZXBzKGF2YWlsYWJsZVByb2Nlc3NMaW5rVHlwZXM6IEFycmF5PFByb2Nlc3NMaW5rVHlwZT4pOiB2b2lkIHtcbiAgICBpZiAoYXZhaWxhYmxlUHJvY2Vzc0xpbmtUeXBlcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLnNldENob2ljZVN0ZXBzKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0Rm9ybVN0ZXBzKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBzJC5uZXh0KFtcbiAgICAgIHtsYWJlbDogJ2Nob29zZVByb2Nlc3NMaW5rVHlwZScsIHNlY29uZGFyeUxhYmVsOiAncHJvY2Vzc0xpbmtUeXBlLmZvcm0nfSxcbiAgICAgIHtsYWJlbDogJ3NlbGVjdEZvcm0nfSxcbiAgICBdKTtcbiAgICB0aGlzLl9jdXJyZW50U3RlcEluZGV4JC5uZXh0KDEpO1xuICB9XG5cbiAgc2V0U2luZ2xlRm9ybVN0ZXAoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcHMkLm5leHQoW3tsYWJlbDogJ3NlbGVjdEZvcm0nfV0pO1xuICAgIHRoaXMuX2N1cnJlbnRTdGVwSW5kZXgkLm5leHQoMCk7XG4gIH1cblxuICBzZXRVSUNvbXBvbmVudFN0ZXAoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcHMkLm5leHQoW1xuICAgICAge2xhYmVsOiAnY2hvb3NlUHJvY2Vzc0xpbmtUeXBlJywgc2Vjb25kYXJ5TGFiZWw6ICdwcm9jZXNzTGlua1R5cGUudWktY29tcG9uZW50J30sXG4gICAgICB7bGFiZWw6ICd1aUNvbXBvbmVudCd9LFxuICAgIF0pO1xuICAgIHRoaXMuX2N1cnJlbnRTdGVwSW5kZXgkLm5leHQoMSk7XG4gIH1cblxuICBzZXRGb3JtRmxvd1N0ZXBzKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBzJC5uZXh0KFtcbiAgICAgIHtsYWJlbDogJ2Nob29zZVByb2Nlc3NMaW5rVHlwZScsIHNlY29uZGFyeUxhYmVsOiAncHJvY2Vzc0xpbmtUeXBlLmZvcm0tZmxvdyd9LFxuICAgICAge2xhYmVsOiAnc2VsZWN0Rm9ybUZsb3cnfSxcbiAgICBdKTtcbiAgICB0aGlzLl9jdXJyZW50U3RlcEluZGV4JC5uZXh0KDEpO1xuICB9XG5cbiAgc2V0U2luZ2xlRm9ybUZsb3dTdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBzJC5uZXh0KFt7bGFiZWw6ICdzZWxlY3RGb3JtRmxvdyd9XSk7XG4gICAgdGhpcy5fY3VycmVudFN0ZXBJbmRleCQubmV4dCgwKTtcbiAgfVxuXG4gIHNldENob29zZVBsdWdpbkNvbmZpZ3VyYXRpb25TdGVwcygpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGVwcyQubmV4dChbXG4gICAgICB7bGFiZWw6ICdjaG9vc2VQcm9jZXNzTGlua1R5cGUnLCBzZWNvbmRhcnlMYWJlbDogJ3Byb2Nlc3NMaW5rVHlwZS5wbHVnaW4nfSxcbiAgICAgIHtsYWJlbDogJ2Nob29zZVBsdWdpbkNvbmZpZ3VyYXRpb24nfSxcbiAgICAgIHtsYWJlbDogJ2Nob29zZVBsdWdpbkFjdGlvbicsIGRpc2FibGVkOiB0cnVlfSxcbiAgICAgIHtsYWJlbDogJ2NvbmZpZ3VyZVBsdWdpbkFjdGlvbicsIGRpc2FibGVkOiB0cnVlfSxcbiAgICBdKTtcbiAgICB0aGlzLl9jdXJyZW50U3RlcEluZGV4JC5uZXh0KDEpO1xuICB9XG5cbiAgc2V0U2luZ2xlQ2hvb3NlUGx1Z2luQ29uZmlndXJhdGlvblN0ZXBzKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBzJC5uZXh0KFtcbiAgICAgIHtsYWJlbDogJ2Nob29zZVBsdWdpbkNvbmZpZ3VyYXRpb24nfSxcbiAgICAgIHtsYWJlbDogJ2Nob29zZVBsdWdpbkFjdGlvbicsIGRpc2FibGVkOiB0cnVlfSxcbiAgICAgIHtsYWJlbDogJ2NvbmZpZ3VyZVBsdWdpbkFjdGlvbicsIGRpc2FibGVkOiB0cnVlfSxcbiAgICBdKTtcbiAgICB0aGlzLl9jdXJyZW50U3RlcEluZGV4JC5uZXh0KDApO1xuICB9XG5cbiAgc2V0Q2hvb3NlUGx1Z2luQWN0aW9uU3RlcHMoKTogdm9pZCB7XG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLl9oYXNPbmVQcm9jZXNzTGlua1R5cGUkLFxuICAgICAgdGhpcy5wbHVnaW5TdGF0ZVNlcnZpY2Uuc2VsZWN0ZWRQbHVnaW5Db25maWd1cmF0aW9uJCxcbiAgICBdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtoYXNPbmVUeXBlLCBzZWxlY3RlZENvbmZpZ3VyYXRpb25dKSA9PiB7XG4gICAgICAgIGlmIChoYXNPbmVUeXBlKSB7XG4gICAgICAgICAgdGhpcy5fc3RlcHMkLm5leHQoW1xuICAgICAgICAgICAge2xhYmVsOiAnY2hvb3NlUGx1Z2luQ29uZmlndXJhdGlvbicsIHNlY29uZGFyeUxhYmVsOiBzZWxlY3RlZENvbmZpZ3VyYXRpb24udGl0bGV9LFxuICAgICAgICAgICAge2xhYmVsOiAnY2hvb3NlUGx1Z2luQWN0aW9uJ30sXG4gICAgICAgICAgICB7bGFiZWw6ICdjb25maWd1cmVQbHVnaW5BY3Rpb24nLCBkaXNhYmxlZDogdHJ1ZX0sXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFN0ZXBJbmRleCQubmV4dCgxKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2Uuc2hvd05leHRCdXR0b24oKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2Uuc2hvd0JhY2tCdXR0b24oKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2UuaGlkZVNhdmVCdXR0b24oKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2UuZGlzYWJsZU5leHRCdXR0b24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zdGVwcyQubmV4dChbXG4gICAgICAgICAgICB7bGFiZWw6ICdjaG9vc2VQcm9jZXNzTGlua1R5cGUnLCBzZWNvbmRhcnlMYWJlbDogJ3Byb2Nlc3NMaW5rVHlwZS5wbHVnaW4nfSxcbiAgICAgICAgICAgIHtsYWJlbDogJ2Nob29zZVBsdWdpbkNvbmZpZ3VyYXRpb24nLCBzZWNvbmRhcnlMYWJlbDogc2VsZWN0ZWRDb25maWd1cmF0aW9uLnRpdGxlfSxcbiAgICAgICAgICAgIHtsYWJlbDogJ2Nob29zZVBsdWdpbkFjdGlvbid9LFxuICAgICAgICAgICAge2xhYmVsOiAnY29uZmlndXJlUGx1Z2luQWN0aW9uJywgZGlzYWJsZWQ6IHRydWV9LFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRTdGVwSW5kZXgkLm5leHQoMik7XG4gICAgICAgICAgdGhpcy5idXR0b25TZXJ2aWNlLnNob3dOZXh0QnV0dG9uKCk7XG4gICAgICAgICAgdGhpcy5idXR0b25TZXJ2aWNlLnNob3dCYWNrQnV0dG9uKCk7XG5cbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2UuaGlkZVNhdmVCdXR0b24oKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2UuZGlzYWJsZU5leHRCdXR0b24oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBzZXRDb25maWd1cmVQbHVnaW5BY3Rpb25TdGVwcygpOiB2b2lkIHtcbiAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuX2hhc09uZVByb2Nlc3NMaW5rVHlwZSQsXG4gICAgICB0aGlzLnBsdWdpblN0YXRlU2VydmljZS5zZWxlY3RlZFBsdWdpbkNvbmZpZ3VyYXRpb24kLFxuICAgICAgdGhpcy5wbHVnaW5TdGF0ZVNlcnZpY2Uuc2VsZWN0ZWRQbHVnaW5GdW5jdGlvbiQsXG4gICAgXSlcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKChbaGFzT25lVHlwZSwgc2VsZWN0ZWRDb25maWd1cmF0aW9uLCBzZWxlY3RlZEZ1bmN0aW9uXSkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEZ1bmN0aW9uVHJhbnNsYXRpb24gPSB0aGlzLnBsdWdpblRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICBzZWxlY3RlZEZ1bmN0aW9uLmtleSxcbiAgICAgICAgICBzZWxlY3RlZENvbmZpZ3VyYXRpb24ucGx1Z2luRGVmaW5pdGlvbi5rZXlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaGFzT25lVHlwZSkge1xuICAgICAgICAgIHRoaXMuX3N0ZXBzJC5uZXh0KFtcbiAgICAgICAgICAgIHtsYWJlbDogJ2Nob29zZVBsdWdpbkNvbmZpZ3VyYXRpb24nLCBzZWNvbmRhcnlMYWJlbDogc2VsZWN0ZWRDb25maWd1cmF0aW9uLnRpdGxlfSxcbiAgICAgICAgICAgIHtsYWJlbDogJ2Nob29zZVBsdWdpbkFjdGlvbicsIHNlY29uZGFyeUxhYmVsOiBzZWxlY3RlZEZ1bmN0aW9uVHJhbnNsYXRpb259LFxuICAgICAgICAgICAge2xhYmVsOiAnY29uZmlndXJlUGx1Z2luQWN0aW9uJ30sXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFN0ZXBJbmRleCQubmV4dCgyKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2UuaGlkZU5leHRCdXR0b24oKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2Uuc2hvd1NhdmVCdXR0b24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zdGVwcyQubmV4dChbXG4gICAgICAgICAgICB7bGFiZWw6ICdjaG9vc2VQcm9jZXNzTGlua1R5cGUnLCBzZWNvbmRhcnlMYWJlbDogJ3Byb2Nlc3NMaW5rVHlwZS5wbHVnaW4nfSxcbiAgICAgICAgICAgIHtsYWJlbDogJ2Nob29zZVBsdWdpbkNvbmZpZ3VyYXRpb24nLCBzZWNvbmRhcnlMYWJlbDogc2VsZWN0ZWRDb25maWd1cmF0aW9uLnRpdGxlfSxcbiAgICAgICAgICAgIHtsYWJlbDogJ2Nob29zZVBsdWdpbkFjdGlvbicsIHNlY29uZGFyeUxhYmVsOiBzZWxlY3RlZEZ1bmN0aW9uVHJhbnNsYXRpb259LFxuICAgICAgICAgICAge2xhYmVsOiAnY29uZmlndXJlUGx1Z2luQWN0aW9uJ30sXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFN0ZXBJbmRleCQubmV4dCgzKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2UuaGlkZU5leHRCdXR0b24oKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2Uuc2hvd1NhdmVCdXR0b24oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0VVJMU3RlcHMoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcHMkLm5leHQoW1xuICAgICAge2xhYmVsOiAnY2hvb3NlUHJvY2Vzc0xpbmtUeXBlJywgc2Vjb25kYXJ5TGFiZWw6ICdwcm9jZXNzTGlua1R5cGUudXJsJ30sXG4gICAgICB7bGFiZWw6ICdzZWxlY3RVUkwnfSxcbiAgICBdKTtcbiAgICB0aGlzLl9jdXJyZW50U3RlcEluZGV4JC5uZXh0KDEpO1xuICB9XG5cbiAgcHVibGljIHNldFNpbmdsZVVSTFN0ZXAoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcHMkLm5leHQoW3tsYWJlbDogJ3NlbGVjdFVSTCd9XSk7XG4gICAgdGhpcy5fY3VycmVudFN0ZXBJbmRleCQubmV4dCgwKTtcbiAgfVxuXG4gIGRpc2FibGVTdGVwcygpOiB2b2lkIHtcbiAgICB0aGlzLl9kaXNhYmxlU3RlcHMkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBlbmFibGVTdGVwcygpOiB2b2lkIHtcbiAgICB0aGlzLl9kaXNhYmxlU3RlcHMkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgc2V0SGFzT25lUHJvY2Vzc0xpbmtUeXBlKGhhc09uZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2hhc09uZVByb2Nlc3NMaW5rVHlwZSQubmV4dChoYXNPbmUpO1xuICB9XG5cbiAgc2V0UHJvY2Vzc0xpbmtUeXBlU3RlcHMocHJvY2Vzc0xpbmtUeXBlSWQ6IHN0cmluZywgaGFzT25lT3B0aW9uPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHN3aXRjaCAocHJvY2Vzc0xpbmtUeXBlSWQpIHtcbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICBpZiAoaGFzT25lT3B0aW9uKSB7XG4gICAgICAgICAgdGhpcy5zZXRTaW5nbGVGb3JtU3RlcCgpO1xuICAgICAgICAgIHRoaXMuYnV0dG9uU2VydmljZS5oaWRlQmFja0J1dHRvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0Rm9ybVN0ZXBzKCk7XG4gICAgICAgICAgdGhpcy5idXR0b25TZXJ2aWNlLnNob3dCYWNrQnV0dG9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idXR0b25TZXJ2aWNlLnNob3dTYXZlQnV0dG9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZm9ybS1mbG93JzpcbiAgICAgICAgaWYgKGhhc09uZU9wdGlvbikge1xuICAgICAgICAgIHRoaXMuc2V0U2luZ2xlRm9ybUZsb3dTdGVwKCk7XG4gICAgICAgICAgdGhpcy5idXR0b25TZXJ2aWNlLmhpZGVTYXZlQnV0dG9uKCk7XG4gICAgICAgICAgdGhpcy5idXR0b25TZXJ2aWNlLmhpZGVCYWNrQnV0dG9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRGb3JtRmxvd1N0ZXBzKCk7XG4gICAgICAgICAgdGhpcy5idXR0b25TZXJ2aWNlLnNob3dTYXZlQnV0dG9uKCk7XG4gICAgICAgICAgdGhpcy5idXR0b25TZXJ2aWNlLnNob3dCYWNrQnV0dG9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwbHVnaW4nOlxuICAgICAgICBpZiAoaGFzT25lT3B0aW9uKSB7XG4gICAgICAgICAgdGhpcy5zZXRTaW5nbGVDaG9vc2VQbHVnaW5Db25maWd1cmF0aW9uU3RlcHMoKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2UuaGlkZUJhY2tCdXR0b24oKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2Uuc2hvd05leHRCdXR0b24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldENob29zZVBsdWdpbkNvbmZpZ3VyYXRpb25TdGVwcygpO1xuICAgICAgICAgIHRoaXMuYnV0dG9uU2VydmljZS5zaG93QmFja0J1dHRvbigpO1xuICAgICAgICAgIHRoaXMuYnV0dG9uU2VydmljZS5zaG93TmV4dEJ1dHRvbigpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgaWYgKGhhc09uZU9wdGlvbikge1xuICAgICAgICAgIHRoaXMuc2V0U2luZ2xlVVJMU3RlcCgpO1xuICAgICAgICAgIHRoaXMuYnV0dG9uU2VydmljZS5oaWRlQmFja0J1dHRvbigpO1xuICAgICAgICAgIHRoaXMuYnV0dG9uU2VydmljZS5zaG93U2F2ZUJ1dHRvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0VVJMU3RlcHMoKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2Uuc2hvd0JhY2tCdXR0b24oKTtcbiAgICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2Uuc2hvd1NhdmVCdXR0b24oKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3VpLWNvbXBvbmVudCc6XG4gICAgICAgIHRoaXMuc2V0VUlDb21wb25lbnRTdGVwKCk7XG4gICAgICAgIHRoaXMuYnV0dG9uU2VydmljZS5zaG93QmFja0J1dHRvbigpO1xuICAgICAgICB0aGlzLmJ1dHRvblNlcnZpY2Uuc2hvd1NhdmVCdXR0b24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaG9pY2VTdGVwcygpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGVwcyQubmV4dChbXG4gICAgICB7bGFiZWw6ICdjaG9vc2VQcm9jZXNzTGlua1R5cGUnfSxcbiAgICAgIHtsYWJlbDogJ2VtcHR5JywgZGlzYWJsZWQ6IHRydWV9LFxuICAgICAge2xhYmVsOiAnZW1wdHknLCBkaXNhYmxlZDogdHJ1ZX0sXG4gICAgXSk7XG4gICAgdGhpcy5fY3VycmVudFN0ZXBJbmRleCQubmV4dCgwKTtcbiAgfVxufVxuIl19
|