@valtimo/process-link 13.12.0 → 13.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/fesm2022/valtimo-process-link.mjs +2003 -352
  2. package/fesm2022/valtimo-process-link.mjs.map +1 -1
  3. package/lib/components/choose-process-link-type/choose-process-link-type.component.d.ts +2 -2
  4. package/lib/components/choose-process-link-type/choose-process-link-type.component.d.ts.map +1 -1
  5. package/lib/components/configure-building-block-mappings/configure-building-block-mappings.component.d.ts +91 -0
  6. package/lib/components/configure-building-block-mappings/configure-building-block-mappings.component.d.ts.map +1 -0
  7. package/lib/components/configure-building-block-plugins/configure-building-block-plugins.component.d.ts +49 -0
  8. package/lib/components/configure-building-block-plugins/configure-building-block-plugins.component.d.ts.map +1 -0
  9. package/lib/components/configure-building-block-plugins/index.d.ts +2 -0
  10. package/lib/components/configure-building-block-plugins/index.d.ts.map +1 -0
  11. package/lib/components/plugin-action-configuration/plugin-action-configuration.component.d.ts.map +1 -1
  12. package/lib/components/process-link-modal/process-link-modal.component.d.ts +3 -3
  13. package/lib/components/process-link-modal/process-link-modal.component.d.ts.map +1 -1
  14. package/lib/components/select-building-block/index.d.ts +2 -0
  15. package/lib/components/select-building-block/index.d.ts.map +1 -0
  16. package/lib/components/select-building-block/select-building-block.component.d.ts +29 -0
  17. package/lib/components/select-building-block/select-building-block.component.d.ts.map +1 -0
  18. package/lib/components/select-form/select-form.component.d.ts.map +1 -1
  19. package/lib/components/select-form-flow/select-form-flow.component.d.ts.map +1 -1
  20. package/lib/components/select-plugin-action/select-plugin-action.component.d.ts.map +1 -1
  21. package/lib/components/select-plugin-configuration/select-plugin-configuration.component.d.ts +12 -4
  22. package/lib/components/select-plugin-configuration/select-plugin-configuration.component.d.ts.map +1 -1
  23. package/lib/components/select-ui-component/select-ui-component.component.d.ts.map +1 -1
  24. package/lib/constants/process.link.d.ts +2 -1
  25. package/lib/constants/process.link.d.ts.map +1 -1
  26. package/lib/models/building-block-field.model.d.ts +23 -0
  27. package/lib/models/building-block-field.model.d.ts.map +1 -0
  28. package/lib/models/index.d.ts +2 -0
  29. package/lib/models/index.d.ts.map +1 -1
  30. package/lib/models/plugin.model.d.ts +10 -0
  31. package/lib/models/plugin.model.d.ts.map +1 -0
  32. package/lib/models/process-link.model.d.ts +65 -10
  33. package/lib/models/process-link.model.d.ts.map +1 -1
  34. package/lib/process-link.module.d.ts +11 -8
  35. package/lib/process-link.module.d.ts.map +1 -1
  36. package/lib/services/building-block-state.service.d.ts +64 -0
  37. package/lib/services/building-block-state.service.d.ts.map +1 -0
  38. package/lib/services/index.d.ts +2 -0
  39. package/lib/services/index.d.ts.map +1 -1
  40. package/lib/services/plugin-state.service.d.ts +3 -1
  41. package/lib/services/plugin-state.service.d.ts.map +1 -1
  42. package/lib/services/process-link-building-block-api.service.d.ts +25 -0
  43. package/lib/services/process-link-building-block-api.service.d.ts.map +1 -0
  44. package/lib/services/process-link-state.service.d.ts +19 -6
  45. package/lib/services/process-link-state.service.d.ts.map +1 -1
  46. package/lib/services/process-link-step.service.d.ts +44 -0
  47. package/lib/services/process-link-step.service.d.ts.map +1 -1
  48. package/lib/services/process-link.service.d.ts +2 -4
  49. package/lib/services/process-link.service.d.ts.map +1 -1
  50. package/package.json +1 -1
@@ -1,33 +1,369 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Injectable, InjectionToken, Optional, Inject, Component, EventEmitter, Output, Input, ViewChild, ChangeDetectionStrategy, NgModule, ViewContainerRef } from '@angular/core';
3
- import * as i2 from '@valtimo/shared';
4
- import { BaseApiService, getCaseManagementRouteParams, ROLE_ADMIN } from '@valtimo/shared';
5
- import * as i1 from '@angular/common/http';
6
- import { HttpParams, HttpHeaders } from '@angular/common/http';
7
- import { BehaviorSubject, Subject, switchMap, of, combineLatest, map as map$1, filter, Subscription, startWith, mergeMap, tap, take as take$1 } from 'rxjs';
8
- import { map, take, switchMap as switchMap$1, tap as tap$1 } from 'rxjs/operators';
3
+ import { catchError, of, BehaviorSubject, combineLatest, map, Subject, switchMap, filter, Subscription, startWith, mergeMap, tap, withLatestFrom as withLatestFrom$1, take as take$1, shareReplay, distinctUntilChanged } from 'rxjs';
4
+ import * as i2 from '@angular/common/http';
5
+ import { HttpHeaders, HttpParams } from '@angular/common/http';
6
+ import * as i1 from '@valtimo/shared';
7
+ import { BaseApiService, InterceptorSkip, getCaseManagementRouteParams, getBuildingBlockManagementRouteParams, ROLE_ADMIN } from '@valtimo/shared';
8
+ import { map as map$1, take, switchMap as switchMap$1, withLatestFrom, filter as filter$1, catchError as catchError$1, tap as tap$1 } from 'rxjs/operators';
9
9
  import * as i1$1 from '@valtimo/plugin';
10
10
  import { PluginTranslatePipeModule, PluginConfigurationContainerModule } from '@valtimo/plugin';
11
- import * as i2$1 from '@ngx-translate/core';
11
+ import * as i3 from '@ngx-translate/core';
12
12
  import { TranslateModule } from '@ngx-translate/core';
13
- import * as i3 from '@angular/common';
13
+ import * as i3$1 from '@angular/common';
14
14
  import { CommonModule } from '@angular/common';
15
- import * as i4 from 'carbon-components-angular';
16
- import { ModalModule as ModalModule$1, ProgressIndicatorModule, ButtonModule, IconModule, ComboBoxModule, InputModule, LoadingModule, StructuredListModule, TilesModule, SelectModule, ToggleModule, LayerModule, ToggletipModule } from 'carbon-components-angular';
15
+ import * as i3$2 from 'carbon-components-angular';
16
+ import { ComboBoxModule, RadioModule, InputModule, ButtonModule, IconModule, LayerModule, ModalModule as ModalModule$1, ProgressIndicatorModule, LoadingModule, StructuredListModule, TilesModule, SelectModule as SelectModule$1, ToggleModule, ToggletipModule, NotificationModule } from 'carbon-components-angular';
17
17
  import * as i1$2 from '@angular/forms';
18
- import { FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
18
+ import { FormControl, Validators, FormGroup, FormArray, ReactiveFormsModule, FormsModule } from '@angular/forms';
19
19
  import { Upload16 } from '@carbon/icons';
20
- import * as i2$2 from '@valtimo/components';
21
- import { FormioOptionsImpl, ModalModule, SearchableDropdownSelectModule, StepperModule, VModalModule, ParagraphModule, TooltipModule, TooltipIconModule, FormIoModule, ValtimoCdsModalDirective, RenderInPageHeaderDirective, CarbonMultiInputModule, RemoveClassnamesDirective } from '@valtimo/components';
20
+ import * as i2$1 from '@valtimo/components';
21
+ import { ValuePathSelectorPrefix, ValuePathSelectorComponent, InputLabelModule, SelectModule, FormioOptionsImpl, ModalModule, SearchableDropdownSelectModule, StepperModule, VModalModule, ParagraphModule, TooltipModule, TooltipIconModule, FormIoModule, ValtimoCdsModalDirective, RenderInPageHeaderDirective, CarbonMultiInputModule, RemoveClassnamesDirective } from '@valtimo/components';
22
22
  import * as i5 from 'carbon-components-angular/dropdown';
23
23
  import BpmnViewer from 'bpmn-js';
24
24
  import * as i1$3 from '@valtimo/process';
25
- import * as i3$1 from '@angular/router';
25
+ import * as i3$3 from '@angular/router';
26
26
  import { RouterModule } from '@angular/router';
27
27
  import { AuthGuardService } from '@valtimo/security';
28
28
  import * as i1$4 from '@valtimo/form';
29
29
  import * as i1$5 from '@valtimo/form-flow-management';
30
30
 
31
+ /*
32
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
33
+ *
34
+ * Licensed under EUPL, Version 1.2 (the "License");
35
+ * you may not use this file except in compliance with the License.
36
+ * You may obtain a copy of the License at
37
+ *
38
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
39
+ *
40
+ * Unless required by applicable law or agreed to in writing, software
41
+ * distributed under the License is distributed on an "AS IS" basis,
42
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
43
+ * See the License for the specific language governing permissions and
44
+ * limitations under the License.
45
+ */
46
+ class ProcessLinkBuildingBlockApiService extends BaseApiService {
47
+ constructor(configService, httpClient) {
48
+ super(httpClient, configService);
49
+ this.configService = configService;
50
+ this.httpClient = httpClient;
51
+ }
52
+ getVersionsForBuildingBlock(key, page = 0, size = 5, all = false) {
53
+ const allParam = all ? 'all=true' : '';
54
+ return this.httpClient.get(this.getApiUrl(`management/v1/building-block/${key}/version?page=${page}&size=${size}${allParam}`));
55
+ }
56
+ getPluginDefinitionsForBuildingBlock(key, versionTag) {
57
+ return this.httpClient.get(this.getApiUrl(`management/v1/building-block/${key}/version/${versionTag}/plugin`));
58
+ }
59
+ getFieldsForBuildingBlock(key, versionTag) {
60
+ return this.httpClient.get(this.getApiUrl(`management/v1/building-block/${key}/version/${versionTag}/fields`));
61
+ }
62
+ getBuildingBlockDefinitions(options) {
63
+ return this.httpClient
64
+ .get(this.getApiUrl('management/v1/building-block'), {
65
+ params: options,
66
+ headers: new HttpHeaders().set(InterceptorSkip, '404'),
67
+ })
68
+ .pipe(catchError((error) => {
69
+ if (error.status === 404)
70
+ return of([]);
71
+ throw error;
72
+ }));
73
+ }
74
+ getMainProcessDefinitionKeyForBuildingBlock(key, versionTag) {
75
+ return this.httpClient.get(this.getApiUrl(`management/v1/building-block/${key}/version/${versionTag}/process-definition/main/key`), {
76
+ responseType: 'text',
77
+ });
78
+ }
79
+ isBuildingBlockProcess(processDefinitionId) {
80
+ return this.httpClient
81
+ .get(this.getApiUrl(`management/v1/building-block/process-definition/${processDefinitionId}/is-building-block`))
82
+ .pipe(catchError(() => of(false)));
83
+ }
84
+ getBuildingBlockDefinition(key, versionTag) {
85
+ return this.httpClient
86
+ .get(this.getApiUrl(`management/v1/building-block/${key}/version/${versionTag}`), {
87
+ headers: new HttpHeaders().set(InterceptorSkip, '404'),
88
+ })
89
+ .pipe(catchError(() => of(null)));
90
+ }
91
+ getCaseDefinition(key, versionTag) {
92
+ return this.httpClient
93
+ .get(this.getApiUrl(`management/v1/case-definition/${key}/version/${versionTag}`), {
94
+ headers: new HttpHeaders().set(InterceptorSkip, '404'),
95
+ })
96
+ .pipe(catchError(() => of(null)));
97
+ }
98
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkBuildingBlockApiService, deps: [{ token: i1.ConfigService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
99
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkBuildingBlockApiService, providedIn: 'root' }); }
100
+ }
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkBuildingBlockApiService, decorators: [{
102
+ type: Injectable,
103
+ args: [{
104
+ providedIn: 'root',
105
+ }]
106
+ }], ctorParameters: () => [{ type: i1.ConfigService }, { type: i2.HttpClient }] });
107
+
108
+ /*
109
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
110
+ *
111
+ * Licensed under EUPL, Version 1.2 (the "License");
112
+ * you may not use this file except in compliance with the License.
113
+ * You may obtain a copy of the License at
114
+ *
115
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
116
+ *
117
+ * Unless required by applicable law or agreed to in writing, software
118
+ * distributed under the License is distributed on an "AS IS" BASIS,
119
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120
+ * See the License for the specific language governing permissions and
121
+ * limitations under the License.
122
+ */
123
+ class BuildingBlockStateService {
124
+ constructor(processLinkBuildingBlockApiService) {
125
+ this.processLinkBuildingBlockApiService = processLinkBuildingBlockApiService;
126
+ this._definitionKey$ = new BehaviorSubject(null);
127
+ this._definitionVersionTag$ = new BehaviorSubject(null);
128
+ this._versions$ = new BehaviorSubject([]);
129
+ this._requiredPluginKeys$ = new BehaviorSubject([]);
130
+ this._pluginMappings$ = new BehaviorSubject({});
131
+ this._buildingBlockFields$ = new BehaviorSubject([]);
132
+ this._inputMappings$ = new BehaviorSubject([]);
133
+ this._outputMappings$ = new BehaviorSubject([]);
134
+ this._loadingRequirements$ = new BehaviorSubject(false);
135
+ this._loadingFields$ = new BehaviorSubject(false);
136
+ this._pluginDependencies$ = new BehaviorSubject([]);
137
+ this._isNestedBuildingBlock$ = new BehaviorSubject(false);
138
+ }
139
+ get definitionKey$() {
140
+ return this._definitionKey$.asObservable();
141
+ }
142
+ get definitionVersionTag$() {
143
+ return this._definitionVersionTag$.asObservable();
144
+ }
145
+ get versions$() {
146
+ return this._versions$.asObservable();
147
+ }
148
+ get requiredPluginKeys$() {
149
+ return this._requiredPluginKeys$.asObservable();
150
+ }
151
+ get pluginMappings$() {
152
+ return this._pluginMappings$.asObservable();
153
+ }
154
+ get buildingBlockFields$() {
155
+ return this._buildingBlockFields$.asObservable();
156
+ }
157
+ get inputMappings$() {
158
+ return this._inputMappings$.asObservable();
159
+ }
160
+ get outputMappings$() {
161
+ return this._outputMappings$.asObservable();
162
+ }
163
+ get requirementsLoading$() {
164
+ return this._loadingRequirements$.asObservable();
165
+ }
166
+ get fieldsLoading$() {
167
+ return this._loadingFields$.asObservable();
168
+ }
169
+ get pluginDependencies$() {
170
+ return this._pluginDependencies$.asObservable();
171
+ }
172
+ get isNestedBuildingBlock$() {
173
+ return this._isNestedBuildingBlock$.asObservable();
174
+ }
175
+ setIsNestedBuildingBlock(isNested) {
176
+ this._isNestedBuildingBlock$.next(isNested);
177
+ }
178
+ get mappingsComplete$() {
179
+ return combineLatest([
180
+ this.requiredPluginKeys$,
181
+ this.pluginMappings$,
182
+ this.definitionVersionTag$,
183
+ this.isNestedBuildingBlock$,
184
+ ]).pipe(map(([keys, mappings, version, isNested]) => !!version && (isNested || keys.every(key => !!mappings[key]))));
185
+ }
186
+ setDefinitionKey(key, initialVersionTag) {
187
+ this._definitionKey$.next(key);
188
+ this._definitionVersionTag$.next(null);
189
+ this._versions$.next([]);
190
+ this.clearPluginRequirements();
191
+ this.clearMappings();
192
+ this.clearFields();
193
+ this._versionSubscription?.unsubscribe();
194
+ if (!key)
195
+ return;
196
+ this._versionSubscription = this.processLinkBuildingBlockApiService
197
+ .getVersionsForBuildingBlock(key)
198
+ .subscribe({
199
+ next: versions => {
200
+ this._versions$.next(versions.content.map(version => {
201
+ return version.versionTag;
202
+ }) ?? []);
203
+ if (initialVersionTag) {
204
+ this.setDefinitionVersionTag(initialVersionTag, true);
205
+ }
206
+ },
207
+ error: () => {
208
+ this._versions$.next([]);
209
+ },
210
+ });
211
+ }
212
+ setProcessLink(processLink) {
213
+ if (!processLink) {
214
+ this.reset();
215
+ return;
216
+ }
217
+ if (processLink.processLinkType === 'building-block') {
218
+ this.setDefinitionKey(processLink.buildingBlockDefinitionKey ?? null, processLink.buildingBlockDefinitionVersionTag ?? undefined);
219
+ this.setPluginConfigurationMappings(processLink.pluginConfigurationMappings);
220
+ this.setInputMappings(processLink.inputMappings ?? []);
221
+ this.setOutputMappings(processLink.outputMappings ?? []);
222
+ }
223
+ else {
224
+ this.reset();
225
+ }
226
+ }
227
+ setDefinitionVersionTag(versionTag, preserveMappings = false) {
228
+ this._definitionVersionTag$.next(versionTag);
229
+ this.clearPluginRequirements({ preserveMappings });
230
+ this.clearFields();
231
+ this.clearMappings({ preserveMappings });
232
+ const key = this._definitionKey$.getValue();
233
+ if (key && versionTag) {
234
+ this.loadPluginRequirements(key, versionTag);
235
+ this.loadFields(key, versionTag);
236
+ }
237
+ }
238
+ setPluginConfigurationMapping(pluginDefinitionKey, configurationId) {
239
+ const current = this._pluginMappings$.getValue();
240
+ this._pluginMappings$.next({
241
+ ...current,
242
+ [pluginDefinitionKey]: configurationId,
243
+ });
244
+ }
245
+ setPluginConfigurationMappings(mappings) {
246
+ const normalized = {};
247
+ Object.entries(mappings ?? {}).forEach(([key, value]) => {
248
+ normalized[key] = value;
249
+ });
250
+ this._pluginMappings$.next(normalized);
251
+ }
252
+ setInputMappings(mappings) {
253
+ this._inputMappings$.next(mappings ?? []);
254
+ }
255
+ setOutputMappings(mappings) {
256
+ this._outputMappings$.next(mappings ?? []);
257
+ }
258
+ getInputMappingsSnapshot() {
259
+ return [...this._inputMappings$.getValue()];
260
+ }
261
+ getOutputMappingsSnapshot() {
262
+ return [...this._outputMappings$.getValue()];
263
+ }
264
+ getPluginConfigurationMappingsSnapshot() {
265
+ return { ...this._pluginMappings$.getValue() };
266
+ }
267
+ getDefinitionSnapshot() {
268
+ return {
269
+ key: this._definitionKey$.getValue(),
270
+ versionTag: this._definitionVersionTag$.getValue(),
271
+ };
272
+ }
273
+ getBuildingBlockFieldsSnapshot() {
274
+ return [...this._buildingBlockFields$.getValue()];
275
+ }
276
+ reset() {
277
+ this._definitionKey$.next(null);
278
+ this._definitionVersionTag$.next(null);
279
+ this._versions$.next([]);
280
+ this._pluginMappings$.next({});
281
+ this._isNestedBuildingBlock$.next(false);
282
+ this.clearFields();
283
+ this.clearMappings();
284
+ this.clearPluginRequirements();
285
+ }
286
+ ngOnDestroy() {
287
+ this._versionSubscription?.unsubscribe();
288
+ this._requirementsSubscription?.unsubscribe();
289
+ this._fieldsSubscription?.unsubscribe();
290
+ }
291
+ loadPluginRequirements(key, versionTag) {
292
+ this._loadingRequirements$.next(true);
293
+ this._requirementsSubscription?.unsubscribe();
294
+ this._requirementsSubscription = this.processLinkBuildingBlockApiService
295
+ .getPluginDefinitionsForBuildingBlock(key, versionTag)
296
+ .subscribe({
297
+ next: res => {
298
+ const plugins = res?.plugins ?? [];
299
+ const pluginKeys = plugins.map(plugin => plugin.pluginDefinitionKey).filter(Boolean);
300
+ const dependencies = Array.from(new Set(plugins.flatMap(p => p.dependencies ?? []).map(d => d.key)));
301
+ this.applyPluginKeys(pluginKeys ?? []);
302
+ this._pluginDependencies$.next(dependencies);
303
+ this._loadingRequirements$.next(false);
304
+ },
305
+ error: () => {
306
+ this.applyPluginKeys([]);
307
+ this._pluginDependencies$.next([]);
308
+ this._loadingRequirements$.next(false);
309
+ },
310
+ });
311
+ }
312
+ applyPluginKeys(pluginKeys) {
313
+ const currentMappings = this._pluginMappings$.getValue();
314
+ const normalized = {};
315
+ pluginKeys.forEach(key => {
316
+ normalized[key] = currentMappings[key] ?? null;
317
+ });
318
+ this._requiredPluginKeys$.next(pluginKeys);
319
+ this._pluginMappings$.next(normalized);
320
+ }
321
+ loadFields(key, versionTag) {
322
+ this._loadingFields$.next(true);
323
+ this._fieldsSubscription?.unsubscribe();
324
+ this._fieldsSubscription = this.processLinkBuildingBlockApiService
325
+ .getFieldsForBuildingBlock(key, versionTag)
326
+ .subscribe({
327
+ next: fields => {
328
+ this._buildingBlockFields$.next(fields ?? []);
329
+ this._loadingFields$.next(false);
330
+ },
331
+ error: () => {
332
+ this._buildingBlockFields$.next([]);
333
+ this._loadingFields$.next(false);
334
+ },
335
+ });
336
+ }
337
+ clearPluginRequirements(options = {}) {
338
+ this._requirementsSubscription?.unsubscribe();
339
+ this._requiredPluginKeys$.next([]);
340
+ if (!options.preserveMappings) {
341
+ this._pluginMappings$.next({});
342
+ }
343
+ this._loadingRequirements$.next(false);
344
+ }
345
+ clearFields() {
346
+ this._fieldsSubscription?.unsubscribe();
347
+ this._buildingBlockFields$.next([]);
348
+ this._loadingFields$.next(false);
349
+ }
350
+ clearMappings(options = {}) {
351
+ if (options.preserveMappings) {
352
+ return;
353
+ }
354
+ this._inputMappings$.next([]);
355
+ this._outputMappings$.next([]);
356
+ }
357
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: BuildingBlockStateService, deps: [{ token: ProcessLinkBuildingBlockApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
358
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: BuildingBlockStateService, providedIn: 'root' }); }
359
+ }
360
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: BuildingBlockStateService, decorators: [{
361
+ type: Injectable,
362
+ args: [{
363
+ providedIn: 'root',
364
+ }]
365
+ }], ctorParameters: () => [{ type: ProcessLinkBuildingBlockApiService }] });
366
+
31
367
  /*
32
368
  * Copyright 2015-2025 Ritense BV, the Netherlands.
33
369
  *
@@ -70,15 +406,15 @@ class FormFlowService extends BaseApiService {
70
406
  navigateToStep(instanceId, currentStepInstanceId, targetStepInstanceId, submissionData) {
71
407
  return this.httpClient.post(this.getApiUrl(`v1/form-flow/instance/${instanceId}/step/instance/${currentStepInstanceId}/to/step/instance/${targetStepInstanceId}`), submissionData);
72
408
  }
73
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormFlowService, deps: [{ token: i1.HttpClient }, { token: i2.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
74
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormFlowService, providedIn: 'root' }); }
409
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormFlowService, deps: [{ token: i2.HttpClient }, { token: i1.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
410
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormFlowService, providedIn: 'root' }); }
75
411
  }
76
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormFlowService, decorators: [{
412
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormFlowService, decorators: [{
77
413
  type: Injectable,
78
414
  args: [{
79
415
  providedIn: 'root',
80
416
  }]
81
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.ConfigService }] });
417
+ }], ctorParameters: () => [{ type: i2.HttpClient }, { type: i1.ConfigService }] });
82
418
 
83
419
  /*
84
420
  * Copyright 2015-2025 Ritense BV, the Netherlands.
@@ -118,17 +454,22 @@ class PluginStateService {
118
454
  return this._save$.asObservable();
119
455
  }
120
456
  get functionKey$() {
121
- return this._selectedProcessLink$.pipe(switchMap(processLink => !processLink
122
- ? this._selectedPluginFunction$.pipe(map(pluginFunction => pluginFunction?.key))
123
- : of(processLink?.pluginActionDefinitionKey)));
457
+ // Prioritize user-selected function, fall back to process link's saved action
458
+ return this._selectedPluginFunction$.pipe(map$1(pluginFunction => pluginFunction?.key));
124
459
  }
125
460
  get pluginDefinitionKey$() {
126
461
  return this._selectedProcessLink$.pipe(switchMap(selectedProcesLink => !selectedProcesLink
127
- ? this._selectedPluginConfiguration$.pipe(map(configuration => configuration?.pluginDefinition.key))
462
+ ? combineLatest([
463
+ this._selectedPluginConfiguration$,
464
+ this._selectedPluginDefinition$,
465
+ ]).pipe(map$1(([configuration, definition]) => configuration?.pluginDefinition.key || definition?.key))
128
466
  : combineLatest([
129
467
  this._selectedProcessLink$,
130
468
  this.pluginService.pluginSpecifications$,
131
- ]).pipe(map(([processLink, pluginSpecifications]) => {
469
+ ]).pipe(map$1(([processLink, pluginSpecifications]) => {
470
+ if (processLink?.pluginDefinitionKey) {
471
+ return processLink.pluginDefinitionKey;
472
+ }
132
473
  const pluginSpecification = pluginSpecifications.find(specification => {
133
474
  const functionKeys = specification?.functionConfigurationComponents &&
134
475
  Object.keys(specification.functionConfigurationComponents);
@@ -148,6 +489,60 @@ class PluginStateService {
148
489
  }
149
490
  selectProcessLink(processLink) {
150
491
  this._selectedProcessLink$.next(processLink);
492
+ // When editing a plugin process link, populate the plugin definition
493
+ if (processLink?.processLinkType === 'plugin') {
494
+ this.loadPluginDefinitionForProcessLink(processLink);
495
+ }
496
+ }
497
+ loadPluginDefinitionForProcessLink(processLink) {
498
+ // Get the plugin definition key - either directly or from plugin specifications
499
+ this.getPluginDefinitionKeyForProcessLink(processLink)
500
+ .pipe(take(1))
501
+ .subscribe(pluginDefinitionKey => {
502
+ if (pluginDefinitionKey) {
503
+ // Fetch all plugin definitions and find the one matching the key
504
+ this.pluginManagementService
505
+ .getPluginDefinitions()
506
+ .pipe(take(1), map$1(definitions => definitions.find(d => d.key === pluginDefinitionKey)))
507
+ .subscribe(definition => {
508
+ if (definition) {
509
+ this._selectedPluginDefinition$.next(definition);
510
+ // Also set the selected function if available
511
+ if (processLink.pluginActionDefinitionKey) {
512
+ this._selectedPluginFunction$.next({
513
+ key: processLink.pluginActionDefinitionKey,
514
+ });
515
+ }
516
+ }
517
+ });
518
+ }
519
+ });
520
+ // Load and set the plugin configuration if available
521
+ if (processLink.pluginConfigurationId) {
522
+ this.pluginManagementService
523
+ .getAllPluginConfigurations()
524
+ .pipe(take(1), map$1(configs => configs.find(c => c.id === processLink.pluginConfigurationId)))
525
+ .subscribe(configuration => {
526
+ if (configuration) {
527
+ this._selectedPluginConfiguration$.next(configuration);
528
+ }
529
+ });
530
+ }
531
+ }
532
+ getPluginDefinitionKeyForProcessLink(processLink) {
533
+ // If the key is directly available, use it
534
+ if (processLink.pluginDefinitionKey) {
535
+ return of(processLink.pluginDefinitionKey);
536
+ }
537
+ // Otherwise, derive it from plugin specifications using the action key
538
+ return this.pluginService.pluginSpecifications$.pipe(map$1(pluginSpecifications => {
539
+ const pluginSpecification = pluginSpecifications.find(specification => {
540
+ const functionKeys = specification?.functionConfigurationComponents &&
541
+ Object.keys(specification.functionConfigurationComponents);
542
+ return functionKeys?.includes(processLink.pluginActionDefinitionKey);
543
+ });
544
+ return pluginSpecification?.pluginId;
545
+ }));
151
546
  }
152
547
  deselectProcessLink() {
153
548
  this._selectedProcessLink$.next(undefined);
@@ -155,10 +550,10 @@ class PluginStateService {
155
550
  save() {
156
551
  this._save$.next(null);
157
552
  }
158
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: PluginStateService, deps: [{ token: i1$1.PluginManagementService }, { token: i1$1.PluginService }], target: i0.ɵɵFactoryTarget.Injectable }); }
159
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: PluginStateService, providedIn: 'root' }); }
553
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: PluginStateService, deps: [{ token: i1$1.PluginManagementService }, { token: i1$1.PluginService }], target: i0.ɵɵFactoryTarget.Injectable }); }
554
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: PluginStateService, providedIn: 'root' }); }
160
555
  }
161
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: PluginStateService, decorators: [{
556
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: PluginStateService, decorators: [{
162
557
  type: Injectable,
163
558
  args: [{
164
559
  providedIn: 'root',
@@ -189,7 +584,7 @@ class ProcessLinkService {
189
584
  getTasksWithProcessLinks(processInstanceId) {
190
585
  return this.http
191
586
  .get(`${this.VALTIMO_ENDPOINT_URI}v1/process/${processInstanceId}/tasks/process-link`, {})
192
- .pipe(map$1(res => res || []));
587
+ .pipe(map(res => res || []));
193
588
  }
194
589
  getProcessLink(getProcessLinkRequest) {
195
590
  var params = new HttpParams().set('processDefinitionId', getProcessLinkRequest.processDefinitionId);
@@ -199,15 +594,6 @@ class ProcessLinkService {
199
594
  params,
200
595
  });
201
596
  }
202
- updateProcessLink(updateProcessLinkRequest) {
203
- return this.http.put(`${this.VALTIMO_ENDPOINT_URI}v1/process-link`, this.emptyStringToNull(updateProcessLinkRequest));
204
- }
205
- saveProcessLink(saveProcessLinkRequest) {
206
- return this.http.post(`${this.VALTIMO_ENDPOINT_URI}v1/process-link`, this.emptyStringToNull(saveProcessLinkRequest));
207
- }
208
- deleteProcessLink(id) {
209
- return this.http.delete(`${this.VALTIMO_ENDPOINT_URI}v1/process-link/${id}`);
210
- }
211
597
  getProcessLinkCandidates(activityType) {
212
598
  return this.http.get(`${this.VALTIMO_ENDPOINT_URI}v1/process-link/types?activityType=${activityType}`);
213
599
  }
@@ -233,6 +619,21 @@ class ProcessLinkService {
233
619
  formData.append('startableByUser', String(startableByUser));
234
620
  return this.http.post(`${this.VALTIMO_ENDPOINT_URI}management/v1/case-definition/${caseDefinitionKey}/version/${caseDefinitionVersionTag}/process-definition`, formData);
235
621
  }
622
+ deployProcessWithProcessLinksForBuildingBlock(processLinks = [], processDefinitionId, processXml, buildingBlockKey, buildingBlockVersionTag, replace = false) {
623
+ const formData = new FormData();
624
+ const processLinksBlob = new Blob([JSON.stringify(processLinks.map(processLink => this.emptyStringToNull(processLink)))], { type: 'application/json' });
625
+ if (processXml) {
626
+ formData.append('file', new File([processXml], `${buildingBlockKey}-${buildingBlockVersionTag}.bpmn`));
627
+ }
628
+ if (processDefinitionId) {
629
+ formData.append('processDefinitionId', processDefinitionId);
630
+ }
631
+ formData.append('processLinks', processLinksBlob);
632
+ return this.http.post(`${this.VALTIMO_ENDPOINT_URI}management/v1/building-block/${buildingBlockKey}/version/${buildingBlockVersionTag}/process-definition/${processDefinitionId}`, formData, {
633
+ headers: new HttpHeaders().set(InterceptorSkip, '409'),
634
+ params: replace ? new HttpParams().set('replace', 'true') : undefined,
635
+ });
636
+ }
236
637
  submitForm(processLinkId, formData, documentId, taskInstanceId, documentDefinitionName) {
237
638
  let params = new HttpParams();
238
639
  if (documentId) {
@@ -288,85 +689,15 @@ class ProcessLinkService {
288
689
  }
289
690
  return object;
290
691
  }
291
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkService, deps: [{ token: i2.ConfigService }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
292
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkService, providedIn: 'root' }); }
692
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkService, deps: [{ token: i1.ConfigService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
693
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkService, providedIn: 'root' }); }
293
694
  }
294
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkService, decorators: [{
695
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkService, decorators: [{
295
696
  type: Injectable,
296
697
  args: [{
297
698
  providedIn: 'root',
298
699
  }]
299
- }], ctorParameters: () => [{ type: i2.ConfigService }, { type: i1.HttpClient }] });
300
-
301
- /*
302
- * Copyright 2015-2025 Ritense BV, the Netherlands.
303
- *
304
- * Licensed under EUPL, Version 1.2 (the "License");
305
- * you may not use this file except in compliance with the License.
306
- * You may obtain a copy of the License at
307
- *
308
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
309
- *
310
- * Unless required by applicable law or agreed to in writing, software
311
- * distributed under the License is distributed on an "AS IS" basis,
312
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
313
- * See the License for the specific language governing permissions and
314
- * limitations under the License.
315
- */
316
-
317
- var ProcessLinkEditMode;
318
- (function (ProcessLinkEditMode) {
319
- ProcessLinkEditMode[ProcessLinkEditMode["SAVE_TO_BACKEND"] = 0] = "SAVE_TO_BACKEND";
320
- ProcessLinkEditMode[ProcessLinkEditMode["EMIT_EVENTS"] = 1] = "EMIT_EVENTS";
321
- })(ProcessLinkEditMode || (ProcessLinkEditMode = {}));
322
-
323
- /*
324
- * Copyright 2015-2025 Ritense BV, the Netherlands.
325
- *
326
- * Licensed under EUPL, Version 1.2 (the "License");
327
- * you may not use this file except in compliance with the License.
328
- * You may obtain a copy of the License at
329
- *
330
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
331
- *
332
- * Unless required by applicable law or agreed to in writing, software
333
- * distributed under the License is distributed on an "AS IS" basis,
334
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
335
- * See the License for the specific language governing permissions and
336
- * limitations under the License.
337
- */
338
-
339
- /*
340
- * Copyright 2015-2025 Ritense BV, the Netherlands.
341
- *
342
- * Licensed under EUPL, Version 1.2 (the "License");
343
- * you may not use this file except in compliance with the License.
344
- * You may obtain a copy of the License at
345
- *
346
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
347
- *
348
- * Unless required by applicable law or agreed to in writing, software
349
- * distributed under the License is distributed on an "AS IS" basis,
350
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
351
- * See the License for the specific language governing permissions and
352
- * limitations under the License.
353
- */
354
-
355
- /*
356
- * Copyright 2015-2025 Ritense BV, the Netherlands.
357
- *
358
- * Licensed under EUPL, Version 1.2 (the "License");
359
- * you may not use this file except in compliance with the License.
360
- * You may obtain a copy of the License at
361
- *
362
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
363
- *
364
- * Unless required by applicable law or agreed to in writing, software
365
- * distributed under the License is distributed on an "AS IS" basis,
366
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
367
- * See the License for the specific language governing permissions and
368
- * limitations under the License.
369
- */
700
+ }], ctorParameters: () => [{ type: i1.ConfigService }, { type: i2.HttpClient }] });
370
701
 
