@valtimo/task 10.7.0 → 11.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.
- package/esm2022/lib/assign-user-to-task/assign-user-to-task.component.mjs +122 -0
- package/esm2022/lib/models/task-list.model.mjs +28 -0
- package/{esm2020 → esm2022}/lib/models/task.model.mjs +1 -1
- package/esm2022/lib/task-detail-modal/task-detail-modal.component.mjs +210 -0
- package/esm2022/lib/task-list/task-list.component.mjs +252 -0
- package/esm2022/lib/task-permissions.mjs +34 -0
- package/{esm2020 → esm2022}/lib/task-routing.module.mjs +5 -5
- package/esm2022/lib/task.module.mjs +119 -0
- package/esm2022/lib/task.service.mjs +72 -0
- package/esm2022/public_api.mjs +26 -0
- package/fesm2022/valtimo-task.mjs +912 -0
- package/fesm2022/valtimo-task.mjs.map +1 -0
- package/lib/assign-user-to-task/assign-user-to-task.component.d.ts +7 -7
- package/lib/assign-user-to-task/assign-user-to-task.component.d.ts.map +1 -1
- package/lib/models/task-list.model.d.ts +0 -1
- package/lib/models/task-list.model.d.ts.map +1 -1
- package/lib/models/task.model.d.ts +7 -7
- package/lib/models/task.model.d.ts.map +1 -1
- package/lib/task-detail-modal/task-detail-modal.component.d.ts +30 -33
- package/lib/task-detail-modal/task-detail-modal.component.d.ts.map +1 -1
- package/lib/task-list/task-list.component.d.ts +22 -16
- package/lib/task-list/task-list.component.d.ts.map +1 -1
- package/lib/task-permissions.d.ts +8 -0
- package/lib/task-permissions.d.ts.map +1 -0
- package/lib/task.module.d.ts +1 -1
- package/lib/task.module.d.ts.map +1 -1
- package/lib/task.service.d.ts +4 -4
- package/lib/task.service.d.ts.map +1 -1
- package/package.json +10 -16
- package/public_api.d.ts +1 -0
- package/public_api.d.ts.map +1 -1
- package/esm2020/lib/assign-user-to-task/assign-user-to-task.component.mjs +0 -129
- package/esm2020/lib/models/task-list.model.mjs +0 -29
- package/esm2020/lib/task-detail-modal/task-detail-modal.component.mjs +0 -260
- package/esm2020/lib/task-list/task-list.component.mjs +0 -222
- package/esm2020/lib/task.module.mjs +0 -113
- package/esm2020/lib/task.service.mjs +0 -69
- package/esm2020/public_api.mjs +0 -25
- package/fesm2015/valtimo-task.mjs +0 -857
- package/fesm2015/valtimo-task.mjs.map +0 -1
- package/fesm2020/valtimo-task.mjs +0 -895
- package/fesm2020/valtimo-task.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/task-definition.model.mjs +0 -0
- /package/{esm2020 → esm2022}/valtimo-task.mjs +0 -0
package/package.json
CHANGED
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@valtimo/task",
|
|
3
3
|
"license": "EUPL-1.2",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "11.0.0",
|
|
5
5
|
"peerDependencies": {
|
|
6
|
-
"@angular/common": "^
|
|
7
|
-
"@angular/core": "^
|
|
6
|
+
"@angular/common": "^16.2.0",
|
|
7
|
+
"@angular/core": "^16.2.0"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"ngx-toastr": "
|
|
11
|
-
"moment": "
|
|
12
|
-
"tslib": "
|
|
10
|
+
"ngx-toastr": "17.0.2",
|
|
11
|
+
"moment": "2.29.4",
|
|
12
|
+
"tslib": "2.6.2"
|
|
13
13
|
},
|
|
14
|
-
"module": "
|
|
15
|
-
"es2020": "fesm2020/valtimo-task.mjs",
|
|
16
|
-
"esm2020": "esm2020/valtimo-task.mjs",
|
|
17
|
-
"fesm2020": "fesm2020/valtimo-task.mjs",
|
|
18
|
-
"fesm2015": "fesm2015/valtimo-task.mjs",
|
|
14
|
+
"module": "fesm2022/valtimo-task.mjs",
|
|
19
15
|
"typings": "index.d.ts",
|
|
20
16
|
"exports": {
|
|
21
17
|
"./package.json": {
|
|
@@ -23,11 +19,9 @@
|
|
|
23
19
|
},
|
|
24
20
|
".": {
|
|
25
21
|
"types": "./index.d.ts",
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"node": "./fesm2015/valtimo-task.mjs",
|
|
30
|
-
"default": "./fesm2020/valtimo-task.mjs"
|
|
22
|
+
"esm2022": "./esm2022/valtimo-task.mjs",
|
|
23
|
+
"esm": "./esm2022/valtimo-task.mjs",
|
|
24
|
+
"default": "./fesm2022/valtimo-task.mjs"
|
|
31
25
|
}
|
|
32
26
|
},
|
|
33
27
|
"sideEffects": false
|
package/public_api.d.ts
CHANGED
|
@@ -4,4 +4,5 @@ export * from './lib/task.module';
|
|
|
4
4
|
export * from './lib/task-detail-modal/task-detail-modal.component';
|
|
5
5
|
export * from './lib/task-list/task-list.component';
|
|
6
6
|
export * from './lib/assign-user-to-task/assign-user-to-task.component';
|
|
7
|
+
export * from './lib/task-permissions';
|
|
7
8
|
//# sourceMappingURL=public_api.d.ts.map
|
package/public_api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public_api.d.ts","sourceRoot":"","sources":["../../../projects/valtimo/task/src/public_api.ts"],"names":[],"mappings":"AAoBA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,cAAc,yDAAyD,CAAC"}
|
|
1
|
+
{"version":3,"file":"public_api.d.ts","sourceRoot":"","sources":["../../../projects/valtimo/task/src/public_api.ts"],"names":[],"mappings":"AAoBA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,cAAc,yDAAyD,CAAC;AACxE,cAAc,wBAAwB,CAAC"}
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2015-2023 Ritense BV, the Netherlands.
|
|
3
|
-
*
|
|
4
|
-
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" basis,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
import { Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
17
|
-
import { BehaviorSubject, combineLatest, Subscription } from 'rxjs';
|
|
18
|
-
import { take, tap } from 'rxjs/operators';
|
|
19
|
-
import * as i0 from "@angular/core";
|
|
20
|
-
import * as i1 from "../task.service";
|
|
21
|
-
import * as i2 from "@angular/common";
|
|
22
|
-
import * as i3 from "@valtimo/components";
|
|
23
|
-
import * as i4 from "@ngx-translate/core";
|
|
24
|
-
export class AssignUserToTaskComponent {
|
|
25
|
-
constructor(taskService) {
|
|
26
|
-
this.taskService = taskService;
|
|
27
|
-
this.assignmentOfTaskChanged = new EventEmitter();
|
|
28
|
-
this.candidateUsersForTask$ = new BehaviorSubject(undefined);
|
|
29
|
-
this.disabled$ = new BehaviorSubject(true);
|
|
30
|
-
this.assignedEmailOnServer$ = new BehaviorSubject(null);
|
|
31
|
-
this.userEmailToAssign = null;
|
|
32
|
-
this.assignedUserFullName$ = new BehaviorSubject(null);
|
|
33
|
-
this._subscriptions = new Subscription();
|
|
34
|
-
}
|
|
35
|
-
ngOnInit() {
|
|
36
|
-
this._subscriptions.add(this.taskService.getCandidateUsers(this.taskId).subscribe(candidateUsers => {
|
|
37
|
-
this.candidateUsersForTask$.next(candidateUsers);
|
|
38
|
-
if (this.assigneeEmail) {
|
|
39
|
-
this.assignedEmailOnServer$.next(this.assigneeEmail);
|
|
40
|
-
this.userEmailToAssign = this.assigneeEmail;
|
|
41
|
-
this.assignedUserFullName$.next(this.getAssignedUserName(candidateUsers, this.assigneeEmail));
|
|
42
|
-
}
|
|
43
|
-
this.enable();
|
|
44
|
-
}));
|
|
45
|
-
}
|
|
46
|
-
ngOnChanges(changes) {
|
|
47
|
-
const assigneeEmail = changes.assigneeEmail;
|
|
48
|
-
if (assigneeEmail) {
|
|
49
|
-
this.candidateUsersForTask$.pipe(take(1)).subscribe(candidateUsers => {
|
|
50
|
-
const currentUserEmail = assigneeEmail.currentValue;
|
|
51
|
-
this.assignedEmailOnServer$.next(currentUserEmail || null);
|
|
52
|
-
this.userEmailToAssign = currentUserEmail || null;
|
|
53
|
-
this.assignedUserFullName$.next(this.getAssignedUserName(candidateUsers, currentUserEmail));
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
this.clear();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
ngOnDestroy() {
|
|
61
|
-
this._subscriptions.unsubscribe();
|
|
62
|
-
}
|
|
63
|
-
assignTask(userEmail) {
|
|
64
|
-
this.disable();
|
|
65
|
-
combineLatest([
|
|
66
|
-
this.candidateUsersForTask$,
|
|
67
|
-
this.taskService.assignTask(this.taskId, { assignee: userEmail }),
|
|
68
|
-
])
|
|
69
|
-
.pipe(take(1), tap(([candidateUsers]) => {
|
|
70
|
-
this.userEmailToAssign = userEmail;
|
|
71
|
-
this.assignedEmailOnServer$.next(userEmail);
|
|
72
|
-
this.assignedUserFullName$.next(this.getAssignedUserName(candidateUsers, userEmail));
|
|
73
|
-
this.emitChange();
|
|
74
|
-
this.enable();
|
|
75
|
-
}))
|
|
76
|
-
.subscribe();
|
|
77
|
-
}
|
|
78
|
-
unassignTask() {
|
|
79
|
-
this.disable();
|
|
80
|
-
this.taskService
|
|
81
|
-
.unassignTask(this.taskId)
|
|
82
|
-
.pipe(tap(() => {
|
|
83
|
-
this.clear();
|
|
84
|
-
this.emitChange();
|
|
85
|
-
this.enable();
|
|
86
|
-
}))
|
|
87
|
-
.subscribe();
|
|
88
|
-
}
|
|
89
|
-
getAssignedUserName(users, userEmail) {
|
|
90
|
-
if (users && userEmail) {
|
|
91
|
-
const findUser = users.find(user => user.email === userEmail);
|
|
92
|
-
return findUser ? findUser.fullName : '';
|
|
93
|
-
}
|
|
94
|
-
return '';
|
|
95
|
-
}
|
|
96
|
-
mapUsersForDropdown(users) {
|
|
97
|
-
return (users &&
|
|
98
|
-
users
|
|
99
|
-
.map(user => ({ ...user, lastName: user.lastName?.split(' ').splice(-1)[0] || '' }))
|
|
100
|
-
.sort((a, b) => a.lastName.localeCompare(b.lastName))
|
|
101
|
-
.map(user => ({ text: user.fullName, id: user.email })));
|
|
102
|
-
}
|
|
103
|
-
clear() {
|
|
104
|
-
this.assignedEmailOnServer$.next(null);
|
|
105
|
-
this.userEmailToAssign = null;
|
|
106
|
-
}
|
|
107
|
-
emitChange() {
|
|
108
|
-
this.assignmentOfTaskChanged.emit();
|
|
109
|
-
}
|
|
110
|
-
enable() {
|
|
111
|
-
this.disabled$.next(false);
|
|
112
|
-
}
|
|
113
|
-
disable() {
|
|
114
|
-
this.disabled$.next(true);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
AssignUserToTaskComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AssignUserToTaskComponent, deps: [{ token: i1.TaskService }], target: i0.ɵɵFactoryTarget.Component });
|
|
118
|
-
AssignUserToTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: AssignUserToTaskComponent, selector: "valtimo-assign-user-to-task", inputs: { taskId: "taskId", assigneeEmail: "assigneeEmail" }, outputs: { assignmentOfTaskChanged: "assignmentOfTaskChanged" }, usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n candidateUsers: candidateUsersForTask$ | async,\n disabled: disabled$ | async,\n emailOnServer: assignedEmailOnServer$ | async\n } as obs\"\n>\n <div class=\"container-fluid\">\n <div class=\"row mt-2 mb-2\">\n <div class=\"col-12 pl-0 d-flex flex-row align-items-center\">\n <ng-container *ngIf=\"obs.candidateUsers; else loading\">\n <valtimo-searchable-dropdown-select\n [style]=\"'underlinedText'\"\n [items]=\"mapUsersForDropdown(obs.candidateUsers)\"\n [buttonText]=\"'assignTask.header' | translate\"\n [searchText]=\"'interface.typeToSearch' | translate\"\n [noResultsText]=\"'interface.noSearchResults' | translate\"\n [disabled]=\"obs.disabled\"\n [selectedText]=\"'assignTask.assignedTo' | translate\"\n [selectedTextValue]=\"assignedUserFullName$ | async\"\n [clearSelectionButtonTitle]=\"'assignTask.remove' | translate\"\n [hasSelection]=\"userEmailToAssign === obs.emailOnServer && obs.emailOnServer !== null\"\n [width]=\"250\"\n (itemSelected)=\"assignTask($event)\"\n (clearSelection)=\"unassignTask()\"\n >\n </valtimo-searchable-dropdown-select>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <h5>\n <b>{{ 'assignTask.fetchingUsers' | translate }}</b>\n </h5>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 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 */.container-fluid{color:#959595}i{font-size:13px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.SearchableDropdownSelectComponent, selector: "valtimo-searchable-dropdown-select", inputs: ["style", "items", "buttonText", "searchText", "noResultsText", "disabled", "selectedText", "selectedTextValue", "clearSelectionButtonTitle", "hasSelection", "width", "hasPermission"], outputs: ["itemSelected", "clearSelection"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] });
|
|
119
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AssignUserToTaskComponent, decorators: [{
|
|
120
|
-
type: Component,
|
|
121
|
-
args: [{ selector: 'valtimo-assign-user-to-task', template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n candidateUsers: candidateUsersForTask$ | async,\n disabled: disabled$ | async,\n emailOnServer: assignedEmailOnServer$ | async\n } as obs\"\n>\n <div class=\"container-fluid\">\n <div class=\"row mt-2 mb-2\">\n <div class=\"col-12 pl-0 d-flex flex-row align-items-center\">\n <ng-container *ngIf=\"obs.candidateUsers; else loading\">\n <valtimo-searchable-dropdown-select\n [style]=\"'underlinedText'\"\n [items]=\"mapUsersForDropdown(obs.candidateUsers)\"\n [buttonText]=\"'assignTask.header' | translate\"\n [searchText]=\"'interface.typeToSearch' | translate\"\n [noResultsText]=\"'interface.noSearchResults' | translate\"\n [disabled]=\"obs.disabled\"\n [selectedText]=\"'assignTask.assignedTo' | translate\"\n [selectedTextValue]=\"assignedUserFullName$ | async\"\n [clearSelectionButtonTitle]=\"'assignTask.remove' | translate\"\n [hasSelection]=\"userEmailToAssign === obs.emailOnServer && obs.emailOnServer !== null\"\n [width]=\"250\"\n (itemSelected)=\"assignTask($event)\"\n (clearSelection)=\"unassignTask()\"\n >\n </valtimo-searchable-dropdown-select>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <h5>\n <b>{{ 'assignTask.fetchingUsers' | translate }}</b>\n </h5>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 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 */.container-fluid{color:#959595}i{font-size:13px}\n"] }]
|
|
122
|
-
}], ctorParameters: function () { return [{ type: i1.TaskService }]; }, propDecorators: { taskId: [{
|
|
123
|
-
type: Input
|
|
124
|
-
}], assigneeEmail: [{
|
|
125
|
-
type: Input
|
|
126
|
-
}], assignmentOfTaskChanged: [{
|
|
127
|
-
type: Output
|
|
128
|
-
}] } });
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWduLXVzZXItdG8tdGFzay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2svc3JjL2xpYi9hc3NpZ24tdXNlci10by10YXNrL2Fzc2lnbi11c2VyLXRvLXRhc2suY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvYXNzaWduLXVzZXItdG8tdGFzay9hc3NpZ24tdXNlci10by10YXNrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFDLElBQUksRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBU3pDLE1BQU0sT0FBTyx5QkFBeUI7SUFZcEMsWUFBb0IsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFUbEMsNEJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV2RCwyQkFBc0IsR0FBRyxJQUFJLGVBQWUsQ0FBUyxTQUFTLENBQUMsQ0FBQztRQUNoRSxjQUFTLEdBQUcsSUFBSSxlQUFlLENBQVUsSUFBSSxDQUFDLENBQUM7UUFDL0MsMkJBQXNCLEdBQUcsSUFBSSxlQUFlLENBQVMsSUFBSSxDQUFDLENBQUM7UUFDM0Qsc0JBQWlCLEdBQVcsSUFBSSxDQUFDO1FBQ2pDLDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFTLElBQUksQ0FBQyxDQUFDO1FBQ2xELG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVHLENBQUM7SUFF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QyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVPLFVBQVU7UUFDaEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFTyxNQUFNO1FBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLE9BQU87UUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDOztzSEFsSFUseUJBQXlCOzBHQUF6Qix5QkFBeUIsdU5DckN0QyxnbUVBc0RBOzJGRGpCYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsNkJBQTZCO2tHQUs5QixNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDSSx1QkFBdUI7c0JBQWhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Ryb3Bkb3duSXRlbX0gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7dGFrZSwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1Rhc2tTZXJ2aWNlfSBmcm9tICcuLi90YXNrLnNlcnZpY2UnO1xuaW1wb3J0IHtVc2VyfSBmcm9tICdAdmFsdGltby9jb25maWcnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLWFzc2lnbi11c2VyLXRvLXRhc2snLFxuICB0ZW1wbGF0ZVVybDogJy4vYXNzaWduLXVzZXItdG8tdGFzay5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Fzc2lnbi11c2VyLXRvLXRhc2suY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQXNzaWduVXNlclRvVGFza0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSB0YXNrSWQ6IHN0cmluZztcbiAgQElucHV0KCkgYXNzaWduZWVFbWFpbDogc3RyaW5nO1xuICBAT3V0cHV0KCkgYXNzaWdubWVudE9mVGFza0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY2FuZGlkYXRlVXNlcnNGb3JUYXNrJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlcltdPih1bmRlZmluZWQpO1xuICBkaXNhYmxlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICBhc3NpZ25lZEVtYWlsT25TZXJ2ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KG51bGwpO1xuICB1c2VyRW1haWxUb0Fzc2lnbjogc3RyaW5nID0gbnVsbDtcbiAgYXNzaWduZWRVc2VyRnVsbE5hbWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KG51bGwpO1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFza1NlcnZpY2U6IFRhc2tTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNrU2VydmljZS5nZXRDYW5kaWRhdGVVc2Vycyh0aGlzLnRhc2tJZCkuc3Vic2NyaWJlKGNhbmRpZGF0ZVVzZXJzID0+IHtcbiAgICAgICAgdGhpcy5jYW5kaWRhdGVVc2Vyc0ZvclRhc2skLm5leHQoY2FuZGlkYXRlVXNlcnMpO1xuICAgICAgICBpZiAodGhpcy5hc3NpZ25lZUVtYWlsKSB7XG4gICAgICAgICAgdGhpcy5hc3NpZ25lZEVtYWlsT25TZXJ2ZXIkLm5leHQodGhpcy5hc3NpZ25lZUVtYWlsKTtcbiAgICAgICAgICB0aGlzLnVzZXJFbWFpbFRvQXNzaWduID0gdGhpcy5hc3NpZ25lZUVtYWlsO1xuICAgICAgICAgIHRoaXMuYXNzaWduZWRVc2VyRnVsbE5hbWUkLm5leHQoXG4gICAgICAgICAgICB0aGlzLmdldEFzc2lnbmVkVXNlck5hbWUoY2FuZGlkYXRlVXNlcnMsIHRoaXMuYXNzaWduZWVFbWFpbClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgYXNzaWduZWVFbWFpbCA9IGNoYW5nZXMuYXNzaWduZWVFbWFpbDtcbiAgICBpZiAoYXNzaWduZWVFbWFpbCkge1xuICAgICAgdGhpcy5jYW5kaWRhdGVVc2Vyc0ZvclRhc2skLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGNhbmRpZGF0ZVVzZXJzID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFVzZXJFbWFpbCA9IGFzc2lnbmVlRW1haWwuY3VycmVudFZhbHVlO1xuICAgICAgICB0aGlzLmFzc2lnbmVkRW1haWxPblNlcnZlciQubmV4dChjdXJyZW50VXNlckVtYWlsIHx8IG51bGwpO1xuICAgICAgICB0aGlzLnVzZXJFbWFpbFRvQXNzaWduID0gY3VycmVudFVzZXJFbWFpbCB8fCBudWxsO1xuICAgICAgICB0aGlzLmFzc2lnbmVkVXNlckZ1bGxOYW1lJC5uZXh0KHRoaXMuZ2V0QXNzaWduZWRVc2VyTmFtZShjYW5kaWRhdGVVc2VycywgY3VycmVudFVzZXJFbWFpbCkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhc3NpZ25UYXNrKHVzZXJFbWFpbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmNhbmRpZGF0ZVVzZXJzRm9yVGFzayQsXG4gICAgICB0aGlzLnRhc2tTZXJ2aWNlLmFzc2lnblRhc2sodGhpcy50YXNrSWQsIHthc3NpZ25lZTogdXNlckVtYWlsfSksXG4gICAgXSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB0YXAoKFtjYW5kaWRhdGVVc2Vyc10pID0+IHtcbiAgICAgICAgICB0aGlzLnVzZXJFbWFpbFRvQXNzaWduID0gdXNlckVtYWlsO1xuICAgICAgICAgIHRoaXMuYXNzaWduZWRFbWFpbE9uU2VydmVyJC5uZXh0KHVzZXJFbWFpbCk7XG4gICAgICAgICAgdGhpcy5hc3NpZ25lZFVzZXJGdWxsTmFtZSQubmV4dCh0aGlzLmdldEFzc2lnbmVkVXNlck5hbWUoY2FuZGlkYXRlVXNlcnMsIHVzZXJFbWFpbCkpO1xuICAgICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB1bmFzc2lnblRhc2soKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgdGhpcy50YXNrU2VydmljZVxuICAgICAgLnVuYXNzaWduVGFzayh0aGlzLnRhc2tJZClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgICB0aGlzLmVuYWJsZSgpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZ2V0QXNzaWduZWRVc2VyTmFtZSh1c2VyczogVXNlcltdLCB1c2VyRW1haWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHVzZXJzICYmIHVzZXJFbWFpbCkge1xuICAgICAgY29uc3QgZmluZFVzZXIgPSB1c2Vycy5maW5kKHVzZXIgPT4gdXNlci5lbWFpbCA9PT0gdXNlckVtYWlsKTtcbiAgICAgIHJldHVybiBmaW5kVXNlciA/IGZpbmRVc2VyLmZ1bGxOYW1lIDogJyc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIG1hcFVzZXJzRm9yRHJvcGRvd24odXNlcnM6IFVzZXJbXSk6IERyb3Bkb3duSXRlbVtdIHtcbiAgICByZXR1cm4gKFxuICAgICAgdXNlcnMgJiZcbiAgICAgIHVzZXJzXG4gICAgICAgIC5tYXAodXNlciA9PiAoey4uLnVzZXIsIGxhc3ROYW1lOiB1c2VyLmxhc3ROYW1lPy5zcGxpdCgnICcpLnNwbGljZSgtMSlbMF0gfHwgJyd9KSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubGFzdE5hbWUubG9jYWxlQ29tcGFyZShiLmxhc3ROYW1lKSlcbiAgICAgICAgLm1hcCh1c2VyID0+ICh7dGV4dDogdXNlci5mdWxsTmFtZSwgaWQ6IHVzZXIuZW1haWx9KSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2lnbmVkRW1haWxPblNlcnZlciQubmV4dChudWxsKTtcbiAgICB0aGlzLnVzZXJFbWFpbFRvQXNzaWduID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkLmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQkLm5leHQodHJ1ZSk7XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDIzIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cblxuPG5nLWNvbnRhaW5lclxuICAqbmdJZj1cIntcbiAgICBjYW5kaWRhdGVVc2VyczogY2FuZGlkYXRlVXNlcnNGb3JUYXNrJCB8IGFzeW5jLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCQgfCBhc3luYyxcbiAgICBlbWFpbE9uU2VydmVyOiBhc3NpZ25lZEVtYWlsT25TZXJ2ZXIkIHwgYXN5bmNcbiAgfSBhcyBvYnNcIlxuPlxuICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yIG1iLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgcGwtMCBkLWZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvYnMuY2FuZGlkYXRlVXNlcnM7IGVsc2UgbG9hZGluZ1wiPlxuICAgICAgICAgIDx2YWx0aW1vLXNlYXJjaGFibGUtZHJvcGRvd24tc2VsZWN0XG4gICAgICAgICAgICBbc3R5bGVdPVwiJ3VuZGVybGluZWRUZXh0J1wiXG4gICAgICAgICAgICBbaXRlbXNdPVwibWFwVXNlcnNGb3JEcm9wZG93bihvYnMuY2FuZGlkYXRlVXNlcnMpXCJcbiAgICAgICAgICAgIFtidXR0b25UZXh0XT1cIidhc3NpZ25UYXNrLmhlYWRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW3NlYXJjaFRleHRdPVwiJ2ludGVyZmFjZS50eXBlVG9TZWFyY2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtub1Jlc3VsdHNUZXh0XT1cIidpbnRlcmZhY2Uubm9TZWFyY2hSZXN1bHRzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwib2JzLmRpc2FibGVkXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZFRleHRdPVwiJ2Fzc2lnblRhc2suYXNzaWduZWRUbycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW3NlbGVjdGVkVGV4dFZhbHVlXT1cImFzc2lnbmVkVXNlckZ1bGxOYW1lJCB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtjbGVhclNlbGVjdGlvbkJ1dHRvblRpdGxlXT1cIidhc3NpZ25UYXNrLnJlbW92ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2hhc1NlbGVjdGlvbl09XCJ1c2VyRW1haWxUb0Fzc2lnbiA9PT0gb2JzLmVtYWlsT25TZXJ2ZXIgJiYgb2JzLmVtYWlsT25TZXJ2ZXIgIT09IG51bGxcIlxuICAgICAgICAgICAgW3dpZHRoXT1cIjI1MFwiXG4gICAgICAgICAgICAoaXRlbVNlbGVjdGVkKT1cImFzc2lnblRhc2soJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xlYXJTZWxlY3Rpb24pPVwidW5hc3NpZ25UYXNrKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3ZhbHRpbW8tc2VhcmNoYWJsZS1kcm9wZG93bi1zZWxlY3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAgPGg1PlxuICAgIDxiPnt7ICdhc3NpZ25UYXNrLmZldGNoaW5nVXNlcnMnIHwgdHJhbnNsYXRlIH19PC9iPlxuICA8L2g1PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2015-2023 Ritense BV, the Netherlands.
|
|
3
|
-
*
|
|
4
|
-
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" basis,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
export class TaskList {
|
|
17
|
-
constructor() {
|
|
18
|
-
this.tasks = [];
|
|
19
|
-
this.fields = [];
|
|
20
|
-
this.pagination = {
|
|
21
|
-
collectionSize: 0,
|
|
22
|
-
page: 1,
|
|
23
|
-
size: 10,
|
|
24
|
-
maxPaginationItemSize: 5,
|
|
25
|
-
};
|
|
26
|
-
this.page = 0;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1saXN0Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvbW9kZWxzL3Rhc2stbGlzdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE1BQU0sT0FBTyxRQUFRO0lBQXJCO1FBQ1MsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNsQixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osZUFBVSxHQUFHO1lBQ1gsY0FBYyxFQUFFLENBQUM7WUFDakIsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsRUFBRTtZQUNSLHFCQUFxQixFQUFFLENBQUM7U0FDekIsQ0FBQztRQUNGLFNBQUksR0FBRyxDQUFDLENBQUM7SUFDWCxDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgY2xhc3MgVGFza0xpc3Qge1xuICBwdWJsaWMgdGFza3MgPSBbXTtcbiAgZmllbGRzID0gW107XG4gIHBhZ2luYXRpb24gPSB7XG4gICAgY29sbGVjdGlvblNpemU6IDAsXG4gICAgcGFnZTogMSxcbiAgICBzaXplOiAxMCxcbiAgICBtYXhQYWdpbmF0aW9uSXRlbVNpemU6IDUsXG4gIH07XG4gIHBhZ2UgPSAwO1xufVxuIl19
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2015-2023 Ritense BV, the Netherlands.
|
|
3
|
-
*
|
|
4
|
-
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" basis,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
import { Component, EventEmitter, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
17
|
-
import { FormioOptionsImpl, } from '@valtimo/components';
|
|
18
|
-
import moment from 'moment';
|
|
19
|
-
import { map, take } from 'rxjs/operators';
|
|
20
|
-
import { BehaviorSubject, distinctUntilChanged, Subscription, tap } from 'rxjs';
|
|
21
|
-
import * as i0 from "@angular/core";
|
|
22
|
-
import * as i1 from "ngx-toastr";
|
|
23
|
-
import * as i2 from "@valtimo/form-link";
|
|
24
|
-
import * as i3 from "@angular/router";
|
|
25
|
-
import * as i4 from "ngx-logger";
|
|
26
|
-
import * as i5 from "../task.service";
|
|
27
|
-
import * as i6 from "@valtimo/security";
|
|
28
|
-
import * as i7 from "@valtimo/components";
|
|
29
|
-
import * as i8 from "@valtimo/document";
|
|
30
|
-
import * as i9 from "@ngx-translate/core";
|
|
31
|
-
import * as i10 from "@angular/common";
|
|
32
|
-
import * as i11 from "../assign-user-to-task/assign-user-to-task.component";
|
|
33
|
-
moment.locale(localStorage.getItem('langKey') || '');
|
|
34
|
-
export class TaskDetailModalComponent {
|
|
35
|
-
constructor(toastr, formLinkService, processLinkService, formFlowService, router, logger, route, taskService, userProviderService, modalService, documentService, translateService) {
|
|
36
|
-
this.toastr = toastr;
|
|
37
|
-
this.formLinkService = formLinkService;
|
|
38
|
-
this.processLinkService = processLinkService;
|
|
39
|
-
this.formFlowService = formFlowService;
|
|
40
|
-
this.router = router;
|
|
41
|
-
this.logger = logger;
|
|
42
|
-
this.route = route;
|
|
43
|
-
this.taskService = taskService;
|
|
44
|
-
this.userProviderService = userProviderService;
|
|
45
|
-
this.modalService = modalService;
|
|
46
|
-
this.documentService = documentService;
|
|
47
|
-
this.translateService = translateService;
|
|
48
|
-
this.formSubmit = new EventEmitter();
|
|
49
|
-
this.assignmentOfTaskChanged = new EventEmitter();
|
|
50
|
-
this.task = null;
|
|
51
|
-
this.page = null;
|
|
52
|
-
this.errorMessage = null;
|
|
53
|
-
this.isAdmin$ = this.userProviderService
|
|
54
|
-
.getUserSubject()
|
|
55
|
-
.pipe(map(userIdentity => userIdentity?.roles?.includes('ROLE_ADMIN')));
|
|
56
|
-
this.taskProcessLinkType$ = new BehaviorSubject(null);
|
|
57
|
-
this.processLinkIsForm$ = this.taskProcessLinkType$.pipe(map(type => type === 'form'));
|
|
58
|
-
this.processLinkIsFormFlow$ = this.taskProcessLinkType$.pipe(map(type => type === 'form-flow'));
|
|
59
|
-
this.formIoFormData$ = new BehaviorSubject(null);
|
|
60
|
-
this._subscriptions = new Subscription();
|
|
61
|
-
this.formioOptions = new FormioOptionsImpl();
|
|
62
|
-
this.formioOptions.disableAlerts = true;
|
|
63
|
-
}
|
|
64
|
-
ngAfterViewInit() {
|
|
65
|
-
this._subscriptions.add(this.modal.modalShowing$
|
|
66
|
-
.pipe(distinctUntilChanged(), tap(modalShowing => {
|
|
67
|
-
if (!modalShowing) {
|
|
68
|
-
if (this.formFlow) {
|
|
69
|
-
this.formFlow.saveData();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}))
|
|
73
|
-
.subscribe());
|
|
74
|
-
}
|
|
75
|
-
ngOnDestroy() {
|
|
76
|
-
this._subscriptions.unsubscribe();
|
|
77
|
-
}
|
|
78
|
-
openTaskDetails(task) {
|
|
79
|
-
this.resetTaskProcessLinkType();
|
|
80
|
-
this.resetFormDefinition();
|
|
81
|
-
this.getTaskProcessLink(task.id);
|
|
82
|
-
this.setDocumentDefinitionNameInService(task);
|
|
83
|
-
this.task = task;
|
|
84
|
-
this.page = {
|
|
85
|
-
title: task.name,
|
|
86
|
-
subtitle: `${this.translateService.instant('taskDetail.taskCreated')} ${task.created}`,
|
|
87
|
-
};
|
|
88
|
-
//only load from formlink when process link failed for backwards compatibility
|
|
89
|
-
if (!this.taskProcessLinkType$.getValue()) {
|
|
90
|
-
this.formLinkService
|
|
91
|
-
.getPreFilledFormDefinitionByFormLinkId(task.processDefinitionKey, task.businessKey, task.taskDefinitionKey, task.id // taskInstanceId
|
|
92
|
-
)
|
|
93
|
-
.subscribe(formDefinition => {
|
|
94
|
-
this.formAssociation = formDefinition.formAssociation;
|
|
95
|
-
const className = this.formAssociation.formLink.className.split('.');
|
|
96
|
-
const linkType = className[className.length - 1];
|
|
97
|
-
switch (linkType) {
|
|
98
|
-
case 'BpmnElementFormIdLink':
|
|
99
|
-
this.setFormDefinitionAndOpenModal(formDefinition);
|
|
100
|
-
break;
|
|
101
|
-
case 'BpmnElementFormFlowIdLink':
|
|
102
|
-
// We can't use the formDefinition here because the form definition is provided per form flow step
|
|
103
|
-
// I'm still leaving this in here in case we want to add form flow specific code.
|
|
104
|
-
this.modal.show();
|
|
105
|
-
break;
|
|
106
|
-
case 'BpmnElementUrlLink':
|
|
107
|
-
this.openUrlLink(formDefinition);
|
|
108
|
-
break;
|
|
109
|
-
case 'BpmnElementAngularStateUrlLink':
|
|
110
|
-
this.openAngularStateUrlLink(task, formDefinition);
|
|
111
|
-
break;
|
|
112
|
-
default:
|
|
113
|
-
this.logger.fatal('Unsupported class name');
|
|
114
|
-
}
|
|
115
|
-
}, errors => {
|
|
116
|
-
if (errors?.error?.detail) {
|
|
117
|
-
this.errorMessage = errors.error.detail;
|
|
118
|
-
}
|
|
119
|
-
this.modal.show();
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
gotoFormLinkScreen() {
|
|
124
|
-
this.modal.hide();
|
|
125
|
-
this.router.navigate(['form-links']);
|
|
126
|
-
}
|
|
127
|
-
onChange(event) {
|
|
128
|
-
if (event.data) {
|
|
129
|
-
this.formIoFormData$.next(event.data);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
onSubmit(submission) {
|
|
133
|
-
if (submission.data) {
|
|
134
|
-
this.formIoFormData$.next(submission.data);
|
|
135
|
-
}
|
|
136
|
-
if (this.taskProcessLinkType$.getValue() === 'form') {
|
|
137
|
-
if (this.processLinkId) {
|
|
138
|
-
this.processLinkService
|
|
139
|
-
.submitForm(this.processLinkId, submission.data, this.task.businessKey, this.task.id)
|
|
140
|
-
.subscribe({
|
|
141
|
-
next: (_) => {
|
|
142
|
-
this.completeTask();
|
|
143
|
-
},
|
|
144
|
-
error: errors => {
|
|
145
|
-
this.form.showErrors(errors);
|
|
146
|
-
},
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
this.formLinkService
|
|
151
|
-
.onSubmit(this.task.processDefinitionKey, this.formAssociation.formLink.id, submission.data, this.task.businessKey, this.task.id)
|
|
152
|
-
.subscribe((_) => {
|
|
153
|
-
this.completeTask();
|
|
154
|
-
}, errors => {
|
|
155
|
-
this.form.showErrors(errors);
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
resetFormDefinition() {
|
|
161
|
-
this.formDefinition = null;
|
|
162
|
-
}
|
|
163
|
-
getTaskProcessLink(taskId) {
|
|
164
|
-
this.taskService.getTaskProcessLink(taskId).subscribe({
|
|
165
|
-
next: res => {
|
|
166
|
-
if (res != null) {
|
|
167
|
-
switch (res?.type) {
|
|
168
|
-
case 'form':
|
|
169
|
-
this.taskProcessLinkType$.next('form');
|
|
170
|
-
this.processLinkId = res.processLinkId;
|
|
171
|
-
this.setFormDefinitionAndOpenModal(res.properties.prefilledForm);
|
|
172
|
-
break;
|
|
173
|
-
case 'form-flow':
|
|
174
|
-
this.taskProcessLinkType$.next('form-flow');
|
|
175
|
-
this.formFlowInstanceId = res.properties.formFlowInstanceId;
|
|
176
|
-
break;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
this.getLegacyTaskProcessLink(taskId);
|
|
181
|
-
}
|
|
182
|
-
},
|
|
183
|
-
error: _ => {
|
|
184
|
-
this.getLegacyTaskProcessLink(taskId);
|
|
185
|
-
},
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
completeTask() {
|
|
189
|
-
this.toastr.success(`${this.task.name} ${this.translateService.instant('taskDetail.taskCompleted')}`);
|
|
190
|
-
this.modal.hide();
|
|
191
|
-
this.task = null;
|
|
192
|
-
this.formSubmit.emit();
|
|
193
|
-
}
|
|
194
|
-
getLegacyTaskProcessLink(taskId) {
|
|
195
|
-
this.taskService.getTaskProcessLinkV1(taskId).subscribe(resV1 => {
|
|
196
|
-
switch (resV1?.type) {
|
|
197
|
-
case 'form':
|
|
198
|
-
this.taskProcessLinkType$.next('form');
|
|
199
|
-
break;
|
|
200
|
-
case 'form-flow':
|
|
201
|
-
this.taskProcessLinkType$.next('form-flow');
|
|
202
|
-
this.formFlowInstanceId = resV1.properties.formFlowInstanceId;
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
resetTaskProcessLinkType() {
|
|
208
|
-
this.taskProcessLinkType$.next(null);
|
|
209
|
-
this.processLinkId = null;
|
|
210
|
-
this.formAssociation = null;
|
|
211
|
-
}
|
|
212
|
-
setFormDefinitionAndOpenModal(formDefinition) {
|
|
213
|
-
this.taskProcessLinkType$.next('form');
|
|
214
|
-
this.formDefinition = formDefinition;
|
|
215
|
-
this.modal.show();
|
|
216
|
-
}
|
|
217
|
-
openUrlLink(formDefinition) {
|
|
218
|
-
const url = this.router.serializeUrl(this.router.createUrlTree([formDefinition.formAssociation.formLink.url]));
|
|
219
|
-
window.open(url, '_blank');
|
|
220
|
-
}
|
|
221
|
-
openAngularStateUrlLink(task, formDefinition) {
|
|
222
|
-
this.route.params.pipe(take(1)).subscribe(params => {
|
|
223
|
-
const taskId = task?.id;
|
|
224
|
-
const documentId = params?.documentId;
|
|
225
|
-
this.router.navigate([formDefinition.formAssociation.formLink.url], {
|
|
226
|
-
state: {
|
|
227
|
-
...(taskId && { taskId }),
|
|
228
|
-
...(documentId && { documentId }),
|
|
229
|
-
},
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
setDocumentDefinitionNameInService(task) {
|
|
234
|
-
this.documentService
|
|
235
|
-
.getProcessDocumentDefinitionFromProcessInstanceId(task.processInstanceId)
|
|
236
|
-
.subscribe(processDocumentDefinition => {
|
|
237
|
-
this.modalService.setDocumentDefinitionName(processDocumentDefinition.id.documentDefinitionId.name);
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
TaskDetailModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TaskDetailModalComponent, deps: [{ token: i1.ToastrService }, { token: i2.FormLinkService }, { token: i2.ProcessLinkService }, { token: i2.FormFlowService }, { token: i3.Router }, { token: i4.NGXLogger }, { token: i3.ActivatedRoute }, { token: i5.TaskService }, { token: i6.UserProviderService }, { token: i7.ValtimoModalService }, { token: i8.DocumentService }, { token: i9.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
242
|
-
TaskDetailModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TaskDetailModalComponent, selector: "valtimo-task-detail-modal", outputs: { formSubmit: "formSubmit", assignmentOfTaskChanged: "assignmentOfTaskChanged" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }, { propertyName: "formFlow", first: true, predicate: ["formFlow"], descendants: true }, { propertyName: "modal", first: true, predicate: ["taskDetailModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2023 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 #taskDetailModal\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div body *ngIf=\"formDefinition && (processLinkIsForm$ | async)\">\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n <div body *ngIf=\"processLinkIsFormFlow$ | async\">\n <valtimo-form-flow\n #formFlow\n [formIoFormData]=\"formIoFormData$\"\n [formFlowInstanceId]=\"formFlowInstanceId\"\n (formFlowComplete)=\"completeTask()\"\n ></valtimo-form-flow>\n </div>\n <div body *ngIf=\"!formDefinition && !formFlowInstanceId && !errorMessage\">\n <div class=\"bg-warning text-black mb-0 p-3 text-center\">\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n </div>\n <div body *ngIf=\"errorMessage\">\n <div class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ errorMessage }}\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-center\" *ngIf=\"!formDefinition\">\n <button\n class=\"btn btn-secondary btn-space\"\n type=\"button\"\n (click)=\"gotoFormLinkScreen()\"\n id=\"form-link-button\"\n >\n {{ 'formManagement.gotoFormLinksButton' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n\n<ng-template #assignUserToTask>\n <valtimo-assign-user-to-task\n *ngIf=\"task && assignmentOfTaskChanged\"\n [taskId]=\"task.id\"\n [assigneeEmail]=\"task.assignee\"\n (assignmentOfTaskChanged)=\"assignmentOfTaskChanged.emit()\"\n ></valtimo-assign-user-to-task>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 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 */#taskDetailModal .formio-component-submit{text-align:right}\n"], dependencies: [{ kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.FormioComponent, selector: "valtimo-form-io", inputs: ["form", "options", "submission", "readOnly", "formRefresh$"], outputs: ["submit", "change"] }, { kind: "component", type: i7.ModalComponent, selector: "valtimo-modal", inputs: ["elementId", "title", "subtitle", "templateBelowSubtitle", "showFooter"] }, { kind: "component", type: i2.FormFlowComponent, selector: "valtimo-form-flow", inputs: ["formIoFormData", "formFlowInstanceId"], outputs: ["formFlowComplete"] }, { kind: "component", type: i11.AssignUserToTaskComponent, selector: "valtimo-assign-user-to-task", inputs: ["taskId", "assigneeEmail"], outputs: ["assignmentOfTaskChanged"] }, { kind: "pipe", type: i10.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
|
|
243
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TaskDetailModalComponent, decorators: [{
|
|
244
|
-
type: Component,
|
|
245
|
-
args: [{ selector: 'valtimo-task-detail-modal', encapsulation: ViewEncapsulation.None, template: "<!--\n ~ Copyright 2015-2023 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 #taskDetailModal\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div body *ngIf=\"formDefinition && (processLinkIsForm$ | async)\">\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n <div body *ngIf=\"processLinkIsFormFlow$ | async\">\n <valtimo-form-flow\n #formFlow\n [formIoFormData]=\"formIoFormData$\"\n [formFlowInstanceId]=\"formFlowInstanceId\"\n (formFlowComplete)=\"completeTask()\"\n ></valtimo-form-flow>\n </div>\n <div body *ngIf=\"!formDefinition && !formFlowInstanceId && !errorMessage\">\n <div class=\"bg-warning text-black mb-0 p-3 text-center\">\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n </div>\n <div body *ngIf=\"errorMessage\">\n <div class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ errorMessage }}\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-center\" *ngIf=\"!formDefinition\">\n <button\n class=\"btn btn-secondary btn-space\"\n type=\"button\"\n (click)=\"gotoFormLinkScreen()\"\n id=\"form-link-button\"\n >\n {{ 'formManagement.gotoFormLinksButton' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n\n<ng-template #assignUserToTask>\n <valtimo-assign-user-to-task\n *ngIf=\"task && assignmentOfTaskChanged\"\n [taskId]=\"task.id\"\n [assigneeEmail]=\"task.assignee\"\n (assignmentOfTaskChanged)=\"assignmentOfTaskChanged.emit()\"\n ></valtimo-assign-user-to-task>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 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 */#taskDetailModal .formio-component-submit{text-align:right}\n"] }]
|
|
246
|
-
}], ctorParameters: function () { return [{ type: i1.ToastrService }, { type: i2.FormLinkService }, { type: i2.ProcessLinkService }, { type: i2.FormFlowService }, { type: i3.Router }, { type: i4.NGXLogger }, { type: i3.ActivatedRoute }, { type: i5.TaskService }, { type: i6.UserProviderService }, { type: i7.ValtimoModalService }, { type: i8.DocumentService }, { type: i9.TranslateService }]; }, propDecorators: { form: [{
|
|
247
|
-
type: ViewChild,
|
|
248
|
-
args: ['form']
|
|
249
|
-
}], formFlow: [{
|
|
250
|
-
type: ViewChild,
|
|
251
|
-
args: ['formFlow']
|
|
252
|
-
}], modal: [{
|
|
253
|
-
type: ViewChild,
|
|
254
|
-
args: ['taskDetailModal']
|
|
255
|
-
}], formSubmit: [{
|
|
256
|
-
type: Output
|
|
257
|
-
}], assignmentOfTaskChanged: [{
|
|
258
|
-
type: Output
|
|
259
|
-
}] } });
|
|
260
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvdGFzay1kZXRhaWwtbW9kYWwvdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvdGFzay1kZXRhaWwtbW9kYWwvdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFFWixNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBRUwsaUJBQWlCLEdBS2xCLE1BQU0scUJBQXFCLENBQUM7QUFXN0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRzVCLE9BQU8sRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBYyxZQUFZLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBSzFGLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQVFyRCxNQUFNLE9BQU8sd0JBQXdCO0lBd0JuQyxZQUNtQixNQUFxQixFQUNyQixlQUFnQyxFQUNoQyxrQkFBc0MsRUFDdEMsZUFBZ0MsRUFDaEMsTUFBYyxFQUNkLE1BQWlCLEVBQ2pCLEtBQXFCLEVBQ3JCLFdBQXdCLEVBQ3hCLG1CQUF3QyxFQUN4QyxZQUFpQyxFQUNqQyxlQUFnQyxFQUNoQyxnQkFBa0M7UUFYbEMsV0FBTSxHQUFOLE1BQU0sQ0FB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QUFjLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEUsS0FBSyxFQUFFO29CQUNMLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBQyxNQUFNLEVBQUMsQ0FBQztvQkFDdkIsR0FBRyxDQUFDLFVBQVUsSUFBSSxFQUFDLFVBQVUsRUFBQyxDQUFDO2lCQUNoQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGtDQUFrQyxDQUFDLElBQVU7UUFDbkQsSUFBSSxDQUFDLGVBQWU7YUFDakIsaURBQWlELENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQ3pFLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMseUJBQXlCLENBQ3pDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQ3ZELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7O3FIQXZRVSx3QkFBd0I7eUdBQXhCLHdCQUF3Qiw0YUM5RHJDLHlnRkE0RUE7MkZEZGEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLDJCQUEyQixpQkFHdEIsaUJBQWlCLENBQUMsSUFBSTtzYUFHbEIsSUFBSTtzQkFBdEIsU0FBUzt1QkFBQyxNQUFNO2dCQUNNLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDUyxLQUFLO3NCQUFsQyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDbEIsVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgRm9ybWlvQ29tcG9uZW50LFxuICBGb3JtaW9PcHRpb25zSW1wbCxcbiAgRm9ybWlvU3VibWlzc2lvbixcbiAgTW9kYWxDb21wb25lbnQsXG4gIFZhbHRpbW9Gb3JtaW9PcHRpb25zLFxuICBWYWx0aW1vTW9kYWxTZXJ2aWNlLFxufSBmcm9tICdAdmFsdGltby9jb21wb25lbnRzJztcbmltcG9ydCB7VGFzaywgVGFza1Byb2Nlc3NMaW5rVHlwZX0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG4gIEZvcm1Bc3NvY2lhdGlvbixcbiAgRm9ybUZsb3dDb21wb25lbnQsXG4gIEZvcm1GbG93U2VydmljZSxcbiAgRm9ybUxpbmtTZXJ2aWNlLFxuICBGb3JtU3VibWlzc2lvblJlc3VsdCxcbiAgUHJvY2Vzc0xpbmtTZXJ2aWNlLFxufSBmcm9tICdAdmFsdGltby9mb3JtLWxpbmsnO1xuaW1wb3J0IHtGb3JtaW9Gb3JtfSBmcm9tICdAZm9ybWlvL2FuZ3VsYXInO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtOR1hMb2dnZXJ9IGZyb20gJ25neC1sb2dnZXInO1xuaW1wb3J0IHtUb2FzdHJTZXJ2aWNlfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7bWFwLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1Rhc2tTZXJ2aWNlfSBmcm9tICcuLi90YXNrLnNlcnZpY2UnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIHRhcH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1VzZXJQcm92aWRlclNlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL3NlY3VyaXR5JztcbmltcG9ydCB7RG9jdW1lbnRTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5tb21lbnQubG9jYWxlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYW5nS2V5JykgfHwgJycpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLXRhc2stZGV0YWlsLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhc2stZGV0YWlsLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgVGFza0RldGFpbE1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnZm9ybScpIGZvcm06IEZvcm1pb0NvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnZm9ybUZsb3cnKSBmb3JtRmxvdzogRm9ybUZsb3dDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3Rhc2tEZXRhaWxNb2RhbCcpIG1vZGFsOiBNb2RhbENvbXBvbmVudDtcbiAgQE91dHB1dCgpIGZvcm1TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBhc3NpZ25tZW50T2ZUYXNrQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgdGFzazogVGFzayB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgZm9ybURlZmluaXRpb246IEZvcm1pb0Zvcm07XG4gIHB1YmxpYyBmb3JtRmxvd0luc3RhbmNlSWQ6IHN0cmluZztcbiAgcHVibGljIHBhZ2U6IGFueSA9IG51bGw7XG4gIHB1YmxpYyBmb3JtaW9PcHRpb25zOiBWYWx0aW1vRm9ybWlvT3B0aW9ucztcbiAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgcmVhZG9ubHkgaXNBZG1pbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnVzZXJQcm92aWRlclNlcnZpY2VcbiAgICAuZ2V0VXNlclN1YmplY3QoKVxuICAgIC5waXBlKG1hcCh1c2VySWRlbnRpdHkgPT4gdXNlcklkZW50aXR5Py5yb2xlcz8uaW5jbHVkZXMoJ1JPTEVfQURNSU4nKSkpO1xuICBwcml2YXRlIGZvcm1Bc3NvY2lhdGlvbjogRm9ybUFzc29jaWF0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NMaW5rSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSB0YXNrUHJvY2Vzc0xpbmtUeXBlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFza1Byb2Nlc3NMaW5rVHlwZSB8IG51bGw+KG51bGwpO1xuICBwcm9jZXNzTGlua0lzRm9ybSQgPSB0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLnBpcGUobWFwKHR5cGUgPT4gdHlwZSA9PT0gJ2Zvcm0nKSk7XG4gIHByb2Nlc3NMaW5rSXNGb3JtRmxvdyQgPSB0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLnBpcGUobWFwKHR5cGUgPT4gdHlwZSA9PT0gJ2Zvcm0tZmxvdycpKTtcbiAgZm9ybUlvRm9ybURhdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybUxpbmtTZXJ2aWNlOiBGb3JtTGlua1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9jZXNzTGlua1NlcnZpY2U6IFByb2Nlc3NMaW5rU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvcm1GbG93U2VydmljZTogRm9ybUZsb3dTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IE5HWExvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhc2tTZXJ2aWNlOiBUYXNrU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJQcm92aWRlclNlcnZpY2U6IFVzZXJQcm92aWRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtb2RhbFNlcnZpY2U6IFZhbHRpbW9Nb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5mb3JtaW9PcHRpb25zID0gbmV3IEZvcm1pb09wdGlvbnNJbXBsKCk7XG4gICAgdGhpcy5mb3JtaW9PcHRpb25zLmRpc2FibGVBbGVydHMgPSB0cnVlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5tb2RhbC5tb2RhbFNob3dpbmckXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgdGFwKG1vZGFsU2hvd2luZyA9PiB7XG4gICAgICAgICAgICBpZiAoIW1vZGFsU2hvd2luZykge1xuICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtRmxvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUZsb3cuc2F2ZURhdGEoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG9wZW5UYXNrRGV0YWlscyh0YXNrOiBUYXNrKSB7XG4gICAgdGhpcy5yZXNldFRhc2tQcm9jZXNzTGlua1R5cGUoKTtcbiAgICB0aGlzLnJlc2V0Rm9ybURlZmluaXRpb24oKTtcbiAgICB0aGlzLmdldFRhc2tQcm9jZXNzTGluayh0YXNrLmlkKTtcbiAgICB0aGlzLnNldERvY3VtZW50RGVmaW5pdGlvbk5hbWVJblNlcnZpY2UodGFzayk7XG5cbiAgICB0aGlzLnRhc2sgPSB0YXNrO1xuICAgIHRoaXMucGFnZSA9IHtcbiAgICAgIHRpdGxlOiB0YXNrLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogYCR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3Rhc2tEZXRhaWwudGFza0NyZWF0ZWQnKX0gJHt0YXNrLmNyZWF0ZWR9YCxcbiAgICB9O1xuXG4gICAgLy9vbmx5IGxvYWQgZnJvbSBmb3JtbGluayB3aGVuIHByb2Nlc3MgbGluayBmYWlsZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgaWYgKCF0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLmdldFZhbHVlKCkpIHtcbiAgICAgIHRoaXMuZm9ybUxpbmtTZXJ2aWNlXG4gICAgICAgIC5nZXRQcmVGaWxsZWRGb3JtRGVmaW5pdGlvbkJ5Rm9ybUxpbmtJZChcbiAgICAgICAgICB0YXNrLnByb2Nlc3NEZWZpbml0aW9uS2V5LFxuICAgICAgICAgIHRhc2suYnVzaW5lc3NLZXksXG4gICAgICAgICAgdGFzay50YXNrRGVmaW5pdGlvbktleSxcbiAgICAgICAgICB0YXNrLmlkIC8vIHRhc2tJbnN0YW5jZUlkXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICBmb3JtRGVmaW5pdGlvbiA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Bc3NvY2lhdGlvbiA9IGZvcm1EZWZpbml0aW9uLmZvcm1Bc3NvY2lhdGlvbjtcblxuICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5mb3JtQXNzb2NpYXRpb24uZm9ybUxpbmsuY2xhc3NOYW1lLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBjb25zdCBsaW5rVHlwZSA9IGNsYXNzTmFtZVtjbGFzc05hbWUubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICAgIHN3aXRjaCAobGlua1R5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnQnBtbkVsZW1lbnRGb3JtSWRMaW5rJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1EZWZpbml0aW9uQW5kT3Blbk1vZGFsKGZvcm1EZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnQnBtbkVsZW1lbnRGb3JtRmxvd0lkTGluayc6XG4gICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIHRoZSBmb3JtRGVmaW5pdGlvbiBoZXJlIGJlY2F1c2UgdGhlIGZvcm0gZGVmaW5pdGlvbiBpcyBwcm92aWRlZCBwZXIgZm9ybSBmbG93IHN0ZXBcbiAgICAgICAgICAgICAgICAvLyBJJ20gc3RpbGwgbGVhdmluZyB0aGlzIGluIGhlcmUgaW4gY2FzZSB3ZSB3YW50IHRvIGFkZCBmb3JtIGZsb3cgc3BlY2lmaWMgY29kZS5cbiAgICAgICAgICAgICAgICB0aGlzLm1vZGFsLnNob3coKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnQnBtbkVsZW1lbnRVcmxMaW5rJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5VcmxMaW5rKGZvcm1EZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnQnBtbkVsZW1lbnRBbmd1bGFyU3RhdGVVcmxMaW5rJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5Bbmd1bGFyU3RhdGVVcmxMaW5rKHRhc2ssIGZvcm1EZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5mYXRhbCgnVW5zdXBwb3J0ZWQgY2xhc3MgbmFtZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3JzID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcnM/LmVycm9yPy5kZXRhaWwpIHtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvcnMuZXJyb3IuZGV0YWlsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm1vZGFsLnNob3coKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdvdG9Gb3JtTGlua1NjcmVlbigpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2Zvcm0tbGlua3MnXSk7XG4gIH1cblxuICBwdWJsaWMgb25DaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmIChldmVudC5kYXRhKSB7XG4gICAgICB0aGlzLmZvcm1Jb0Zvcm1EYXRhJC5uZXh0KGV2ZW50LmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblN1Ym1pdChzdWJtaXNzaW9uOiBGb3JtaW9TdWJtaXNzaW9uKTogdm9pZCB7XG4gICAgaWYgKHN1Ym1pc3Npb24uZGF0YSkge1xuICAgICAgdGhpcy5mb3JtSW9Gb3JtRGF0YSQubmV4dChzdWJtaXNzaW9uLmRhdGEpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5nZXRWYWx1ZSgpID09PSAnZm9ybScpIHtcbiAgICAgIGlmICh0aGlzLnByb2Nlc3NMaW5rSWQpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGlua1NlcnZpY2VcbiAgICAgICAgICAuc3VibWl0Rm9ybSh0aGlzLnByb2Nlc3NMaW5rSWQsIHN1Ym1pc3Npb24uZGF0YSwgdGhpcy50YXNrLmJ1c2luZXNzS2V5LCB0aGlzLnRhc2suaWQpXG4gICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoXzogRm9ybVN1Ym1pc3Npb25SZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZVRhc2soKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZXJyb3JzID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtLnNob3dFcnJvcnMoZXJyb3JzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvcm1MaW5rU2VydmljZVxuICAgICAgICAgIC5vblN1Ym1pdChcbiAgICAgICAgICAgIHRoaXMudGFzay5wcm9jZXNzRGVmaW5pdGlvbktleSxcbiAgICAgICAgICAgIHRoaXMuZm9ybUFzc29jaWF0aW9uLmZvcm1MaW5rLmlkLFxuICAgICAgICAgICAgc3VibWlzc2lvbi5kYXRhLFxuICAgICAgICAgICAgdGhpcy50YXNrLmJ1c2luZXNzS2V5LFxuICAgICAgICAgICAgdGhpcy50YXNrLmlkXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoXzogRm9ybVN1Ym1pc3Npb25SZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZVRhc2soKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcnMgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmZvcm0uc2hvd0Vycm9ycyhlcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZvcm1EZWZpbml0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybURlZmluaXRpb24gPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYXNrUHJvY2Vzc0xpbmsodGFza0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tTZXJ2aWNlLmdldFRhc2tQcm9jZXNzTGluayh0YXNrSWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICBpZiAocmVzICE9IG51bGwpIHtcbiAgICAgICAgICBzd2l0Y2ggKHJlcz8udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgICAgICAgIHRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQubmV4dCgnZm9ybScpO1xuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NMaW5rSWQgPSByZXMucHJvY2Vzc0xpbmtJZDtcbiAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGVmaW5pdGlvbkFuZE9wZW5Nb2RhbChyZXMucHJvcGVydGllcy5wcmVmaWxsZWRGb3JtKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmb3JtLWZsb3cnOlxuICAgICAgICAgICAgICB0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLm5leHQoJ2Zvcm0tZmxvdycpO1xuICAgICAgICAgICAgICB0aGlzLmZvcm1GbG93SW5zdGFuY2VJZCA9IHJlcy5wcm9wZXJ0aWVzLmZvcm1GbG93SW5zdGFuY2VJZDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZ2V0TGVnYWN5VGFza1Byb2Nlc3NMaW5rKHRhc2tJZCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogXyA9PiB7XG4gICAgICAgIHRoaXMuZ2V0TGVnYWN5VGFza1Byb2Nlc3NMaW5rKHRhc2tJZCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY29tcGxldGVUYXNrKCkge1xuICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoXG4gICAgICBgJHt0aGlzLnRhc2submFtZX0gJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndGFza0RldGFpbC50YXNrQ29tcGxldGVkJyl9YFxuICAgICk7XG4gICAgdGhpcy5tb2RhbC5oaWRlKCk7XG4gICAgdGhpcy50YXNrID0gbnVsbDtcbiAgICB0aGlzLmZvcm1TdWJtaXQuZW1pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZWdhY3lUYXNrUHJvY2Vzc0xpbmsodGFza0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tTZXJ2aWNlLmdldFRhc2tQcm9jZXNzTGlua1YxKHRhc2tJZCkuc3Vic2NyaWJlKHJlc1YxID0+IHtcbiAgICAgIHN3aXRjaCAocmVzVjE/LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgICAgdGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCdmb3JtJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zvcm0tZmxvdyc6XG4gICAgICAgICAgdGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCdmb3JtLWZsb3cnKTtcbiAgICAgICAgICB0aGlzLmZvcm1GbG93SW5zdGFuY2VJZCA9IHJlc1YxLnByb3BlcnRpZXMuZm9ybUZsb3dJbnN0YW5jZUlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFRhc2tQcm9jZXNzTGlua1R5cGUoKTogdm9pZCB7XG4gICAgdGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KG51bGwpO1xuICAgIHRoaXMucHJvY2Vzc0xpbmtJZCA9IG51bGw7XG4gICAgdGhpcy5mb3JtQXNzb2NpYXRpb24gPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGb3JtRGVmaW5pdGlvbkFuZE9wZW5Nb2RhbChmb3JtRGVmaW5pdGlvbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCdmb3JtJyk7XG4gICAgdGhpcy5mb3JtRGVmaW5pdGlvbiA9IGZvcm1EZWZpbml0aW9uO1xuICAgIHRoaXMubW9kYWwuc2hvdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuVXJsTGluayhmb3JtRGVmaW5pdGlvbjogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5yb3V0ZXIuc2VyaWFsaXplVXJsKFxuICAgICAgdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbZm9ybURlZmluaXRpb24uZm9ybUFzc29jaWF0aW9uLmZvcm1MaW5rLnVybF0pXG4gICAgKTtcblxuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQW5ndWxhclN0YXRlVXJsTGluayh0YXNrOiBUYXNrLCBmb3JtRGVmaW5pdGlvbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgIGNvbnN0IHRhc2tJZCA9IHRhc2s/LmlkO1xuICAgICAgY29uc3QgZG9jdW1lbnRJZCA9IHBhcmFtcz8uZG9jdW1lbnRJZDtcblxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Zvcm1EZWZpbml0aW9uLmZvcm1Bc3NvY2lhdGlvbi5mb3JtTGluay51cmxdLCB7XG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgLi4uKHRhc2tJZCAmJiB7dGFza0lkfSksXG4gICAgICAgICAgLi4uKGRvY3VtZW50SWQgJiYge2RvY3VtZW50SWR9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREb2N1bWVudERlZmluaXRpb25OYW1lSW5TZXJ2aWNlKHRhc2s6IFRhc2spOiB2b2lkIHtcbiAgICB0aGlzLmRvY3VtZW50U2VydmljZVxuICAgICAgLmdldFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25Gcm9tUHJvY2Vzc0luc3RhbmNlSWQodGFzay5wcm9jZXNzSW5zdGFuY2VJZClcbiAgICAgIC5zdWJzY3JpYmUocHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbiA9PiB7XG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNldERvY3VtZW50RGVmaW5pdGlvbk5hbWUoXG4gICAgICAgICAgcHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbi5pZC5kb2N1bWVudERlZmluaXRpb25JZC5uYW1lXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjMgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48dmFsdGltby1tb2RhbFxuICAjdGFza0RldGFpbE1vZGFsXG4gIGVsZW1lbnRJZD1cInRhc2tEZXRhaWxNb2RhbFwiXG4gIFt0aXRsZV09XCJwYWdlPy50aXRsZVwiXG4gIFtzdWJ0aXRsZV09XCJwYWdlPy5zdWJ0aXRsZVwiXG4gIFt0ZW1wbGF0ZUJlbG93U3VidGl0bGVdPVwiYXNzaWduVXNlclRvVGFza1wiXG4+XG4gIDxkaXYgYm9keSAqbmdJZj1cImZvcm1EZWZpbml0aW9uICYmIChwcm9jZXNzTGlua0lzRm9ybSQgfCBhc3luYylcIj5cbiAgICA8dmFsdGltby1mb3JtLWlvXG4gICAgICAjZm9ybVxuICAgICAgW2Zvcm1dPVwiZm9ybURlZmluaXRpb25cIlxuICAgICAgKHN1Ym1pdCk9XCJvblN1Ym1pdCgkZXZlbnQpXCJcbiAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICBbb3B0aW9uc109XCJmb3JtaW9PcHRpb25zXCJcbiAgICA+PC92YWx0aW1vLWZvcm0taW8+XG4gIDwvZGl2PlxuICA8ZGl2IGJvZHkgKm5nSWY9XCJwcm9jZXNzTGlua0lzRm9ybUZsb3ckIHwgYXN5bmNcIj5cbiAgICA8dmFsdGltby1mb3JtLWZsb3dcbiAgICAgICNmb3JtRmxvd1xuICAgICAgW2Zvcm1Jb0Zvcm1EYXRhXT1cImZvcm1Jb0Zvcm1EYXRhJFwiXG4gICAgICBbZm9ybUZsb3dJbnN0YW5jZUlkXT1cImZvcm1GbG93SW5zdGFuY2VJZFwiXG4gICAgICAoZm9ybUZsb3dDb21wbGV0ZSk9XCJjb21wbGV0ZVRhc2soKVwiXG4gICAgPjwvdmFsdGltby1mb3JtLWZsb3c+XG4gIDwvZGl2PlxuICA8ZGl2IGJvZHkgKm5nSWY9XCIhZm9ybURlZmluaXRpb24gJiYgIWZvcm1GbG93SW5zdGFuY2VJZCAmJiAhZXJyb3JNZXNzYWdlXCI+XG4gICAgPGRpdiBjbGFzcz1cImJnLXdhcm5pbmcgdGV4dC1ibGFjayBtYi0wIHAtMyB0ZXh0LWNlbnRlclwiPlxuICAgICAge3tcbiAgICAgICAgKGlzQWRtaW4kIHwgYXN5bmMpXG4gICAgICAgICAgPyAoJ2Zvcm1NYW5hZ2VtZW50Lm5vRm9ybURlZmluaXRpb25Gb3VuZEFkbWluJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICA6ICgnZm9ybU1hbmFnZW1lbnQubm9Gb3JtRGVmaW5pdGlvbkZvdW5kVXNlcicgfCB0cmFuc2xhdGUpXG4gICAgICB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBib2R5ICpuZ0lmPVwiZXJyb3JNZXNzYWdlXCI+XG4gICAgPGRpdiBjbGFzcz1cImJnLWRhbmdlciB0ZXh0LWJsYWNrIG1iLTAgcC0zIHRleHQtY2VudGVyXCI+XG4gICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgZm9vdGVyPlxuICAgIDxkaXYgY2xhc3M9XCJtYi0wIHAtMyB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiIWZvcm1EZWZpbml0aW9uXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNwYWNlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJnb3RvRm9ybUxpbmtTY3JlZW4oKVwiXG4gICAgICAgIGlkPVwiZm9ybS1saW5rLWJ1dHRvblwiXG4gICAgICA+XG4gICAgICAgIHt7ICdmb3JtTWFuYWdlbWVudC5nb3RvRm9ybUxpbmtzQnV0dG9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC92YWx0aW1vLW1vZGFsPlxuXG48bmctdGVtcGxhdGUgI2Fzc2lnblVzZXJUb1Rhc2s+XG4gIDx2YWx0aW1vLWFzc2lnbi11c2VyLXRvLXRhc2tcbiAgICAqbmdJZj1cInRhc2sgJiYgYXNzaWdubWVudE9mVGFza0NoYW5nZWRcIlxuICAgIFt0YXNrSWRdPVwidGFzay5pZFwiXG4gICAgW2Fzc2lnbmVlRW1haWxdPVwidGFzay5hc3NpZ25lZVwiXG4gICAgKGFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkKT1cImFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkLmVtaXQoKVwiXG4gID48L3ZhbHRpbW8tYXNzaWduLXVzZXItdG8tdGFzaz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|