verben-workflow-ui 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/esm2022/lib/components/designer/models/types.mjs +1 -1
  2. package/esm2022/lib/components/designer/services/wf-mapper.service.mjs +3 -3
  3. package/esm2022/lib/components/workflow-designer/conditions-popup/conditions-popup.component.mjs +76 -0
  4. package/esm2022/lib/components/workflow-designer/decision-popup/decision-popup.component.mjs +65 -0
  5. package/esm2022/lib/components/workflow-designer/designer-canvas/designer-canvas.component.mjs +245 -17
  6. package/esm2022/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.mjs +26 -14
  7. package/esm2022/lib/components/workflow-designer/services/connection.service.mjs +220 -0
  8. package/esm2022/lib/components/workflow-designer/services/node-management.service.mjs +288 -0
  9. package/esm2022/lib/components/workflow-designer/services/popup.service.mjs +235 -0
  10. package/esm2022/lib/components/workflow-designer/services/swimlane.service.mjs +145 -0
  11. package/esm2022/lib/components/workflow-designer/services/transformer.service.mjs +260 -0
  12. package/esm2022/lib/components/workflow-designer/stage-dialog/stage-dialog.component.mjs +67 -11
  13. package/esm2022/lib/components/workflow-designer/stage-node/stage-node.component.mjs +9 -18
  14. package/esm2022/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.mjs +30 -24
  15. package/esm2022/lib/components/workflow-designer/workflow-data.service.mjs +2 -2
  16. package/esm2022/lib/components/workflow-designer/workflow-designer.component.mjs +138 -96
  17. package/esm2022/lib/components/workflow-designer/workflow-designer.module.mjs +27 -3
  18. package/esm2022/lib/components/workflow-designer/workflow-designer.state.mjs +243 -205
  19. package/esm2022/lib/components/workflow-designer/workflow-designer.types.mjs +1 -1
  20. package/esm2022/lib/models/SwimLane.mjs +1 -1
  21. package/esm2022/lib/models/Workflow.mjs +1 -1
  22. package/esm2022/lib/models/WorkflowStage.mjs +1 -1
  23. package/esm2022/lib/services/http-web-request.service.mjs +2 -2
  24. package/fesm2022/verben-workflow-ui.mjs +2644 -1005
  25. package/fesm2022/verben-workflow-ui.mjs.map +1 -1
  26. package/lib/components/designer/models/types.d.ts +1 -1
  27. package/lib/components/workflow-designer/conditions-popup/conditions-popup.component.d.ts +34 -0
  28. package/lib/components/workflow-designer/decision-popup/decision-popup.component.d.ts +26 -0
  29. package/lib/components/workflow-designer/designer-canvas/designer-canvas.component.d.ts +35 -1
  30. package/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.d.ts +14 -3
  31. package/lib/components/workflow-designer/services/connection.service.d.ts +85 -0
  32. package/lib/components/workflow-designer/services/node-management.service.d.ts +52 -0
  33. package/lib/components/workflow-designer/services/popup.service.d.ts +139 -0
  34. package/lib/components/workflow-designer/services/swimlane.service.d.ts +51 -0
  35. package/lib/components/workflow-designer/services/transformer.service.d.ts +36 -0
  36. package/lib/components/workflow-designer/stage-dialog/stage-dialog.component.d.ts +17 -2
  37. package/lib/components/workflow-designer/stage-node/stage-node.component.d.ts +2 -2
  38. package/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.d.ts +7 -1
  39. package/lib/components/workflow-designer/workflow-designer.component.d.ts +2 -1
  40. package/lib/components/workflow-designer/workflow-designer.module.d.ts +6 -4
  41. package/lib/components/workflow-designer/workflow-designer.state.d.ts +17 -1
  42. package/lib/components/workflow-designer/workflow-designer.types.d.ts +2 -0
  43. package/lib/models/SwimLane.d.ts +1 -0
  44. package/lib/models/Workflow.d.ts +1 -0
  45. package/lib/models/WorkflowStage.d.ts +1 -1
  46. package/package.json +1 -1
  47. package/styles/styles.css +23 -0