371
702
  /*
372
703
  * Copyright 2015-2025 Ritense BV, the Netherlands.
@@ -407,6 +738,7 @@ const formSizeToCarbonModalSizeMap = {
407
738
  medium: 'md',
408
739
  large: 'lg',
409
740
  };
741
+ const UNSUPPORTED_PROCESS_LINK_TYPES_IN_BUILDING_BLOCK = ['form', 'form-flow', 'ui-component'];
410
742
 
411
743
  /*
412
744
  * Copyright 2015-2025 Ritense BV, the Netherlands.
@@ -520,10 +852,10 @@ class ProcessLinkButtonService {
520
852
  this.hideNextButton();
521
853
  this.disableNextButton();
522
854
  }
523
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkButtonService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
524
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkButtonService, providedIn: 'root' }); }
855
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkButtonService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
856
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkButtonService, providedIn: 'root' }); }
525
857
  }
526
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkButtonService, decorators: [{
858
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkButtonService, decorators: [{
527
859
  type: Injectable,
528
860
  args: [{
529
861
  providedIn: 'root',
@@ -551,7 +883,7 @@ class ProcessLinkStepService {
551
883
  this._steps$,
552
884
  this._disableSteps$,
553
885
  this.translateService.stream('key'),
554
- ]).pipe(filter(([steps]) => !!steps), map$1(([steps, disableSteps]) => steps.map(step => ({
886
+ ]).pipe(filter(([steps]) => !!steps), map(([steps, disableSteps]) => steps.map(step => ({
555
887
  ...step,
556
888
  disabled: disableSteps,
557
889
  label: this.translateService.instant(`processLinkSteps.${step.label}`),
@@ -564,7 +896,7 @@ class ProcessLinkStepService {
564
896
  return this._currentStepIndex$.asObservable();
565
897
  }
566
898
  get currentStepId$() {
567
- return combineLatest([this._steps$, this.currentStepIndex$]).pipe(filter(([steps, currentStepIndex]) => !!steps && typeof currentStepIndex === 'number'), map$1(([steps, currentStepIndex]) => steps.length > 0 ? steps[currentStepIndex]?.label : ''));
899
+ return combineLatest([this._steps$, this.currentStepIndex$]).pipe(filter(([steps, currentStepIndex]) => !!steps && typeof currentStepIndex === 'number'), map(([steps, currentStepIndex]) => steps.length > 0 ? steps[currentStepIndex]?.label : ''));
568
900
  }
569
901
  get hasOneProcessLinkType$() {
570
902
  return this._hasOneProcessLinkType$.asObservable();
@@ -578,6 +910,7 @@ class ProcessLinkStepService {
578
910
  this._currentStepIndex$ = new BehaviorSubject(0);
579
911
  this._disableSteps$ = new BehaviorSubject(false);
580
912
  this._hasOneProcessLinkType$ = new BehaviorSubject(false);
913
+ this._context = 'independent';
581
914
  }
582
915
  reset() {
583
916
  this._currentStepIndex$.next(0);
@@ -618,17 +951,19 @@ class ProcessLinkStepService {
618
951
  this._currentStepIndex$.next(0);
619
952
  }
620
953
  setChoosePluginConfigurationSteps() {
954
+ const selectionLabel = this._context === 'buildingBlock' ? 'choosePluginDefinition' : 'choosePluginConfiguration';
621
955
  this._steps$.next([
622
956
  { label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.plugin' },
623
- { label: 'choosePluginConfiguration' },
957
+ { label: selectionLabel },
624
958
  { label: 'choosePluginAction', disabled: true },
625
959
  { label: 'configurePluginAction', disabled: true },
626
960
  ]);
627
961
  this._currentStepIndex$.next(1);
628
962
  }
629
963
  setSingleChoosePluginConfigurationSteps() {
964
+ const selectionLabel = this._context === 'buildingBlock' ? 'choosePluginDefinition' : 'choosePluginConfiguration';
630
965
  this._steps$.next([
631
- { label: 'choosePluginConfiguration' },
966
+ { label: selectionLabel },
632
967
  { label: 'choosePluginAction', disabled: true },
633
968
  { label: 'configurePluginAction', disabled: true },
634
969
  ]);
@@ -638,12 +973,17 @@ class ProcessLinkStepService {
638
973
  combineLatest([
639
974
  this._hasOneProcessLinkType$,
640
975
  this.pluginStateService.selectedPluginConfiguration$,
976
+ this.pluginStateService.selectedPluginDefinition$,
641
977
  ])
642
978
  .pipe(take(1))
643
- .subscribe(([hasOneType, selectedConfiguration]) => {
979
+ .subscribe(([hasOneType, selectedConfiguration, selectedDefinition]) => {
980
+ const selectionLabel = this._context === 'buildingBlock'
981
+ ? 'choosePluginDefinition'
982
+ : 'choosePluginConfiguration';
983
+ const selectedPluginLabel = this.getSelectedPluginLabel(selectedConfiguration, selectedDefinition);
644
984
  if (hasOneType) {
645
985
  this._steps$.next([
646
- { label: 'choosePluginConfiguration', secondaryLabel: selectedConfiguration.title },
986
+ { label: selectionLabel, secondaryLabel: selectedPluginLabel },
647
987
  { label: 'choosePluginAction' },
648
988
  { label: 'configurePluginAction', disabled: true },
649
989
  ]);
@@ -656,7 +996,7 @@ class ProcessLinkStepService {
656
996
  else {
657
997
  this._steps$.next([
658
998
  { label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.plugin' },
659
- { label: 'choosePluginConfiguration', secondaryLabel: selectedConfiguration.title },
999
+ { label: selectionLabel, secondaryLabel: selectedPluginLabel },
660
1000
  { label: 'choosePluginAction' },
661
1001
  { label: 'configurePluginAction', disabled: true },
662
1002
  ]);
@@ -673,13 +1013,21 @@ class ProcessLinkStepService {
673
1013
  this._hasOneProcessLinkType$,
674
1014
  this.pluginStateService.selectedPluginConfiguration$,
675
1015
  this.pluginStateService.selectedPluginFunction$,
1016
+ this.pluginStateService.selectedPluginDefinition$,
676
1017
  ])
677
1018
  .pipe(take(1))
678
- .subscribe(([hasOneType, selectedConfiguration, selectedFunction]) => {
679
- const selectedFunctionTranslation = this.pluginTranslateService.instant(selectedFunction.key, selectedConfiguration.pluginDefinition.key);
1019
+ .subscribe(([hasOneType, selectedConfiguration, selectedFunction, selectedDefinition]) => {
1020
+ const pluginKey = selectedDefinition?.key || selectedConfiguration?.pluginDefinition?.key || '';
1021
+ const selectedFunctionTranslation = pluginKey
1022
+ ? this.pluginTranslateService.instant(selectedFunction.key, pluginKey)
1023
+ : selectedFunction.key;
1024
+ const selectionLabel = this._context === 'buildingBlock'
1025
+ ? 'choosePluginDefinition'
1026
+ : 'choosePluginConfiguration';
1027
+ const selectedPluginLabel = this.getSelectedPluginLabel(selectedConfiguration, selectedDefinition);
680
1028
  if (hasOneType) {
681
1029
  this._steps$.next([
682
- { label: 'choosePluginConfiguration', secondaryLabel: selectedConfiguration.title },
1030
+ { label: selectionLabel, secondaryLabel: selectedPluginLabel },
683
1031
  { label: 'choosePluginAction', secondaryLabel: selectedFunctionTranslation },
684
1032
  { label: 'configurePluginAction' },
685
1033
  ]);
@@ -690,7 +1038,7 @@ class ProcessLinkStepService {
690
1038
  else {
691
1039
  this._steps$.next([
692
1040
  { label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.plugin' },
693
- { label: 'choosePluginConfiguration', secondaryLabel: selectedConfiguration.title },
1041
+ { label: selectionLabel, secondaryLabel: selectedPluginLabel },
694
1042
  { label: 'choosePluginAction', secondaryLabel: selectedFunctionTranslation },
695
1043
  { label: 'configurePluginAction' },
696
1044
  ]);
@@ -700,6 +1048,72 @@ class ProcessLinkStepService {
700
1048
  }
701
1049
  });
702
1050
  }
1051
+ setBuildingBlockSteps() {
1052
+ this._hasOneProcessLinkType$.pipe(take(1)).subscribe(hasOneType => {
1053
+ this._steps$.next([
1054
+ { label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.building-block' },
1055
+ { label: 'selectBuildingBlock' },
1056
+ { label: 'configureBuildingBlockPlugins', disabled: true },
1057
+ { label: 'configureBuildingBlockMappings', disabled: true },
1058
+ ]);
1059
+ this._currentStepIndex$.next(hasOneType ? 0 : 1);
1060
+ this.buttonService.showBackButton();
1061
+ this.buttonService.showNextButton();
1062
+ this.buttonService.hideSaveButton();
1063
+ this.buttonService.disableNextButton();
1064
+ });
1065
+ }
1066
+ setConfigureBuildingBlockPluginsStep(selectionLabel) {
1067
+ this._hasOneProcessLinkType$.pipe(take(1)).subscribe(hasOneType => {
1068
+ const steps = hasOneType
1069
+ ? [
1070
+ { label: 'selectBuildingBlock', secondaryLabel: selectionLabel },
1071
+ { label: 'configureBuildingBlockPlugins' },
1072
+ { label: 'configureBuildingBlockMappings', disabled: true },
1073
+ ]
1074
+ : [
1075
+ { label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.building-block' },
1076
+ { label: 'selectBuildingBlock', secondaryLabel: selectionLabel },
1077
+ { label: 'configureBuildingBlockPlugins' },
1078
+ { label: 'configureBuildingBlockMappings', disabled: true },
1079
+ ];
1080
+ this._steps$.next(steps);
1081
+ this._currentStepIndex$.next(hasOneType ? 1 : 2);
1082
+ this.buttonService.showNextButton();
1083
+ this.buttonService.hideSaveButton();
1084
+ this.buttonService.disableNextButton();
1085
+ this.buttonService.showBackButton();
1086
+ });
1087
+ }
1088
+ setConfigureBuildingBlockMappingsStep(selectionLabel) {
1089
+ this._hasOneProcessLinkType$.pipe(take(1)).subscribe(hasOneType => {
1090
+ const steps = hasOneType
1091
+ ? [
1092
+ { label: 'selectBuildingBlock', secondaryLabel: selectionLabel },
1093
+ { label: 'configureBuildingBlockPlugins' },
1094
+ { label: 'configureBuildingBlockMappings' },
1095
+ ]
1096
+ : [
1097
+ { label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.building-block' },
1098
+ { label: 'selectBuildingBlock', secondaryLabel: selectionLabel },
1099
+ { label: 'configureBuildingBlockPlugins' },
1100
+ { label: 'configureBuildingBlockMappings' },
1101
+ ];
1102
+ this._steps$.next(steps);
1103
+ this._currentStepIndex$.next(hasOneType ? 2 : 3);
1104
+ this.buttonService.hideNextButton();
1105
+ this.buttonService.showSaveButton();
1106
+ this.buttonService.disableSaveButton();
1107
+ this.buttonService.showBackButton();
1108
+ });
1109
+ }
1110
+ updateBuildingBlockSelectionStepLabel(label) {
1111
+ const steps = this._steps$.getValue();
1112
+ if (!steps?.length)
1113
+ return;
1114
+ const updatedSteps = steps.map(step => step.label === 'selectBuildingBlock' ? { ...step, secondaryLabel: label } : step);
1115
+ this._steps$.next(updatedSteps);
1116
+ }
703
1117
  setURLSteps() {
704
1118
  this._steps$.next([
705
1119
  { label: 'chooseProcessLinkType', secondaryLabel: 'processLinkType.url' },
@@ -757,6 +1171,9 @@ class ProcessLinkStepService {
757
1171
  this.buttonService.showNextButton();
758
1172
  }
759
1173
  break;
1174
+ case 'building-block':
1175
+ this.setBuildingBlockSteps();
1176
+ break;
760
1177
  case 'url':
761
1178
  if (hasOneOption) {
762
1179
  this.setSingleURLStep();
@@ -784,15 +1201,133 @@ class ProcessLinkStepService {
784
1201
  ]);
785
1202
  this._currentStepIndex$.next(0);
786
1203
  }
787
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkStepService, deps: [{ token: i2$1.TranslateService }, { token: ProcessLinkButtonService }, { token: PluginStateService }, { token: i1$1.PluginTranslationService }], target: i0.ɵɵFactoryTarget.Injectable }); }
788
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkStepService, providedIn: 'root' }); }
1204
+ getSelectedPluginLabel(selectedConfiguration, selectedDefinition) {
1205
+ if (this._context === 'buildingBlock') {
1206
+ const definitionKey = selectedDefinition?.key || selectedConfiguration?.pluginDefinition?.key;
1207
+ return definitionKey ? this.pluginTranslateService.instant('title', definitionKey) : '';
1208
+ }
1209
+ return selectedConfiguration?.title || '';
1210
+ }
1211
+ setContext(context) {
1212
+ this._context = context;
1213
+ }
1214
+ /**
1215
+ * Initialize steps for editing an existing process link.
1216
+ * Sets up configuration steps only (skipping type selection since type can't be changed).
1217
+ * Navigates to the final step.
1218
+ */
1219
+ initializeEditModeSteps(processLinkType) {
1220
+ switch (processLinkType) {
1221
+ case 'form':
1222
+ // Single step for form - just the form selection
1223
+ this._steps$.next([{ label: 'selectForm' }]);
1224
+ this._currentStepIndex$.next(0);
1225
+ break;
1226
+ case 'form-flow':
1227
+ // Single step for form-flow - just the form flow selection
1228
+ this._steps$.next([{ label: 'selectFormFlow' }]);
1229
+ this._currentStepIndex$.next(0);
1230
+ break;
1231
+ case 'plugin':
1232
+ const selectionLabel = this._context === 'buildingBlock' ? 'choosePluginDefinition' : 'choosePluginConfiguration';
1233
+ // Plugin has 3 config steps: select config, select action, configure action
1234
+ this._steps$.next([
1235
+ { label: selectionLabel },
1236
+ { label: 'choosePluginAction' },
1237
+ { label: 'configurePluginAction' },
1238
+ ]);
1239
+ this._currentStepIndex$.next(2); // Start at last step
1240
+ break;
1241
+ case 'building-block':
1242
+ // Building block has 3 config steps: select BB, configure plugins, configure mappings
1243
+ this._steps$.next([
1244
+ { label: 'selectBuildingBlock' },
1245
+ { label: 'configureBuildingBlockPlugins' },
1246
+ { label: 'configureBuildingBlockMappings' },
1247
+ ]);
1248
+ this._currentStepIndex$.next(2); // Start at last step
1249
+ break;
1250
+ case 'ui-component':
1251
+ // Single step for UI component
1252
+ this._steps$.next([{ label: 'uiComponent' }]);
1253
+ this._currentStepIndex$.next(0);
1254
+ break;
1255
+ case 'url':
1256
+ // Single step for URL
1257
+ this._steps$.next([{ label: 'selectURL' }]);
1258
+ this._currentStepIndex$.next(0);
1259
+ break;
1260
+ }
1261
+ }
1262
+ /**
1263
+ * Navigate to a specific step by index (for edit mode navigation)
1264
+ */
1265
+ goToStep(stepIndex) {
1266
+ const steps = this._steps$.getValue();
1267
+ if (steps && stepIndex >= 0 && stepIndex < steps.length) {
1268
+ this._currentStepIndex$.next(stepIndex);
1269
+ }
1270
+ }
1271
+ /**
1272
+ * Navigate to the previous step (for edit mode navigation)
1273
+ * Returns true if navigation was successful, false if already at first step
1274
+ */
1275
+ goToPreviousStep() {
1276
+ const currentIndex = this._currentStepIndex$.getValue();
1277
+ if (currentIndex > 0) {
1278
+ this._currentStepIndex$.next(currentIndex - 1);
1279
+ return true;
1280
+ }
1281
+ return false;
1282
+ }
1283
+ /**
1284
+ * Navigate to the next step (for edit mode navigation)
1285
+ * Returns true if navigation was successful, false if already at last step
1286
+ */
1287
+ goToNextStep() {
1288
+ const steps = this._steps$.getValue();
1289
+ const currentIndex = this._currentStepIndex$.getValue();
1290
+ if (steps && currentIndex < steps.length - 1) {
1291
+ this._currentStepIndex$.next(currentIndex + 1);
1292
+ return true;
1293
+ }
1294
+ return false;
1295
+ }
1296
+ /**
1297
+ * Check if currently at the first step
1298
+ */
1299
+ isFirstStep() {
1300
+ return this._currentStepIndex$.getValue() === 0;
1301
+ }
1302
+ /**
1303
+ * Check if currently at the last step
1304
+ */
1305
+ isLastStep() {
1306
+ const steps = this._steps$.getValue();
1307
+ const currentIndex = this._currentStepIndex$.getValue();
1308
+ return steps ? currentIndex === steps.length - 1 : false;
1309
+ }
1310
+ /**
1311
+ * Get the total number of steps
1312
+ */
1313
+ getStepCount() {
1314
+ return this._steps$.getValue()?.length || 0;
1315
+ }
1316
+ /**
1317
+ * Get the current step index
1318
+ */
1319
+ getCurrentStepIndex() {
1320
+ return this._currentStepIndex$.getValue();
1321
+ }
1322
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkStepService, deps: [{ token: i3.TranslateService }, { token: ProcessLinkButtonService }, { token: PluginStateService }, { token: i1$1.PluginTranslationService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1323
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkStepService, providedIn: 'root' }); }
789
1324
  }
790
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkStepService, decorators: [{
1325
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkStepService, decorators: [{
791
1326
  type: Injectable,
792
1327
  args: [{
793
1328
  providedIn: 'root',
794
1329
  }]
795
- }], ctorParameters: () => [{ type: i2$1.TranslateService }, { type: ProcessLinkButtonService }, { type: PluginStateService }, { type: i1$1.PluginTranslationService }] });
1330
+ }], ctorParameters: () => [{ type: i3.TranslateService }, { type: ProcessLinkButtonService }, { type: PluginStateService }, { type: i1$1.PluginTranslationService }] });
796
1331
 
797
1332
  /*
798
1333
  * Copyright 2015-2025 Ritense BV, the Netherlands.
@@ -826,17 +1361,22 @@ class ProcessLinkStateService {
826
1361
  return this._elementName$.asObservable();
827
1362
  }
828
1363
  get availableProcessLinkTypes$() {
829
- return this._availableProcessLinkTypes$.pipe(map$1(types => (!this.formCustomComponentConfig
1364
+ return combineLatest([this._availableProcessLinkTypes$, this._context$]).pipe(map(([types, context]) => (!this.formCustomComponentConfig
830
1365
  ? types.map(type => ({
831
1366
  ...type,
832
1367
  enabled: type.processLinkType === 'ui-component' ? false : type.enabled,
833
1368
  }))
834
- : types).filter(type => type.processLinkType !== 'url')));
1369
+ : types)
1370
+ .filter(type => type.processLinkType !== 'url')
1371
+ .map(type => context === 'buildingBlock' &&
1372
+ UNSUPPORTED_PROCESS_LINK_TYPES_IN_BUILDING_BLOCK.includes(type.processLinkType)
1373
+ ? { ...type, enabled: false }
1374
+ : type)));
835
1375
  }
836
1376
  get hideProgressIndicator$() {
837
1377
  return this._availableProcessLinkTypes$
838
1378
  .asObservable()
839
- .pipe(map$1(availableTypes => Array.isArray(availableTypes) &&
1379
+ .pipe(map(availableTypes => Array.isArray(availableTypes) &&
840
1380
  availableTypes.length === 1 &&
841
1381
  (availableTypes[0]?.processLinkType === 'form' ||
842
1382
  availableTypes[0]?.processLinkType === 'form-flow')));
@@ -854,10 +1394,7 @@ class ProcessLinkStateService {
854
1394
  return this._selectedProcessLink$.asObservable();
855
1395
  }
856
1396
  get typeOfSelectedProcessLink$() {
857
- return this.selectedProcessLink$.pipe(map$1(processLink => processLink?.processLinkType || ''));
858
- }
859
- get processLinkEditMode() {
860
- return this._processLinkEditMode$.getValue();
1397
+ return this.selectedProcessLink$.pipe(map(processLink => processLink?.processLinkType || ''));
861
1398
  }
862
1399
  get viewModelEnabled$() {
863
1400
  return this._viewModelEnabled$.asObservable();
@@ -865,10 +1402,17 @@ class ProcessLinkStateService {
865
1402
  get url$() {
866
1403
  return this._url$.asObservable();
867
1404
  }
868
- constructor(processLinkStepService, buttonService, pluginStateService, formCustomComponentConfig) {
1405
+ get context$() {
1406
+ return this._context$.asObservable();
1407
+ }
1408
+ get isEditing$() {
1409
+ return this._isEditing$.asObservable();
1410
+ }
1411
+ constructor(processLinkStepService, buttonService, pluginStateService, buildingBlockStateService, formCustomComponentConfig) {
869
1412
  this.processLinkStepService = processLinkStepService;
870
1413
  this.buttonService = buttonService;
871
1414
  this.pluginStateService = pluginStateService;
1415
+ this.buildingBlockStateService = buildingBlockStateService;
872
1416
  this.formCustomComponentConfig = formCustomComponentConfig;
873
1417
  this._showModal$ = new BehaviorSubject(false);
874
1418
  this._availableProcessLinkTypes$ = new BehaviorSubject([]);
@@ -879,14 +1423,18 @@ class ProcessLinkStateService {
879
1423
  this._saving$ = new BehaviorSubject(false);
880
1424
  this._modalParams$ = new BehaviorSubject(undefined);
881
1425
  this._selectedProcessLink$ = new BehaviorSubject(undefined);
882
- this._processLinkEditMode$ = new BehaviorSubject(ProcessLinkEditMode.SAVE_TO_BACKEND);
1426
+ this._isEditing$ = new BehaviorSubject(false);
883
1427
  this._processLinkUpdateEvents$ = new Subject();
884
1428
  this._processLinkCreateEvents$ = new Subject();
885
1429
  this._processLinkDeleteEvents$ = new Subject();
1430
+ this._context$ = new BehaviorSubject('independent');
886
1431
  this.openAvailableProcessLinkTypesSubscription();
1432
+ this.openEditModeNavigationSubscriptions();
887
1433
  }
888
1434
  ngOnDestroy() {
889
1435
  this._availableProcessLinkTypesSubscription?.unsubscribe();
1436
+ this._backButtonSubscription?.unsubscribe();
1437
+ this._nextButtonSubscription?.unsubscribe();
890
1438
  }
891
1439
  setAvailableProcessLinkTypes(processLinkTypes) {
892
1440
  const hasOneOption = processLinkTypes.length === 1;
@@ -934,20 +1482,28 @@ class ProcessLinkStateService {
934
1482
  setModalParams(params) {
935
1483
  this._modalParams$.next(params);
936
1484
  }
1485
+ setContext(context) {
1486
+ this._context$.next(context);
1487
+ this.processLinkStepService.setContext(context);
1488
+ }
937
1489
  selectProcessLink(processLink) {
938
1490
  if (!processLink)
939
1491
  return;
940
1492
  this._selectedProcessLink$.next(processLink);
1493
+ this._isEditing$.next(true);
941
1494
  this.pluginStateService.selectProcessLink(processLink);
1495
+ this.buildingBlockStateService.setProcessLink(processLink);
942
1496
  this.setViewModelEnabled(processLink.viewModelEnabled ?? false);
943
1497
  this._url$.next(processLink.url ?? '');
1498
+ // Initialize stepper for editing mode - navigate to last step
1499
+ this.processLinkStepService.initializeEditModeSteps(processLink.processLinkType);
1500
+ // Set button visibility based on current step position
1501
+ this.updateButtonsForCurrentStep();
944
1502
  }
945
1503
  deselectProcessLink() {
946
1504
  this._selectedProcessLink$.next(undefined);
947
1505
  this.pluginStateService.deselectProcessLink();
948
- }
949
- setEditMode(editMode) {
950
- this._processLinkEditMode$.next(editMode);
1506
+ this.resetBuildingBlockState();
951
1507
  }
952
1508
  sendProcessLinkUpdateEvent(event) {
953
1509
  this._processLinkUpdateEvents$.next(event);
@@ -965,6 +1521,59 @@ class ProcessLinkStateService {
965
1521
  }
966
1522
  });
967
1523
  }
1524
+ openEditModeNavigationSubscriptions() {
1525
+ // Handle back button in edit mode
1526
+ this._backButtonSubscription = this.buttonService.backButtonClick$.subscribe(() => {
1527
+ if (this._isEditing$.getValue()) {
1528
+ this.navigateBackInEditMode();
1529
+ }
1530
+ });
1531
+ // Handle next button in edit mode
1532
+ this._nextButtonSubscription = this.buttonService.nextButtonClick$.subscribe(() => {
1533
+ if (this._isEditing$.getValue()) {
1534
+ this.navigateForwardInEditMode();
1535
+ }
1536
+ });
1537
+ }
1538
+ navigateBackInEditMode() {
1539
+ const navigated = this.processLinkStepService.goToPreviousStep();
1540
+ if (navigated) {
1541
+ this.updateButtonsForCurrentStep();
1542
+ }
1543
+ }
1544
+ navigateForwardInEditMode() {
1545
+ const navigated = this.processLinkStepService.goToNextStep();
1546
+ if (navigated) {
1547
+ this.updateButtonsForCurrentStep();
1548
+ }
1549
+ }
1550
+ updateButtonsForCurrentStep() {
1551
+ const isFirstStep = this.processLinkStepService.isFirstStep();
1552
+ const isLastStep = this.processLinkStepService.isLastStep();
1553
+ // Back button visibility
1554
+ if (isFirstStep) {
1555
+ this.buttonService.hideBackButton();
1556
+ }
1557
+ else {
1558
+ this.buttonService.showBackButton();
1559
+ }
1560
+ // Next/Save button visibility
1561
+ if (isLastStep) {
1562
+ this.buttonService.hideNextButton();
1563
+ this.buttonService.showSaveButton();
1564
+ }
1565
+ else {
1566
+ this.buttonService.showNextButton();
1567
+ this.buttonService.enableNextButton();
1568
+ this.buttonService.hideSaveButton();
1569
+ }
1570
+ }
1571
+ isBuildingBlockContext() {
1572
+ return this._context$.getValue() === 'buildingBlock';
1573
+ }
1574
+ resetBuildingBlockState() {
1575
+ this.buildingBlockStateService.reset();
1576
+ }
968
1577
  reset() {
969
1578
  this.setAvailableProcessLinkTypes([]);
970
1579
  this.processLinkStepService.reset();
@@ -972,16 +1581,18 @@ class ProcessLinkStateService {
972
1581
  this.buttonService.resetButtons();
973
1582
  this.clearSelectedProcessLinkType();
974
1583
  this.deselectProcessLink();
1584
+ this.resetBuildingBlockState();
1585
+ this._isEditing$.next(false);
975
1586
  }
976
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkStateService, deps: [{ token: ProcessLinkStepService }, { token: ProcessLinkButtonService }, { token: PluginStateService }, { token: FORM_CUSTOM_COMPONENT_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
977
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkStateService, providedIn: 'root' }); }
1587
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkStateService, deps: [{ token: ProcessLinkStepService }, { token: ProcessLinkButtonService }, { token: PluginStateService }, { token: BuildingBlockStateService }, { token: FORM_CUSTOM_COMPONENT_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
1588
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkStateService, providedIn: 'root' }); }
978
1589
  }
979
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkStateService, decorators: [{
1590
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkStateService, decorators: [{
980
1591
  type: Injectable,
981
1592
  args: [{
982
1593
  providedIn: 'root',
983
1594
  }]
984
- }], ctorParameters: () => [{ type: ProcessLinkStepService }, { type: ProcessLinkButtonService }, { type: PluginStateService }, { type: undefined, decorators: [{
1595
+ }], ctorParameters: () => [{ type: ProcessLinkStepService }, { type: ProcessLinkButtonService }, { type: PluginStateService }, { type: BuildingBlockStateService }, { type: undefined, decorators: [{
985
1596
  type: Optional
986
1597
  }, {
987
1598
  type: Inject,
@@ -1015,10 +1626,10 @@ class FormFlowComponentService {
1015
1626
  setSupportedComponents(supportedComponents) {
1016
1627
  this._supportedComponents$.next(supportedComponents);
1017
1628
  }
1018
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormFlowComponentService, deps: [{ token: FORM_FLOW_COMPONENT_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable }); }
1019
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormFlowComponentService, providedIn: 'root' }); }
1629
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormFlowComponentService, deps: [{ token: FORM_FLOW_COMPONENT_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable }); }
1630
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormFlowComponentService, providedIn: 'root' }); }
1020
1631
  }
1021
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormFlowComponentService, decorators: [{
1632
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormFlowComponentService, decorators: [{
1022
1633
  type: Injectable,
1023
1634
  args: [{
1024
1635
  providedIn: 'root',
@@ -1052,10 +1663,10 @@ class UrlResolverService {
1052
1663
  });
1053
1664
  return resolvingUrl;
1054
1665
  }
1055
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: UrlResolverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1056
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: UrlResolverService }); }
1666
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: UrlResolverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1667
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: UrlResolverService }); }
1057
1668
  }
1058
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: UrlResolverService, decorators: [{
1669
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: UrlResolverService, decorators: [{
1059
1670
  type: Injectable
1060
1671
  }] });
1061
1672
 
@@ -1075,10 +1686,10 @@ class UrlValidatorService {
1075
1686
  }
1076
1687
  };
1077
1688
  }
1078
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: UrlValidatorService, deps: [{ token: UrlResolverService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1079
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: UrlValidatorService }); }
1689
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: UrlValidatorService, deps: [{ token: UrlResolverService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1690
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: UrlValidatorService }); }
1080
1691
  }
1081
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: UrlValidatorService, decorators: [{
1692
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: UrlValidatorService, decorators: [{
1082
1693
  type: Injectable
1083
1694
  }], ctorParameters: () => [{ type: UrlResolverService }] });
1084
1695
 
@@ -1114,21 +1725,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
1114
1725
  * limitations under the License.
1115
1726
  */
