@valtimo/decision 12.14.1 → 13.0.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 (43) hide show
  1. package/fesm2022/valtimo-decision.mjs +489 -416
  2. package/fesm2022/valtimo-decision.mjs.map +1 -1
  3. package/lib/decision-deploy/decision-deploy.component.d.ts +18 -7
  4. package/lib/decision-deploy/decision-deploy.component.d.ts.map +1 -1
  5. package/lib/decision-display/decision-display.component.d.ts +5 -7
  6. package/lib/decision-display/decision-display.component.d.ts.map +1 -1
  7. package/lib/decision-list/decision-list.component.d.ts +16 -9
  8. package/lib/decision-list/decision-list.component.d.ts.map +1 -1
  9. package/lib/decision-modeler/decision-modeler.component.d.ts +27 -12
  10. package/lib/decision-modeler/decision-modeler.component.d.ts.map +1 -1
  11. package/lib/decision-routing.module.d.ts.map +1 -1
  12. package/lib/decision.module.d.ts +11 -12
  13. package/lib/decision.module.d.ts.map +1 -1
  14. package/lib/models/decision-management.model.d.ts +6 -0
  15. package/lib/models/decision-management.model.d.ts.map +1 -0
  16. package/lib/models/index.d.ts +1 -0
  17. package/lib/models/index.d.ts.map +1 -1
  18. package/lib/services/decision.service.d.ts +25 -0
  19. package/lib/services/decision.service.d.ts.map +1 -0
  20. package/lib/services/index.d.ts +1 -0
  21. package/lib/services/index.d.ts.map +1 -1
  22. package/package.json +6 -8
  23. package/public-api.d.ts +3 -1
  24. package/public-api.d.ts.map +1 -1
  25. package/esm2022/lib/decision-deploy/decision-deploy.component.mjs +0 -54
  26. package/esm2022/lib/decision-display/decision-display.component.mjs +0 -74
  27. package/esm2022/lib/decision-list/decision-list.component.mjs +0 -74
  28. package/esm2022/lib/decision-modeler/decision-modeler.component.mjs +0 -213
  29. package/esm2022/lib/decision-modeler/empty-decision.mjs +0 -41
  30. package/esm2022/lib/decision-routing.module.mjs +0 -65
  31. package/esm2022/lib/decision.component.mjs +0 -35
  32. package/esm2022/lib/decision.module.mjs +0 -87
  33. package/esm2022/lib/decision.service.mjs +0 -54
  34. package/esm2022/lib/models/decision.model.mjs +0 -17
  35. package/esm2022/lib/models/index.mjs +0 -17
  36. package/esm2022/lib/services/decision-state.service.mjs +0 -38
  37. package/esm2022/lib/services/index.mjs +0 -17
  38. package/esm2022/public-api.mjs +0 -23
  39. package/esm2022/valtimo-decision.mjs +0 -5
  40. package/lib/decision.component.d.ts +0 -12
  41. package/lib/decision.component.d.ts.map +0 -1
  42. package/lib/decision.service.d.ts +0 -19
  43. package/lib/decision.service.d.ts.map +0 -1
@@ -1,62 +1,30 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, EventEmitter, ViewChild, Output, Component, ViewEncapsulation, NgModule } from '@angular/core';
3
- import * as i1 from '@valtimo/config';
4
- import { ROLE_ADMIN } from '@valtimo/config';
5
- import { Subject, startWith, BehaviorSubject, switchMap, map, tap, filter, combineLatest, from, take, catchError, of } from 'rxjs';
6
- import { Upload16 } from '@carbon/icons';
7
- import * as i2 from '@angular/common/http';
8
- import * as i2$1 from 'carbon-components-angular';
9
- import { ButtonModule, IconModule } from 'carbon-components-angular';
10
- import * as i2$2 from '@angular/router';
2
+ import { Injectable, Component, ViewEncapsulation, EventEmitter, Output, ViewChild, NgModule } from '@angular/core';
3
+ import * as i2 from '@angular/router';
11
4
  import { RouterModule } from '@angular/router';
12
- import * as i6 from '@angular/common';
5
+ import * as i7 from '@angular/common';
13
6
  import { CommonModule } from '@angular/common';
14
- import * as i3 from '@valtimo/components';
15
- import { WidgetModule, ListModule, ModalModule, SelectModule, SpinnerModule, CarbonListModule } from '@valtimo/components';
16
- import * as i4 from '@ngx-translate/core';
17
- import { TranslateModule } from '@ngx-translate/core';
18
7
  import { AuthGuardService } from '@valtimo/security';
8
+ import * as i6 from '@valtimo/shared';
9
+ import { BaseApiService, InterceptorSkip, getCaseManagementRouteParams, getContextObservable, ROLE_ADMIN } from '@valtimo/shared';
19
10
  import DmnJS from 'dmn-js/dist/dmn-modeler.development.js';
20
11
  import { migrateDiagram } from '@bpmn-io/dmn-migrate';
21
- import * as i5 from '@valtimo/layout';
12
+ import { BehaviorSubject, combineLatest, switchMap, map, tap, filter, take, from, of, catchError, Subject, startWith } from 'rxjs';
13
+ import * as i4 from '@valtimo/components';
14
+ import { PendingChangesComponent, WidgetModule, SelectModule as SelectModule$1, RenderInPageHeaderDirective, FitPageDirective, CarbonListModule, ModalModule as ModalModule$1, SpinnerModule } from '@valtimo/components';
15
+ import * as i3 from '@ngx-translate/core';
16
+ import { TranslateModule } from '@ngx-translate/core';
17
+ import * as i6$1 from 'carbon-components-angular';
18
+ import { ModalModule, SelectModule, ButtonModule, IconModule, DialogModule, LayerModule, FileUploaderModule } from 'carbon-components-angular';
19
+ import { Deploy16, Download16, ArrowLeft16, Upload16 } from '@carbon/icons';
20
+ import * as i1 from '@angular/common/http';
21
+ import { HttpHeaders } from '@angular/common/http';
22
22
  import DmnViewer from 'dmn-js';
23
- import * as i3$1 from 'ngx-toastr';
24
- import { FormsModule } from '@angular/forms';
25
-
26
- /*
27
- * Copyright 2015-2024 Ritense BV, the Netherlands.
28
- *
29
- * Licensed under EUPL, Version 1.2 (the "License");
30
- * you may not use this file except in compliance with the License.
31
- * You may obtain a copy of the License at
32
- *
33
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
34
- *
35
- * Unless required by applicable law or agreed to in writing, software
36
- * distributed under the License is distributed on an "AS IS" basis,
37
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
38
- * See the License for the specific language governing permissions and
39
- * limitations under the License.
40
- */
41
-
42
- /*
43
- * Copyright 2015-2024 Ritense BV, the Netherlands.
44
- *
45
- * Licensed under EUPL, Version 1.2 (the "License");
46
- * you may not use this file except in compliance with the License.
47
- * You may obtain a copy of the License at
48
- *
49
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
50
- *
51
- * Unless required by applicable law or agreed to in writing, software
52
- * distributed under the License is distributed on an "AS IS" basis,
53
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
54
- * See the License for the specific language governing permissions and
55
- * limitations under the License.
56
- */
23
+ import * as i3$1 from '@angular/forms';
24
+ import { Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
57
25
 
58
26
  /*
59
- * Copyright 2015-2024 Ritense BV, the Netherlands.
27
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
60
28
  *
61
29
  * Licensed under EUPL, Version 1.2 (the "License");
62
30
  * you may not use this file except in compliance with the License.
@@ -70,43 +38,9 @@ import { FormsModule } from '@angular/forms';
70
38
  * See the License for the specific language governing permissions and
71
39
  * limitations under the License.
72
40
  */
73
- class DecisionService {
74
- constructor(configService, http) {
75
- this.configService = configService;
76
- this.http = http;
77
- this.valtimoApiConfig = configService.config.valtimoApi;
78
- }
79
- deployDmn(dmn) {
80
- const formData = new FormData();
81
- formData.append('file', dmn);
82
- formData.append('deployment-name', 'dmnTableDeploy');
83
- formData.append('deployment-source', 'process application');
84
- return this.http.post(`${this.valtimoApiConfig.endpointUri}v1/process/definition/deployment`, formData);
85
- }
86
- getDecisions() {
87
- return this.http.get(`${this.valtimoApiConfig.endpointUri}camunda-rest/engine/default/decision-definition`);
88
- }
89
- getDecisionById(decisionId) {
90
- return this.http.get(`${this.valtimoApiConfig.endpointUri}camunda-rest/engine/default/decision-definition/${decisionId}`);
91
- }
92
- getLatestDecisionByKey(decisionKey) {
93
- return this.http.get(`${this.valtimoApiConfig.endpointUri}camunda-rest/engine/default/decision-definition/key/${decisionKey}`);
94
- }
95
- getDecisionXml(decisionId) {
96
- return this.http.get(`${this.valtimoApiConfig.endpointUri}camunda-rest/engine/default/decision-definition/${decisionId}/xml`);
97
- }
98
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionService, deps: [{ token: i1.ConfigService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
99
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionService, providedIn: 'root' }); }
100
- }
101
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionService, decorators: [{
102
- type: Injectable,
103
- args: [{
104
- providedIn: 'root',
105
- }]
106
- }], ctorParameters: () => [{ type: i1.ConfigService }, { type: i2.HttpClient }] });
107
41
 
108
42
  /*
109
- * Copyright 2015-2024 Ritense BV, the Netherlands.
43
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
110
44
  *
111
45
  * Licensed under EUPL, Version 1.2 (the "License");
112
46
  * you may not use this file except in compliance with the License.
@@ -120,28 +54,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
120
54
  * See the License for the specific language governing permissions and
121
55
  * limitations under the License.
122
56
  */
123
- class DecisionStateService {
124
- constructor() {
125
- this._refreshDecisions$ = new Subject();
126
- }
127
- get refreshDecisions$() {
128
- return this._refreshDecisions$.asObservable().pipe(startWith(null));
129
- }
130
- refreshDecisions() {
131
- this._refreshDecisions$.next(null);
132
- }
133
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
134
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionStateService, providedIn: 'root' }); }
135
- }
136
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionStateService, decorators: [{
137
- type: Injectable,
138
- args: [{
139
- providedIn: 'root',
140
- }]
141
- }] });
142
57
 
143
58
  /*
144
- * Copyright 2015-2024 Ritense BV, the Netherlands.
59
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
145
60
  *
146
61
  * Licensed under EUPL, Version 1.2 (the "License");
147
62
  * you may not use this file except in compliance with the License.
@@ -157,147 +72,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
157
72
  */
158
73
 