@@ -0,0 +1,145 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../workflow-designer.state";
4
+ export class SwimlaneService {
5
+ state;
6
+ swimlaneHeight = 263;
7
+ constructor(state) {
8
+ this.state = state;
9
+ }
10
+ /**
11
+ * Add a new swimlane
12
+ */
13
+ addSwimlane(name, tags) {
14
+ const newSwimlane = {
15
+ order: this.state.swimlanes.length,
16
+ label: name,
17
+ tags,
18
+ nodes: [],
19
+ };
20
+ this.state.swimlanes.push(newSwimlane);
21
+ return newSwimlane;
22
+ }
23
+ /**
24
+ * Update an existing swimlane
25
+ */
26
+ updateSwimlane(index, name, tags) {
27
+ if (index < 0 || index >= this.state.swimlanes.length) {
28
+ console.error('Invalid swimlane index:', index);
29
+ return false;
30
+ }
31
+ this.state.swimlanes[index] = {
32
+ ...this.state.swimlanes[index],
33
+ label: name,
34
+ tags: tags,
35
+ };
36
+ return true;
37
+ }
38
+ /**
39
+ * Reorder swimlanes (move a swimlane up or down in the list)
40
+ */
41
+ reorderSwimlane(fromIndex, toIndex) {
42
+ if (fromIndex < 0 ||
43
+ fromIndex >= this.state.swimlanes.length ||
44
+ toIndex < 0 ||
45
+ toIndex >= this.state.swimlanes.length) {
46
+ return false;
47
+ }
48
+ // Remove the swimlane from its current position
49
+ const [swimlane] = this.state.swimlanes.splice(fromIndex, 1);
50
+ // Insert it at the new position
51
+ this.state.swimlanes.splice(toIndex, 0, swimlane);
52
+ // Update order properties for all swimlanes
53
+ this.state.swimlanes.forEach((lane, idx) => {
54
+ lane.order = idx;
55
+ });
56
+ return true;
57
+ }
58
+ /**
59
+ * Delete a swimlane by index
60
+ */
61
+ deleteSwimlane(index) {
62
+ if (index < 0 || index >= this.state.swimlanes.length) {
63
+ return false;
64
+ }
65
+ // Check if the swimlane has nodes
66
+ if (this.state.swimlanes[index].nodes?.length) {
67
+ console.error('Cannot delete swimlane with nodes');
68
+ return false;
69
+ }
70
+ // Remove the swimlane
71
+ this.state.swimlanes.splice(index, 1);
72
+ // Update order properties for all swimlanes
73
+ this.state.swimlanes.forEach((lane, idx) => {
74
+ lane.order = idx;
75
+ });
76
+ return true;
77
+ }
78
+ /**
79
+ * Get all swimlanes
80
+ */
81
+ getSwimlanes() {
82
+ return this.state.swimlanes;
83
+ }
84
+ /**
85
+ * Get swimlane by index
86
+ */
87
+ getSwimlane(index) {
88
+ if (index < 0 || index >= this.state.swimlanes.length) {
89
+ return null;
90
+ }
91
+ return this.state.swimlanes[index];
92
+ }
93
+ /**
94
+ * Calculate total canvas height needed for all swimlanes
95
+ */
96
+ calculateCanvasHeight(minHeight = 2000) {
97
+ const requiredHeight = (this.state.swimlanes.length + 1) * this.swimlaneHeight;
98
+ return Math.max(minHeight, requiredHeight);
99
+ }
100
+ /**
101
+ * Check if a Y position is within any swimlane
102
+ */
103
+ isPositionInsideSwimlane(y) {
104
+ // Check if y position is within any swimlane
105
+ const swimlaneCount = this.state.swimlanes.length;
106
+ if (swimlaneCount === 0)
107
+ return false;
108
+ // Each swimlane has a height of 263px
109
+ const totalSwimlaneHeight = swimlaneCount * this.swimlaneHeight;
110
+ // Check if y is within the total height of all swimlanes
111
+ return y >= 0 && y < totalSwimlaneHeight;
112
+ }
113
+ /**
114
+ * Calculate swimlane index from Y position
115
+ */
116
+ getSwimlaneIndexFromPosition(y) {
117
+ if (!this.isPositionInsideSwimlane(y))
118
+ return -1;
119
+ return Math.floor(y / this.swimlaneHeight);
120
+ }
121
+ /**
122
+ * Find swimlane index by Lane ID
123
+ */
124
+ findSwimlaneIndexByLaneId(laneId) {
125
+ // In a real implementation, you would maintain a mapping between API lane IDs and UI swimlane indices
126
+ // For now we'll just return the index based on position
127
+ const parts = laneId.split('-');
128
+ if (parts.length > 1) {
129
+ const index = parseInt(parts[1]);
130
+ if (!isNaN(index) && index < this.state.swimlanes.length) {
131
+ return index;
132
+ }
133
+ }
134
+ return -1;
135
+ }
136
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SwimlaneService, deps: [{ token: i1.WorkflowDesignerState }], target: i0.ɵɵFactoryTarget.Injectable });
137
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SwimlaneService, providedIn: 'root' });
138
+ }
139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SwimlaneService, decorators: [{
140
+ type: Injectable,
141
+ args: [{
142
+ providedIn: 'root',
143
+ }]
144
+ }], ctorParameters: () => [{ type: i1.WorkflowDesignerState }] });
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpbWxhbmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL2NvbXBvbmVudHMvd29ya2Zsb3ctZGVzaWduZXIvc2VydmljZXMvc3dpbWxhbmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFRM0MsTUFBTSxPQUFPLGVBQWU7SUFHTjtJQUZYLGNBQWMsR0FBRyxHQUFHLENBQUM7SUFFOUIsWUFBb0IsS0FBNEI7UUFBNUIsVUFBSyxHQUFMLEtBQUssQ0FBdUI7SUFBRyxDQUFDO0lBRXBEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLElBQVksRUFBRSxJQUFXO1FBQ25DLE1BQU0sV0FBVyxHQUFpQjtZQUNoQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTTtZQUNsQyxLQUFLLEVBQUUsSUFBSTtZQUNYLElBQUk7WUFDSixLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUM7UUFFRixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkMsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUUsSUFBVztRQUNyRCxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RELE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUc7WUFD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ZSxjQUZkLE1BQU07OzRGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3dpbWxhbmVJdGVtIH0gZnJvbSAnLi4vd29ya2Zsb3ctZGVzaWduZXIudHlwZXMnO1xuaW1wb3J0IHsgVGFnIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL1RhZyc7XG5pbXBvcnQgeyBXb3JrZmxvd0Rlc2lnbmVyU3RhdGUgfSBmcm9tICcuLi93b3JrZmxvdy1kZXNpZ25lci5zdGF0ZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTd2ltbGFuZVNlcnZpY2Uge1xuICByZWFkb25seSBzd2ltbGFuZUhlaWdodCA9IDI2MztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0YXRlOiBXb3JrZmxvd0Rlc2lnbmVyU3RhdGUpIHt9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBzd2ltbGFuZVxuICAgKi9cbiAgYWRkU3dpbWxhbmUobmFtZTogc3RyaW5nLCB0YWdzOiBUYWdbXSk6IFN3aW1sYW5lSXRlbSB7XG4gICAgY29uc3QgbmV3U3dpbWxhbmU6IFN3aW1sYW5lSXRlbSA9IHtcbiAgICAgIG9yZGVyOiB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGgsXG4gICAgICBsYWJlbDogbmFtZSxcbiAgICAgIHRhZ3MsXG4gICAgICBub2RlczogW10sXG4gICAgfTtcblxuICAgIHRoaXMuc3RhdGUuc3dpbWxhbmVzLnB1c2gobmV3U3dpbWxhbmUpO1xuICAgIHJldHVybiBuZXdTd2ltbGFuZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYW4gZXhpc3Rpbmcgc3dpbWxhbmVcbiAgICovXG4gIHVwZGF0ZVN3aW1sYW5lKGluZGV4OiBudW1iZXIsIG5hbWU6IHN0cmluZywgdGFnczogVGFnW10pOiBib29sZWFuIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCkge1xuICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBzd2ltbGFuZSBpbmRleDonLCBpbmRleCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZS5zd2ltbGFuZXNbaW5kZXhdID0ge1xuICAgICAgLi4udGhpcy5zdGF0ZS5zd2ltbGFuZXNbaW5kZXhdLFxuICAgICAgbGFiZWw6IG5hbWUsXG4gICAgICB0YWdzOiB0YWdzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW9yZGVyIHN3aW1sYW5lcyAobW92ZSBhIHN3aW1sYW5lIHVwIG9yIGRvd24gaW4gdGhlIGxpc3QpXG4gICAqL1xuICByZW9yZGVyU3dpbWxhbmUoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIGZyb21JbmRleCA8IDAgfHxcbiAgICAgIGZyb21JbmRleCA+PSB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGggfHxcbiAgICAgIHRvSW5kZXggPCAwIHx8XG4gICAgICB0b0luZGV4ID49IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgc3dpbWxhbmUgZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvblxuICAgIGNvbnN0IFtzd2ltbGFuZV0gPSB0aGlzLnN0YXRlLnN3aW1sYW5lcy5zcGxpY2UoZnJvbUluZGV4LCAxKTtcblxuICAgIC8vIEluc2VydCBpdCBhdCB0aGUgbmV3IHBvc2l0aW9uXG4gICAgdGhpcy5zdGF0ZS5zd2ltbGFuZXMuc3BsaWNlKHRvSW5kZXgsIDAsIHN3aW1sYW5lKTtcblxuICAgIC8vIFVwZGF0ZSBvcmRlciBwcm9wZXJ0aWVzIGZvciBhbGwgc3dpbWxhbmVzXG4gICAgdGhpcy5zdGF0ZS5zd2ltbGFuZXMuZm9yRWFjaCgobGFuZSwgaWR4KSA9PiB7XG4gICAgICBsYW5lLm9yZGVyID0gaWR4O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgc3dpbWxhbmUgYnkgaW5kZXhcbiAgICovXG4gIGRlbGV0ZVN3aW1sYW5lKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBzd2ltbGFuZSBoYXMgbm9kZXNcbiAgICBpZiAodGhpcy5zdGF0ZS5zd2ltbGFuZXNbaW5kZXhdLm5vZGVzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBkZWxldGUgc3dpbWxhbmUgd2l0aCBub2RlcycpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgc3dpbWxhbmVcbiAgICB0aGlzLnN0YXRlLnN3aW1sYW5lcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gVXBkYXRlIG9yZGVyIHByb3BlcnRpZXMgZm9yIGFsbCBzd2ltbGFuZXNcbiAgICB0aGlzLnN0YXRlLnN3aW1sYW5lcy5mb3JFYWNoKChsYW5lLCBpZHgpID0+IHtcbiAgICAgIGxhbmUub3JkZXIgPSBpZHg7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHN3aW1sYW5lc1xuICAgKi9cbiAgZ2V0U3dpbWxhbmVzKCk6IFN3aW1sYW5lSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zd2ltbGFuZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN3aW1sYW5lIGJ5IGluZGV4XG4gICAqL1xuICBnZXRTd2ltbGFuZShpbmRleDogbnVtYmVyKTogU3dpbWxhbmVJdGVtIHwgbnVsbCB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zd2ltbGFuZXNbaW5kZXhdO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0b3RhbCBjYW52YXMgaGVpZ2h0IG5lZWRlZCBmb3IgYWxsIHN3aW1sYW5lc1xuICAgKi9cbiAgY2FsY3VsYXRlQ2FudmFzSGVpZ2h0KG1pbkhlaWdodDogbnVtYmVyID0gMjAwMCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVxdWlyZWRIZWlnaHQgPVxuICAgICAgKHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCArIDEpICogdGhpcy5zd2ltbGFuZUhlaWdodDtcbiAgICByZXR1cm4gTWF0aC5tYXgobWluSGVpZ2h0LCByZXF1aXJlZEhlaWdodCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBZIHBvc2l0aW9uIGlzIHdpdGhpbiBhbnkgc3dpbWxhbmVcbiAgICovXG4gIGlzUG9zaXRpb25JbnNpZGVTd2ltbGFuZSh5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB5IHBvc2l0aW9uIGlzIHdpdGhpbiBhbnkgc3dpbWxhbmVcbiAgICBjb25zdCBzd2ltbGFuZUNvdW50ID0gdGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoO1xuICAgIGlmIChzd2ltbGFuZUNvdW50ID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBFYWNoIHN3aW1sYW5lIGhhcyBhIGhlaWdodCBvZiAyNjNweFxuICAgIGNvbnN0IHRvdGFsU3dpbWxhbmVIZWlnaHQgPSBzd2ltbGFuZUNvdW50ICogdGhpcy5zd2ltbGFuZUhlaWdodDtcblxuICAgIC8vIENoZWNrIGlmIHkgaXMgd2l0aGluIHRoZSB0b3RhbCBoZWlnaHQgb2YgYWxsIHN3aW1sYW5lc1xuICAgIHJldHVybiB5ID49IDAgJiYgeSA8IHRvdGFsU3dpbWxhbmVIZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHN3aW1sYW5lIGluZGV4IGZyb20gWSBwb3NpdGlvblxuICAgKi9cbiAgZ2V0U3dpbWxhbmVJbmRleEZyb21Qb3NpdGlvbih5OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5pc1Bvc2l0aW9uSW5zaWRlU3dpbWxhbmUoeSkpIHJldHVybiAtMTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcih5IC8gdGhpcy5zd2ltbGFuZUhlaWdodCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBzd2ltbGFuZSBpbmRleCBieSBMYW5lIElEXG4gICAqL1xuICBmaW5kU3dpbWxhbmVJbmRleEJ5TGFuZUlkKGxhbmVJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHlvdSB3b3VsZCBtYWludGFpbiBhIG1hcHBpbmcgYmV0d2VlbiBBUEkgbGFuZSBJRHMgYW5kIFVJIHN3aW1sYW5lIGluZGljZXNcbiAgICAvLyBGb3Igbm93IHdlJ2xsIGp1c3QgcmV0dXJuIHRoZSBpbmRleCBiYXNlZCBvbiBwb3NpdGlvblxuICAgIGNvbnN0IHBhcnRzID0gbGFuZUlkLnNwbGl0KCctJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQocGFydHNbMV0pO1xuICAgICAgaWYgKCFpc05hTihpbmRleCkgJiYgaW5kZXggPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,260 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { ObjectState } from '../../../models/object-state';
3
+ import { Status } from '../../../models/status';
4
+ import { TaskAssignmentType } from '../../../models/TaskAssignmentType';
5
+ import { StageActorRule } from '../../../models/StageActorRule';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../workflow-designer.state";
8
+ import * as i2 from "./swimlane.service";
9
+ import * as i3 from "./node-management.service";
10
+ import * as i4 from "./connection.service";
11
+ export class TransformerService {
12
+ state;
13
+ swimlaneService;
14
+ nodeService;
15
+ connectionService;
16
+ // Map to track loaded objects
17
+ loadedObjectIds = {}; // Format: { id: code }
18
+ constructor(state, swimlaneService, nodeService, connectionService) {
19
+ this.state = state;
20
+ this.swimlaneService = swimlaneService;
21
+ this.nodeService = nodeService;
22
+ this.connectionService = connectionService;
23
+ }
24
+ /**
25
+ * Transform the UI model to a Workflow API model
26
+ */
27
+ transformToWorkflowModel() {
28
+ // Create base workflow object
29
+ const workflow = {
30
+ // BaseModel properties
31
+ Id: this.wasLoadedFromApi(this.state.workflowId || '')
32
+ ? this.state.workflowId || ''
33
+ : '',
34
+ Code: this.getCodeForObject(this.state.workflowId || ''),
35
+ TenantId: '',
36
+ id: this.wasLoadedFromApi(this.state.workflowId || '')
37
+ ? this.state.workflowId || ''
38
+ : '',
39
+ ServiceName: '',
40
+ CreatedAt: new Date(),
41
+ UpdatedAt: new Date(),
42
+ DataState: this.wasLoadedFromApi(this.state.workflowId || '')
43
+ ? ObjectState.Changed
44
+ : ObjectState.New,
45
+ // Workflow specific properties
46
+ Name: 'New Workflow', // Default name
47
+ Description: '', // Default description
48
+ StageEntryRule: '',
49
+ Form: this.state.workflowFormId || undefined,
50
+ AssignmentType: TaskAssignmentType.AutoRoute,
51
+ Operation: '',
52
+ Status: Status.Active,
53
+ Actions: [],
54
+ Lanes: [],
55
+ Stages: [],
56
+ };
57
+ // Transform swimlanes to SwimLane[]
58
+ workflow.Lanes = this.state.swimlanes.map((swimlane, index) => {
59
+ const laneId = `lane-${index}`;
60
+ return {
61
+ // BaseModel properties
62
+ Id: '',
63
+ Code: '',
64
+ TenantId: '',
65
+ id: laneId,
66
+ ServiceName: '',
67
+ CreatedAt: new Date(),
68
+ UpdatedAt: new Date(),
69
+ DataState: ObjectState.New,
70
+ // SwimLane specific properties
71
+ Workflow: workflow.Id,
72
+ Tags: swimlane.tags || [],
73
+ Position: swimlane.order,
74
+ Coordinates: { X: 0, Y: swimlane.order * 263 },
75
+ Size: { Width: 3000, Height: 263 },
76
+ };
77
+ });
78
+ // Transform nodes to WorkflowStage[]
79
+ const stages = [];
80
+ this.state.swimlanes.forEach((swimlane, swimlaneIndex) => {
81
+ swimlane.nodes?.forEach((node) => {
82
+ if (node.type === 'stage') {
83
+ // Create a stage from the node
84
+ const stage = {
85
+ // BaseModel properties
86
+ Id: node.id,
87
+ Code: this.getCodeForObject(node.id),
88
+ TenantId: '',
89
+ id: node.id,
90
+ ServiceName: '',
91
+ CreatedAt: new Date(),
92
+ UpdatedAt: new Date(),
93
+ DataState: this.wasLoadedFromApi(node.id)
94
+ ? ObjectState.Changed
95
+ : ObjectState.New,
96
+ // WorkflowStage specific properties
97
+ Workflow: workflow.Id,
98
+ Name: node.stageData?.Name || 'Unnamed Stage',
99
+ Description: node.stageData?.Description || '',
100
+ Duration: node.stageData?.Duration || 0,
101
+ PassOnRule: node.stageData?.PassOnRule || '',
102
+ ActorRule: node.stageData?.ActorRule || StageActorRule.None,
103
+ MinNoOfActor: node.stageData?.MinNoOfActor || 0,
104
+ IsParallel: node.stageData?.IsParallel || false,
105
+ IsEntryPoint: node.isStartNode,
106
+ IsExitPoint: false, // Will be updated below
107
+ Tags: node.stageData?.Tags || [],
108
+ Form: node.stageData?.formId ? node.stageData.formId : '',
109
+ AllowMultiSubProcess: false,
110
+ AssignmentType: TaskAssignmentType.AutoRoute,
111
+ SubWorkFlow: '',
112
+ SwimLane: workflow.Lanes[swimlaneIndex].Id,
113
+ Coordinates: { X: node.x, Y: node.y },
114
+ IsSubProcess: false,
115
+ Key: node.stageData?.Key || undefined,
116
+ };
117
+ stages.push(stage);
118
+ }
119
+ });
120
+ });
121
+ // Determine which stages are exit points (no outgoing connections)
122
+ stages.forEach((stage) => {
123
+ const hasOutgoingConnections = this.state.connections.some((conn) => conn.sourceNodeId === stage.Id);
124
+ if (!hasOutgoingConnections) {
125
+ stage.IsExitPoint = true;
126
+ }
127
+ });
128
+ // Transform connections to WorkflowAction[]
129
+ workflow.Actions = this.state.connections.map((conn) => {
130
+ const sourceNode = this.nodeService.findNodeById(conn.sourceNodeId)?.node;
131
+ const targetNode = this.nodeService.findNodeById(conn.targetNodeId)?.node;
132
+ return {
133
+ // BaseModel properties
134
+ Id: conn.id,
135
+ Code: this.getCodeForObject(conn.id),
136
+ TenantId: '',
137
+ id: conn.id,
138
+ ServiceName: '',
139
+ CreatedAt: new Date(),
140
+ UpdatedAt: new Date(),
141
+ DataState: this.wasLoadedFromApi(conn.id)
142
+ ? ObjectState.Changed
143
+ : ObjectState.New,
144
+ // WorkflowAction specific properties
145
+ Workflow: workflow.Id,
146
+ Name: `Action from ${sourceNode?.stageData?.Name || 'Unknown'} to ${targetNode?.stageData?.Name || 'Unknown'}`,
147
+ FromStage: conn.sourceNodeId,
148
+ ToStage: conn.targetNodeId,
149
+ IsParallel: sourceNode?.stageData?.hasParallel || false,
150
+ PassOnRule: '', // Optional property
151
+ };
152
+ });
153
+ workflow.Stages = stages;
154
+ return workflow;
155
+ }
156
+ /**
157
+ * Parse API workflow model and convert to UI model
158
+ */
159
+ parseWorkflowData(workflow) {
160
+ // Clear existing state
161
+ this.state.swimlanes = [];
162
+ this.state.connections = [];
163
+ // Set workflow form if exists
164
+ if (workflow.Form) {
165
+ this.state.setWorkflowForm(workflow.Form, workflow.FormName || 'Workflow Form');
166
+ }
167
+ // Store the workflow ID
168
+ this.state.setWorkflowId(workflow.Id);
169
+ // Register the workflow itself
170
+ this.registerLoadedObject(workflow.Id, workflow.Code);
171
+ // Process swimlanes first
172
+ if (workflow.Lanes && workflow.Lanes.length) {
173
+ workflow.Lanes.sort((a, b) => a.Position - b.Position).forEach((lane) => {
174
+ this.swimlaneService.addSwimlane(lane.Name || `Lane ${lane.Position}`, lane.Tags || []);
175
+ // Register loaded lane
176
+ this.registerLoadedObject(lane.Id, lane.Code);
177
+ });
178
+ }
179
+ // Process stages
180
+ if (workflow.Stages && workflow.Stages.length) {
181
+ workflow.Stages.forEach((stage) => {
182
+ // Find swimlane index
183
+ const swimlaneIndex = this.swimlaneService.findSwimlaneIndexByLaneId(stage.SwimLane);
184
+ if (swimlaneIndex !== -1) {
185
+ const x = stage.Coordinates?.X || 100;
186
+ const y = stage.Coordinates?.Y || 50;
187
+ this.nodeService.addNode(swimlaneIndex, 'stage', x, y, {
188
+ Name: stage.Name,
189
+ Description: stage.Description,
190
+ Duration: stage.Duration,
191
+ PassOnRule: stage.PassOnRule,
192
+ ActorRule: stage.ActorRule,
193
+ MinNoOfActor: stage.MinNoOfActor,
194
+ Tags: stage.Tags || [],
195
+ IsParallel: stage.IsParallel,
196
+ IsEntryPoint: stage.IsEntryPoint,
197
+ IsExitPoint: stage.IsExitPoint,
198
+ Id: stage.Id,
199
+ });
200
+ // Register loaded stage
201
+ this.registerLoadedObject(stage.Id, stage.Code);
202
+ }
203
+ });
204
+ }
205
+ // Process connections/actions
206
+ if (workflow.Actions && workflow.Actions.length) {
207
+ workflow.Actions.forEach((action) => {
208
+ // Find source and target nodes
209
+ const sourceNodeInfo = this.nodeService.findNodeById(action.FromStage);
210
+ const targetNodeInfo = this.nodeService.findNodeById(action.ToStage);
211
+ if (sourceNodeInfo && targetNodeInfo) {
212
+ // Find suitable connection points
213
+ const sourcePoint = sourceNodeInfo.node.connectionPoints?.[0];
214
+ const targetPoint = targetNodeInfo.node.connectionPoints?.[0];
215
+ if (sourcePoint && targetPoint) {
216
+ const connection = {
217
+ id: action.Id,
218
+ sourceNodeId: action.FromStage,
219
+ targetNodeId: action.ToStage,
220
+ sourcePointId: sourcePoint.id,
221
+ targetPointId: targetPoint.id,
222
+ sourceSwimlaneIndex: sourceNodeInfo.swimlaneIndex,
223
+ targetSwimlaneIndex: targetNodeInfo.swimlaneIndex,
224
+ };
225
+ this.state.connections.push(connection);
226
+ // Register loaded action
227
+ this.registerLoadedObject(action.Id, action.Code);
228
+ }
229
+ }
230
+ });
231
+ }
232
+ }
233
+ /**
234
+ * Register a loaded object from the API
235
+ */
236
+ registerLoadedObject(id, code) {
237
+ this.loadedObjectIds[id] = code;
238
+ }
239
+ /**
240
+ * Check if an object was loaded from API
241
+ */
242
+ wasLoadedFromApi(id) {
243
+ return id in this.loadedObjectIds;
244
+ }
245
+ /**
246
+ * Get the code for a loaded object
247
+ */
248
+ getCodeForObject(id) {
249
+ return this.loadedObjectIds[id] || '';
250
+ }
251
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TransformerService, deps: [{ token: i1.WorkflowDesignerState }, { token: i2.SwimlaneService }, { token: i3.NodeManagementService }, { token: i4.ConnectionService }], target: i0.ɵɵFactoryTarget.Injectable });
252
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TransformerService, providedIn: 'root' });
253
+ }
254
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TransformerService, decorators: [{
255
+ type: Injectable,
256
+ args: [{
257
+ providedIn: 'root',
258
+ }]
259
+ }], ctorParameters: () => [{ type: i1.WorkflowDesignerState }, { type: i2.SwimlaneService }, { type: i3.NodeManagementService }, { type: i4.ConnectionService }] });
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL2NvbXBvbmVudHMvd29ya2Zsb3ctZGVzaWduZXIvc2VydmljZXMvdHJhbnNmb3JtZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7QUFRaEUsTUFBTSxPQUFPLGtCQUFrQjtJQUtuQjtJQUNBO0lBQ0E7SUFDQTtJQVBWLDhCQUE4QjtJQUN0QixlQUFlLEdBQThCLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QjtJQUVoRixZQUNVLEtBQTRCLEVBQzVCLGVBQWdDLEVBQ2hDLFdBQWtDLEVBQ2xDLGlCQUFvQztRQUhwQyxVQUFLLEdBQUwsS0FBSyxDQUF1QjtRQUM1QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsZ0JBQVcsR0FBWCxXQUFXLENBQXVCO1FBQ2xDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7SUFDM0MsQ0FBQztJQUVKOztPQUVHO0lBQ0gsd0JBQXdCO1FBQ3RCLDhCQUE4QjtRQUM5QixNQUFNLFFBQVEsR0FBYTtZQUN6Qix1QkFBdUI7WUFDdkIsRUFBRSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7Z0JBQ3BELENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUs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QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBRXhDLHlCQUF5Qjt3QkFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNwRCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxvQkFBb0IsQ0FBQyxFQUFVLEVBQUUsSUFBWTtRQUMzQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxFQUFVO1FBQ3pCLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsRUFBVTtRQUN6QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hDLENBQUM7d0dBelJVLGtCQUFrQjs0R0FBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBXb3JrZmxvd0Rlc2lnbmVyU3RhdGUgfSBmcm9tICcuLi93b3JrZmxvdy1kZXNpZ25lci5zdGF0ZSc7XG5pbXBvcnQgeyBXb3JrZmxvdyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9Xb3JrZmxvdyc7XG5pbXBvcnQgeyBXb3JrZmxvd1N0YWdlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL1dvcmtmbG93U3RhZ2UnO1xuaW1wb3J0IHsgT2JqZWN0U3RhdGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvb2JqZWN0LXN0YXRlJztcbmltcG9ydCB7IFN0YXR1cyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9zdGF0dXMnO1xuaW1wb3J0IHsgVGFza0Fzc2lnbm1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL1Rhc2tBc3NpZ25tZW50VHlwZSc7XG5pbXBvcnQgeyBTdGFnZUFjdG9yUnVsZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9TdGFnZUFjdG9yUnVsZSc7XG5pbXBvcnQgeyBTd2ltbGFuZVNlcnZpY2UgfSBmcm9tICcuL3N3aW1sYW5lLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZU1hbmFnZW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9ub2RlLW1hbmFnZW1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4vY29ubmVjdGlvbi5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRyYW5zZm9ybWVyU2VydmljZSB7XG4gIC8vIE1hcCB0byB0cmFjayBsb2FkZWQgb2JqZWN0c1xuICBwcml2YXRlIGxvYWRlZE9iamVjdElkczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9OyAvLyBGb3JtYXQ6IHsgaWQ6IGNvZGUgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RhdGU6IFdvcmtmbG93RGVzaWduZXJTdGF0ZSxcbiAgICBwcml2YXRlIHN3aW1sYW5lU2VydmljZTogU3dpbWxhbmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbm9kZVNlcnZpY2U6IE5vZGVNYW5hZ2VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIGNvbm5lY3Rpb25TZXJ2aWNlOiBDb25uZWN0aW9uU2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSB0aGUgVUkgbW9kZWwgdG8gYSBXb3JrZmxvdyBBUEkgbW9kZWxcbiAgICovXG4gIHRyYW5zZm9ybVRvV29ya2Zsb3dNb2RlbCgpOiBXb3JrZmxvdyB7XG4gICAgLy8gQ3JlYXRlIGJhc2Ugd29ya2Zsb3cgb2JqZWN0XG4gICAgY29uc3Qgd29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICAgICAgLy8gQmFzZU1vZGVsIHByb3BlcnRpZXNcbiAgICAgIElkOiB0aGlzLndhc0xvYWRlZEZyb21BcGkodGhpcy5zdGF0ZS53b3JrZmxvd0lkIHx8ICcnKVxuICAgICAgICA/IHRoaXMuc3RhdGUud29ya2Zsb3dJZCB8fCAnJ1xuICAgICAgICA6ICcnLFxuICAgICAgQ29kZTogdGhpcy5nZXRDb2RlRm9yT2JqZWN0KHRoaXMuc3RhdGUud29ya2Zsb3dJZCB8fCAnJyksXG4gICAgICBUZW5hbnRJZDogJycsXG4gICAgICBpZDogdGhpcy53YXNMb2FkZWRGcm9tQXBpKHRoaXMuc3RhdGUud29ya2Zsb3dJZCB8fCAnJylcbiAgICAgICAgPyB0aGlzLnN0YXRlLndvcmtmbG93SWQgfHwgJydcbiAgICAgICAgOiAnJyxcbiAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIERhdGFTdGF0ZTogdGhpcy53YXNMb2FkZWRGcm9tQXBpKHRoaXMuc3RhdGUud29ya2Zsb3dJZCB8fCAnJylcbiAgICAgICAgPyBPYmplY3RTdGF0ZS5DaGFuZ2VkXG4gICAgICAgIDogT2JqZWN0U3RhdGUuTmV3LFxuXG4gICAgICAvLyBXb3JrZmxvdyBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgICBOYW1lOiAnTmV3IFdvcmtmbG93JywgLy8gRGVmYXVsdCBuYW1lXG4gICAgICBEZXNjcmlwdGlvbjogJycsIC8vIERlZmF1bHQgZGVzY3JpcHRpb25cbiAgICAgIFN0YWdlRW50cnlSdWxlOiAnJyxcbiAgICAgIEZvcm06IHRoaXMuc3RhdGUud29ya2Zsb3dGb3JtSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgQXNzaWdubWVudFR5cGU6IFRhc2tBc3NpZ25tZW50VHlwZS5BdXRvUm91dGUsXG4gICAgICBPcGVyYXRpb246ICcnLFxuICAgICAgU3RhdHVzOiBTdGF0dXMuQWN0aXZlLFxuICAgICAgQWN0aW9uczogW10sXG4gICAgICBMYW5lczogW10sXG4gICAgICBTdGFnZXM6IFtdLFxuICAgIH07XG5cbiAgICAvLyBUcmFuc2Zvcm0gc3dpbWxhbmVzIHRvIFN3aW1MYW5lW11cbiAgICB3b3JrZmxvdy5MYW5lcyA9IHRoaXMuc3RhdGUuc3dpbWxhbmVzLm1hcCgoc3dpbWxhbmUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBsYW5lSWQgPSBgbGFuZS0ke2luZGV4fWA7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIEJhc2VNb2RlbCBwcm9wZXJ0aWVzXG4gICAgICAgIElkOiAnJyxcbiAgICAgICAgQ29kZTogJycsXG4gICAgICAgIFRlbmFudElkOiAnJyxcbiAgICAgICAgaWQ6IGxhbmVJZCxcbiAgICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG5cbiAgICAgICAgLy8gU3dpbUxhbmUgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgICAgICBXb3JrZmxvdzogd29ya2Zsb3cuSWQsXG4gICAgICAgIFRhZ3M6IHN3aW1sYW5lLnRhZ3MgfHwgW10sXG4gICAgICAgIFBvc2l0aW9uOiBzd2ltbGFuZS5vcmRlcixcbiAgICAgICAgQ29vcmRpbmF0ZXM6IHsgWDogMCwgWTogc3dpbWxhbmUub3JkZXIgKiAyNjMgfSxcbiAgICAgICAgU2l6ZTogeyBXaWR0aDogMzAwMCwgSGVpZ2h0OiAyNjMgfSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gbm9kZXMgdG8gV29ya2Zsb3dTdGFnZVtdXG4gICAgY29uc3Qgc3RhZ2VzOiBXb3JrZmxvd1N0YWdlW10gPSBbXTtcblxuICAgIHRoaXMuc3RhdGUuc3dpbWxhbmVzLmZvckVhY2goKHN3aW1sYW5lLCBzd2ltbGFuZUluZGV4KSA9PiB7XG4gICAgICBzd2ltbGFuZS5ub2Rlcz8uZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSAnc3RhZ2UnKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgc3RhZ2UgZnJvbSB0aGUgbm9kZVxuICAgICAgICAgIGNvbnN0IHN0YWdlOiBXb3JrZmxvd1N0YWdlID0ge1xuICAgICAgICAgICAgLy8gQmFzZU1vZGVsIHByb3BlcnRpZXNcbiAgICAgICAgICAgIElkOiBub2RlLmlkLFxuICAgICAgICAgICAgQ29kZTogdGhpcy5nZXRDb2RlRm9yT2JqZWN0KG5vZGUuaWQpLFxuICAgICAgICAgICAgVGVuYW50SWQ6ICcnLFxuICAgICAgICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICBTZXJ2aWNlTmFtZTogJycsXG4gICAgICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICBEYXRhU3RhdGU6IHRoaXMud2FzTG9hZGVkRnJvbUFwaShub2RlLmlkKVxuICAgICAgICAgICAgICA/IE9iamVjdFN0YXRlLkNoYW5nZWRcbiAgICAgICAgICAgICAgOiBPYmplY3RTdGF0ZS5OZXcsXG5cbiAgICAgICAgICAgIC8vIFdvcmtmbG93U3RhZ2Ugc3BlY2lmaWMgcHJvcGVydGllc1xuICAgICAgICAgICAgV29ya2Zsb3c6IHdvcmtmbG93LklkLFxuICAgICAgICAgICAgTmFtZTogbm9kZS5zdGFnZURhdGE/Lk5hbWUgfHwgJ1VubmFtZWQgU3RhZ2UnLFxuICAgICAgICAgICAgRGVzY3JpcHRpb246IG5vZGUuc3RhZ2VEYXRhPy5EZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICAgIER1cmF0aW9uOiBub2RlLnN0YWdlRGF0YT8uRHVyYXRpb24gfHwgMCxcbiAgICAgICAgICAgIFBhc3NPblJ1bGU6IG5vZGUuc3RhZ2VEYXRhPy5QYXNzT25SdWxlIHx8ICcnLFxuICAgICAgICAgICAgQWN0b3JSdWxlOiBub2RlLnN0YWdlRGF0YT8uQWN0b3JSdWxlIHx8IFN0YWdlQWN0b3JSdWxlLk5vbmUsXG4gICAgICAgICAgICBNaW5Ob09mQWN0b3I6IG5vZGUuc3RhZ2VEYXRhPy5NaW5Ob09mQWN0b3IgfHwgMCxcbiAgICAgICAgICAgIElzUGFyYWxsZWw6IG5vZGUuc3RhZ2VEYXRhPy5Jc1BhcmFsbGVsIHx8IGZhbHNlLFxuICAgICAgICAgICAgSXNFbnRyeVBvaW50OiBub2RlLmlzU3RhcnROb2RlLFxuICAgICAgICAgICAgSXNFeGl0UG9pbnQ6IGZhbHNlLCAvLyBXaWxsIGJlIHVwZGF0ZWQgYmVsb3dcbiAgICAgICAgICAgIFRhZ3M6IG5vZGUuc3RhZ2VEYXRhPy5UYWdzIHx8IFtdLFxuICAgICAgICAgICAgRm9ybTogbm9kZS5zdGFnZURhdGE/LmZvcm1JZCA/IG5vZGUuc3RhZ2VEYXRhLmZvcm1JZCA6ICcnLFxuICAgICAgICAgICAgQWxsb3dNdWx0aVN1YlByb2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgQXNzaWdubWVudFR5cGU6IFRhc2tBc3NpZ25tZW50VHlwZS5BdXRvUm91dGUsXG4gICAgICAgICAgICBTdWJXb3JrRmxvdzogJycsXG4gICAgICAgICAgICBTd2ltTGFuZTogd29ya2Zsb3cuTGFuZXNbc3dpbWxhbmVJbmRleF0uSWQsXG4gICAgICAgICAgICBDb29yZGluYXRlczogeyBYOiBub2RlLngsIFk6IG5vZGUueSB9LFxuICAgICAgICAgICAgSXNTdWJQcm9jZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIEtleTogbm9kZS5zdGFnZURhdGE/LktleSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHN0YWdlcy5wdXNoKHN0YWdlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggc3RhZ2VzIGFyZSBleGl0IHBvaW50cyAobm8gb3V0Z29pbmcgY29ubmVjdGlvbnMpXG4gICAgc3RhZ2VzLmZvckVhY2goKHN0YWdlKSA9PiB7XG4gICAgICBjb25zdCBoYXNPdXRnb2luZ0Nvbm5lY3Rpb25zID0gdGhpcy5zdGF0ZS5jb25uZWN0aW9ucy5zb21lKFxuICAgICAgICAoY29ubikgPT4gY29ubi5zb3VyY2VOb2RlSWQgPT09IHN0YWdlLklkXG4gICAgICApO1xuICAgICAgaWYgKCFoYXNPdXRnb2luZ0Nvbm5lY3Rpb25zKSB7XG4gICAgICAgIHN0YWdlLklzRXhpdFBvaW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRyYW5zZm9ybSBjb25uZWN0aW9ucyB0byBXb3JrZmxvd0FjdGlvbltdXG4gICAgd29ya2Zsb3cuQWN0aW9ucyA9IHRoaXMuc3RhdGUuY29ubmVjdGlvbnMubWFwKChjb25uKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2VOb2RlID0gdGhpcy5ub2RlU2VydmljZS5maW5kTm9kZUJ5SWQoY29ubi5zb3VyY2VOb2RlSWQpPy5ub2RlO1xuICAgICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRoaXMubm9kZVNlcnZpY2UuZmluZE5vZGVCeUlkKGNvbm4udGFyZ2V0Tm9kZUlkKT8ubm9kZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLy8gQmFzZU1vZGVsIHByb3BlcnRpZXNcbiAgICAgICAgSWQ6IGNvbm4uaWQsXG4gICAgICAgIENvZGU6IHRoaXMuZ2V0Q29kZUZvck9iamVjdChjb25uLmlkKSxcbiAgICAgICAgVGVuYW50SWQ6ICcnLFxuICAgICAgICBpZDogY29ubi5pZCxcbiAgICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgRGF0YVN0YXRlOiB0aGlzLndhc0xvYWRlZEZyb21BcGkoY29ubi5pZClcbiAgICAgICAgICA/IE9iamVjdFN0YXRlLkNoYW5nZWRcbiAgICAgICAgICA6IE9iamVjdFN0YXRlLk5ldyxcblxuICAgICAgICAvLyBXb3JrZmxvd0FjdGlvbiBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgICAgIFdvcmtmbG93OiB3b3JrZmxvdy5JZCxcbiAgICAgICAgTmFtZTogYEFjdGlvbiBmcm9tICR7c291cmNlTm9kZT8uc3RhZ2VEYXRhPy5OYW1lIHx8ICdVbmtub3duJ30gdG8gJHtcbiAgICAgICAgICB0YXJnZXROb2RlPy5zdGFnZURhdGE/Lk5hbWUgfHwgJ1Vua25vd24nXG4gICAgICAgIH1gLFxuICAgICAgICBGcm9tU3RhZ2U6IGNvbm4uc291cmNlTm9kZUlkLFxuICAgICAgICBUb1N0YWdlOiBjb25uLnRhcmdldE5vZGVJZCxcbiAgICAgICAgSXNQYXJhbGxlbDogc291cmNlTm9kZT8uc3RhZ2VEYXRhPy5oYXNQYXJhbGxlbCB8fCBmYWxzZSxcbiAgICAgICAgUGFzc09uUnVsZTogJycsIC8vIE9wdGlvbmFsIHByb3BlcnR5XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgd29ya2Zsb3cuU3RhZ2VzID0gc3RhZ2VzO1xuXG4gICAgcmV0dXJuIHdvcmtmbG93O1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIEFQSSB3b3JrZmxvdyBtb2RlbCBhbmQgY29udmVydCB0byBVSSBtb2RlbFxuICAgKi9cbiAgcGFyc2VXb3JrZmxvd0RhdGEod29ya2Zsb3c6IFdvcmtmbG93KTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3Rpbmcgc3RhdGVcbiAgICB0aGlzLnN0YXRlLnN3aW1sYW5lcyA9IFtdO1xuICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMgPSBbXTtcblxuICAgIC8vIFNldCB3b3JrZmxvdyBmb3JtIGlmIGV4aXN0c1xuICAgIGlmICh3b3JrZmxvdy5Gb3JtKSB7XG4gICAgICB0aGlzLnN0YXRlLnNldFdvcmtmbG93Rm9ybShcbiAgICAgICAgd29ya2Zsb3cuRm9ybSxcbiAgICAgICAgd29ya2Zsb3cuRm9ybU5hbWUgfHwgJ1dvcmtmbG93IEZvcm0nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFN0b3JlIHRoZSB3b3JrZmxvdyBJRFxuICAgIHRoaXMuc3RhdGUuc2V0V29ya2Zsb3dJZCh3b3JrZmxvdy5JZCk7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgd29ya2Zsb3cgaXRzZWxmXG4gICAgdGhpcy5yZWdpc3RlckxvYWRlZE9iamVjdCh3b3JrZmxvdy5JZCwgd29ya2Zsb3cuQ29kZSk7XG5cbiAgICAvLyBQcm9jZXNzIHN3aW1sYW5lcyBmaXJzdFxuICAgIGlmICh3b3JrZmxvdy5MYW5lcyAmJiB3b3JrZmxvdy5MYW5lcy5sZW5ndGgpIHtcbiAgICAgIHdvcmtmbG93LkxhbmVzLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBhLlBvc2l0aW9uIC0gYi5Qb3NpdGlvbikuZm9yRWFjaChcbiAgICAgICAgKGxhbmU6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc3dpbWxhbmVTZXJ2aWNlLmFkZFN3aW1sYW5lKFxuICAgICAgICAgICAgbGFuZS5OYW1lIHx8IGBMYW5lICR7bGFuZS5Qb3NpdGlvbn1gLFxuICAgICAgICAgICAgbGFuZS5UYWdzIHx8IFtdXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlZ2lzdGVyIGxvYWRlZCBsYW5lXG4gICAgICAgICAgdGhpcy5yZWdpc3RlckxvYWRlZE9iamVjdChsYW5lLklkLCBsYW5lLkNvZGUpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgc3RhZ2VzXG4gICAgaWYgKHdvcmtmbG93LlN0YWdlcyAmJiB3b3JrZmxvdy5TdGFnZXMubGVuZ3RoKSB7XG4gICAgICB3b3JrZmxvdy5TdGFnZXMuZm9yRWFjaCgoc3RhZ2U6IGFueSkgPT4ge1xuICAgICAgICAvLyBGaW5kIHN3aW1sYW5lIGluZGV4XG4gICAgICAgIGNvbnN0IHN3aW1sYW5lSW5kZXggPSB0aGlzLnN3aW1sYW5lU2VydmljZS5maW5kU3dpbWxhbmVJbmRleEJ5TGFuZUlkKFxuICAgICAgICAgIHN0YWdlLlN3aW1MYW5lXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzd2ltbGFuZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IHggPSBzdGFnZS5Db29yZGluYXRlcz8uWCB8fCAxMDA7XG4gICAgICAgICAgY29uc3QgeSA9IHN0YWdlLkNvb3JkaW5hdGVzPy5ZIHx8IDUwO1xuXG4gICAgICAgICAgdGhpcy5ub2RlU2VydmljZS5hZGROb2RlKHN3aW1sYW5lSW5kZXgsICdzdGFnZScsIHgsIHksIHtcbiAgICAgICAgICAgIE5hbWU6IHN0YWdlLk5hbWUsXG4gICAgICAgICAgICBEZXNjcmlwdGlvbjogc3RhZ2UuRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBEdXJhdGlvbjogc3RhZ2UuRHVyYXRpb24sXG4gICAgICAgICAgICBQYXNzT25SdWxlOiBzdGFnZS5QYXNzT25SdWxlLFxuICAgICAgICAgICAgQWN0b3JSdWxlOiBzdGFnZS5BY3RvclJ1bGUsXG4gICAgICAgICAgICBNaW5Ob09mQWN0b3I6IHN0YWdlLk1pbk5vT2ZBY3RvcixcbiAgICAgICAgICAgIFRhZ3M6IHN0YWdlLlRhZ3MgfHwgW10sXG4gICAgICAgICAgICBJc1BhcmFsbGVsOiBzdGFnZS5Jc1BhcmFsbGVsLFxuICAgICAgICAgICAgSXNFbnRyeVBvaW50OiBzdGFnZS5Jc0VudHJ5UG9pbnQsXG4gICAgICAgICAgICBJc0V4aXRQb2ludDogc3RhZ2UuSXNFeGl0UG9pbnQsXG4gICAgICAgICAgICBJZDogc3RhZ2UuSWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBSZWdpc3RlciBsb2FkZWQgc3RhZ2VcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyTG9hZGVkT2JqZWN0KHN0YWdlLklkLCBzdGFnZS5Db2RlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBjb25uZWN0aW9ucy9hY3Rpb25zXG4gICAgaWYgKHdvcmtmbG93LkFjdGlvbnMgJiYgd29ya2Zsb3cuQWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHdvcmtmbG93LkFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgLy8gRmluZCBzb3VyY2UgYW5kIHRhcmdldCBub2Rlc1xuICAgICAgICBjb25zdCBzb3VyY2VOb2RlSW5mbyA9IHRoaXMubm9kZVNlcnZpY2UuZmluZE5vZGVCeUlkKGFjdGlvbi5Gcm9tU3RhZ2UpO1xuICAgICAgICBjb25zdCB0YXJnZXROb2RlSW5mbyA9IHRoaXMubm9kZVNlcnZpY2UuZmluZE5vZGVCeUlkKGFjdGlvbi5Ub1N0YWdlKTtcblxuICAgICAgICBpZiAoc291cmNlTm9kZUluZm8gJiYgdGFyZ2V0Tm9kZUluZm8pIHtcbiAgICAgICAgICAvLyBGaW5kIHN1aXRhYmxlIGNvbm5lY3Rpb24gcG9pbnRzXG4gICAgICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSBzb3VyY2VOb2RlSW5mby5ub2RlLmNvbm5lY3Rpb25Qb2ludHM/LlswXTtcbiAgICAgICAgICBjb25zdCB0YXJnZXRQb2ludCA9IHRhcmdldE5vZGVJbmZvLm5vZGUuY29ubmVjdGlvblBvaW50cz8uWzBdO1xuXG4gICAgICAgICAgaWYgKHNvdXJjZVBvaW50ICYmIHRhcmdldFBvaW50KSB7XG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0ge1xuICAgICAgICAgICAgICBpZDogYWN0aW9uLklkLFxuICAgICAgICAgICAgICBzb3VyY2VOb2RlSWQ6IGFjdGlvbi5Gcm9tU3RhZ2UsXG4gICAgICAgICAgICAgIHRhcmdldE5vZGVJZDogYWN0aW9uLlRvU3RhZ2UsXG4gICAgICAgICAgICAgIHNvdXJjZVBvaW50SWQ6IHNvdXJjZVBvaW50LmlkLFxuICAgICAgICAgICAgICB0YXJnZXRQb2ludElkOiB0YXJnZXRQb2ludC5pZCxcbiAgICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogc291cmNlTm9kZUluZm8uc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgdGFyZ2V0U3dpbWxhbmVJbmRleDogdGFyZ2V0Tm9kZUluZm8uc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG5cbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGxvYWRlZCBhY3Rpb25cbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJMb2FkZWRPYmplY3QoYWN0aW9uLklkLCBhY3Rpb24uQ29kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsb2FkZWQgb2JqZWN0IGZyb20gdGhlIEFQSVxuICAgKi9cbiAgcmVnaXN0ZXJMb2FkZWRPYmplY3QoaWQ6IHN0cmluZywgY29kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkZWRPYmplY3RJZHNbaWRdID0gY29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3Qgd2FzIGxvYWRlZCBmcm9tIEFQSVxuICAgKi9cbiAgd2FzTG9hZGVkRnJvbUFwaShpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlkIGluIHRoaXMubG9hZGVkT2JqZWN0SWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29kZSBmb3IgYSBsb2FkZWQgb2JqZWN0XG4gICAqL1xuICBnZXRDb2RlRm9yT2JqZWN0KGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvYWRlZE9iamVjdElkc1tpZF0gfHwgJyc7XG4gIH1cbn1cbiJdfQ==