1116
1727
  class SelectPluginConfigurationComponent {
1117
- constructor(pluginManagementService, pluginStateService, pluginService, stateService, buttonService, stepService) {
1728
+ constructor(pluginManagementService, pluginStateService, pluginService, stateService, buttonService, stepService, pluginTranslationService) {
1118
1729
  this.pluginManagementService = pluginManagementService;
1119
1730
  this.pluginStateService = pluginStateService;
1120
1731
  this.pluginService = pluginService;
1121
1732
  this.stateService = stateService;
1122
1733
  this.buttonService = buttonService;
1123
1734
  this.stepService = stepService;
1124
- this.pluginConfigurations$ = this.stateService.modalParams$.pipe(switchMap$1(modalData => combineLatest([
1125
- modalData?.element?.type
1126
- ? this.pluginManagementService.getAllPluginConfigurationsWithLogos(modalData?.element?.activityListenerType)
1127
- : of(undefined),
1128
- this.pluginService.availablePluginIds$,
1129
- ]).pipe(map(([pluginConfigurations, availablePluginIds]) => pluginConfigurations?.filter(configuration => availablePluginIds.includes(configuration.pluginDefinition.key))))));
1735
+ this.pluginTranslationService = pluginTranslationService;
1736
+ this.isBuildingBlockContext$ = this.stateService.context$.pipe(map$1(context => context === 'buildingBlock'));
1737
+ this.listItems$ = combineLatest([
1738
+ this.isBuildingBlockContext$,
1739
+ this.stateService.modalParams$,
1740
+ ]).pipe(switchMap$1(([isBuildingBlock, modalData]) => isBuildingBlock
1741
+ ? combineLatest([
1742
+ this.pluginManagementService.getPluginDefinitions(modalData?.element?.activityListenerType),
1743
+ this.pluginService.pluginSpecifications$,
1744
+ ]).pipe(map$1(([definitions, specs]) => {
1745
+ const limitedDefinitions = definitions?.filter(definition => specs.some(spec => spec.pluginId === definition.key)) ?? [];
1746
+ const enriched = limitedDefinitions.map(definition => {
1747
+ const spec = specs.find(item => item.pluginId === definition.key);
1748
+ return {
1749
+ id: definition.key,
1750
+ title: this.pluginTranslationService.instant('title', definition.key) ||
1751
+ definition.title,
1752
+ description: this.pluginTranslationService.instant('description', definition.key) ||
1753
+ definition.description,
1754
+ logo: spec?.pluginLogoBase64 ?? null,
1755
+ payload: definition.key,
1756
+ isDefinition: true,
1757
+ };
1758
+ });
1759
+ this.pluginDefinitionsCache = limitedDefinitions;
1760
+ return enriched;
1761
+ }))
1762
+ : combineLatest([
1763
+ modalData?.element?.type
1764
+ ? this.pluginManagementService.getAllPluginConfigurationsWithLogos(modalData?.element?.activityListenerType)
1765
+ : of(undefined),
1766
+ this.pluginService.availablePluginIds$,
1767
+ ]).pipe(map$1(([configs, availablePluginIds]) => configs
1768
+ ?.filter(configuration => availablePluginIds.includes(configuration.pluginDefinition.key))
1769
+ ?.map(configuration => ({
1770
+ id: configuration.id ?? configuration.title,
1771
+ title: configuration.title,
1772
+ description: this.pluginTranslationService.instant('description', configuration.pluginDefinition.key),
1773
+ logo: configuration.pluginLogoBase64 ?? null,
1774
+ payload: configuration,
1775
+ isDefinition: false,
1776
+ }))))));
1777
+ this.pageHeaderText$ = this.isBuildingBlockContext$.pipe(map$1(isBuildingBlock => isBuildingBlock
1778
+ ? 'processLinkConfiguration.choosePluginDefinitionDescription'
1779
+ : 'processLinkConfiguration.choosePluginConfigurationDescription'));
1780
+ this.columnHeaderText$ = this.isBuildingBlockContext$.pipe(map$1(isBuildingBlock => isBuildingBlock
1781
+ ? 'pluginManagement.labels.pluginName'
1782
+ : 'pluginManagement.labels.configurationName'));
1130
1783
  this.selectedPluginConfiguration$ = this.pluginStateService.selectedPluginConfiguration$;
1784
+ this.selectedPluginDefinition$ = this.pluginStateService.selectedPluginDefinition$;
1131
1785
  this._subscriptions = new Subscription();
1786
+ this.pluginDefinitionsCache = [];
1132
1787
  }
1133
1788
  ngOnInit() {
1134
1789
  this.openBackButtonSubscription();
@@ -1138,30 +1793,53 @@ class SelectPluginConfigurationComponent {
1138
1793
  this._subscriptions.unsubscribe();
1139
1794
  }
1140
1795
  selected(event) {
1141
- this.selectConfiguration(event.value);
1142
- this.buttonService.enableNextButton();
1796
+ this.isBuildingBlockContext$.pipe(take(1)).subscribe(isBuildingBlock => {
1797
+ if (isBuildingBlock) {
1798
+ const definitionKey = event.value;
1799
+ const definition = this.pluginDefinitionsCache.find(def => def.key === definitionKey);
1800
+ this.selectDefinition(definition);
1801
+ }
1802
+ else {
1803
+ this.selectConfiguration(event.value);
1804
+ }
1805
+ this.buttonService.enableNextButton();
1806
+ });
1143
1807
  }
1144
1808
  selectConfiguration(configuration) {
1145
- this.pluginStateService.selectPluginDefinition({ key: configuration.pluginDefinition.key });
1809
+ if (!configuration)
1810
+ return;
1811
+ if (configuration.pluginDefinition) {
1812
+ this.pluginStateService.selectPluginDefinition(configuration.pluginDefinition);
1813
+ }
1146
1814
  this.pluginStateService.selectPluginConfiguration(configuration);
1147
1815
  }
1816
+ selectDefinition(definition) {
1817
+ if (!definition)
1818
+ return;
1819
+ this.pluginStateService.selectPluginDefinition(definition);
1820
+ this.pluginStateService.selectPluginConfiguration(undefined);
1821
+ }
1148
1822
  openBackButtonSubscription() {
1149
- this._subscriptions.add(this.buttonService.backButtonClick$.subscribe(() => {
1823
+ this._subscriptions.add(this.buttonService.backButtonClick$
1824
+ .pipe(withLatestFrom(this.stateService.isEditing$), filter$1(([, isEditing]) => !isEditing))
1825
+ .subscribe(() => {
1150
1826
  this.stateService.setInitial();
1151
1827
  }));
1152
1828
  }
1153
1829
  openNextButtonSubscription() {
1154
- this._subscriptions.add(this.buttonService.nextButtonClick$.subscribe(() => {
1830
+ this._subscriptions.add(this.buttonService.nextButtonClick$
1831
+ .pipe(withLatestFrom(this.stateService.isEditing$), filter$1(([, isEditing]) => !isEditing))
1832
+ .subscribe(() => {
1155
1833
  this.stepService.setChoosePluginActionSteps();
1156
1834
  }));
1157
1835
  }
1158
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SelectPluginConfigurationComponent, deps: [{ token: i1$1.PluginManagementService }, { token: PluginStateService }, { token: i1$1.PluginService }, { token: ProcessLinkStateService }, { token: ProcessLinkButtonService }, { token: ProcessLinkStepService }], target: i0.ɵɵFactoryTarget.Component }); }
1159
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: SelectPluginConfigurationComponent, isStandalone: false, selector: "valtimo-select-plugin-configuration", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"pluginConfigurations$ | async as pluginConfigurations; else loading\">\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.choosePluginConfigurationDescription' | translate }}\n </p>\n <div class=\"list-container\">\n <cds-structured-list (selected)=\"selected($event)\" selection=\"true\">\n <cds-list-header>\n <cds-list-column nowrap=\"true\"></cds-list-column>\n <cds-list-column nowrap=\"true\">{{\n 'pluginManagement.labels.configurationName' | translate\n }}</cds-list-column>\n <cds-list-column>{{\n 'processLinkConfiguration.pluginDescription' | translate\n }}</cds-list-column>\n </cds-list-header>\n <cds-list-row\n *ngFor=\"let pluginConfiguration of pluginConfigurations\"\n [value]=\"pluginConfiguration\"\n >\n <cds-list-column>\n <div *ngIf=\"pluginConfiguration.pluginLogoBase64\">\n <img\n [src]=\"pluginConfiguration.pluginLogoBase64\"\n [title]=\"'title' | pluginTranslate: pluginConfiguration.pluginDefinition.key | async\"\n class=\"plugin-configuration-logo\"\n /></div\n ></cds-list-column>\n <cds-list-column>{{ pluginConfiguration.title }}</cds-list-column>\n <cds-list-column>\n {{ 'description' | pluginTranslate: pluginConfiguration.pluginDefinition.key | async }}\n </cds-list-column>\n </cds-list-row>\n </cds-structured-list>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-template>\n", styles: [".btn-back{position:absolute}.cards-container{display:flex;flex-flow:row wrap;width:100%}.card{width:calc(33.3% - 20px);margin-right:30px}.card:nth-child(3n+3){margin-right:0}.card-header{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.plugin-configuration-logo{object-fit:contain;height:60px;width:100%;margin-bottom:-.5rem}.loading-container{display:flex;justify-content:center;margin-top:40px;flex-direction:row}.list-container{margin-top:32px;margin-bottom:32px}::ng-deep .list-container .cds--structured-list-td{vertical-align:top}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i4.StructuredList, selector: "cds-structured-list, ibm-structured-list", inputs: ["selection", "flushed", "condensed", "name", "skeleton"], outputs: ["selected"] }, { kind: "component", type: i4.ListRow, selector: "cds-list-row, ibm-list-row", inputs: ["selected", "label", "value"], outputs: ["change"] }, { kind: "component", type: i4.ListHeader, selector: "cds-list-header, ibm-list-header", inputs: ["skeleton"] }, { kind: "component", type: i4.ListColumn, selector: "cds-list-column, ibm-list-column", inputs: ["skeleton", "nowrap"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$1.PluginTranslatePipe, name: "pluginTranslate" }] }); }
1836
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SelectPluginConfigurationComponent, deps: [{ token: i1$1.PluginManagementService }, { token: PluginStateService }, { token: i1$1.PluginService }, { token: ProcessLinkStateService }, { token: ProcessLinkButtonService }, { token: ProcessLinkStepService }, { token: i1$1.PluginTranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
1837
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: SelectPluginConfigurationComponent, isStandalone: false, selector: "valtimo-select-plugin-configuration", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"listItems$ | async as items; else loading\">\n <p class=\"step-description\">\n {{ pageHeaderText$ | async | translate }}\n </p>\n <div class=\"list-container\">\n <cds-structured-list (selected)=\"selected($event)\" selection=\"true\">\n <cds-list-header>\n <cds-list-column nowrap=\"true\"></cds-list-column>\n <cds-list-column nowrap=\"true\">\n {{ columnHeaderText$ | async | translate }}\n </cds-list-column>\n <cds-list-column>\n {{ 'processLinkConfiguration.pluginDescription' | translate }}\n </cds-list-column>\n </cds-list-header>\n <cds-list-row *ngFor=\"let item of items\" [value]=\"item.payload\">\n <cds-list-column>\n <div *ngIf=\"item.logo\">\n <img [src]=\"item.logo\" [title]=\"item.title\" class=\"plugin-configuration-logo\" />\n </div>\n </cds-list-column>\n <cds-list-column>{{ item.title }}</cds-list-column>\n <cds-list-column>{{ item.description }}</cds-list-column>\n </cds-list-row>\n </cds-structured-list>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-template>\n", styles: [".btn-back{position:absolute}.plugin-configuration-logo{object-fit:contain;height:60px;width:100%;margin-bottom:-.5rem}.loading-container{display:flex;justify-content:center;margin-top:40px;flex-direction:row}.list-container{margin-top:32px;margin-bottom:32px}::ng-deep .list-container .cds--structured-list-td{vertical-align:top}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$2.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i3$2.StructuredList, selector: "cds-structured-list, ibm-structured-list", inputs: ["selection", "flushed", "condensed", "name", "skeleton"], outputs: ["selected"] }, { kind: "component", type: i3$2.ListRow, selector: "cds-list-row, ibm-list-row", inputs: ["selected", "label", "value"], outputs: ["change"] }, { kind: "component", type: i3$2.ListHeader, selector: "cds-list-header, ibm-list-header", inputs: ["skeleton"] }, { kind: "component", type: i3$2.ListColumn, selector: "cds-list-column, ibm-list-column", inputs: ["skeleton", "nowrap"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
1160
1838
  }
1161
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SelectPluginConfigurationComponent, decorators: [{
1839
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SelectPluginConfigurationComponent, decorators: [{
1162
1840
  type: Component,
1163
- args: [{ standalone: false, selector: 'valtimo-select-plugin-configuration', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"pluginConfigurations$ | async as pluginConfigurations; else loading\">\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.choosePluginConfigurationDescription' | translate }}\n </p>\n <div class=\"list-container\">\n <cds-structured-list (selected)=\"selected($event)\" selection=\"true\">\n <cds-list-header>\n <cds-list-column nowrap=\"true\"></cds-list-column>\n <cds-list-column nowrap=\"true\">{{\n 'pluginManagement.labels.configurationName' | translate\n }}</cds-list-column>\n <cds-list-column>{{\n 'processLinkConfiguration.pluginDescription' | translate\n }}</cds-list-column>\n </cds-list-header>\n <cds-list-row\n *ngFor=\"let pluginConfiguration of pluginConfigurations\"\n [value]=\"pluginConfiguration\"\n >\n <cds-list-column>\n <div *ngIf=\"pluginConfiguration.pluginLogoBase64\">\n <img\n [src]=\"pluginConfiguration.pluginLogoBase64\"\n [title]=\"'title' | pluginTranslate: pluginConfiguration.pluginDefinition.key | async\"\n class=\"plugin-configuration-logo\"\n /></div\n ></cds-list-column>\n <cds-list-column>{{ pluginConfiguration.title }}</cds-list-column>\n <cds-list-column>\n {{ 'description' | pluginTranslate: pluginConfiguration.pluginDefinition.key | async }}\n </cds-list-column>\n </cds-list-row>\n </cds-structured-list>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-template>\n", styles: [".btn-back{position:absolute}.cards-container{display:flex;flex-flow:row wrap;width:100%}.card{width:calc(33.3% - 20px);margin-right:30px}.card:nth-child(3n+3){margin-right:0}.card-header{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.plugin-configuration-logo{object-fit:contain;height:60px;width:100%;margin-bottom:-.5rem}.loading-container{display:flex;justify-content:center;margin-top:40px;flex-direction:row}.list-container{margin-top:32px;margin-bottom:32px}::ng-deep .list-container .cds--structured-list-td{vertical-align:top}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1164
- }], ctorParameters: () => [{ type: i1$1.PluginManagementService }, { type: PluginStateService }, { type: i1$1.PluginService }, { type: ProcessLinkStateService }, { type: ProcessLinkButtonService }, { type: ProcessLinkStepService }] });
1841
+ args: [{ standalone: false, selector: 'valtimo-select-plugin-configuration', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"listItems$ | async as items; else loading\">\n <p class=\"step-description\">\n {{ pageHeaderText$ | async | translate }}\n </p>\n <div class=\"list-container\">\n <cds-structured-list (selected)=\"selected($event)\" selection=\"true\">\n <cds-list-header>\n <cds-list-column nowrap=\"true\"></cds-list-column>\n <cds-list-column nowrap=\"true\">\n {{ columnHeaderText$ | async | translate }}\n </cds-list-column>\n <cds-list-column>\n {{ 'processLinkConfiguration.pluginDescription' | translate }}\n </cds-list-column>\n </cds-list-header>\n <cds-list-row *ngFor=\"let item of items\" [value]=\"item.payload\">\n <cds-list-column>\n <div *ngIf=\"item.logo\">\n <img [src]=\"item.logo\" [title]=\"item.title\" class=\"plugin-configuration-logo\" />\n </div>\n </cds-list-column>\n <cds-list-column>{{ item.title }}</cds-list-column>\n <cds-list-column>{{ item.description }}</cds-list-column>\n </cds-list-row>\n </cds-structured-list>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-template>\n", styles: [".btn-back{position:absolute}.plugin-configuration-logo{object-fit:contain;height:60px;width:100%;margin-bottom:-.5rem}.loading-container{display:flex;justify-content:center;margin-top:40px;flex-direction:row}.list-container{margin-top:32px;margin-bottom:32px}::ng-deep .list-container .cds--structured-list-td{vertical-align:top}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1842
+ }], ctorParameters: () => [{ type: i1$1.PluginManagementService }, { type: PluginStateService }, { type: i1$1.PluginService }, { type: ProcessLinkStateService }, { type: ProcessLinkButtonService }, { type: ProcessLinkStepService }, { type: i1$1.PluginTranslationService }] });
1165
1843
 
1166
1844
  /*
1167
1845
  * Copyright 2015-2025 Ritense BV, the Netherlands.
@@ -1214,20 +1892,22 @@ class SelectPluginActionComponent {
1214
1892
  }
1215
1893
  openBackButtonSubscription() {
1216
1894
  this.buttonService.backButtonClick$
1217
- .pipe(switchMap$1(() => this.stepService.hasOneProcessLinkType$), take(1))
1895
+ .pipe(withLatestFrom(this.processLinkStateService.isEditing$), filter$1(([, isEditing]) => !isEditing), switchMap$1(() => this.stepService.hasOneProcessLinkType$), take(1))
1218
1896
  .subscribe((hasOneOption) => {
1219
1897
  this.stepService.setProcessLinkTypeSteps('plugin', hasOneOption);
1220
1898
  });
1221
1899
  }
1222
1900
  openNextButtonSubscription() {
1223
- this._subscriptions.add(this.buttonService.nextButtonClick$.subscribe(() => {
1901
+ this._subscriptions.add(this.buttonService.nextButtonClick$
1902
+ .pipe(withLatestFrom(this.processLinkStateService.isEditing$), filter$1(([, isEditing]) => !isEditing))
1903
+ .subscribe(() => {
1224
1904
  this.stepService.setConfigurePluginActionSteps();
1225
1905
  }));
1226
1906
  }
1227
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SelectPluginActionComponent, deps: [{ token: ProcessLinkButtonService }, { token: i1$1.PluginManagementService }, { token: PluginStateService }, { token: ProcessLinkStepService }, { token: ProcessLinkStateService }], target: i0.ɵɵFactoryTarget.Component }); }
1228
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: SelectPluginActionComponent, isStandalone: false, selector: "valtimo-select-plugin-action", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"pluginFunctions$ | async as pluginFunctions; else loading\">\n <div class=\"choose-plugin-action\" *ngIf=\"pluginFunctions?.length > 0\">\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.choosePluginActionDescription' | translate }}\n </p>\n <div class=\"action-tiles\">\n <cds-tile-group\n [multiple]=\"false\"\n *ngIf=\"{selectedPluginDefinition: selectedPluginDefinition$ | async} as obs\"\n (selected)=\"selected($event)\"\n >\n <cds-selection-tile\n *ngFor=\"let pluginFunction of pluginFunctions\"\n [value]=\"stringify(pluginFunction)\"\n [selected]=\"false\"\n >{{\n pluginFunction.key | pluginTranslate: obs.selectedPluginDefinition.key | async\n }}</cds-selection-tile\n >\n </cds-tile-group>\n </div>\n </div>\n <ng-container *ngIf=\"!pluginFunctions || pluginFunctions?.length === 0\">\n <ng-container *ngTemplateOutlet=\"noPluginFunctionsTemplate\"> </ng-container>\n </ng-container>\n</ng-container>\n\n<ng-template #noPluginFunctionsTemplate>\n <p class=\"step-description\">\n {{ 'processLink.noPluginFunctions' | translate }}\n </p>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-template>\n", styles: [".btn-back{position:absolute}.cards-container{display:flex;flex-flow:row wrap;width:100%}.card{width:calc(33.3% - 20px);margin-right:30px}.card:nth-child(3n+3){margin-right:0}.card-header{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.loading-container{display:flex;justify-content:center;margin-top:40px;flex-direction:row}.action-tiles{margin-top:24px;width:calc(100% + 8px);margin-left:-8px}::ng-deep .choose-plugin-action cds-selection-tile{display:flex;width:calc(33.3% - 8px)}::ng-deep .choose-plugin-action .cds--tile{width:100%}::ng-deep .choose-plugin-action cds-tile-group fieldset{display:flex;flex-direction:row;flex-wrap:wrap}::ng-deep .choose-plugin-action cds-selection-tile{margin-left:8px}::ng-deep .choose-plugin-action cds-selection-tile:nth-child(n+4){margin-top:8px}::ng-deep .action-tiles .cds--tile{background-color:var(--cds-layer-02, #ffffff)}::ng-deep .action-tiles .cds--tile:hover{background:var(--cds-layer-hover)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i4.SelectionTile, selector: "cds-selection-tile, ibm-selection-tile", inputs: ["theme", "id", "selected", "value", "disabled"], outputs: ["change"] }, { kind: "component", type: i4.TileGroup, selector: "cds-tile-group, ibm-tile-group", inputs: ["name", "multiple", "legend"], outputs: ["selected"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$1.PluginTranslatePipe, name: "pluginTranslate" }] }); }
1907
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SelectPluginActionComponent, deps: [{ token: ProcessLinkButtonService }, { token: i1$1.PluginManagementService }, { token: PluginStateService }, { token: ProcessLinkStepService }, { token: ProcessLinkStateService }], target: i0.ɵɵFactoryTarget.Component }); }
1908
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: SelectPluginActionComponent, isStandalone: false, selector: "valtimo-select-plugin-action", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"pluginFunctions$ | async as pluginFunctions; else loading\">\n <div class=\"choose-plugin-action\" *ngIf=\"pluginFunctions?.length > 0\">\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.choosePluginActionDescription' | translate }}\n </p>\n <div class=\"action-tiles\">\n <cds-tile-group\n [multiple]=\"false\"\n *ngIf=\"{selectedPluginDefinition: selectedPluginDefinition$ | async} as obs\"\n (selected)=\"selected($event)\"\n >\n <cds-selection-tile\n *ngFor=\"let pluginFunction of pluginFunctions\"\n [value]=\"stringify(pluginFunction)\"\n [selected]=\"false\"\n >{{\n pluginFunction.key | pluginTranslate: obs.selectedPluginDefinition.key | async\n }}</cds-selection-tile\n >\n </cds-tile-group>\n </div>\n </div>\n <ng-container *ngIf=\"!pluginFunctions || pluginFunctions?.length === 0\">\n <ng-container *ngTemplateOutlet=\"noPluginFunctionsTemplate\"> </ng-container>\n </ng-container>\n</ng-container>\n\n<ng-template #noPluginFunctionsTemplate>\n <p class=\"step-description\">\n {{ 'processLink.noPluginFunctions' | translate }}\n </p>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-template>\n", styles: [".btn-back{position:absolute}.cards-container{display:flex;flex-flow:row wrap;width:100%}.card{width:calc(33.3% - 20px);margin-right:30px}.card:nth-child(3n+3){margin-right:0}.card-header{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.loading-container{display:flex;justify-content:center;margin-top:40px;flex-direction:row}.action-tiles{margin-top:24px;width:calc(100% + 8px);margin-left:-8px}::ng-deep .choose-plugin-action cds-selection-tile{display:flex;width:calc(33.3% - 8px)}::ng-deep .choose-plugin-action .cds--tile{width:100%}::ng-deep .choose-plugin-action cds-tile-group fieldset{display:flex;flex-direction:row;flex-wrap:wrap}::ng-deep .choose-plugin-action cds-selection-tile{margin-left:8px}::ng-deep .choose-plugin-action cds-selection-tile:nth-child(n+4){margin-top:8px}::ng-deep .action-tiles .cds--tile{background-color:var(--cds-layer-02, #ffffff)}::ng-deep .action-tiles .cds--tile:hover{background:var(--cds-layer-hover)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3$2.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i3$2.SelectionTile, selector: "cds-selection-tile, ibm-selection-tile", inputs: ["theme", "id", "selected", "value", "disabled"], outputs: ["change"] }, { kind: "component", type: i3$2.TileGroup, selector: "cds-tile-group, ibm-tile-group", inputs: ["name", "multiple", "legend"], outputs: ["selected"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$1.PluginTranslatePipe, name: "pluginTranslate" }] }); }
1229
1909
  }
1230
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SelectPluginActionComponent, decorators: [{
1910
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SelectPluginActionComponent, decorators: [{
1231
1911
  type: Component,
1232
1912
  args: [{ standalone: false, selector: 'valtimo-select-plugin-action', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"pluginFunctions$ | async as pluginFunctions; else loading\">\n <div class=\"choose-plugin-action\" *ngIf=\"pluginFunctions?.length > 0\">\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.choosePluginActionDescription' | translate }}\n </p>\n <div class=\"action-tiles\">\n <cds-tile-group\n [multiple]=\"false\"\n *ngIf=\"{selectedPluginDefinition: selectedPluginDefinition$ | async} as obs\"\n (selected)=\"selected($event)\"\n >\n <cds-selection-tile\n *ngFor=\"let pluginFunction of pluginFunctions\"\n [value]=\"stringify(pluginFunction)\"\n [selected]=\"false\"\n >{{\n pluginFunction.key | pluginTranslate: obs.selectedPluginDefinition.key | async\n }}</cds-selection-tile\n >\n </cds-tile-group>\n </div>\n </div>\n <ng-container *ngIf=\"!pluginFunctions || pluginFunctions?.length === 0\">\n <ng-container *ngTemplateOutlet=\"noPluginFunctionsTemplate\"> </ng-container>\n </ng-container>\n</ng-container>\n\n<ng-template #noPluginFunctionsTemplate>\n <p class=\"step-description\">\n {{ 'processLink.noPluginFunctions' | translate }}\n </p>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-template>\n", styles: [".btn-back{position:absolute}.cards-container{display:flex;flex-flow:row wrap;width:100%}.card{width:calc(33.3% - 20px);margin-right:30px}.card:nth-child(3n+3){margin-right:0}.card-header{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.loading-container{display:flex;justify-content:center;margin-top:40px;flex-direction:row}.action-tiles{margin-top:24px;width:calc(100% + 8px);margin-left:-8px}::ng-deep .choose-plugin-action cds-selection-tile{display:flex;width:calc(33.3% - 8px)}::ng-deep .choose-plugin-action .cds--tile{width:100%}::ng-deep .choose-plugin-action cds-tile-group fieldset{display:flex;flex-direction:row;flex-wrap:wrap}::ng-deep .choose-plugin-action cds-selection-tile{margin-left:8px}::ng-deep .choose-plugin-action cds-selection-tile:nth-child(n+4){margin-top:8px}::ng-deep .action-tiles .cds--tile{background-color:var(--cds-layer-02, #ffffff)}::ng-deep .action-tiles .cds--tile:hover{background:var(--cds-layer-hover)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1233
1913
  }], ctorParameters: () => [{ type: ProcessLinkButtonService }, { type: i1$1.PluginManagementService }, { type: PluginStateService }, { type: ProcessLinkStepService }, { type: ProcessLinkStateService }] });
@@ -1278,7 +1958,7 @@ class ImportPluginConfigurationComponent {
1278
1958
  this.processListItems$ = combineLatest([
1279
1959
  this._compatiblePluginProcessLinksSubject$,
1280
1960
  this.process.valueChanges.pipe(startWith('')),
1281
- ]).pipe(map$1(([compatibleProcessLinks, processValue]) => compatibleProcessLinks?.map(compatibleProcessLink => ({
1961
+ ]).pipe(map(([compatibleProcessLinks, processValue]) => compatibleProcessLinks?.map(compatibleProcessLink => ({
1282
1962
  content: compatibleProcessLink.processDefinitionKey,
1283
1963
  selected: processValue === compatibleProcessLink.processDefinitionKey,
1284
1964
  })) || []));
@@ -1286,7 +1966,7 @@ class ImportPluginConfigurationComponent {
1286
1966
  this._compatiblePluginProcessLinksSubject$,
1287
1967
  this.process.valueChanges.pipe(startWith('')),
1288
1968
  this.version.valueChanges.pipe(startWith('')),
1289
- ]).pipe(map$1(([compatibleProcessLinks, processValue, versionValue]) => !processValue
1969
+ ]).pipe(map(([compatibleProcessLinks, processValue, versionValue]) => !processValue
1290
1970
  ? []
1291
1971
  : compatibleProcessLinks
1292
1972
  .find(compatibleLinks => compatibleLinks.processDefinitionKey === processValue)
@@ -1300,7 +1980,7 @@ class ImportPluginConfigurationComponent {
1300
1980
  this.process.valueChanges.pipe(startWith('')),
1301
1981
  this.version.valueChanges.pipe(startWith('')),
1302
1982
  this.activity.valueChanges.pipe(startWith('')),
1303
- ]).pipe(map$1(([compatibleProcessLinks, processValue, versionValue, activityValue]) => !processValue || !versionValue
1983
+ ]).pipe(map(([compatibleProcessLinks, processValue, versionValue, activityValue]) => !processValue || !versionValue
1304
1984
  ? []
1305
1985
  : compatibleProcessLinks
1306
1986
  .find(compatibleLinks => compatibleLinks.processDefinitionKey === processValue)
@@ -1341,13 +2021,13 @@ class ImportPluginConfigurationComponent {
1341
2021
  activitySelected(event) {
1342
2022
  this.activity.setValue(event?.item?.content);
1343
2023
  }
1344
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ImportPluginConfigurationComponent, deps: [{ token: i1$2.FormBuilder }, { token: ProcessLinkService }, { token: i4.IconService }, { token: i2$2.CdsThemeService }], target: i0.ɵɵFactoryTarget.Component }); }
1345
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: ImportPluginConfigurationComponent, isStandalone: false, selector: "valtimo-import-plugin-configuration", inputs: { pluginActionKey: "pluginActionKey" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-toggletip align=\"right-bottom\" [autoAlign]=\"true\" [isOpen]=\"open$ | async\">\n <button\n class=\"process-link-configuration-import-button\"\n [disabled]=\"((compatiblePluginProcessLinks$ | async) || []).length === 0\"\n cdsToggletipButton\n [removeClassnames]=\"['cds--toggletip-button']\"\n cdsButton=\"ghost\"\n >\n {{ 'processLinkConfiguration.importConfiguration' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"upload\" size=\"16\"></svg>\n </button>\n\n <div\n cdsToggletipContent\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n class=\"process-link-configuration-select\"\n >\n <cds-dropdown\n [label]=\"'processLinkConfiguration.process' | translate\"\n [placeholder]=\"'processLinkConfiguration.selectProcess' | translate\"\n (selected)=\"processSelected($event)\"\n [appendInline]=\"true\"\n [cdsLayer]=\"1\"\n >\n <cds-dropdown-list\n [items]=\"processListItems$ | async\"\n onclick=\"event.stopPropagation()\"\n ></cds-dropdown-list>\n </cds-dropdown>\n\n <cds-dropdown\n [label]=\"'processLinkConfiguration.version' | translate\"\n [placeholder]=\"'processLinkConfiguration.selectVersion' | translate\"\n [disabled]=\"!process.value\"\n (selected)=\"versionSelected($event)\"\n [appendInline]=\"true\"\n [cdsLayer]=\"1\"\n >\n <cds-dropdown-list\n [items]=\"versionListItems$ | async\"\n onclick=\"event.stopPropagation()\"\n ></cds-dropdown-list>\n </cds-dropdown>\n\n <cds-dropdown\n [label]=\"'processLinkConfiguration.activity' | translate\"\n [placeholder]=\"'processLinkConfiguration.selectActivity' | translate\"\n [disabled]=\"!process.value || !version.value\"\n (selected)=\"activitySelected($event)\"\n [appendInline]=\"true\"\n [cdsLayer]=\"1\"\n >\n <cds-dropdown-list\n [items]=\"activityListItems$ | async\"\n onclick=\"event.stopPropagation()\"\n ></cds-dropdown-list>\n </cds-dropdown>\n\n <button cdsButton [disabled]=\"!importPluginForm.valid\" (click)=\"onSubmit()\" [cdsLayer]=\"1\">\n {{ 'processLinkConfiguration.importConfiguration' | translate }}\n </button>\n </div>\n</cds-toggletip>\n", styles: [":host ::ng-deep .cds--popover-content{max-inline-size:unset}.process-link-configuration-import-button{margin-bottom:16px}.process-link-configuration-select{width:400px;max-inline-size:400px;display:flex;flex-direction:column;gap:16px}.process-link-configuration-select .cds--btn{width:100%;max-width:unset}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i4.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i4.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i5.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "readonly", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp", "fluid"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "directive", type: i4.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "component", type: i4.Toggletip, selector: "cds-toggletip, ibm-toggletip", inputs: ["id", "isOpen"] }, { kind: "directive", type: i4.ToggletipButton, selector: "[cdsToggletipButton], [ibmToggletipButton]", inputs: ["ariaLabel"] }, { kind: "directive", type: i4.ToggletipContent, selector: "[cdsToggletipContent], [ibmToggletipContent]" }, { kind: "directive", type: i2$2.RemoveClassnamesDirective, selector: "[removeClassnames]", inputs: ["removeClassnames"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] }); }
2024
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ImportPluginConfigurationComponent, deps: [{ token: i1$2.FormBuilder }, { token: ProcessLinkService }, { token: i3$2.IconService }, { token: i2$1.CdsThemeService }], target: i0.ɵɵFactoryTarget.Component }); }
2025
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: ImportPluginConfigurationComponent, isStandalone: false, selector: "valtimo-import-plugin-configuration", inputs: { pluginActionKey: "pluginActionKey" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-toggletip align=\"right-bottom\" [autoAlign]=\"true\" [isOpen]=\"open$ | async\">\n <button\n class=\"process-link-configuration-import-button\"\n [disabled]=\"((compatiblePluginProcessLinks$ | async) || []).length === 0\"\n cdsToggletipButton\n [removeClassnames]=\"['cds--toggletip-button']\"\n cdsButton=\"ghost\"\n >\n {{ 'processLinkConfiguration.importConfiguration' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"upload\" size=\"16\"></svg>\n </button>\n\n <div\n cdsToggletipContent\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n class=\"process-link-configuration-select\"\n >\n <cds-dropdown\n [label]=\"'processLinkConfiguration.process' | translate\"\n [placeholder]=\"'processLinkConfiguration.selectProcess' | translate\"\n (selected)=\"processSelected($event)\"\n [appendInline]=\"true\"\n [cdsLayer]=\"1\"\n >\n <cds-dropdown-list\n [items]=\"processListItems$ | async\"\n onclick=\"event.stopPropagation()\"\n ></cds-dropdown-list>\n </cds-dropdown>\n\n <cds-dropdown\n [label]=\"'processLinkConfiguration.version' | translate\"\n [placeholder]=\"'processLinkConfiguration.selectVersion' | translate\"\n [disabled]=\"!process.value\"\n (selected)=\"versionSelected($event)\"\n [appendInline]=\"true\"\n [cdsLayer]=\"1\"\n >\n <cds-dropdown-list\n [items]=\"versionListItems$ | async\"\n onclick=\"event.stopPropagation()\"\n ></cds-dropdown-list>\n </cds-dropdown>\n\n <cds-dropdown\n [label]=\"'processLinkConfiguration.activity' | translate\"\n [placeholder]=\"'processLinkConfiguration.selectActivity' | translate\"\n [disabled]=\"!process.value || !version.value\"\n (selected)=\"activitySelected($event)\"\n [appendInline]=\"true\"\n [cdsLayer]=\"1\"\n >\n <cds-dropdown-list\n [items]=\"activityListItems$ | async\"\n onclick=\"event.stopPropagation()\"\n ></cds-dropdown-list>\n </cds-dropdown>\n\n <button cdsButton [disabled]=\"!importPluginForm.valid\" (click)=\"onSubmit()\" [cdsLayer]=\"1\">\n {{ 'processLinkConfiguration.importConfiguration' | translate }}\n </button>\n </div>\n</cds-toggletip>\n", styles: [":host ::ng-deep .cds--popover-content{max-inline-size:unset}.process-link-configuration-import-button{margin-bottom:16px}.process-link-configuration-select{width:400px;max-inline-size:400px;display:flex;flex-direction:column;gap:16px}.process-link-configuration-select .cds--btn{width:100%;max-width:unset}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3$2.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i3$2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i5.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "readonly", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp", "fluid"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "directive", type: i3$2.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "component", type: i3$2.Toggletip, selector: "cds-toggletip, ibm-toggletip", inputs: ["id", "isOpen"] }, { kind: "directive", type: i3$2.ToggletipButton, selector: "[cdsToggletipButton], [ibmToggletipButton]", inputs: ["ariaLabel"] }, { kind: "directive", type: i3$2.ToggletipContent, selector: "[cdsToggletipContent], [ibmToggletipContent]" }, { kind: "directive", type: i2$1.RemoveClassnamesDirective, selector: "[removeClassnames]", inputs: ["removeClassnames"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
1346
2026
  }
1347
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ImportPluginConfigurationComponent, decorators: [{
2027
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ImportPluginConfigurationComponent, decorators: [{
1348
2028
  type: Component,
1349
2029
  args: [{ standalone: false, selector: 'valtimo-import-plugin-configuration', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-toggletip align=\"right-bottom\" [autoAlign]=\"true\" [isOpen]=\"open$ | async\">\n <button\n class=\"process-link-configuration-import-button\"\n [disabled]=\"((compatiblePluginProcessLinks$ | async) || []).length === 0\"\n cdsToggletipButton\n [removeClassnames]=\"['cds--toggletip-button']\"\n cdsButton=\"ghost\"\n >\n {{ 'processLinkConfiguration.importConfiguration' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"upload\" size=\"16\"></svg>\n </button>\n\n <div\n cdsToggletipContent\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n class=\"process-link-configuration-select\"\n >\n <cds-dropdown\n [label]=\"'processLinkConfiguration.process' | translate\"\n [placeholder]=\"'processLinkConfiguration.selectProcess' | translate\"\n (selected)=\"processSelected($event)\"\n [appendInline]=\"true\"\n [cdsLayer]=\"1\"\n >\n <cds-dropdown-list\n [items]=\"processListItems$ | async\"\n onclick=\"event.stopPropagation()\"\n ></cds-dropdown-list>\n </cds-dropdown>\n\n <cds-dropdown\n [label]=\"'processLinkConfiguration.version' | translate\"\n [placeholder]=\"'processLinkConfiguration.selectVersion' | translate\"\n [disabled]=\"!process.value\"\n (selected)=\"versionSelected($event)\"\n [appendInline]=\"true\"\n [cdsLayer]=\"1\"\n >\n <cds-dropdown-list\n [items]=\"versionListItems$ | async\"\n onclick=\"event.stopPropagation()\"\n ></cds-dropdown-list>\n </cds-dropdown>\n\n <cds-dropdown\n [label]=\"'processLinkConfiguration.activity' | translate\"\n [placeholder]=\"'processLinkConfiguration.selectActivity' | translate\"\n [disabled]=\"!process.value || !version.value\"\n (selected)=\"activitySelected($event)\"\n [appendInline]=\"true\"\n [cdsLayer]=\"1\"\n >\n <cds-dropdown-list\n [items]=\"activityListItems$ | async\"\n onclick=\"event.stopPropagation()\"\n ></cds-dropdown-list>\n </cds-dropdown>\n\n <button cdsButton [disabled]=\"!importPluginForm.valid\" (click)=\"onSubmit()\" [cdsLayer]=\"1\">\n {{ 'processLinkConfiguration.importConfiguration' | translate }}\n </button>\n </div>\n</cds-toggletip>\n", styles: [":host ::ng-deep .cds--popover-content{max-inline-size:unset}.process-link-configuration-import-button{margin-bottom:16px}.process-link-configuration-select{width:400px;max-inline-size:400px;display:flex;flex-direction:column;gap:16px}.process-link-configuration-select .cds--btn{width:100%;max-width:unset}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1350
- }], ctorParameters: () => [{ type: i1$2.FormBuilder }, { type: ProcessLinkService }, { type: i4.IconService }, { type: i2$2.CdsThemeService }], propDecorators: { pluginActionKey: [{
2030
+ }], ctorParameters: () => [{ type: i1$2.FormBuilder }, { type: ProcessLinkService }, { type: i3$2.IconService }, { type: i2$1.CdsThemeService }], propDecorators: { pluginActionKey: [{
1351
2031
  type: Input
1352
2032
  }], configurationEvent: [{
1353
2033
  type: Output
@@ -1382,11 +2062,25 @@ class PluginActionConfigurationComponent {
1382
2062
  this.save$ = this.pluginStateService.save$;
1383
2063
  this.saving$ = this.stateService.saving$;
1384
2064
  this._prefillConfigurationSubject$ = new BehaviorSubject(null);
1385
- this._prefillConfiguration$ = this.stateService.selectedProcessLink$.pipe(map(processLink => (processLink ? processLink?.actionProperties : undefined)));
2065
+ // Only prefill if the action key hasn't changed from what's saved in the process link
2066
+ this._prefillConfiguration$ = combineLatest([
2067
+ this.stateService.selectedProcessLink$,
2068
+ this.pluginStateService.selectedPluginFunction$,
2069
+ ]).pipe(map$1(([processLink, selectedFunction]) => {
2070
+ if (!processLink)
2071
+ return undefined;
2072
+ // Only prefill if the action hasn't been changed
2073
+ const savedActionKey = processLink.pluginActionDefinitionKey;
2074
+ const currentActionKey = selectedFunction?.key;
2075
+ if (currentActionKey && savedActionKey !== currentActionKey) {
2076
+ return undefined; // Action changed, don't prefill old configuration
2077
+ }
2078
+ return processLink.actionProperties;
2079
+ }));
1386
2080
  this.prefillConfiguration$ = combineLatest([
1387
2081
  this._prefillConfigurationSubject$,
1388
2082
  this._prefillConfiguration$,
1389
- ]).pipe(map(([prefillConfigurationSubjectValue, prefillConfiguration]) => prefillConfigurationSubjectValue || prefillConfiguration));
2083
+ ]).pipe(map$1(([prefillConfigurationSubjectValue, prefillConfiguration]) => prefillConfigurationSubjectValue || prefillConfiguration));
1390
2084
  this._subscriptions = new Subscription();
1391
2085
  }
1392
2086
  ngOnInit() {
@@ -1417,23 +2111,29 @@ class PluginActionConfigurationComponent {
1417
2111
  this._prefillConfigurationSubject$.next(configuration);
1418
2112
  }
1419
2113
  updateProcessLink(configuration) {
1420
- this.stateService.selectedProcessLink$.pipe(take(1)).subscribe(selectedProcessLink => {
2114
+ combineLatest([
2115
+ this.stateService.selectedProcessLink$,
2116
+ this.pluginStateService.selectedPluginFunction$,
2117
+ ])
2118
+ .pipe(take(1))
2119
+ .subscribe(([selectedProcessLink, selectedFunction]) => {
2120
+ const inferredReferenceType = selectedProcessLink.referenceType ||
2121
+ (selectedProcessLink.pluginDefinitionKey ? 'BUILDING_BLOCK' : 'FIXED');
2122
+ const pluginConfigurationId = inferredReferenceType === 'FIXED'
2123
+ ? (selectedProcessLink.pluginConfigurationId ?? '')
2124
+ : undefined;
2125
+ // Use the currently selected function key (user may have changed it)
2126
+ const actionKey = selectedFunction?.key ?? selectedProcessLink.pluginActionDefinitionKey ?? '';
1421
2127
  const updateProcessLinkRequest = {
1422
2128
  id: selectedProcessLink.id,
1423
- pluginConfigurationId: selectedProcessLink.pluginConfigurationId ?? '',
1424
- pluginActionDefinitionKey: selectedProcessLink.pluginActionDefinitionKey ?? '',
2129
+ pluginConfigurationId,
2130
+ pluginActionDefinitionKey: actionKey,
1425
2131
  actionProperties: configuration,
1426
2132
  activityId: selectedProcessLink.activityId,
2133
+ referenceType: inferredReferenceType,
2134
+ pluginDefinitionKey: selectedProcessLink.pluginDefinitionKey,
1427
2135
  };
1428
- if (this.stateService.processLinkEditMode === ProcessLinkEditMode.EMIT_EVENTS) {
1429
- this.stateService.sendProcessLinkUpdateEvent(updateProcessLinkRequest);
1430
- return;
1431
- }
1432
- this.processLinkService.updateProcessLink(updateProcessLinkRequest).subscribe(() => {
1433
- this.stateService.closeModal();
1434
- }, () => {
1435
- this.stateService.stopSaving();
1436
- });
2136
+ this.stateService.sendProcessLinkUpdateEvent(updateProcessLinkRequest);
1437
2137
  });
1438
2138
  }
1439
2139
  saveNewProcessLink(configuration) {
@@ -1442,31 +2142,41 @@ class PluginActionConfigurationComponent {
1442
2142
  this.pluginStateService.selectedPluginConfiguration$,
1443
2143
  this.pluginStateService.selectedPluginFunction$,
1444
2144
  this.stateService.selectedProcessLinkTypeId$,
2145
+ this.pluginStateService.selectedPluginDefinition$,
1445
2146
  ])
1446
2147
  .pipe(take(1))
1447
- .subscribe(([modalData, selectedConfiguration, selectedFunction, selectedProcessLinkTypeId]) => {
2148
+ .subscribe(([modalData, selectedConfiguration, selectedFunction, selectedProcessLinkTypeId, selectedDefinition,]) => {
2149
+ const isBuildingBlock = this.stateService.isBuildingBlockContext();
2150
+ const pluginDefinitionKey = selectedConfiguration?.pluginDefinition?.key || selectedDefinition?.key;
2151
+ if (!selectedFunction || (isBuildingBlock && !pluginDefinitionKey)) {
2152
+ this.stateService.stopSaving();
2153
+ return;
2154
+ }
2155
+ if (!isBuildingBlock && !selectedConfiguration) {
2156
+ this.stateService.stopSaving();
2157
+ return;
2158
+ }
2159
+ const referenceType = isBuildingBlock
2160
+ ? 'BUILDING_BLOCK'
2161
+ : 'FIXED';
1448
2162
  const processLinkRequest = {
1449
2163
  actionProperties: configuration,
1450
2164
  activityId: modalData?.element?.id,
1451
2165
  activityType: modalData?.element?.activityListenerType ?? '',
1452
- pluginConfigurationId: selectedConfiguration.id,
2166
+ pluginConfigurationId: isBuildingBlock ? undefined : selectedConfiguration?.id,
1453
2167
  processDefinitionId: modalData?.processDefinitionId,
1454
2168
  pluginActionDefinitionKey: selectedFunction.key,
1455
2169
  processLinkType: selectedProcessLinkTypeId,
2170
+ referenceType,
2171
+ pluginDefinitionKey,
1456
2172
  };
1457
- if (this.stateService.processLinkEditMode === ProcessLinkEditMode.EMIT_EVENTS) {
1458
- this.stateService.sendProcessLinkCreateEvent(processLinkRequest);
1459
- return;
1460
- }
1461
- this.processLinkService.saveProcessLink(processLinkRequest).subscribe(() => {
1462
- this.stateService.closeModal();
1463
- }, () => {
1464
- this.stateService.stopSaving();
1465
- });
2173
+ this.stateService.sendProcessLinkCreateEvent(processLinkRequest);
1466
2174
  });
1467
2175
  }
1468
2176
  openBackButtonSubscription() {
1469
- this._subscriptions.add(this.buttonService.backButtonClick$.subscribe(() => {
2177
+ this._subscriptions.add(this.buttonService.backButtonClick$
2178
+ .pipe(withLatestFrom(this.stateService.isEditing$), filter$1(([, isEditing]) => !isEditing))
2179
+ .subscribe(() => {
1470
2180
  this.stepService.setChoosePluginActionSteps();
1471
2181
  }));
1472
2182
  }
@@ -1475,10 +2185,10 @@ class PluginActionConfigurationComponent {
1475
2185
  this.pluginStateService.save();
1476
2186
  }));
1477
2187
  }
1478
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: PluginActionConfigurationComponent, deps: [{ token: ProcessLinkStateService }, { token: PluginStateService }, { token: ProcessLinkButtonService }, { token: ProcessLinkStepService }, { token: ProcessLinkService }], target: i0.ɵɵFactoryTarget.Component }); }
1479
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: PluginActionConfigurationComponent, isStandalone: false, selector: "valtimo-plugin-action-configuration", inputs: { selectedPluginConfiguration$: "selectedPluginConfiguration$" }, outputs: { valid: "valid", configuration: "configuration" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-import-plugin-configuration\n [pluginActionKey]=\"functionKey$ | async\"\n (configurationEvent)=\"onImportConfiguration($event)\"\n></valtimo-import-plugin-configuration>\n\n<valtimo-plugin-configuration-container\n [pluginDefinitionKey]=\"pluginDefinitionKey$ | async\"\n [functionKey]=\"functionKey$ | async\"\n [save$]=\"save$\"\n [disabled$]=\"saving$\"\n [selectedPluginConfiguration$]=\"selectedPluginConfiguration$\"\n [prefillConfiguration$]=\"prefillConfiguration$\"\n (valid)=\"onValid($event)\"\n (configuration)=\"onConfiguration($event)\"\n type=\"function\"\n></valtimo-plugin-configuration-container>\n", styles: ["/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "component", type: i1$1.PluginConfigurationContainerComponent, selector: "valtimo-plugin-configuration-container", inputs: ["type", "pluginDefinitionKey", "functionKey", "save$", "disabled$", "selectedPluginConfiguration$", "prefillConfiguration$"], outputs: ["valid", "configuration"] }, { kind: "component", type: ImportPluginConfigurationComponent, selector: "valtimo-import-plugin-configuration", inputs: ["pluginActionKey"], outputs: ["configurationEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
2188
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: PluginActionConfigurationComponent, deps: [{ token: ProcessLinkStateService }, { token: PluginStateService }, { token: ProcessLinkButtonService }, { token: ProcessLinkStepService }, { token: ProcessLinkService }], target: i0.ɵɵFactoryTarget.Component }); }
2189
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: PluginActionConfigurationComponent, isStandalone: false, selector: "valtimo-plugin-action-configuration", inputs: { selectedPluginConfiguration$: "selectedPluginConfiguration$" }, outputs: { valid: "valid", configuration: "configuration" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-import-plugin-configuration\n [pluginActionKey]=\"functionKey$ | async\"\n (configurationEvent)=\"onImportConfiguration($event)\"\n></valtimo-import-plugin-configuration>\n\n<valtimo-plugin-configuration-container\n [pluginDefinitionKey]=\"pluginDefinitionKey$ | async\"\n [functionKey]=\"functionKey$ | async\"\n [save$]=\"save$\"\n [disabled$]=\"saving$\"\n [selectedPluginConfiguration$]=\"selectedPluginConfiguration$\"\n [prefillConfiguration$]=\"prefillConfiguration$\"\n (valid)=\"onValid($event)\"\n (configuration)=\"onConfiguration($event)\"\n type=\"function\"\n></valtimo-plugin-configuration-container>\n", styles: ["/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "component", type: i1$1.PluginConfigurationContainerComponent, selector: "valtimo-plugin-configuration-container", inputs: ["type", "pluginDefinitionKey", "functionKey", "save$", "disabled$", "selectedPluginConfiguration$", "prefillConfiguration$"], outputs: ["valid", "configuration"] }, { kind: "component", type: ImportPluginConfigurationComponent, selector: "valtimo-import-plugin-configuration", inputs: ["pluginActionKey"], outputs: ["configurationEvent"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }] }); }
1480
2190
  }
1481
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: PluginActionConfigurationComponent, decorators: [{
2191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: PluginActionConfigurationComponent, decorators: [{
1482
2192
  type: Component,
1483
2193
  args: [{ standalone: false, selector: 'valtimo-plugin-action-configuration', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-import-plugin-configuration\n [pluginActionKey]=\"functionKey$ | async\"\n (configurationEvent)=\"onImportConfiguration($event)\"\n></valtimo-import-plugin-configuration>\n\n<valtimo-plugin-configuration-container\n [pluginDefinitionKey]=\"pluginDefinitionKey$ | async\"\n [functionKey]=\"functionKey$ | async\"\n [save$]=\"save$\"\n [disabled$]=\"saving$\"\n [selectedPluginConfiguration$]=\"selectedPluginConfiguration$\"\n [prefillConfiguration$]=\"prefillConfiguration$\"\n (valid)=\"onValid($event)\"\n (configuration)=\"onConfiguration($event)\"\n type=\"function\"\n></valtimo-plugin-configuration-container>\n", styles: ["/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1484
2194
  }], ctorParameters: () => [{ type: ProcessLinkStateService }, { type: PluginStateService }, { type: ProcessLinkButtonService }, { type: ProcessLinkStepService }, { type: ProcessLinkService }], propDecorators: { selectedPluginConfiguration$: [{
@@ -1516,7 +2226,7 @@ class FormLinkProcessDiagramComponent {
1516
2226
  ngOnInit() {
1517
2227
  this.pageTitleService.disableReset();
1518
2228
  combineLatest([this.route.queryParams, this.processService.getProcessDefinitions()])
1519
- .pipe(map(([queryParams, processDefinitions]) => ({ queryParams, processDefinitions })))
2229
+ .pipe(map$1(([queryParams, processDefinitions]) => ({ queryParams, processDefinitions })))
1520
2230
  .subscribe(response => {
1521
2231
  this.processDefinitions = response.processDefinitions;
1522
2232
  if (response.queryParams.process) {
@@ -1613,13 +2323,13 @@ class FormLinkProcessDiagramComponent {
1613
2323
  }
1614
2324
  this.version = +version;
1615
2325
  }
1616
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormLinkProcessDiagramComponent, deps: [{ token: i1$3.ProcessService }, { token: i3$1.ActivatedRoute }, { token: i2$2.PageTitleService }], target: i0.ɵɵFactoryTarget.Component }); }
1617
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: FormLinkProcessDiagramComponent, isStandalone: false, selector: "valtimo-form-link-process-diagram", outputs: { bpmnElementModalOpen: "bpmnElementModalOpen", bpmnElementModalClose: "bpmnElementModalClose" }, viewQueries: [{ propertyName: "el", first: true, predicate: ["ref"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"container-fluid\">\n <div class=\"row p-4 bg-white\">\n <div class=\"col\">\n <div #ref class=\"diagram-container\"></div>\n </div>\n </div>\n</div>\n<div class=\"p-4 text-center legenda-holder\">\n <span>Click on a User Task to specify a form definition for that User Task.</span>\n</div>\n\n<ng-container renderInPageHeader [fullWidth]=\"true\">\n <ng-template>\n <div class=\"form-link-dossier-actions\">\n <cds-select [label]=\"'Process'\" (change)=\"setProcessDefinitionKey($event.target.value)\"\n ><option\n *ngFor=\"let processDefinition of processDefinitions\"\n [value]=\"processDefinition.key\"\n [selected]=\"processDefinitionKey === processDefinition.key\"\n >\n {{ processDefinition.name }}\n </option>\n </cds-select>\n <cds-select [label]=\"'Version'\" (change)=\"setProcessDefinitionVersion($event.target.value)\">\n <option\n *ngFor=\"let processDefinitionVersion of processDefinitionVersions\"\n [value]=\"processDefinitionVersion.version\"\n [selected]=\"processDefinitionVersion.version === version\"\n >\n {{ processDefinitionVersion.version }}\n </option>\n </cds-select>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".diagram-container-switch-holder{width:100%;z-index:1000}.diagram-container{height:58vh}.container-fluid{border:1px solid #dee2e6}.options{border-bottom:1px solid #dee2e6}.form-link-dossier-actions{display:flex;flex-direction:row;gap:8px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$2.RenderInPageHeaderDirective, selector: "[renderInPageHeader]", inputs: ["fullWidth"] }, { kind: "component", type: i4.Select, selector: "cds-select, ibm-select", inputs: ["value", "display", "label", "helperText", "invalidText", "warn", "warnText", "id", "size", "disabled", "skeleton", "invalid", "readonly", "theme", "ariaLabel", "fluid"], outputs: ["valueChange"] }, { kind: "directive", type: i4.Option, selector: "option" }] }); }
2326
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormLinkProcessDiagramComponent, deps: [{ token: i1$3.ProcessService }, { token: i3$3.ActivatedRoute }, { token: i2$1.PageTitleService }], target: i0.ɵɵFactoryTarget.Component }); }
2327
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: FormLinkProcessDiagramComponent, isStandalone: false, selector: "valtimo-form-link-process-diagram", outputs: { bpmnElementModalOpen: "bpmnElementModalOpen", bpmnElementModalClose: "bpmnElementModalClose" }, viewQueries: [{ propertyName: "el", first: true, predicate: ["ref"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"container-fluid\">\n <div class=\"row p-4 bg-white\">\n <div class=\"col\">\n <div #ref class=\"diagram-container\"></div>\n </div>\n </div>\n</div>\n<div class=\"p-4 text-center legenda-holder\">\n <span>Click on a User Task to specify a form definition for that User Task.</span>\n</div>\n\n<ng-container renderInPageHeader [fullWidth]=\"true\">\n <ng-template>\n <div class=\"form-link-dossier-actions\">\n <cds-select [label]=\"'Process'\" (change)=\"setProcessDefinitionKey($event.target.value)\"\n ><option\n *ngFor=\"let processDefinition of processDefinitions\"\n [value]=\"processDefinition.key\"\n [selected]=\"processDefinitionKey === processDefinition.key\"\n >\n {{ processDefinition.name }}\n </option>\n </cds-select>\n <cds-select [label]=\"'Version'\" (change)=\"setProcessDefinitionVersion($event.target.value)\">\n <option\n *ngFor=\"let processDefinitionVersion of processDefinitionVersions\"\n [value]=\"processDefinitionVersion.version\"\n [selected]=\"processDefinitionVersion.version === version\"\n >\n {{ processDefinitionVersion.version }}\n </option>\n </cds-select>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".diagram-container-switch-holder{width:100%;z-index:1000}.diagram-container{height:58vh}.container-fluid{border:1px solid #dee2e6}.options{border-bottom:1px solid #dee2e6}.form-link-dossier-actions{display:flex;flex-direction:row;gap:8px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$1.RenderInPageHeaderDirective, selector: "[renderInPageHeader]", inputs: ["fullWidth"] }, { kind: "component", type: i3$2.Select, selector: "cds-select, ibm-select", inputs: ["value", "display", "label", "helperText", "invalidText", "warn", "warnText", "id", "size", "disabled", "skeleton", "invalid", "readonly", "theme", "ariaLabel", "fluid"], outputs: ["valueChange"] }, { kind: "directive", type: i3$2.Option, selector: "option" }] }); }
1618
2328
  }
1619
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormLinkProcessDiagramComponent, decorators: [{
2329
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormLinkProcessDiagramComponent, decorators: [{
1620
2330
  type: Component,
1621
2331
  args: [{ standalone: false, selector: 'valtimo-form-link-process-diagram', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"container-fluid\">\n <div class=\"row p-4 bg-white\">\n <div class=\"col\">\n <div #ref class=\"diagram-container\"></div>\n </div>\n </div>\n</div>\n<div class=\"p-4 text-center legenda-holder\">\n <span>Click on a User Task to specify a form definition for that User Task.</span>\n</div>\n\n<ng-container renderInPageHeader [fullWidth]=\"true\">\n <ng-template>\n <div class=\"form-link-dossier-actions\">\n <cds-select [label]=\"'Process'\" (change)=\"setProcessDefinitionKey($event.target.value)\"\n ><option\n *ngFor=\"let processDefinition of processDefinitions\"\n [value]=\"processDefinition.key\"\n [selected]=\"processDefinitionKey === processDefinition.key\"\n >\n {{ processDefinition.name }}\n </option>\n </cds-select>\n <cds-select [label]=\"'Version'\" (change)=\"setProcessDefinitionVersion($event.target.value)\">\n <option\n *ngFor=\"let processDefinitionVersion of processDefinitionVersions\"\n [value]=\"processDefinitionVersion.version\"\n [selected]=\"processDefinitionVersion.version === version\"\n >\n {{ processDefinitionVersion.version }}\n </option>\n </cds-select>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".diagram-container-switch-holder{width:100%;z-index:1000}.diagram-container{height:58vh}.container-fluid{border:1px solid #dee2e6}.options{border-bottom:1px solid #dee2e6}.form-link-dossier-actions{display:flex;flex-direction:row;gap:8px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1622
- }], ctorParameters: () => [{ type: i1$3.ProcessService }, { type: i3$1.ActivatedRoute }, { type: i2$2.PageTitleService }], propDecorators: { el: [{
2332
+ }], ctorParameters: () => [{ type: i1$3.ProcessService }, { type: i3$3.ActivatedRoute }, { type: i2$1.PageTitleService }], propDecorators: { el: [{
1623
2333
  type: ViewChild,
1624
2334
  args: ['ref']
1625
2335
  }], bpmnElementModalOpen: [{
@@ -1629,7 +2339,541 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
1629
2339
  }] } });
1630
2340
 
1631
2341
  /*
1632
- * Copyright 2015-2025 Ritense BV, the Netherlands.
2342
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
2343
+ *
2344
+ * Licensed under EUPL, Version 1.2 (the "License");
2345
+ * you may not use this file except in compliance with the License.
2346
+ * You may obtain a copy of the License at
2347
+ *
2348
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2349
+ *
2350
+ * Unless required by applicable law or agreed to in writing, software
2351
+ * distributed under the License is distributed on an "AS IS" basis,
2352
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2353
+ * See the License for the specific language governing permissions and
2354
+ * limitations under the License.
2355
+ */
2356
+ class ConfigureBuildingBlockMappingsComponent {
2357
+ getBuildingBlockFieldItemsForRow$(group) {
2358
+ const cached = this._rowItemsCache.get(group);
2359
+ if (cached)
2360
+ return cached;
2361
+ const stream = combineLatest([
2362
+ this.buildingBlockFieldItems$,
2363
+ this.inputsForm.valueChanges.pipe(startWith(this.inputsForm.value)),
2364
+ group.valueChanges.pipe(startWith(group.value)),
2365
+ ]).pipe(map$1(([buildingBlockFieldItems, inputsFormValue, groupValue]) => {
2366
+ const usedInputTargets = inputsFormValue.inputs?.map(input => input.target).filter(Boolean) ?? [];
2367
+ return buildingBlockFieldItems.filter(item => {
2368
+ if (item.id === groupValue.target)
2369
+ return true;
2370
+ return !usedInputTargets.includes(`${item.id}`);
2371
+ });
2372
+ }));
2373
+ this._rowItemsCache.set(group, stream);
2374
+ return stream;
2375
+ }
2376
+ getUsedCaseTargetsForRow$(group) {
2377
+ const cached = this._outputTargetFiltersCache.get(group);
2378
+ if (cached)
2379
+ return cached;
2380
+ const stream = combineLatest([
2381
+ this.outputsForm.valueChanges.pipe(startWith(this.outputsForm.value)),
2382
+ group.valueChanges.pipe(startWith(group.value)),
2383
+ ]).pipe(map$1(([outputsFormValue, groupValue]) => {
2384
+ const allTargets = outputsFormValue.outputs?.map(output => output.target).filter(Boolean) ?? [];
2385
+ return allTargets.filter(target => target !== groupValue.target);
2386
+ }));
2387
+ this._outputTargetFiltersCache.set(group, stream);
2388
+ return stream;
2389
+ }
2390
+ get inputs() {
2391
+ return this.inputsForm.controls.inputs;
2392
+ }
2393
+ get outputs() {
2394
+ return this.outputsForm.controls.outputs;
2395
+ }
2396
+ constructor(fb, buildingBlockStateService, buttonService, stepService, processLinkService, processLinkStateService, translateService, route, changeDetectorRef, buildingBlockApiService, stateService) {
2397
+ this.fb = fb;
2398
+ this.buildingBlockStateService = buildingBlockStateService;
2399
+ this.buttonService = buttonService;
2400
+ this.stepService = stepService;
2401
+ this.processLinkService = processLinkService;
2402
+ this.processLinkStateService = processLinkStateService;
2403
+ this.translateService = translateService;
2404
+ this.route = route;
2405
+ this.changeDetectorRef = changeDetectorRef;
2406
+ this.buildingBlockApiService = buildingBlockApiService;
2407
+ this.stateService = stateService;
2408
+ this.buildingBlockFields$ = this.buildingBlockStateService.buildingBlockFields$;
2409
+ this.buildingBlockFieldItems$ = this.buildingBlockFields$.pipe(map$1(buildingBlockFields => buildingBlockFields.map(buildingBlockField => {
2410
+ return {
2411
+ id: buildingBlockField.name,
2412
+ text: `doc:${buildingBlockField.name}`,
2413
+ };
2414
+ })));
2415
+ this.inputsForm = new FormGroup({
2416
+ inputs: new FormArray([]),
2417
+ });
2418
+ this.outputsForm = new FormGroup({
2419
+ outputs: new FormArray([]),
2420
+ });
2421
+ this._rowItemsCache = new WeakMap();
2422
+ this._outputTargetFiltersCache = new WeakMap();
2423
+ this.syncTimingItems = [
2424
+ {
2425
+ id: 'CONTINUOUS',
2426
+ labelKey: 'processLinkConfiguration.buildingBlock.sync.continuous',
2427
+ },
2428
+ {
2429
+ id: 'END',
2430
+ labelKey: 'processLinkConfiguration.buildingBlock.sync.end',
2431
+ },
2432
+ ];
2433
+ this.params$ = getCaseManagementRouteParams(this.route);
2434
+ this.buildingBlockParams$ = getBuildingBlockManagementRouteParams(this.route);
2435
+ this.ValuePathSelectorPrefix = ValuePathSelectorPrefix;
2436
+ this.sourceIsCase$ = new BehaviorSubject(true);
2437
+ this.sourceIsIndependent$ = new BehaviorSubject(false);
2438
+ /**
2439
+ * Returns the name of the source/target context in mappings.
2440
+ * When in a building block context, shows the parent building block name.
2441
+ * When in a case context, shows the case name.
2442
+ * When in an independent process context, shows the process label.
2443
+ */
2444
+ this.sourceContextName$ = combineLatest([
2445
+ this.params$,
2446
+ this.buildingBlockParams$,
2447
+ ]).pipe(switchMap$1(([caseParams, bbParams]) => {
2448
+ if (bbParams?.buildingBlockDefinitionKey && bbParams?.buildingBlockDefinitionVersionTag) {
2449
+ this.sourceIsCase$.next(false);
2450
+ this.sourceIsIndependent$.next(false);
2451
+ // We're in a building block context - fetch the parent building block name
2452
+ return this.buildingBlockApiService
2453
+ .getBuildingBlockDefinition(bbParams.buildingBlockDefinitionKey, bbParams.buildingBlockDefinitionVersionTag)
2454
+ .pipe(map$1(def => def?.name ?? bbParams.buildingBlockDefinitionKey));
2455
+ }
2456
+ else if (caseParams?.caseDefinitionKey && caseParams?.caseDefinitionVersionTag) {
2457
+ this.sourceIsCase$.next(true);
2458
+ this.sourceIsIndependent$.next(false);
2459
+ // We're in a case context - fetch the case name
2460
+ return this.buildingBlockApiService
2461
+ .getCaseDefinition(caseParams.caseDefinitionKey, caseParams.caseDefinitionVersionTag)
2462
+ .pipe(map$1(def => def?.name ?? caseParams.caseDefinitionKey));
2463
+ }
2464
+ // We're in an independent process context
2465
+ this.sourceIsCase$.next(false);
2466
+ this.sourceIsIndependent$.next(true);
2467
+ return of(this.translateService.instant('processLinkConfiguration.buildingBlock.process'));
2468
+ }));
2469
+ /**
2470
+ * Returns the name of the building block being configured.
2471
+ */
2472
+ this.targetBuildingBlockName$ = combineLatest([
2473
+ this.buildingBlockStateService.definitionKey$,
2474
+ this.buildingBlockStateService.definitionVersionTag$,
2475
+ ]).pipe(switchMap$1(([key, versionTag]) => {
2476
+ if (key && versionTag) {
2477
+ return this.buildingBlockApiService
2478
+ .getBuildingBlockDefinition(key, versionTag)
2479
+ .pipe(map$1(def => def?.name ?? key));
2480
+ }
2481
+ return of(this.translateService.instant('processLinkConfiguration.buildingBlock.buildingBlock'));
2482
+ }));
2483
+ this._subscriptions = new Subscription();
2484
+ this._syncingFromState = false;
2485
+ this._suppressValidation = false;
2486
+ this._inputRefreshHandle = null;
2487
+ this._destroyed = false;
2488
+ this.allInputsMapped$ = combineLatest([
2489
+ this.buildingBlockFields$,
2490
+ this.inputsForm.valueChanges.pipe(startWith(this.inputsForm.value)),
2491
+ ]).pipe(map$1(([fields, inputsFormValue]) => {
2492
+ const allTargets = inputsFormValue.inputs?.map(input => input.target).filter((t) => !!t) ?? [];
2493
+ if (!fields || fields.length === 0) {
2494
+ return false;
2495
+ }
2496
+ return fields.every(field => allTargets.includes(field.name));
2497
+ }));
2498
+ }
2499
+ ngOnInit() {
2500
+ this._subscriptions.add(combineLatest([
2501
+ this.buildingBlockFields$,
2502
+ this.buildingBlockStateService.inputMappings$,
2503
+ ]).subscribe(([fields, mappings]) => {
2504
+ this.syncInputsIfNeeded(fields, mappings);
2505
+ }));
2506
+ this.buildingBlockStateService.outputMappings$.pipe(take(1)).subscribe(mappings => {
2507
+ this.syncOutputsFromState(mappings);
2508
+ });
2509
+ this._subscriptions.add(combineLatest([this.inputsForm.statusChanges, this.outputsForm.statusChanges]).subscribe(() => {
2510
+ this.triggerValidation();
2511
+ }));
2512
+ this.triggerValidation();
2513
+ this._subscriptions.add(this.buttonService.backButtonClick$
2514
+ .pipe(withLatestFrom(this.stateService.isEditing$), filter$1(([, isEditing]) => !isEditing))
2515
+ .subscribe(() => {
2516
+ this.stepService.setConfigureBuildingBlockPluginsStep();
2517
+ }));
2518
+ this._subscriptions.add(this.buttonService.saveButtonClick$.subscribe(() => {
2519
+ this.persistProcessLink();
2520
+ }));
2521
+ this._subscriptions.add(this.outputsForm.valueChanges.subscribe(() => {
2522
+ this.persistOutputFormState();
2523
+ }));
2524
+ this._subscriptions.add(this.inputsForm.valueChanges.subscribe(() => {
2525
+ this.persistInputFormState();
2526
+ }));
2527
+ }
2528
+ ngAfterViewInit() {
2529
+ this.queueInputSourceRefresh();
2530
+ }
2531
+ ngOnDestroy() {
2532
+ this._destroyed = true;
2533
+ if (this._inputRefreshHandle !== null) {
2534
+ clearTimeout(this._inputRefreshHandle);
2535
+ this._inputRefreshHandle = null;
2536
+ }
2537
+ this._subscriptions.unsubscribe();
2538
+ }
2539
+ createInputGroup(mapping) {
2540
+ return new FormGroup({
2541
+ source: new FormControl(mapping?.source ?? '', {
2542
+ nonNullable: true,
2543
+ validators: [Validators.required],
2544
+ }),
2545
+ target: new FormControl(mapping?.target ?? '', {
2546
+ nonNullable: true,
2547
+ validators: [Validators.required],
2548
+ }),
2549
+ });
2550
+ }
2551
+ createOutputGroup(mapping, sourceOverride) {
2552
+ return new FormGroup({
2553
+ source: new FormControl(sourceOverride ?? mapping?.source ?? '', {
2554
+ nonNullable: true,
2555
+ validators: [Validators.required],
2556
+ }),
2557
+ target: new FormControl(mapping?.target ?? '', {
2558
+ nonNullable: true,
2559
+ validators: [Validators.required],
2560
+ }),
2561
+ syncTiming: new FormControl(mapping?.syncTiming ?? 'END', { nonNullable: true, validators: [Validators.required] }),
2562
+ });
2563
+ }
2564
+ addInput() {
2565
+ this.inputs.push(this.createInputGroup());
2566
+ this.persistInputFormState();
2567
+ this.changeDetectorRef.detectChanges();
2568
+ }
2569
+ deleteInput(index) {
2570
+ this.inputs.removeAt(index);
2571
+ this.persistInputFormState();
2572
+ this.changeDetectorRef.detectChanges();
2573
+ }
2574
+ addOutput(source) {
2575
+ this.outputs.push(this.createOutputGroup(undefined, source));
2576
+ this.persistOutputFormState();
2577
+ this.changeDetectorRef.detectChanges();
2578
+ }
2579
+ deleteOutput(index) {
2580
+ this.outputs.removeAt(index);
2581
+ this.persistOutputFormState();
2582
+ }
2583
+ syncInputsFromState(fields, mappings) {
2584
+ this._syncingFromState = true;
2585
+ const requiredTargets = fields.filter(f => f.required).map(f => f.name);
2586
+ const allMappings = [
2587
+ ...requiredTargets.map(target => mappings.find(m => m.target === target) || { target: target, source: '' }),
2588
+ ...mappings.filter(mapping => !requiredTargets.includes(mapping.target)),
2589
+ ];
2590
+ this.inputs.clear();
2591
+ allMappings.forEach(mapping => {
2592
+ this.inputs.push(this.createInputGroup(mapping));
2593
+ });
2594
+ this._syncingFromState = false;
2595
+ this.triggerValidation();
2596
+ this.queueInputSourceRefresh();
2597
+ }
2598
+ syncInputsIfNeeded(fields, mappings) {
2599
+ if (this._syncingFromState) {
2600
+ return;
2601
+ }
2602
+ const requiredTargets = fields.filter(f => f.required).map(f => f.name);
2603
+ const currentTargets = this.inputs.controls
2604
+ .map(group => group.controls.target.value)
2605
+ .filter((target) => !!target) ?? [];
2606
+ const missingRequired = requiredTargets.some(target => !currentTargets.includes(target));
2607
+ const shouldSync = (this.inputs.length === 0 && (mappings.length > 0 || fields.length > 0)) || missingRequired;
2608
+ if (shouldSync) {
2609
+ this.syncInputsFromState(fields, mappings);
2610
+ return;
2611
+ }
2612
+ this.applyMappingSources(mappings);
2613
+ }
2614
+ applyMappingSources(mappings) {
2615
+ const mappingByTarget = new Map(mappings.filter(mapping => !!mapping.target).map(mapping => [mapping.target, mapping]));
2616
+ let updated = false;
2617
+ this._syncingFromState = true;
2618
+ this.inputs.controls.forEach(group => {
2619
+ const target = group.controls.target.value;
2620
+ if (!target)
2621
+ return;
2622
+ const mapping = mappingByTarget.get(target);
2623
+ if (!mapping?.source)
2624
+ return;
2625
+ if (!group.controls.source.value) {
2626
+ group.controls.source.setValue(mapping.source);
2627
+ updated = true;
2628
+ }
2629
+ });
2630
+ this._syncingFromState = false;
2631
+ if (updated) {
2632
+ this.triggerValidation();
2633
+ this.queueInputSourceRefresh();
2634
+ }
2635
+ }
2636
+ queueInputSourceRefresh() {
2637
+ if (this._inputRefreshHandle !== null) {
2638
+ clearTimeout(this._inputRefreshHandle);
2639
+ }
2640
+ this._inputRefreshHandle = window.setTimeout(() => {
2641
+ if (this._destroyed)
2642
+ return;
2643
+ this.inputs.controls.forEach(group => {
2644
+ const value = group.controls.source.value ?? '';
2645
+ group.controls.source.setValue(value, { emitEvent: false });
2646
+ });
2647
+ this.changeDetectorRef.detectChanges();
2648
+ this._inputRefreshHandle = null;
2649
+ }, 0);
2650
+ }
2651
+ isSyncTimingSelected(group, value) {
2652
+ return group.controls.syncTiming.value === value;
2653
+ }
2654
+ syncOutputsFromState(mappings) {
2655
+ this._syncingFromState = true;
2656
+ this.outputs.clear();
2657
+ (mappings || []).forEach(mapping => {
2658
+ this.outputs.push(this.createOutputGroup(mapping));
2659
+ });
2660
+ this._syncingFromState = false;
2661
+ this.triggerValidation();
2662
+ }
2663
+ persistInputFormState() {
2664
+ if (this._syncingFromState) {
2665
+ return;
2666
+ }
2667
+ const mapped = this.inputs.controls.map(group => {
2668
+ return { source: group.value.source, target: group.value.target };
2669
+ });
2670
+ this.buildingBlockStateService.setInputMappings(mapped);
2671
+ this.triggerValidation();
2672
+ }
2673
+ persistOutputFormState() {
2674
+ if (this._syncingFromState) {
2675
+ return;
2676
+ }
2677
+ const mapped = this.outputs.controls.map(group => {
2678
+ return {
2679
+ source: group.value.source,
2680
+ target: group.value.target,
2681
+ syncTiming: (group.value.syncTiming ?? 'END'),
2682
+ };
2683
+ });
2684
+ this.buildingBlockStateService.setOutputMappings(mapped);
2685
+ this.triggerValidation();
2686
+ }
2687
+ isValid() {
2688
+ const fields = this.buildingBlockStateService.getBuildingBlockFieldsSnapshot();
2689
+ this.clearCustomErrors();
2690
+ const inputsValid = this.validateInputs(fields);
2691
+ const outputsValid = this.validateOutputs();
2692
+ const overall = this.inputsForm.valid && this.outputsForm.valid && inputsValid && outputsValid;
2693
+ this.buttonService[overall ? 'enableSaveButton' : 'disableSaveButton']();
2694
+ return overall;
2695
+ }
2696
+ validateInputs(fields) {
2697
+ let valid = true;
2698
+ const requiredTargets = new Set(fields.filter(f => f.required).map(f => f.name));
2699
+ const targetCounts = {};
2700
+ this.inputs.controls.forEach(group => {
2701
+ const target = group.controls.target.value || '';
2702
+ const source = group.controls.source.value || '';
2703
+ if (target) {
2704
+ targetCounts[target] = (targetCounts[target] || 0) + 1;
2705
+ }
2706
+ if (!source) {
2707
+ group.controls.source.setErrors({ required: true });
2708
+ valid = false;
2709
+ }
2710
+ if (!target) {
2711
+ group.controls.target.setErrors({ required: true });
2712
+ valid = false;
2713
+ }
2714
+ });
2715
+ Object.entries(targetCounts).forEach(([target, count]) => {
2716
+ if (count > 1) {
2717
+ this.inputs.controls
2718
+ .filter(g => g.controls.target.value === target)
2719
+ .forEach(g => g.controls.target.setErrors({ duplicateTarget: true }));
2720
+ valid = false;
2721
+ }
2722
+ });
2723
+ requiredTargets.forEach(reqTarget => {
2724
+ const match = this.inputs.controls.find(g => g.controls.target.value === reqTarget);
2725
+ if (!match || !match.controls.source.value) {
2726
+ valid = false;
2727
+ }
2728
+ });
2729
+ return valid;
2730
+ }
2731
+ validateOutputs() {
2732
+ let valid = true;
2733
+ const targetCounts = {};
2734
+ this.outputs.controls.forEach(group => {
2735
+ const target = group.controls.target.value || '';
2736
+ const source = group.controls.source.value || '';
2737
+ const syncTiming = group.controls.syncTiming.value;
2738
+ if (target) {
2739
+ targetCounts[target] = (targetCounts[target] || 0) + 1;
2740
+ }
2741
+ if (!source) {
2742
+ group.controls.source.setErrors({ required: true });
2743
+ valid = false;
2744
+ }
2745
+ if (!target) {
2746
+ group.controls.target.setErrors({ required: true });
2747
+ valid = false;
2748
+ }
2749
+ if (!syncTiming) {
2750
+ group.controls.syncTiming.setErrors({ required: true });
2751
+ valid = false;
2752
+ }
2753
+ });
2754
+ Object.entries(targetCounts).forEach(([target, count]) => {
2755
+ if (count > 1) {
2756
+ this.outputs.controls
2757
+ .filter(g => g.controls.target.value === target)
2758
+ .forEach(g => g.controls.target.setErrors({ duplicateTarget: true }));
2759
+ valid = false;
2760
+ }
2761
+ });
2762
+ return valid;
2763
+ }
2764
+ clearCustomErrors() {
2765
+ this.inputs.controls.forEach(group => {
2766
+ group.controls.source.setErrors(null);
2767
+ group.controls.target.setErrors(null);
2768
+ });
2769
+ this.outputs.controls.forEach(group => {
2770
+ group.controls.source.setErrors(null);
2771
+ group.controls.target.setErrors(null);
2772
+ group.controls.syncTiming.setErrors(null);
2773
+ });
2774
+ }
2775
+ triggerValidation() {
2776
+ if (this._suppressValidation)
2777
+ return;
2778
+ this._suppressValidation = true;
2779
+ Promise.resolve().then(() => {
2780
+ this.isValid();
2781
+ this._suppressValidation = false;
2782
+ });
2783
+ }
2784
+ persistProcessLink() {
2785
+ if (!this.isValid()) {
2786
+ this.buttonService.disableSaveButton();
2787
+ return;
2788
+ }
2789
+ this.buttonService.disableSaveButton();
2790
+ this.processLinkStateService.startSaving();
2791
+ this.processLinkStateService.selectedProcessLink$
2792
+ .pipe(take(1))
2793
+ .subscribe(selectedProcessLink => {
2794
+ if (selectedProcessLink && selectedProcessLink.processLinkType === 'building-block') {
2795
+ this.updateProcessLink(selectedProcessLink);
2796
+ }
2797
+ else {
2798
+ this.createProcessLink();
2799
+ }
2800
+ });
2801
+ }
2802
+ createProcessLink() {
2803
+ this.processLinkStateService.modalParams$.pipe(take(1)).subscribe(modalParams => {
2804
+ const { key, versionTag } = this.buildingBlockStateService.getDefinitionSnapshot();
2805
+ if (!modalParams || !key || !versionTag) {
2806
+ this.processLinkStateService.stopSaving();
2807
+ return;
2808
+ }
2809
+ const activityId = modalParams.element?.id;
2810
+ if (!activityId) {
2811
+ this.processLinkStateService.stopSaving();
2812
+ return;
2813
+ }
2814
+ const request = {
2815
+ processDefinitionId: modalParams.processDefinitionId ?? '-',
2816
+ activityId,
2817
+ activityType: modalParams.element?.activityListenerType ?? '',
2818
+ processLinkType: 'building-block',
2819
+ buildingBlockDefinitionKey: key,
2820
+ buildingBlockDefinitionVersionTag: versionTag,
2821
+ pluginConfigurationMappings: this.buildingBlockStateService.getPluginConfigurationMappingsSnapshot(),
2822
+ inputMappings: this.buildingBlockStateService.getInputMappingsSnapshot(),
2823
+ outputMappings: this.buildingBlockStateService.getOutputMappingsSnapshot(),
2824
+ };
2825
+ this.processLinkStateService.sendProcessLinkCreateEvent(request);
2826
+ });
2827
+ }
2828
+ updateProcessLink(processLink) {
2829
+ this.processLinkStateService.modalParams$.pipe(take(1)).subscribe(modalParams => {
2830
+ const { key, versionTag } = this.buildingBlockStateService.getDefinitionSnapshot();
2831
+ if (!modalParams || !key || !versionTag) {
2832
+ this.processLinkStateService.stopSaving();
2833
+ return;
2834
+ }
2835
+ const activityId = modalParams.element?.id;
2836
+ const request = {
2837
+ id: processLink.id,
2838
+ activityId: activityId,
2839
+ processLinkType: 'building-block',
2840
+ buildingBlockDefinitionKey: key,
2841
+ buildingBlockDefinitionVersionTag: versionTag,
2842
+ pluginConfigurationMappings: this.buildingBlockStateService.getPluginConfigurationMappingsSnapshot(),
2843
+ inputMappings: this.buildingBlockStateService.getInputMappingsSnapshot(),
2844
+ outputMappings: this.buildingBlockStateService.getOutputMappingsSnapshot(),
2845
+ };
2846
+ this.processLinkStateService.sendProcessLinkUpdateEvent(request);
2847
+ });
2848
+ }
2849
+ isRequiredTarget(fields, target) {
2850
+ if (!fields)
2851
+ return false;
2852
+ return fields.some(field => field.required && field.name === target);
2853
+ }
2854
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ConfigureBuildingBlockMappingsComponent, deps: [{ token: i1$2.FormBuilder }, { token: BuildingBlockStateService }, { token: ProcessLinkButtonService }, { token: ProcessLinkStepService }, { token: ProcessLinkService }, { token: ProcessLinkStateService }, { token: i3.TranslateService }, { token: i3$3.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: ProcessLinkBuildingBlockApiService }, { token: ProcessLinkStateService }], target: i0.ɵɵFactoryTarget.Component }); }
2855
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: ConfigureBuildingBlockMappingsComponent, isStandalone: true, selector: "valtimo-configure-building-block-mappings", ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n@let obs =\n {\n fields: (buildingBlockFields$ | async),\n fieldItems: (buildingBlockFieldItems$ | async),\n params: (params$ | async),\n buildingBlockParams: (buildingBlockParams$ | async),\n sourceContextName: (sourceContextName$ | async),\n targetBuildingBlockName: (targetBuildingBlockName$ | async),\n sourceIsCase: (sourceIsCase$ | async),\n sourceIsIndependent: (sourceIsIndependent$ | async),\n caseLabelTranslation: ('Case' | translate),\n processLabelTranslation: ('processLinkConfiguration.buildingBlock.process' | translate),\n buildingBlockLabelTranslation:\n ('processLinkConfiguration.buildingBlock.selectLabel' | translate),\n };\n\n<div class=\"mapping-step\">\n <section class=\"mapping-section\">\n <h4 class=\"section-header\">\n {{ 'processLinkConfiguration.buildingBlock.inputTitle' | translate }}\n </h4>\n\n <div class=\"mapping-table\" [formGroup]=\"inputsForm\">\n <div class=\"mapping-header input\">\n <v-input-label\n [title]=\"\n (obs.sourceIsIndependent\n ? obs.processLabelTranslation\n : obs.sourceIsCase\n ? obs.caseLabelTranslation\n : obs.buildingBlockLabelTranslation) +\n (obs.sourceIsIndependent ? '' : ': ' + obs.sourceContextName)\n \"\n />\n\n <v-input-label\n [title]=\"obs.buildingBlockLabelTranslation + ': ' + obs.targetBuildingBlockName\"\n />\n </div>\n\n <div formArrayName=\"inputs\">\n @for (group of inputs.controls; let inputIndex = $index; track inputIndex) {\n <div class=\"mapping-row input\" [formGroup]=\"group\">\n <div class=\"mapping-part\">\n @if (obs.sourceIsIndependent) {\n <input [cdsLayer]=\"2\" cdsText formControlName=\"source\" [placeholder]=\"'pv:'\" />\n } @else {\n <valtimo-value-path-selector\n [cdsLayer]=\"2\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n [caseDefinitionKey]=\"obs.params?.caseDefinitionKey\"\n [caseDefinitionVersionTag]=\"obs.params?.caseDefinitionVersionTag\"\n [buildingBlockDefinitionKey]=\"obs.buildingBlockParams?.buildingBlockDefinitionKey\"\n [buildingBlockDefinitionVersionTag]=\"\n obs.buildingBlockParams?.buildingBlockDefinitionVersionTag\n \"\n [appendInline]=\"false\"\n [dropUp]=\"false\"\n [formControl]=\"group.get('source')\"\n ></valtimo-value-path-selector>\n }\n\n <div class=\"arrow\">\u2192</div>\n </div>\n\n <div class=\"mapping-part\">\n <div class=\"mapping-cell\">\n @if (isRequiredTarget(obs.fields, group.get('target')?.value)) {\n <div class=\"required-target\">\n {{ 'doc:' + group.get('target')?.value }}\n </div>\n } @else {\n <v-select\n [cdsLayer]=\"2\"\n [appendInline]=\"false\"\n formControlName=\"target\"\n [placeholder]=\"\n 'processLinkConfiguration.buildingBlock.selectedBuildingBlockFieldPlaceholder'\n | translate\n \"\n [items]=\"getBuildingBlockFieldItemsForRow$(group) | async\"\n [dropUp]=\"false\"\n >\n </v-select>\n }\n </div>\n\n <div class=\"mapping-cell-actions\">\n @if (!isRequiredTarget(obs.fields, group.get('target')?.value)) {\n <button\n cdsButton=\"danger--ghost\"\n iconOnly\n size=\"sm\"\n (click)=\"deleteInput(inputIndex)\"\n >\n <svg cdsIcon=\"trash-can\" class=\"cds--btn__icon\" size=\"16\"></svg>\n </button>\n } @else {\n <div class=\"required-indicator\">*</div>\n\n <div>\n {{ 'interface.required' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <button\n cdsButton=\"tertiary\"\n size=\"sm\"\n (click)=\"addInput()\"\n [title]=\"'processLinkConfiguration.buildingBlock.addInput' | translate\"\n [disabled]=\"allInputsMapped$ | async\"\n >\n {{ 'processLinkConfiguration.buildingBlock.addInput' | translate }}\n\n <svg cdsIcon=\"add\" class=\"cds--btn__icon\" size=\"16\"></svg>\n </button>\n </section>\n\n <section class=\"mapping-section\">\n <h4 class=\"section-header\">\n {{ 'processLinkConfiguration.buildingBlock.outputTitle' | translate }}\n </h4>\n\n <div class=\"mapping-table\" [formGroup]=\"outputsForm\">\n <div class=\"mapping-header output\">\n <v-input-label\n [title]=\"obs.buildingBlockLabelTranslation + ': ' + obs.targetBuildingBlockName\"\n />\n\n <v-input-label\n [title]=\"\n (obs.sourceIsIndependent\n ? obs.processLabelTranslation\n : obs.sourceIsCase\n ? obs.caseLabelTranslation\n : obs.buildingBlockLabelTranslation) +\n (obs.sourceIsIndependent ? '' : ': ' + obs.sourceContextName)\n \"\n />\n\n <div class=\"sync-options\" [style.display]=\"'none'\">\n <v-input-label\n [title]=\"'processLinkConfiguration.buildingBlock.sync.title' | translate\"\n />\n </div>\n </div>\n\n <div formArrayName=\"outputs\">\n @for (group of outputs.controls; let outputIndex = $index; track outputIndex) {\n <div class=\"mapping-row output\" [formGroup]=\"group\">\n <div class=\"mapping-part\">\n <div class=\"mapping-cell\">\n <v-select\n [cdsLayer]=\"2\"\n [appendInline]=\"false\"\n formControlName=\"source\"\n [items]=\"obs.fieldItems || []\"\n [placeholder]=\"\n 'processLinkConfiguration.buildingBlock.selectedBuildingBlockFieldPlaceholder'\n | translate\n \"\n [dropUp]=\"true\"\n >\n </v-select>\n </div>\n\n <div class=\"arrow\">\u2192</div>\n </div>\n\n <div class=\"mapping-part\">\n @if (obs.sourceIsIndependent) {\n <input [cdsLayer]=\"2\" cdsText formControlName=\"target\" [placeholder]=\"'pv:'\" />\n } @else {\n <valtimo-value-path-selector\n [cdsLayer]=\"2\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n [caseDefinitionKey]=\"obs.params?.caseDefinitionKey\"\n [caseDefinitionVersionTag]=\"obs.params?.caseDefinitionVersionTag\"\n [buildingBlockDefinitionKey]=\"obs.buildingBlockParams?.buildingBlockDefinitionKey\"\n [buildingBlockDefinitionVersionTag]=\"\n obs.buildingBlockParams?.buildingBlockDefinitionVersionTag\n \"\n [formControl]=\"group.get('target')\"\n [appendInline]=\"false\"\n [filterItems]=\"getUsedCaseTargetsForRow$(group) | async\"\n [dropUp]=\"true\"\n ></valtimo-value-path-selector>\n }\n </div>\n\n <div class=\"mapping-part\">\n <div class=\"mapping-cell\" [style.display]=\"'none'\">\n <cds-radio-group\n class=\"sync-radio-group\"\n formControlName=\"syncTiming\"\n [attr.name]=\"'syncTiming-' + outputIndex\"\n >\n @for (item of syncTimingItems; track item.id) {\n <cds-radio [value]=\"item.id\" [checked]=\"isSyncTimingSelected(group, item.id)\">\n {{ item.labelKey | translate }}\n </cds-radio>\n }\n </cds-radio-group>\n </div>\n\n <div class=\"mapping-cell-actions\">\n <button\n cdsButton=\"danger--ghost\"\n iconOnly\n size=\"sm\"\n (click)=\"deleteOutput(outputIndex)\"\n >\n <svg cdsIcon=\"trash-can\" class=\"cds--btn__icon\" size=\"16\"></svg>\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <button\n cdsButton=\"tertiary\"\n size=\"sm\"\n (click)=\"addOutput()\"\n [title]=\"'processLinkConfiguration.buildingBlock.addOutput' | translate\"\n >\n {{ 'processLinkConfiguration.buildingBlock.addOutput' | translate }}\n\n <svg cdsIcon=\"add\" class=\"cds--btn__icon\" size=\"16\"></svg>\n </button>\n </section>\n</div>\n", styles: [".section-header{font-size:14px;line-height:18px;font-weight:600}.mapping-section{margin-bottom:16px}.mapping-row,.mapping-header{display:grid;align-items:center}.mapping-row.input,.mapping-header.input{grid-template-columns:1fr 1fr}.mapping-row.output,.mapping-header.output{grid-template-columns:5fr 6fr 58px}.mapping-header .output .sync-options{padding-left:10px;display:flex}.mapping-row{margin-bottom:8px;padding:8px;background-color:var(--cds-layer)}.mapping-row .mapping-part{display:flex}.mapping-row .arrow{text-align:center;width:40px;line-height:40px;font-size:large}.mapping-row .mapping-cell{flex:1;min-width:0}.mapping-row .mapping-cell-actions{display:flex;align-self:flex-end;text-transform:capitalize;margin-left:10px}.mapping-row .mapping-cell-actions .required-indicator{margin:0 5px;color:var(--cds-text-error)}.mapping-row .mapping-cell-actions button{margin-bottom:5px}.mapping-row .mapping-cell-actions button ::ng-deep .cds--btn__icon{margin:0!important}.mapping-row .sync-radio-group{padding-left:10px;margin-top:8px}.mapping-row .sync-radio-group .sync-radio:first-child{margin-right:0}.mapping-row .sync-radio-group ::ng-deep .cds--radio-button__label{justify-content:normal}::ng-deep .process-link-modal-container .cds--modal-container{max-width:1280px}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1$2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: ComboBoxModule }, { kind: "ngmodule", type: RadioModule }, { kind: "component", type: i3$2.Radio, selector: "cds-radio, ibm-radio", inputs: ["checked", "name", "disabled", "labelPlacement", "ariaLabelledby", "ariaLabel", "required", "value", "skeleton", "id"], outputs: ["change"] }, { kind: "component", type: i3$2.RadioGroup, selector: "cds-radio-group, ibm-radio-group", inputs: ["selected", "value", "name", "disabled", "skeleton", "orientation", "labelPlacement", "legend", "ariaLabel", "ariaLabelledby", "helperText", "invalid", "invalidText", "warn", "warnText"], outputs: ["change"] }, { kind: "ngmodule", type: InputModule }, { kind: "directive", type: i3$2.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "component", type: ValuePathSelectorComponent, selector: "valtimo-value-path-selector", inputs: ["name", "appendInline", "margin", "marginLg", "marginXl", "disabled", "caseDefinitionKey", "caseDefinitionVersionTag", "buildingBlockDefinitionKey", "buildingBlockDefinitionVersionTag", "prefixes", "label", "tooltip", "required", "showCaseDefinitionSelector", "notation", "dropUp", "defaultValue", "type", "parentItem", "filterItems"], outputs: ["valueChangeEvent", "collectionSelected"] }, { kind: "ngmodule", type: InputLabelModule }, { kind: "component", type: i2$1.InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i3$2.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i3$2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i2$1.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "ngmodule", type: LayerModule }, { kind: "directive", type: i3$2.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2856
+ }
2857
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ConfigureBuildingBlockMappingsComponent, decorators: [{
2858
+ type: Component,
2859
+ args: [{ standalone: true, selector: 'valtimo-configure-building-block-mappings', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
2860
+ CommonModule,
2861
+ ReactiveFormsModule,
2862
+ ComboBoxModule,
2863
+ RadioModule,
2864
+ InputModule,
2865
+ ValuePathSelectorComponent,
2866
+ InputLabelModule,
2867
+ TranslateModule,
2868
+ ButtonModule,
2869
+ IconModule,
2870
+ SelectModule,
2871
+ LayerModule,
2872
+ ], template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n@let obs =\n {\n fields: (buildingBlockFields$ | async),\n fieldItems: (buildingBlockFieldItems$ | async),\n params: (params$ | async),\n buildingBlockParams: (buildingBlockParams$ | async),\n sourceContextName: (sourceContextName$ | async),\n targetBuildingBlockName: (targetBuildingBlockName$ | async),\n sourceIsCase: (sourceIsCase$ | async),\n sourceIsIndependent: (sourceIsIndependent$ | async),\n caseLabelTranslation: ('Case' | translate),\n processLabelTranslation: ('processLinkConfiguration.buildingBlock.process' | translate),\n buildingBlockLabelTranslation:\n ('processLinkConfiguration.buildingBlock.selectLabel' | translate),\n };\n\n<div class=\"mapping-step\">\n <section class=\"mapping-section\">\n <h4 class=\"section-header\">\n {{ 'processLinkConfiguration.buildingBlock.inputTitle' | translate }}\n </h4>\n\n <div class=\"mapping-table\" [formGroup]=\"inputsForm\">\n <div class=\"mapping-header input\">\n <v-input-label\n [title]=\"\n (obs.sourceIsIndependent\n ? obs.processLabelTranslation\n : obs.sourceIsCase\n ? obs.caseLabelTranslation\n : obs.buildingBlockLabelTranslation) +\n (obs.sourceIsIndependent ? '' : ': ' + obs.sourceContextName)\n \"\n />\n\n <v-input-label\n [title]=\"obs.buildingBlockLabelTranslation + ': ' + obs.targetBuildingBlockName\"\n />\n </div>\n\n <div formArrayName=\"inputs\">\n @for (group of inputs.controls; let inputIndex = $index; track inputIndex) {\n <div class=\"mapping-row input\" [formGroup]=\"group\">\n <div class=\"mapping-part\">\n @if (obs.sourceIsIndependent) {\n <input [cdsLayer]=\"2\" cdsText formControlName=\"source\" [placeholder]=\"'pv:'\" />\n } @else {\n <valtimo-value-path-selector\n [cdsLayer]=\"2\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n [caseDefinitionKey]=\"obs.params?.caseDefinitionKey\"\n [caseDefinitionVersionTag]=\"obs.params?.caseDefinitionVersionTag\"\n [buildingBlockDefinitionKey]=\"obs.buildingBlockParams?.buildingBlockDefinitionKey\"\n [buildingBlockDefinitionVersionTag]=\"\n obs.buildingBlockParams?.buildingBlockDefinitionVersionTag\n \"\n [appendInline]=\"false\"\n [dropUp]=\"false\"\n [formControl]=\"group.get('source')\"\n ></valtimo-value-path-selector>\n }\n\n <div class=\"arrow\">\u2192</div>\n </div>\n\n <div class=\"mapping-part\">\n <div class=\"mapping-cell\">\n @if (isRequiredTarget(obs.fields, group.get('target')?.value)) {\n <div class=\"required-target\">\n {{ 'doc:' + group.get('target')?.value }}\n </div>\n } @else {\n <v-select\n [cdsLayer]=\"2\"\n [appendInline]=\"false\"\n formControlName=\"target\"\n [placeholder]=\"\n 'processLinkConfiguration.buildingBlock.selectedBuildingBlockFieldPlaceholder'\n | translate\n \"\n [items]=\"getBuildingBlockFieldItemsForRow$(group) | async\"\n [dropUp]=\"false\"\n >\n </v-select>\n }\n </div>\n\n <div class=\"mapping-cell-actions\">\n @if (!isRequiredTarget(obs.fields, group.get('target')?.value)) {\n <button\n cdsButton=\"danger--ghost\"\n iconOnly\n size=\"sm\"\n (click)=\"deleteInput(inputIndex)\"\n >\n <svg cdsIcon=\"trash-can\" class=\"cds--btn__icon\" size=\"16\"></svg>\n </button>\n } @else {\n <div class=\"required-indicator\">*</div>\n\n <div>\n {{ 'interface.required' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <button\n cdsButton=\"tertiary\"\n size=\"sm\"\n (click)=\"addInput()\"\n [title]=\"'processLinkConfiguration.buildingBlock.addInput' | translate\"\n [disabled]=\"allInputsMapped$ | async\"\n >\n {{ 'processLinkConfiguration.buildingBlock.addInput' | translate }}\n\n <svg cdsIcon=\"add\" class=\"cds--btn__icon\" size=\"16\"></svg>\n </button>\n </section>\n\n <section class=\"mapping-section\">\n <h4 class=\"section-header\">\n {{ 'processLinkConfiguration.buildingBlock.outputTitle' | translate }}\n </h4>\n\n <div class=\"mapping-table\" [formGroup]=\"outputsForm\">\n <div class=\"mapping-header output\">\n <v-input-label\n [title]=\"obs.buildingBlockLabelTranslation + ': ' + obs.targetBuildingBlockName\"\n />\n\n <v-input-label\n [title]=\"\n (obs.sourceIsIndependent\n ? obs.processLabelTranslation\n : obs.sourceIsCase\n ? obs.caseLabelTranslation\n : obs.buildingBlockLabelTranslation) +\n (obs.sourceIsIndependent ? '' : ': ' + obs.sourceContextName)\n \"\n />\n\n <div class=\"sync-options\" [style.display]=\"'none'\">\n <v-input-label\n [title]=\"'processLinkConfiguration.buildingBlock.sync.title' | translate\"\n />\n </div>\n </div>\n\n <div formArrayName=\"outputs\">\n @for (group of outputs.controls; let outputIndex = $index; track outputIndex) {\n <div class=\"mapping-row output\" [formGroup]=\"group\">\n <div class=\"mapping-part\">\n <div class=\"mapping-cell\">\n <v-select\n [cdsLayer]=\"2\"\n [appendInline]=\"false\"\n formControlName=\"source\"\n [items]=\"obs.fieldItems || []\"\n [placeholder]=\"\n 'processLinkConfiguration.buildingBlock.selectedBuildingBlockFieldPlaceholder'\n | translate\n \"\n [dropUp]=\"true\"\n >\n </v-select>\n </div>\n\n <div class=\"arrow\">\u2192</div>\n </div>\n\n <div class=\"mapping-part\">\n @if (obs.sourceIsIndependent) {\n <input [cdsLayer]=\"2\" cdsText formControlName=\"target\" [placeholder]=\"'pv:'\" />\n } @else {\n <valtimo-value-path-selector\n [cdsLayer]=\"2\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n [caseDefinitionKey]=\"obs.params?.caseDefinitionKey\"\n [caseDefinitionVersionTag]=\"obs.params?.caseDefinitionVersionTag\"\n [buildingBlockDefinitionKey]=\"obs.buildingBlockParams?.buildingBlockDefinitionKey\"\n [buildingBlockDefinitionVersionTag]=\"\n obs.buildingBlockParams?.buildingBlockDefinitionVersionTag\n \"\n [formControl]=\"group.get('target')\"\n [appendInline]=\"false\"\n [filterItems]=\"getUsedCaseTargetsForRow$(group) | async\"\n [dropUp]=\"true\"\n ></valtimo-value-path-selector>\n }\n </div>\n\n <div class=\"mapping-part\">\n <div class=\"mapping-cell\" [style.display]=\"'none'\">\n <cds-radio-group\n class=\"sync-radio-group\"\n formControlName=\"syncTiming\"\n [attr.name]=\"'syncTiming-' + outputIndex\"\n >\n @for (item of syncTimingItems; track item.id) {\n <cds-radio [value]=\"item.id\" [checked]=\"isSyncTimingSelected(group, item.id)\">\n {{ item.labelKey | translate }}\n </cds-radio>\n }\n </cds-radio-group>\n </div>\n\n <div class=\"mapping-cell-actions\">\n <button\n cdsButton=\"danger--ghost\"\n iconOnly\n size=\"sm\"\n (click)=\"deleteOutput(outputIndex)\"\n >\n <svg cdsIcon=\"trash-can\" class=\"cds--btn__icon\" size=\"16\"></svg>\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <button\n cdsButton=\"tertiary\"\n size=\"sm\"\n (click)=\"addOutput()\"\n [title]=\"'processLinkConfiguration.buildingBlock.addOutput' | translate\"\n >\n {{ 'processLinkConfiguration.buildingBlock.addOutput' | translate }}\n\n <svg cdsIcon=\"add\" class=\"cds--btn__icon\" size=\"16\"></svg>\n </button>\n </section>\n</div>\n", styles: [".section-header{font-size:14px;line-height:18px;font-weight:600}.mapping-section{margin-bottom:16px}.mapping-row,.mapping-header{display:grid;align-items:center}.mapping-row.input,.mapping-header.input{grid-template-columns:1fr 1fr}.mapping-row.output,.mapping-header.output{grid-template-columns:5fr 6fr 58px}.mapping-header .output .sync-options{padding-left:10px;display:flex}.mapping-row{margin-bottom:8px;padding:8px;background-color:var(--cds-layer)}.mapping-row .mapping-part{display:flex}.mapping-row .arrow{text-align:center;width:40px;line-height:40px;font-size:large}.mapping-row .mapping-cell{flex:1;min-width:0}.mapping-row .mapping-cell-actions{display:flex;align-self:flex-end;text-transform:capitalize;margin-left:10px}.mapping-row .mapping-cell-actions .required-indicator{margin:0 5px;color:var(--cds-text-error)}.mapping-row .mapping-cell-actions button{margin-bottom:5px}.mapping-row .mapping-cell-actions button ::ng-deep .cds--btn__icon{margin:0!important}.mapping-row .sync-radio-group{padding-left:10px;margin-top:8px}.mapping-row .sync-radio-group .sync-radio:first-child{margin-right:0}.mapping-row .sync-radio-group ::ng-deep .cds--radio-button__label{justify-content:normal}::ng-deep .process-link-modal-container .cds--modal-container{max-width:1280px}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
2873
+ }], ctorParameters: () => [{ type: i1$2.FormBuilder }, { type: BuildingBlockStateService }, { type: ProcessLinkButtonService }, { type: ProcessLinkStepService }, { type: ProcessLinkService }, { type: ProcessLinkStateService }, { type: i3.TranslateService }, { type: i3$3.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: ProcessLinkBuildingBlockApiService }, { type: ProcessLinkStateService }] });
2874
+
2875
+ /*
2876
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
1633
2877
  *
1634
2878
  * Licensed under EUPL, Version 1.2 (the "License");
1635
2879
  * you may not use this file except in compliance with the License.
@@ -1648,15 +2892,22 @@ class ChooseProcessLinkTypeComponent {
1648
2892
  this.processLinkStateService = processLinkStateService;
1649
2893
  this.availableProcessLinkTypes$ = this.processLinkStateService.availableProcessLinkTypes$;
1650
2894
  }
2895
+ getTooltipKey(processLinkTypeId) {
2896
+ if (this.processLinkStateService.isBuildingBlockContext() &&
2897
+ UNSUPPORTED_PROCESS_LINK_TYPES_IN_BUILDING_BLOCK.includes(processLinkTypeId)) {
2898
+ return 'processLinkTypeDisabledTooltip.buildingBlockUnsupported';
2899
+ }
2900
+ return 'processLinkTypeDisabledTooltip.' + processLinkTypeId;
2901
+ }
1651
2902
  selectProcessLinkType(processLinkTypeId) {
1652
2903
  this.processLinkStateService.selectProcessLinkType(processLinkTypeId);
1653
2904
  }
1654
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ChooseProcessLinkTypeComponent, deps: [{ token: ProcessLinkStateService }], target: i0.ɵɵFactoryTarget.Component }); }
1655
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: ChooseProcessLinkTypeComponent, isStandalone: false, selector: "valtimo-choose-process-link-type", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n availableProcessLinkTypes: availableProcessLinkTypes$ | async,\n } as obs\"\n>\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.chooseProcessLinkTypeDescription' | translate }}\n </p>\n <div class=\"process-link-grid\">\n <div\n class=\"process-link-item\"\n *ngFor=\"let availableProcessLinkType of obs.availableProcessLinkTypes\"\n >\n <ng-container *ngIf=\"availableProcessLinkType.processLinkType as processLinkTypeId\">\n <button\n (click)=\"selectProcessLinkType(processLinkTypeId)\"\n cdsButton=\"secondary\"\n size=\"xl\"\n class=\"process-link-type-button\"\n [disabled]=\"!availableProcessLinkType.enabled\"\n [vTooltip]=\"'processLinkTypeDisabledTooltip.' + processLinkTypeId | translate\"\n [onBottom]=\"true\"\n [tooltipDisabled]=\"availableProcessLinkType.enabled\"\n >\n {{ 'processLinkType.' + processLinkTypeId | translate }}\n <svg\n *ngIf=\"processLinkTypeId === 'plugin'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"link\"\n size=\"16\"\n ></svg>\n <svg\n *ngIf=\"processLinkTypeId === 'form'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"receipt\"\n size=\"16\"\n ></svg>\n <svg\n *ngIf=\"processLinkTypeId === 'form-flow'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"flow--data\"\n size=\"16\"\n ></svg>\n <svg\n *ngIf=\"processLinkTypeId === 'ui-component'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"receipt\"\n size=\"16\"\n ></svg>\n </button>\n </ng-container>\n </div>\n </div>\n</ng-container>\n", styles: [".process-link-type-button{width:100%}.process-link-grid{margin-top:24px;display:flex;justify-content:flex-start;width:100%;flex-wrap:wrap;gap:8px}.process-link-item{flex-basis:calc(33.3% - 5.3333333333px)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i4.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i2$2.TooltipDirective, selector: "[vTooltip]", inputs: ["vTooltip", "onBottom", "tooltipDisabled"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] }); }
2905
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ChooseProcessLinkTypeComponent, deps: [{ token: ProcessLinkStateService }], target: i0.ɵɵFactoryTarget.Component }); }
2906
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: ChooseProcessLinkTypeComponent, isStandalone: false, selector: "valtimo-choose-process-link-type", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n availableProcessLinkTypes: availableProcessLinkTypes$ | async,\n } as obs\"\n>\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.chooseProcessLinkTypeDescription' | translate }}\n </p>\n <div class=\"process-link-grid\">\n <div\n class=\"process-link-item\"\n *ngFor=\"let availableProcessLinkType of obs.availableProcessLinkTypes\"\n >\n <ng-container *ngIf=\"availableProcessLinkType.processLinkType as processLinkTypeId\">\n <button\n (click)=\"selectProcessLinkType(processLinkTypeId)\"\n cdsButton=\"secondary\"\n size=\"xl\"\n class=\"process-link-type-button\"\n [disabled]=\"!availableProcessLinkType.enabled\"\n [vTooltip]=\"getTooltipKey(processLinkTypeId) | translate\"\n [onBottom]=\"true\"\n [tooltipDisabled]=\"availableProcessLinkType.enabled\"\n >\n {{ 'processLinkType.' + processLinkTypeId | translate }}\n <svg\n *ngIf=\"processLinkTypeId === 'plugin'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"link\"\n size=\"16\"\n ></svg>\n <svg\n *ngIf=\"processLinkTypeId === 'form'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"receipt\"\n size=\"16\"\n ></svg>\n <svg\n *ngIf=\"processLinkTypeId === 'form-flow'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"flow--data\"\n size=\"16\"\n ></svg>\n <svg\n *ngIf=\"processLinkTypeId === 'ui-component'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"receipt\"\n size=\"16\"\n ></svg>\n </button>\n </ng-container>\n </div>\n </div>\n</ng-container>\n", styles: [".process-link-type-button{width:100%}.process-link-grid{margin-top:24px;display:flex;justify-content:flex-start;width:100%;flex-wrap:wrap;gap:8px}.process-link-item{flex-basis:calc(33.3% - 5.3333333333px)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$2.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i3$2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i2$1.TooltipDirective, selector: "[vTooltip]", inputs: ["vTooltip", "onBottom", "tooltipDisabled"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
1656
2907
  }
1657
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ChooseProcessLinkTypeComponent, decorators: [{
2908
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ChooseProcessLinkTypeComponent, decorators: [{
1658
2909
  type: Component,
1659
- args: [{ standalone: false, selector: 'valtimo-choose-process-link-type', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n availableProcessLinkTypes: availableProcessLinkTypes$ | async,\n } as obs\"\n>\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.chooseProcessLinkTypeDescription' | translate }}\n </p>\n <div class=\"process-link-grid\">\n <div\n class=\"process-link-item\"\n *ngFor=\"let availableProcessLinkType of obs.availableProcessLinkTypes\"\n >\n <ng-container *ngIf=\"availableProcessLinkType.processLinkType as processLinkTypeId\">\n <button\n (click)=\"selectProcessLinkType(processLinkTypeId)\"\n cdsButton=\"secondary\"\n size=\"xl\"\n class=\"process-link-type-button\"\n [disabled]=\"!availableProcessLinkType.enabled\"\n [vTooltip]=\"'processLinkTypeDisabledTooltip.' + processLinkTypeId | translate\"\n [onBottom]=\"true\"\n [tooltipDisabled]=\"availableProcessLinkType.enabled\"\n >\n {{ 'processLinkType.' + processLinkTypeId | translate }}\n <svg\n *ngIf=\"processLinkTypeId === 'plugin'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"link\"\n size=\"16\"\n ></svg>\n <svg\n *ngIf=\"processLinkTypeId === 'form'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"receipt\"\n size=\"16\"\n ></svg>\n <svg\n *ngIf=\"processLinkTypeId === 'form-flow'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"flow--data\"\n size=\"16\"\n ></svg>\n <svg\n *ngIf=\"processLinkTypeId === 'ui-component'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"receipt\"\n size=\"16\"\n ></svg>\n </button>\n </ng-container>\n </div>\n </div>\n</ng-container>\n", styles: [".process-link-type-button{width:100%}.process-link-grid{margin-top:24px;display:flex;justify-content:flex-start;width:100%;flex-wrap:wrap;gap:8px}.process-link-item{flex-basis:calc(33.3% - 5.3333333333px)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
2910
+ args: [{ standalone: false, selector: 'valtimo-choose-process-link-type', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n availableProcessLinkTypes: availableProcessLinkTypes$ | async,\n } as obs\"\n>\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.chooseProcessLinkTypeDescription' | translate }}\n </p>\n <div class=\"process-link-grid\">\n <div\n class=\"process-link-item\"\n *ngFor=\"let availableProcessLinkType of obs.availableProcessLinkTypes\"\n >\n <ng-container *ngIf=\"availableProcessLinkType.processLinkType as processLinkTypeId\">\n <button\n (click)=\"selectProcessLinkType(processLinkTypeId)\"\n cdsButton=\"secondary\"\n size=\"xl\"\n class=\"process-link-type-button\"\n [disabled]=\"!availableProcessLinkType.enabled\"\n [vTooltip]=\"getTooltipKey(processLinkTypeId) | translate\"\n [onBottom]=\"true\"\n [tooltipDisabled]=\"availableProcessLinkType.enabled\"\n >\n {{ 'processLinkType.' + processLinkTypeId | translate }}\n <svg\n *ngIf=\"processLinkTypeId === 'plugin'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"link\"\n size=\"16\"\n ></svg>\n <svg\n *ngIf=\"processLinkTypeId === 'form'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"receipt\"\n size=\"16\"\n ></svg>\n <svg\n *ngIf=\"processLinkTypeId === 'form-flow'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"flow--data\"\n size=\"16\"\n ></svg>\n <svg\n *ngIf=\"processLinkTypeId === 'ui-component'\"\n class=\"cds--btn__icon\"\n cdsIcon=\"receipt\"\n size=\"16\"\n ></svg>\n </button>\n </ng-container>\n </div>\n </div>\n</ng-container>\n", styles: [".process-link-type-button{width:100%}.process-link-grid{margin-top:24px;display:flex;justify-content:flex-start;width:100%;flex-wrap:wrap;gap:8px}.process-link-item{flex-basis:calc(33.3% - 5.3333333333px)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1660
2911
  }], ctorParameters: () => [{ type: ProcessLinkStateService }] });
1661
2912
 
1662
2913
  /*
@@ -1685,7 +2936,7 @@ class FormDisplayConfigurationComponent {
1685
2936
  this.formDisplayValue$ = new BehaviorSubject(null);
1686
2937
  this.formSizeValue$ = new BehaviorSubject(null);
1687
2938
  this._subtitles$ = new BehaviorSubject([]);
1688
- this.subtitles$ = this._subtitles$.pipe(map(subtitles => subtitles.map(subtitle => ({ value: subtitle }))));
2939
+ this.subtitles$ = this._subtitles$.pipe(map$1(subtitles => subtitles.map(subtitle => ({ value: subtitle }))));
1689
2940
  this.disableFormSizeInput$ = new BehaviorSubject(true);
1690
2941
  this.saving$ = this.stateService.saving$;
1691
2942
  this.isUserTask$ = new BehaviorSubject(false);
@@ -1695,7 +2946,7 @@ class FormDisplayConfigurationComponent {
1695
2946
  this.formDisplayTypeListItems$ = combineLatest([
1696
2947
  this.formDisplayValue$,
1697
2948
  this.translateService.stream('key'),
1698
- ]).pipe(map(([formDisplayValue]) => this._DISPLAY_TYPE_OPTIONS.map((key) => ({
2949
+ ]).pipe(map$1(([formDisplayValue]) => this._DISPLAY_TYPE_OPTIONS.map((key) => ({
1699
2950
  content: this.translateService.instant(`processLinkSteps.displayType.options.${key}`),
1700
2951
  key: key,
1701
2952
  selected: this.formDisplayValue$.getValue() === key,
@@ -1703,7 +2954,7 @@ class FormDisplayConfigurationComponent {
1703
2954
  this.formSizeListItems$ = combineLatest([
1704
2955
  this.formSizeValue$,
1705
2956
  this.translateService.stream('key'),
1706
- ]).pipe(map(([formSizeValue]) => this._FORM_SIZE_OPTIONS.map((key) => ({
2957
+ ]).pipe(map$1(([formSizeValue]) => this._FORM_SIZE_OPTIONS.map((key) => ({
1707
2958
  content: this.translateService.instant(`processLinkSteps.formSize.options.${key}`),
1708
2959
  key: key,
1709
2960
  selected: this.formSizeValue$.getValue() === key,
@@ -1761,13 +3012,13 @@ class FormDisplayConfigurationComponent {
1761
3012
  else
1762
3013
  this.buttonService.disableSaveButton();
1763
3014
  }
1764
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormDisplayConfigurationComponent, deps: [{ token: ProcessLinkButtonService }, { token: ProcessLinkStateService }, { token: i2$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
1765
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: FormDisplayConfigurationComponent, isStandalone: false, selector: "valtimo-form-display-configuration", inputs: { selectedFormDefinition: "selectedFormDefinition" }, outputs: { formDisplayValue: "formDisplayValue", formSizeValue: "formSizeValue", subtitlesValue: "subtitlesValue" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n formDisplayValue: formDisplayValue$ | async,\n formDisplayTypeListItems: formDisplayTypeListItems$ | async,\n formSizeListItems: formSizeListItems$ | async,\n disableFormSizeInput: disableFormSizeInput$ | async,\n subtitles: subtitles$ | async,\n isUserTask: isUserTask$ | async,\n saving: saving$ | async,\n } as obs\"\n>\n @if (obs.isUserTask) {\n <cds-combo-box\n [placeholder]=\"'processLinkSteps.displayType.placeholder' | translate\"\n [label]=\"'processLinkSteps.displayType.label' | translate\"\n [disabled]=\"obs.saving\"\n (selected)=\"selectFormDisplayType($event)\"\n >\n <cds-dropdown-list [items]=\"obs.formDisplayTypeListItems || []\"></cds-dropdown-list>\n </cds-combo-box>\n\n <br />\n\n <cds-combo-box\n [placeholder]=\"'processLinkSteps.formSize.placeholder' | translate\"\n [label]=\"'processLinkSteps.formSize.label' | translate\"\n [disabled]=\"obs.disableFormSizeInput || obs.saving\"\n (selected)=\"selectFormSize($event)\"\n >\n <cds-dropdown-list [items]=\"obs.formSizeListItems || []\"></cds-dropdown-list>\n </cds-combo-box>\n\n <br />\n\n <valtimo-carbon-multi-input\n type=\"value\"\n titleTranslationKey=\"processLinkSteps.subtitles\"\n addRowTranslationKey=\"processLinkSteps.addSubtitle\"\n [disabled]=\"obs.saving\"\n [fullWidth]=\"true\"\n [minimumAmountOfRows]=\"0\"\n [initialAmountOfRows]=\"0\"\n [defaultValues]=\"obs.subtitles\"\n (valueChange)=\"onSubtitlesChange($event)\"\n ></valtimo-carbon-multi-input>\n }\n</ng-container>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.ComboBox, selector: "cds-combo-box, ibm-combo-box", inputs: ["placeholder", "openMenuAria", "closeMenuAria", "clearSelectionsTitle", "clearSelectionsAria", "clearSelectionTitle", "clearSelectionAria", "id", "labelId", "items", "type", "size", "itemValueKey", "label", "hideLabel", "helperText", "appendInline", "invalid", "invalidText", "warn", "warnText", "maxLength", "theme", "selectionFeedback", "autocomplete", "dropUp", "disabled", "readonly", "fluid"], outputs: ["selected", "submit", "close", "search", "clear"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i2$2.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["addRowText", "addButtonType", "addRowTranslationKey", "arbitraryAmountTitles", "arbitraryValueAmount", "defaultValues", "deleteRowText", "deleteRowTranslationKey", "disabled", "dropdownColumnTitle", "dropdownItems", "dropdownWidth", "fullWidth", "hideAddButton", "hideDeleteButton", "initialAmountOfRows", "keyColumnTitle", "margin", "maxRows", "minimumAmountOfRows", "name", "required", "title", "titleTranslationKey", "tooltip", "type", "valueColumnTitle", "valuePathSelectorCaseDefinitionKey", "valuePathSelectorPrefixes", "valuePathSelectorShowCaseDefinitionSelector", "valuePathSelectorNotation", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] }); }
3015
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormDisplayConfigurationComponent, deps: [{ token: ProcessLinkButtonService }, { token: ProcessLinkStateService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
3016
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: FormDisplayConfigurationComponent, isStandalone: false, selector: "valtimo-form-display-configuration", inputs: { selectedFormDefinition: "selectedFormDefinition" }, outputs: { formDisplayValue: "formDisplayValue", formSizeValue: "formSizeValue", subtitlesValue: "subtitlesValue" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n formDisplayValue: formDisplayValue$ | async,\n formDisplayTypeListItems: formDisplayTypeListItems$ | async,\n formSizeListItems: formSizeListItems$ | async,\n disableFormSizeInput: disableFormSizeInput$ | async,\n subtitles: subtitles$ | async,\n isUserTask: isUserTask$ | async,\n saving: saving$ | async,\n } as obs\"\n>\n @if (obs.isUserTask) {\n <cds-combo-box\n [placeholder]=\"'processLinkSteps.displayType.placeholder' | translate\"\n [label]=\"'processLinkSteps.displayType.label' | translate\"\n [disabled]=\"obs.saving\"\n (selected)=\"selectFormDisplayType($event)\"\n >\n <cds-dropdown-list [items]=\"obs.formDisplayTypeListItems || []\"></cds-dropdown-list>\n </cds-combo-box>\n\n <br />\n\n <cds-combo-box\n [placeholder]=\"'processLinkSteps.formSize.placeholder' | translate\"\n [label]=\"'processLinkSteps.formSize.label' | translate\"\n [disabled]=\"obs.disableFormSizeInput || obs.saving\"\n (selected)=\"selectFormSize($event)\"\n >\n <cds-dropdown-list [items]=\"obs.formSizeListItems || []\"></cds-dropdown-list>\n </cds-combo-box>\n\n <br />\n\n <valtimo-carbon-multi-input\n type=\"value\"\n titleTranslationKey=\"processLinkSteps.subtitles\"\n addRowTranslationKey=\"processLinkSteps.addSubtitle\"\n [disabled]=\"obs.saving\"\n [fullWidth]=\"true\"\n [minimumAmountOfRows]=\"0\"\n [initialAmountOfRows]=\"0\"\n [defaultValues]=\"obs.subtitles\"\n (valueChange)=\"onSubtitlesChange($event)\"\n ></valtimo-carbon-multi-input>\n }\n</ng-container>\n", dependencies: [{ kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$2.ComboBox, selector: "cds-combo-box, ibm-combo-box", inputs: ["placeholder", "openMenuAria", "closeMenuAria", "clearSelectionsTitle", "clearSelectionsAria", "clearSelectionTitle", "clearSelectionAria", "id", "labelId", "items", "type", "size", "itemValueKey", "label", "hideLabel", "helperText", "appendInline", "invalid", "invalidText", "warn", "warnText", "maxLength", "theme", "selectionFeedback", "autocomplete", "dropUp", "disabled", "readonly", "fluid"], outputs: ["selected", "submit", "close", "search", "clear"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i2$1.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["addRowText", "addButtonType", "addRowTranslationKey", "arbitraryAmountTitles", "arbitraryValueAmount", "defaultValues", "deleteRowText", "deleteRowTranslationKey", "disabled", "dropdownColumnTitle", "dropdownItems", "dropdownWidth", "fullWidth", "hideAddButton", "hideDeleteButton", "initialAmountOfRows", "keyColumnTitle", "margin", "maxRows", "minimumAmountOfRows", "name", "required", "title", "titleTranslationKey", "tooltip", "type", "valueColumnTitle", "valuePathSelectorCaseDefinitionKey", "valuePathSelectorPrefixes", "valuePathSelectorShowCaseDefinitionSelector", "valuePathSelectorNotation", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
1766
3017
  }
1767
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormDisplayConfigurationComponent, decorators: [{
3018
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormDisplayConfigurationComponent, decorators: [{
1768
3019
  type: Component,
1769
3020
  args: [{ standalone: false, selector: 'valtimo-form-display-configuration', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n formDisplayValue: formDisplayValue$ | async,\n formDisplayTypeListItems: formDisplayTypeListItems$ | async,\n formSizeListItems: formSizeListItems$ | async,\n disableFormSizeInput: disableFormSizeInput$ | async,\n subtitles: subtitles$ | async,\n isUserTask: isUserTask$ | async,\n saving: saving$ | async,\n } as obs\"\n>\n @if (obs.isUserTask) {\n <cds-combo-box\n [placeholder]=\"'processLinkSteps.displayType.placeholder' | translate\"\n [label]=\"'processLinkSteps.displayType.label' | translate\"\n [disabled]=\"obs.saving\"\n (selected)=\"selectFormDisplayType($event)\"\n >\n <cds-dropdown-list [items]=\"obs.formDisplayTypeListItems || []\"></cds-dropdown-list>\n </cds-combo-box>\n\n <br />\n\n <cds-combo-box\n [placeholder]=\"'processLinkSteps.formSize.placeholder' | translate\"\n [label]=\"'processLinkSteps.formSize.label' | translate\"\n [disabled]=\"obs.disableFormSizeInput || obs.saving\"\n (selected)=\"selectFormSize($event)\"\n >\n <cds-dropdown-list [items]=\"obs.formSizeListItems || []\"></cds-dropdown-list>\n </cds-combo-box>\n\n <br />\n\n <valtimo-carbon-multi-input\n type=\"value\"\n titleTranslationKey=\"processLinkSteps.subtitles\"\n addRowTranslationKey=\"processLinkSteps.addSubtitle\"\n [disabled]=\"obs.saving\"\n [fullWidth]=\"true\"\n [minimumAmountOfRows]=\"0\"\n [initialAmountOfRows]=\"0\"\n [defaultValues]=\"obs.subtitles\"\n (valueChange)=\"onSubtitlesChange($event)\"\n ></valtimo-carbon-multi-input>\n }\n</ng-container>\n" }]
1770
- }], ctorParameters: () => [{ type: ProcessLinkButtonService }, { type: ProcessLinkStateService }, { type: i2$1.TranslateService }], propDecorators: { selectedFormDefinition: [{
3021
+ }], ctorParameters: () => [{ type: ProcessLinkButtonService }, { type: ProcessLinkStateService }, { type: i3.TranslateService }], propDecorators: { selectedFormDefinition: [{
1771
3022
  type: Input
1772
3023
  }], formDisplayValue: [{
1773
3024
  type: Output
@@ -1808,7 +3059,7 @@ class SelectFormComponent {
1808
3059
  }
1809
3060
  return this.formService.getAllUnlinkedFormDefinitions();
1810
3061
  }));
1811
- this.formDefinitionListItems$ = combineLatest([this.stateService.selectedProcessLink$, this.formDefinitions$]).pipe(map$1(([selectedProcessLink, formDefinitions]) => formDefinitions.map(definition => ({
3062
+ this.formDefinitionListItems$ = combineLatest([this.stateService.selectedProcessLink$, this.formDefinitions$]).pipe(map(([selectedProcessLink, formDefinitions]) => formDefinitions.map(definition => ({
1812
3063
  content: definition.name,
1813
3064
  id: definition.id,
1814
3065
  selected: selectedProcessLink
@@ -1859,7 +3110,9 @@ class SelectFormComponent {
1859
3110
  this.subtitlesValue = subtitles;
1860
3111
  }
1861
3112
  openBackButtonSubscription() {
1862
- this._subscriptions.add(this.buttonService.backButtonClick$.subscribe(() => {
3113
+ this._subscriptions.add(this.buttonService.backButtonClick$
3114
+ .pipe(withLatestFrom(this.stateService.isEditing$), filter$1(([, isEditing]) => !isEditing))
3115
+ .subscribe(() => {
1863
3116
  this.stateService.setInitial();
1864
3117
  }));
1865
3118
  }
@@ -1898,18 +3151,7 @@ class SelectFormComponent {
1898
3151
  ...(isUserTask && { formSize: this.formSizeValue || this._DEFAULT_FORM_DISPLAY_TYPE }),
1899
3152
  ...(isUserTask && { subtitles: this.subtitlesValue }),
1900
3153
  };
1901
- if (this.stateService.processLinkEditMode === ProcessLinkEditMode.EMIT_EVENTS) {
1902
- this.stateService.sendProcessLinkUpdateEvent(updateProcessLinkRequest);
1903
- return;
1904
- }
1905
- this.processLinkService.updateProcessLink(updateProcessLinkRequest).subscribe({
1906
- next: () => {
1907
- this.stateService.closeModal();
1908
- },
1909
- error: () => {
1910
- this.stateService.stopSaving();
1911
- },
1912
- });
3154
+ this.stateService.sendProcessLinkUpdateEvent(updateProcessLinkRequest);
1913
3155
  });
1914
3156
  }
1915
3157
  saveNewProcessLink() {
@@ -1938,27 +3180,16 @@ class SelectFormComponent {
1938
3180
  subtitles: this.subtitlesValue,
1939
3181
  }),
1940
3182
  };
1941
- if (this.stateService.processLinkEditMode === ProcessLinkEditMode.EMIT_EVENTS) {
1942
- this.stateService.sendProcessLinkCreateEvent(createRequest);
1943
- return;
1944
- }
1945
- this.processLinkService.saveProcessLink(createRequest).subscribe({
1946
- next: () => {
1947
- this.stateService.closeModal();
1948
- },
1949
- error: () => {
1950
- this.stateService.stopSaving();
1951
- },
1952
- });
3183
+ this.stateService.sendProcessLinkCreateEvent(createRequest);
1953
3184
  });
1954
3185
  }
1955
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SelectFormComponent, deps: [{ token: i1$4.FormService }, { token: ProcessLinkStateService }, { token: ProcessLinkService }, { token: ProcessLinkButtonService }, { token: i3$1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
1956
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: SelectFormComponent, isStandalone: false, selector: "valtimo-select-form", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n formDefinitions: formDefinitionListItems$ | async,\n saving: saving$ | async,\n } as obs\"\n>\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.chooseFormDescription' | translate }}\n </p>\n <div class=\"select-form\">\n <cds-combo-box\n [appendInline]=\"true\"\n [disabled]=\"!obs.formDefinitions || obs.saving\"\n [items]=\"obs.formDefinitions || []\"\n [placeholder]=\"'interface.typeToSearch' | translate\"\n (selected)=\"selectFormDefinition($event)\"\n [label]=\"'processLinkSteps.selectForm' | translate\"\n ><cds-dropdown-list></cds-dropdown-list\n ></cds-combo-box>\n <br />\n\n <valtimo-form-display-configuration\n [selectedFormDefinition]=\"selectedFormDefinition\"\n (formDisplayValue)=\"selectedFormDisplayValue($event)\"\n (formSizeValue)=\"selectedFormSizeValue($event)\"\n (subtitlesValue)=\"selectedSubtitlesValue($event)\"\n ></valtimo-form-display-configuration>\n </div>\n</ng-container>\n", styles: [".label-with-tooltip{display:flex;align-items:center}.select-form{display:flex;flex-direction:column;width:100%;margin-top:24px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.ComboBox, selector: "cds-combo-box, ibm-combo-box", inputs: ["placeholder", "openMenuAria", "closeMenuAria", "clearSelectionsTitle", "clearSelectionsAria", "clearSelectionTitle", "clearSelectionAria", "id", "labelId", "items", "type", "size", "itemValueKey", "label", "hideLabel", "helperText", "appendInline", "invalid", "invalidText", "warn", "warnText", "maxLength", "theme", "selectionFeedback", "autocomplete", "dropUp", "disabled", "readonly", "fluid"], outputs: ["selected", "submit", "close", "search", "clear"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: FormDisplayConfigurationComponent, selector: "valtimo-form-display-configuration", inputs: ["selectedFormDefinition"], outputs: ["formDisplayValue", "formSizeValue", "subtitlesValue"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] }); }
3186
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SelectFormComponent, deps: [{ token: i1$4.FormService }, { token: ProcessLinkStateService }, { token: ProcessLinkService }, { token: ProcessLinkButtonService }, { token: i3$3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
3187
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: SelectFormComponent, isStandalone: false, selector: "valtimo-select-form", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n formDefinitions: formDefinitionListItems$ | async,\n saving: saving$ | async,\n } as obs\"\n>\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.chooseFormDescription' | translate }}\n </p>\n <div class=\"select-form\">\n <cds-combo-box\n [appendInline]=\"true\"\n [disabled]=\"!obs.formDefinitions || obs.saving\"\n [items]=\"obs.formDefinitions || []\"\n [placeholder]=\"'interface.typeToSearch' | translate\"\n (selected)=\"selectFormDefinition($event)\"\n [label]=\"'processLinkSteps.selectForm' | translate\"\n ><cds-dropdown-list></cds-dropdown-list\n ></cds-combo-box>\n <br />\n\n <valtimo-form-display-configuration\n [selectedFormDefinition]=\"selectedFormDefinition\"\n (formDisplayValue)=\"selectedFormDisplayValue($event)\"\n (formSizeValue)=\"selectedFormSizeValue($event)\"\n (subtitlesValue)=\"selectedSubtitlesValue($event)\"\n ></valtimo-form-display-configuration>\n </div>\n</ng-container>\n", styles: [".label-with-tooltip{display:flex;align-items:center}.select-form{display:flex;flex-direction:column;width:100%;margin-top:24px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$2.ComboBox, selector: "cds-combo-box, ibm-combo-box", inputs: ["placeholder", "openMenuAria", "closeMenuAria", "clearSelectionsTitle", "clearSelectionsAria", "clearSelectionTitle", "clearSelectionAria", "id", "labelId", "items", "type", "size", "itemValueKey", "label", "hideLabel", "helperText", "appendInline", "invalid", "invalidText", "warn", "warnText", "maxLength", "theme", "selectionFeedback", "autocomplete", "dropUp", "disabled", "readonly", "fluid"], outputs: ["selected", "submit", "close", "search", "clear"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: FormDisplayConfigurationComponent, selector: "valtimo-form-display-configuration", inputs: ["selectedFormDefinition"], outputs: ["formDisplayValue", "formSizeValue", "subtitlesValue"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
1957
3188
  }
1958
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SelectFormComponent, decorators: [{
3189
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SelectFormComponent, decorators: [{
1959
3190
  type: Component,
1960
3191
  args: [{ standalone: false, selector: 'valtimo-select-form', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n formDefinitions: formDefinitionListItems$ | async,\n saving: saving$ | async,\n } as obs\"\n>\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.chooseFormDescription' | translate }}\n </p>\n <div class=\"select-form\">\n <cds-combo-box\n [appendInline]=\"true\"\n [disabled]=\"!obs.formDefinitions || obs.saving\"\n [items]=\"obs.formDefinitions || []\"\n [placeholder]=\"'interface.typeToSearch' | translate\"\n (selected)=\"selectFormDefinition($event)\"\n [label]=\"'processLinkSteps.selectForm' | translate\"\n ><cds-dropdown-list></cds-dropdown-list\n ></cds-combo-box>\n <br />\n\n <valtimo-form-display-configuration\n [selectedFormDefinition]=\"selectedFormDefinition\"\n (formDisplayValue)=\"selectedFormDisplayValue($event)\"\n (formSizeValue)=\"selectedFormSizeValue($event)\"\n (subtitlesValue)=\"selectedSubtitlesValue($event)\"\n ></valtimo-form-display-configuration>\n </div>\n</ng-container>\n", styles: [".label-with-tooltip{display:flex;align-items:center}.select-form{display:flex;flex-direction:column;width:100%;margin-top:24px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1961
- }], ctorParameters: () => [{ type: i1$4.FormService }, { type: ProcessLinkStateService }, { type: ProcessLinkService }, { type: ProcessLinkButtonService }, { type: i3$1.ActivatedRoute }] });
3192
+ }], ctorParameters: () => [{ type: i1$4.FormService }, { type: ProcessLinkStateService }, { type: ProcessLinkService }, { type: ProcessLinkButtonService }, { type: i3$3.ActivatedRoute }] });
1962
3193
 
1963
3194
  /*
1964
3195
  * Copyright 2015-2025 Ritense BV, the Netherlands.
@@ -1984,8 +3215,8 @@ class SelectFormFlowComponent {
1984
3215
  this.route = route;
1985
3216
  this.subtitlesValue = [];
1986
3217
  this.saving$ = this.stateService.saving$;
1987
- this.formFlowDefinitions$ = getCaseManagementRouteParams(this.route).pipe(switchMap$1((params) => this.formFlowService.getFormFlowDefinitions(params?.caseDefinitionKey ?? '', params?.caseDefinitionVersionTag ?? '')), map$1((formFlowDefinitions) => formFlowDefinitions.content));
1988
- this.formFlowDefinitionListItems$ = combineLatest([this.stateService.selectedProcessLink$, this.formFlowDefinitions$]).pipe(map$1(([selectedProcessLink, formFlowDefinitions]) => formFlowDefinitions.map(definition => ({
3218
+ this.formFlowDefinitions$ = getCaseManagementRouteParams(this.route).pipe(switchMap$1((params) => this.formFlowService.getFormFlowDefinitions(params?.caseDefinitionKey ?? '', params?.caseDefinitionVersionTag ?? '')), map((formFlowDefinitions) => formFlowDefinitions.content));
3219
+ this.formFlowDefinitionListItems$ = combineLatest([this.stateService.selectedProcessLink$, this.formFlowDefinitions$]).pipe(map(([selectedProcessLink, formFlowDefinitions]) => formFlowDefinitions.map(definition => ({
1989
3220
  content: definition.key,
1990
3221
  id: definition.key,
1991
3222
  selected: selectedProcessLink
@@ -2038,7 +3269,9 @@ class SelectFormFlowComponent {
2038
3269
  this.subtitlesValue = subtitles;
2039
3270
  }
2040
3271
  openBackButtonSubscription() {
2041
- this._subscriptions.add(this.buttonService.backButtonClick$.subscribe(() => {
3272
+ this._subscriptions.add(this.buttonService.backButtonClick$
3273
+ .pipe(withLatestFrom(this.stateService.isEditing$), filter$1(([, isEditing]) => !isEditing))
3274
+ .subscribe(() => {
2042
3275
  this.stateService.setInitial();
2043
3276
  }));
2044
3277
  }
@@ -2070,18 +3303,7 @@ class SelectFormFlowComponent {
2070
3303
  ...(isUserTask && { formSize: this.formSizeValue || this._DEFAULT_FORM_DISPLAY_SIZE }),
2071
3304
  ...(isUserTask && { subtitles: this.subtitlesValue }),
2072
3305
  };
2073
- if (this.stateService.processLinkEditMode === ProcessLinkEditMode.EMIT_EVENTS) {
2074
- this.stateService.sendProcessLinkUpdateEvent(updateProcessLinkRequest);
2075
- return;
2076
- }
2077
- this.processLinkService.updateProcessLink(updateProcessLinkRequest).subscribe({
2078
- next: () => {
2079
- this.stateService.closeModal();
2080
- },
2081
- error: () => {
2082
- this.stateService.stopSaving();
2083
- },
2084
- });
3306
+ this.stateService.sendProcessLinkUpdateEvent(updateProcessLinkRequest);
2085
3307
  });
2086
3308
  }
2087
3309
  saveNewProcessLink() {
@@ -2104,27 +3326,16 @@ class SelectFormFlowComponent {
2104
3326
  ...(isUserTask && { formSize: this.formSizeValue || this._DEFAULT_FORM_DISPLAY_SIZE }),
2105
3327
  ...(isUserTask && { subtitles: this.subtitlesValue }),
2106
3328
  };
2107
- if (this.stateService.processLinkEditMode === ProcessLinkEditMode.EMIT_EVENTS) {
2108
- this.stateService.sendProcessLinkCreateEvent(createRequest);
2109
- return;
2110
- }
2111
- this.processLinkService.saveProcessLink(createRequest).subscribe({
2112
- next: () => {
2113
- this.stateService.closeModal();
2114
- },
2115
- error: () => {
2116
- this.stateService.stopSaving();
2117
- },
2118
- });
3329
+ this.stateService.sendProcessLinkCreateEvent(createRequest);
2119
3330
  });
2120
3331
  }
2121
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SelectFormFlowComponent, deps: [{ token: i1$5.FormFlowService }, { token: ProcessLinkStateService }, { token: ProcessLinkService }, { token: ProcessLinkButtonService }, { token: i3$1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
2122
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: SelectFormFlowComponent, isStandalone: false, selector: "valtimo-select-form-flow", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n formFlowDefinitions: formFlowDefinitionListItems$ | async,\n saving: saving$ | async,\n } as obs\"\n>\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.chooseFormFlowDescription' | translate }}\n </p>\n\n <div class=\"select-form-flow\">\n <cds-combo-box\n [appendInline]=\"true\"\n [disabled]=\"!obs.formFlowDefinitions || obs.saving\"\n [items]=\"obs.formFlowDefinitions || []\"\n [placeholder]=\"'interface.typeToSearch' | translate\"\n (selected)=\"selectFormFlowDefinition($event)\"\n [label]=\"'processLinkSteps.selectFormFlow' | translate\"\n ><cds-dropdown-list></cds-dropdown-list\n ></cds-combo-box>\n\n <br />\n\n <valtimo-form-display-configuration\n [selectedFormDefinition]=\"selectedFormFlowDefinitionId\"\n (formDisplayValue)=\"selectedFormDisplayValue($event)\"\n (formSizeValue)=\"selectedFormSizeValue($event)\"\n (subtitlesValue)=\"selectedSubtitlesValue($event)\"\n ></valtimo-form-display-configuration>\n </div>\n</ng-container>\n", styles: [".label-with-tooltip{display:flex;align-items:center}.select-form-flow{display:flex;flex-direction:column;width:100%;margin-top:24px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.ComboBox, selector: "cds-combo-box, ibm-combo-box", inputs: ["placeholder", "openMenuAria", "closeMenuAria", "clearSelectionsTitle", "clearSelectionsAria", "clearSelectionTitle", "clearSelectionAria", "id", "labelId", "items", "type", "size", "itemValueKey", "label", "hideLabel", "helperText", "appendInline", "invalid", "invalidText", "warn", "warnText", "maxLength", "theme", "selectionFeedback", "autocomplete", "dropUp", "disabled", "readonly", "fluid"], outputs: ["selected", "submit", "close", "search", "clear"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: FormDisplayConfigurationComponent, selector: "valtimo-form-display-configuration", inputs: ["selectedFormDefinition"], outputs: ["formDisplayValue", "formSizeValue", "subtitlesValue"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] }); }
3332
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SelectFormFlowComponent, deps: [{ token: i1$5.FormFlowService }, { token: ProcessLinkStateService }, { token: ProcessLinkService }, { token: ProcessLinkButtonService }, { token: i3$3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
3333
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: SelectFormFlowComponent, isStandalone: false, selector: "valtimo-select-form-flow", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n formFlowDefinitions: formFlowDefinitionListItems$ | async,\n saving: saving$ | async,\n } as obs\"\n>\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.chooseFormFlowDescription' | translate }}\n </p>\n\n <div class=\"select-form-flow\">\n <cds-combo-box\n [appendInline]=\"true\"\n [disabled]=\"!obs.formFlowDefinitions || obs.saving\"\n [items]=\"obs.formFlowDefinitions || []\"\n [placeholder]=\"'interface.typeToSearch' | translate\"\n (selected)=\"selectFormFlowDefinition($event)\"\n [label]=\"'processLinkSteps.selectFormFlow' | translate\"\n ><cds-dropdown-list></cds-dropdown-list\n ></cds-combo-box>\n\n <br />\n\n <valtimo-form-display-configuration\n [selectedFormDefinition]=\"selectedFormFlowDefinitionId\"\n (formDisplayValue)=\"selectedFormDisplayValue($event)\"\n (formSizeValue)=\"selectedFormSizeValue($event)\"\n (subtitlesValue)=\"selectedSubtitlesValue($event)\"\n ></valtimo-form-display-configuration>\n </div>\n</ng-container>\n", styles: [".label-with-tooltip{display:flex;align-items:center}.select-form-flow{display:flex;flex-direction:column;width:100%;margin-top:24px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$2.ComboBox, selector: "cds-combo-box, ibm-combo-box", inputs: ["placeholder", "openMenuAria", "closeMenuAria", "clearSelectionsTitle", "clearSelectionsAria", "clearSelectionTitle", "clearSelectionAria", "id", "labelId", "items", "type", "size", "itemValueKey", "label", "hideLabel", "helperText", "appendInline", "invalid", "invalidText", "warn", "warnText", "maxLength", "theme", "selectionFeedback", "autocomplete", "dropUp", "disabled", "readonly", "fluid"], outputs: ["selected", "submit", "close", "search", "clear"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: FormDisplayConfigurationComponent, selector: "valtimo-form-display-configuration", inputs: ["selectedFormDefinition"], outputs: ["formDisplayValue", "formSizeValue", "subtitlesValue"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
2123
3334
  }
2124
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SelectFormFlowComponent, decorators: [{
3335
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SelectFormFlowComponent, decorators: [{
2125
3336
  type: Component,
2126
3337
  args: [{ standalone: false, selector: 'valtimo-select-form-flow', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n formFlowDefinitions: formFlowDefinitionListItems$ | async,\n saving: saving$ | async,\n } as obs\"\n>\n <p class=\"step-description\">\n {{ 'processLinkConfiguration.chooseFormFlowDescription' | translate }}\n </p>\n\n <div class=\"select-form-flow\">\n <cds-combo-box\n [appendInline]=\"true\"\n [disabled]=\"!obs.formFlowDefinitions || obs.saving\"\n [items]=\"obs.formFlowDefinitions || []\"\n [placeholder]=\"'interface.typeToSearch' | translate\"\n (selected)=\"selectFormFlowDefinition($event)\"\n [label]=\"'processLinkSteps.selectFormFlow' | translate\"\n ><cds-dropdown-list></cds-dropdown-list\n ></cds-combo-box>\n\n <br />\n\n <valtimo-form-display-configuration\n [selectedFormDefinition]=\"selectedFormFlowDefinitionId\"\n (formDisplayValue)=\"selectedFormDisplayValue($event)\"\n (formSizeValue)=\"selectedFormSizeValue($event)\"\n (subtitlesValue)=\"selectedSubtitlesValue($event)\"\n ></valtimo-form-display-configuration>\n </div>\n</ng-container>\n", styles: [".label-with-tooltip{display:flex;align-items:center}.select-form-flow{display:flex;flex-direction:column;width:100%;margin-top:24px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
2127
- }], ctorParameters: () => [{ type: i1$5.FormFlowService }, { type: ProcessLinkStateService }, { type: ProcessLinkService }, { type: ProcessLinkButtonService }, { type: i3$1.ActivatedRoute }] });
3338
+ }], ctorParameters: () => [{ type: i1$5.FormFlowService }, { type: ProcessLinkStateService }, { type: ProcessLinkService }, { type: ProcessLinkButtonService }, { type: i3$3.ActivatedRoute }] });
2128
3339
 
2129
3340
  /*
2130
3341
  * Copyright 2015-2025 Ritense BV, the Netherlands.
@@ -2151,7 +3362,7 @@ class SelectUIComponentComponent {
2151
3362
  this.formCustomComponentListItems$ = combineLatest([
2152
3363
  this.stateService.selectedProcessLink$,
2153
3364
  this._formCustomComponentConfig$,
2154
- ]).pipe(map$1(([selectedProcessLink, formCustomComponentConfigs]) => Object.keys(formCustomComponentConfigs).map(key => ({
3365
+ ]).pipe(map(([selectedProcessLink, formCustomComponentConfigs]) => Object.keys(formCustomComponentConfigs).map(key => ({
2155
3366
  content: key,
2156
3367
  selected: selectedProcessLink ? selectedProcessLink?.componentKey === key : false,
2157
3368
  }))), tap(formCustomComponentListItems => {
@@ -2177,7 +3388,9 @@ class SelectUIComponentComponent {
2177
3388
  : this.buttonService.disableSaveButton();
2178
3389
  }
2179
3390
  openBackButtonSubscription() {
2180
- this._subscriptions.add(this.buttonService.backButtonClick$.subscribe(() => {
3391
+ this._subscriptions.add(this.buttonService.backButtonClick$
3392
+ .pipe(withLatestFrom$1(this.stateService.isEditing$), filter(([, isEditing]) => !isEditing))
3393
+ .subscribe(() => {
2181
3394
  this.stateService.setInitial();
2182
3395
  }));
2183
3396
  }
@@ -2199,14 +3412,7 @@ class SelectUIComponentComponent {
2199
3412
  componentKey: this._selectedCustomComponent.content,
2200
3413
  activityId: selectedProcessLink.activityId,
2201
3414
  };
2202
- if (this.stateService.processLinkEditMode === ProcessLinkEditMode.EMIT_EVENTS) {
2203
- this.stateService.sendProcessLinkUpdateEvent(updateRequest);
2204
- return;
2205
- }
2206
- this.processLinkService.updateProcessLink(updateRequest).subscribe({
2207
- next: () => this.stateService.closeModal(),
2208
- error: () => this.stateService.stopSaving(),
2209
- });
3415
+ this.stateService.sendProcessLinkUpdateEvent(updateRequest);
2210
3416
  });
2211
3417
  }
2212
3418
  saveNewProcessLink() {
@@ -2219,21 +3425,18 @@ class SelectUIComponentComponent {
2219
3425
  processLinkType: processLinkTypeId,
2220
3426
  activityId: modalParams.element.id,
2221
3427
  };
2222
- if (this.stateService.processLinkEditMode === ProcessLinkEditMode.EMIT_EVENTS) {
2223
- this.stateService.sendProcessLinkCreateEvent(createRequest);
2224
- return [];
2225
- }
2226
- return this.processLinkService.saveProcessLink(createRequest);
3428
+ this.stateService.sendProcessLinkCreateEvent(createRequest);
3429
+ return [];
2227
3430
  }))
2228
3431
  .subscribe({
2229
3432
  next: () => this.stateService.closeModal(),
2230
3433
  error: () => this.stateService.stopSaving(),
2231
3434
  });
2232
3435
  }
2233
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SelectUIComponentComponent, deps: [{ token: ProcessLinkStateService }, { token: ProcessLinkButtonService }, { token: ProcessLinkService }, { token: FORM_CUSTOM_COMPONENT_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
2234
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: SelectUIComponentComponent, isStandalone: false, selector: "valtimo-select-ui-component", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<cds-combo-box\n [dropUp]=\"false\"\n formControlName=\"contentKey\"\n [items]=\"formCustomComponentListItems$ | async\"\n itemValueKey=\"contentKey\"\n [label]=\"'processLinkSteps.uiComponent' | translate\"\n (selected)=\"selectCustomComponent($event)\"\n>\n <cds-dropdown-list></cds-dropdown-list>\n</cds-combo-box>\n", styles: [".custom-widget{padding:24px}.custom-widget__header{display:flex;align-items:center;justify-content:space-between}.custom-widget__title{color:var(--cds-text-primary);font-weight:600;font-size:16px;line-height:24px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.ComboBox, selector: "cds-combo-box, ibm-combo-box", inputs: ["placeholder", "openMenuAria", "closeMenuAria", "clearSelectionsTitle", "clearSelectionsAria", "clearSelectionTitle", "clearSelectionAria", "id", "labelId", "items", "type", "size", "itemValueKey", "label", "hideLabel", "helperText", "appendInline", "invalid", "invalidText", "warn", "warnText", "maxLength", "theme", "selectionFeedback", "autocomplete", "dropUp", "disabled", "readonly", "fluid"], outputs: ["selected", "submit", "close", "search", "clear"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3436
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SelectUIComponentComponent, deps: [{ token: ProcessLinkStateService }, { token: ProcessLinkButtonService }, { token: ProcessLinkService }, { token: FORM_CUSTOM_COMPONENT_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
3437
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: SelectUIComponentComponent, isStandalone: false, selector: "valtimo-select-ui-component", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<cds-combo-box\n [dropUp]=\"false\"\n formControlName=\"contentKey\"\n [items]=\"formCustomComponentListItems$ | async\"\n itemValueKey=\"contentKey\"\n [label]=\"'processLinkSteps.uiComponent' | translate\"\n (selected)=\"selectCustomComponent($event)\"\n>\n <cds-dropdown-list></cds-dropdown-list>\n</cds-combo-box>\n", styles: [".custom-widget{padding:24px}.custom-widget__header{display:flex;align-items:center;justify-content:space-between}.custom-widget__title{color:var(--cds-text-primary);font-weight:600;font-size:16px;line-height:24px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3$2.ComboBox, selector: "cds-combo-box, ibm-combo-box", inputs: ["placeholder", "openMenuAria", "closeMenuAria", "clearSelectionsTitle", "clearSelectionsAria", "clearSelectionTitle", "clearSelectionAria", "id", "labelId", "items", "type", "size", "itemValueKey", "label", "hideLabel", "helperText", "appendInline", "invalid", "invalidText", "warn", "warnText", "maxLength", "theme", "selectionFeedback", "autocomplete", "dropUp", "disabled", "readonly", "fluid"], outputs: ["selected", "submit", "close", "search", "clear"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2235
3438
  }
2236
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SelectUIComponentComponent, decorators: [{
3439
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SelectUIComponentComponent, decorators: [{
2237
3440
  type: Component,
2238
3441
  args: [{ standalone: false, selector: 'valtimo-select-ui-component', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<cds-combo-box\n [dropUp]=\"false\"\n formControlName=\"contentKey\"\n [items]=\"formCustomComponentListItems$ | async\"\n itemValueKey=\"contentKey\"\n [label]=\"'processLinkSteps.uiComponent' | translate\"\n (selected)=\"selectCustomComponent($event)\"\n>\n <cds-dropdown-list></cds-dropdown-list>\n</cds-combo-box>\n", styles: [".custom-widget{padding:24px}.custom-widget__header{display:flex;align-items:center;justify-content:space-between}.custom-widget__title{color:var(--cds-text-primary);font-weight:600;font-size:16px;line-height:24px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
2239
3442
  }], ctorParameters: () => [{ type: ProcessLinkStateService }, { type: ProcessLinkButtonService }, { type: ProcessLinkService }, { type: undefined, decorators: [{
@@ -2243,6 +3446,348 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
2243
3446
  args: [FORM_CUSTOM_COMPONENT_TOKEN]
2244
3447
  }] }] });
2245
3448
 
3449
+ /*
3450
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
3451
+ *
3452
+ * Licensed under EUPL, Version 1.2 (the "License");
3453
+ * you may not use this file except in compliance with the License.
3454
+ * You may obtain a copy of the License at
3455
+ *
3456
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
3457
+ *
3458
+ * Unless required by applicable law or agreed to in writing, software
3459
+ * distributed under the License is distributed on an "AS IS" BASIS,
3460
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3461
+ * See the License for the specific language governing permissions and
3462
+ * limitations under the License.
3463
+ */
3464
+ class SelectBuildingBlockComponent {
3465
+ constructor(processLinkBuildingBlockApiService, stateService, buildingBlockStateService, buttonService, stepService) {
3466
+ this.processLinkBuildingBlockApiService = processLinkBuildingBlockApiService;
3467
+ this.stateService = stateService;
3468
+ this.buildingBlockStateService = buildingBlockStateService;
3469
+ this.buttonService = buttonService;
3470
+ this.stepService = stepService;
3471
+ this.buildingBlocks$ = this.processLinkBuildingBlockApiService
3472
+ .getBuildingBlockDefinitions({ includeArtwork: true })
3473
+ .pipe(map(definitions => [...(definitions ?? [])]), map(definitions => definitions.sort((a, b) => (a.name || a.key).localeCompare(b.name || b.key))), catchError(() => of([])), tap(() => {
3474
+ this.loading = false;
3475
+ }), shareReplay(1));
3476
+ this.loading = true;
3477
+ this.selectedKey = null;
3478
+ this.subscriptions = new Subscription();
3479
+ this.buildingBlocks = [];
3480
+ }
3481
+ ngOnInit() {
3482
+ this.buttonService.disableNextButton();
3483
+ this.subscriptions.add(this.buildingBlocks$.subscribe(definitions => {
3484
+ this.buildingBlocks = definitions ?? [];
3485
+ if (this.selectedKey) {
3486
+ this.stepService.updateBuildingBlockSelectionStepLabel(this.getDefinitionLabel(this.findDefinitionByKey(this.selectedKey)));
3487
+ }
3488
+ }));
3489
+ this.subscriptions.add(this.buildingBlockStateService.definitionKey$.subscribe(key => {
3490
+ this.selectedKey = key;
3491
+ if (key) {
3492
+ this.stepService.updateBuildingBlockSelectionStepLabel(this.getDefinitionLabel(this.findDefinitionByKey(key)));
3493
+ this.buttonService.enableNextButton();
3494
+ }
3495
+ else {
3496
+ this.buttonService.disableNextButton();
3497
+ }
3498
+ }));
3499
+ this.subscriptions.add(this.buttonService.backButtonClick$
3500
+ .pipe(withLatestFrom$1(this.stateService.isEditing$), filter(([, isEditing]) => !isEditing))
3501
+ .subscribe(() => {
3502
+ this.stateService.setInitial();
3503
+ }));
3504
+ this.subscriptions.add(this.buttonService.nextButtonClick$
3505
+ .pipe(withLatestFrom$1(this.stateService.isEditing$), filter(([, isEditing]) => !isEditing))
3506
+ .subscribe(() => {
3507
+ this.stepService.setConfigureBuildingBlockPluginsStep(this.getDefinitionLabel(this.findDefinitionByKey(this.selectedKey)));
3508
+ }));
3509
+ }
3510
+ ngOnDestroy() {
3511
+ this.subscriptions.unsubscribe();
3512
+ }
3513
+ onSelectionChange(event) {
3514
+ const definition = event?.value;
3515
+ this.selectedKey = definition?.key ?? null;
3516
+ this.buildingBlockStateService.setDefinitionKey(definition?.key ?? null);
3517
+ this.stepService.updateBuildingBlockSelectionStepLabel(this.getDefinitionLabel(definition));
3518
+ if (definition?.key) {
3519
+ this.buttonService.enableNextButton();
3520
+ }
3521
+ else {
3522
+ this.buttonService.disableNextButton();
3523
+ }
3524
+ }
3525
+ trackByKey(_, definition) {
3526
+ return definition.key;
3527
+ }
3528
+ findDefinitionByKey(key) {
3529
+ if (!key)
3530
+ return undefined;
3531
+ return this.buildingBlocks.find(definition => definition.key === key);
3532
+ }
3533
+ getDefinitionLabel(definition) {
3534
+ if (!definition)
3535
+ return '';
3536
+ const name = definition.name || definition.key;
3537
+ return name;
3538
+ }
3539
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SelectBuildingBlockComponent, deps: [{ token: ProcessLinkBuildingBlockApiService }, { token: ProcessLinkStateService }, { token: BuildingBlockStateService }, { token: ProcessLinkButtonService }, { token: ProcessLinkStepService }], target: i0.ɵɵFactoryTarget.Component }); }
3540
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: SelectBuildingBlockComponent, isStandalone: false, selector: "valtimo-select-building-block", ngImport: i0, template: "<!--\n Copyright 2015-2025 Ritense BV\n Licensed under the EUPL, Version 1.2\n-->\n\n<div class=\"select-building-block\" *ngIf=\"!loading; else loadingState\">\n <ng-container *ngIf=\"buildingBlocks$ | async as buildingBlocks\">\n <ng-container *ngIf=\"buildingBlocks.length; else emptyState\">\n <div class=\"list-container\">\n <cds-structured-list (selected)=\"onSelectionChange($event)\" selection=\"true\">\n <cds-list-header>\n <cds-list-column nowrap=\"true\"></cds-list-column>\n <cds-list-column nowrap=\"true\">\n {{ 'processLinkConfiguration.buildingBlock.name' | translate }}\n </cds-list-column>\n <cds-list-column>\n {{ 'processLinkConfiguration.buildingBlock.description' | translate }}\n </cds-list-column>\n </cds-list-header>\n <cds-list-row *ngFor=\"let buildingBlock of buildingBlocks\" [value]=\"buildingBlock\">\n <cds-list-column>\n <div *ngIf=\"buildingBlock.imageBase64\">\n <img\n class=\"building-block-artwork\"\n [src]=\"'data:image/png;base64,' + buildingBlock.imageBase64\"\n [title]=\"buildingBlock.name\"\n />\n </div>\n </cds-list-column>\n <cds-list-column>{{ buildingBlock.name }}</cds-list-column>\n <cds-list-column>{{ buildingBlock.description }}</cds-list-column>\n </cds-list-row>\n </cds-structured-list>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #loadingState>\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-template>\n\n<ng-template #emptyState>\n <div class=\"empty-state\">\n {{ 'processLinkConfiguration.buildingBlock.emptyState' | translate }}\n </div>\n</ng-template>\n", styles: [".loading-container{display:flex;justify-content:center;padding:16px 0}.empty-state{padding:1rem;border:1px solid #e0e0e0;border-radius:4px;background-color:#f4f4f4;color:#8d8d8d}.building-block-artwork{object-fit:contain;height:60px;width:100%;margin-bottom:-.5rem}::ng-deep .list-container .cds--structured-list-td{vertical-align:top}\n"], dependencies: [{ kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$2.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i3$2.StructuredList, selector: "cds-structured-list, ibm-structured-list", inputs: ["selection", "flushed", "condensed", "name", "skeleton"], outputs: ["selected"] }, { kind: "component", type: i3$2.ListRow, selector: "cds-list-row, ibm-list-row", inputs: ["selected", "label", "value"], outputs: ["change"] }, { kind: "component", type: i3$2.ListHeader, selector: "cds-list-header, ibm-list-header", inputs: ["skeleton"] }, { kind: "component", type: i3$2.ListColumn, selector: "cds-list-column, ibm-list-column", inputs: ["skeleton", "nowrap"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
3541
+ }
3542
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SelectBuildingBlockComponent, decorators: [{
3543
+ type: Component,
3544
+ args: [{ standalone: false, selector: 'valtimo-select-building-block', template: "<!--\n Copyright 2015-2025 Ritense BV\n Licensed under the EUPL, Version 1.2\n-->\n\n<div class=\"select-building-block\" *ngIf=\"!loading; else loadingState\">\n <ng-container *ngIf=\"buildingBlocks$ | async as buildingBlocks\">\n <ng-container *ngIf=\"buildingBlocks.length; else emptyState\">\n <div class=\"list-container\">\n <cds-structured-list (selected)=\"onSelectionChange($event)\" selection=\"true\">\n <cds-list-header>\n <cds-list-column nowrap=\"true\"></cds-list-column>\n <cds-list-column nowrap=\"true\">\n {{ 'processLinkConfiguration.buildingBlock.name' | translate }}\n </cds-list-column>\n <cds-list-column>\n {{ 'processLinkConfiguration.buildingBlock.description' | translate }}\n </cds-list-column>\n </cds-list-header>\n <cds-list-row *ngFor=\"let buildingBlock of buildingBlocks\" [value]=\"buildingBlock\">\n <cds-list-column>\n <div *ngIf=\"buildingBlock.imageBase64\">\n <img\n class=\"building-block-artwork\"\n [src]=\"'data:image/png;base64,' + buildingBlock.imageBase64\"\n [title]=\"buildingBlock.name\"\n />\n </div>\n </cds-list-column>\n <cds-list-column>{{ buildingBlock.name }}</cds-list-column>\n <cds-list-column>{{ buildingBlock.description }}</cds-list-column>\n </cds-list-row>\n </cds-structured-list>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #loadingState>\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-template>\n\n<ng-template #emptyState>\n <div class=\"empty-state\">\n {{ 'processLinkConfiguration.buildingBlock.emptyState' | translate }}\n </div>\n</ng-template>\n", styles: [".loading-container{display:flex;justify-content:center;padding:16px 0}.empty-state{padding:1rem;border:1px solid #e0e0e0;border-radius:4px;background-color:#f4f4f4;color:#8d8d8d}.building-block-artwork{object-fit:contain;height:60px;width:100%;margin-bottom:-.5rem}::ng-deep .list-container .cds--structured-list-td{vertical-align:top}\n"] }]
3545
+ }], ctorParameters: () => [{ type: ProcessLinkBuildingBlockApiService }, { type: ProcessLinkStateService }, { type: BuildingBlockStateService }, { type: ProcessLinkButtonService }, { type: ProcessLinkStepService }] });
3546
+
3547
+ /*
3548
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
3549
+ *
3550
+ * Licensed under EUPL, Version 1.2 (the "License");
3551
+ * you may not use this file except in compliance with the License.
3552
+ * You may obtain a copy of the License at
3553
+ *
3554
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
3555
+ *
3556
+ * Unless required by applicable law or agreed to in writing, software
3557
+ * distributed under the License is distributed on an "AS IS" basis,
3558
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3559
+ * See the License for the specific language governing permissions and
3560
+ * limitations under the License.
3561
+ */
3562
+ class ConfigureBuildingBlockPluginsComponent {
3563
+ constructor(stateService, buildingBlockStateService, buttonService, stepService, pluginManagementService, pluginTranslationService, processLinkService, translateService, processLinkBuildingBlockApiService) {
3564
+ this.stateService = stateService;
3565
+ this.buildingBlockStateService = buildingBlockStateService;
3566
+ this.buttonService = buttonService;
3567
+ this.stepService = stepService;
3568
+ this.pluginManagementService = pluginManagementService;
3569
+ this.pluginTranslationService = pluginTranslationService;
3570
+ this.processLinkService = processLinkService;
3571
+ this.translateService = translateService;
3572
+ this.processLinkBuildingBlockApiService = processLinkBuildingBlockApiService;
3573
+ this.pluginKeys$ = this.buildingBlockStateService.requiredPluginKeys$;
3574
+ this.isNestedBuildingBlock$ = this.buildingBlockStateService.isNestedBuildingBlock$;
3575
+ this._pluginDependenciesWarningTranslationKey$ = this.buildingBlockStateService.pluginDependencies$.pipe(map$1(dependencies => {
3576
+ if (!dependencies || !dependencies.length)
3577
+ return '';
3578
+ const zaakInstanceLinkDependency = dependencies.includes('ZAAK_INSTANCE_LINK');
3579
+ const zaakTypeLinkDependency = dependencies.includes('ZAAK_TYPE_LINK');
3580
+ if (zaakInstanceLinkDependency && zaakTypeLinkDependency) {
3581
+ return 'processLinkConfiguration.buildingBlock.pluginDependenciesWarning.zaakInstanceAndTypeLink';
3582
+ }
3583
+ else if (zaakInstanceLinkDependency) {
3584
+ return 'processLinkConfiguration.buildingBlock.pluginDependenciesWarning.zaakInstanceLink';
3585
+ }
3586
+ else if (zaakTypeLinkDependency) {
3587
+ return 'processLinkConfiguration.buildingBlock.pluginDependenciesWarning.zaakTypeLink';
3588
+ }
3589
+ return '';
3590
+ }));
3591
+ this.dependenciesNotificationObject$ = combineLatest([
3592
+ this._pluginDependenciesWarningTranslationKey$,
3593
+ this.translateService.stream('key'),
3594
+ ]).pipe(map$1(([warningTranslationKey]) => !warningTranslationKey
3595
+ ? null
3596
+ : {
3597
+ type: 'warning',
3598
+ lowContrast: true,
3599
+ title: this.translateService.instant('processLinkConfiguration.buildingBlock.pluginDependenciesWarning.title'),
3600
+ message: this.translateService.instant(warningTranslationKey),
3601
+ showClose: false,
3602
+ }));
3603
+ this.loading$ = this.buildingBlockStateService.requirementsLoading$;
3604
+ this.versions$ = this.buildingBlockStateService.versions$;
3605
+ this.definitionVersionTag$ = this.buildingBlockStateService.definitionVersionTag$;
3606
+ this.versionPlaceholder$ = this.translateService.stream('processLinkConfiguration.buildingBlock.versionPlaceholder');
3607
+ this.configurationPlaceholder$ = this.translateService.stream('processLinkConfiguration.buildingBlock.configurationPlaceholder');
3608
+ this.versionItems$ = combineLatest([
3609
+ this.versions$,
3610
+ this.definitionVersionTag$,
3611
+ this.versionPlaceholder$,
3612
+ ]).pipe(map$1(([versions, selectedVersion, placeholder]) => {
3613
+ const normalizedSelectedVersion = selectedVersion || '';
3614
+ return [
3615
+ {
3616
+ id: '',
3617
+ content: placeholder,
3618
+ selected: normalizedSelectedVersion === '',
3619
+ },
3620
+ ...(versions || []).map(version => ({
3621
+ id: version,
3622
+ content: version,
3623
+ selected: normalizedSelectedVersion === version,
3624
+ })),
3625
+ ];
3626
+ }));
3627
+ this.pluginConfigurationViewModels$ = combineLatest([
3628
+ this.pluginKeys$,
3629
+ this.buildingBlockStateService.pluginMappings$,
3630
+ this.configurationPlaceholder$,
3631
+ ]).pipe(switchMap$1(([pluginKeys, pluginMappings, placeholder]) => {
3632
+ if (!pluginKeys?.length) {
3633
+ return of([]);
3634
+ }
3635
+ return combineLatest(pluginKeys.map(pluginKey => this.getConfigurationOptions(pluginKey).pipe(map$1(options => ({
3636
+ key: pluginKey,
3637
+ label: this.pluginLabel(pluginKey),
3638
+ dropdownItems: this.buildDropdownItems(options, pluginMappings?.[pluginKey], placeholder),
3639
+ hasOptions: options.length > 0,
3640
+ })))));
3641
+ }));
3642
+ this._subscriptions = new Subscription();
3643
+ this._configurationOptionsCache = new Map();
3644
+ }
3645
+ ngOnInit() {
3646
+ // Check if we're configuring from within a building block process (nested building block)
3647
+ this._subscriptions.add(this.stateService.modalParams$
3648
+ .pipe(map$1(params => params?.processDefinitionId), distinctUntilChanged())
3649
+ .subscribe(processDefinitionId => {
3650
+ if (processDefinitionId) {
3651
+ this.processLinkBuildingBlockApiService
3652
+ .isBuildingBlockProcess(processDefinitionId)
3653
+ .subscribe(isNested => {
3654
+ this.buildingBlockStateService.setIsNestedBuildingBlock(isNested);
3655
+ });
3656
+ }
3657
+ }));
3658
+ this._subscriptions.add(combineLatest([
3659
+ this.buildingBlockStateService.requiredPluginKeys$,
3660
+ this.buildingBlockStateService.mappingsComplete$,
3661
+ this.buildingBlockStateService.requirementsLoading$,
3662
+ this.definitionVersionTag$,
3663
+ ]).subscribe(([keys, complete, loading, version]) => {
3664
+ if (loading || !version) {
3665
+ this.buttonService.disableNextButton();
3666
+ return;
3667
+ }
3668
+ if (keys.length === 0 || complete) {
3669
+ this.buttonService.enableNextButton();
3670
+ }
3671
+ else {
3672
+ this.buttonService.disableNextButton();
3673
+ }
3674
+ }));
3675
+ this._subscriptions.add(this.buttonService.backButtonClick$
3676
+ .pipe(withLatestFrom(this.stateService.isEditing$), filter$1(([, isEditing]) => !isEditing))
3677
+ .subscribe(() => {
3678
+ this.stepService.setBuildingBlockSteps();
3679
+ }));
3680
+ this._subscriptions.add(this.buttonService.nextButtonClick$
3681
+ .pipe(withLatestFrom(this.stateService.isEditing$), filter$1(([, isEditing]) => !isEditing))
3682
+ .subscribe(() => {
3683
+ this.stepService.setConfigureBuildingBlockMappingsStep(this.buildingBlockStateService.getDefinitionSnapshot().key ?? undefined);
3684
+ }));
3685
+ }
3686
+ ngOnDestroy() {
3687
+ this._subscriptions.unsubscribe();
3688
+ }
3689
+ getConfigurationOptions(pluginDefinitionKey) {
3690
+ if (!this._configurationOptionsCache.has(pluginDefinitionKey)) {
3691
+ this._configurationOptionsCache.set(pluginDefinitionKey, this.pluginManagementService
3692
+ .getPluginConfigurationsByPluginDefinitionKey(pluginDefinitionKey)
3693
+ .pipe(catchError$1(() => of([])), shareReplay(1)));
3694
+ }
3695
+ return this._configurationOptionsCache.get(pluginDefinitionKey) ?? of([]);
3696
+ }
3697
+ onMappingChange(pluginDefinitionKey, configurationId) {
3698
+ const normalizedValue = configurationId || null;
3699
+ this.buildingBlockStateService.setPluginConfigurationMapping(pluginDefinitionKey, normalizedValue);
3700
+ }
3701
+ pluginLabel(pluginDefinitionKey) {
3702
+ return (this.pluginTranslationService.instant('title', pluginDefinitionKey) || pluginDefinitionKey);
3703
+ }
3704
+ buildDropdownItems(options, selectedId, placeholder) {
3705
+ return [
3706
+ {
3707
+ id: '',
3708
+ content: placeholder,
3709
+ selected: !selectedId,
3710
+ },
3711
+ ...options.map(option => ({
3712
+ id: option.id,
3713
+ content: option.title,
3714
+ selected: selectedId === option.id || (options.length === 1 && !selectedId),
3715
+ })),
3716
+ ];
3717
+ }
3718
+ checkSingleBuildingBlockType(types) {
3719
+ if (!types?.length)
3720
+ return false;
3721
+ return types.length === 1 && types[0]?.processLinkType === 'building-block' && types[0].enabled;
3722
+ }
3723
+ onVersionChange(versionTag) {
3724
+ const normalizedValue = versionTag || null;
3725
+ this.buildingBlockStateService.setPluginConfigurationMappings(undefined);
3726
+ this.buildingBlockStateService.setDefinitionVersionTag(normalizedValue);
3727
+ }
3728
+ createProcessLink() {
3729
+ this.stateService.modalParams$.pipe(take(1)).subscribe(modalParams => {
3730
+ const { key, versionTag } = this.buildingBlockStateService.getDefinitionSnapshot();
3731
+ if (!modalParams || !key || !versionTag) {
3732
+ this.stateService.stopSaving();
3733
+ return;
3734
+ }
3735
+ const activityId = modalParams.element?.id;
3736
+ if (!activityId) {
3737
+ this.stateService.stopSaving();
3738
+ return;
3739
+ }
3740
+ const request = {
3741
+ processDefinitionId: modalParams.processDefinitionId ?? '-',
3742
+ activityId,
3743
+ activityType: modalParams.element?.activityListenerType ?? '',
3744
+ processLinkType: 'building-block',
3745
+ buildingBlockDefinitionKey: key,
3746
+ buildingBlockDefinitionVersionTag: versionTag,
3747
+ pluginConfigurationMappings: this.getMappingsForPayload(),
3748
+ inputMappings: [],
3749
+ outputMappings: [],
3750
+ };
3751
+ this.stateService.sendProcessLinkCreateEvent(request);
3752
+ });
3753
+ }
3754
+ updateProcessLink(processLink) {
3755
+ this.stateService.modalParams$.pipe(take(1)).subscribe(modalParams => {
3756
+ const { key, versionTag } = this.buildingBlockStateService.getDefinitionSnapshot();
3757
+ if (!modalParams || !key || !versionTag) {
3758
+ this.stateService.stopSaving();
3759
+ return;
3760
+ }
3761
+ const activityId = modalParams.element?.id;
3762
+ const request = {
3763
+ id: processLink.id,
3764
+ activityId: activityId,
3765
+ processLinkType: 'building-block',
3766
+ buildingBlockDefinitionKey: key,
3767
+ buildingBlockDefinitionVersionTag: versionTag,
3768
+ pluginConfigurationMappings: this.getMappingsForPayload(),
3769
+ inputMappings: [],
3770
+ outputMappings: [],
3771
+ };
3772
+ this.stateService.sendProcessLinkUpdateEvent(request);
3773
+ });
3774
+ }
3775
+ getMappingsForPayload() {
3776
+ const mappings = this.buildingBlockStateService.getPluginConfigurationMappingsSnapshot();
3777
+ return Object.entries(mappings).reduce((acc, [pluginKey, configurationId]) => {
3778
+ if (configurationId)
3779
+ acc[pluginKey] = configurationId;
3780
+ return acc;
3781
+ }, {});
3782
+ }
3783
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ConfigureBuildingBlockPluginsComponent, deps: [{ token: ProcessLinkStateService }, { token: BuildingBlockStateService }, { token: ProcessLinkButtonService }, { token: ProcessLinkStepService }, { token: i1$1.PluginManagementService }, { token: i1$1.PluginTranslationService }, { token: ProcessLinkService }, { token: i3.TranslateService }, { token: ProcessLinkBuildingBlockApiService }], target: i0.ɵɵFactoryTarget.Component }); }
3784
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: ConfigureBuildingBlockPluginsComponent, isStandalone: false, selector: "valtimo-configure-building-block-plugins", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"configure-building-block-plugins\">\n <div\n *ngIf=\"dependenciesNotificationObject$ | async as dependenciesNotificationObject\"\n class=\"configure-building-block-plugins__warning\"\n >\n <cds-notification [notificationObj]=\"dependenciesNotificationObject\"> </cds-notification>\n </div>\n\n @if (versionItems$ | async; as versionItems) {\n @let versionPlaceholder = versionPlaceholder$ | async;\n <div class=\"version-select\">\n <cds-combo-box\n cdsLayer\n size=\"lg\"\n [appendInline]=\"true\"\n [label]=\"'processLinkConfiguration.buildingBlock.versionLabel' | translate\"\n [placeholder]=\"versionPlaceholder || ''\"\n (selected)=\"onVersionChange($event?.id || '')\"\n (clear)=\"onVersionChange('')\"\n >\n <cds-dropdown-list [items]=\"versionItems\"></cds-dropdown-list>\n </cds-combo-box>\n </div>\n }\n\n @if (loading$ | async) {\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n } @else {\n <div class=\"plugin-list\">\n @if (definitionVersionTag$ | async) {\n @if (isNestedBuildingBlock$ | async) {\n <div class=\"empty-state\">\n {{ 'processLinkConfiguration.buildingBlock.nestedBuildingBlockInfo' | translate }}\n </div>\n } @else {\n @if (pluginConfigurationViewModels$ | async; as pluginConfigurationViewModels) {\n @if (pluginConfigurationViewModels.length === 0) {\n <div class=\"empty-state\">\n {{ 'processLinkConfiguration.buildingBlock.noRequirements' | translate }}\n </div>\n } @else {\n @let configurationPlaceholder = configurationPlaceholder$ | async;\n\n <div class=\"plugin-row\">\n <v-input-label\n [title]=\"'processLinkConfiguration.buildingBlock.pluginLabel' | translate\"\n >\n </v-input-label>\n <v-input-label\n [title]=\"'processLinkConfiguration.buildingBlock.configurationLabel' | translate\"\n required=\"true\"\n >\n </v-input-label>\n </div>\n\n @for (plugin of pluginConfigurationViewModels; track plugin.key) {\n <div class=\"plugin-row\">\n <div class=\"plugin-label\">\n {{ plugin.label }}\n </div>\n\n <cds-combo-box\n cdsLayer\n size=\"lg\"\n [appendInline]=\"true\"\n [placeholder]=\"configurationPlaceholder || ''\"\n (selected)=\"onMappingChange(plugin.key, $event?.id || '')\"\n (clear)=\"onMappingChange(plugin.key, '')\"\n >\n <cds-dropdown-list [items]=\"plugin.dropdownItems\"></cds-dropdown-list>\n </cds-combo-box>\n </div>\n }\n }\n }\n }\n }\n </div>\n }\n</div>\n", styles: [".loading-container{display:flex;justify-content:center;padding:2rem 0}.empty-state{padding:1rem;border:1px solid #e0e0e0;border-radius:4px;background-color:#f4f4f4;color:#8d8d8d}.plugin-row{display:grid;align-items:center;grid-template-columns:1fr 1fr;margin-bottom:15px}.plugin-row .plugin-label{padding-left:16px;border-block-end:1px solid var(--cds-border-strong);height:100%;margin-right:15px;display:grid;align-items:center}.plugin-list{margin-top:30px}.configure-building-block-plugins__warning{display:flex;width:100%;margin-bottom:24px}.configure-building-block-plugins__warning ::ng-deep cds-notification{max-inline-size:100%;min-inline-size:100%}\n"], dependencies: [{ kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$2.ComboBox, selector: "cds-combo-box, ibm-combo-box", inputs: ["placeholder", "openMenuAria", "closeMenuAria", "clearSelectionsTitle", "clearSelectionsAria", "clearSelectionTitle", "clearSelectionAria", "id", "labelId", "items", "type", "size", "itemValueKey", "label", "hideLabel", "helperText", "appendInline", "invalid", "invalidText", "warn", "warnText", "maxLength", "theme", "selectionFeedback", "autocomplete", "dropUp", "disabled", "readonly", "fluid"], outputs: ["selected", "submit", "close", "search", "clear"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i3$2.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "directive", type: i3$2.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "component", type: i2$1.InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "component", type: i3$2.Notification, selector: "cds-notification, cds-inline-notification, ibm-notification, ibm-inline-notification", inputs: ["notificationObj"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
3785
+ }
3786
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ConfigureBuildingBlockPluginsComponent, decorators: [{
3787
+ type: Component,
3788
+ args: [{ standalone: false, selector: 'valtimo-configure-building-block-plugins', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"configure-building-block-plugins\">\n <div\n *ngIf=\"dependenciesNotificationObject$ | async as dependenciesNotificationObject\"\n class=\"configure-building-block-plugins__warning\"\n >\n <cds-notification [notificationObj]=\"dependenciesNotificationObject\"> </cds-notification>\n </div>\n\n @if (versionItems$ | async; as versionItems) {\n @let versionPlaceholder = versionPlaceholder$ | async;\n <div class=\"version-select\">\n <cds-combo-box\n cdsLayer\n size=\"lg\"\n [appendInline]=\"true\"\n [label]=\"'processLinkConfiguration.buildingBlock.versionLabel' | translate\"\n [placeholder]=\"versionPlaceholder || ''\"\n (selected)=\"onVersionChange($event?.id || '')\"\n (clear)=\"onVersionChange('')\"\n >\n <cds-dropdown-list [items]=\"versionItems\"></cds-dropdown-list>\n </cds-combo-box>\n </div>\n }\n\n @if (loading$ | async) {\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n } @else {\n <div class=\"plugin-list\">\n @if (definitionVersionTag$ | async) {\n @if (isNestedBuildingBlock$ | async) {\n <div class=\"empty-state\">\n {{ 'processLinkConfiguration.buildingBlock.nestedBuildingBlockInfo' | translate }}\n </div>\n } @else {\n @if (pluginConfigurationViewModels$ | async; as pluginConfigurationViewModels) {\n @if (pluginConfigurationViewModels.length === 0) {\n <div class=\"empty-state\">\n {{ 'processLinkConfiguration.buildingBlock.noRequirements' | translate }}\n </div>\n } @else {\n @let configurationPlaceholder = configurationPlaceholder$ | async;\n\n <div class=\"plugin-row\">\n <v-input-label\n [title]=\"'processLinkConfiguration.buildingBlock.pluginLabel' | translate\"\n >\n </v-input-label>\n <v-input-label\n [title]=\"'processLinkConfiguration.buildingBlock.configurationLabel' | translate\"\n required=\"true\"\n >\n </v-input-label>\n </div>\n\n @for (plugin of pluginConfigurationViewModels; track plugin.key) {\n <div class=\"plugin-row\">\n <div class=\"plugin-label\">\n {{ plugin.label }}\n </div>\n\n <cds-combo-box\n cdsLayer\n size=\"lg\"\n [appendInline]=\"true\"\n [placeholder]=\"configurationPlaceholder || ''\"\n (selected)=\"onMappingChange(plugin.key, $event?.id || '')\"\n (clear)=\"onMappingChange(plugin.key, '')\"\n >\n <cds-dropdown-list [items]=\"plugin.dropdownItems\"></cds-dropdown-list>\n </cds-combo-box>\n </div>\n }\n }\n }\n }\n }\n </div>\n }\n</div>\n", styles: [".loading-container{display:flex;justify-content:center;padding:2rem 0}.empty-state{padding:1rem;border:1px solid #e0e0e0;border-radius:4px;background-color:#f4f4f4;color:#8d8d8d}.plugin-row{display:grid;align-items:center;grid-template-columns:1fr 1fr;margin-bottom:15px}.plugin-row .plugin-label{padding-left:16px;border-block-end:1px solid var(--cds-border-strong);height:100%;margin-right:15px;display:grid;align-items:center}.plugin-list{margin-top:30px}.configure-building-block-plugins__warning{display:flex;width:100%;margin-bottom:24px}.configure-building-block-plugins__warning ::ng-deep cds-notification{max-inline-size:100%;min-inline-size:100%}\n"] }]
3789
+ }], ctorParameters: () => [{ type: ProcessLinkStateService }, { type: BuildingBlockStateService }, { type: ProcessLinkButtonService }, { type: ProcessLinkStepService }, { type: i1$1.PluginManagementService }, { type: i1$1.PluginTranslationService }, { type: ProcessLinkService }, { type: i3.TranslateService }, { type: ProcessLinkBuildingBlockApiService }] });
3790
+
2246
3791
  /*
2247
3792
  * Copyright 2015-2025 Ritense BV, the Netherlands.
2248
3793
  *
@@ -2259,12 +3804,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
2259
3804
  * limitations under the License.
2260
3805
  */
2261
3806
  class ProcessLinkModalComponent {
2262
- constructor(stateService, stepService, buttonService, pluginStateService, processLinkService, processLinkStateService, configService) {
3807
+ constructor(stateService, stepService, buttonService, pluginStateService, processLinkStateService, configService) {
2263
3808
  this.stateService = stateService;
2264
3809
  this.stepService = stepService;
2265
3810
  this.buttonService = buttonService;
2266
3811
  this.pluginStateService = pluginStateService;
2267
- this.processLinkService = processLinkService;
2268
3812
  this.processLinkStateService = processLinkStateService;
2269
3813
  this.configService = configService;
2270
3814
  this.showModal$ = this.stateService.showModal$;
@@ -2281,6 +3825,7 @@ class ProcessLinkModalComponent {
2281
3825
  this.saving$ = this.stateService.saving$;
2282
3826
  this.typeOfSelectedProcessLink$ = this.stateService.typeOfSelectedProcessLink$;
2283
3827
  this.viewModelEnabled$ = this.stateService.viewModelEnabled$;
3828
+ this.isEditing$ = this.stateService.isEditing$;
2284
3829
  this.selectedPluginConfiguration$ = this.pluginStateService.selectedPluginConfiguration$;
2285
3830
  this.showViewModelToggle = this.configService.config.featureToggles.enableFormViewModel;
2286
3831
  }
@@ -2298,30 +3843,21 @@ class ProcessLinkModalComponent {
2298
3843
  }
2299
3844
  unlinkButtonClick() {
2300
3845
  this.stateService.selectedProcessLink$.pipe(take(1)).subscribe(selectedProcessLink => {
2301
- if (this.processLinkStateService.processLinkEditMode === ProcessLinkEditMode.EMIT_EVENTS) {
2302
- this.processLinkStateService.sendProcessLinkDeleteEvent({
2303
- activityId: selectedProcessLink.activityId,
2304
- });
2305
- return;
2306
- }
2307
- this.stateService.startSaving();
2308
- this.processLinkService.deleteProcessLink(selectedProcessLink.id).subscribe(() => {
2309
- this.stateService.closeModal();
2310
- }, () => {
2311
- this.stateService.stopSaving();
3846
+ this.processLinkStateService.sendProcessLinkDeleteEvent({
3847
+ activityId: selectedProcessLink.activityId,
2312
3848
  });
2313
3849
  });
2314
3850
  }
2315
3851
  toggleCheckedChange(value) {
2316
3852
  this.processLinkStateService.setViewModelEnabled(value);
2317
3853
  }
2318
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkModalComponent, deps: [{ token: ProcessLinkStateService }, { token: ProcessLinkStepService }, { token: ProcessLinkButtonService }, { token: PluginStateService }, { token: ProcessLinkService }, { token: ProcessLinkStateService }, { token: i2.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
2319
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: ProcessLinkModalComponent, isStandalone: false, selector: "valtimo-process-link-modal", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"process-link-modal-container\"\n *ngIf=\"{\n showModal: showModal$ | async,\n processStepName: processStepName$ | async,\n steps: steps$ | async,\n currentStepIndex: currentStepIndex$ | async,\n currentStepId: currentStepId$ | async,\n showSaveButton: showSaveButton$ | async,\n enableSaveButton: enableSaveButton$ | async,\n showBackButton: showBackButton$ | async,\n showNextButton: showNextButton$ | async,\n enableNextButton: enableNextButton$ | async,\n saving: saving$ | async,\n hideProgressIndicator: hideProgressIndicator$ | async,\n typeOfSelectedProgressLink: typeOfSelectedProcessLink$ | async,\n } as obs\"\n>\n <cds-modal valtimoCdsModal [open]=\"obs.showModal\" size=\"lg\" (close)=\"closeModal()\">\n <cds-modal-header (closeSelect)=\"closeModal()\">\n <h2 cdsModalHeaderLabel>{{ 'processLinkConfiguration.configureStep' | translate }}</h2>\n <h3 cdsModalHeaderHeading>\n {{\n 'processLinkConfiguration.modalTitle'\n | translate: {processStepName: obs.processStepName || '-'}\n }}\n </h3>\n <div class=\"process-link-progress\" *ngIf=\"!obs.typeOfSelectedProgressLink\">\n <ng-container *ngTemplateOutlet=\"progressIndicator; context: {obs: obs}\"></ng-container>\n </div>\n </cds-modal-header>\n <section cdsModalContent [cdsLayer]=\"1\">\n <ng-container *ngTemplateOutlet=\"stepContent; context: {obs: obs}\"></ng-container>\n </section>\n <ng-template *ngTemplateOutlet=\"footer; context: {obs: obs}\"></ng-template>\n </cds-modal>\n</div>\n\n<ng-template #progressIndicator let-obs=\"obs\">\n <cds-progress-indicator\n *ngIf=\"obs.steps && !obs.hideProgressIndicator\"\n [steps]=\"obs.steps\"\n [current]=\"obs.currentStepIndex\"\n spacing=\"equal\"\n ></cds-progress-indicator>\n</ng-template>\n\n<ng-template #stepContent let-obs=\"obs\">\n <div class=\"cds-loading-container\" *ngIf=\"obs.saving\">\n <cds-loading></cds-loading>\n </div>\n <div [ngClass]=\"{hidden: obs.saving}\">\n <ng-container>\n <ng-container *ngIf=\"obs.currentStepId === 'chooseProcessLinkType'\">\n <valtimo-choose-process-link-type></valtimo-choose-process-link-type>\n </ng-container>\n <ng-container\n *ngIf=\"obs.currentStepId === 'selectForm' || obs.typeOfSelectedProgressLink === 'form'\"\n >\n <valtimo-select-form></valtimo-select-form>\n <br />\n <cds-toggle\n *ngIf=\"showViewModelToggle\"\n [label]=\"'processLinkConfiguration.toggleViewModel.title' | translate\"\n [onText]=\"'processLinkConfiguration.toggleViewModel.checkboxDescription' | translate\"\n [offText]=\"'processLinkConfiguration.toggleViewModel.checkboxDescription' | translate\"\n [checked]=\"viewModelEnabled$ | async\"\n (checkedChange)=\"toggleCheckedChange($event)\"\n ></cds-toggle>\n </ng-container>\n <ng-container\n *ngIf=\"\n obs.currentStepId === 'selectFormFlow' || obs.typeOfSelectedProgressLink === 'form-flow'\n \"\n >\n <valtimo-select-form-flow></valtimo-select-form-flow>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'choosePluginConfiguration'\">\n <valtimo-select-plugin-configuration></valtimo-select-plugin-configuration>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'choosePluginAction'\">\n <valtimo-select-plugin-action></valtimo-select-plugin-action>\n </ng-container>\n\n <ng-container\n *ngIf=\"\n obs.currentStepId === 'configurePluginAction' ||\n obs.typeOfSelectedProgressLink === 'plugin'\n \"\n >\n <valtimo-plugin-action-configuration\n [selectedPluginConfiguration$]=\"selectedPluginConfiguration$\"\n ></valtimo-plugin-action-configuration>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"\n obs.currentStepId === 'uiComponent' || obs.typeOfSelectedProgressLink === 'ui-component'\n \"\n >\n <valtimo-select-ui-component></valtimo-select-ui-component>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #footer let-obs=\"obs\">\n <cds-modal-footer *ngIf=\"!obs.saving\">\n <div class=\"cancel-button\">\n <button cdsButton=\"ghost\" (click)=\"closeModal()\" [disabled]=\"obs.disabled\">\n {{ 'processLinkConfiguration.cancel' | translate }}\n </button>\n </div>\n <div class=\"navigation-buttons\">\n <button\n *ngIf=\"obs.showBackButton && !obs.saving\"\n cdsButton=\"secondary\"\n (click)=\"backButtonClick()\"\n >\n {{ 'processLinkConfiguration.back' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n *ngIf=\"obs.showNextButton && !obs.saving\"\n [disabled]=\"!obs.enableNextButton\"\n (click)=\"nextButtonClick()\"\n >\n {{ 'processLinkConfiguration.next' | translate }}\n </button>\n <button\n cdsButton=\"danger--primary\"\n *ngIf=\"obs.typeOfSelectedProgressLink\"\n (click)=\"unlinkButtonClick()\"\n >\n {{ 'processLinkConfiguration.unlink' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n *ngIf=\"(obs.showSaveButton && !obs.saving) || obs.typeOfSelectedProgressLink\"\n [disabled]=\"!obs.enableSaveButton\"\n (click)=\"saveButtonClick()\"\n >\n {{ 'processLinkConfiguration.complete' | translate }}\n </button>\n </div>\n </cds-modal-footer>\n</ng-template>\n", styles: ["::ng-deep .process-link-modal-container .cds--modal-container{max-width:960px;min-height:70%}::ng-deep .process-link-modal-container .cds--modal-footer{justify-content:space-between}.cds-loading-container{position:absolute;top:50px;padding-bottom:50px;left:0;width:100%;height:calc(100% - 50px);display:flex;justify-content:center;align-items:center;background:var(--cds-layer);z-index:99;box-sizing:border-box}.navigation-buttons{justify-content:flex-end}.navigation-buttons,.cancel-button{max-width:50%;display:flex;flex-direction:row;flex-grow:1}.navigation-buttons button,.cancel-button button{min-width:50%}.cancel-button{max-width:25%}.cancel-button button{min-width:100%}.process-link-progress{width:100%;margin-top:32px;margin-bottom:40px}.hidden{visibility:hidden}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i4.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i4.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i4.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i4.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "directive", type: i4.ModalHeaderLabel, selector: "[cdsModalHeaderLabel], [ibmModalHeaderLabel]" }, { kind: "component", type: i4.ProgressIndicator, selector: "cds-progress-indicator, ibm-progress-indicator", inputs: ["current", "steps", "translations", "orientation", "skeleton", "spacing"], outputs: ["stepSelected"] }, { kind: "directive", type: i4.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i4.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "directive", type: i2$2.ValtimoCdsModalDirective, selector: "[valtimoCdsModal]", inputs: ["minContentHeight"] }, { kind: "component", type: i4.Toggle, selector: "cds-toggle, ibm-toggle", inputs: ["offText", "onText", "label", "size", "hideLabel", "ariaLabel", "skeleton"] }, { kind: "directive", type: i4.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "component", type: SelectPluginConfigurationComponent, selector: "valtimo-select-plugin-configuration" }, { kind: "component", type: SelectPluginActionComponent, selector: "valtimo-select-plugin-action" }, { kind: "component", type: PluginActionConfigurationComponent, selector: "valtimo-plugin-action-configuration", inputs: ["selectedPluginConfiguration$"], outputs: ["valid", "configuration"] }, { kind: "component", type: ChooseProcessLinkTypeComponent, selector: "valtimo-choose-process-link-type" }, { kind: "component", type: SelectFormComponent, selector: "valtimo-select-form" }, { kind: "component", type: SelectFormFlowComponent, selector: "valtimo-select-form-flow" }, { kind: "component", type: SelectUIComponentComponent, selector: "valtimo-select-ui-component" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] }); }
3854
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkModalComponent, deps: [{ token: ProcessLinkStateService }, { token: ProcessLinkStepService }, { token: ProcessLinkButtonService }, { token: PluginStateService }, { token: ProcessLinkStateService }, { token: i1.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
3855
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: ProcessLinkModalComponent, isStandalone: false, selector: "valtimo-process-link-modal", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"process-link-modal-container\"\n *ngIf=\"{\n showModal: showModal$ | async,\n processStepName: processStepName$ | async,\n steps: steps$ | async,\n currentStepIndex: currentStepIndex$ | async,\n currentStepId: currentStepId$ | async,\n showSaveButton: showSaveButton$ | async,\n enableSaveButton: enableSaveButton$ | async,\n showBackButton: showBackButton$ | async,\n showNextButton: showNextButton$ | async,\n enableNextButton: enableNextButton$ | async,\n saving: saving$ | async,\n hideProgressIndicator: hideProgressIndicator$ | async,\n typeOfSelectedProgressLink: typeOfSelectedProcessLink$ | async,\n isEditing: isEditing$ | async,\n } as obs\"\n>\n <cds-modal valtimoCdsModal [open]=\"obs.showModal\" size=\"lg\" (close)=\"closeModal()\">\n <cds-modal-header (closeSelect)=\"closeModal()\">\n <h2 cdsModalHeaderLabel>{{ 'processLinkConfiguration.configureStep' | translate }}</h2>\n <h3 cdsModalHeaderHeading>\n {{\n 'processLinkConfiguration.modalTitle'\n | translate: {processStepName: obs.processStepName || '-'}\n }}\n </h3>\n <div class=\"process-link-progress\">\n <ng-container *ngTemplateOutlet=\"progressIndicator; context: {obs: obs}\"></ng-container>\n </div>\n </cds-modal-header>\n <section cdsModalContent [cdsLayer]=\"1\">\n <ng-container *ngTemplateOutlet=\"stepContent; context: {obs: obs}\"></ng-container>\n </section>\n <ng-template *ngTemplateOutlet=\"footer; context: {obs: obs}\"></ng-template>\n </cds-modal>\n</div>\n\n<ng-template #progressIndicator let-obs=\"obs\">\n <cds-progress-indicator\n *ngIf=\"obs.steps && !obs.hideProgressIndicator\"\n [steps]=\"obs.steps\"\n [current]=\"obs.currentStepIndex\"\n spacing=\"equal\"\n ></cds-progress-indicator>\n</ng-template>\n\n<ng-template #stepContent let-obs=\"obs\">\n <div class=\"cds-loading-container\" *ngIf=\"obs.saving\">\n <cds-loading></cds-loading>\n </div>\n <div [ngClass]=\"{hidden: obs.saving}\">\n <ng-container>\n <ng-container *ngIf=\"obs.currentStepId === 'chooseProcessLinkType'\">\n <valtimo-choose-process-link-type></valtimo-choose-process-link-type>\n </ng-container>\n <ng-container *ngIf=\"obs.currentStepId === 'selectForm'\">\n <valtimo-select-form></valtimo-select-form>\n <br />\n <cds-toggle\n *ngIf=\"showViewModelToggle\"\n [label]=\"'processLinkConfiguration.toggleViewModel.title' | translate\"\n [onText]=\"'processLinkConfiguration.toggleViewModel.checkboxDescription' | translate\"\n [offText]=\"'processLinkConfiguration.toggleViewModel.checkboxDescription' | translate\"\n [checked]=\"viewModelEnabled$ | async\"\n (checkedChange)=\"toggleCheckedChange($event)\"\n ></cds-toggle>\n </ng-container>\n <ng-container *ngIf=\"obs.currentStepId === 'selectFormFlow'\">\n <valtimo-select-form-flow></valtimo-select-form-flow>\n </ng-container>\n\n <ng-container\n *ngIf=\"\n obs.currentStepId === 'choosePluginConfiguration' ||\n obs.currentStepId === 'choosePluginDefinition'\n \"\n >\n <valtimo-select-plugin-configuration></valtimo-select-plugin-configuration>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'selectBuildingBlock'\">\n <valtimo-select-building-block></valtimo-select-building-block>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'choosePluginAction'\">\n <valtimo-select-plugin-action></valtimo-select-plugin-action>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'configurePluginAction'\">\n <valtimo-plugin-action-configuration\n [selectedPluginConfiguration$]=\"selectedPluginConfiguration$\"\n ></valtimo-plugin-action-configuration>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'configureBuildingBlockPlugins'\">\n <valtimo-configure-building-block-plugins></valtimo-configure-building-block-plugins>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'configureBuildingBlockMappings'\">\n <valtimo-configure-building-block-mappings></valtimo-configure-building-block-mappings>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'uiComponent'\">\n <valtimo-select-ui-component></valtimo-select-ui-component>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #footer let-obs=\"obs\">\n <cds-modal-footer *ngIf=\"!obs.saving\">\n <div class=\"cancel-button\">\n <button cdsButton=\"ghost\" (click)=\"closeModal()\" [disabled]=\"obs.disabled\">\n {{ 'processLinkConfiguration.cancel' | translate }}\n </button>\n </div>\n <div class=\"footer-spacer\"></div>\n <div class=\"action-buttons\">\n <button\n cdsButton=\"danger--primary\"\n *ngIf=\"obs.isEditing\"\n (click)=\"unlinkButtonClick()\"\n >\n {{ 'processLinkConfiguration.unlink' | translate }}\n </button>\n <button\n *ngIf=\"obs.showBackButton && !obs.saving\"\n cdsButton=\"secondary\"\n (click)=\"backButtonClick()\"\n >\n {{ 'processLinkConfiguration.back' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n *ngIf=\"obs.showNextButton && !obs.saving\"\n [disabled]=\"!obs.enableNextButton\"\n (click)=\"nextButtonClick()\"\n >\n {{ 'processLinkConfiguration.next' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n *ngIf=\"obs.showSaveButton && !obs.saving\"\n [disabled]=\"!obs.enableSaveButton\"\n (click)=\"saveButtonClick()\"\n >\n {{ 'processLinkConfiguration.complete' | translate }}\n </button>\n </div>\n </cds-modal-footer>\n</ng-template>\n", styles: ["::ng-deep .process-link-modal-container .cds--modal-container{max-width:960px;min-height:70%}::ng-deep .process-link-modal-container .cds--modal-footer{display:flex;flex-direction:row}.cds-loading-container{position:absolute;top:50px;padding-bottom:50px;left:0;width:100%;height:calc(100% - 50px);display:flex;justify-content:center;align-items:center;background:var(--cds-layer);z-index:99;box-sizing:border-box}.cancel-button{width:20%;display:flex}.cancel-button button{width:100%}.footer-spacer{width:20%}.action-buttons{width:60%;display:flex;flex-direction:row;justify-content:flex-end}.action-buttons button{flex:1;max-width:33.33%}.process-link-progress{width:100%;margin-top:32px;margin-bottom:16px}.hidden{visibility:hidden}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3$2.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i3$2.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i3$2.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i3$2.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i3$2.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "directive", type: i3$2.ModalHeaderLabel, selector: "[cdsModalHeaderLabel], [ibmModalHeaderLabel]" }, { kind: "component", type: i3$2.ProgressIndicator, selector: "cds-progress-indicator, ibm-progress-indicator", inputs: ["current", "steps", "translations", "orientation", "skeleton", "spacing"], outputs: ["stepSelected"] }, { kind: "directive", type: i3$2.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i3$2.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "directive", type: i2$1.ValtimoCdsModalDirective, selector: "[valtimoCdsModal]", inputs: ["minContentHeight"] }, { kind: "component", type: i3$2.Toggle, selector: "cds-toggle, ibm-toggle", inputs: ["offText", "onText", "label", "size", "hideLabel", "ariaLabel", "skeleton"] }, { kind: "directive", type: i3$2.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "component", type: ConfigureBuildingBlockMappingsComponent, selector: "valtimo-configure-building-block-mappings" }, { kind: "component", type: SelectPluginConfigurationComponent, selector: "valtimo-select-plugin-configuration" }, { kind: "component", type: SelectPluginActionComponent, selector: "valtimo-select-plugin-action" }, { kind: "component", type: PluginActionConfigurationComponent, selector: "valtimo-plugin-action-configuration", inputs: ["selectedPluginConfiguration$"], outputs: ["valid", "configuration"] }, { kind: "component", type: ChooseProcessLinkTypeComponent, selector: "valtimo-choose-process-link-type" }, { kind: "component", type: SelectFormComponent, selector: "valtimo-select-form" }, { kind: "component", type: SelectFormFlowComponent, selector: "valtimo-select-form-flow" }, { kind: "component", type: SelectUIComponentComponent, selector: "valtimo-select-ui-component" }, { kind: "component", type: SelectBuildingBlockComponent, selector: "valtimo-select-building-block" }, { kind: "component", type: ConfigureBuildingBlockPluginsComponent, selector: "valtimo-configure-building-block-plugins" }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
2320
3856
  }
2321
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkModalComponent, decorators: [{
3857
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkModalComponent, decorators: [{
2322
3858
  type: Component,
2323
- args: [{ standalone: false, selector: 'valtimo-process-link-modal', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"process-link-modal-container\"\n *ngIf=\"{\n showModal: showModal$ | async,\n processStepName: processStepName$ | async,\n steps: steps$ | async,\n currentStepIndex: currentStepIndex$ | async,\n currentStepId: currentStepId$ | async,\n showSaveButton: showSaveButton$ | async,\n enableSaveButton: enableSaveButton$ | async,\n showBackButton: showBackButton$ | async,\n showNextButton: showNextButton$ | async,\n enableNextButton: enableNextButton$ | async,\n saving: saving$ | async,\n hideProgressIndicator: hideProgressIndicator$ | async,\n typeOfSelectedProgressLink: typeOfSelectedProcessLink$ | async,\n } as obs\"\n>\n <cds-modal valtimoCdsModal [open]=\"obs.showModal\" size=\"lg\" (close)=\"closeModal()\">\n <cds-modal-header (closeSelect)=\"closeModal()\">\n <h2 cdsModalHeaderLabel>{{ 'processLinkConfiguration.configureStep' | translate }}</h2>\n <h3 cdsModalHeaderHeading>\n {{\n 'processLinkConfiguration.modalTitle'\n | translate: {processStepName: obs.processStepName || '-'}\n }}\n </h3>\n <div class=\"process-link-progress\" *ngIf=\"!obs.typeOfSelectedProgressLink\">\n <ng-container *ngTemplateOutlet=\"progressIndicator; context: {obs: obs}\"></ng-container>\n </div>\n </cds-modal-header>\n <section cdsModalContent [cdsLayer]=\"1\">\n <ng-container *ngTemplateOutlet=\"stepContent; context: {obs: obs}\"></ng-container>\n </section>\n <ng-template *ngTemplateOutlet=\"footer; context: {obs: obs}\"></ng-template>\n </cds-modal>\n</div>\n\n<ng-template #progressIndicator let-obs=\"obs\">\n <cds-progress-indicator\n *ngIf=\"obs.steps && !obs.hideProgressIndicator\"\n [steps]=\"obs.steps\"\n [current]=\"obs.currentStepIndex\"\n spacing=\"equal\"\n ></cds-progress-indicator>\n</ng-template>\n\n<ng-template #stepContent let-obs=\"obs\">\n <div class=\"cds-loading-container\" *ngIf=\"obs.saving\">\n <cds-loading></cds-loading>\n </div>\n <div [ngClass]=\"{hidden: obs.saving}\">\n <ng-container>\n <ng-container *ngIf=\"obs.currentStepId === 'chooseProcessLinkType'\">\n <valtimo-choose-process-link-type></valtimo-choose-process-link-type>\n </ng-container>\n <ng-container\n *ngIf=\"obs.currentStepId === 'selectForm' || obs.typeOfSelectedProgressLink === 'form'\"\n >\n <valtimo-select-form></valtimo-select-form>\n <br />\n <cds-toggle\n *ngIf=\"showViewModelToggle\"\n [label]=\"'processLinkConfiguration.toggleViewModel.title' | translate\"\n [onText]=\"'processLinkConfiguration.toggleViewModel.checkboxDescription' | translate\"\n [offText]=\"'processLinkConfiguration.toggleViewModel.checkboxDescription' | translate\"\n [checked]=\"viewModelEnabled$ | async\"\n (checkedChange)=\"toggleCheckedChange($event)\"\n ></cds-toggle>\n </ng-container>\n <ng-container\n *ngIf=\"\n obs.currentStepId === 'selectFormFlow' || obs.typeOfSelectedProgressLink === 'form-flow'\n \"\n >\n <valtimo-select-form-flow></valtimo-select-form-flow>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'choosePluginConfiguration'\">\n <valtimo-select-plugin-configuration></valtimo-select-plugin-configuration>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'choosePluginAction'\">\n <valtimo-select-plugin-action></valtimo-select-plugin-action>\n </ng-container>\n\n <ng-container\n *ngIf=\"\n obs.currentStepId === 'configurePluginAction' ||\n obs.typeOfSelectedProgressLink === 'plugin'\n \"\n >\n <valtimo-plugin-action-configuration\n [selectedPluginConfiguration$]=\"selectedPluginConfiguration$\"\n ></valtimo-plugin-action-configuration>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"\n obs.currentStepId === 'uiComponent' || obs.typeOfSelectedProgressLink === 'ui-component'\n \"\n >\n <valtimo-select-ui-component></valtimo-select-ui-component>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #footer let-obs=\"obs\">\n <cds-modal-footer *ngIf=\"!obs.saving\">\n <div class=\"cancel-button\">\n <button cdsButton=\"ghost\" (click)=\"closeModal()\" [disabled]=\"obs.disabled\">\n {{ 'processLinkConfiguration.cancel' | translate }}\n </button>\n </div>\n <div class=\"navigation-buttons\">\n <button\n *ngIf=\"obs.showBackButton && !obs.saving\"\n cdsButton=\"secondary\"\n (click)=\"backButtonClick()\"\n >\n {{ 'processLinkConfiguration.back' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n *ngIf=\"obs.showNextButton && !obs.saving\"\n [disabled]=\"!obs.enableNextButton\"\n (click)=\"nextButtonClick()\"\n >\n {{ 'processLinkConfiguration.next' | translate }}\n </button>\n <button\n cdsButton=\"danger--primary\"\n *ngIf=\"obs.typeOfSelectedProgressLink\"\n (click)=\"unlinkButtonClick()\"\n >\n {{ 'processLinkConfiguration.unlink' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n *ngIf=\"(obs.showSaveButton && !obs.saving) || obs.typeOfSelectedProgressLink\"\n [disabled]=\"!obs.enableSaveButton\"\n (click)=\"saveButtonClick()\"\n >\n {{ 'processLinkConfiguration.complete' | translate }}\n </button>\n </div>\n </cds-modal-footer>\n</ng-template>\n", styles: ["::ng-deep .process-link-modal-container .cds--modal-container{max-width:960px;min-height:70%}::ng-deep .process-link-modal-container .cds--modal-footer{justify-content:space-between}.cds-loading-container{position:absolute;top:50px;padding-bottom:50px;left:0;width:100%;height:calc(100% - 50px);display:flex;justify-content:center;align-items:center;background:var(--cds-layer);z-index:99;box-sizing:border-box}.navigation-buttons{justify-content:flex-end}.navigation-buttons,.cancel-button{max-width:50%;display:flex;flex-direction:row;flex-grow:1}.navigation-buttons button,.cancel-button button{min-width:50%}.cancel-button{max-width:25%}.cancel-button button{min-width:100%}.process-link-progress{width:100%;margin-top:32px;margin-bottom:40px}.hidden{visibility:hidden}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
2324
- }], ctorParameters: () => [{ type: ProcessLinkStateService }, { type: ProcessLinkStepService }, { type: ProcessLinkButtonService }, { type: PluginStateService }, { type: ProcessLinkService }, { type: ProcessLinkStateService }, { type: i2.ConfigService }] });
3859
+ args: [{ standalone: false, selector: 'valtimo-process-link-modal', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"process-link-modal-container\"\n *ngIf=\"{\n showModal: showModal$ | async,\n processStepName: processStepName$ | async,\n steps: steps$ | async,\n currentStepIndex: currentStepIndex$ | async,\n currentStepId: currentStepId$ | async,\n showSaveButton: showSaveButton$ | async,\n enableSaveButton: enableSaveButton$ | async,\n showBackButton: showBackButton$ | async,\n showNextButton: showNextButton$ | async,\n enableNextButton: enableNextButton$ | async,\n saving: saving$ | async,\n hideProgressIndicator: hideProgressIndicator$ | async,\n typeOfSelectedProgressLink: typeOfSelectedProcessLink$ | async,\n isEditing: isEditing$ | async,\n } as obs\"\n>\n <cds-modal valtimoCdsModal [open]=\"obs.showModal\" size=\"lg\" (close)=\"closeModal()\">\n <cds-modal-header (closeSelect)=\"closeModal()\">\n <h2 cdsModalHeaderLabel>{{ 'processLinkConfiguration.configureStep' | translate }}</h2>\n <h3 cdsModalHeaderHeading>\n {{\n 'processLinkConfiguration.modalTitle'\n | translate: {processStepName: obs.processStepName || '-'}\n }}\n </h3>\n <div class=\"process-link-progress\">\n <ng-container *ngTemplateOutlet=\"progressIndicator; context: {obs: obs}\"></ng-container>\n </div>\n </cds-modal-header>\n <section cdsModalContent [cdsLayer]=\"1\">\n <ng-container *ngTemplateOutlet=\"stepContent; context: {obs: obs}\"></ng-container>\n </section>\n <ng-template *ngTemplateOutlet=\"footer; context: {obs: obs}\"></ng-template>\n </cds-modal>\n</div>\n\n<ng-template #progressIndicator let-obs=\"obs\">\n <cds-progress-indicator\n *ngIf=\"obs.steps && !obs.hideProgressIndicator\"\n [steps]=\"obs.steps\"\n [current]=\"obs.currentStepIndex\"\n spacing=\"equal\"\n ></cds-progress-indicator>\n</ng-template>\n\n<ng-template #stepContent let-obs=\"obs\">\n <div class=\"cds-loading-container\" *ngIf=\"obs.saving\">\n <cds-loading></cds-loading>\n </div>\n <div [ngClass]=\"{hidden: obs.saving}\">\n <ng-container>\n <ng-container *ngIf=\"obs.currentStepId === 'chooseProcessLinkType'\">\n <valtimo-choose-process-link-type></valtimo-choose-process-link-type>\n </ng-container>\n <ng-container *ngIf=\"obs.currentStepId === 'selectForm'\">\n <valtimo-select-form></valtimo-select-form>\n <br />\n <cds-toggle\n *ngIf=\"showViewModelToggle\"\n [label]=\"'processLinkConfiguration.toggleViewModel.title' | translate\"\n [onText]=\"'processLinkConfiguration.toggleViewModel.checkboxDescription' | translate\"\n [offText]=\"'processLinkConfiguration.toggleViewModel.checkboxDescription' | translate\"\n [checked]=\"viewModelEnabled$ | async\"\n (checkedChange)=\"toggleCheckedChange($event)\"\n ></cds-toggle>\n </ng-container>\n <ng-container *ngIf=\"obs.currentStepId === 'selectFormFlow'\">\n <valtimo-select-form-flow></valtimo-select-form-flow>\n </ng-container>\n\n <ng-container\n *ngIf=\"\n obs.currentStepId === 'choosePluginConfiguration' ||\n obs.currentStepId === 'choosePluginDefinition'\n \"\n >\n <valtimo-select-plugin-configuration></valtimo-select-plugin-configuration>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'selectBuildingBlock'\">\n <valtimo-select-building-block></valtimo-select-building-block>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'choosePluginAction'\">\n <valtimo-select-plugin-action></valtimo-select-plugin-action>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'configurePluginAction'\">\n <valtimo-plugin-action-configuration\n [selectedPluginConfiguration$]=\"selectedPluginConfiguration$\"\n ></valtimo-plugin-action-configuration>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'configureBuildingBlockPlugins'\">\n <valtimo-configure-building-block-plugins></valtimo-configure-building-block-plugins>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'configureBuildingBlockMappings'\">\n <valtimo-configure-building-block-mappings></valtimo-configure-building-block-mappings>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"obs.currentStepId === 'uiComponent'\">\n <valtimo-select-ui-component></valtimo-select-ui-component>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #footer let-obs=\"obs\">\n <cds-modal-footer *ngIf=\"!obs.saving\">\n <div class=\"cancel-button\">\n <button cdsButton=\"ghost\" (click)=\"closeModal()\" [disabled]=\"obs.disabled\">\n {{ 'processLinkConfiguration.cancel' | translate }}\n </button>\n </div>\n <div class=\"footer-spacer\"></div>\n <div class=\"action-buttons\">\n <button\n cdsButton=\"danger--primary\"\n *ngIf=\"obs.isEditing\"\n (click)=\"unlinkButtonClick()\"\n >\n {{ 'processLinkConfiguration.unlink' | translate }}\n </button>\n <button\n *ngIf=\"obs.showBackButton && !obs.saving\"\n cdsButton=\"secondary\"\n (click)=\"backButtonClick()\"\n >\n {{ 'processLinkConfiguration.back' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n *ngIf=\"obs.showNextButton && !obs.saving\"\n [disabled]=\"!obs.enableNextButton\"\n (click)=\"nextButtonClick()\"\n >\n {{ 'processLinkConfiguration.next' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n *ngIf=\"obs.showSaveButton && !obs.saving\"\n [disabled]=\"!obs.enableSaveButton\"\n (click)=\"saveButtonClick()\"\n >\n {{ 'processLinkConfiguration.complete' | translate }}\n </button>\n </div>\n </cds-modal-footer>\n</ng-template>\n", styles: ["::ng-deep .process-link-modal-container .cds--modal-container{max-width:960px;min-height:70%}::ng-deep .process-link-modal-container .cds--modal-footer{display:flex;flex-direction:row}.cds-loading-container{position:absolute;top:50px;padding-bottom:50px;left:0;width:100%;height:calc(100% - 50px);display:flex;justify-content:center;align-items:center;background:var(--cds-layer);z-index:99;box-sizing:border-box}.cancel-button{width:20%;display:flex}.cancel-button button{width:100%}.footer-spacer{width:20%}.action-buttons{width:60%;display:flex;flex-direction:row;justify-content:flex-end}.action-buttons button{flex:1;max-width:33.33%}.process-link-progress{width:100%;margin-top:32px;margin-bottom:16px}.hidden{visibility:hidden}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
3860
+ }], ctorParameters: () => [{ type: ProcessLinkStateService }, { type: ProcessLinkStepService }, { type: ProcessLinkButtonService }, { type: PluginStateService }, { type: ProcessLinkStateService }, { type: i1.ConfigService }] });
2325
3861
 
2326
3862
  /*
2327
3863
  * Copyright 2015-2025 Ritense BV, the Netherlands.
@@ -2376,13 +3912,13 @@ class ProcessLinkComponent {
2376
3912
  .subscribe();
2377
3913
  }
2378
3914
  }
2379
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkComponent, deps: [{ token: ProcessLinkService }, { token: ProcessLinkStateService }, { token: i2$2.ModalService }], target: i0.ɵɵFactoryTarget.Component }); }
2380
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: ProcessLinkComponent, isStandalone: false, selector: "valtimo-process-link", providers: [ProcessLinkStateService, ProcessLinkStepService, ProcessLinkButtonService], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"main-content\">\n <div class=\"container-fluid\">\n <valtimo-form-link-process-diagram\n (bpmnElementModalOpen)=\"openModal($event)\"\n ></valtimo-form-link-process-diagram>\n </div>\n</div>\n\n<valtimo-process-link-modal></valtimo-process-link-modal>\n", styles: ["/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "component", type: FormLinkProcessDiagramComponent, selector: "valtimo-form-link-process-diagram", outputs: ["bpmnElementModalOpen", "bpmnElementModalClose"] }, { kind: "component", type: ProcessLinkModalComponent, selector: "valtimo-process-link-modal" }] }); }
3915
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkComponent, deps: [{ token: ProcessLinkService }, { token: ProcessLinkStateService }, { token: i2$1.ModalService }], target: i0.ɵɵFactoryTarget.Component }); }
3916
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: ProcessLinkComponent, isStandalone: false, selector: "valtimo-process-link", providers: [ProcessLinkStateService, ProcessLinkStepService, ProcessLinkButtonService], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"main-content\">\n <div class=\"container-fluid\">\n <valtimo-form-link-process-diagram\n (bpmnElementModalOpen)=\"openModal($event)\"\n ></valtimo-form-link-process-diagram>\n </div>\n</div>\n\n<valtimo-process-link-modal></valtimo-process-link-modal>\n", styles: ["/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "component", type: FormLinkProcessDiagramComponent, selector: "valtimo-form-link-process-diagram", outputs: ["bpmnElementModalOpen", "bpmnElementModalClose"] }, { kind: "component", type: ProcessLinkModalComponent, selector: "valtimo-process-link-modal" }] }); }
2381
3917
  }
2382
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkComponent, decorators: [{
3918
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkComponent, decorators: [{
2383
3919
  type: Component,
2384
3920
  args: [{ standalone: false, selector: 'valtimo-process-link', providers: [ProcessLinkStateService, ProcessLinkStepService, ProcessLinkButtonService], template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"main-content\">\n <div class=\"container-fluid\">\n <valtimo-form-link-process-diagram\n (bpmnElementModalOpen)=\"openModal($event)\"\n ></valtimo-form-link-process-diagram>\n </div>\n</div>\n\n<valtimo-process-link-modal></valtimo-process-link-modal>\n", styles: ["/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
2385
- }], ctorParameters: () => [{ type: ProcessLinkService }, { type: ProcessLinkStateService }, { type: i2$2.ModalService }] });
3921
+ }], ctorParameters: () => [{ type: ProcessLinkService }, { type: ProcessLinkStateService }, { type: i2$1.ModalService }] });
2386
3922
 
2387
3923
  /*
2388
3924
  * Copyright 2015-2025 Ritense BV, the Netherlands.
@@ -2408,11 +3944,11 @@ const routes = [
2408
3944
  },
2409
3945
  ];
2410
3946
  class ProcessLinkRoutingModule {
2411
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2412
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkRoutingModule, imports: [i3$1.RouterModule], exports: [RouterModule] }); }
2413
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkRoutingModule, imports: [RouterModule.forChild(routes), RouterModule] }); }
3947
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3948
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkRoutingModule, imports: [i3$3.RouterModule], exports: [RouterModule] }); }
3949
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkRoutingModule, imports: [RouterModule.forChild(routes), RouterModule] }); }
2414
3950
  }
2415
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkRoutingModule, decorators: [{
3951
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkRoutingModule, decorators: [{
2416
3952
  type: NgModule,
2417
3953
  args: [{
2418
3954
  imports: [RouterModule.forChild(routes)],
@@ -2534,10 +4070,10 @@ class FormFlowConfigurationContainerComponent {
2534
4070
  }
2535
4071
  }));
2536
4072
  }
2537
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormFlowConfigurationContainerComponent, deps: [{ token: FormFlowComponentService }], target: i0.ɵɵFactoryTarget.Component }); }
2538
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: FormFlowConfigurationContainerComponent, isStandalone: false, selector: "valtimo-form-flow-configuration-container", inputs: { disabled: "disabled", componentId: "componentId", formFlowInstanceId: "formFlowInstanceId" }, outputs: { changeEvent: "changeEvent", submitEvent: "submitEvent" }, viewQueries: [{ propertyName: "_dynamicContainer", first: true, predicate: ["formFlowConfigurationComponent"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-template #formFlowConfigurationComponent></ng-template>\n" }); }
4073
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormFlowConfigurationContainerComponent, deps: [{ token: FormFlowComponentService }], target: i0.ɵɵFactoryTarget.Component }); }
4074
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: FormFlowConfigurationContainerComponent, isStandalone: false, selector: "valtimo-form-flow-configuration-container", inputs: { disabled: "disabled", componentId: "componentId", formFlowInstanceId: "formFlowInstanceId" }, outputs: { changeEvent: "changeEvent", submitEvent: "submitEvent" }, viewQueries: [{ propertyName: "_dynamicContainer", first: true, predicate: ["formFlowConfigurationComponent"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-template #formFlowConfigurationComponent></ng-template>\n" }); }
2539
4075
  }
2540
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormFlowConfigurationContainerComponent, decorators: [{
4076
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormFlowConfigurationContainerComponent, decorators: [{
2541
4077
  type: Component,
2542
4078
  args: [{ standalone: false, selector: 'valtimo-form-flow-configuration-container', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-template #formFlowConfigurationComponent></ng-template>\n" }]
2543
4079
  }], ctorParameters: () => [{ type: FormFlowComponentService }], propDecorators: { _dynamicContainer: [{
@@ -2668,7 +4204,7 @@ class FormFlowComponent {
2668
4204
  this.formFlowService.getBreadcrumbs(this.formFlowInstanceId$.getValue()),
2669
4205
  this.translateService.stream('key'),
2670
4206
  ])
2671
- .pipe(map(([breadcrumbs]) => breadcrumbs))
4207
+ .pipe(map$1(([breadcrumbs]) => breadcrumbs))
2672
4208
  .subscribe(breadcrumbs => {
2673
4209
  const classElement = document.getElementsByClassName('cds--progress-step--current');
2674
4210
  this.currentStepIndex$.next(breadcrumbs.currentStepIndex);
@@ -2730,13 +4266,13 @@ class FormFlowComponent {
2730
4266
  enable() {
2731
4267
  this.disabled$.next(false);
2732
4268
  }
2733
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormFlowComponent, deps: [{ token: FormFlowService }, { token: i2$2.ValtimoModalService }, { token: i2$1.TranslateService }, { token: i2.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
2734
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: FormFlowComponent, isStandalone: false, selector: "valtimo-form-flow", inputs: { formIoFormData: "formIoFormData", formFlowInstanceId: "formFlowInstanceId" }, outputs: { formFlowComplete: "formFlowComplete", formFlowChange: "formFlowChange" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n *ngIf=\"{\n breadcrumbs: breadcrumbs$ | async,\n currentStepIndex: currentStepIndex$ | async,\n enableFormFlowBreadcrumbs: enableFormFlowBreadcrumbs$ | async,\n formFlowInstanceId: formFlowInstanceId$ | async,\n } as obs\"\n>\n <div *ngIf=\"formDefinition && (formFlowStepType$ | async) === 'form'\">\n <div *ngIf=\"obs.enableFormFlowBreadcrumbs\" class=\"form-flow__progress-bar-indicator\">\n <cds-progress-indicator\n [spacing]=\"'equal'\"\n [skeleton]=\"obs.breadcrumbs.length === 0\"\n [current]=\"obs.currentStepIndex\"\n [steps]=\"obs.breadcrumbs\"\n (stepSelected)=\"onStepSelected($event)\"\n >\n </cds-progress-indicator>\n </div>\n\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n (event)=\"onEvent($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n\n <div *ngIf=\"(formFlowStepType$ | async) === 'custom-component'\">\n <valtimo-form-flow-configuration-container\n [componentId]=\"FormFlowCustomComponentId$ | async\"\n [formFlowInstanceId]=\"obs.formFlowInstanceId\"\n [disabled]=\"disabled$ | async\"\n (submitEvent)=\"onSubmit($event)\"\n (changeEvent)=\"onChange($event)\"\n >\n </valtimo-form-flow-configuration-container>\n </div>\n</div>\n", styles: [".form-flow__progress-bar-indicator{height:64px;overflow-x:auto;-ms-overflow-style:none;scrollbar-width:none}.form-flow__progress-bar-indicator ::-webkit-scrollbar{display:none}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.ProgressIndicator, selector: "cds-progress-indicator, ibm-progress-indicator", inputs: ["current", "steps", "translations", "orientation", "skeleton", "spacing"], outputs: ["stepSelected"] }, { kind: "component", type: i2$2.FormioComponent, selector: "valtimo-form-io", inputs: ["options", "submission", "form", "readOnly", "formRefresh$"], outputs: ["submit", "change", "event"] }, { kind: "component", type: FormFlowConfigurationContainerComponent, selector: "valtimo-form-flow-configuration-container", inputs: ["disabled", "componentId", "formFlowInstanceId"], outputs: ["changeEvent", "submitEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
4269
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormFlowComponent, deps: [{ token: FormFlowService }, { token: i2$1.ValtimoModalService }, { token: i3.TranslateService }, { token: i1.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
4270
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: FormFlowComponent, isStandalone: false, selector: "valtimo-form-flow", inputs: { formIoFormData: "formIoFormData", formFlowInstanceId: "formFlowInstanceId" }, outputs: { formFlowComplete: "formFlowComplete", formFlowChange: "formFlowChange" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n *ngIf=\"{\n breadcrumbs: breadcrumbs$ | async,\n currentStepIndex: currentStepIndex$ | async,\n enableFormFlowBreadcrumbs: enableFormFlowBreadcrumbs$ | async,\n formFlowInstanceId: formFlowInstanceId$ | async,\n } as obs\"\n>\n <div *ngIf=\"formDefinition && (formFlowStepType$ | async) === 'form'\">\n <div *ngIf=\"obs.enableFormFlowBreadcrumbs\" class=\"form-flow__progress-bar-indicator\">\n <cds-progress-indicator\n [spacing]=\"'equal'\"\n [skeleton]=\"obs.breadcrumbs.length === 0\"\n [current]=\"obs.currentStepIndex\"\n [steps]=\"obs.breadcrumbs\"\n (stepSelected)=\"onStepSelected($event)\"\n >\n </cds-progress-indicator>\n </div>\n\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n (event)=\"onEvent($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n\n <div *ngIf=\"(formFlowStepType$ | async) === 'custom-component'\">\n <valtimo-form-flow-configuration-container\n [componentId]=\"FormFlowCustomComponentId$ | async\"\n [formFlowInstanceId]=\"obs.formFlowInstanceId\"\n [disabled]=\"disabled$ | async\"\n (submitEvent)=\"onSubmit($event)\"\n (changeEvent)=\"onChange($event)\"\n >\n </valtimo-form-flow-configuration-container>\n </div>\n</div>\n", styles: [".form-flow__progress-bar-indicator{height:64px;overflow-x:auto;-ms-overflow-style:none;scrollbar-width:none}.form-flow__progress-bar-indicator ::-webkit-scrollbar{display:none}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$2.ProgressIndicator, selector: "cds-progress-indicator, ibm-progress-indicator", inputs: ["current", "steps", "translations", "orientation", "skeleton", "spacing"], outputs: ["stepSelected"] }, { kind: "component", type: i2$1.FormioComponent, selector: "valtimo-form-io", inputs: ["options", "submission", "form", "readOnly", "formRefresh$"], outputs: ["submit", "change", "event"] }, { kind: "component", type: FormFlowConfigurationContainerComponent, selector: "valtimo-form-flow-configuration-container", inputs: ["disabled", "componentId", "formFlowInstanceId"], outputs: ["changeEvent", "submitEvent"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }] }); }
2735
4271
  }
2736
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FormFlowComponent, decorators: [{
4272
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FormFlowComponent, decorators: [{
2737
4273
  type: Component,
2738
4274
  args: [{ standalone: false, selector: 'valtimo-form-flow', template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n *ngIf=\"{\n breadcrumbs: breadcrumbs$ | async,\n currentStepIndex: currentStepIndex$ | async,\n enableFormFlowBreadcrumbs: enableFormFlowBreadcrumbs$ | async,\n formFlowInstanceId: formFlowInstanceId$ | async,\n } as obs\"\n>\n <div *ngIf=\"formDefinition && (formFlowStepType$ | async) === 'form'\">\n <div *ngIf=\"obs.enableFormFlowBreadcrumbs\" class=\"form-flow__progress-bar-indicator\">\n <cds-progress-indicator\n [spacing]=\"'equal'\"\n [skeleton]=\"obs.breadcrumbs.length === 0\"\n [current]=\"obs.currentStepIndex\"\n [steps]=\"obs.breadcrumbs\"\n (stepSelected)=\"onStepSelected($event)\"\n >\n </cds-progress-indicator>\n </div>\n\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n (event)=\"onEvent($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n\n <div *ngIf=\"(formFlowStepType$ | async) === 'custom-component'\">\n <valtimo-form-flow-configuration-container\n [componentId]=\"FormFlowCustomComponentId$ | async\"\n [formFlowInstanceId]=\"obs.formFlowInstanceId\"\n [disabled]=\"disabled$ | async\"\n (submitEvent)=\"onSubmit($event)\"\n (changeEvent)=\"onChange($event)\"\n >\n </valtimo-form-flow-configuration-container>\n </div>\n</div>\n", styles: [".form-flow__progress-bar-indicator{height:64px;overflow-x:auto;-ms-overflow-style:none;scrollbar-width:none}.form-flow__progress-bar-indicator ::-webkit-scrollbar{display:none}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
2739
- }], ctorParameters: () => [{ type: FormFlowService }, { type: i2$2.ValtimoModalService }, { type: i2$1.TranslateService }, { type: i2.ConfigService }], propDecorators: { form: [{
4275
+ }], ctorParameters: () => [{ type: FormFlowService }, { type: i2$1.ValtimoModalService }, { type: i3.TranslateService }, { type: i1.ConfigService }], propDecorators: { form: [{
2740
4276
  type: ViewChild,
2741
4277
  args: ['form']
2742
4278
  }], formIoFormData: [{
@@ -2797,8 +4333,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
2797
4333
  * limitations under the License.
2798
4334
  */
2799
4335
  class ProcessLinkModule {
2800
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2801
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkModule, declarations: [ProcessLinkComponent,
4336
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4337
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkModule, declarations: [ProcessLinkComponent,
2802
4338
  FormLinkProcessDiagramComponent,
2803
4339
  SelectPluginConfigurationComponent,
2804
4340
  SelectPluginActionComponent,
@@ -2811,7 +4347,9 @@ class ProcessLinkModule {
2811
4347
  FormFlowConfigurationContainerComponent,
2812
4348
  FormDisplayConfigurationComponent,
2813
4349
  SelectUIComponentComponent,
2814
- ImportPluginConfigurationComponent], imports: [CommonModule,
4350
+ ImportPluginConfigurationComponent,
4351
+ SelectBuildingBlockComponent,
4352
+ ConfigureBuildingBlockPluginsComponent], imports: [CommonModule,
2815
4353
  ProcessLinkRoutingModule,
2816
4354
  FormsModule,
2817
4355
  ReactiveFormsModule,
@@ -2837,7 +4375,7 @@ class ProcessLinkModule {
2837
4375
  StructuredListModule,
2838
4376
  TilesModule,
2839
4377
  RenderInPageHeaderDirective,
2840
- SelectModule,
4378
+ SelectModule$1,
2841
4379
  ToggleModule,
2842
4380
  CarbonMultiInputModule,
2843
4381
  LayerModule,
@@ -2847,13 +4385,18 @@ class ProcessLinkModule {
2847
4385
  LayerModule,
2848
4386
  ToggletipModule,
2849
4387
  RemoveClassnamesDirective,
2850
- ReactiveFormsModule], exports: [ProcessLinkComponent,
4388
+ ReactiveFormsModule,
4389
+ InputLabelModule,
4390
+ RadioModule,
4391
+ ValuePathSelectorComponent,
4392
+ ConfigureBuildingBlockMappingsComponent,
4393
+ NotificationModule], exports: [ProcessLinkComponent,
2851
4394
  SelectPluginConfigurationComponent,
2852
4395
  SelectPluginActionComponent,
2853
4396
  PluginActionConfigurationComponent,
2854
4397
  ProcessLinkModalComponent,
2855
4398
  FormFlowComponent] }); }
2856
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkModule, providers: [UrlValidatorService, UrlResolverService], imports: [CommonModule,
4399
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkModule, providers: [UrlValidatorService, UrlResolverService], imports: [CommonModule,
2857
4400
  ProcessLinkRoutingModule,
2858
4401
  FormsModule,
2859
4402
  ReactiveFormsModule,
@@ -2877,7 +4420,7 @@ class ProcessLinkModule {
2877
4420
  FormIoModule,
2878
4421
  StructuredListModule,
2879
4422
  TilesModule,
2880
- SelectModule,
4423
+ SelectModule$1,
2881
4424
  ToggleModule,
2882
4425
  CarbonMultiInputModule,
2883
4426
  LayerModule,
@@ -2886,9 +4429,14 @@ class ProcessLinkModule {
2886
4429
  TranslateModule,
2887
4430
  LayerModule,
2888
4431
  ToggletipModule,
2889
- ReactiveFormsModule] }); }
4432
+ ReactiveFormsModule,
4433
+ InputLabelModule,
4434
+ RadioModule,
4435
+ ValuePathSelectorComponent,
4436
+ ConfigureBuildingBlockMappingsComponent,
4437
+ NotificationModule] }); }
2890
4438
  }
2891
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ProcessLinkModule, decorators: [{
4439
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ProcessLinkModule, decorators: [{
2892
4440
  type: NgModule,
2893
4441
  args: [{
2894
4442
  declarations: [
@@ -2906,6 +4454,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
2906
4454
  FormDisplayConfigurationComponent,
2907
4455
  SelectUIComponentComponent,
2908
4456
  ImportPluginConfigurationComponent,
4457
+ SelectBuildingBlockComponent,
4458
+ ConfigureBuildingBlockPluginsComponent,
2909
4459
  ],
2910
4460
  imports: [
2911
4461
  CommonModule,
@@ -2934,7 +4484,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
2934
4484
  StructuredListModule,
2935
4485
  TilesModule,
2936
4486
  RenderInPageHeaderDirective,
2937
- SelectModule,
4487
+ SelectModule$1,
2938
4488
  ToggleModule,
2939
4489
  CarbonMultiInputModule,
2940
4490
  LayerModule,
@@ -2945,6 +4495,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
2945
4495
  ToggletipModule,
2946
4496
  RemoveClassnamesDirective,
2947
4497
  ReactiveFormsModule,
4498
+ InputLabelModule,
4499
+ RadioModule,
4500
+ ValuePathSelectorComponent,
4501
+ ConfigureBuildingBlockMappingsComponent,
4502
+ NotificationModule,
2948
4503
  ],
2949
4504
  exports: [
2950
4505
  ProcessLinkComponent,
@@ -2958,6 +4513,102 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
2958
4513
  }]
2959
4514
  }] });
2960
4515
 
4516
+ /*
4517
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
4518
+ *
4519
+ * Licensed under EUPL, Version 1.2 (the "License");
4520
+ * you may not use this file except in compliance with the License.
4521
+ * You may obtain a copy of the License at
4522
+ *
4523
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
4524
+ *
4525
+ * Unless required by applicable law or agreed to in writing, software
4526
+ * distributed under the License is distributed on an "AS IS" basis,
4527
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4528
+ * See the License for the specific language governing permissions and
4529
+ * limitations under the License.
4530
+ */
4531
+
4532
+ /*
4533
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
4534
+ *
4535
+ * Licensed under EUPL, Version 1.2 (the "License");
4536
+ * you may not use this file except in compliance with the License.
4537
+ * You may obtain a copy of the License at
4538
+ *
4539
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
4540
+ *
4541
+ * Unless required by applicable law or agreed to in writing, software
4542
+ * distributed under the License is distributed on an "AS IS" basis,
4543
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4544
+ * See the License for the specific language governing permissions and
4545
+ * limitations under the License.
4546
+ */
4547
+
4548
+ /*
4549
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
4550
+ *
4551
+ * Licensed under EUPL, Version 1.2 (the "License");
4552
+ * you may not use this file except in compliance with the License.
4553
+ * You may obtain a copy of the License at
4554
+ *
4555
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
4556
+ *
4557
+ * Unless required by applicable law or agreed to in writing, software
4558
+ * distributed under the License is distributed on an "AS IS" basis,
4559
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4560
+ * See the License for the specific language governing permissions and
4561
+ * limitations under the License.
4562
+ */
4563
+
4564
+ /*
4565
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
4566
+ *
4567
+ * Licensed under EUPL, Version 1.2 (the "License");
4568
+ * you may not use this file except in compliance with the License.
4569
+ * You may obtain a copy of the License at
4570
+ *
4571
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
4572
+ *
4573
+ * Unless required by applicable law or agreed to in writing, software
4574
+ * distributed under the License is distributed on an "AS IS" BASIS,
4575
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4576
+ * See the License for the specific language governing permissions and
4577
+ * limitations under the License.
4578
+ */
4579
+
4580
+ /*
4581
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
4582
+ *
4583
+ * Licensed under EUPL, Version 1.2 (the "License");
4584
+ * you may not use this file except in compliance with the License.
4585
+ * You may obtain a copy of the License at
4586
+ *
4587
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
4588
+ *
4589
+ * Unless required by applicable law or agreed to in writing, software
4590
+ * distributed under the License is distributed on an "AS IS" basis,
4591
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4592
+ * See the License for the specific language governing permissions and
4593
+ * limitations under the License.
4594
+ */
4595
+
4596
+ /*
4597
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
4598
+ *
4599
+ * Licensed under EUPL, Version 1.2 (the "License");
4600
+ * you may not use this file except in compliance with the License.
4601
+ * You may obtain a copy of the License at
4602
+ *
4603
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
4604
+ *
4605
+ * Unless required by applicable law or agreed to in writing, software
4606
+ * distributed under the License is distributed on an "AS IS" basis,
4607
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4608
+ * See the License for the specific language governing permissions and
4609
+ * limitations under the License.
4610
+ */
4611
+
2961
4612
  /*
2962
4613
  * Copyright 2015-2025 Ritense BV, the Netherlands.
2963
4614
  *
@@ -2981,5 +4632,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
2981
4632
  * Generated bundle index. Do not edit.
2982
4633
  */
2983
4634
 
2984
- export { ChooseProcessLinkTypeComponent, FORM_CUSTOM_COMPONENT_TOKEN, FORM_FLOW_COMPONENT_TOKEN, FormFlowComponent, FormFlowComponentService, FormFlowService, PluginActionConfigurationComponent, PluginStateService, ProcessLinkButtonService, ProcessLinkComponent, ProcessLinkEditMode, ProcessLinkModalComponent, ProcessLinkModule, ProcessLinkService, ProcessLinkStateService, ProcessLinkStepService, SelectPluginActionComponent, SelectPluginConfigurationComponent, UrlResolverService, UrlValidatorService, formSizeToCarbonModalSizeMap };
4635
+ export { BuildingBlockStateService, ChooseProcessLinkTypeComponent, FORM_CUSTOM_COMPONENT_TOKEN, FORM_FLOW_COMPONENT_TOKEN, FormFlowComponent, FormFlowComponentService, FormFlowService, PluginActionConfigurationComponent, PluginStateService, ProcessLinkBuildingBlockApiService, ProcessLinkButtonService, ProcessLinkComponent, ProcessLinkModalComponent, ProcessLinkModule, ProcessLinkService, ProcessLinkStateService, ProcessLinkStepService, SelectPluginActionComponent, SelectPluginConfigurationComponent, UNSUPPORTED_PROCESS_LINK_TYPES_IN_BUILDING_BLOCK, UrlResolverService, UrlValidatorService, formSizeToCarbonModalSizeMap };
2985
4636
  //# sourceMappingURL=valtimo-process-link.mjs.map