159
74
  /*
160
- * Copyright 2015-2024 Ritense BV, the Netherlands.
161
- *
162
- * Licensed under EUPL, Version 1.2 (the "License");
163
- * you may not use this file except in compliance with the License.
164
- * You may obtain a copy of the License at
165
- *
166
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
167
- *
168
- * Unless required by applicable law or agreed to in writing, software
169
- * distributed under the License is distributed on an "AS IS" basis,
170
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
171
- * See the License for the specific language governing permissions and
172
- * limitations under the License.
173
- */
174
- class DecisionDeployComponent {
175
- constructor(decisionService, stateService) {
176
- this.decisionService = decisionService;
177
- this.stateService = stateService;
178
- this.dmn = null;
179
- this.deploySuccessful = new EventEmitter();
180
- }
181
- onChange(files) {
182
- this.dmn = files.item(0);
183
- }
184
- deployDmn() {
185
- this.decisionService.deployDmn(this.dmn).subscribe(() => {
186
- this.modal.hide();
187
- this.deploySuccessful.emit();
188
- this.stateService.refreshDecisions();
189
- });
190
- }
191
- openModal() {
192
- this.modal.show();
193
- }
194
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionDeployComponent, deps: [{ token: DecisionService }, { token: DecisionStateService }], target: i0.ɵɵFactoryTarget.Component }); }
195
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DecisionDeployComponent, selector: "valtimo-decision-deploy", outputs: { deploySuccessful: "deploySuccessful" }, viewQueries: [{ propertyName: "modal", first: true, predicate: ["decisionDeployModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 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-modal\n #decisionDeployModal\n elementId=\"decisionDeployModal\"\n title=\"Upload Decision table\"\n [showFooter]=\"true\"\n>\n <div body>\n <div class=\"mt-3\">{{ 'decisions.upload.description' | translate }}</div>\n <div class=\"form-group mt-3 mb-3\">\n <input type=\"file\" id=\"file\" accept=\".dmn\" (change)=\"onChange($event.target.files)\" />\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-right\">\n <button\n [disabled]=\"!dmn\"\n class=\"btn btn-primary btn-space\"\n type=\"button\"\n (click)=\"deployDmn()\"\n >\n <i class=\"icon mdi mdi-upload mr-1\"></i>\n {{ 'Upload' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n", styles: ["/*!\n * Copyright 2015-2024 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: i3.ModalComponent, selector: "valtimo-modal", inputs: ["elementId", "title", "subtitle", "templateBelowSubtitle", "showFooter"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] }); }
196
- }
197
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionDeployComponent, decorators: [{
198
- type: Component,
199
- args: [{ selector: 'valtimo-decision-deploy', template: "<!--\n ~ Copyright 2015-2024 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-modal\n #decisionDeployModal\n elementId=\"decisionDeployModal\"\n title=\"Upload Decision table\"\n [showFooter]=\"true\"\n>\n <div body>\n <div class=\"mt-3\">{{ 'decisions.upload.description' | translate }}</div>\n <div class=\"form-group mt-3 mb-3\">\n <input type=\"file\" id=\"file\" accept=\".dmn\" (change)=\"onChange($event.target.files)\" />\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-right\">\n <button\n [disabled]=\"!dmn\"\n class=\"btn btn-primary btn-space\"\n type=\"button\"\n (click)=\"deployDmn()\"\n >\n <i class=\"icon mdi mdi-upload mr-1\"></i>\n {{ 'Upload' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n", styles: ["/*!\n * Copyright 2015-2024 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"] }]
200
- }], ctorParameters: () => [{ type: DecisionService }, { type: DecisionStateService }], propDecorators: { deploySuccessful: [{
201
- type: Output
202
- }], modal: [{
203
- type: ViewChild,
204
- args: ['decisionDeployModal']
205
- }] } });
206
-
207
- /*
208
- * Copyright 2015-2024 Ritense BV, the Netherlands.
209
- *
210
- * Licensed under EUPL, Version 1.2 (the "License");
211
- * you may not use this file except in compliance with the License.
212
- * You may obtain a copy of the License at
213
- *
214
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
215
- *
216
- * Unless required by applicable law or agreed to in writing, software
217
- * distributed under the License is distributed on an "AS IS" basis,
218
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
219
- * See the License for the specific language governing permissions and
220
- * limitations under the License.
221
- */
222
- class DecisionListComponent {
223
- constructor(decisionService, iconService, router, configService, stateService) {
224
- this.decisionService = decisionService;
225
- this.iconService = iconService;
226
- this.router = router;
227
- this.configService = configService;
228
- this.stateService = stateService;
229
- this.fields = [
230
- { key: 'key', label: 'Key' },
231
- { key: 'name', label: 'Name' },
232
- { key: 'version', label: 'Version' },
233
- ];
234
- this.loading$ = new BehaviorSubject(true);
235
- this.decisionsLatestVersions$ = this.stateService.refreshDecisions$.pipe(switchMap(() => this.decisionService.getDecisions()), map(decisions => decisions.reduce((acc, curr) => {
236
- const findInAcc = acc.find(decision => decision.key === curr.key);
237
- if (findInAcc && findInAcc.version > curr.version) {
238
- return acc;
239
- }
240
- else if (findInAcc && findInAcc.version < curr.version) {
241
- const newAcc = acc.filter(decision => decision.key !== curr.key);
242
- return [...newAcc, curr];
243
- }
244
- return [...acc, curr];
245
- }, [])), tap(() => this.loading$.next(false)));
246
- this.iconService.registerAll([Upload16]);
247
- this.experimentalEditing = this.configService.config.featureToggles.experimentalDmnEditing;
248
- }
249
- viewDecisionTable(decision) {
250
- if (this.experimentalEditing) {
251
- this.router.navigate(['/decision-tables/edit', decision.id]);
252
- }
253
- else {
254
- this.router.navigate(['/decision-tables', decision.id]);
255
- }
256
- }
257
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionListComponent, deps: [{ token: DecisionService }, { token: i2$1.IconService }, { token: i2$2.Router }, { token: i1.ConfigService }, { token: DecisionStateService }], target: i0.ɵɵFactoryTarget.Component }); }
258
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DecisionListComponent, selector: "valtimo-decision-list", viewQueries: [{ propertyName: "deploy", first: true, predicate: ["decisionDeploy"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 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=\"decisionsLatestVersions$ | async as decisions\">\n <ng-container *ngIf=\"(loading$ | async) === false\">\n <valtimo-carbon-list\n [items]=\"decisions\"\n [fields]=\"fields\"\n (rowClicked)=\"viewDecisionTable($event)\"\n [header]=\"false\"\n [isSearchable]=\"true\"\n >\n <ng-container carbonToolbarContent>\n <button cdsButton=\"primary\" (click)=\"this.deploy.openModal()\">\n {{ 'Upload' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"upload\" size=\"16\"></svg>\n </button>\n </ng-container>\n </valtimo-carbon-list>\n </ng-container>\n</ng-container>\n\n<valtimo-decision-deploy #decisionDeploy></valtimo-decision-deploy>\n\n<ng-container *ngIf=\"loading$ | async\">\n <valtimo-carbon-list [loading]=\"true\"> </valtimo-carbon-list>\n</ng-container>\n", styles: ["/*!\n * Copyright 2015-2024 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: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "actionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: DecisionDeployComponent, selector: "valtimo-decision-deploy", outputs: ["deploySuccessful"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }] }); }
259
- }
260
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionListComponent, decorators: [{
261
- type: Component,
262
- args: [{ selector: 'valtimo-decision-list', template: "<!--\n ~ Copyright 2015-2024 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=\"decisionsLatestVersions$ | async as decisions\">\n <ng-container *ngIf=\"(loading$ | async) === false\">\n <valtimo-carbon-list\n [items]=\"decisions\"\n [fields]=\"fields\"\n (rowClicked)=\"viewDecisionTable($event)\"\n [header]=\"false\"\n [isSearchable]=\"true\"\n >\n <ng-container carbonToolbarContent>\n <button cdsButton=\"primary\" (click)=\"this.deploy.openModal()\">\n {{ 'Upload' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"upload\" size=\"16\"></svg>\n </button>\n </ng-container>\n </valtimo-carbon-list>\n </ng-container>\n</ng-container>\n\n<valtimo-decision-deploy #decisionDeploy></valtimo-decision-deploy>\n\n<ng-container *ngIf=\"loading$ | async\">\n <valtimo-carbon-list [loading]=\"true\"> </valtimo-carbon-list>\n</ng-container>\n", styles: ["/*!\n * Copyright 2015-2024 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"] }]
263
- }], ctorParameters: () => [{ type: DecisionService }, { type: i2$1.IconService }, { type: i2$2.Router }, { type: i1.ConfigService }, { type: DecisionStateService }], propDecorators: { deploy: [{
264
- type: ViewChild,
265
- args: ['decisionDeploy']
266
- }] } });
267
-
268
- /*
269
- * Copyright 2015-2024 Ritense BV, the Netherlands.
270
- *
271
- * Licensed under EUPL, Version 1.2 (the "License");
272
- * you may not use this file except in compliance with the License.
273
- * You may obtain a copy of the License at
274
- *
275
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
276
- *
277
- * Unless required by applicable law or agreed to in writing, software
278
- * distributed under the License is distributed on an "AS IS" basis,
279
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
280
- * See the License for the specific language governing permissions and
281
- * limitations under the License.
282
- */
283
- class DecisionComponent {
284
- constructor(configService) {
285
- this.configService = configService;
286
- this.experimentalEditing = this.configService.config.featureToggles.experimentalDmnEditing;
287
- }
288
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionComponent, deps: [{ token: i1.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
289
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DecisionComponent, selector: "valtimo-decision", viewQueries: [{ propertyName: "list", first: true, predicate: ["decisionList"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 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 pt-0\">\n <div class=\"container-fluid\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3\">\n <!-- <button-->\n <!-- *ngIf=\"experimentalEditing\"-->\n <!-- class=\"btn btn-primary btn-space\"-->\n <!-- [routerLink]=\"'edit/create'\"-->\n <!-- >-->\n <!-- <i class=\"icon mdi mdi-plus mr-1\"></i>-->\n <!-- {{ 'Create decision table' | translate }}-->\n <!-- </button>-->\n </div>\n </div>\n <valtimo-decision-list #decisionList></valtimo-decision-list>\n </div>\n</div>\n", styles: ["/*!\n * Copyright 2015-2024 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: DecisionListComponent, selector: "valtimo-decision-list" }] }); }
290
- }
291
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionComponent, decorators: [{
292
- type: Component,
293
- args: [{ selector: 'valtimo-decision', template: "<!--\n ~ Copyright 2015-2024 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 pt-0\">\n <div class=\"container-fluid\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3\">\n <!-- <button-->\n <!-- *ngIf=\"experimentalEditing\"-->\n <!-- class=\"btn btn-primary btn-space\"-->\n <!-- [routerLink]=\"'edit/create'\"-->\n <!-- >-->\n <!-- <i class=\"icon mdi mdi-plus mr-1\"></i>-->\n <!-- {{ 'Create decision table' | translate }}-->\n <!-- </button>-->\n </div>\n </div>\n <valtimo-decision-list #decisionList></valtimo-decision-list>\n </div>\n</div>\n", styles: ["/*!\n * Copyright 2015-2024 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"] }]
294
- }], ctorParameters: () => [{ type: i1.ConfigService }], propDecorators: { list: [{
295
- type: ViewChild,
296
- args: ['decisionList']
297
- }] } });
298
-
299
- /*
300
- * Copyright 2015-2024 Ritense BV, the Netherlands.
75
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
301
76
  *
302
77
  * Licensed under EUPL, Version 1.2 (the "License");
303
78
  * you may not use this file except in compliance with the License.
@@ -336,15 +111,82 @@ const EMPTY_DECISION = {
336
111
  `,
337
112
  };
338
113
 
339
- class DecisionModelerComponent {
340
- constructor(decisionService, route, router, alertService, translateService, layoutService, pageTitleService) {
114
+ /*
115
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
116
+ *
117
+ * Licensed under EUPL, Version 1.2 (the "License");
118
+ * you may not use this file except in compliance with the License.
119
+ * You may obtain a copy of the License at
120
+ *
121
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
122
+ *
123
+ * Unless required by applicable law or agreed to in writing, software
124
+ * distributed under the License is distributed on an "AS IS" basis,
125
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126
+ * See the License for the specific language governing permissions and
127
+ * limitations under the License.
128
+ */
129
+ class DecisionService extends BaseApiService {
130
+ constructor(httpClient, configService) {
131
+ super(httpClient, configService);
132
+ this.httpClient = httpClient;
133
+ this.configService = configService;
134
+ }
135
+ deployDmn(dmn) {
136
+ const formData = new FormData();
137
+ formData.append('file', dmn);
138
+ formData.append('deployment-name', 'dmnTableDeploy');
139
+ formData.append('deployment-source', 'process application');
140
+ return this.httpClient.post(this.getApiUrl('/v1/process/definition/deployment'), formData);
141
+ }
142
+ getDecisions() {
143
+ return this.httpClient.get(this.getApiUrl('/camunda-rest/engine/default/decision-definition'));
144
+ }
145
+ getDecisionById(decisionId) {
146
+ return this.httpClient.get(this.getApiUrl(`/camunda-rest/engine/default/decision-definition/${decisionId}`));
147
+ }
148
+ getLatestDecisionByKey(decisionKey) {
149
+ return this.httpClient.get(this.getApiUrl(`/camunda-rest/engine/default/decision-definition/key/${decisionKey}`));
150
+ }
151
+ getDecisionXml(decisionId) {
152
+ return this.httpClient.get(this.getApiUrl(`/camunda-rest/engine/default/decision-definition/${decisionId}/xml`));
153
+ }
154
+ listCaseDecisionDefinitions(caseDefinitionKey, versionTag) {
155
+ return this.httpClient.get(this.getApiUrl(`/management/v1/case-definition/${caseDefinitionKey}/version/${versionTag}/decision-definition`));
156
+ }
157
+ deployCaseDecisionDefinition(caseDefinitionKey, versionTag, dmn) {
158
+ const formData = new FormData();
159
+ formData.append('file', dmn);
160
+ return this.httpClient.post(this.getApiUrl(`/management/v1/case-definition/${caseDefinitionKey}/version/${versionTag}/decision-definition`), formData, {
161
+ headers: new HttpHeaders().set(InterceptorSkip, '204'),
162
+ });
163
+ }
164
+ deleteCaseDecisionDefinition(caseDefinitionKey, versionTag, decisionDefinitionKey) {
165
+ return this.httpClient.delete(this.getApiUrl(`/management/v1/case-definition/${caseDefinitionKey}/version/${versionTag}/decision-definition/${decisionDefinitionKey}`));
166
+ }
167
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionService, deps: [{ token: i1.HttpClient }, { token: i6.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
168
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionService, providedIn: 'root' }); }
169
+ }
170
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionService, decorators: [{
171
+ type: Injectable,
172
+ args: [{
173
+ providedIn: 'root',
174
+ }]
175
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i6.ConfigService }] });
176
+
177
+ class DecisionModelerComponent extends PendingChangesComponent {
178
+ constructor(decisionService, route, router, translateService, pageTitleService, breadcrumbService, iconService, pageHeaderService, notificationService, editPermissionsService) {
179
+ super();
341
180
  this.decisionService = decisionService;
342
181
  this.route = route;
343
182
  this.router = router;
344
- this.alertService = alertService;
345
183
  this.translateService = translateService;
346
- this.layoutService = layoutService;
347
184
  this.pageTitleService = pageTitleService;
185
+ this.breadcrumbService = breadcrumbService;
186
+ this.iconService = iconService;
187
+ this.pageHeaderService = pageHeaderService;
188
+ this.notificationService = notificationService;
189
+ this.editPermissionsService = editPermissionsService;
348
190
  this.CLASS_NAMES = {
349
191
  drd: 'dmn-icon-lasso-tool',
350
192
  decisionTable: 'dmn-icon-decision-table',
@@ -352,123 +194,69 @@ class DecisionModelerComponent {
352
194
  };
353
195
  this.versionSelectionDisabled$ = new BehaviorSubject(true);
354
196
  this.isCreating$ = new BehaviorSubject(false);
355
- this.decisionId$ = this.route.params.pipe(map(params => params?.id), tap(decisionId => this.isCreating$.next(decisionId === 'create')), filter(decisionId => !!decisionId && decisionId !== 'create'), tap(() => this.versionSelectionDisabled$.next(true)));
356
197
  this.selectionId$ = new BehaviorSubject('');
357
- this.decision$ = this.decisionId$.pipe(switchMap(decisionId => this.decisionService.getDecisionById(decisionId)), tap(decision => {
358
- if (decision) {
198
+ this.createdDecisionVersionSelectItems$ = new BehaviorSubject([]);
199
+ this.caseManagementRouteParams$ = getCaseManagementRouteParams(this.route);
200
+ this.context$ = getContextObservable(this.route);
201
+ this.compactMode$ = this.pageHeaderService.compactMode$;
202
+ this.hasEditPermissions$ = combineLatest([
203
+ this.caseManagementRouteParams$,
204
+ this.context$,
205
+ ]).pipe(switchMap(([params, context]) => this.editPermissionsService.hasPermissionsToEditBasedOnContext(params?.caseDefinitionKey ?? '', params?.caseDefinitionVersionTag ?? '', context ?? '')));
206
+ this.decisionId$ = this.route.params.pipe(map(params => params?.id), tap(id => {
207
+ this.isCreating$.next(id === 'create');
208
+ this.versionSelectionDisabled$.next(true);
209
+ }), filter(id => !!id && id !== 'create'));
210
+ this.decision$ = this.decisionId$.pipe(switchMap(id => this.decisionService.getDecisionById(id)), tap(decision => {
211
+ this._fileName = decision.resource;
212
+ if (decision)
359
213
  this.selectionId$.next(decision.id);
360
- }
361
- }));
362
- this.decisionTitle$ = this.decision$.pipe(map(decision => decision?.key || ''), tap(decisionTitle => {
363
- this.pageTitleService.setCustomPageTitle(decisionTitle);
364
214
  }));
365
- this.createdDecisionVersionSelectItems$ = new BehaviorSubject([]);
215
+ this.decisionTitle$ = this.decision$.pipe(map(d => d?.name || d?.key || '-'), tap(title => this.pageTitleService.setCustomPageTitle(title)));
366
216
  this.decisionVersionSelectItems$ = combineLatest([
367
217
  this.decision$,
368
218
  this.decisionService.getDecisions(),
369
219
  this.createdDecisionVersionSelectItems$,
370
- ]).pipe(map(([currentDecision, decisions, createdDecisionVersionSelectItems]) => {
371
- const decisionsWithKey = decisions.filter(decision => decision.key === currentDecision.key);
372
- return [
373
- ...decisionsWithKey.map(decision => ({
374
- id: decision.id,
375
- text: decision.version.toString(),
376
- })),
377
- ...createdDecisionVersionSelectItems,
378
- ].sort((a, b) => Number(b.text) - Number(a.text));
220
+ ]).pipe(map(([current, list, created]) => {
221
+ const filtered = list.filter(d => d.key === current.key);
222
+ return [...filtered.map(d => ({ id: d.id, text: d.version.toString() })), ...created].sort((a, b) => +(b.text ?? '') - +(a.text ?? ''));
379
223
  }), tap(() => this.versionSelectionDisabled$.next(false)));
380
- this.decisionXml$ = this.decisionId$.pipe(switchMap(decisionId => this.decisionService.getDecisionXml(decisionId)), tap(decisionXml => {
381
- if (decisionXml) {
382
- this.loadDecisionXml(decisionXml);
383
- }
384
- }));
385
- this.setTabEvents = () => {
386
- const $tabs = this.$tabs;
387
- const dmnModeler = this.dmnModeler;
388
- $tabs.delegate('.tab', 'click', async function (e) {
389
- // get index of view from clicked tab
390
- const viewIdx = parseInt(this.getAttribute('data-id'), 10);
391
- // get view using index
392
- const view = dmnModeler.getViews()[viewIdx];
393
- // open view
394
- try {
395
- await dmnModeler.open(view);
396
- }
397
- catch (err) {
398
- console.error('error opening tab', err);
399
- }
400
- });
401
- };
402
- this.setModelerEvents = () => {
403
- const $tabs = this.$tabs;
404
- const CLASS_NAMES = this.CLASS_NAMES;
405
- this.dmnModeler.on('views.changed', function (event) {
406
- // get views from event
407
- const { views, activeView } = event;
408
- // clear tabs
409
- $tabs.empty();
410
- // create a new tab for each view
411
- views.forEach(function (v, idx) {
412
- const className = CLASS_NAMES[v.type];
413
- const tab = $(`
414
- <div class="tab ${v === activeView ? 'active' : ''}" data-id="${idx}">
415
- <span class="${className}"></span>
416
- ${v.element.name || v.element.id}
417
- </div>
418
- `);
419
- $tabs.append(tab);
420
- });
421
- });
422
- };
224
+ this.decisionXml$ = this.decisionId$.pipe(switchMap(id => this.decisionService.getDecisionXml(id)), tap(xml => xml && this.loadDecisionXml(xml)));
225
+ this.iconService.registerAll([Deploy16, Download16, ArrowLeft16]);
423
226
  }
424
227
  ngAfterViewInit() {
425
228
  this.setProperties();
426
229
  this.setTabEvents();
427
230
  this.setModelerEvents();
231
+ combineLatest([this.caseManagementRouteParams$, this.context$])
232
+ .pipe(take(1))
233
+ .subscribe(([params, context]) => {
234
+ if (!params || !context)
235
+ return;
236
+ this.initBreadcrumbs(params, context);
237
+ });
428
238
  }
429
239
  switchVersion(decisionId) {
430
- if (decisionId) {
431
- this.router.navigate(['/decision-tables/edit', decisionId]);
432
- }
240
+ if (!decisionId)
241
+ return;
242
+ this.router.navigate(['../', decisionId], { relativeTo: this.route });
433
243
  }
434
244
  deploy() {
435
245
  from(this.dmnModeler.saveXML({ format: true }))
436
- .pipe(map(result => result.xml), map(xml => new File([xml], 'decision.dmn', {
437
- type: 'text/xml',
438
- })), switchMap(file => this.decisionService.deployDmn(file)), tap(res => {
439
- const deployedDefinitions = res.deployedDecisionDefinitions;
440
- const deployedDecisionDefinition = deployedDefinitions[Object.keys(deployedDefinitions)[0]];
441
- const deployedId = deployedDecisionDefinition.id;
442
- this.createdDecisionVersionSelectItems$
443
- .pipe(take(1))
444
- .subscribe(createdDecisionVersionSelectItems => {
445
- if (deployedDecisionDefinition) {
446
- this.createdDecisionVersionSelectItems$.next([
447
- ...createdDecisionVersionSelectItems,
448
- {
449
- id: deployedId,
450
- text: deployedDecisionDefinition.version.toString(),
451
- },
452
- ]);
453
- }
454
- if (deployedId) {
455
- setTimeout(() => {
456
- this.switchVersion(deployedId);
457
- this.alertService.success(this.translateService.instant('decisions.deploySuccess'));
458
- });
459
- }
460
- });
246
+ .pipe(map(result => new File([result.xml], this._fileName, { type: 'text/xml' })), switchMap(file => combineLatest([of(file), this.context$])), switchMap(([file, context]) => context === 'independent'
247
+ ? this.decisionService.deployDmn(file)
248
+ : this.caseManagementRouteParams$.pipe(switchMap(params => this.decisionService.deployCaseDecisionDefinition(params?.caseDefinitionKey ?? '', params?.caseDefinitionVersionTag ?? '', file)))), tap((res) => {
249
+ this.switchVersion(res.identifier);
250
+ this.showNotification('success', 'decisions.deploySuccess');
461
251
  }), catchError(() => {
462
- this.alertService.error(this.translateService.instant('decisions.deployFailure'));
252
+ this.showNotification('error', 'decisions.deployFailure');
463
253
  return of(null);
464
254
  }))
465
255
  .subscribe();
466
256
  }
467
257
  download() {
468
258
  from(this.dmnModeler.saveXML({ format: true }))
469
- .pipe(map(result => result.xml), map(xml => new File([xml], 'decision.dmn', {
470
- type: 'text/xml',
471
- })), tap(file => {
259
+ .pipe(map(result => new File([result.xml], 'decision.dmn', { type: 'text/xml' })), tap(file => {
472
260
  const link = document.createElement('a');
473
261
  link.download = 'diagram.dmn';
474
262
  link.href = window.URL.createObjectURL(file);
@@ -478,6 +266,21 @@ class DecisionModelerComponent {
478
266
  }))
479
267
  .subscribe();
480
268
  }
269
+ navigateBack(notification, message) {
270
+ this.router.navigate(['../'], { relativeTo: this.route });
271
+ if (!notification)
272
+ return;
273
+ this.showNotification(notification, message);
274
+ }
275
+ showNotification(notification, message) {
276
+ if (!notification)
277
+ return;
278
+ this.notificationService.showToast({
279
+ caption: this.translateService.instant(message),
280
+ type: notification,
281
+ title: this.translateService.instant(`interface.${notification}`),
282
+ });
283
+ }
481
284
  setProperties() {
482
285
  const isCreating = this.isCreating$.getValue();
483
286
  this.$container = $('.editor-container');
@@ -486,22 +289,40 @@ class DecisionModelerComponent {
486
289
  container: this.$container,
487
290
  height: 500,
488
291
  width: '100%',
489
- keyboard: {
490
- bindTo: window,
491
- },
292
+ keyboard: { bindTo: window },
492
293
  });
493
- if (isCreating) {
294
+ if (isCreating)
494
295
  this.loadEmptyDecisionTable();
495
- }
496
296
  }
497
297
  loadEmptyDecisionTable() {
498
298
  this.loadDecisionXml(EMPTY_DECISION);
499
299
  }
300
+ setTabEvents() {
301
+ this.$tabs.delegate('.tab', 'click', async function () {
302
+ const index = +this.getAttribute('data-id');
303
+ const view = this.dmnModeler.getViews()[index];
304
+ try {
305
+ await this.dmnModeler.open(view);
306
+ }
307
+ catch (err) {
308
+ console.error('tab open error', err);
309
+ }
310
+ }.bind(this));
311
+ }
312
+ setModelerEvents() {
313
+ this.dmnModeler.on('views.changed', event => {
314
+ const { views, activeView } = event;
315
+ this.$tabs.empty();
316
+ views.forEach((v, i) => {
317
+ const className = this.CLASS_NAMES[v.type];
318
+ const tab = $(`<div class="tab ${v === activeView ? 'active' : ''}" data-id="${i}"><span class="${className}"></span>${v.element.name || v.element.id}</div>`);
319
+ this.$tabs.append(tab);
320
+ });
321
+ });
322
+ }
500
323
  loadDecisionXml(decision) {
501
324
  from(this.dmnModeler.importXML(decision.dmnXml))
502
- .pipe(tap(() => {
503
- this.setEditor();
504
- }), catchError(() => {
325
+ .pipe(tap(() => this.setEditor()), catchError(() => {
505
326
  this.migrateAndLoadDecisionXml(decision);
506
327
  return of(null);
507
328
  }))
@@ -509,36 +330,58 @@ class DecisionModelerComponent {
509
330
  }
510
331
  migrateAndLoadDecisionXml(decision) {
511
332
  from(migrateDiagram(decision.dmnXml))
512
- .pipe(switchMap(decisionXml => this.dmnModeler.importXML(decisionXml)), tap(() => {
513
- this.setEditor();
514
- }), catchError(() => {
515
- this.alertService.error(this.translateService.instant('decisions.loadFailure'));
333
+ .pipe(switchMap(xml => this.dmnModeler.importXML(xml)), tap(() => this.setEditor()), catchError(() => {
334
+ this.showNotification('error', 'decisions.loadFailure');
516
335
  return of(null);
517
336
  }))
518
337
  .subscribe();
519
338
  }
520
339
  setEditor() {
521
- const dmnModeler = this.dmnModeler;
522
- const activeView = dmnModeler.getActiveView();
523
- // apply initial logic in DRD view
524
- if (activeView.type === 'drd') {
525
- const activeEditor = dmnModeler.getActiveViewer();
526
- // access active editor components
527
- const canvas = activeEditor.get('canvas');
528
- // zoom to fit full viewport
340
+ const view = this.dmnModeler.getActiveView();
341
+ if (view?.type === 'drd') {
342
+ const canvas = this.dmnModeler.getActiveViewer().get('canvas');
529
343
  canvas.zoom('fit-viewport');
530
344
  }
531
345
  }
532
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionModelerComponent, deps: [{ token: DecisionService }, { token: i2$2.ActivatedRoute }, { token: i2$2.Router }, { token: i3.AlertService }, { token: i4.TranslateService }, { token: i5.LayoutService }, { token: i3.PageTitleService }], target: i0.ɵɵFactoryTarget.Component }); }
533
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DecisionModelerComponent, selector: "valtimo-decision-modeler", ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 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 [ngClass]=\"{'main-content pt-0': !layoutService.isFullscreen}\"\n class=\"mb-5\"\n *ngIf=\"{\n decisionXml: decisionXml$ | async,\n decisionTitle: decisionTitle$ | async,\n } as obs\"\n>\n <div [ngClass]=\"{'container-fluid': !layoutService.isFullscreen}\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n <ng-container *ngTemplateOutlet=\"createButtons\"></ng-container>\n <div [ngClass]=\"{'mt-4': !layoutService.isFullscreen}\" class=\"modeler pl-3 pr-3 mb-3\">\n <ng-container *ngTemplateOutlet=\"diagramHeader\"></ng-container>\n <ng-container *ngTemplateOutlet=\"diagram\"></ng-container>\n </div>\n </div>\n</div>\n\n<ng-template #buttons>\n <div\n class=\"text-right\"\n *ngIf=\"(isCreating$ | async) === false && {selectionId: selectionId$ | async} as obs\"\n >\n <div class=\"btn-group mt-m3px mb-3\" *ngIf=\"obs.selectionId && !layoutService.isFullscreen\">\n <button class=\"btn btn-primary btn-space\" (click)=\"download()\">\n <i class=\"icon mdi mdi-download mr-1\"></i>{{ 'processManagement.download' | translate }}\n </button>\n <button\n class=\"btn btn-success btn-space\"\n (click)=\"deploy()\"\n [ngClass]=\"{'mr-0': obs.selectionId !== null}\"\n >\n <i class=\"icon mdi mdi-upload mr-1\"></i>{{ 'decisions.deploy' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #createButtons>\n <div class=\"text-right\" *ngIf=\"isCreating$ | async\">\n <div class=\"btn-group mt-m3px mb-3\" *ngIf=\"!layoutService.isFullscreen\">\n <button class=\"btn btn-success btn-space\" (click)=\"deploy()\">\n <i class=\"icon mdi mdi-upload mr-1\"></i>{{ 'decisions.deploy' | translate }}\n </button>\n <!-- <button-->\n <!-- *ngIf=\"selectedVersion === null\"-->\n <!-- class=\"btn btn-danger btn-space mr-0\"-->\n <!-- (click)=\"reset()\"-->\n <!-- >-->\n <!-- <i class=\"icon mdi mdi-delete mr-1\"></i>{{ 'processManagement.clear' | translate }}-->\n <!-- </button>-->\n </div>\n </div>\n</ng-template>\n\n<ng-template #diagramHeader>\n <div class=\"row pt-4 pb-3 bg-light diagram-header justify-content-between\">\n <ng-container *ngTemplateOutlet=\"versionSelection\"></ng-container>\n <ng-container *ngTemplateOutlet=\"fullScreenToggle\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #versionSelection>\n <div class=\"col-md-2 d-flex justify-content-center align-items-center\">\n <ng-container\n *ngIf=\"\n (isCreating$ | async) === false && {\n versionSelectItems: decisionVersionSelectItems$ | async,\n defaultSelectionId: selectionId$ | async,\n disabled: versionSelectionDisabled$ | async,\n } as obs\n \"\n >\n <v-select\n name=\"version\"\n [title]=\"'decisions.version' | translate\"\n [disabled]=\"obs.disabled\"\n [clearable]=\"false\"\n [loading]=\"!obs.versionSelectItems\"\n [items]=\"obs.versionSelectItems\"\n [defaultSelectionId]=\"obs.defaultSelectionId\"\n [widthInPx]=\"100\"\n (selectedChange)=\"switchVersion($event)\"\n ></v-select>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #fullScreenToggle>\n <div class=\"col-md-2 d-flex fullscreen-toggle align-items-start justify-content-end\">\n <i\n (click)=\"layoutService.toggleFullscreen()\"\n [ngClass]=\"{\n 'mdi-fullscreen': !layoutService.isFullscreen,\n 'mdi-fullscreen-exit': layoutService.isFullscreen,\n }\"\n class=\"mdi\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #diagram>\n <div class=\"row bg-white diagram mb-3\">\n <div class=\"dmn-modeler\">\n <div class=\"test-container\">\n <div class=\"editor-parent\">\n <div class=\"editor-container\"></div>\n <div class=\"editor-tabs\"></div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["#save-button{position:absolute;bottom:10px;left:10px;background:#fff;border:solid 1px #ccc;border-radius:2px;padding:8px;font-family:Arial,sans-serif;font-weight:700;cursor:default;font-size:14px;color:#444}.dmn-modeler{display:flex;flex-direction:column;width:100%;padding:1rem}.diagram,.diagram-header{border:1px solid #dee2e6}.decision-title{color:#6b6b6b;font-size:1.5rem;margin:0}.fullscreen-toggle{font-size:2rem}.fullscreen-toggle>i{cursor:pointer}\n/*!\n * Copyright 2015-2024 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: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "dataTestId"], outputs: ["selectedChange"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }] }); }
346
+ initBreadcrumbs(params, context) {
347
+ if (context === 'independent')
348
+ return;
349
+ const route = `/case-management/case/${params.caseDefinitionKey}/version/${params.caseDefinitionVersionTag}`;
350
+ this.breadcrumbService.setThirdBreadcrumb({
351
+ route: [route],
352
+ content: `${params.caseDefinitionKey} (${params.caseDefinitionVersionTag})`,
353
+ href: route,
354
+ });
355
+ const routeWithDecisions = `${route}/decisions`;
356
+ this.breadcrumbService.setFourthBreadcrumb({
357
+ route: [routeWithDecisions],
358
+ content: this.translateService.instant('caseManagement.tabs.decision'),
359
+ href: routeWithDecisions,
360
+ });
361
+ }
362
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionModelerComponent, deps: [{ token: DecisionService }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i3.TranslateService }, { token: i4.PageTitleService }, { token: i4.BreadcrumbService }, { token: i6$1.IconService }, { token: i4.PageHeaderService }, { token: i6.GlobalNotificationService }, { token: i6.EditPermissionsService }], target: i0.ɵɵFactoryTarget.Component }); }
363
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: DecisionModelerComponent, isStandalone: true, selector: "valtimo-decision-modeler", usesInheritance: 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 decisionXml: decisionXml$ | async,\n decisionTitle: decisionTitle$ | async,\n } as obs\"\n fitPage\n class=\"dmn-editor\"\n>\n <ng-container *ngTemplateOutlet=\"diagram\"></ng-container>\n</div>\n\n<ng-template #versionSelection>\n <v-select\n *ngIf=\"(isCreating$ | async) === false\"\n name=\"version\"\n [title]=\"'decisions.version' | translate\"\n [disabled]=\"versionSelectionDisabled$ | async\"\n [clearable]=\"false\"\n [loading]=\"(decisionVersionSelectItems$ | async) === null\"\n [items]=\"decisionVersionSelectItems$ | async\"\n [defaultSelectionId]=\"selectionId$ | async\"\n [widthInPx]=\"120\"\n (selectedChange)=\"switchVersion($event)\"\n ></v-select>\n</ng-template>\n\n<ng-template #diagram>\n <div class=\"editor-parent\">\n <div class=\"editor-container\"></div>\n <div class=\"editor-tabs\"></div>\n </div>\n</ng-template>\n\n<ng-container renderInPageHeader>\n <ng-template>\n <div\n *ngIf=\"{\n selectionId: selectionId$ | async,\n isCreating: isCreating$ | async,\n context: context$ | async,\n compactMode: compactMode$ | async,\n hasEditPermissions: hasEditPermissions$ | async,\n } as obs\"\n class=\"header\"\n >\n <ng-container *ngTemplateOutlet=\"versionSelection\"></ng-container>\n\n <div>\n <button\n *ngIf=\"obs.context === 'case'\"\n cdsButton=\"secondary\"\n [size]=\"obs.compactMode ? 'sm' : 'md'\"\n (click)=\"navigateBack(null)\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"arrow--left\" size=\"16\"></svg>\n\n <span>{{ 'interface.back' | translate }}</span>\n </button>\n\n @if (obs.selectionId && !obs.isCreating) {\n <button\n *ngIf=\"obs.hasEditPermissions\"\n cdsButton=\"primary\"\n (click)=\"deploy()\"\n [size]=\"obs.compactMode ? 'sm' : 'md'\"\n >\n {{ 'decisions.deploy' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"deploy\" size=\"16\"></svg>\n </button>\n\n <cds-overflow-menu class=\"overflow-button\">\n <cds-overflow-menu-option (selected)=\"download()\"\n >{{ 'interface.export' | translate }}\n </cds-overflow-menu-option>\n </cds-overflow-menu>\n } @else {\n <button class=\"btn btn-success btn-space\" (click)=\"deploy()\">\n <i class=\"icon mdi mdi-upload mr-1\"></i>{{ 'decisions.deploy' | translate }}\n </button>\n }\n </div>\n </div>\n </ng-template>\n</ng-container>\n", styles: ["#save-button{position:absolute;bottom:10px;left:10px;background:#fff;border:solid 1px #ccc;border-radius:2px;padding:8px;font-family:Arial,sans-serif;font-weight:700;cursor:default;font-size:14px;color:#444}.dmn-modeler{display:flex;flex-direction:column;width:100%;padding:1rem}.diagram,.diagram-header{border:1px solid #dee2e6}.decision-title{color:#6b6b6b;font-size:1.5rem;margin:0}.fullscreen-toggle{font-size:2rem}.fullscreen-toggle>i{cursor:pointer}.dmn-editor{background-color:var(--cds-layer);outline:1px solid var(--cds-border-subtle);outline-offset:-1px;padding:16px}.header{display:flex;width:100%;justify-content:flex-end;align-items:flex-end;gap:16px}\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: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: ModalModule }, { kind: "ngmodule", type: SelectModule }, { kind: "ngmodule", type: WidgetModule }, { kind: "ngmodule", type: SelectModule$1 }, { kind: "component", type: i4.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "dataTestId"], outputs: ["selectedChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "directive", type: RenderInPageHeaderDirective, selector: "[renderInPageHeader]", inputs: ["fullWidth"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i6$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i6$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: FitPageDirective, selector: "[fitPage]", inputs: ["extraSpace", "disabled", "disableOverflow"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i6$1.OverflowMenu, selector: "cds-overflow-menu, ibm-overflow-menu", inputs: ["buttonLabel", "description", "flip", "placement", "open", "customTrigger", "offset", "wrapperClass", "triggerClass"], outputs: ["openChange"] }, { kind: "component", type: i6$1.OverflowMenuOption, selector: "cds-overflow-menu-option, ibm-overflow-menu-option", inputs: ["divider", "type", "disabled", "href", "target", "innerClass"], outputs: ["selected"] }] }); }
534
364
  }
535
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionModelerComponent, decorators: [{
365
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionModelerComponent, decorators: [{
536
366
  type: Component,
537
- args: [{ selector: 'valtimo-decision-modeler', template: "<!--\n ~ Copyright 2015-2024 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 [ngClass]=\"{'main-content pt-0': !layoutService.isFullscreen}\"\n class=\"mb-5\"\n *ngIf=\"{\n decisionXml: decisionXml$ | async,\n decisionTitle: decisionTitle$ | async,\n } as obs\"\n>\n <div [ngClass]=\"{'container-fluid': !layoutService.isFullscreen}\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n <ng-container *ngTemplateOutlet=\"createButtons\"></ng-container>\n <div [ngClass]=\"{'mt-4': !layoutService.isFullscreen}\" class=\"modeler pl-3 pr-3 mb-3\">\n <ng-container *ngTemplateOutlet=\"diagramHeader\"></ng-container>\n <ng-container *ngTemplateOutlet=\"diagram\"></ng-container>\n </div>\n </div>\n</div>\n\n<ng-template #buttons>\n <div\n class=\"text-right\"\n *ngIf=\"(isCreating$ | async) === false && {selectionId: selectionId$ | async} as obs\"\n >\n <div class=\"btn-group mt-m3px mb-3\" *ngIf=\"obs.selectionId && !layoutService.isFullscreen\">\n <button class=\"btn btn-primary btn-space\" (click)=\"download()\">\n <i class=\"icon mdi mdi-download mr-1\"></i>{{ 'processManagement.download' | translate }}\n </button>\n <button\n class=\"btn btn-success btn-space\"\n (click)=\"deploy()\"\n [ngClass]=\"{'mr-0': obs.selectionId !== null}\"\n >\n <i class=\"icon mdi mdi-upload mr-1\"></i>{{ 'decisions.deploy' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #createButtons>\n <div class=\"text-right\" *ngIf=\"isCreating$ | async\">\n <div class=\"btn-group mt-m3px mb-3\" *ngIf=\"!layoutService.isFullscreen\">\n <button class=\"btn btn-success btn-space\" (click)=\"deploy()\">\n <i class=\"icon mdi mdi-upload mr-1\"></i>{{ 'decisions.deploy' | translate }}\n </button>\n <!-- <button-->\n <!-- *ngIf=\"selectedVersion === null\"-->\n <!-- class=\"btn btn-danger btn-space mr-0\"-->\n <!-- (click)=\"reset()\"-->\n <!-- >-->\n <!-- <i class=\"icon mdi mdi-delete mr-1\"></i>{{ 'processManagement.clear' | translate }}-->\n <!-- </button>-->\n </div>\n </div>\n</ng-template>\n\n<ng-template #diagramHeader>\n <div class=\"row pt-4 pb-3 bg-light diagram-header justify-content-between\">\n <ng-container *ngTemplateOutlet=\"versionSelection\"></ng-container>\n <ng-container *ngTemplateOutlet=\"fullScreenToggle\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #versionSelection>\n <div class=\"col-md-2 d-flex justify-content-center align-items-center\">\n <ng-container\n *ngIf=\"\n (isCreating$ | async) === false && {\n versionSelectItems: decisionVersionSelectItems$ | async,\n defaultSelectionId: selectionId$ | async,\n disabled: versionSelectionDisabled$ | async,\n } as obs\n \"\n >\n <v-select\n name=\"version\"\n [title]=\"'decisions.version' | translate\"\n [disabled]=\"obs.disabled\"\n [clearable]=\"false\"\n [loading]=\"!obs.versionSelectItems\"\n [items]=\"obs.versionSelectItems\"\n [defaultSelectionId]=\"obs.defaultSelectionId\"\n [widthInPx]=\"100\"\n (selectedChange)=\"switchVersion($event)\"\n ></v-select>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #fullScreenToggle>\n <div class=\"col-md-2 d-flex fullscreen-toggle align-items-start justify-content-end\">\n <i\n (click)=\"layoutService.toggleFullscreen()\"\n [ngClass]=\"{\n 'mdi-fullscreen': !layoutService.isFullscreen,\n 'mdi-fullscreen-exit': layoutService.isFullscreen,\n }\"\n class=\"mdi\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #diagram>\n <div class=\"row bg-white diagram mb-3\">\n <div class=\"dmn-modeler\">\n <div class=\"test-container\">\n <div class=\"editor-parent\">\n <div class=\"editor-container\"></div>\n <div class=\"editor-tabs\"></div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["#save-button{position:absolute;bottom:10px;left:10px;background:#fff;border:solid 1px #ccc;border-radius:2px;padding:8px;font-family:Arial,sans-serif;font-weight:700;cursor:default;font-size:14px;color:#444}.dmn-modeler{display:flex;flex-direction:column;width:100%;padding:1rem}.diagram,.diagram-header{border:1px solid #dee2e6}.decision-title{color:#6b6b6b;font-size:1.5rem;margin:0}.fullscreen-toggle{font-size:2rem}.fullscreen-toggle>i{cursor:pointer}\n/*!\n * Copyright 2015-2024 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"] }]
538
- }], ctorParameters: () => [{ type: DecisionService }, { type: i2$2.ActivatedRoute }, { type: i2$2.Router }, { type: i3.AlertService }, { type: i4.TranslateService }, { type: i5.LayoutService }, { type: i3.PageTitleService }] });
367
+ args: [{ selector: 'valtimo-decision-modeler', standalone: true, imports: [
368
+ CommonModule,
369
+ RouterModule,
370
+ ModalModule,
371
+ SelectModule,
372
+ WidgetModule,
373
+ SelectModule$1,
374
+ TranslateModule,
375
+ RenderInPageHeaderDirective,
376
+ ButtonModule,
377
+ IconModule,
378
+ FitPageDirective,
379
+ DialogModule,
380
+ ], 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 decisionXml: decisionXml$ | async,\n decisionTitle: decisionTitle$ | async,\n } as obs\"\n fitPage\n class=\"dmn-editor\"\n>\n <ng-container *ngTemplateOutlet=\"diagram\"></ng-container>\n</div>\n\n<ng-template #versionSelection>\n <v-select\n *ngIf=\"(isCreating$ | async) === false\"\n name=\"version\"\n [title]=\"'decisions.version' | translate\"\n [disabled]=\"versionSelectionDisabled$ | async\"\n [clearable]=\"false\"\n [loading]=\"(decisionVersionSelectItems$ | async) === null\"\n [items]=\"decisionVersionSelectItems$ | async\"\n [defaultSelectionId]=\"selectionId$ | async\"\n [widthInPx]=\"120\"\n (selectedChange)=\"switchVersion($event)\"\n ></v-select>\n</ng-template>\n\n<ng-template #diagram>\n <div class=\"editor-parent\">\n <div class=\"editor-container\"></div>\n <div class=\"editor-tabs\"></div>\n </div>\n</ng-template>\n\n<ng-container renderInPageHeader>\n <ng-template>\n <div\n *ngIf=\"{\n selectionId: selectionId$ | async,\n isCreating: isCreating$ | async,\n context: context$ | async,\n compactMode: compactMode$ | async,\n hasEditPermissions: hasEditPermissions$ | async,\n } as obs\"\n class=\"header\"\n >\n <ng-container *ngTemplateOutlet=\"versionSelection\"></ng-container>\n\n <div>\n <button\n *ngIf=\"obs.context === 'case'\"\n cdsButton=\"secondary\"\n [size]=\"obs.compactMode ? 'sm' : 'md'\"\n (click)=\"navigateBack(null)\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"arrow--left\" size=\"16\"></svg>\n\n <span>{{ 'interface.back' | translate }}</span>\n </button>\n\n @if (obs.selectionId && !obs.isCreating) {\n <button\n *ngIf=\"obs.hasEditPermissions\"\n cdsButton=\"primary\"\n (click)=\"deploy()\"\n [size]=\"obs.compactMode ? 'sm' : 'md'\"\n >\n {{ 'decisions.deploy' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"deploy\" size=\"16\"></svg>\n </button>\n\n <cds-overflow-menu class=\"overflow-button\">\n <cds-overflow-menu-option (selected)=\"download()\"\n >{{ 'interface.export' | translate }}\n </cds-overflow-menu-option>\n </cds-overflow-menu>\n } @else {\n <button class=\"btn btn-success btn-space\" (click)=\"deploy()\">\n <i class=\"icon mdi mdi-upload mr-1\"></i>{{ 'decisions.deploy' | translate }}\n </button>\n }\n </div>\n </div>\n </ng-template>\n</ng-container>\n", styles: ["#save-button{position:absolute;bottom:10px;left:10px;background:#fff;border:solid 1px #ccc;border-radius:2px;padding:8px;font-family:Arial,sans-serif;font-weight:700;cursor:default;font-size:14px;color:#444}.dmn-modeler{display:flex;flex-direction:column;width:100%;padding:1rem}.diagram,.diagram-header{border:1px solid #dee2e6}.decision-title{color:#6b6b6b;font-size:1.5rem;margin:0}.fullscreen-toggle{font-size:2rem}.fullscreen-toggle>i{cursor:pointer}.dmn-editor{background-color:var(--cds-layer);outline:1px solid var(--cds-border-subtle);outline-offset:-1px;padding:16px}.header{display:flex;width:100%;justify-content:flex-end;align-items:flex-end;gap:16px}\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"] }]
381
+ }], ctorParameters: () => [{ type: DecisionService }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i3.TranslateService }, { type: i4.PageTitleService }, { type: i4.BreadcrumbService }, { type: i6$1.IconService }, { type: i4.PageHeaderService }, { type: i6.GlobalNotificationService }, { type: i6.EditPermissionsService }] });
539
382
 
540
383
  /*
541
- * Copyright 2015-2024 Ritense BV, the Netherlands.
384
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
542
385
  *
543
386
  * Licensed under EUPL, Version 1.2 (the "License");
544
387
  * you may not use this file except in compliance with the License.
@@ -553,10 +396,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
553
396
  * limitations under the License.
554
397
  */
555
398
  class DecisionDisplayComponent {
556
- constructor(decisionService, route, toasterService) {
399
+ constructor(decisionService, route) {
557
400
  this.decisionService = decisionService;
558
401
  this.route = route;
559
- this.toasterService = toasterService;
560
402
  }
561
403
  ngOnInit() {
562
404
  this.viewer = new DmnViewer({
@@ -580,7 +422,7 @@ class DecisionDisplayComponent {
580
422
  if (decisionXml) {
581
423
  this.viewer.importXML(decisionXml, error => {
582
424
  if (error) {
583
- console.log('error');
425
+ console.error('Error importing migrated XML', error);
584
426
  }
585
427
  });
586
428
  this.decisionXml = decisionXml;
@@ -595,16 +437,232 @@ class DecisionDisplayComponent {
595
437
  window.URL.revokeObjectURL(link.href);
596
438
  link.remove();
597
439
  }
598
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionDisplayComponent, deps: [{ token: DecisionService }, { token: i2$2.ActivatedRoute }, { token: i3$1.ToastrService }], target: i0.ɵɵFactoryTarget.Component }); }
599
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DecisionDisplayComponent, selector: "valtimo-decision-display", ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 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 pt-0\">\n <div class=\"container-fluid\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3\">\n <button (click)=\"download()\" class=\"btn btn-primary btn-space mr-0\">\n <i class=\"fa fa-save\"></i> &nbsp;\n <span>{{ 'Download' | translate }}</span>\n </button>\n </div>\n </div>\n <div id=\"canvas\" class=\"canvas-dmn\"></div>\n </div>\n</div>\n", styles: [".canvas-dmn{height:70vh}\n/*!\n * Copyright 2015-2024 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: "pipe", type: i4.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
440
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionDisplayComponent, deps: [{ token: DecisionService }, { token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
441
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DecisionDisplayComponent, isStandalone: true, selector: "valtimo-decision-display", 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 pt-0\">\n <div class=\"container-fluid\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3\">\n <button (click)=\"download()\" class=\"btn btn-primary btn-space mr-0\">\n <i class=\"fa fa-save\"></i> &nbsp;\n <span>{{ 'Download' | translate }}</span>\n </button>\n </div>\n </div>\n <div id=\"canvas\" class=\"canvas-dmn\"></div>\n </div>\n</div>\n", styles: [".canvas-dmn{height:70vh}\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: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
442
+ }
443
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionDisplayComponent, decorators: [{
444
+ type: Component,
445
+ args: [{ selector: 'valtimo-decision-display', standalone: true, encapsulation: ViewEncapsulation.None, imports: [CommonModule, RouterModule, TranslateModule], 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 pt-0\">\n <div class=\"container-fluid\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3\">\n <button (click)=\"download()\" class=\"btn btn-primary btn-space mr-0\">\n <i class=\"fa fa-save\"></i> &nbsp;\n <span>{{ 'Download' | translate }}</span>\n </button>\n </div>\n </div>\n <div id=\"canvas\" class=\"canvas-dmn\"></div>\n </div>\n</div>\n", styles: [".canvas-dmn{height:70vh}\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"] }]
446
+ }], ctorParameters: () => [{ type: DecisionService }, { type: i2.ActivatedRoute }] });
447
+
448
+ /*
449
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
450
+ *
451
+ * Licensed under EUPL, Version 1.2 (the "License");
452
+ * you may not use this file except in compliance with the License.
453
+ * You may obtain a copy of the License at
454
+ *
455
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
456
+ *
457
+ * Unless required by applicable law or agreed to in writing, software
458
+ * distributed under the License is distributed on an "AS IS" basis,
459
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
460
+ * See the License for the specific language governing permissions and
461
+ * limitations under the License.
462
+ */
463
+ class DecisionStateService {
464
+ constructor() {
465
+ this._refreshDecisions$ = new Subject();
466
+ }
467
+ get refreshDecisions$() {
468
+ return this._refreshDecisions$.asObservable().pipe(startWith(null));
469
+ }
470
+ refreshDecisions() {
471
+ this._refreshDecisions$.next(null);
472
+ }
473
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
474
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionStateService, providedIn: 'root' }); }
475
+ }
476
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionStateService, decorators: [{
477
+ type: Injectable,
478
+ args: [{
479
+ providedIn: 'root',
480
+ }]
481
+ }] });
482
+
483
+ /*
484
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
485
+ *
486
+ * Licensed under EUPL, Version 1.2 (the "License");
487
+ * you may not use this file except in compliance with the License.
488
+ * You may obtain a copy of the License at
489
+ *
490
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
491
+ *
492
+ * Unless required by applicable law or agreed to in writing, software
493
+ * distributed under the License is distributed on an "AS IS" basis,
494
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
495
+ * See the License for the specific language governing permissions and
496
+ * limitations under the License.
497
+ */
498
+
499
+ /*
500
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
501
+ *
502
+ * Licensed under EUPL, Version 1.2 (the "License");
503
+ * you may not use this file except in compliance with the License.
504
+ * You may obtain a copy of the License at
505
+ *
506
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
507
+ *
508
+ * Unless required by applicable law or agreed to in writing, software
509
+ * distributed under the License is distributed on an "AS IS" basis,
510
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
511
+ * See the License for the specific language governing permissions and
512
+ * limitations under the License.
513
+ */
514
+ class DecisionDeployComponent {
515
+ constructor(decisionService, stateService, route, formBuilder) {
516
+ this.decisionService = decisionService;
517
+ this.stateService = stateService;
518
+ this.route = route;
519
+ this.formBuilder = formBuilder;
520
+ this.deploySuccessful = new EventEmitter();
521
+ this.dmn = null;
522
+ this.modalOpen$ = new BehaviorSubject(false);
523
+ this.caseManagementRouteParams$ = getCaseManagementRouteParams(this.route);
524
+ this.context$ = getContextObservable(this.route);
525
+ this.ACCEPTED_FILES = ['dmn'];
526
+ this.form = this.formBuilder.group({
527
+ file: this.formBuilder.control(new Set(), [Validators.required]),
528
+ });
529
+ }
530
+ get selectedDmnFile() {
531
+ const fileSet = this.form.value?.file;
532
+ return fileSet?.size ? fileSet.values().next().value?.file || null : null;
533
+ }
534
+ onChange(files) {
535
+ this.dmn = files.item(0);
536
+ }
537
+ deployDmn() {
538
+ const dmnFile = this.selectedDmnFile;
539
+ if (!dmnFile)
540
+ return;
541
+ combineLatest([this.caseManagementRouteParams$, this.context$])
542
+ .pipe(take(1), switchMap(([params, context]) => context === 'case'
543
+ ? this.decisionService.deployCaseDecisionDefinition(params.caseDefinitionKey, params.caseDefinitionVersionTag, dmnFile)
544
+ : this.decisionService.deployDmn(dmnFile)))
545
+ .subscribe(() => {
546
+ this.closeModal();
547
+ this.deploySuccessful.emit();
548
+ this.stateService.refreshDecisions();
549
+ });
550
+ }
551
+ openModal() {
552
+ this.modalOpen$.next(true);
553
+ }
554
+ closeModal() {
555
+ this.modalOpen$.next(false);
556
+ }
557
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionDeployComponent, deps: [{ token: DecisionService }, { token: DecisionStateService }, { token: i2.ActivatedRoute }, { token: i3$1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
558
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DecisionDeployComponent, isStandalone: true, selector: "valtimo-decision-deploy", outputs: { deploySuccessful: "deploySuccessful" }, 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-modal showFooter=\"true\" valtimoCdsModal [open]=\"modalOpen$ | async\" (close)=\"closeModal()\">\n <cds-modal-header showCloseButton=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>{{ 'decisions.upload.title' | translate }}</h3>\n </cds-modal-header>\n\n <section cdsModalContent [cdsLayer]=\"1\" [formGroup]=\"form\">\n <cds-file-uploader\n [accept]=\"ACCEPTED_FILES\"\n [multiple]=\"false\"\n buttonType=\"primary\"\n [title]=\"'decisions.upload.fileUploaderTitle' | translate\"\n [description]=\"'decisions.upload.fileUploaderDescription' | translate\"\n [buttonText]=\"'decisions.upload.fileUploaderButton' | translate\"\n formControlName=\"file\"\n >\n </cds-file-uploader>\n </section>\n\n <cds-modal-footer>\n <button cdsButton=\"ghost\" (click)=\"closeModal()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button cdsButton=\"primary\" [disabled]=\"!selectedDmnFile\" (click)=\"deployDmn()\">\n {{ 'interface.upload' | translate }}\n </button>\n </cds-modal-footer>\n</cds-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: "ngmodule", type: CommonModule }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ModalModule }, { kind: "component", type: i6$1.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i6$1.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i6$1.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i6$1.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i6$1.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i6$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: LayerModule }, { kind: "directive", type: i6$1.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "ngmodule", type: FileUploaderModule }, { kind: "component", type: i6$1.FileUploader, selector: "cds-file-uploader, ibm-file-uploader", inputs: ["buttonText", "buttonType", "title", "description", "accept", "multiple", "skeleton", "size", "fileItemSize", "drop", "dropText", "fileUploaderId", "files", "disabled"], outputs: ["filesChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
600
559
  }
601
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionDisplayComponent, decorators: [{
560
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionDeployComponent, decorators: [{
602
561
  type: Component,
603
- args: [{ selector: 'valtimo-decision-display', encapsulation: ViewEncapsulation.None, template: "<!--\n ~ Copyright 2015-2024 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 pt-0\">\n <div class=\"container-fluid\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3\">\n <button (click)=\"download()\" class=\"btn btn-primary btn-space mr-0\">\n <i class=\"fa fa-save\"></i> &nbsp;\n <span>{{ 'Download' | translate }}</span>\n </button>\n </div>\n </div>\n <div id=\"canvas\" class=\"canvas-dmn\"></div>\n </div>\n</div>\n", styles: [".canvas-dmn{height:70vh}\n/*!\n * Copyright 2015-2024 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"] }]
604
- }], ctorParameters: () => [{ type: DecisionService }, { type: i2$2.ActivatedRoute }, { type: i3$1.ToastrService }] });
562
+ args: [{ selector: 'valtimo-decision-deploy', standalone: true, imports: [
563
+ CommonModule,
564
+ FormsModule,
565
+ TranslateModule,
566
+ ModalModule,
567
+ ButtonModule,
568
+ LayerModule,
569
+ FileUploaderModule,
570
+ ReactiveFormsModule,
571
+ ], 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-modal showFooter=\"true\" valtimoCdsModal [open]=\"modalOpen$ | async\" (close)=\"closeModal()\">\n <cds-modal-header showCloseButton=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>{{ 'decisions.upload.title' | translate }}</h3>\n </cds-modal-header>\n\n <section cdsModalContent [cdsLayer]=\"1\" [formGroup]=\"form\">\n <cds-file-uploader\n [accept]=\"ACCEPTED_FILES\"\n [multiple]=\"false\"\n buttonType=\"primary\"\n [title]=\"'decisions.upload.fileUploaderTitle' | translate\"\n [description]=\"'decisions.upload.fileUploaderDescription' | translate\"\n [buttonText]=\"'decisions.upload.fileUploaderButton' | translate\"\n formControlName=\"file\"\n >\n </cds-file-uploader>\n </section>\n\n <cds-modal-footer>\n <button cdsButton=\"ghost\" (click)=\"closeModal()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button cdsButton=\"primary\" [disabled]=\"!selectedDmnFile\" (click)=\"deployDmn()\">\n {{ 'interface.upload' | translate }}\n </button>\n </cds-modal-footer>\n</cds-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"] }]
572
+ }], ctorParameters: () => [{ type: DecisionService }, { type: DecisionStateService }, { type: i2.ActivatedRoute }, { type: i3$1.FormBuilder }], propDecorators: { deploySuccessful: [{
573
+ type: Output
574
+ }] } });
605
575
 
606
576
  /*
607
- * Copyright 2015-2024 Ritense BV, the Netherlands.
577
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
578
+ *
579
+ * Licensed under EUPL, Version 1.2 (the "License");
580
+ * you may not use this file except in compliance with the License.
581
+ * You may obtain a copy of the License at
582
+ *
583
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
584
+ *
585
+ * Unless required by applicable law or agreed to in writing, software
586
+ * distributed under the License is distributed on an "AS IS" basis,
587
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
588
+ * See the License for the specific language governing permissions and
589
+ * limitations under the License.
590
+ */
591
+ class DecisionListComponent {
592
+ constructor(decisionService, iconService, router, configService, stateService, route, cdr, editPermissionsService) {
593
+ this.decisionService = decisionService;
594
+ this.iconService = iconService;
595
+ this.router = router;
596
+ this.configService = configService;
597
+ this.stateService = stateService;
598
+ this.route = route;
599
+ this.cdr = cdr;
600
+ this.editPermissionsService = editPermissionsService;
601
+ this.fields = [
602
+ { key: 'key', label: 'Key' },
603
+ { key: 'name', label: 'Name' },
604
+ { key: 'version', label: 'Version' },
605
+ ];
606
+ this.loading$ = new BehaviorSubject(true);
607
+ this.caseManagementRouteParams$ = getCaseManagementRouteParams(this.route);
608
+ this.context$ = getContextObservable(this.route);
609
+ this.decisionsLatestVersions$ = this.stateService.refreshDecisions$.pipe(switchMap(() => this.context$), switchMap(context => context === 'case'
610
+ ? this.caseManagementRouteParams$.pipe(switchMap(params => this.decisionService.listCaseDecisionDefinitions(params.caseDefinitionKey, params.caseDefinitionVersionTag)))
611
+ : this.decisionService.getDecisions()), map(decisions => decisions.reduce((acc, curr) => {
612
+ const existing = acc.find(d => d.key === curr.key);
613
+ if (existing && existing.version > curr.version)
614
+ return acc;
615
+ if (existing && existing.version < curr.version)
616
+ return [...acc.filter(d => d.key !== curr.key), curr];
617
+ return [...acc, curr];
618
+ }, [])), tap(() => {
619
+ this.loading$.next(false);
620
+ this.cdr.detectChanges();
621
+ }));
622
+ this.hasEditPermissions$ = combineLatest([
623
+ this.caseManagementRouteParams$,
624
+ this.context$,
625
+ ]).pipe(switchMap(([params, context]) => {
626
+ return this.editPermissionsService.hasPermissionsToEditBasedOnContext(params?.caseDefinitionKey, params?.caseDefinitionVersionTag, context);
627
+ }));
628
+ this.iconService.registerAll([Upload16]);
629
+ this.experimentalEditing = this.configService.config.featureToggles.experimentalDmnEditing;
630
+ }
631
+ viewDecisionTable(decision) {
632
+ this.context$.pipe(take(1)).subscribe(context => {
633
+ if (context === 'independent') {
634
+ const basePath = this.experimentalEditing ? '/decision-tables/edit/' : '/decision-tables/';
635
+ this.router.navigate([basePath + decision.id]);
636
+ }
637
+ else {
638
+ this.caseManagementRouteParams$.pipe(take(1)).subscribe(params => {
639
+ this.router.navigateByUrl(`case-management/case/${params.caseDefinitionKey}/version/${params.caseDefinitionVersionTag}/decisions/${decision.id}`);
640
+ });
641
+ }
642
+ });
643
+ }
644
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionListComponent, deps: [{ token: DecisionService }, { token: i6$1.IconService }, { token: i2.Router }, { token: i6.ConfigService }, { token: DecisionStateService }, { token: i2.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: i6.EditPermissionsService }], target: i0.ɵɵFactoryTarget.Component }); }
645
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DecisionListComponent, isStandalone: true, selector: "valtimo-decision-list", viewQueries: [{ propertyName: "deploy", first: true, predicate: ["decisionDeploy"], 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<valtimo-carbon-list\n [items]=\"(decisionsLatestVersions$ | async) || []\"\n [loading]=\"loading$ | async\"\n [fields]=\"fields\"\n (rowClicked)=\"viewDecisionTable($event)\"\n [header]=\"false\"\n [isSearchable]=\"true\"\n>\n <ng-container carbonToolbarContent>\n <button\n *ngIf=\"hasEditPermissions$ | async\"\n cdsButton=\"primary\"\n (click)=\"this.deploy.openModal()\"\n >\n {{ 'Upload' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"upload\" size=\"16\"></svg>\n </button>\n </ng-container>\n</valtimo-carbon-list>\n\n<valtimo-decision-deploy #decisionDeploy></valtimo-decision-deploy>\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: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: CarbonListModule }, { kind: "component", type: i4.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "actionItems", "showActionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i6$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "ngmodule", type: WidgetModule }, { kind: "component", type: DecisionDeployComponent, selector: "valtimo-decision-deploy", outputs: ["deploySuccessful"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i6$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }] }); }
646
+ }
647
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionListComponent, decorators: [{
648
+ type: Component,
649
+ args: [{ selector: 'valtimo-decision-list', standalone: true, imports: [
650
+ CommonModule,
651
+ RouterModule,
652
+ CarbonListModule,
653
+ IconModule,
654
+ WidgetModule,
655
+ DecisionDeployComponent,
656
+ TranslateModule,
657
+ ButtonModule,
658
+ ], 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-carbon-list\n [items]=\"(decisionsLatestVersions$ | async) || []\"\n [loading]=\"loading$ | async\"\n [fields]=\"fields\"\n (rowClicked)=\"viewDecisionTable($event)\"\n [header]=\"false\"\n [isSearchable]=\"true\"\n>\n <ng-container carbonToolbarContent>\n <button\n *ngIf=\"hasEditPermissions$ | async\"\n cdsButton=\"primary\"\n (click)=\"this.deploy.openModal()\"\n >\n {{ 'Upload' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"upload\" size=\"16\"></svg>\n </button>\n </ng-container>\n</valtimo-carbon-list>\n\n<valtimo-decision-deploy #decisionDeploy></valtimo-decision-deploy>\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"] }]
659
+ }], ctorParameters: () => [{ type: DecisionService }, { type: i6$1.IconService }, { type: i2.Router }, { type: i6.ConfigService }, { type: DecisionStateService }, { type: i2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i6.EditPermissionsService }], propDecorators: { deploy: [{
660
+ type: ViewChild,
661
+ args: ['decisionDeploy']
662
+ }] } });
663
+
664
+ /*
665
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
608
666
  *
609
667
  * Licensed under EUPL, Version 1.2 (the "License");
610
668
  * you may not use this file except in compliance with the License.
@@ -621,35 +679,52 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
621
679
  const routes = [
622
680
  {
623
681
  path: 'decision-tables',
624
- component: DecisionComponent,
682
+ component: DecisionListComponent,
625
683
  canActivate: [AuthGuardService],
626
- data: { title: 'Decision tables', roles: [ROLE_ADMIN] },
684
+ data: {
685
+ title: 'Decision tables',
686
+ roles: [ROLE_ADMIN],
687
+ context: 'independent',
688
+ },
627
689
  },
628
690
  {
629
691
  path: 'decision-tables/:id',
630
692
  component: DecisionDisplayComponent,
631
693
  canActivate: [AuthGuardService],
632
- data: { title: 'Decision tables', roles: [ROLE_ADMIN] },
694
+ data: {
695
+ title: 'Decision tables',
696
+ roles: [ROLE_ADMIN],
697
+ context: 'independent',
698
+ },
633
699
  },
634
700
  {
635
701
  path: 'decision-tables/edit/:id',
636
702
  component: DecisionModelerComponent,
637
703
  canActivate: [AuthGuardService],
638
- data: { title: 'Edit decision table', roles: [ROLE_ADMIN], customPageTitle: true },
704
+ data: {
705
+ title: 'Edit decision table',
706
+ roles: [ROLE_ADMIN],
707
+ customPageTitle: true,
708
+ context: 'independent',
709
+ },
639
710
  },
640
711
  {
641
712
  path: 'decision-tables/edit/create',
642
713
  component: DecisionModelerComponent,
643
714
  canActivate: [AuthGuardService],
644
- data: { title: 'Create decision table', roles: [ROLE_ADMIN] },
715
+ data: {
716
+ title: 'Create decision table',
717
+ roles: [ROLE_ADMIN],
718
+ context: 'independent',
719
+ },
645
720
  },
646
721
  ];
647
722
  class DecisionRoutingModule {
648
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
649
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: DecisionRoutingModule, imports: [CommonModule, i2$2.RouterModule], exports: [RouterModule] }); }
650
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionRoutingModule, imports: [CommonModule, RouterModule.forChild(routes), RouterModule] }); }
723
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
724
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: DecisionRoutingModule, imports: [CommonModule, i2.RouterModule], exports: [RouterModule] }); }
725
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionRoutingModule, imports: [CommonModule, RouterModule.forChild(routes), RouterModule] }); }
651
726
  }
652
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionRoutingModule, decorators: [{
727
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionRoutingModule, decorators: [{
653
728
  type: NgModule,
654
729
  args: [{
655
730
  declarations: [],
@@ -659,7 +734,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
659
734
  }] });
660
735
 
661
736
  /*
662
- * Copyright 2015-2024 Ritense BV, the Netherlands.
737
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
663
738
  *
664
739
  * Licensed under EUPL, Version 1.2 (the "License");
665
740
  * you may not use this file except in compliance with the License.
@@ -674,66 +749,64 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
674
749
  * limitations under the License.
675
750
  */
