@valtimo/milestone 4.21.0 → 5.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/esm2020/lib/milestone-create/milestone-create.component.mjs +106 -0
- package/esm2020/lib/milestone-edit/milestone-edit.component.mjs +145 -0
- package/esm2020/lib/milestone-list/milestone-list.component.mjs +88 -0
- package/esm2020/lib/milestone-routing.module.mjs +73 -0
- package/esm2020/lib/milestone-set-create/milestone-set-create.component.mjs +57 -0
- package/esm2020/lib/milestone-set-edit/milestone-set-edit.component.mjs +82 -0
- package/esm2020/lib/milestone.component.mjs +31 -0
- package/esm2020/lib/milestone.module.mjs +81 -0
- package/esm2020/lib/milestone.service.mjs +68 -0
- package/esm2020/lib/models/index.mjs +20 -0
- package/esm2020/lib/models/milestone-set.model.mjs +17 -0
- package/esm2020/lib/models/milestone.model.mjs +17 -0
- package/esm2020/public-api.mjs +23 -0
- package/esm2020/valtimo-milestone.mjs +5 -0
- package/fesm2015/valtimo-milestone.mjs +713 -0
- package/fesm2015/valtimo-milestone.mjs.map +1 -0
- package/fesm2020/valtimo-milestone.mjs +745 -0
- package/fesm2020/valtimo-milestone.mjs.map +1 -0
- package/lib/milestone-create/milestone-create.component.d.ts +4 -0
- package/lib/milestone-create/milestone-create.component.d.ts.map +1 -0
- package/lib/milestone-edit/milestone-edit.component.d.ts +4 -0
- package/lib/milestone-edit/milestone-edit.component.d.ts.map +1 -0
- package/lib/milestone-list/milestone-list.component.d.ts +4 -0
- package/lib/milestone-list/milestone-list.component.d.ts.map +1 -0
- package/lib/milestone-routing.module.d.ts +7 -0
- package/lib/milestone-routing.module.d.ts.map +1 -0
- package/lib/milestone-set-create/milestone-set-create.component.d.ts +4 -0
- package/lib/milestone-set-create/milestone-set-create.component.d.ts.map +1 -0
- package/lib/milestone-set-edit/milestone-set-edit.component.d.ts +4 -0
- package/lib/milestone-set-edit/milestone-set-edit.component.d.ts.map +1 -0
- package/lib/milestone.component.d.ts +4 -0
- package/lib/milestone.component.d.ts.map +1 -0
- package/lib/milestone.module.d.ts +18 -0
- package/lib/milestone.module.d.ts.map +1 -0
- package/lib/milestone.service.d.ts +4 -0
- package/lib/milestone.service.d.ts.map +1 -0
- package/lib/models/index.d.ts +1 -0
- package/lib/models/index.d.ts.map +1 -0
- package/lib/models/milestone-set.model.d.ts +1 -0
- package/lib/models/milestone-set.model.d.ts.map +1 -0
- package/lib/models/milestone.model.d.ts +1 -0
- package/lib/models/milestone.model.d.ts.map +1 -0
- package/package.json +22 -10
- package/public-api.d.ts +1 -0
- package/public-api.d.ts.map +1 -0
- package/valtimo-milestone.d.ts +2 -6
- package/valtimo-milestone.d.ts.map +1 -0
- package/bundles/valtimo-milestone.umd.js +0 -1105
- package/bundles/valtimo-milestone.umd.js.map +0 -1
- package/bundles/valtimo-milestone.umd.min.js +0 -2
- package/bundles/valtimo-milestone.umd.min.js.map +0 -1
- package/esm2015/lib/milestone-create/milestone-create.component.js +0 -110
- package/esm2015/lib/milestone-edit/milestone-edit.component.js +0 -150
- package/esm2015/lib/milestone-list/milestone-list.component.js +0 -90
- package/esm2015/lib/milestone-routing.module.js +0 -69
- package/esm2015/lib/milestone-set-create/milestone-set-create.component.js +0 -61
- package/esm2015/lib/milestone-set-edit/milestone-set-edit.component.js +0 -87
- package/esm2015/lib/milestone.component.js +0 -29
- package/esm2015/lib/milestone.module.js +0 -55
- package/esm2015/lib/milestone.service.js +0 -72
- package/esm2015/lib/models/index.js +0 -20
- package/esm2015/lib/models/milestone-set.model.js +0 -16
- package/esm2015/lib/models/milestone.model.js +0 -16
- package/esm2015/public-api.js +0 -23
- package/esm2015/valtimo-milestone.js +0 -11
- package/fesm2015/valtimo-milestone.js +0 -750
- package/fesm2015/valtimo-milestone.js.map +0 -1
- package/valtimo-milestone.metadata.json +0 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2015-2020 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 } from '@angular/core';
|
|
17
|
+
import { FormControl, Validators } from '@angular/forms';
|
|
18
|
+
import * as i0 from "@angular/core";
|
|
19
|
+
import * as i1 from "../milestone.service";
|
|
20
|
+
import * as i2 from "@angular/forms";
|
|
21
|
+
import * as i3 from "@angular/router";
|
|
22
|
+
import * as i4 from "@valtimo/components";
|
|
23
|
+
import * as i5 from "@valtimo/process";
|
|
24
|
+
import * as i6 from "@angular/common";
|
|
25
|
+
import * as i7 from "ngx-color-picker";
|
|
26
|
+
export class MilestoneCreateComponent {
|
|
27
|
+
constructor(milestoneService, formBuilder, router, alertService, processService) {
|
|
28
|
+
this.milestoneService = milestoneService;
|
|
29
|
+
this.formBuilder = formBuilder;
|
|
30
|
+
this.router = router;
|
|
31
|
+
this.alertService = alertService;
|
|
32
|
+
this.processService = processService;
|
|
33
|
+
this.milestoneSets = [];
|
|
34
|
+
this.processDefinitions = [];
|
|
35
|
+
this.taskDefinitions = [];
|
|
36
|
+
}
|
|
37
|
+
get formControls() {
|
|
38
|
+
return this.form.controls;
|
|
39
|
+
}
|
|
40
|
+
ngOnInit() {
|
|
41
|
+
this.form = this.formBuilder.group({
|
|
42
|
+
milestoneSet: new FormControl('', Validators.required),
|
|
43
|
+
title: new FormControl('', Validators.required),
|
|
44
|
+
processDefinitionKey: new FormControl('', Validators.required),
|
|
45
|
+
taskDefinitionKey: new FormControl('', Validators.required),
|
|
46
|
+
plannedIntervalInDays: new FormControl('', [
|
|
47
|
+
Validators.required,
|
|
48
|
+
Validators.pattern('^[0-9]*$'),
|
|
49
|
+
]),
|
|
50
|
+
color: new FormControl('', [
|
|
51
|
+
Validators.required,
|
|
52
|
+
Validators.pattern('^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$'),
|
|
53
|
+
]),
|
|
54
|
+
});
|
|
55
|
+
this.getMilestoneSets();
|
|
56
|
+
this.getMilestones();
|
|
57
|
+
}
|
|
58
|
+
reset() {
|
|
59
|
+
this.form.patchValue({
|
|
60
|
+
milestoneSet: '',
|
|
61
|
+
title: '',
|
|
62
|
+
processDefinitionKey: '',
|
|
63
|
+
taskDefinitionKey: '',
|
|
64
|
+
plannedIntervalInDays: '',
|
|
65
|
+
color: '',
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
getMilestoneSets() {
|
|
69
|
+
this.milestoneService.getMilestoneSets().subscribe((milesetoneSets) => {
|
|
70
|
+
this.milestoneSets = milesetoneSets;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
getMilestones() {
|
|
74
|
+
this.processService
|
|
75
|
+
.getProcessDefinitions()
|
|
76
|
+
.subscribe((processDefinitions) => {
|
|
77
|
+
this.processDefinitions = processDefinitions;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
getFlownodes(processDefinitionId) {
|
|
81
|
+
if (processDefinitionId) {
|
|
82
|
+
this.milestoneService.getFlownodes(processDefinitionId).subscribe((flowNodes) => {
|
|
83
|
+
this.taskDefinitions = flowNodes['flowNodeMap'];
|
|
84
|
+
this.form.controls.taskDefinitionKey.setValue('');
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
createMilestone() {
|
|
89
|
+
const milestone = this.form.value;
|
|
90
|
+
milestone.processDefinitionKey = milestone.processDefinitionKey['key'];
|
|
91
|
+
milestone.id = null;
|
|
92
|
+
this.milestoneService.createMilestone(milestone).subscribe(() => {
|
|
93
|
+
this.router.navigate(['/milestones']);
|
|
94
|
+
this.alertService.success('New Milestone has been created');
|
|
95
|
+
}, err => {
|
|
96
|
+
this.alertService.error('Error creating new milestone');
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
MilestoneCreateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: MilestoneCreateComponent, deps: [{ token: i1.MilestoneService }, { token: i2.FormBuilder }, { token: i3.Router }, { token: i4.AlertService }, { token: i5.ProcessService }], target: i0.ɵɵFactoryTarget.Component });
|
|
101
|
+
MilestoneCreateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: MilestoneCreateComponent, selector: "valtimo-milestone-create", ngImport: i0, template: "<!--\n ~ Copyright 2015-2020 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"main-content\">\n <div class=\"container-fluid\">\n <div class=\"col-12 px-0 mb-5\">\n <valtimo-widget>\n <div class=\"bg-white p-5\">\n <form [formGroup]=\"form\" (ngSubmit)=\"createMilestone()\">\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"title\"\n >Milestone set</label\n >\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <select\n type=\"text\"\n id=\"milestoneSet\"\n formControlName=\"milestoneSet\"\n class=\"form-control\"\n [ngClass]=\"{\n 'is-valid':\n formControls.milestoneSet.touched && formControls.milestoneSet.valid,\n 'is-invalid':\n formControls.milestoneSet.touched && formControls.milestoneSet.errors\n }\"\n required\n >\n <option value=\"\" selected disabled>Choose a Milestone set</option>\n <option *ngFor=\"let milestoneSet of milestoneSets\" [value]=\"milestoneSet.id\">\n {{ milestoneSet.title }} ({{ milestoneSet.id }})\n </option>\n </select>\n <div\n *ngIf=\"formControls.milestoneSet.touched && formControls.milestoneSet.errors\"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.milestoneSet.errors.required\">\n Milestone set is required\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"title\">Title</label>\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <input\n type=\"text\"\n id=\"title\"\n formControlName=\"title\"\n class=\"form-control\"\n placeholder=\"Milestone title\"\n [ngClass]=\"{\n 'is-valid': formControls.title.touched && formControls.title.valid,\n 'is-invalid': formControls.title.touched && formControls.title.errors\n }\"\n required\n />\n <div\n *ngIf=\"formControls.title.touched && formControls.title.errors\"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.title.errors.required\">Title is required</div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"process\"\n >Process definition</label\n >\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <select\n type=\"text\"\n id=\"process\"\n formControlName=\"processDefinitionKey\"\n class=\"form-control\"\n (ngModelChange)=\"getFlownodes($event.id)\"\n [ngClass]=\"{\n 'is-valid':\n formControls.processDefinitionKey.touched &&\n formControls.processDefinitionKey.valid,\n 'is-invalid':\n formControls.processDefinitionKey.touched &&\n formControls.processDefinitionKey.errors\n }\"\n required\n >\n <option value=\"\" selected disabled>Choose a process</option>\n <option\n *ngFor=\"let processDefinition of processDefinitions\"\n [ngValue]=\"processDefinition\"\n >\n {{ processDefinition.name }} ({{ processDefinition.key }})\n </option>\n </select>\n <div\n *ngIf=\"\n formControls.processDefinitionKey.touched &&\n formControls.processDefinitionKey.errors\n \"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.processDefinitionKey.errors.required\">\n Process is required\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"process\">Task</label>\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <select\n type=\"text\"\n id=\"task\"\n formControlName=\"taskDefinitionKey\"\n class=\"form-control\"\n [ngClass]=\"{\n 'is-valid':\n formControls.taskDefinitionKey.touched &&\n formControls.taskDefinitionKey.valid,\n 'is-invalid':\n formControls.taskDefinitionKey.touched &&\n formControls.taskDefinitionKey.errors\n }\"\n required\n >\n <option value=\"\" selected disabled>Choose a task</option>\n <option\n *ngFor=\"let taskDefinition of taskDefinitions | keyvalue\"\n [value]=\"taskDefinition.key\"\n >\n {{ taskDefinition.value }} ({{ taskDefinition.key }})\n </option>\n </select>\n <div\n *ngIf=\"\n formControls.taskDefinitionKey.touched && formControls.taskDefinitionKey.errors\n \"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.taskDefinitionKey.errors.required\">Task is required</div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"interval\"\n >Interval (in days)</label\n >\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <input\n type=\"text\"\n id=\"interval\"\n formControlName=\"plannedIntervalInDays\"\n class=\"form-control\"\n placeholder=\"Interval (in days)\"\n [ngClass]=\"{\n 'is-valid':\n formControls.plannedIntervalInDays.touched &&\n formControls.plannedIntervalInDays.valid,\n 'is-invalid':\n formControls.plannedIntervalInDays.touched &&\n formControls.plannedIntervalInDays.errors\n }\"\n required\n />\n <div\n *ngIf=\"\n formControls.plannedIntervalInDays.touched &&\n formControls.plannedIntervalInDays.errors\n \"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.plannedIntervalInDays.errors.required\">\n Interval is required\n </div>\n <div *ngIf=\"formControls.plannedIntervalInDays.errors.pattern\">\n Interval is not a valid number\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"color\">Color</label>\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <input\n [colorPicker]=\"form.value.color\"\n (colorPickerChange)=\"form.controls.color.setValue($event)\"\n [style.background]=\"form.value.color\"\n type=\"text\"\n id=\"color\"\n formControlName=\"color\"\n class=\"form-control\"\n placeholder=\"Color\"\n [ngClass]=\"{\n 'is-valid': formControls.color.touched && formControls.color.valid,\n 'is-invalid': formControls.color.touched && formControls.color.errors\n }\"\n required\n />\n <div\n *ngIf=\"formControls.color.touched && formControls.color.errors\"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.color.errors.required\">Interval is required</div>\n <div *ngIf=\"formControls.color.errors.pattern\">Color is not a valid hex code</div>\n </div>\n </div>\n </div>\n\n <div class=\"row pt-3 mt-1\">\n <div class=\"col-12 col-sm-6 text-left\">\n <a [routerLink]=\"'/milestones'\" class=\"btn btn-space btn-default\">Back</a>\n </div>\n <div class=\"col-12 col-sm-6 text-right\">\n <button class=\"btn btn-space btn-secondary\" type=\"button\" (click)=\"reset()\">\n Reset\n </button>\n <button class=\"btn btn-space btn-primary\" type=\"submit\" [disabled]=\"form.invalid\">\n Submit\n </button>\n </div>\n </div>\n </form>\n </div>\n </valtimo-widget>\n </div>\n </div>\n</div>\n", styles: ["/*!\n * Copyright 2015-2020 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"], components: [{ type: i4.WidgetComponent, selector: "valtimo-widget", inputs: ["type", "name", "icon", "contrast", "divider", "title", "subtitle", "collapseAble", "collapse", "additionalClasses"] }], directives: [{ type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i7.ColorPickerDirective, selector: "[colorPicker]", inputs: ["cpWidth", "cpHeight", "cpToggle", "cpDisabled", "cpIgnoredElements", "cpFallbackColor", "cpColorMode", "cpCmykEnabled", "cpOutputFormat", "cpAlphaChannel", "cpDisableInput", "cpDialogDisplay", "cpSaveClickOutside", "cpCloseClickOutside", "cpUseRootViewContainer", "cpPosition", "cpPositionOffset", "cpPositionRelativeToArrow", "cpOKButton", "cpOKButtonText", "cpOKButtonClass", "cpCancelButton", "cpCancelButtonText", "cpCancelButtonClass", "cpPresetLabel", "cpPresetColorsClass", "cpMaxPresetColorsLength", "cpPresetEmptyMessage", "cpPresetEmptyMessageClass", "cpAddColorButton", "cpAddColorButtonText", "cpAddColorButtonClass", "cpRemoveColorButtonClass", "colorPicker", "cpPresetColors"], outputs: ["cpInputChange", "cpToggleChange", "cpSliderChange", "cpSliderDragEnd", "cpSliderDragStart", "colorPickerOpen", "colorPickerClose", "colorPickerCancel", "colorPickerSelect", "colorPickerChange", "cpCmykColorChange", "cpPresetColorsChange"], exportAs: ["ngxColorPicker"] }, { type: i3.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }], pipes: { "keyvalue": i6.KeyValuePipe } });
|
|
102
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: MilestoneCreateComponent, decorators: [{
|
|
103
|
+
type: Component,
|
|
104
|
+
args: [{ selector: 'valtimo-milestone-create', template: "<!--\n ~ Copyright 2015-2020 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"main-content\">\n <div class=\"container-fluid\">\n <div class=\"col-12 px-0 mb-5\">\n <valtimo-widget>\n <div class=\"bg-white p-5\">\n <form [formGroup]=\"form\" (ngSubmit)=\"createMilestone()\">\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"title\"\n >Milestone set</label\n >\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <select\n type=\"text\"\n id=\"milestoneSet\"\n formControlName=\"milestoneSet\"\n class=\"form-control\"\n [ngClass]=\"{\n 'is-valid':\n formControls.milestoneSet.touched && formControls.milestoneSet.valid,\n 'is-invalid':\n formControls.milestoneSet.touched && formControls.milestoneSet.errors\n }\"\n required\n >\n <option value=\"\" selected disabled>Choose a Milestone set</option>\n <option *ngFor=\"let milestoneSet of milestoneSets\" [value]=\"milestoneSet.id\">\n {{ milestoneSet.title }} ({{ milestoneSet.id }})\n </option>\n </select>\n <div\n *ngIf=\"formControls.milestoneSet.touched && formControls.milestoneSet.errors\"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.milestoneSet.errors.required\">\n Milestone set is required\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"title\">Title</label>\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <input\n type=\"text\"\n id=\"title\"\n formControlName=\"title\"\n class=\"form-control\"\n placeholder=\"Milestone title\"\n [ngClass]=\"{\n 'is-valid': formControls.title.touched && formControls.title.valid,\n 'is-invalid': formControls.title.touched && formControls.title.errors\n }\"\n required\n />\n <div\n *ngIf=\"formControls.title.touched && formControls.title.errors\"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.title.errors.required\">Title is required</div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"process\"\n >Process definition</label\n >\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <select\n type=\"text\"\n id=\"process\"\n formControlName=\"processDefinitionKey\"\n class=\"form-control\"\n (ngModelChange)=\"getFlownodes($event.id)\"\n [ngClass]=\"{\n 'is-valid':\n formControls.processDefinitionKey.touched &&\n formControls.processDefinitionKey.valid,\n 'is-invalid':\n formControls.processDefinitionKey.touched &&\n formControls.processDefinitionKey.errors\n }\"\n required\n >\n <option value=\"\" selected disabled>Choose a process</option>\n <option\n *ngFor=\"let processDefinition of processDefinitions\"\n [ngValue]=\"processDefinition\"\n >\n {{ processDefinition.name }} ({{ processDefinition.key }})\n </option>\n </select>\n <div\n *ngIf=\"\n formControls.processDefinitionKey.touched &&\n formControls.processDefinitionKey.errors\n \"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.processDefinitionKey.errors.required\">\n Process is required\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"process\">Task</label>\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <select\n type=\"text\"\n id=\"task\"\n formControlName=\"taskDefinitionKey\"\n class=\"form-control\"\n [ngClass]=\"{\n 'is-valid':\n formControls.taskDefinitionKey.touched &&\n formControls.taskDefinitionKey.valid,\n 'is-invalid':\n formControls.taskDefinitionKey.touched &&\n formControls.taskDefinitionKey.errors\n }\"\n required\n >\n <option value=\"\" selected disabled>Choose a task</option>\n <option\n *ngFor=\"let taskDefinition of taskDefinitions | keyvalue\"\n [value]=\"taskDefinition.key\"\n >\n {{ taskDefinition.value }} ({{ taskDefinition.key }})\n </option>\n </select>\n <div\n *ngIf=\"\n formControls.taskDefinitionKey.touched && formControls.taskDefinitionKey.errors\n \"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.taskDefinitionKey.errors.required\">Task is required</div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"interval\"\n >Interval (in days)</label\n >\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <input\n type=\"text\"\n id=\"interval\"\n formControlName=\"plannedIntervalInDays\"\n class=\"form-control\"\n placeholder=\"Interval (in days)\"\n [ngClass]=\"{\n 'is-valid':\n formControls.plannedIntervalInDays.touched &&\n formControls.plannedIntervalInDays.valid,\n 'is-invalid':\n formControls.plannedIntervalInDays.touched &&\n formControls.plannedIntervalInDays.errors\n }\"\n required\n />\n <div\n *ngIf=\"\n formControls.plannedIntervalInDays.touched &&\n formControls.plannedIntervalInDays.errors\n \"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.plannedIntervalInDays.errors.required\">\n Interval is required\n </div>\n <div *ngIf=\"formControls.plannedIntervalInDays.errors.pattern\">\n Interval is not a valid number\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"color\">Color</label>\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <input\n [colorPicker]=\"form.value.color\"\n (colorPickerChange)=\"form.controls.color.setValue($event)\"\n [style.background]=\"form.value.color\"\n type=\"text\"\n id=\"color\"\n formControlName=\"color\"\n class=\"form-control\"\n placeholder=\"Color\"\n [ngClass]=\"{\n 'is-valid': formControls.color.touched && formControls.color.valid,\n 'is-invalid': formControls.color.touched && formControls.color.errors\n }\"\n required\n />\n <div\n *ngIf=\"formControls.color.touched && formControls.color.errors\"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.color.errors.required\">Interval is required</div>\n <div *ngIf=\"formControls.color.errors.pattern\">Color is not a valid hex code</div>\n </div>\n </div>\n </div>\n\n <div class=\"row pt-3 mt-1\">\n <div class=\"col-12 col-sm-6 text-left\">\n <a [routerLink]=\"'/milestones'\" class=\"btn btn-space btn-default\">Back</a>\n </div>\n <div class=\"col-12 col-sm-6 text-right\">\n <button class=\"btn btn-space btn-secondary\" type=\"button\" (click)=\"reset()\">\n Reset\n </button>\n <button class=\"btn btn-space btn-primary\" type=\"submit\" [disabled]=\"form.invalid\">\n Submit\n </button>\n </div>\n </div>\n </form>\n </div>\n </valtimo-widget>\n </div>\n </div>\n</div>\n", styles: ["/*!\n * Copyright 2015-2020 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"] }]
|
|
105
|
+
}], ctorParameters: function () { return [{ type: i1.MilestoneService }, { type: i2.FormBuilder }, { type: i3.Router }, { type: i4.AlertService }, { type: i5.ProcessService }]; } });
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlsZXN0b25lLWNyZWF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL21pbGVzdG9uZS9zcmMvbGliL21pbGVzdG9uZS1jcmVhdGUvbWlsZXN0b25lLWNyZWF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL21pbGVzdG9uZS9zcmMvbGliL21pbGVzdG9uZS1jcmVhdGUvbWlsZXN0b25lLWNyZWF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBQyxTQUFTLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFjLFdBQVcsRUFBYSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBWS9FLE1BQU0sT0FBTyx3QkFBd0I7SUFNbkMsWUFDVSxnQkFBa0MsRUFDbEMsV0FBd0IsRUFDeEIsTUFBYyxFQUNkLFlBQTBCLEVBQzFCLGNBQThCO1FBSjlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQVRqQyxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFDbkMsdUJBQWtCLEdBQXdCLEVBQUUsQ0FBQztRQUM3QyxvQkFBZSxHQUFVLEVBQUUsQ0FBQztJQVFoQyxDQUFDO0lBRUosSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM1QixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDakMsWUFBWSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3RELEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUMvQyxvQkFBb0IsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM5RCxpQkFBaUIsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUMzRCxxQkFBcUIsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3pDLFVBQVUsQ0FBQyxRQUFRO2dCQUNuQixVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUMvQixDQUFDO1lBQ0YsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRTtnQkFDekIsVUFBVSxDQUFDLFFBQVE7Z0JBQ25CLFVBQVUsQ0FBQyxPQUFPLENBQUMsb0NBQW9DLENBQUM7YUFDekQsQ0FBQztTQUNILENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ25CLFlBQVksRUFBRSxFQUFFO1lBQ2hCLEtBQUssRUFBRSxFQUFFO1lBQ1Qsb0JBQW9CLEVBQUUsRUFBRTtZQUN4QixpQkFBaUIsRUFBRSxFQUFFO1lBQ3JCLHFCQUFxQixFQUFFLEVBQUU7WUFDekIsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBOEIsRUFBRSxFQUFFO1lBQ3BGLElBQUksQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsY0FBYzthQUNoQixxQkFBcUIsRUFBRTthQUN2QixTQUFTLENBQUMsQ0FBQyxrQkFBdUMsRUFBRSxFQUFFO1lBQ3JELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxZQUFZLENBQUMsbUJBQTJCO1FBQ3RDLElBQUksbUJBQW1CLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQWdCLEVBQUUsRUFBRTtnQkFDckYsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLFNBQVMsR0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM3QyxTQUFTLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLFNBQVMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUN4RCxHQUFHLEVBQUU7WUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUM5RCxDQUFDLEVBQ0QsR0FBRyxDQUFDLEVBQUU7WUFDSixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQzs7cUhBcEZVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLGdFQzdCckMsNHpVQXFQQTsyRkR4TmEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIwIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7Q29tcG9uZW50LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtNaWxlc3RvbmVTZXJ2aWNlfSBmcm9tICcuLi9taWxlc3RvbmUuc2VydmljZSc7XG5pbXBvcnQge1JvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7QWxlcnRTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9jb21wb25lbnRzJztcbmltcG9ydCB7TWlsZXN0b25lLCBNaWxlc3RvbmVTZXR9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1Byb2Nlc3NTZXJ2aWNlLCBQcm9jZXNzRGVmaW5pdGlvbn0gZnJvbSAnQHZhbHRpbW8vcHJvY2Vzcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tbWlsZXN0b25lLWNyZWF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9taWxlc3RvbmUtY3JlYXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWlsZXN0b25lLWNyZWF0ZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBNaWxlc3RvbmVDcmVhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xuICBwdWJsaWMgbWlsZXN0b25lU2V0czogTWlsZXN0b25lU2V0W10gPSBbXTtcbiAgcHVibGljIHByb2Nlc3NEZWZpbml0aW9uczogUHJvY2Vzc0RlZmluaXRpb25bXSA9IFtdO1xuICBwdWJsaWMgdGFza0RlZmluaXRpb25zOiBhbnlbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbWlsZXN0b25lU2VydmljZTogTWlsZXN0b25lU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcm9jZXNzU2VydmljZTogUHJvY2Vzc1NlcnZpY2VcbiAgKSB7fVxuXG4gIGdldCBmb3JtQ29udHJvbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5jb250cm9scztcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgbWlsZXN0b25lU2V0OiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgdGl0bGU6IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBwcm9jZXNzRGVmaW5pdGlvbktleTogbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIHRhc2tEZWZpbml0aW9uS2V5OiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgcGxhbm5lZEludGVydmFsSW5EYXlzOiBuZXcgRm9ybUNvbnRyb2woJycsIFtcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgVmFsaWRhdG9ycy5wYXR0ZXJuKCdeWzAtOV0qJCcpLFxuICAgICAgXSksXG4gICAgICBjb2xvcjogbmV3IEZvcm1Db250cm9sKCcnLCBbXG4gICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgIFZhbGlkYXRvcnMucGF0dGVybignXiMoW0EtRmEtZjAtOV17Nn18W0EtRmEtZjAtOV17M30pJCcpLFxuICAgICAgXSksXG4gICAgfSk7XG4gICAgdGhpcy5nZXRNaWxlc3RvbmVTZXRzKCk7XG4gICAgdGhpcy5nZXRNaWxlc3RvbmVzKCk7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBtaWxlc3RvbmVTZXQ6ICcnLFxuICAgICAgdGl0bGU6ICcnLFxuICAgICAgcHJvY2Vzc0RlZmluaXRpb25LZXk6ICcnLFxuICAgICAgdGFza0RlZmluaXRpb25LZXk6ICcnLFxuICAgICAgcGxhbm5lZEludGVydmFsSW5EYXlzOiAnJyxcbiAgICAgIGNvbG9yOiAnJyxcbiAgICB9KTtcbiAgfVxuXG4gIGdldE1pbGVzdG9uZVNldHMoKSB7XG4gICAgdGhpcy5taWxlc3RvbmVTZXJ2aWNlLmdldE1pbGVzdG9uZVNldHMoKS5zdWJzY3JpYmUoKG1pbGVzZXRvbmVTZXRzOiBNaWxlc3RvbmVTZXRbXSkgPT4ge1xuICAgICAgdGhpcy5taWxlc3RvbmVTZXRzID0gbWlsZXNldG9uZVNldHM7XG4gICAgfSk7XG4gIH1cblxuICBnZXRNaWxlc3RvbmVzKCkge1xuICAgIHRoaXMucHJvY2Vzc1NlcnZpY2VcbiAgICAgIC5nZXRQcm9jZXNzRGVmaW5pdGlvbnMoKVxuICAgICAgLnN1YnNjcmliZSgocHJvY2Vzc0RlZmluaXRpb25zOiBQcm9jZXNzRGVmaW5pdGlvbltdKSA9PiB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25zID0gcHJvY2Vzc0RlZmluaXRpb25zO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRGbG93bm9kZXMocHJvY2Vzc0RlZmluaXRpb25JZDogc3RyaW5nKSB7XG4gICAgaWYgKHByb2Nlc3NEZWZpbml0aW9uSWQpIHtcbiAgICAgIHRoaXMubWlsZXN0b25lU2VydmljZS5nZXRGbG93bm9kZXMocHJvY2Vzc0RlZmluaXRpb25JZCkuc3Vic2NyaWJlKChmbG93Tm9kZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIHRoaXMudGFza0RlZmluaXRpb25zID0gZmxvd05vZGVzWydmbG93Tm9kZU1hcCddO1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMudGFza0RlZmluaXRpb25LZXkuc2V0VmFsdWUoJycpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlTWlsZXN0b25lKCkge1xuICAgIGNvbnN0IG1pbGVzdG9uZTogTWlsZXN0b25lID0gdGhpcy5mb3JtLnZhbHVlO1xuICAgIG1pbGVzdG9uZS5wcm9jZXNzRGVmaW5pdGlvbktleSA9IG1pbGVzdG9uZS5wcm9jZXNzRGVmaW5pdGlvbktleVsna2V5J107XG4gICAgbWlsZXN0b25lLmlkID0gbnVsbDtcbiAgICB0aGlzLm1pbGVzdG9uZVNlcnZpY2UuY3JlYXRlTWlsZXN0b25lKG1pbGVzdG9uZSkuc3Vic2NyaWJlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9taWxlc3RvbmVzJ10pO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKCdOZXcgTWlsZXN0b25lIGhhcyBiZWVuIGNyZWF0ZWQnKTtcbiAgICAgIH0sXG4gICAgICBlcnIgPT4ge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcignRXJyb3IgY3JlYXRpbmcgbmV3IG1pbGVzdG9uZScpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDIwIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cblxuPGRpdiBjbGFzcz1cIm1haW4tY29udGVudFwiPlxuICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBweC0wIG1iLTVcIj5cbiAgICAgIDx2YWx0aW1vLXdpZGdldD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJnLXdoaXRlIHAtNVwiPlxuICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJjcmVhdGVNaWxlc3RvbmUoKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC0xMiBjb2wtc20tMyBjb2wtZm9ybS1sYWJlbCB0ZXh0LXNtLXJpZ2h0XCIgZm9yPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgID5NaWxlc3RvbmUgc2V0PC9sYWJlbFxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTggY29sLWxnLTZcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBpZD1cIm1pbGVzdG9uZVNldFwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtaWxlc3RvbmVTZXRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnaXMtdmFsaWQnOlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9scy5taWxlc3RvbmVTZXQudG91Y2hlZCAmJiBmb3JtQ29udHJvbHMubWlsZXN0b25lU2V0LnZhbGlkLFxuICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLm1pbGVzdG9uZVNldC50b3VjaGVkICYmIGZvcm1Db250cm9scy5taWxlc3RvbmVTZXQuZXJyb3JzXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIHNlbGVjdGVkIGRpc2FibGVkPkNob29zZSBhIE1pbGVzdG9uZSBzZXQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG1pbGVzdG9uZVNldCBvZiBtaWxlc3RvbmVTZXRzXCIgW3ZhbHVlXT1cIm1pbGVzdG9uZVNldC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBtaWxlc3RvbmVTZXQudGl0bGUgfX0gKHt7IG1pbGVzdG9uZVNldC5pZCB9fSlcbiAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUNvbnRyb2xzLm1pbGVzdG9uZVNldC50b3VjaGVkICYmIGZvcm1Db250cm9scy5taWxlc3RvbmVTZXQuZXJyb3JzXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZvcm1Db250cm9scy5taWxlc3RvbmVTZXQuZXJyb3JzLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgIE1pbGVzdG9uZSBzZXQgaXMgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsIHRleHQtc20tcmlnaHRcIiBmb3I9XCJ0aXRsZVwiPlRpdGxlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tOCBjb2wtbGctNlwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk1pbGVzdG9uZSB0aXRsZVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdpcy12YWxpZCc6IGZvcm1Db250cm9scy50aXRsZS50b3VjaGVkICYmIGZvcm1Db250cm9scy50aXRsZS52YWxpZCxcbiAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBmb3JtQ29udHJvbHMudGl0bGUudG91Y2hlZCAmJiBmb3JtQ29udHJvbHMudGl0bGUuZXJyb3JzXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Db250cm9scy50aXRsZS50b3VjaGVkICYmIGZvcm1Db250cm9scy50aXRsZS5lcnJvcnNcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZm9ybUNvbnRyb2xzLnRpdGxlLmVycm9ycy5yZXF1aXJlZFwiPlRpdGxlIGlzIHJlcXVpcmVkPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTMgY29sLWZvcm0tbGFiZWwgdGV4dC1zbS1yaWdodFwiIGZvcj1cInByb2Nlc3NcIlxuICAgICAgICAgICAgICAgID5Qcm9jZXNzIGRlZmluaXRpb248L2xhYmVsXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tOCBjb2wtbGctNlwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGlkPVwicHJvY2Vzc1wiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9jZXNzRGVmaW5pdGlvbktleVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJnZXRGbG93bm9kZXMoJGV2ZW50LmlkKVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdpcy12YWxpZCc6XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnByb2Nlc3NEZWZpbml0aW9uS2V5LnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMucHJvY2Vzc0RlZmluaXRpb25LZXkudmFsaWQsXG4gICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzpcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMucHJvY2Vzc0RlZmluaXRpb25LZXkudG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9scy5wcm9jZXNzRGVmaW5pdGlvbktleS5lcnJvcnNcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgc2VsZWN0ZWQgZGlzYWJsZWQ+Q2hvb3NlIGEgcHJvY2Vzczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcHJvY2Vzc0RlZmluaXRpb24gb2YgcHJvY2Vzc0RlZmluaXRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwicHJvY2Vzc0RlZmluaXRpb25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBwcm9jZXNzRGVmaW5pdGlvbi5uYW1lIH19ICh7eyBwcm9jZXNzRGVmaW5pdGlvbi5rZXkgfX0pXG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMucHJvY2Vzc0RlZmluaXRpb25LZXkudG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMucHJvY2Vzc0RlZmluaXRpb25LZXkuZXJyb3JzXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZm9ybUNvbnRyb2xzLnByb2Nlc3NEZWZpbml0aW9uS2V5LmVycm9ycy5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICBQcm9jZXNzIGlzIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC0xMiBjb2wtc20tMyBjb2wtZm9ybS1sYWJlbCB0ZXh0LXNtLXJpZ2h0XCIgZm9yPVwicHJvY2Vzc1wiPlRhc2s8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS04IGNvbC1sZy02XCI+XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJ0YXNrXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRhc2tEZWZpbml0aW9uS2V5XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2lzLXZhbGlkJzpcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMudGFza0RlZmluaXRpb25LZXkudG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9scy50YXNrRGVmaW5pdGlvbktleS52YWxpZCxcbiAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9scy50YXNrRGVmaW5pdGlvbktleS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnRhc2tEZWZpbml0aW9uS2V5LmVycm9yc1xuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBzZWxlY3RlZCBkaXNhYmxlZD5DaG9vc2UgYSB0YXNrPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB0YXNrRGVmaW5pdGlvbiBvZiB0YXNrRGVmaW5pdGlvbnMgfCBrZXl2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0YXNrRGVmaW5pdGlvbi5rZXlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyB0YXNrRGVmaW5pdGlvbi52YWx1ZSB9fSAoe3sgdGFza0RlZmluaXRpb24ua2V5IH19KVxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnRhc2tEZWZpbml0aW9uS2V5LnRvdWNoZWQgJiYgZm9ybUNvbnRyb2xzLnRhc2tEZWZpbml0aW9uS2V5LmVycm9yc1xuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZvcm1Db250cm9scy50YXNrRGVmaW5pdGlvbktleS5lcnJvcnMucmVxdWlyZWRcIj5UYXNrIGlzIHJlcXVpcmVkPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTMgY29sLWZvcm0tbGFiZWwgdGV4dC1zbS1yaWdodFwiIGZvcj1cImludGVydmFsXCJcbiAgICAgICAgICAgICAgICA+SW50ZXJ2YWwgKGluIGRheXMpPC9sYWJlbFxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTggY29sLWxnLTZcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGlkPVwiaW50ZXJ2YWxcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGxhbm5lZEludGVydmFsSW5EYXlzXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSW50ZXJ2YWwgKGluIGRheXMpXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2lzLXZhbGlkJzpcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMucGxhbm5lZEludGVydmFsSW5EYXlzLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMucGxhbm5lZEludGVydmFsSW5EYXlzLnZhbGlkLFxuICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnBsYW5uZWRJbnRlcnZhbEluRGF5cy50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnBsYW5uZWRJbnRlcnZhbEluRGF5cy5lcnJvcnNcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9scy5wbGFubmVkSW50ZXJ2YWxJbkRheXMudG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMucGxhbm5lZEludGVydmFsSW5EYXlzLmVycm9yc1xuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZvcm1Db250cm9scy5wbGFubmVkSW50ZXJ2YWxJbkRheXMuZXJyb3JzLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgIEludGVydmFsIGlzIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtQ29udHJvbHMucGxhbm5lZEludGVydmFsSW5EYXlzLmVycm9ycy5wYXR0ZXJuXCI+XG4gICAgICAgICAgICAgICAgICAgIEludGVydmFsIGlzIG5vdCBhIHZhbGlkIG51bWJlclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTMgY29sLWZvcm0tbGFiZWwgdGV4dC1zbS1yaWdodFwiIGZvcj1cImNvbG9yXCI+Q29sb3I8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS04IGNvbC1sZy02XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBbY29sb3JQaWNrZXJdPVwiZm9ybS52YWx1ZS5jb2xvclwiXG4gICAgICAgICAgICAgICAgICAoY29sb3JQaWNrZXJDaGFuZ2UpPVwiZm9ybS5jb250cm9scy5jb2xvci5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImZvcm0udmFsdWUuY29sb3JcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNvbG9yXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2lzLXZhbGlkJzogZm9ybUNvbnRyb2xzLmNvbG9yLnRvdWNoZWQgJiYgZm9ybUNvbnRyb2xzLmNvbG9yLnZhbGlkLFxuICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6IGZvcm1Db250cm9scy5jb2xvci50b3VjaGVkICYmIGZvcm1Db250cm9scy5jb2xvci5lcnJvcnNcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUNvbnRyb2xzLmNvbG9yLnRvdWNoZWQgJiYgZm9ybUNvbnRyb2xzLmNvbG9yLmVycm9yc1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtQ29udHJvbHMuY29sb3IuZXJyb3JzLnJlcXVpcmVkXCI+SW50ZXJ2YWwgaXMgcmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtQ29udHJvbHMuY29sb3IuZXJyb3JzLnBhdHRlcm5cIj5Db2xvciBpcyBub3QgYSB2YWxpZCBoZXggY29kZTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHB0LTMgbXQtMVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS02IHRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIicvbWlsZXN0b25lcydcIiBjbGFzcz1cImJ0biBidG4tc3BhY2UgYnRuLWRlZmF1bHRcIj5CYWNrPC9hPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tNiB0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc3BhY2UgYnRuLXNlY29uZGFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVzZXQoKVwiPlxuICAgICAgICAgICAgICAgICAgUmVzZXRcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zcGFjZSBidG4tcHJpbWFyeVwiIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCI+XG4gICAgICAgICAgICAgICAgICBTdWJtaXRcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC92YWx0aW1vLXdpZGdldD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2015-2020 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 } from '@angular/core';
|
|
17
|
+
import { FormControl, Validators } from '@angular/forms';
|
|
18
|
+
import { switchMap } from 'rxjs/operators';
|
|
19
|
+
import * as i0 from "@angular/core";
|
|
20
|
+
import * as i1 from "../milestone.service";
|
|
21
|
+
import * as i2 from "@angular/forms";
|
|
22
|
+
import * as i3 from "@angular/router";
|
|
23
|
+
import * as i4 from "@valtimo/components";
|
|
24
|
+
import * as i5 from "@valtimo/process";
|
|
25
|
+
import * as i6 from "@angular/common";
|
|
26
|
+
import * as i7 from "ngx-color-picker";
|
|
27
|
+
export class MilestoneEditComponent {
|
|
28
|
+
constructor(milestoneService, formBuilder, router, alertService, processService, route) {
|
|
29
|
+
this.milestoneService = milestoneService;
|
|
30
|
+
this.formBuilder = formBuilder;
|
|
31
|
+
this.router = router;
|
|
32
|
+
this.alertService = alertService;
|
|
33
|
+
this.processService = processService;
|
|
34
|
+
this.route = route;
|
|
35
|
+
this.milestoneSets = [];
|
|
36
|
+
this.processDefinitions = [];
|
|
37
|
+
this.taskDefinitions = [];
|
|
38
|
+
}
|
|
39
|
+
get formControls() {
|
|
40
|
+
return this.form.controls;
|
|
41
|
+
}
|
|
42
|
+
ngOnInit() {
|
|
43
|
+
this.form = this.formBuilder.group({
|
|
44
|
+
id: new FormControl({ value: '', disabled: true }, Validators.required),
|
|
45
|
+
milestoneSet: new FormControl('', Validators.required),
|
|
46
|
+
title: new FormControl('', Validators.required),
|
|
47
|
+
processDefinitionKey: new FormControl('', Validators.required),
|
|
48
|
+
taskDefinitionKey: new FormControl('', Validators.required),
|
|
49
|
+
plannedIntervalInDays: new FormControl('', [
|
|
50
|
+
Validators.required,
|
|
51
|
+
Validators.pattern('^[0-9]*$'),
|
|
52
|
+
]),
|
|
53
|
+
color: new FormControl('', [
|
|
54
|
+
Validators.required,
|
|
55
|
+
Validators.pattern('^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$'),
|
|
56
|
+
]),
|
|
57
|
+
});
|
|
58
|
+
this.getMilestone();
|
|
59
|
+
this.getMilestoneSets();
|
|
60
|
+
this.getProcessDefinitions();
|
|
61
|
+
}
|
|
62
|
+
reset() {
|
|
63
|
+
this.form.patchValue({
|
|
64
|
+
milestoneSet: '',
|
|
65
|
+
title: '',
|
|
66
|
+
processDefinitionKey: '',
|
|
67
|
+
taskDefinitionKey: '',
|
|
68
|
+
plannedIntervalInDays: '',
|
|
69
|
+
color: '',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
getMilestone() {
|
|
73
|
+
const milestoneId = this.route.snapshot.paramMap.get('id');
|
|
74
|
+
this.milestoneService
|
|
75
|
+
.getMilestone(+milestoneId)
|
|
76
|
+
.pipe(switchMap((milestone) => {
|
|
77
|
+
this.form.patchValue({
|
|
78
|
+
id: milestone.id,
|
|
79
|
+
milestoneSet: milestone.milestoneSet.id,
|
|
80
|
+
title: milestone.title,
|
|
81
|
+
plannedIntervalInDays: milestone.plannedIntervalInDays,
|
|
82
|
+
color: milestone.color,
|
|
83
|
+
taskDefinitionKey: milestone.taskDefinitionKey,
|
|
84
|
+
});
|
|
85
|
+
return this.processService.getProcessDefinition(milestone.processDefinitionKey);
|
|
86
|
+
}))
|
|
87
|
+
.subscribe((processDefinition) => {
|
|
88
|
+
this.form.patchValue({
|
|
89
|
+
processDefinitionKey: processDefinition,
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
compareProcessDefinitions(processDefinition1, processDefinition2) {
|
|
94
|
+
return processDefinition1.id === processDefinition2.id;
|
|
95
|
+
}
|
|
96
|
+
getMilestoneSets() {
|
|
97
|
+
this.milestoneService.getMilestoneSets().subscribe((milesetoneSets) => {
|
|
98
|
+
this.milestoneSets = milesetoneSets;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
getProcessDefinitions() {
|
|
102
|
+
this.processService
|
|
103
|
+
.getProcessDefinitions()
|
|
104
|
+
.subscribe((processDefinitions) => {
|
|
105
|
+
this.processDefinitions = processDefinitions;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
getFlownodes(processDefinitionId) {
|
|
109
|
+
if (processDefinitionId) {
|
|
110
|
+
this.milestoneService.getFlownodes(processDefinitionId).subscribe((flowNodes) => {
|
|
111
|
+
this.taskDefinitions = flowNodes['flowNodeMap'];
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
delete() {
|
|
116
|
+
// Todo: add confirmation dialog after it's fixed
|
|
117
|
+
this.deleteMilestone();
|
|
118
|
+
}
|
|
119
|
+
deleteMilestone() {
|
|
120
|
+
this.milestoneService.deleteMilestone(this.form.getRawValue().id).subscribe(() => {
|
|
121
|
+
this.router.navigate(['/milestones']);
|
|
122
|
+
this.alertService.success('Milestone has been deleted');
|
|
123
|
+
}, err => {
|
|
124
|
+
this.router.navigate(['/milestones']);
|
|
125
|
+
this.alertService.error('Could not delete Milestone');
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
updateMilestone() {
|
|
129
|
+
const milestone = this.form.getRawValue();
|
|
130
|
+
milestone.processDefinitionKey = milestone.processDefinitionKey['key'];
|
|
131
|
+
this.milestoneService.updateMilestone(milestone).subscribe(() => {
|
|
132
|
+
this.router.navigate(['/milestones']);
|
|
133
|
+
this.alertService.success('Milestone has been updated');
|
|
134
|
+
}, err => {
|
|
135
|
+
this.alertService.error('Error updating milestone');
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
MilestoneEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: MilestoneEditComponent, deps: [{ token: i1.MilestoneService }, { token: i2.FormBuilder }, { token: i3.Router }, { token: i4.AlertService }, { token: i5.ProcessService }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
|
|
140
|
+
MilestoneEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: MilestoneEditComponent, selector: "valtimo-milestone-edit", ngImport: i0, template: "<!--\n ~ Copyright 2015-2020 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"main-content\">\n <div class=\"container-fluid\">\n <div class=\"col-12 px-0 mb-5\">\n <valtimo-widget>\n <div class=\"card-body bg-light\">\n <div class=\"row py-5\">\n <div class=\"col-12\">\n <div class=\"row\">\n <div class=\"col-12 col-sm-3 text-sm-right\"><strong>ID</strong></div>\n <div class=\"col-12 col-sm-8 col-lg-6\">{{ form.getRawValue().id }}</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"bg-white p-5\">\n <form [formGroup]=\"form\" (ngSubmit)=\"updateMilestone()\">\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"title\"\n >Milestone set</label\n >\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <select\n type=\"text\"\n id=\"milestoneSet\"\n formControlName=\"milestoneSet\"\n class=\"form-control\"\n [ngClass]=\"{\n 'is-valid':\n formControls.milestoneSet.touched && formControls.milestoneSet.valid,\n 'is-invalid':\n formControls.milestoneSet.touched && formControls.milestoneSet.errors\n }\"\n required\n >\n <option value=\"\" selected disabled>Choose a Milestone set</option>\n <option *ngFor=\"let milestoneSet of milestoneSets\" [value]=\"milestoneSet.id\">\n {{ milestoneSet.title }} ({{ milestoneSet.id }})\n </option>\n </select>\n <div\n *ngIf=\"formControls.milestoneSet.touched && formControls.milestoneSet.errors\"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.milestoneSet.errors.required\">\n Milestone set is required\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"title\">Title</label>\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <input\n type=\"text\"\n id=\"title\"\n formControlName=\"title\"\n class=\"form-control\"\n placeholder=\"Milestone title\"\n [ngClass]=\"{\n 'is-valid': formControls.title.touched && formControls.title.valid,\n 'is-invalid': formControls.title.touched && formControls.title.errors\n }\"\n required\n />\n <div\n *ngIf=\"formControls.title.touched && formControls.title.errors\"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.title.errors.required\">Title is required</div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"process\"\n >Process definition</label\n >\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <select\n type=\"text\"\n id=\"process\"\n formControlName=\"processDefinitionKey\"\n class=\"form-control\"\n (ngModelChange)=\"getFlownodes($event.id)\"\n [ngClass]=\"{\n 'is-valid':\n formControls.processDefinitionKey.touched &&\n formControls.processDefinitionKey.valid,\n 'is-invalid':\n formControls.processDefinitionKey.touched &&\n formControls.processDefinitionKey.errors\n }\"\n required\n [compareWith]=\"compareProcessDefinitions\"\n >\n <option value=\"\" disabled>Choose a process</option>\n <option\n *ngFor=\"let processDefinition of processDefinitions\"\n [ngValue]=\"processDefinition\"\n >\n {{ processDefinition.name }} ({{ processDefinition.key }})\n </option>\n </select>\n <div\n *ngIf=\"\n formControls.processDefinitionKey.touched &&\n formControls.processDefinitionKey.errors\n \"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.processDefinitionKey.errors.required\">\n Process is required\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"process\">Task</label>\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <select\n type=\"text\"\n id=\"task\"\n formControlName=\"taskDefinitionKey\"\n class=\"form-control\"\n [ngClass]=\"{\n 'is-valid':\n formControls.taskDefinitionKey.touched &&\n formControls.taskDefinitionKey.valid,\n 'is-invalid':\n formControls.taskDefinitionKey.touched &&\n formControls.taskDefinitionKey.errors\n }\"\n required\n >\n <option value=\"\" disabled>Choose a task</option>\n <option\n *ngFor=\"let taskDefinition of taskDefinitions | keyvalue\"\n [value]=\"taskDefinition.key\"\n >\n {{ taskDefinition.value }} ({{ taskDefinition.key }})\n </option>\n </select>\n <div\n *ngIf=\"\n formControls.taskDefinitionKey.touched && formControls.taskDefinitionKey.errors\n \"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.taskDefinitionKey.errors.required\">Task is required</div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"interval\"\n >Interval (in days)</label\n >\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <input\n type=\"text\"\n id=\"interval\"\n formControlName=\"plannedIntervalInDays\"\n class=\"form-control\"\n placeholder=\"Interval (in days)\"\n [ngClass]=\"{\n 'is-valid':\n formControls.plannedIntervalInDays.touched &&\n formControls.plannedIntervalInDays.valid,\n 'is-invalid':\n formControls.plannedIntervalInDays.touched &&\n formControls.plannedIntervalInDays.errors\n }\"\n required\n />\n <div\n *ngIf=\"\n formControls.plannedIntervalInDays.touched &&\n formControls.plannedIntervalInDays.errors\n \"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.plannedIntervalInDays.errors.required\">\n Interval is required\n </div>\n <div *ngIf=\"formControls.plannedIntervalInDays.errors.pattern\">\n Interval is not a valid number\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"color\">Color</label>\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <input\n [colorPicker]=\"form.value.color\"\n (colorPickerChange)=\"form.controls.color.setValue($event)\"\n [style.background]=\"form.value.color\"\n type=\"text\"\n id=\"color\"\n formControlName=\"color\"\n class=\"form-control\"\n placeholder=\"Color\"\n [ngClass]=\"{\n 'is-valid': formControls.color.touched && formControls.color.valid,\n 'is-invalid': formControls.color.touched && formControls.color.errors\n }\"\n required\n />\n <div\n *ngIf=\"formControls.color.touched && formControls.color.errors\"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.color.errors.required\">Color is required</div>\n <div *ngIf=\"formControls.color.errors.pattern\">Color is not a valid hex code</div>\n </div>\n </div>\n </div>\n\n <div class=\"row pt-3 mt-1\">\n <div class=\"col-12 col-sm-6 text-left\">\n <a [routerLink]=\"'/milestones'\" class=\"btn btn-space btn-default\">Back</a>\n <button type=\"button\" class=\"btn btn-space btn-danger\" (click)=\"delete()\">\n Delete\n </button>\n </div>\n <div class=\"col-12 col-sm-6 text-right\">\n <button class=\"btn btn-space btn-secondary\" type=\"button\" (click)=\"reset()\">\n Reset\n </button>\n <button class=\"btn btn-space btn-primary\" type=\"submit\" [disabled]=\"form.invalid\">\n Submit\n </button>\n </div>\n </div>\n </form>\n </div>\n </valtimo-widget>\n </div>\n </div>\n</div>\n", styles: ["/*!\n * Copyright 2015-2020 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"], components: [{ type: i4.WidgetComponent, selector: "valtimo-widget", inputs: ["type", "name", "icon", "contrast", "divider", "title", "subtitle", "collapseAble", "collapse", "additionalClasses"] }], directives: [{ type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i7.ColorPickerDirective, selector: "[colorPicker]", inputs: ["cpWidth", "cpHeight", "cpToggle", "cpDisabled", "cpIgnoredElements", "cpFallbackColor", "cpColorMode", "cpCmykEnabled", "cpOutputFormat", "cpAlphaChannel", "cpDisableInput", "cpDialogDisplay", "cpSaveClickOutside", "cpCloseClickOutside", "cpUseRootViewContainer", "cpPosition", "cpPositionOffset", "cpPositionRelativeToArrow", "cpOKButton", "cpOKButtonText", "cpOKButtonClass", "cpCancelButton", "cpCancelButtonText", "cpCancelButtonClass", "cpPresetLabel", "cpPresetColorsClass", "cpMaxPresetColorsLength", "cpPresetEmptyMessage", "cpPresetEmptyMessageClass", "cpAddColorButton", "cpAddColorButtonText", "cpAddColorButtonClass", "cpRemoveColorButtonClass", "colorPicker", "cpPresetColors"], outputs: ["cpInputChange", "cpToggleChange", "cpSliderChange", "cpSliderDragEnd", "cpSliderDragStart", "colorPickerOpen", "colorPickerClose", "colorPickerCancel", "colorPickerSelect", "colorPickerChange", "cpCmykColorChange", "cpPresetColorsChange"], exportAs: ["ngxColorPicker"] }, { type: i3.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }], pipes: { "keyvalue": i6.KeyValuePipe } });
|
|
141
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: MilestoneEditComponent, decorators: [{
|
|
142
|
+
type: Component,
|
|
143
|
+
args: [{ selector: 'valtimo-milestone-edit', template: "<!--\n ~ Copyright 2015-2020 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"main-content\">\n <div class=\"container-fluid\">\n <div class=\"col-12 px-0 mb-5\">\n <valtimo-widget>\n <div class=\"card-body bg-light\">\n <div class=\"row py-5\">\n <div class=\"col-12\">\n <div class=\"row\">\n <div class=\"col-12 col-sm-3 text-sm-right\"><strong>ID</strong></div>\n <div class=\"col-12 col-sm-8 col-lg-6\">{{ form.getRawValue().id }}</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"bg-white p-5\">\n <form [formGroup]=\"form\" (ngSubmit)=\"updateMilestone()\">\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"title\"\n >Milestone set</label\n >\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <select\n type=\"text\"\n id=\"milestoneSet\"\n formControlName=\"milestoneSet\"\n class=\"form-control\"\n [ngClass]=\"{\n 'is-valid':\n formControls.milestoneSet.touched && formControls.milestoneSet.valid,\n 'is-invalid':\n formControls.milestoneSet.touched && formControls.milestoneSet.errors\n }\"\n required\n >\n <option value=\"\" selected disabled>Choose a Milestone set</option>\n <option *ngFor=\"let milestoneSet of milestoneSets\" [value]=\"milestoneSet.id\">\n {{ milestoneSet.title }} ({{ milestoneSet.id }})\n </option>\n </select>\n <div\n *ngIf=\"formControls.milestoneSet.touched && formControls.milestoneSet.errors\"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.milestoneSet.errors.required\">\n Milestone set is required\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"title\">Title</label>\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <input\n type=\"text\"\n id=\"title\"\n formControlName=\"title\"\n class=\"form-control\"\n placeholder=\"Milestone title\"\n [ngClass]=\"{\n 'is-valid': formControls.title.touched && formControls.title.valid,\n 'is-invalid': formControls.title.touched && formControls.title.errors\n }\"\n required\n />\n <div\n *ngIf=\"formControls.title.touched && formControls.title.errors\"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.title.errors.required\">Title is required</div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"process\"\n >Process definition</label\n >\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <select\n type=\"text\"\n id=\"process\"\n formControlName=\"processDefinitionKey\"\n class=\"form-control\"\n (ngModelChange)=\"getFlownodes($event.id)\"\n [ngClass]=\"{\n 'is-valid':\n formControls.processDefinitionKey.touched &&\n formControls.processDefinitionKey.valid,\n 'is-invalid':\n formControls.processDefinitionKey.touched &&\n formControls.processDefinitionKey.errors\n }\"\n required\n [compareWith]=\"compareProcessDefinitions\"\n >\n <option value=\"\" disabled>Choose a process</option>\n <option\n *ngFor=\"let processDefinition of processDefinitions\"\n [ngValue]=\"processDefinition\"\n >\n {{ processDefinition.name }} ({{ processDefinition.key }})\n </option>\n </select>\n <div\n *ngIf=\"\n formControls.processDefinitionKey.touched &&\n formControls.processDefinitionKey.errors\n \"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.processDefinitionKey.errors.required\">\n Process is required\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"process\">Task</label>\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <select\n type=\"text\"\n id=\"task\"\n formControlName=\"taskDefinitionKey\"\n class=\"form-control\"\n [ngClass]=\"{\n 'is-valid':\n formControls.taskDefinitionKey.touched &&\n formControls.taskDefinitionKey.valid,\n 'is-invalid':\n formControls.taskDefinitionKey.touched &&\n formControls.taskDefinitionKey.errors\n }\"\n required\n >\n <option value=\"\" disabled>Choose a task</option>\n <option\n *ngFor=\"let taskDefinition of taskDefinitions | keyvalue\"\n [value]=\"taskDefinition.key\"\n >\n {{ taskDefinition.value }} ({{ taskDefinition.key }})\n </option>\n </select>\n <div\n *ngIf=\"\n formControls.taskDefinitionKey.touched && formControls.taskDefinitionKey.errors\n \"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.taskDefinitionKey.errors.required\">Task is required</div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"interval\"\n >Interval (in days)</label\n >\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <input\n type=\"text\"\n id=\"interval\"\n formControlName=\"plannedIntervalInDays\"\n class=\"form-control\"\n placeholder=\"Interval (in days)\"\n [ngClass]=\"{\n 'is-valid':\n formControls.plannedIntervalInDays.touched &&\n formControls.plannedIntervalInDays.valid,\n 'is-invalid':\n formControls.plannedIntervalInDays.touched &&\n formControls.plannedIntervalInDays.errors\n }\"\n required\n />\n <div\n *ngIf=\"\n formControls.plannedIntervalInDays.touched &&\n formControls.plannedIntervalInDays.errors\n \"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.plannedIntervalInDays.errors.required\">\n Interval is required\n </div>\n <div *ngIf=\"formControls.plannedIntervalInDays.errors.pattern\">\n Interval is not a valid number\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-12 col-sm-3 col-form-label text-sm-right\" for=\"color\">Color</label>\n <div class=\"col-12 col-sm-8 col-lg-6\">\n <input\n [colorPicker]=\"form.value.color\"\n (colorPickerChange)=\"form.controls.color.setValue($event)\"\n [style.background]=\"form.value.color\"\n type=\"text\"\n id=\"color\"\n formControlName=\"color\"\n class=\"form-control\"\n placeholder=\"Color\"\n [ngClass]=\"{\n 'is-valid': formControls.color.touched && formControls.color.valid,\n 'is-invalid': formControls.color.touched && formControls.color.errors\n }\"\n required\n />\n <div\n *ngIf=\"formControls.color.touched && formControls.color.errors\"\n class=\"invalid-feedback\"\n >\n <div *ngIf=\"formControls.color.errors.required\">Color is required</div>\n <div *ngIf=\"formControls.color.errors.pattern\">Color is not a valid hex code</div>\n </div>\n </div>\n </div>\n\n <div class=\"row pt-3 mt-1\">\n <div class=\"col-12 col-sm-6 text-left\">\n <a [routerLink]=\"'/milestones'\" class=\"btn btn-space btn-default\">Back</a>\n <button type=\"button\" class=\"btn btn-space btn-danger\" (click)=\"delete()\">\n Delete\n </button>\n </div>\n <div class=\"col-12 col-sm-6 text-right\">\n <button class=\"btn btn-space btn-secondary\" type=\"button\" (click)=\"reset()\">\n Reset\n </button>\n <button class=\"btn btn-space btn-primary\" type=\"submit\" [disabled]=\"form.invalid\">\n Submit\n </button>\n </div>\n </div>\n </form>\n </div>\n </valtimo-widget>\n </div>\n </div>\n</div>\n", styles: ["/*!\n * Copyright 2015-2020 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"] }]
|
|
144
|
+
}], ctorParameters: function () { return [{ type: i1.MilestoneService }, { type: i2.FormBuilder }, { type: i3.Router }, { type: i4.AlertService }, { type: i5.ProcessService }, { type: i3.ActivatedRoute }]; } });
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlsZXN0b25lLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby9taWxlc3RvbmUvc3JjL2xpYi9taWxlc3RvbmUtZWRpdC9taWxlc3RvbmUtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL21pbGVzdG9uZS9zcmMvbGliL21pbGVzdG9uZS1lZGl0L21pbGVzdG9uZS1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQWMsV0FBVyxFQUFhLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBTS9FLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBT3pDLE1BQU0sT0FBTyxzQkFBc0I7SUFNakMsWUFDVSxnQkFBa0MsRUFDbEMsV0FBd0IsRUFDeEIsTUFBYyxFQUNkLFlBQTBCLEVBQzFCLGNBQThCLEVBQzlCLEtBQXFCO1FBTHJCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQVZ4QixrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFDbkMsdUJBQWtCLEdBQXdCLEVBQUUsQ0FBQztRQUM3QyxvQkFBZSxHQUFVLEVBQUUsQ0FBQztJQVNoQyxDQUFDO0lBRUosSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM1QixDQUFDO0lBRUQsUUFB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LENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxTQUFTLEdBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyRCxTQUFTLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUN4RCxHQUFHLEVBQUU7WUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUMxRCxDQUFDLEVBQ0QsR0FBRyxDQUFDLEVBQUU7WUFDSixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQzs7bUhBdElVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDhEQzlCbkMsbTVWQW1RQTsyRkRyT2Esc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIwIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7Q29tcG9uZW50LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtNaWxlc3RvbmUsIE1pbGVzdG9uZVNldH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7TWlsZXN0b25lU2VydmljZX0gZnJvbSAnLi4vbWlsZXN0b25lLnNlcnZpY2UnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtBbGVydFNlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtQcm9jZXNzU2VydmljZSwgUHJvY2Vzc0RlZmluaXRpb259IGZyb20gJ0B2YWx0aW1vL3Byb2Nlc3MnO1xuaW1wb3J0IHtzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsdGltby1taWxlc3RvbmUtZWRpdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9taWxlc3RvbmUtZWRpdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21pbGVzdG9uZS1lZGl0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE1pbGVzdG9uZUVkaXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xuICBwdWJsaWMgbWlsZXN0b25lU2V0czogTWlsZXN0b25lU2V0W10gPSBbXTtcbiAgcHVibGljIHByb2Nlc3NEZWZpbml0aW9uczogUHJvY2Vzc0RlZmluaXRpb25bXSA9IFtdO1xuICBwdWJsaWMgdGFza0RlZmluaXRpb25zOiBhbnlbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbWlsZXN0b25lU2VydmljZTogTWlsZXN0b25lU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcm9jZXNzU2VydmljZTogUHJvY2Vzc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGVcbiAgKSB7fVxuXG4gIGdldCBmb3JtQ29udHJvbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5jb250cm9scztcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgaWQ6IG5ldyBGb3JtQ29udHJvbCh7dmFsdWU6ICcnLCBkaXNhYmxlZDogdHJ1ZX0sIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgbWlsZXN0b25lU2V0OiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgdGl0bGU6IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBwcm9jZXNzRGVmaW5pdGlvbktleTogbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIHRhc2tEZWZpbml0aW9uS2V5OiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgcGxhbm5lZEludGVydmFsSW5EYXlzOiBuZXcgRm9ybUNvbnRyb2woJycsIFtcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgVmFsaWRhdG9ycy5wYXR0ZXJuKCdeWzAtOV0qJCcpLFxuICAgICAgXSksXG4gICAgICBjb2xvcjogbmV3IEZvcm1Db250cm9sKCcnLCBbXG4gICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgIFZhbGlkYXRvcnMucGF0dGVybignXiMoW0EtRmEtZjAtOV17Nn18W0EtRmEtZjAtOV17M30pJCcpLFxuICAgICAgXSksXG4gICAgfSk7XG4gICAgdGhpcy5nZXRNaWxlc3RvbmUoKTtcbiAgICB0aGlzLmdldE1pbGVzdG9uZVNldHMoKTtcbiAgICB0aGlzLmdldFByb2Nlc3NEZWZpbml0aW9ucygpO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgbWlsZXN0b25lU2V0OiAnJyxcbiAgICAgIHRpdGxlOiAnJyxcbiAgICAgIHByb2Nlc3NEZWZpbml0aW9uS2V5OiAnJyxcbiAgICAgIHRhc2tEZWZpbml0aW9uS2V5OiAnJyxcbiAgICAgIHBsYW5uZWRJbnRlcnZhbEluRGF5czogJycsXG4gICAgICBjb2xvcjogJycsXG4gICAgfSk7XG4gIH1cblxuICBnZXRNaWxlc3RvbmUoKSB7XG4gICAgY29uc3QgbWlsZXN0b25lSWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnaWQnKTtcbiAgICB0aGlzLm1pbGVzdG9uZVNlcnZpY2VcbiAgICAgIC5nZXRNaWxlc3RvbmUoK21pbGVzdG9uZUlkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgobWlsZXN0b25lOiBNaWxlc3RvbmUpID0+IHtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICBpZDogbWlsZXN0b25lLmlkLFxuICAgICAgICAgICAgbWlsZXN0b25lU2V0OiBtaWxlc3RvbmUubWlsZXN0b25lU2V0LmlkLFxuICAgICAgICAgICAgdGl0bGU6IG1pbGVzdG9uZS50aXRsZSxcbiAgICAgICAgICAgIHBsYW5uZWRJbnRlcnZhbEluRGF5czogbWlsZXN0b25lLnBsYW5uZWRJbnRlcnZhbEluRGF5cyxcbiAgICAgICAgICAgIGNvbG9yOiBtaWxlc3RvbmUuY29sb3IsXG4gICAgICAgICAgICB0YXNrRGVmaW5pdGlvbktleTogbWlsZXN0b25lLnRhc2tEZWZpbml0aW9uS2V5LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTZXJ2aWNlLmdldFByb2Nlc3NEZWZpbml0aW9uKG1pbGVzdG9uZS5wcm9jZXNzRGVmaW5pdGlvbktleSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChwcm9jZXNzRGVmaW5pdGlvbjogUHJvY2Vzc0RlZmluaXRpb24pID0+IHtcbiAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uS2V5OiBwcm9jZXNzRGVmaW5pdGlvbixcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNvbXBhcmVQcm9jZXNzRGVmaW5pdGlvbnMoXG4gICAgcHJvY2Vzc0RlZmluaXRpb24xOiBQcm9jZXNzRGVmaW5pdGlvbixcbiAgICBwcm9jZXNzRGVmaW5pdGlvbjI6IFByb2Nlc3NEZWZpbml0aW9uXG4gICkge1xuICAgIHJldHVybiBwcm9jZXNzRGVmaW5pdGlvbjEuaWQgPT09IHByb2Nlc3NEZWZpbml0aW9uMi5pZDtcbiAgfVxuXG4gIGdldE1pbGVzdG9uZVNldHMoKSB7XG4gICAgdGhpcy5taWxlc3RvbmVTZXJ2aWNlLmdldE1pbGVzdG9uZVNldHMoKS5zdWJzY3JpYmUoKG1pbGVzZXRvbmVTZXRzOiBNaWxlc3RvbmVTZXRbXSkgPT4ge1xuICAgICAgdGhpcy5taWxlc3RvbmVTZXRzID0gbWlsZXNldG9uZVNldHM7XG4gICAgfSk7XG4gIH1cblxuICBnZXRQcm9jZXNzRGVmaW5pdGlvbnMoKSB7XG4gICAgdGhpcy5wcm9jZXNzU2VydmljZVxuICAgICAgLmdldFByb2Nlc3NEZWZpbml0aW9ucygpXG4gICAgICAuc3Vic2NyaWJlKChwcm9jZXNzRGVmaW5pdGlvbnM6IFByb2Nlc3NEZWZpbml0aW9uW10pID0+IHtcbiAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbnMgPSBwcm9jZXNzRGVmaW5pdGlvbnM7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldEZsb3dub2Rlcyhwcm9jZXNzRGVmaW5pdGlvbklkOiBzdHJpbmcpIHtcbiAgICBpZiAocHJvY2Vzc0RlZmluaXRpb25JZCkge1xuICAgICAgdGhpcy5taWxlc3RvbmVTZXJ2aWNlLmdldEZsb3dub2Rlcyhwcm9jZXNzRGVmaW5pdGlvbklkKS5zdWJzY3JpYmUoKGZsb3dOb2RlczogYW55W10pID0+IHtcbiAgICAgICAgdGhpcy50YXNrRGVmaW5pdGlvbnMgPSBmbG93Tm9kZXNbJ2Zsb3dOb2RlTWFwJ107XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBkZWxldGUoKSB7XG4gICAgLy8gVG9kbzogYWRkIGNvbmZpcm1hdGlvbiBkaWFsb2cgYWZ0ZXIgaXQncyBmaXhlZFxuICAgIHRoaXMuZGVsZXRlTWlsZXN0b25lKCk7XG4gIH1cblxuICBkZWxldGVNaWxlc3RvbmUoKSB7XG4gICAgdGhpcy5taWxlc3RvbmVTZXJ2aWNlLmRlbGV0ZU1pbGVzdG9uZSh0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKS5pZCkuc3Vic2NyaWJlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9taWxlc3RvbmVzJ10pO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKCdNaWxlc3RvbmUgaGFzIGJlZW4gZGVsZXRlZCcpO1xuICAgICAgfSxcbiAgICAgIGVyciA9PiB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21pbGVzdG9uZXMnXSk7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKCdDb3VsZCBub3QgZGVsZXRlIE1pbGVzdG9uZScpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB1cGRhdGVNaWxlc3RvbmUoKSB7XG4gICAgY29uc3QgbWlsZXN0b25lOiBNaWxlc3RvbmUgPSB0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICBtaWxlc3RvbmUucHJvY2Vzc0RlZmluaXRpb25LZXkgPSBtaWxlc3RvbmUucHJvY2Vzc0RlZmluaXRpb25LZXlbJ2tleSddO1xuICAgIHRoaXMubWlsZXN0b25lU2VydmljZS51cGRhdGVNaWxlc3RvbmUobWlsZXN0b25lKS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21pbGVzdG9uZXMnXSk7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoJ01pbGVzdG9uZSBoYXMgYmVlbiB1cGRhdGVkJyk7XG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoJ0Vycm9yIHVwZGF0aW5nIG1pbGVzdG9uZScpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDIwIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cblxuPGRpdiBjbGFzcz1cIm1haW4tY29udGVudFwiPlxuICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBweC0wIG1iLTVcIj5cbiAgICAgIDx2YWx0aW1vLXdpZGdldD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBiZy1saWdodFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHktNVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tMyB0ZXh0LXNtLXJpZ2h0XCI+PHN0cm9uZz5JRDwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTggY29sLWxnLTZcIj57eyBmb3JtLmdldFJhd1ZhbHVlKCkuaWQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiZy13aGl0ZSBwLTVcIj5cbiAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwidXBkYXRlTWlsZXN0b25lKClcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTMgY29sLWZvcm0tbGFiZWwgdGV4dC1zbS1yaWdodFwiIGZvcj1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICA+TWlsZXN0b25lIHNldDwvbGFiZWxcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS04IGNvbC1sZy02XCI+XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJtaWxlc3RvbmVTZXRcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWlsZXN0b25lU2V0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2lzLXZhbGlkJzpcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMubWlsZXN0b25lU2V0LnRvdWNoZWQgJiYgZm9ybUNvbnRyb2xzLm1pbGVzdG9uZVNldC52YWxpZCxcbiAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9scy5taWxlc3RvbmVTZXQudG91Y2hlZCAmJiBmb3JtQ29udHJvbHMubWlsZXN0b25lU2V0LmVycm9yc1xuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBzZWxlY3RlZCBkaXNhYmxlZD5DaG9vc2UgYSBNaWxlc3RvbmUgc2V0PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBtaWxlc3RvbmVTZXQgb2YgbWlsZXN0b25lU2V0c1wiIFt2YWx1ZV09XCJtaWxlc3RvbmVTZXQuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbWlsZXN0b25lU2V0LnRpdGxlIH19ICh7eyBtaWxlc3RvbmVTZXQuaWQgfX0pXG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Db250cm9scy5taWxlc3RvbmVTZXQudG91Y2hlZCAmJiBmb3JtQ29udHJvbHMubWlsZXN0b25lU2V0LmVycm9yc1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtQ29udHJvbHMubWlsZXN0b25lU2V0LmVycm9ycy5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICBNaWxlc3RvbmUgc2V0IGlzIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC0xMiBjb2wtc20tMyBjb2wtZm9ybS1sYWJlbCB0ZXh0LXNtLXJpZ2h0XCIgZm9yPVwidGl0bGVcIj5UaXRsZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTggY29sLWxnLTZcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGlkPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJNaWxlc3RvbmUgdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnaXMtdmFsaWQnOiBmb3JtQ29udHJvbHMudGl0bGUudG91Y2hlZCAmJiBmb3JtQ29udHJvbHMudGl0bGUudmFsaWQsXG4gICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogZm9ybUNvbnRyb2xzLnRpdGxlLnRvdWNoZWQgJiYgZm9ybUNvbnRyb2xzLnRpdGxlLmVycm9yc1xuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtQ29udHJvbHMudGl0bGUudG91Y2hlZCAmJiBmb3JtQ29udHJvbHMudGl0bGUuZXJyb3JzXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZvcm1Db250cm9scy50aXRsZS5lcnJvcnMucmVxdWlyZWRcIj5UaXRsZSBpcyByZXF1aXJlZDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsIHRleHQtc20tcmlnaHRcIiBmb3I9XCJwcm9jZXNzXCJcbiAgICAgICAgICAgICAgICA+UHJvY2VzcyBkZWZpbml0aW9uPC9sYWJlbFxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTggY29sLWxnLTZcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBpZD1cInByb2Nlc3NcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvY2Vzc0RlZmluaXRpb25LZXlcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZ2V0Rmxvd25vZGVzKCRldmVudC5pZClcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnaXMtdmFsaWQnOlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9scy5wcm9jZXNzRGVmaW5pdGlvbktleS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnByb2Nlc3NEZWZpbml0aW9uS2V5LnZhbGlkLFxuICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnByb2Nlc3NEZWZpbml0aW9uS2V5LnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMucHJvY2Vzc0RlZmluaXRpb25LZXkuZXJyb3JzXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiY29tcGFyZVByb2Nlc3NEZWZpbml0aW9uc1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIGRpc2FibGVkPkNob29zZSBhIHByb2Nlc3M8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHByb2Nlc3NEZWZpbml0aW9uIG9mIHByb2Nlc3NEZWZpbml0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cInByb2Nlc3NEZWZpbml0aW9uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgcHJvY2Vzc0RlZmluaXRpb24ubmFtZSB9fSAoe3sgcHJvY2Vzc0RlZmluaXRpb24ua2V5IH19KVxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnByb2Nlc3NEZWZpbml0aW9uS2V5LnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnByb2Nlc3NEZWZpbml0aW9uS2V5LmVycm9yc1xuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZvcm1Db250cm9scy5wcm9jZXNzRGVmaW5pdGlvbktleS5lcnJvcnMucmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgUHJvY2VzcyBpcyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTMgY29sLWZvcm0tbGFiZWwgdGV4dC1zbS1yaWdodFwiIGZvcj1cInByb2Nlc3NcIj5UYXNrPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tOCBjb2wtbGctNlwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGlkPVwidGFza1wiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0YXNrRGVmaW5pdGlvbktleVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdpcy12YWxpZCc6XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnRhc2tEZWZpbml0aW9uS2V5LnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMudGFza0RlZmluaXRpb25LZXkudmFsaWQsXG4gICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzpcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMudGFza0RlZmluaXRpb25LZXkudG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9scy50YXNrRGVmaW5pdGlvbktleS5lcnJvcnNcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgZGlzYWJsZWQ+Q2hvb3NlIGEgdGFzazwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGFza0RlZmluaXRpb24gb2YgdGFza0RlZmluaXRpb25zIHwga2V5dmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGFza0RlZmluaXRpb24ua2V5XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgdGFza0RlZmluaXRpb24udmFsdWUgfX0gKHt7IHRhc2tEZWZpbml0aW9uLmtleSB9fSlcbiAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9scy50YXNrRGVmaW5pdGlvbktleS50b3VjaGVkICYmIGZvcm1Db250cm9scy50YXNrRGVmaW5pdGlvbktleS5lcnJvcnNcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtQ29udHJvbHMudGFza0RlZmluaXRpb25LZXkuZXJyb3JzLnJlcXVpcmVkXCI+VGFzayBpcyByZXF1aXJlZDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsIHRleHQtc20tcmlnaHRcIiBmb3I9XCJpbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgPkludGVydmFsIChpbiBkYXlzKTwvbGFiZWxcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS04IGNvbC1sZy02XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBpZD1cImludGVydmFsXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBsYW5uZWRJbnRlcnZhbEluRGF5c1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkludGVydmFsIChpbiBkYXlzKVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdpcy12YWxpZCc6XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnBsYW5uZWRJbnRlcnZhbEluRGF5cy50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnBsYW5uZWRJbnRlcnZhbEluRGF5cy52YWxpZCxcbiAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9scy5wbGFubmVkSW50ZXJ2YWxJbkRheXMudG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9scy5wbGFubmVkSW50ZXJ2YWxJbkRheXMuZXJyb3JzXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHMucGxhbm5lZEludGVydmFsSW5EYXlzLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzLnBsYW5uZWRJbnRlcnZhbEluRGF5cy5lcnJvcnNcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtQ29udHJvbHMucGxhbm5lZEludGVydmFsSW5EYXlzLmVycm9ycy5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICBJbnRlcnZhbCBpcyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZm9ybUNvbnRyb2xzLnBsYW5uZWRJbnRlcnZhbEluRGF5cy5lcnJvcnMucGF0dGVyblwiPlxuICAgICAgICAgICAgICAgICAgICBJbnRlcnZhbCBpcyBub3QgYSB2YWxpZCBudW1iZXJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsIHRleHQtc20tcmlnaHRcIiBmb3I9XCJjb2xvclwiPkNvbG9yPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tOCBjb2wtbGctNlwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgW2NvbG9yUGlja2VyXT1cImZvcm0udmFsdWUuY29sb3JcIlxuICAgICAgICAgICAgICAgICAgKGNvbG9yUGlja2VyQ2hhbmdlKT1cImZvcm0uY29udHJvbHMuY29sb3Iuc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJmb3JtLnZhbHVlLmNvbG9yXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGlkPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDb2xvclwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdpcy12YWxpZCc6IGZvcm1Db250cm9scy5jb2xvci50b3VjaGVkICYmIGZvcm1Db250cm9scy5jb2xvci52YWxpZCxcbiAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBmb3JtQ29udHJvbHMuY29sb3IudG91Y2hlZCAmJiBmb3JtQ29udHJvbHMuY29sb3IuZXJyb3JzXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Db250cm9scy5jb2xvci50b3VjaGVkICYmIGZvcm1Db250cm9scy5jb2xvci5lcnJvcnNcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZm9ybUNvbnRyb2xzLmNvbG9yLmVycm9ycy5yZXF1aXJlZFwiPkNvbG9yIGlzIHJlcXVpcmVkPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZm9ybUNvbnRyb2xzLmNvbG9yLmVycm9ycy5wYXR0ZXJuXCI+Q29sb3IgaXMgbm90IGEgdmFsaWQgaGV4IGNvZGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBwdC0zIG10LTFcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tNiB0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICA8YSBbcm91dGVyTGlua109XCInL21pbGVzdG9uZXMnXCIgY2xhc3M9XCJidG4gYnRuLXNwYWNlIGJ0bi1kZWZhdWx0XCI+QmFjazwvYT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc3BhY2UgYnRuLWRhbmdlclwiIChjbGljayk9XCJkZWxldGUoKVwiPlxuICAgICAgICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS02IHRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zcGFjZSBidG4tc2Vjb25kYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJyZXNldCgpXCI+XG4gICAgICAgICAgICAgICAgICBSZXNldFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNwYWNlIGJ0bi1wcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWRcIj5cbiAgICAgICAgICAgICAgICAgIFN1Ym1pdFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3ZhbHRpbW8td2lkZ2V0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2015-2020 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 } from '@angular/core';
|
|
17
|
+
import { combineLatest } from 'rxjs';
|
|
18
|
+
import * as i0 from "@angular/core";
|
|
19
|
+
import * as i1 from "../milestone.service";
|
|
20
|
+
import * as i2 from "@angular/router";
|
|
21
|
+
import * as i3 from "@valtimo/components";
|
|
22
|
+
import * as i4 from "@angular/common";
|
|
23
|
+
export class MilestoneListComponent {
|
|
24
|
+
constructor(milestoneService, router) {
|
|
25
|
+
this.milestoneService = milestoneService;
|
|
26
|
+
this.router = router;
|
|
27
|
+
this.milestones = [];
|
|
28
|
+
this.milestoneFields = [
|
|
29
|
+
{ key: 'id', label: 'ID' },
|
|
30
|
+
{ key: 'title', label: 'Title' },
|
|
31
|
+
{ key: 'processDefinitionKey', label: 'Process' },
|
|
32
|
+
{ key: 'taskDefinitionKey', label: 'Task' },
|
|
33
|
+
{ key: 'plannedIntervalInDays', label: 'Interval (in days)' },
|
|
34
|
+
{ key: 'color', label: 'Color' },
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
editMilestoneSet(milestoneSetId) {
|
|
38
|
+
this.router.navigate(['milestones/sets/set', milestoneSetId]);
|
|
39
|
+
}
|
|
40
|
+
editMilestone(milestone) {
|
|
41
|
+
this.router.navigate(['milestones/milestone', milestone.id]);
|
|
42
|
+
}
|
|
43
|
+
ngOnInit() {
|
|
44
|
+
combineLatest([
|
|
45
|
+
this.milestoneService.getMilestones(),
|
|
46
|
+
this.milestoneService.getMilestoneSets(),
|
|
47
|
+
]).subscribe(([milestones, milestoneSets]) => this.handleMilestoneResult(milestones, milestoneSets));
|
|
48
|
+
}
|
|
49
|
+
handleMilestoneResult(milestones, milestoneSets) {
|
|
50
|
+
const milestoneSetsMap = this.getMilestoneSetsMap(milestones, milestoneSets);
|
|
51
|
+
this.setMilestones(milestoneSetsMap);
|
|
52
|
+
}
|
|
53
|
+
setMilestones(milestoneSetsMap) {
|
|
54
|
+
this.milestones = Array.from(milestoneSetsMap.entries()).map(entry => {
|
|
55
|
+
entry[0] = JSON.parse(entry[0]);
|
|
56
|
+
return entry;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
getMilestoneSetsMap(milestones, milestoneSets) {
|
|
60
|
+
const mapWithSets = this.addMilestoneSetsToMap(milestoneSets, this.getEmptyMap());
|
|
61
|
+
return this.addMilestonesToMap(milestones, mapWithSets);
|
|
62
|
+
}
|
|
63
|
+
getEmptyMap() {
|
|
64
|
+
return new Map();
|
|
65
|
+
}
|
|
66
|
+
addMilestoneSetsToMap(milestoneSets, map) {
|
|
67
|
+
milestoneSets.forEach(milestoneSet => {
|
|
68
|
+
map.set(JSON.stringify(milestoneSet), []);
|
|
69
|
+
});
|
|
70
|
+
return map;
|
|
71
|
+
}
|
|
72
|
+
addMilestonesToMap(milestones, map) {
|
|
73
|
+
milestones.forEach(milestone => {
|
|
74
|
+
const milestoneSetString = JSON.stringify(milestone.milestoneSet);
|
|
75
|
+
const arr = map.get(milestoneSetString);
|
|
76
|
+
arr.push(milestone);
|
|
77
|
+
map.set(milestoneSetString, arr);
|
|
78
|
+
});
|
|
79
|
+
return map;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
MilestoneListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: MilestoneListComponent, deps: [{ token: i1.MilestoneService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
83
|
+
MilestoneListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: MilestoneListComponent, selector: "valtimo-milestone-list", ngImport: i0, template: "<!--\n ~ Copyright 2015-2020 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 *ngFor=\"let milestoneGroup of milestones\" class=\"mb-4\">\n <valtimo-widget>\n <h4 (click)=\"editMilestoneSet(milestoneGroup[0].id)\" class=\"milestone-title\">\n {{ milestoneGroup[0].title }} ({{ milestoneGroup[0].id }})\n </h4>\n <valtimo-list\n [items]=\"milestoneGroup[1]\"\n [fields]=\"milestoneFields\"\n (rowClicked)=\"editMilestone($event)\"\n >\n </valtimo-list>\n </valtimo-widget>\n</div>\n", styles: ["/*!\n * Copyright 2015-2020 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 */.milestone-title{background-color:#f8f9f9;margin:0;padding:1em;border-bottom:1px solid #dee2e6;cursor:pointer}\n"], components: [{ type: i3.WidgetComponent, selector: "valtimo-widget", inputs: ["type", "name", "icon", "contrast", "divider", "title", "subtitle", "collapseAble", "collapse", "additionalClasses"] }, { type: i3.ListComponent, selector: "valtimo-list", inputs: ["items", "fields", "pagination", "viewMode", "isSearchable", "header", "actions", "paginationIdentifier", "initialSortState"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
84
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: MilestoneListComponent, decorators: [{
|
|
85
|
+
type: Component,
|
|
86
|
+
args: [{ selector: 'valtimo-milestone-list', template: "<!--\n ~ Copyright 2015-2020 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 *ngFor=\"let milestoneGroup of milestones\" class=\"mb-4\">\n <valtimo-widget>\n <h4 (click)=\"editMilestoneSet(milestoneGroup[0].id)\" class=\"milestone-title\">\n {{ milestoneGroup[0].title }} ({{ milestoneGroup[0].id }})\n </h4>\n <valtimo-list\n [items]=\"milestoneGroup[1]\"\n [fields]=\"milestoneFields\"\n (rowClicked)=\"editMilestone($event)\"\n >\n </valtimo-list>\n </valtimo-widget>\n</div>\n", styles: ["/*!\n * Copyright 2015-2020 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 */.milestone-title{background-color:#f8f9f9;margin:0;padding:1em;border-bottom:1px solid #dee2e6;cursor:pointer}\n"] }]
|
|
87
|
+
}], ctorParameters: function () { return [{ type: i1.MilestoneService }, { type: i2.Router }]; } });
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlsZXN0b25lLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby9taWxlc3RvbmUvc3JjL2xpYi9taWxlc3RvbmUtbGlzdC9taWxlc3RvbmUtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL21pbGVzdG9uZS9zcmMvbGliL21pbGVzdG9uZS1saXN0L21pbGVzdG9uZS1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUloRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFPbkMsTUFBTSxPQUFPLHNCQUFzQjtJQVdqQyxZQUFvQixnQkFBa0MsRUFBVSxNQUFjO1FBQTFELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBVnZFLGVBQVUsR0FBMkQsRUFBRSxDQUFDO1FBQ3hFLG9CQUFlLEdBQUc7WUFDdkIsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7WUFDeEIsRUFBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUM7WUFDOUIsRUFBQyxHQUFHLEVBQUUsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQztZQUMvQyxFQUFDLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDO1lBQ3pDLEVBQUMsR0FBRyxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBQztZQUMzRCxFQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQztTQUMvQixDQUFDO0lBRStFLENBQUM7SUFF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ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtDb21wb25lbnQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01pbGVzdG9uZVNlcnZpY2V9IGZyb20gJy4uL21pbGVzdG9uZS5zZXJ2aWNlJztcbmltcG9ydCB7TWlsZXN0b25lLCBNaWxlc3RvbmVTZXR9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1JvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7Y29tYmluZUxhdGVzdH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tbWlsZXN0b25lLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWlsZXN0b25lLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9taWxlc3RvbmUtbGlzdC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBNaWxlc3RvbmVMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHVibGljIG1pbGVzdG9uZXM6IEFycmF5PEFycmF5PHN0cmluZyB8IE1pbGVzdG9uZVNldCB8IEFycmF5PE1pbGVzdG9uZT4+PiA9IFtdO1xuICBwdWJsaWMgbWlsZXN0b25lRmllbGRzID0gW1xuICAgIHtrZXk6ICdpZCcsIGxhYmVsOiAnSUQnfSxcbiAgICB7a2V5OiAndGl0bGUnLCBsYWJlbDogJ1RpdGxlJ30sXG4gICAge2tleTogJ3Byb2Nlc3NEZWZpbml0aW9uS2V5JywgbGFiZWw6ICdQcm9jZXNzJ30sXG4gICAge2tleTogJ3Rhc2tEZWZpbml0aW9uS2V5JywgbGFiZWw6ICdUYXNrJ30sXG4gICAge2tleTogJ3BsYW5uZWRJbnRlcnZhbEluRGF5cycsIGxhYmVsOiAnSW50ZXJ2YWwgKGluIGRheXMpJ30sXG4gICAge2tleTogJ2NvbG9yJywgbGFiZWw6ICdDb2xvcid9LFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWlsZXN0b25lU2VydmljZTogTWlsZXN0b25lU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikge31cblxuICBlZGl0TWlsZXN0b25lU2V0KG1pbGVzdG9uZVNldElkOiBudW1iZXIpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ21pbGVzdG9uZXMvc2V0cy9zZXQnLCBtaWxlc3RvbmVTZXRJZF0pO1xuICB9XG5cbiAgZWRpdE1pbGVzdG9uZShtaWxlc3RvbmU6IE1pbGVzdG9uZSkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbWlsZXN0b25lcy9taWxlc3RvbmUnLCBtaWxlc3RvbmUuaWRdKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5taWxlc3RvbmVTZXJ2aWNlLmdldE1pbGVzdG9uZXMoKSxcbiAgICAgIHRoaXMubWlsZXN0b25lU2VydmljZS5nZXRNaWxlc3RvbmVTZXRzKCksXG4gICAgXSkuc3Vic2NyaWJlKChbbWlsZXN0b25lcywgbWlsZXN0b25lU2V0c10pID0+XG4gICAgICB0aGlzLmhhbmRsZU1pbGVzdG9uZVJlc3VsdChtaWxlc3RvbmVzLCBtaWxlc3RvbmVTZXRzKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1pbGVzdG9uZVJlc3VsdChcbiAgICBtaWxlc3RvbmVzOiBBcnJheTxNaWxlc3RvbmU+LFxuICAgIG1pbGVzdG9uZVNldHM6IEFycmF5PE1pbGVzdG9uZVNldD5cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbWlsZXN0b25lU2V0c01hcCA9IHRoaXMuZ2V0TWlsZXN0b25lU2V0c01hcChtaWxlc3RvbmVzLCBtaWxlc3RvbmVTZXRzKTtcblxuICAgIHRoaXMuc2V0TWlsZXN0b25lcyhtaWxlc3RvbmVTZXRzTWFwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TWlsZXN0b25lcyhtaWxlc3RvbmVTZXRzTWFwOiBNYXA8c3RyaW5nLCBNaWxlc3RvbmVbXT4pOiB2b2lkIHtcbiAgICB0aGlzLm1pbGVzdG9uZXMgPSBBcnJheS5mcm9tKG1pbGVzdG9uZVNldHNNYXAuZW50cmllcygpKS5tYXAoZW50cnkgPT4ge1xuICAgICAgZW50cnlbMF0gPSBKU09OLnBhcnNlKGVudHJ5WzBdKTtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWlsZXN0b25lU2V0c01hcChcbiAgICBtaWxlc3RvbmVzOiBBcnJheTxNaWxlc3RvbmU+LFxuICAgIG1pbGVzdG9uZVNldHM6IEFycmF5PE1pbGVzdG9uZVNldD5cbiAgKTogTWFwPHN0cmluZywgTWlsZXN0b25lW10+IHtcbiAgICBjb25zdCBtYXBXaXRoU2V0cyA9IHRoaXMuYWRkTWlsZXN0b25lU2V0c1RvTWFwKG1pbGVzdG9uZVNldHMsIHRoaXMuZ2V0RW1wdHlNYXAoKSk7XG5cbiAgICByZXR1cm4gdGhpcy5hZGRNaWxlc3RvbmVzVG9NYXAobWlsZXN0b25lcywgbWFwV2l0aFNldHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbXB0eU1hcCgpOiBNYXA8c3RyaW5nLCBNaWxlc3RvbmVbXT4ge1xuICAgIHJldHVybiBuZXcgTWFwPHN0cmluZywgTWlsZXN0b25lW10+KCk7XG4gIH1cblxuICBwcml2YXRlIGFkZE1pbGVzdG9uZVNldHNUb01hcChcbiAgICBtaWxlc3RvbmVTZXRzOiBBcnJheTxNaWxlc3RvbmVTZXQ+LFxuICAgIG1hcDogTWFwPHN0cmluZywgTWlsZXN0b25lW10+XG4gICk6IE1hcDxzdHJpbmcsIE1pbGVzdG9uZVtdPiB7XG4gICAgbWlsZXN0b25lU2V0cy5mb3JFYWNoKG1pbGVzdG9uZVNldCA9PiB7XG4gICAgICBtYXAuc2V0KEpTT04uc3RyaW5naWZ5KG1pbGVzdG9uZVNldCksIFtdKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIGFkZE1pbGVzdG9uZXNUb01hcChcbiAgICBtaWxlc3RvbmVzOiBBcnJheTxNaWxlc3RvbmU+LFxuICAgIG1hcDogTWFwPHN0cmluZywgTWlsZXN0b25lW10+XG4gICk6IE1hcDxzdHJpbmcsIE1pbGVzdG9uZVtdPiB7XG4gICAgbWlsZXN0b25lcy5mb3JFYWNoKG1pbGVzdG9uZSA9PiB7XG4gICAgICBjb25zdCBtaWxlc3RvbmVTZXRTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShtaWxlc3RvbmUubWlsZXN0b25lU2V0KTtcbiAgICAgIGNvbnN0IGFyciA9IG1hcC5nZXQobWlsZXN0b25lU2V0U3RyaW5nKTtcbiAgICAgIGFyci5wdXNoKG1pbGVzdG9uZSk7XG4gICAgICBtYXAuc2V0KG1pbGVzdG9uZVNldFN0cmluZywgYXJyKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXA7XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDIwIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cblxuPGRpdiAqbmdGb3I9XCJsZXQgbWlsZXN0b25lR3JvdXAgb2YgbWlsZXN0b25lc1wiIGNsYXNzPVwibWItNFwiPlxuICA8dmFsdGltby13aWRnZXQ+XG4gICAgPGg0IChjbGljayk9XCJlZGl0TWlsZXN0b25lU2V0KG1pbGVzdG9uZUdyb3VwWzBdLmlkKVwiIGNsYXNzPVwibWlsZXN0b25lLXRpdGxlXCI+XG4gICAgICB7eyBtaWxlc3RvbmVHcm91cFswXS50aXRsZSB9fSAoe3sgbWlsZXN0b25lR3JvdXBbMF0uaWQgfX0pXG4gICAgPC9oND5cbiAgICA8dmFsdGltby1saXN0XG4gICAgICBbaXRlbXNdPVwibWlsZXN0b25lR3JvdXBbMV1cIlxuICAgICAgW2ZpZWxkc109XCJtaWxlc3RvbmVGaWVsZHNcIlxuICAgICAgKHJvd0NsaWNrZWQpPVwiZWRpdE1pbGVzdG9uZSgkZXZlbnQpXCJcbiAgICA+XG4gICAgPC92YWx0aW1vLWxpc3Q+XG4gIDwvdmFsdGltby13aWRnZXQ+XG48L2Rpdj5cbiJdfQ==
|