676
751
  class DecisionModule {
677
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
678
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: DecisionModule, declarations: [DecisionComponent,
679
- DecisionDeployComponent,
680
- DecisionDisplayComponent,
681
- DecisionListComponent,
682
- DecisionModelerComponent], imports: [DecisionRoutingModule,
752
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
753
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: DecisionModule, imports: [DecisionRoutingModule,
683
754
  WidgetModule,
684
- ListModule,
685
755
  TranslateModule,
686
- ModalModule,
756
+ ModalModule$1,
687
757
  CommonModule,
688
758
  FormsModule,
689
- SelectModule,
759
+ SelectModule$1,
690
760
  SpinnerModule,
691
761
  CarbonListModule,
692
762
  ButtonModule,
693
- IconModule], exports: [DecisionComponent, DecisionModelerComponent] }); }
694
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionModule, imports: [DecisionRoutingModule,
763
+ IconModule,
764
+ DecisionDeployComponent,
765
+ DecisionModelerComponent,
766
+ DecisionListComponent,
767
+ DecisionDisplayComponent], exports: [DecisionModelerComponent] }); }
768
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionModule, imports: [DecisionRoutingModule,
695
769
  WidgetModule,
696
- ListModule,
697
770
  TranslateModule,
698
- ModalModule,
771
+ ModalModule$1,
699
772
  CommonModule,
700
773
  FormsModule,
701
- SelectModule,
774
+ SelectModule$1,
702
775
  SpinnerModule,
703
776
  CarbonListModule,
704
777
  ButtonModule,
705
- IconModule] }); }
778
+ IconModule,
779
+ DecisionDeployComponent,
780
+ DecisionModelerComponent,
781
+ DecisionListComponent,
782
+ DecisionDisplayComponent] }); }
706
783
  }
707
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DecisionModule, decorators: [{
784
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecisionModule, decorators: [{
708
785
  type: NgModule,
709
786
  args: [{
710
- declarations: [
711
- DecisionComponent,
712
- DecisionDeployComponent,
713
- DecisionDisplayComponent,
714
- DecisionListComponent,
715
- DecisionModelerComponent,
716
- ],
717
787
  imports: [
718
788
  DecisionRoutingModule,
719
789
  WidgetModule,
720
- ListModule,
721
790
  TranslateModule,
722
- ModalModule,
791
+ ModalModule$1,
723
792
  CommonModule,
724
793
  FormsModule,
725
- SelectModule,
794
+ SelectModule$1,
726
795
  SpinnerModule,
727
796
  CarbonListModule,
728
797
  ButtonModule,
729
798
  IconModule,
799
+ DecisionDeployComponent,
800
+ DecisionModelerComponent,
801
+ DecisionListComponent,
802
+ DecisionDisplayComponent,
730
803
  ],
731
- exports: [DecisionComponent, DecisionModelerComponent],
804
+ exports: [DecisionModelerComponent],
732
805
  }]
733
806
  }] });
734
807
 
735
808
  /*
736
- * Copyright 2015-2024 Ritense BV, the Netherlands.
809
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
737
810
  *
738
811
  * Licensed under EUPL, Version 1.2 (the "License");
739
812
  * you may not use this file except in compliance with the License.
@@ -755,5 +828,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
755
828
  * Generated bundle index. Do not edit.
756
829
  */
757
830
 
758
- export { DecisionComponent, DecisionModelerComponent, DecisionModule };
831
+ export { DecisionDeployComponent, DecisionDisplayComponent, DecisionListComponent, DecisionModelerComponent, DecisionModule };
759
832
  //# sourceMappingURL=valtimo-decision.mjs.map