@memberjunction/ng-dashboards 6.1.0-edge.2 → 6.1.0-edge.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.
- package/LICENSE +180 -4
- package/README.md +1 -1
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js +4 -4
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js.map +1 -1
- package/dist/DatabaseDesigner/services/database-designer.engine.d.ts.map +1 -1
- package/dist/DatabaseDesigner/services/database-designer.engine.js +5 -9
- package/dist/DatabaseDesigner/services/database-designer.engine.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +7 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -1
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
- package/dist/Integration/components/widgets/integration-card.component.js +8 -7
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
- package/dist/Integration/components/widgets/run-history-panel.component.d.ts +1 -1
- package/dist/Integration/components/widgets/run-history-panel.component.d.ts.map +1 -1
- package/dist/Integration/components/widgets/run-history-panel.component.js +6 -0
- package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +13 -3
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +13 -2
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/Workflows/components/workflow-run-debug-state.d.ts +41 -0
- package/dist/Workflows/components/workflow-run-debug-state.d.ts.map +1 -0
- package/dist/Workflows/components/workflow-run-debug-state.js +78 -0
- package/dist/Workflows/components/workflow-run-debug-state.js.map +1 -0
- package/dist/Workflows/components/workflow-run-layout.d.ts +83 -0
- package/dist/Workflows/components/workflow-run-layout.d.ts.map +1 -0
- package/dist/Workflows/components/workflow-run-layout.js +133 -0
- package/dist/Workflows/components/workflow-run-layout.js.map +1 -0
- package/dist/Workflows/components/workflow-runs-resource.component.d.ts +146 -3
- package/dist/Workflows/components/workflow-runs-resource.component.d.ts.map +1 -1
- package/dist/Workflows/components/workflow-runs-resource.component.js +1271 -125
- package/dist/Workflows/components/workflow-runs-resource.component.js.map +1 -1
- package/dist/workflows-dashboards.module.d.ts +2 -1
- package/dist/workflows-dashboards.module.d.ts.map +1 -1
- package/dist/workflows-dashboards.module.js +6 -2
- package/dist/workflows-dashboards.module.js.map +1 -1
- package/package.json +64 -64
|
@@ -4,11 +4,17 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
|
|
7
|
+
var WorkflowRunsResourceComponent_1;
|
|
8
|
+
import { ChangeDetectionStrategy, Component, HostListener, ViewChild } from '@angular/core';
|
|
8
9
|
import { CompositeKey, RunView } from '@memberjunction/core';
|
|
10
|
+
import { UserInfoEngine } from '@memberjunction/core-entities';
|
|
11
|
+
import { ComputeTasksToBlock } from '@memberjunction/ai-core-plus';
|
|
9
12
|
import { ParseJSONRecursive, RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
10
13
|
import { BaseDashboard, BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
14
|
+
import { TaskGraphDebuggerComponent } from '@memberjunction/ng-task-graph-editor';
|
|
11
15
|
import { SortWorkflowRuns } from './workflow-run-sorting';
|
|
16
|
+
import { WorkflowRunLayout } from './workflow-run-layout';
|
|
17
|
+
import { EmptyDebugState, ParseWorkflowRunParentBag, TryParseJsonObject, } from './workflow-run-debug-state';
|
|
12
18
|
import * as i0 from "@angular/core";
|
|
13
19
|
import * as i1 from "@angular/common";
|
|
14
20
|
import * as i2 from "@angular/forms";
|
|
@@ -16,16 +22,19 @@ import * as i3 from "@memberjunction/ng-ui-components";
|
|
|
16
22
|
import * as i4 from "@memberjunction/ng-shared-generic";
|
|
17
23
|
import * as i5 from "@memberjunction/ng-task-graph-editor";
|
|
18
24
|
import * as i6 from "@memberjunction/ng-code-editor";
|
|
25
|
+
import * as i7 from "angular-split";
|
|
19
26
|
const _forTrack0 = ($index, $item) => $item.ID;
|
|
27
|
+
const _forTrack1 = ($index, $item) => $item.passNumber;
|
|
28
|
+
const _forTrack2 = ($index, $item) => $item.edgeId;
|
|
20
29
|
function WorkflowRunsResourceComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
21
|
-
i0.ɵɵelement(0, "mj-stat-badge",
|
|
30
|
+
i0.ɵɵelement(0, "mj-stat-badge", 3);
|
|
22
31
|
} if (rf & 2) {
|
|
23
32
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
24
33
|
i0.ɵɵproperty("Count", ctx_r0.VisibleRuns.length)("Total", ctx_r0.Runs.length);
|
|
25
34
|
} }
|
|
26
35
|
function WorkflowRunsResourceComponent_For_10_Template(rf, ctx) { if (rf & 1) {
|
|
27
36
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
28
|
-
i0.ɵɵelementStart(0, "button",
|
|
37
|
+
i0.ɵɵelementStart(0, "button", 15);
|
|
29
38
|
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_For_10_Template_button_click_0_listener() { const status_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnFilterByStatus(status_r3)); });
|
|
30
39
|
i0.ɵɵtext(1);
|
|
31
40
|
i0.ɵɵelementEnd();
|
|
@@ -37,39 +46,39 @@ function WorkflowRunsResourceComponent_For_10_Template(rf, ctx) { if (rf & 1) {
|
|
|
37
46
|
i0.ɵɵtextInterpolate1(" ", status_r3 === "all" ? "All" : status_r3, " ");
|
|
38
47
|
} }
|
|
39
48
|
function WorkflowRunsResourceComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
40
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
49
|
+
i0.ɵɵelement(0, "mj-loading", 10);
|
|
41
50
|
} }
|
|
42
51
|
function WorkflowRunsResourceComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
43
|
-
i0.ɵɵelement(0, "mj-alert",
|
|
52
|
+
i0.ɵɵelement(0, "mj-alert", 11);
|
|
44
53
|
} if (rf & 2) {
|
|
45
54
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
46
55
|
i0.ɵɵproperty("Message", ctx_r0.LoadError);
|
|
47
56
|
} }
|
|
48
57
|
function WorkflowRunsResourceComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
49
|
-
i0.ɵɵelement(0, "mj-empty-state",
|
|
58
|
+
i0.ɵɵelement(0, "mj-empty-state", 12);
|
|
50
59
|
} }
|
|
51
60
|
function WorkflowRunsResourceComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
52
|
-
i0.ɵɵelement(0, "mj-empty-state",
|
|
61
|
+
i0.ɵɵelement(0, "mj-empty-state", 13);
|
|
53
62
|
} }
|
|
54
|
-
function
|
|
63
|
+
function WorkflowRunsResourceComponent_Conditional_16_For_20_Template(rf, ctx) { if (rf & 1) {
|
|
55
64
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
56
|
-
i0.ɵɵelementStart(0, "button",
|
|
57
|
-
i0.ɵɵlistener("click", function
|
|
58
|
-
i0.ɵɵelementStart(1, "span",
|
|
65
|
+
i0.ɵɵelementStart(0, "button", 28);
|
|
66
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_For_20_Template_button_click_0_listener() { const run_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnSelectRun(run_r6)); });
|
|
67
|
+
i0.ɵɵelementStart(1, "span", 29);
|
|
59
68
|
i0.ɵɵtext(2);
|
|
60
69
|
i0.ɵɵelementEnd();
|
|
61
|
-
i0.ɵɵelementStart(3, "span",
|
|
70
|
+
i0.ɵɵelementStart(3, "span", 30);
|
|
62
71
|
i0.ɵɵtext(4);
|
|
63
72
|
i0.ɵɵpipe(5, "date");
|
|
64
73
|
i0.ɵɵelementEnd();
|
|
65
|
-
i0.ɵɵelementStart(6, "span",
|
|
74
|
+
i0.ɵɵelementStart(6, "span", 30);
|
|
66
75
|
i0.ɵɵtext(7);
|
|
67
76
|
i0.ɵɵpipe(8, "date");
|
|
68
77
|
i0.ɵɵelementEnd();
|
|
69
|
-
i0.ɵɵelementStart(9, "span",
|
|
78
|
+
i0.ɵɵelementStart(9, "span", 31);
|
|
70
79
|
i0.ɵɵtext(10);
|
|
71
80
|
i0.ɵɵelementEnd();
|
|
72
|
-
i0.ɵɵelementStart(11, "span",
|
|
81
|
+
i0.ɵɵelementStart(11, "span", 32);
|
|
73
82
|
i0.ɵɵtext(12);
|
|
74
83
|
i0.ɵɵelementEnd()();
|
|
75
84
|
} if (rf & 2) {
|
|
@@ -89,123 +98,689 @@ function WorkflowRunsResourceComponent_Conditional_16_For_19_Template(rf, ctx) {
|
|
|
89
98
|
i0.ɵɵadvance();
|
|
90
99
|
i0.ɵɵtextInterpolate(run_r6.Status);
|
|
91
100
|
} }
|
|
92
|
-
function
|
|
101
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
93
102
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
94
|
-
i0.ɵɵelementStart(0, "button",
|
|
95
|
-
i0.ɵɵlistener("click", function
|
|
96
|
-
i0.ɵɵelement(1, "i",
|
|
103
|
+
i0.ɵɵelementStart(0, "button", 49);
|
|
104
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const selected_r9 = i0.ɵɵnextContext(); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnOpenAgentRun(selected_r9)); });
|
|
105
|
+
i0.ɵɵelement(1, "i", 50);
|
|
97
106
|
i0.ɵɵtext(2, " Agent run ");
|
|
98
107
|
i0.ɵɵelementEnd();
|
|
99
108
|
} }
|
|
100
|
-
function
|
|
101
|
-
i0.ɵɵ
|
|
109
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
110
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
111
|
+
i0.ɵɵelementStart(0, "button", 51);
|
|
112
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.ToggleStepPanel()); });
|
|
113
|
+
i0.ɵɵelement(1, "i", 52);
|
|
114
|
+
i0.ɵɵelementEnd();
|
|
115
|
+
} if (rf & 2) {
|
|
116
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
117
|
+
i0.ɵɵproperty("title", ctx_r0.Layout.StepPanelOpen ? "Hide step details" : "Show step details");
|
|
118
|
+
i0.ɵɵadvance();
|
|
119
|
+
i0.ɵɵclassProp("fa-square-caret-right", ctx_r0.Layout.StepPanelOpen)("fa-square-caret-left", !ctx_r0.Layout.StepPanelOpen);
|
|
120
|
+
} }
|
|
121
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
122
|
+
i0.ɵɵelementStart(0, "code");
|
|
123
|
+
i0.ɵɵtext(1);
|
|
124
|
+
i0.ɵɵelementEnd();
|
|
125
|
+
} if (rf & 2) {
|
|
126
|
+
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
127
|
+
i0.ɵɵadvance();
|
|
128
|
+
i0.ɵɵtextInterpolate(ctx_r0.Stall.conditionText);
|
|
129
|
+
} }
|
|
130
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
131
|
+
i0.ɵɵelementStart(0, "span", 56);
|
|
132
|
+
i0.ɵɵtext(1);
|
|
133
|
+
i0.ɵɵelementEnd();
|
|
134
|
+
} if (rf & 2) {
|
|
135
|
+
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
136
|
+
i0.ɵɵadvance();
|
|
137
|
+
i0.ɵɵtextInterpolate(ctx_r0.Stall.reason);
|
|
102
138
|
} }
|
|
103
|
-
function
|
|
139
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
104
140
|
const _r11 = i0.ɵɵgetCurrentView();
|
|
105
|
-
i0.ɵɵelementStart(0, "button",
|
|
106
|
-
i0.ɵɵlistener("click", function
|
|
107
|
-
i0.ɵɵ
|
|
141
|
+
i0.ɵɵelementStart(0, "div", 57)(1, "button", 58);
|
|
142
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_8_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnOverrideEdge(ctx_r0.Stall.edgeID, "true")); });
|
|
143
|
+
i0.ɵɵtext(2, " Answer true ");
|
|
144
|
+
i0.ɵɵelementEnd();
|
|
145
|
+
i0.ɵɵelementStart(3, "button", 59);
|
|
146
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_8_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnOverrideEdge(ctx_r0.Stall.edgeID, "false")); });
|
|
147
|
+
i0.ɵɵtext(4, " Answer false ");
|
|
148
|
+
i0.ɵɵelementEnd();
|
|
149
|
+
i0.ɵɵelementStart(5, "button", 49);
|
|
150
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_8_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnDismissStall()); });
|
|
151
|
+
i0.ɵɵtext(6, " Leave held ");
|
|
152
|
+
i0.ɵɵelementEnd()();
|
|
153
|
+
} if (rf & 2) {
|
|
154
|
+
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
155
|
+
i0.ɵɵadvance();
|
|
156
|
+
i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
|
|
157
|
+
i0.ɵɵadvance(2);
|
|
158
|
+
i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
|
|
159
|
+
} }
|
|
160
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
161
|
+
i0.ɵɵelementStart(0, "div", 46)(1, "div", 53);
|
|
162
|
+
i0.ɵɵelement(2, "i", 54);
|
|
163
|
+
i0.ɵɵelementStart(3, "div", 55)(4, "span");
|
|
164
|
+
i0.ɵɵtext(5);
|
|
165
|
+
i0.ɵɵelementEnd();
|
|
166
|
+
i0.ɵɵconditionalCreate(6, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_6_Template, 2, 1, "code");
|
|
167
|
+
i0.ɵɵconditionalCreate(7, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_7_Template, 2, 1, "span", 56);
|
|
168
|
+
i0.ɵɵelementEnd()();
|
|
169
|
+
i0.ɵɵconditionalCreate(8, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_8_Template, 7, 2, "div", 57);
|
|
170
|
+
i0.ɵɵelementEnd();
|
|
171
|
+
} if (rf & 2) {
|
|
172
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
173
|
+
i0.ɵɵattribute("data-kind", ctx_r0.Stall.kind);
|
|
174
|
+
i0.ɵɵadvance(5);
|
|
175
|
+
i0.ɵɵtextInterpolate(ctx_r0.Stall.message);
|
|
176
|
+
i0.ɵɵadvance();
|
|
177
|
+
i0.ɵɵconditional(ctx_r0.Stall.conditionText ? 6 : -1);
|
|
178
|
+
i0.ɵɵadvance();
|
|
179
|
+
i0.ɵɵconditional(ctx_r0.Stall.reason ? 7 : -1);
|
|
180
|
+
i0.ɵɵadvance();
|
|
181
|
+
i0.ɵɵconditional(ctx_r0.Stall.kind === "held" && ctx_r0.Stall.edgeID ? 8 : -1);
|
|
182
|
+
} }
|
|
183
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_5_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
184
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
185
|
+
i0.ɵɵelementStart(0, "button", 49);
|
|
186
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_5_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnReplayReset()); });
|
|
187
|
+
i0.ɵɵtext(1, "Now");
|
|
188
|
+
i0.ɵɵelementEnd();
|
|
189
|
+
} }
|
|
190
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
191
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
192
|
+
i0.ɵɵelementStart(0, "div", 63);
|
|
193
|
+
i0.ɵɵelement(1, "i", 68);
|
|
194
|
+
i0.ɵɵelementStart(2, "input", 69);
|
|
195
|
+
i0.ɵɵlistener("input", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_5_Template_input_input_2_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnReplayScrub($event.target.value)); });
|
|
196
|
+
i0.ɵɵelementEnd();
|
|
197
|
+
i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_5_Conditional_3_Template, 2, 0, "button", 38);
|
|
198
|
+
i0.ɵɵelementEnd();
|
|
199
|
+
} if (rf & 2) {
|
|
200
|
+
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
201
|
+
i0.ɵɵadvance(2);
|
|
202
|
+
i0.ɵɵproperty("value", ctx_r0.ReplayPercent ?? 100);
|
|
203
|
+
i0.ɵɵadvance();
|
|
204
|
+
i0.ɵɵconditional(ctx_r0.ReplayPercent !== null ? 3 : -1);
|
|
205
|
+
} }
|
|
206
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
207
|
+
i0.ɵɵelementStart(0, "span", 70);
|
|
208
|
+
i0.ɵɵelement(1, "i", 72);
|
|
108
209
|
i0.ɵɵtext(2);
|
|
109
210
|
i0.ɵɵelementEnd();
|
|
110
|
-
|
|
111
|
-
i0.ɵɵ
|
|
211
|
+
} if (rf & 2) {
|
|
212
|
+
i0.ɵɵnextContext(2);
|
|
213
|
+
const GraphDebug_r15 = i0.ɵɵreference(4);
|
|
214
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
215
|
+
i0.ɵɵadvance(2);
|
|
216
|
+
i0.ɵɵtextInterpolate1(" Paused at ", ctx_r0.StepName(GraphDebug_r15.PausedAtTaskID), " ");
|
|
217
|
+
} }
|
|
218
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
219
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
220
|
+
i0.ɵɵelementStart(0, "button", 73);
|
|
221
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_For_3_Template_button_click_0_listener() { const id_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnSelectBreakpoint(id_r17)); });
|
|
222
|
+
i0.ɵɵelement(1, "i", 74);
|
|
223
|
+
i0.ɵɵtext(2);
|
|
224
|
+
i0.ɵɵelementStart(3, "span", 75);
|
|
225
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_For_3_Template_span_click_3_listener($event) { const id_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r0 = i0.ɵɵnextContext(5); ctx_r0.OnRemoveBreakpoint(id_r17); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
226
|
+
i0.ɵɵtext(4, "\u00D7");
|
|
227
|
+
i0.ɵɵelementEnd()();
|
|
228
|
+
} if (rf & 2) {
|
|
229
|
+
const id_r17 = ctx.$implicit;
|
|
230
|
+
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
231
|
+
i0.ɵɵadvance(2);
|
|
232
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.StepName(id_r17), " ");
|
|
233
|
+
} }
|
|
234
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
235
|
+
i0.ɵɵelementStart(0, "div", 64);
|
|
236
|
+
i0.ɵɵconditionalCreate(1, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_Conditional_1_Template, 3, 1, "span", 70);
|
|
237
|
+
i0.ɵɵrepeaterCreate(2, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_For_3_Template, 5, 1, "button", 71, i0.ɵɵrepeaterTrackByIdentity);
|
|
112
238
|
i0.ɵɵelementEnd();
|
|
113
|
-
|
|
114
|
-
i0.ɵɵ
|
|
239
|
+
} if (rf & 2) {
|
|
240
|
+
i0.ɵɵnextContext();
|
|
241
|
+
const GraphDebug_r15 = i0.ɵɵreference(4);
|
|
242
|
+
i0.ɵɵadvance();
|
|
243
|
+
i0.ɵɵconditional(GraphDebug_r15.PausedAtTaskID ? 1 : -1);
|
|
244
|
+
i0.ɵɵadvance();
|
|
245
|
+
i0.ɵɵrepeater(GraphDebug_r15.Breakpoints);
|
|
246
|
+
} }
|
|
247
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_7_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
248
|
+
i0.ɵɵelementStart(0, "span", 78);
|
|
249
|
+
i0.ɵɵtext(1);
|
|
250
|
+
i0.ɵɵelementEnd();
|
|
251
|
+
} if (rf & 2) {
|
|
252
|
+
const tick_r18 = ctx.$implicit;
|
|
253
|
+
i0.ɵɵclassProp("wfr-tick-held", (tick_r18.heldCount ?? 0) > 0);
|
|
254
|
+
i0.ɵɵadvance();
|
|
255
|
+
i0.ɵɵtextInterpolate4(" #", tick_r18.passNumber, " \u00B7 ready ", tick_r18.eligibleCount ?? 0, " \u00B7 held ", tick_r18.heldCount ?? 0, " \u00B7 took ", tick_r18.claimedCount ?? 0, " ");
|
|
256
|
+
} }
|
|
257
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_7_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
258
|
+
i0.ɵɵelementStart(0, "span", 77);
|
|
259
|
+
i0.ɵɵtext(1, "\u23F8 paused \u2014 nothing new starts");
|
|
260
|
+
i0.ɵɵelementEnd();
|
|
261
|
+
} }
|
|
262
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
263
|
+
i0.ɵɵelementStart(0, "div", 65);
|
|
264
|
+
i0.ɵɵrepeaterCreate(1, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_7_For_2_Template, 2, 6, "span", 76, _forTrack1);
|
|
265
|
+
i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_7_Conditional_3_Template, 2, 0, "span", 77);
|
|
266
|
+
i0.ɵɵelementEnd();
|
|
267
|
+
} if (rf & 2) {
|
|
268
|
+
i0.ɵɵnextContext();
|
|
269
|
+
const GraphDebug_r15 = i0.ɵɵreference(4);
|
|
270
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
271
|
+
i0.ɵɵadvance();
|
|
272
|
+
i0.ɵɵrepeater(ctx_r0.EngineTicks);
|
|
273
|
+
i0.ɵɵadvance(2);
|
|
274
|
+
i0.ɵɵconditional(GraphDebug_r15.Paused ? 3 : -1);
|
|
275
|
+
} }
|
|
276
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
277
|
+
i0.ɵɵelement(0, "mj-loading", 67);
|
|
278
|
+
} }
|
|
279
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
280
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
281
|
+
i0.ɵɵelementStart(0, "button", 83);
|
|
282
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_For_2_Template_button_click_0_listener() { const step_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnSelectStep(step_r20)); });
|
|
283
|
+
i0.ɵɵelementStart(1, "span", 84);
|
|
284
|
+
i0.ɵɵtext(2);
|
|
285
|
+
i0.ɵɵelementEnd();
|
|
286
|
+
i0.ɵɵelementStart(3, "span", 85);
|
|
287
|
+
i0.ɵɵtext(4);
|
|
115
288
|
i0.ɵɵelementEnd()();
|
|
116
289
|
} if (rf & 2) {
|
|
117
|
-
const
|
|
290
|
+
const step_r20 = ctx.$implicit;
|
|
118
291
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
119
|
-
i0.ɵɵclassProp("wfr-step-selected",
|
|
120
|
-
i0.ɵɵattribute("data-status",
|
|
292
|
+
i0.ɵɵclassProp("wfr-step-selected", step_r20.ID === ctx_r0.SelectedStepID);
|
|
293
|
+
i0.ɵɵattribute("data-status", step_r20.Status);
|
|
294
|
+
i0.ɵɵadvance(2);
|
|
295
|
+
i0.ɵɵtextInterpolate(step_r20.Name);
|
|
296
|
+
i0.ɵɵadvance(2);
|
|
297
|
+
i0.ɵɵtextInterpolate(step_r20.StepType || "Step");
|
|
298
|
+
} }
|
|
299
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
300
|
+
i0.ɵɵelementStart(0, "span", 87);
|
|
301
|
+
i0.ɵɵtext(1);
|
|
302
|
+
i0.ɵɵelementEnd();
|
|
303
|
+
} if (rf & 2) {
|
|
304
|
+
const ctx_r0 = i0.ɵɵnextContext(6);
|
|
305
|
+
i0.ɵɵadvance();
|
|
306
|
+
i0.ɵɵtextInterpolate1("forced ", ctx_r0.SelectedEdgeOverride);
|
|
307
|
+
} }
|
|
308
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
309
|
+
i0.ɵɵelementStart(0, "code");
|
|
310
|
+
i0.ɵɵtext(1);
|
|
311
|
+
i0.ɵɵelementEnd();
|
|
312
|
+
} if (rf & 2) {
|
|
313
|
+
const edge_r21 = i0.ɵɵnextContext();
|
|
314
|
+
i0.ɵɵadvance();
|
|
315
|
+
i0.ɵɵtextInterpolate(edge_r21.Condition);
|
|
316
|
+
} }
|
|
317
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
318
|
+
i0.ɵɵelementStart(0, "span");
|
|
319
|
+
i0.ɵɵtext(1, "Unconditional \u2014 this path always runs.");
|
|
320
|
+
i0.ɵɵelementEnd();
|
|
321
|
+
} }
|
|
322
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
323
|
+
const _r23 = i0.ɵɵgetCurrentView();
|
|
324
|
+
i0.ɵɵelementStart(0, "button", 93);
|
|
325
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r23); const edge_r21 = i0.ɵɵnextContext(2); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnOverrideEdge(edge_r21.ID, null)); });
|
|
326
|
+
i0.ɵɵtext(1, "Clear override");
|
|
327
|
+
i0.ɵɵelementEnd();
|
|
328
|
+
} if (rf & 2) {
|
|
329
|
+
const ctx_r0 = i0.ɵɵnextContext(7);
|
|
330
|
+
i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
|
|
331
|
+
} }
|
|
332
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
333
|
+
const _r22 = i0.ɵɵgetCurrentView();
|
|
334
|
+
i0.ɵɵelementStart(0, "div", 90)(1, "button", 58);
|
|
335
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r22); const edge_r21 = i0.ɵɵnextContext(); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnOverrideEdge(edge_r21.ID, "true")); });
|
|
336
|
+
i0.ɵɵtext(2, "Answer true");
|
|
337
|
+
i0.ɵɵelementEnd();
|
|
338
|
+
i0.ɵɵelementStart(3, "button", 59);
|
|
339
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r22); const edge_r21 = i0.ɵɵnextContext(); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnOverrideEdge(edge_r21.ID, "false")); });
|
|
340
|
+
i0.ɵɵtext(4, "Answer false");
|
|
341
|
+
i0.ɵɵelementEnd();
|
|
342
|
+
i0.ɵɵconditionalCreate(5, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Conditional_5_Template, 2, 1, "button", 92);
|
|
343
|
+
i0.ɵɵelementEnd();
|
|
344
|
+
} if (rf & 2) {
|
|
345
|
+
const ctx_r0 = i0.ɵɵnextContext(6);
|
|
346
|
+
i0.ɵɵadvance();
|
|
347
|
+
i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
|
|
121
348
|
i0.ɵɵadvance(2);
|
|
122
|
-
i0.ɵɵ
|
|
349
|
+
i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
|
|
123
350
|
i0.ɵɵadvance(2);
|
|
124
|
-
i0.ɵɵ
|
|
351
|
+
i0.ɵɵconditional(ctx_r0.SelectedEdgeOverride ? 5 : -1);
|
|
352
|
+
} }
|
|
353
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
354
|
+
i0.ɵɵelementStart(0, "p", 91);
|
|
355
|
+
i0.ɵɵtext(1, "Skip the target step instead of overriding an unconditional path.");
|
|
356
|
+
i0.ɵɵelementEnd();
|
|
357
|
+
} }
|
|
358
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
359
|
+
i0.ɵɵelementStart(0, "div", 81)(1, "div", 86)(2, "span");
|
|
360
|
+
i0.ɵɵtext(3);
|
|
361
|
+
i0.ɵɵelementEnd();
|
|
362
|
+
i0.ɵɵconditionalCreate(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_4_Template, 2, 1, "span", 87);
|
|
363
|
+
i0.ɵɵelementEnd();
|
|
364
|
+
i0.ɵɵelementStart(5, "div", 88)(6, "span", 89);
|
|
365
|
+
i0.ɵɵtext(7, "Condition");
|
|
366
|
+
i0.ɵɵelementEnd();
|
|
367
|
+
i0.ɵɵconditionalCreate(8, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_8_Template, 2, 1, "code")(9, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_9_Template, 2, 0, "span");
|
|
368
|
+
i0.ɵɵelementEnd();
|
|
369
|
+
i0.ɵɵconditionalCreate(10, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Template, 6, 3, "div", 90)(11, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_11_Template, 2, 0, "p", 91);
|
|
370
|
+
i0.ɵɵelementEnd();
|
|
371
|
+
} if (rf & 2) {
|
|
372
|
+
const edge_r21 = ctx;
|
|
373
|
+
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
374
|
+
i0.ɵɵadvance(3);
|
|
375
|
+
i0.ɵɵtextInterpolate2("", ctx_r0.SelectedEdgeFromName, " \u2192 ", ctx_r0.SelectedEdgeToName);
|
|
125
376
|
i0.ɵɵadvance();
|
|
126
|
-
i0.ɵɵ
|
|
377
|
+
i0.ɵɵconditional(ctx_r0.SelectedEdgeOverride ? 4 : -1);
|
|
378
|
+
i0.ɵɵadvance(4);
|
|
379
|
+
i0.ɵɵconditional((edge_r21.Condition == null ? null : edge_r21.Condition.trim()) ? 8 : 9);
|
|
380
|
+
i0.ɵɵadvance(2);
|
|
381
|
+
i0.ɵɵconditional(ctx_r0.SelectedEdgeIsConditional ? 10 : 11);
|
|
382
|
+
} }
|
|
383
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
384
|
+
i0.ɵɵtext(0);
|
|
385
|
+
} if (rf & 2) {
|
|
386
|
+
const progress_r26 = i0.ɵɵnextContext();
|
|
387
|
+
i0.ɵɵtextInterpolate1(" (", progress_r26.progressPercent, "%) ");
|
|
388
|
+
} }
|
|
389
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
390
|
+
i0.ɵɵelementStart(0, "div", 88)(1, "span", 89);
|
|
391
|
+
i0.ɵɵtext(2, "Doing now");
|
|
392
|
+
i0.ɵɵelementEnd();
|
|
393
|
+
i0.ɵɵelementStart(3, "span");
|
|
394
|
+
i0.ɵɵtext(4);
|
|
395
|
+
i0.ɵɵconditionalCreate(5, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_8_Conditional_5_Template, 1, 1);
|
|
396
|
+
i0.ɵɵelementEnd()();
|
|
397
|
+
} if (rf & 2) {
|
|
398
|
+
const progress_r26 = ctx;
|
|
399
|
+
i0.ɵɵadvance(4);
|
|
400
|
+
i0.ɵɵtextInterpolate1("", progress_r26.progressMessage, " ");
|
|
127
401
|
i0.ɵɵadvance();
|
|
128
|
-
i0.ɵɵ
|
|
402
|
+
i0.ɵɵconditional(progress_r26.progressPercent != null ? 5 : -1);
|
|
129
403
|
} }
|
|
130
|
-
function
|
|
131
|
-
i0.ɵɵ
|
|
404
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Case_4_Template(rf, ctx) { if (rf & 1) {
|
|
405
|
+
i0.ɵɵtext(0);
|
|
406
|
+
} if (rf & 2) {
|
|
407
|
+
const claim_r27 = i0.ɵɵnextContext();
|
|
408
|
+
i0.ɵɵtextInterpolate1(" ", claim_r27.claimedBy, " \u2014 working ");
|
|
409
|
+
} }
|
|
410
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Case_5_Template(rf, ctx) { if (rf & 1) {
|
|
411
|
+
i0.ɵɵtext(0);
|
|
412
|
+
} if (rf & 2) {
|
|
413
|
+
const claim_r27 = i0.ɵɵnextContext();
|
|
414
|
+
i0.ɵɵtextInterpolate1(" ", claim_r27.claimedBy, " \u2014 lost, will be requeued ");
|
|
415
|
+
} }
|
|
416
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Case_6_Template(rf, ctx) { if (rf & 1) {
|
|
417
|
+
i0.ɵɵtext(0, " requeued by the engine ");
|
|
418
|
+
} }
|
|
419
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
420
|
+
i0.ɵɵelementStart(0, "div", 88)(1, "span", 89);
|
|
421
|
+
i0.ɵɵtext(2, "Worker");
|
|
422
|
+
i0.ɵɵelementEnd();
|
|
423
|
+
i0.ɵɵelementStart(3, "span");
|
|
424
|
+
i0.ɵɵconditionalCreate(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Case_4_Template, 1, 1)(5, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Case_5_Template, 1, 1)(6, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Case_6_Template, 1, 0);
|
|
425
|
+
i0.ɵɵelementEnd()();
|
|
426
|
+
} if (rf & 2) {
|
|
427
|
+
let tmp_11_0;
|
|
428
|
+
const claim_r27 = ctx;
|
|
429
|
+
i0.ɵɵclassProp("wfr-insp-bad", claim_r27.claimEvent === "heartbeat-lost");
|
|
430
|
+
i0.ɵɵadvance(4);
|
|
431
|
+
i0.ɵɵconditional((tmp_11_0 = claim_r27.claimEvent) === "claimed" ? 4 : tmp_11_0 === "heartbeat-lost" ? 5 : tmp_11_0 === "reclaimed" ? 6 : -1);
|
|
432
|
+
} }
|
|
433
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Case_2_Template(rf, ctx) { if (rf & 1) {
|
|
434
|
+
i0.ɵɵtext(0, " Path taken ");
|
|
435
|
+
} }
|
|
436
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Case_3_Template(rf, ctx) { if (rf & 1) {
|
|
437
|
+
i0.ɵɵtext(0, " Path not taken ");
|
|
438
|
+
} }
|
|
439
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Case_4_Template(rf, ctx) { if (rf & 1) {
|
|
440
|
+
i0.ɵɵtext(0, " Path can't be answered ");
|
|
441
|
+
} }
|
|
442
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
443
|
+
i0.ɵɵelementStart(0, "code");
|
|
444
|
+
i0.ɵɵtext(1);
|
|
445
|
+
i0.ɵɵelementEnd();
|
|
446
|
+
} if (rf & 2) {
|
|
447
|
+
const verdict_r28 = i0.ɵɵnextContext().$implicit;
|
|
448
|
+
i0.ɵɵadvance();
|
|
449
|
+
i0.ɵɵtextInterpolate(verdict_r28.conditionText);
|
|
450
|
+
} }
|
|
451
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
452
|
+
i0.ɵɵtext(0);
|
|
453
|
+
} if (rf & 2) {
|
|
454
|
+
const verdict_r28 = i0.ɵɵnextContext().$implicit;
|
|
455
|
+
i0.ɵɵtextInterpolate1(" \u2014 ", verdict_r28.reason, " ");
|
|
456
|
+
} }
|
|
457
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
458
|
+
i0.ɵɵelementStart(0, "div", 88)(1, "span", 89);
|
|
459
|
+
i0.ɵɵconditionalCreate(2, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Case_2_Template, 1, 0)(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Case_3_Template, 1, 0)(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Case_4_Template, 1, 0);
|
|
460
|
+
i0.ɵɵelementEnd();
|
|
461
|
+
i0.ɵɵelementStart(5, "span");
|
|
462
|
+
i0.ɵɵconditionalCreate(6, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Conditional_6_Template, 2, 1, "code");
|
|
463
|
+
i0.ɵɵconditionalCreate(7, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Conditional_7_Template, 1, 1);
|
|
464
|
+
i0.ɵɵelementEnd()();
|
|
465
|
+
} if (rf & 2) {
|
|
466
|
+
let tmp_19_0;
|
|
467
|
+
const verdict_r28 = ctx.$implicit;
|
|
468
|
+
i0.ɵɵattribute("data-verdict", verdict_r28.verdict);
|
|
469
|
+
i0.ɵɵadvance(2);
|
|
470
|
+
i0.ɵɵconditional((tmp_19_0 = verdict_r28.verdict) === "satisfied" ? 2 : tmp_19_0 === "notTaken" ? 3 : tmp_19_0 === "held" ? 4 : -1);
|
|
471
|
+
i0.ɵɵadvance(4);
|
|
472
|
+
i0.ɵɵconditional(verdict_r28.conditionText ? 6 : -1);
|
|
473
|
+
i0.ɵɵadvance();
|
|
474
|
+
i0.ɵɵconditional(verdict_r28.reason ? 7 : -1);
|
|
475
|
+
} }
|
|
476
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
477
|
+
i0.ɵɵelementStart(0, "div", 88)(1, "span", 89);
|
|
478
|
+
i0.ɵɵtext(2, "If this step fails");
|
|
479
|
+
i0.ɵɵelementEnd();
|
|
480
|
+
i0.ɵɵelementStart(3, "span");
|
|
481
|
+
i0.ɵɵtext(4);
|
|
482
|
+
i0.ɵɵelementEnd()();
|
|
483
|
+
} if (rf & 2) {
|
|
484
|
+
const whatIf_r29 = ctx;
|
|
485
|
+
i0.ɵɵadvance(4);
|
|
486
|
+
i0.ɵɵtextInterpolate2("", whatIf_r29.BlockedCount, " step", whatIf_r29.BlockedCount === 1 ? "" : "s", " can no longer run");
|
|
487
|
+
} }
|
|
488
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
489
|
+
const _r30 = i0.ɵɵgetCurrentView();
|
|
490
|
+
i0.ɵɵelementStart(0, "button", 103);
|
|
491
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r30); const step_r25 = i0.ɵɵnextContext(2); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnSkipStep(step_r25)); });
|
|
492
|
+
i0.ɵɵelement(1, "i", 104);
|
|
493
|
+
i0.ɵɵtext(2, " Skip step ");
|
|
494
|
+
i0.ɵɵelementEnd();
|
|
495
|
+
} if (rf & 2) {
|
|
496
|
+
const ctx_r0 = i0.ɵɵnextContext(7);
|
|
497
|
+
i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
|
|
498
|
+
} }
|
|
499
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
500
|
+
const _r31 = i0.ɵɵgetCurrentView();
|
|
501
|
+
i0.ɵɵelementStart(0, "button", 59);
|
|
502
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r31); const step_r25 = i0.ɵɵnextContext(2); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OpenEditInput(step_r25)); });
|
|
503
|
+
i0.ɵɵelement(1, "i", 105);
|
|
132
504
|
i0.ɵɵtext(2);
|
|
133
505
|
i0.ɵɵelementEnd();
|
|
134
|
-
|
|
506
|
+
} if (rf & 2) {
|
|
507
|
+
const step_r25 = i0.ɵɵnextContext(2);
|
|
508
|
+
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
509
|
+
i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
|
|
510
|
+
i0.ɵɵadvance(2);
|
|
511
|
+
i0.ɵɵtextInterpolate1(" ", step_r25.Status === "Failed" ? "Edit input & retry" : "Edit input", " ");
|
|
512
|
+
} }
|
|
513
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
514
|
+
const _r32 = i0.ɵɵgetCurrentView();
|
|
515
|
+
i0.ɵɵelementStart(0, "button", 59);
|
|
516
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r32); const step_r25 = i0.ɵɵnextContext(2); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnRetryStep(step_r25)); });
|
|
517
|
+
i0.ɵɵelement(1, "i", 106);
|
|
518
|
+
i0.ɵɵtext(2, " Retry ");
|
|
519
|
+
i0.ɵɵelementEnd();
|
|
520
|
+
} if (rf & 2) {
|
|
521
|
+
const ctx_r0 = i0.ɵɵnextContext(7);
|
|
522
|
+
i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
|
|
523
|
+
} }
|
|
524
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
525
|
+
const _r33 = i0.ɵɵgetCurrentView();
|
|
526
|
+
i0.ɵɵelementStart(0, "button", 107);
|
|
527
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r33); const step_r25 = i0.ɵɵnextContext(2); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OpenForceComplete(step_r25)); });
|
|
528
|
+
i0.ɵɵelement(1, "i", 108);
|
|
529
|
+
i0.ɵɵtext(2, " Force complete ");
|
|
530
|
+
i0.ɵɵelementEnd();
|
|
531
|
+
} if (rf & 2) {
|
|
532
|
+
const ctx_r0 = i0.ɵɵnextContext(7);
|
|
533
|
+
i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
|
|
534
|
+
} }
|
|
535
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
536
|
+
i0.ɵɵelementStart(0, "div", 90);
|
|
537
|
+
i0.ɵɵconditionalCreate(1, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_1_Template, 3, 1, "button", 100);
|
|
538
|
+
i0.ɵɵconditionalCreate(2, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_2_Template, 3, 2, "button", 101);
|
|
539
|
+
i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_3_Template, 3, 1, "button", 101);
|
|
540
|
+
i0.ɵɵconditionalCreate(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_4_Template, 3, 1, "button", 102);
|
|
135
541
|
i0.ɵɵelementEnd();
|
|
136
542
|
} if (rf & 2) {
|
|
543
|
+
const step_r25 = i0.ɵɵnextContext();
|
|
137
544
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
545
|
+
i0.ɵɵadvance();
|
|
546
|
+
i0.ɵɵconditional(step_r25.Status === "Pending" ? 1 : -1);
|
|
547
|
+
i0.ɵɵadvance();
|
|
548
|
+
i0.ɵɵconditional(ctx_r0.CanEditInput(step_r25) ? 2 : -1);
|
|
549
|
+
i0.ɵɵadvance();
|
|
550
|
+
i0.ɵɵconditional(step_r25.Status === "Failed" ? 3 : -1);
|
|
551
|
+
i0.ɵɵadvance();
|
|
552
|
+
i0.ɵɵconditional(ctx_r0.CanForceComplete(step_r25) ? 4 : -1);
|
|
553
|
+
} }
|
|
554
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
555
|
+
i0.ɵɵelementStart(0, "span", 110);
|
|
556
|
+
i0.ɵɵtext(1);
|
|
557
|
+
i0.ɵɵelementEnd();
|
|
558
|
+
} if (rf & 2) {
|
|
559
|
+
const ctx_r0 = i0.ɵɵnextContext(7);
|
|
560
|
+
i0.ɵɵadvance();
|
|
561
|
+
i0.ɵɵtextInterpolate(ctx_r0.EditInputError);
|
|
562
|
+
} }
|
|
563
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
564
|
+
const _r34 = i0.ɵɵgetCurrentView();
|
|
565
|
+
i0.ɵɵelementStart(0, "div", 97)(1, "span", 89);
|
|
566
|
+
i0.ɵɵtext(2);
|
|
567
|
+
i0.ɵɵelementEnd();
|
|
568
|
+
i0.ɵɵelementStart(3, "p", 91);
|
|
569
|
+
i0.ɵɵtext(4, "Applies to this run only. Invalid JSON is refused here.");
|
|
570
|
+
i0.ɵɵelementEnd();
|
|
571
|
+
i0.ɵɵelementStart(5, "textarea", 109);
|
|
572
|
+
i0.ɵɵtwoWayListener("ngModelChange", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Template_textarea_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r0 = i0.ɵɵnextContext(6); i0.ɵɵtwoWayBindingSet(ctx_r0.EditInputJson, $event) || (ctx_r0.EditInputJson = $event); return i0.ɵɵresetView($event); });
|
|
573
|
+
i0.ɵɵelementEnd();
|
|
574
|
+
i0.ɵɵconditionalCreate(6, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Conditional_6_Template, 2, 1, "span", 110);
|
|
575
|
+
i0.ɵɵelementStart(7, "div", 90)(8, "button", 58);
|
|
576
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r34); const step_r25 = i0.ɵɵnextContext(); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.SubmitEditInput(step_r25)); });
|
|
577
|
+
i0.ɵɵtext(9);
|
|
578
|
+
i0.ɵɵelementEnd();
|
|
579
|
+
i0.ɵɵelementStart(10, "button", 49);
|
|
580
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r34); const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.EditInputOpen = false); });
|
|
581
|
+
i0.ɵɵtext(11, "Cancel");
|
|
582
|
+
i0.ɵɵelementEnd()()();
|
|
583
|
+
} if (rf & 2) {
|
|
584
|
+
const step_r25 = i0.ɵɵnextContext();
|
|
585
|
+
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
586
|
+
i0.ɵɵadvance(2);
|
|
587
|
+
i0.ɵɵtextInterpolate(step_r25.Status === "Failed" ? "Edit input and retry" : "Edit input");
|
|
588
|
+
i0.ɵɵadvance(3);
|
|
589
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.EditInputJson);
|
|
590
|
+
i0.ɵɵadvance();
|
|
591
|
+
i0.ɵɵconditional(ctx_r0.EditInputError ? 6 : -1);
|
|
138
592
|
i0.ɵɵadvance(2);
|
|
139
|
-
i0.ɵɵ
|
|
593
|
+
i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
|
|
594
|
+
i0.ɵɵadvance();
|
|
595
|
+
i0.ɵɵtextInterpolate1(" ", step_r25.Status === "Failed" ? "Apply & retry" : "Apply", " ");
|
|
596
|
+
} }
|
|
597
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
598
|
+
i0.ɵɵelementStart(0, "span", 110);
|
|
599
|
+
i0.ɵɵtext(1);
|
|
600
|
+
i0.ɵɵelementEnd();
|
|
601
|
+
} if (rf & 2) {
|
|
602
|
+
const ctx_r0 = i0.ɵɵnextContext(7);
|
|
140
603
|
i0.ɵɵadvance();
|
|
141
|
-
i0.ɵɵ
|
|
604
|
+
i0.ɵɵtextInterpolate(ctx_r0.ForceCompleteError);
|
|
142
605
|
} }
|
|
143
|
-
function
|
|
144
|
-
i0.ɵɵ
|
|
606
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
607
|
+
const _r35 = i0.ɵɵgetCurrentView();
|
|
608
|
+
i0.ɵɵelementStart(0, "div", 98)(1, "span", 89);
|
|
609
|
+
i0.ɵɵtext(2, "Force complete");
|
|
610
|
+
i0.ɵɵelementEnd();
|
|
611
|
+
i0.ɵɵelementStart(3, "p", 91);
|
|
612
|
+
i0.ɵɵtext(4, "Downstream conditions will evaluate against this output as if the step had produced it. Type the step name to confirm.");
|
|
613
|
+
i0.ɵɵelementEnd();
|
|
614
|
+
i0.ɵɵelementStart(5, "textarea", 111);
|
|
615
|
+
i0.ɵɵtwoWayListener("ngModelChange", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Template_textarea_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r0 = i0.ɵɵnextContext(6); i0.ɵɵtwoWayBindingSet(ctx_r0.ForceCompleteJson, $event) || (ctx_r0.ForceCompleteJson = $event); return i0.ɵɵresetView($event); });
|
|
616
|
+
i0.ɵɵelementEnd();
|
|
617
|
+
i0.ɵɵelementStart(6, "input", 112);
|
|
618
|
+
i0.ɵɵtwoWayListener("ngModelChange", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Template_input_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r0 = i0.ɵɵnextContext(6); i0.ɵɵtwoWayBindingSet(ctx_r0.ForceCompleteName, $event) || (ctx_r0.ForceCompleteName = $event); return i0.ɵɵresetView($event); });
|
|
619
|
+
i0.ɵɵelementEnd();
|
|
620
|
+
i0.ɵɵconditionalCreate(7, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Conditional_7_Template, 2, 1, "span", 110);
|
|
621
|
+
i0.ɵɵelementStart(8, "div", 90)(9, "button", 107);
|
|
622
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r35); const step_r25 = i0.ɵɵnextContext(); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.SubmitForceComplete(step_r25)); });
|
|
623
|
+
i0.ɵɵtext(10, "Force complete");
|
|
624
|
+
i0.ɵɵelementEnd();
|
|
625
|
+
i0.ɵɵelementStart(11, "button", 49);
|
|
626
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r35); const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.ForceCompleteOpen = false); });
|
|
627
|
+
i0.ɵɵtext(12, "Cancel");
|
|
628
|
+
i0.ɵɵelementEnd()()();
|
|
629
|
+
} if (rf & 2) {
|
|
630
|
+
const step_r25 = i0.ɵɵnextContext();
|
|
631
|
+
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
632
|
+
i0.ɵɵadvance(5);
|
|
633
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.ForceCompleteJson);
|
|
634
|
+
i0.ɵɵadvance();
|
|
635
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.ForceCompleteName);
|
|
636
|
+
i0.ɵɵproperty("placeholder", "Type \u201C" + step_r25.Name + "\u201D to confirm");
|
|
637
|
+
i0.ɵɵadvance();
|
|
638
|
+
i0.ɵɵconditional(ctx_r0.ForceCompleteError ? 7 : -1);
|
|
639
|
+
i0.ɵɵadvance(2);
|
|
640
|
+
i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
|
|
145
641
|
} }
|
|
146
|
-
function
|
|
147
|
-
i0.ɵɵ
|
|
148
|
-
i0.ɵɵ
|
|
642
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
643
|
+
const _r24 = i0.ɵɵgetCurrentView();
|
|
644
|
+
i0.ɵɵelementStart(0, "div", 81)(1, "div", 86)(2, "span");
|
|
645
|
+
i0.ɵɵtext(3);
|
|
646
|
+
i0.ɵɵelementEnd();
|
|
647
|
+
i0.ɵɵelementStart(4, "span", 36);
|
|
648
|
+
i0.ɵɵtext(5);
|
|
649
|
+
i0.ɵɵelementEnd()();
|
|
650
|
+
i0.ɵɵelementStart(6, "button", 94);
|
|
651
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Template_button_click_6_listener() { const step_r25 = i0.ɵɵrestoreView(_r24); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnBreakpointToggled({ TaskID: step_r25.ID, Enabled: !ctx_r0.HasBreakpoint(step_r25.ID) })); });
|
|
652
|
+
i0.ɵɵelement(7, "i", 95);
|
|
653
|
+
i0.ɵɵelementEnd();
|
|
654
|
+
i0.ɵɵconditionalCreate(8, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_8_Template, 6, 2, "div", 88);
|
|
655
|
+
i0.ɵɵconditionalCreate(9, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Template, 7, 3, "div", 96);
|
|
656
|
+
i0.ɵɵrepeaterCreate(10, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Template, 8, 4, "div", 88, _forTrack2);
|
|
657
|
+
i0.ɵɵconditionalCreate(12, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_12_Template, 5, 2, "div", 88);
|
|
658
|
+
i0.ɵɵconditionalCreate(13, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Template, 5, 4, "div", 90);
|
|
659
|
+
i0.ɵɵconditionalCreate(14, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Template, 12, 5, "div", 97);
|
|
660
|
+
i0.ɵɵconditionalCreate(15, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Template, 13, 5, "div", 98);
|
|
661
|
+
i0.ɵɵelement(16, "mj-task-graph-variables", 99);
|
|
149
662
|
i0.ɵɵelementEnd();
|
|
150
|
-
i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_4_Conditional_3_Template, 4, 4, "div", 51)(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_4_Conditional_4_Template, 1, 0, "mj-empty-state", 52);
|
|
151
663
|
} if (rf & 2) {
|
|
152
|
-
let
|
|
664
|
+
let tmp_17_0;
|
|
665
|
+
let tmp_18_0;
|
|
666
|
+
let tmp_20_0;
|
|
667
|
+
const step_r25 = ctx;
|
|
668
|
+
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
669
|
+
i0.ɵɵadvance(3);
|
|
670
|
+
i0.ɵɵtextInterpolate(step_r25.Name);
|
|
671
|
+
i0.ɵɵadvance();
|
|
672
|
+
i0.ɵɵattribute("data-status", step_r25.Status);
|
|
673
|
+
i0.ɵɵadvance();
|
|
674
|
+
i0.ɵɵtextInterpolate(step_r25.Status);
|
|
675
|
+
i0.ɵɵadvance();
|
|
676
|
+
i0.ɵɵclassProp("wfr-bp-on", ctx_r0.HasBreakpoint(step_r25.ID));
|
|
677
|
+
i0.ɵɵproperty("disabled", ctx_r0.ControlBusy)("title", ctx_r0.HasBreakpoint(step_r25.ID) ? "Remove breakpoint" : "Break before this step");
|
|
678
|
+
i0.ɵɵattribute("aria-pressed", ctx_r0.HasBreakpoint(step_r25.ID));
|
|
679
|
+
i0.ɵɵadvance();
|
|
680
|
+
i0.ɵɵclassProp("fa-solid", ctx_r0.HasBreakpoint(step_r25.ID))("fa-regular", !ctx_r0.HasBreakpoint(step_r25.ID));
|
|
681
|
+
i0.ɵɵadvance();
|
|
682
|
+
i0.ɵɵconditional((tmp_17_0 = ctx_r0.SelectedStepProgress) ? 8 : -1, tmp_17_0);
|
|
683
|
+
i0.ɵɵadvance();
|
|
684
|
+
i0.ɵɵconditional((tmp_18_0 = ctx_r0.SelectedStepClaim) ? 9 : -1, tmp_18_0);
|
|
685
|
+
i0.ɵɵadvance();
|
|
686
|
+
i0.ɵɵrepeater(ctx_r0.SelectedStepVerdicts);
|
|
687
|
+
i0.ɵɵadvance(2);
|
|
688
|
+
i0.ɵɵconditional((tmp_20_0 = ctx_r0.SelectedStepWhatIf) ? 12 : -1, tmp_20_0);
|
|
689
|
+
i0.ɵɵadvance();
|
|
690
|
+
i0.ɵɵconditional(step_r25.Status === "Pending" || step_r25.Status === "Failed" || ctx_r0.CanForceComplete(step_r25) ? 13 : -1);
|
|
691
|
+
i0.ɵɵadvance();
|
|
692
|
+
i0.ɵɵconditional(ctx_r0.EditInputOpen ? 14 : -1);
|
|
693
|
+
i0.ɵɵadvance();
|
|
694
|
+
i0.ɵɵconditional(ctx_r0.ForceCompleteOpen ? 15 : -1);
|
|
695
|
+
i0.ɵɵadvance();
|
|
696
|
+
i0.ɵɵproperty("InputPayload", ctx_r0.StepPayload(step_r25, "InputPayload"))("OutputPayload", ctx_r0.StepPayload(step_r25, "OutputPayload"))("Invocation", ctx_r0.Invocation);
|
|
697
|
+
} }
|
|
698
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
699
|
+
i0.ɵɵelement(0, "mj-empty-state", 82);
|
|
700
|
+
} }
|
|
701
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
702
|
+
i0.ɵɵelementStart(0, "div", 79);
|
|
703
|
+
i0.ɵɵrepeaterCreate(1, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_For_2_Template, 5, 5, "button", 80, _forTrack0);
|
|
704
|
+
i0.ɵɵelementEnd();
|
|
705
|
+
i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Template, 12, 5, "div", 81)(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Template, 17, 21, "div", 81)(5, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_5_Template, 1, 0, "mj-empty-state", 82);
|
|
706
|
+
} if (rf & 2) {
|
|
707
|
+
let tmp_7_0;
|
|
153
708
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
154
709
|
i0.ɵɵadvance();
|
|
155
710
|
i0.ɵɵrepeater(ctx_r0.SelectedSteps);
|
|
156
711
|
i0.ɵɵadvance(2);
|
|
157
|
-
i0.ɵɵconditional((
|
|
712
|
+
i0.ɵɵconditional((tmp_7_0 = ctx_r0.InspectorMode === "edge" && ctx_r0.SelectedEdge) ? 3 : (tmp_7_0 = ctx_r0.SelectedStep) ? 4 : 5, tmp_7_0);
|
|
158
713
|
} }
|
|
159
|
-
function
|
|
160
|
-
const
|
|
161
|
-
i0.ɵɵelementStart(0, "
|
|
162
|
-
i0.ɵɵlistener("
|
|
163
|
-
i0.ɵɵ
|
|
164
|
-
i0.ɵɵ
|
|
165
|
-
i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_3_Template, 1, 0, "mj-loading", 48)(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_4_Template, 5, 1);
|
|
714
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
715
|
+
const _r12 = i0.ɵɵgetCurrentView();
|
|
716
|
+
i0.ɵɵelementStart(0, "as-split", 60);
|
|
717
|
+
i0.ɵɵlistener("dragEnd", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_as_split_dragEnd_0_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnStepSplitDragEnd($event.sizes)); });
|
|
718
|
+
i0.ɵɵelementStart(1, "as-split-area", 17)(2, "div", 61)(3, "mj-task-graph-debugger", 62, 0);
|
|
719
|
+
i0.ɵɵlistener("NodeSelected", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_mj_task_graph_debugger_NodeSelected_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnGraphNodeSelected($event)); })("ConnectionSelected", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_mj_task_graph_debugger_ConnectionSelected_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnGraphConnectionSelected($event)); })("LegendToggled", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_mj_task_graph_debugger_LegendToggled_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnLegendToggled($event)); })("Settled", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_mj_task_graph_debugger_Settled_3_listener() { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnCanvasSettled()); })("Frame", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_mj_task_graph_debugger_Frame_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFrame($event)); })("PausedChange", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_mj_task_graph_debugger_PausedChange_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.DebugPaused = $event); });
|
|
166
720
|
i0.ɵɵelementEnd();
|
|
721
|
+
i0.ɵɵconditionalCreate(5, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_5_Template, 4, 2, "div", 63);
|
|
722
|
+
i0.ɵɵconditionalCreate(6, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_Template, 4, 1, "div", 64);
|
|
723
|
+
i0.ɵɵconditionalCreate(7, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_7_Template, 4, 1, "div", 65);
|
|
724
|
+
i0.ɵɵelementEnd()();
|
|
725
|
+
i0.ɵɵelementStart(8, "as-split-area", 26)(9, "div", 66);
|
|
726
|
+
i0.ɵɵconditionalCreate(10, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_10_Template, 1, 0, "mj-loading", 67)(11, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Template, 6, 1);
|
|
727
|
+
i0.ɵɵelementEnd()()();
|
|
167
728
|
} if (rf & 2) {
|
|
729
|
+
const GraphDebug_r15 = i0.ɵɵreference(4);
|
|
168
730
|
const selected_r9 = i0.ɵɵnextContext();
|
|
169
731
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
732
|
+
i0.ɵɵproperty("direction", ctx_r0.InnerSplitDirection)("gutterSize", 8);
|
|
170
733
|
i0.ɵɵadvance();
|
|
171
|
-
i0.ɵɵproperty("
|
|
734
|
+
i0.ɵɵproperty("size", ctx_r0.Layout.StepPanelOpen ? ctx_r0.Layout.StepSplitSizes[0] : 100)("minSize", 25);
|
|
735
|
+
i0.ɵɵadvance(2);
|
|
736
|
+
i0.ɵɵproperty("Provider", ctx_r0.ProviderToUse)("ParentTaskID", selected_r9.ID)("WorkflowName", selected_r9.Name)("LiveUpdates", selected_r9.Status === "Running" || selected_r9.Status === "In Progress")("ReplayAt", ctx_r0.ReplayAt)("ShowLegend", ctx_r0.Layout.ShowLegend);
|
|
172
737
|
i0.ɵɵadvance(2);
|
|
173
|
-
i0.ɵɵconditional(ctx_r0.
|
|
738
|
+
i0.ɵɵconditional(ctx_r0.CanReplay ? 5 : -1);
|
|
739
|
+
i0.ɵɵadvance();
|
|
740
|
+
i0.ɵɵconditional(GraphDebug_r15.Breakpoints.length > 0 || GraphDebug_r15.PausedAtTaskID ? 6 : -1);
|
|
741
|
+
i0.ɵɵadvance();
|
|
742
|
+
i0.ɵɵconditional(ctx_r0.EngineTicks.length > 0 ? 7 : -1);
|
|
743
|
+
i0.ɵɵadvance();
|
|
744
|
+
i0.ɵɵproperty("size", ctx_r0.Layout.StepPanelOpen ? ctx_r0.Layout.StepSplitSizes[1] : 0)("minSize", 20)("visible", ctx_r0.Layout.StepPanelOpen);
|
|
745
|
+
i0.ɵɵadvance(2);
|
|
746
|
+
i0.ɵɵconditional(ctx_r0.StepsLoading ? 10 : 11);
|
|
174
747
|
} }
|
|
175
|
-
function
|
|
176
|
-
i0.ɵɵelementStart(0, "div",
|
|
177
|
-
i0.ɵɵelement(1, "mj-code-editor",
|
|
748
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
749
|
+
i0.ɵɵelementStart(0, "div", 48);
|
|
750
|
+
i0.ɵɵelement(1, "mj-code-editor", 113);
|
|
178
751
|
i0.ɵɵelementEnd();
|
|
179
752
|
} if (rf & 2) {
|
|
180
753
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
181
754
|
i0.ɵɵadvance();
|
|
182
755
|
i0.ɵɵproperty("ngModel", ctx_r0.SelectedRunJson)("language", "json")("readonly", true);
|
|
183
756
|
} }
|
|
184
|
-
function
|
|
757
|
+
function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
185
758
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
186
|
-
i0.ɵɵelementStart(0, "aside",
|
|
759
|
+
i0.ɵɵelementStart(0, "aside", 27)(1, "header", 33)(2, "div", 34)(3, "span", 35);
|
|
187
760
|
i0.ɵɵtext(4);
|
|
188
761
|
i0.ɵɵelementEnd();
|
|
189
|
-
i0.ɵɵelementStart(5, "span",
|
|
762
|
+
i0.ɵɵelementStart(5, "span", 36);
|
|
190
763
|
i0.ɵɵtext(6);
|
|
191
764
|
i0.ɵɵelementEnd()();
|
|
192
|
-
i0.ɵɵelementStart(7, "div",
|
|
193
|
-
i0.ɵɵconditionalCreate(8,
|
|
194
|
-
i0.ɵɵ
|
|
195
|
-
i0.ɵɵ
|
|
196
|
-
i0.ɵɵ
|
|
765
|
+
i0.ɵɵelementStart(7, "div", 37);
|
|
766
|
+
i0.ɵɵconditionalCreate(8, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_8_Template, 3, 0, "button", 38);
|
|
767
|
+
i0.ɵɵconditionalCreate(9, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_9_Template, 2, 5, "button", 39);
|
|
768
|
+
i0.ɵɵelementStart(10, "button", 40);
|
|
769
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Template_button_click_10_listener() { const selected_r9 = i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnSelectRun(selected_r9)); });
|
|
770
|
+
i0.ɵɵelement(11, "i", 41);
|
|
197
771
|
i0.ɵɵelementEnd()()();
|
|
198
|
-
i0.ɵɵelementStart(
|
|
199
|
-
i0.ɵɵlistener("click", function
|
|
200
|
-
i0.ɵɵelement(
|
|
201
|
-
i0.ɵɵtext(
|
|
202
|
-
i0.ɵɵelementEnd();
|
|
203
|
-
i0.ɵɵelementStart(
|
|
204
|
-
i0.ɵɵlistener("click", function
|
|
205
|
-
i0.ɵɵelement(
|
|
206
|
-
i0.ɵɵtext(
|
|
772
|
+
i0.ɵɵelementStart(12, "div", 42)(13, "button", 43);
|
|
773
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnDetailTab("graph")); });
|
|
774
|
+
i0.ɵɵelement(14, "i", 44);
|
|
775
|
+
i0.ɵɵtext(15, " Workflow ");
|
|
776
|
+
i0.ɵɵelementEnd();
|
|
777
|
+
i0.ɵɵelementStart(16, "button", 43);
|
|
778
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnDetailTab("json")); });
|
|
779
|
+
i0.ɵɵelement(17, "i", 45);
|
|
780
|
+
i0.ɵɵtext(18, " JSON ");
|
|
207
781
|
i0.ɵɵelementEnd()();
|
|
208
|
-
i0.ɵɵconditionalCreate(
|
|
782
|
+
i0.ɵɵconditionalCreate(19, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Template, 9, 5, "div", 46);
|
|
783
|
+
i0.ɵɵconditionalCreate(20, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template, 12, 17, "as-split", 47)(21, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_21_Template, 2, 3, "div", 48);
|
|
209
784
|
i0.ɵɵelementEnd();
|
|
210
785
|
} if (rf & 2) {
|
|
211
786
|
const selected_r9 = ctx;
|
|
@@ -218,48 +793,57 @@ function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Template(rf
|
|
|
218
793
|
i0.ɵɵtextInterpolate(selected_r9.Status);
|
|
219
794
|
i0.ɵɵadvance(2);
|
|
220
795
|
i0.ɵɵconditional(selected_r9.AgentRunID ? 8 : -1);
|
|
796
|
+
i0.ɵɵadvance();
|
|
797
|
+
i0.ɵɵconditional(ctx_r0.DetailTab === "graph" ? 9 : -1);
|
|
221
798
|
i0.ɵɵadvance(4);
|
|
222
799
|
i0.ɵɵclassProp("wfr-tab-active", ctx_r0.DetailTab === "graph");
|
|
223
800
|
i0.ɵɵadvance(3);
|
|
224
801
|
i0.ɵɵclassProp("wfr-tab-active", ctx_r0.DetailTab === "json");
|
|
225
802
|
i0.ɵɵadvance(3);
|
|
226
|
-
i0.ɵɵconditional(ctx_r0.
|
|
803
|
+
i0.ɵɵconditional(ctx_r0.Stall ? 19 : -1);
|
|
804
|
+
i0.ɵɵadvance();
|
|
805
|
+
i0.ɵɵconditional(ctx_r0.DetailTab === "graph" ? 20 : 21);
|
|
227
806
|
} }
|
|
228
807
|
function WorkflowRunsResourceComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
229
808
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
230
|
-
i0.ɵɵelementStart(0, "
|
|
231
|
-
i0.ɵɵlistener("
|
|
232
|
-
i0.ɵɵ
|
|
233
|
-
i0.ɵɵ
|
|
234
|
-
i0.ɵɵ
|
|
235
|
-
i0.ɵɵ
|
|
236
|
-
i0.ɵɵ
|
|
237
|
-
i0.ɵɵ
|
|
238
|
-
i0.ɵɵ
|
|
239
|
-
i0.ɵɵ
|
|
240
|
-
i0.ɵɵ
|
|
241
|
-
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("CompletedAt")); });
|
|
242
|
-
i0.ɵɵtext(10, " Ended ");
|
|
243
|
-
i0.ɵɵelement(11, "i", 19);
|
|
244
|
-
i0.ɵɵelementEnd();
|
|
245
|
-
i0.ɵɵelementStart(12, "button", 21);
|
|
246
|
-
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("Duration")); });
|
|
247
|
-
i0.ɵɵtext(13, " Duration ");
|
|
248
|
-
i0.ɵɵelement(14, "i", 19);
|
|
249
|
-
i0.ɵɵelementEnd();
|
|
250
|
-
i0.ɵɵelementStart(15, "button", 22);
|
|
251
|
-
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("Status")); });
|
|
252
|
-
i0.ɵɵtext(16, " Status ");
|
|
253
|
-
i0.ɵɵelement(17, "i", 19);
|
|
254
|
-
i0.ɵɵelementEnd()();
|
|
255
|
-
i0.ɵɵrepeaterCreate(18, WorkflowRunsResourceComponent_Conditional_16_For_19_Template, 13, 14, "button", 23, _forTrack0);
|
|
809
|
+
i0.ɵɵelementStart(0, "as-split", 16);
|
|
810
|
+
i0.ɵɵlistener("dragEnd", function WorkflowRunsResourceComponent_Conditional_16_Template_as_split_dragEnd_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSplitDragEnd($event.sizes)); });
|
|
811
|
+
i0.ɵɵelementStart(1, "as-split-area", 17)(2, "div", 18)(3, "div", 19)(4, "button", 20);
|
|
812
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("Name")); });
|
|
813
|
+
i0.ɵɵtext(5, " Workflow ");
|
|
814
|
+
i0.ɵɵelement(6, "i", 21);
|
|
815
|
+
i0.ɵɵelementEnd();
|
|
816
|
+
i0.ɵɵelementStart(7, "button", 22);
|
|
817
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("StartedAt")); });
|
|
818
|
+
i0.ɵɵtext(8, " Started ");
|
|
819
|
+
i0.ɵɵelement(9, "i", 21);
|
|
256
820
|
i0.ɵɵelementEnd();
|
|
257
|
-
i0.ɵɵ
|
|
821
|
+
i0.ɵɵelementStart(10, "button", 22);
|
|
822
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("CompletedAt")); });
|
|
823
|
+
i0.ɵɵtext(11, " Ended ");
|
|
824
|
+
i0.ɵɵelement(12, "i", 21);
|
|
258
825
|
i0.ɵɵelementEnd();
|
|
826
|
+
i0.ɵɵelementStart(13, "button", 23);
|
|
827
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("Duration")); });
|
|
828
|
+
i0.ɵɵtext(14, " Duration ");
|
|
829
|
+
i0.ɵɵelement(15, "i", 21);
|
|
830
|
+
i0.ɵɵelementEnd();
|
|
831
|
+
i0.ɵɵelementStart(16, "button", 24);
|
|
832
|
+
i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("Status")); });
|
|
833
|
+
i0.ɵɵtext(17, " Status ");
|
|
834
|
+
i0.ɵɵelement(18, "i", 21);
|
|
835
|
+
i0.ɵɵelementEnd()();
|
|
836
|
+
i0.ɵɵrepeaterCreate(19, WorkflowRunsResourceComponent_Conditional_16_For_20_Template, 13, 14, "button", 25, _forTrack0);
|
|
837
|
+
i0.ɵɵelementEnd()();
|
|
838
|
+
i0.ɵɵelementStart(21, "as-split-area", 26);
|
|
839
|
+
i0.ɵɵconditionalCreate(22, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Template, 22, 11, "aside", 27);
|
|
840
|
+
i0.ɵɵelementEnd()();
|
|
259
841
|
} if (rf & 2) {
|
|
260
|
-
let
|
|
842
|
+
let tmp_14_0;
|
|
261
843
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
262
|
-
i0.ɵɵ
|
|
844
|
+
i0.ɵɵproperty("gutterSize", 8)("disabled", !ctx_r0.SelectedRun);
|
|
845
|
+
i0.ɵɵadvance();
|
|
846
|
+
i0.ɵɵproperty("size", ctx_r0.SelectedRun ? ctx_r0.Layout.SplitSizes[0] : 100)("minSize", 20);
|
|
263
847
|
i0.ɵɵadvance(5);
|
|
264
848
|
i0.ɵɵproperty("ngClass", ctx_r0.SortIcon("Name"));
|
|
265
849
|
i0.ɵɵadvance(3);
|
|
@@ -273,8 +857,12 @@ function WorkflowRunsResourceComponent_Conditional_16_Template(rf, ctx) { if (rf
|
|
|
273
857
|
i0.ɵɵadvance();
|
|
274
858
|
i0.ɵɵrepeater(ctx_r0.VisibleRuns);
|
|
275
859
|
i0.ɵɵadvance(2);
|
|
276
|
-
i0.ɵɵ
|
|
860
|
+
i0.ɵɵproperty("size", ctx_r0.SelectedRun ? ctx_r0.Layout.SplitSizes[1] : 0)("minSize", 25)("visible", !!ctx_r0.SelectedRun);
|
|
861
|
+
i0.ɵɵadvance();
|
|
862
|
+
i0.ɵɵconditional((tmp_14_0 = ctx_r0.SelectedRun) ? 22 : -1, tmp_14_0);
|
|
277
863
|
} }
|
|
864
|
+
/** Below this the detail pane cannot hold a canvas AND a JSON pane side by side. */
|
|
865
|
+
const STACK_INNER_BELOW_PX = 1100;
|
|
278
866
|
/**
|
|
279
867
|
* How the JSON panes unpack nested JSON.
|
|
280
868
|
*
|
|
@@ -297,6 +885,7 @@ const STATUS_FILTERS = ['all', 'Running', 'Complete', 'Failed', 'Cancelled'];
|
|
|
297
885
|
* to count them, and the same unit the promotion picker offers.
|
|
298
886
|
*/
|
|
299
887
|
let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends BaseDashboard {
|
|
888
|
+
static { WorkflowRunsResourceComponent_1 = this; }
|
|
300
889
|
cdr;
|
|
301
890
|
IsLoading = false;
|
|
302
891
|
LoadError = null;
|
|
@@ -319,6 +908,21 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
|
|
|
319
908
|
StepsLoading = false;
|
|
320
909
|
/** The step whose JSON is showing, or null when none is selected. */
|
|
321
910
|
SelectedStepID = null;
|
|
911
|
+
/**
|
|
912
|
+
* Pane sizes, panel visibility and the legend toggle — the rules live in `workflow-run-layout`,
|
|
913
|
+
* which is pure and therefore testable without standing up Angular.
|
|
914
|
+
*
|
|
915
|
+
* Preferences go through `UserInfoEngine` (`MJ: User Settings`), never `localStorage`: a pane
|
|
916
|
+
* width that vanishes when someone opens a different browser is exactly the kind of preference
|
|
917
|
+
* people notice when it disappears. Reads are a synchronous cache hit; writes are debounced,
|
|
918
|
+
* because dragging a splitter fires continuously.
|
|
919
|
+
*/
|
|
920
|
+
Layout = new WorkflowRunLayout({
|
|
921
|
+
Get: (key) => UserInfoEngine.Instance.GetSetting(key),
|
|
922
|
+
Set: (key, value) => UserInfoEngine.Instance.SetSettingDebounced(key, value),
|
|
923
|
+
});
|
|
924
|
+
/** Stacked rather than side-by-side when the detail pane is too narrow for both. */
|
|
925
|
+
InnerSplitDirection = 'horizontal';
|
|
322
926
|
constructor(cdr) {
|
|
323
927
|
super();
|
|
324
928
|
this.cdr = cdr;
|
|
@@ -327,11 +931,46 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
|
|
|
327
931
|
return 'Workflow Runs';
|
|
328
932
|
}
|
|
329
933
|
initDashboard() {
|
|
330
|
-
|
|
934
|
+
this.Layout.Restore();
|
|
935
|
+
this.applyViewportRules();
|
|
331
936
|
}
|
|
332
937
|
ngAfterViewInit() {
|
|
333
938
|
this.publishAgentContext();
|
|
334
939
|
}
|
|
940
|
+
/** Re-evaluates the stacking rule; the detail pane's width follows the window's. */
|
|
941
|
+
onViewportResized() {
|
|
942
|
+
const before = this.InnerSplitDirection;
|
|
943
|
+
this.applyViewportRules();
|
|
944
|
+
if (before !== this.InnerSplitDirection)
|
|
945
|
+
this.cdr.markForCheck();
|
|
946
|
+
}
|
|
947
|
+
applyViewportRules() {
|
|
948
|
+
// Three columns on a laptop gives each about 400px and the canvas stops being usable, so the
|
|
949
|
+
// inner pair stacks instead. Mirrors the outer split's existing breakpoint rather than
|
|
950
|
+
// inventing a second responsive scheme.
|
|
951
|
+
this.InnerSplitDirection = window.innerWidth < STACK_INNER_BELOW_PX ? 'vertical' : 'horizontal';
|
|
952
|
+
}
|
|
953
|
+
OnSplitDragEnd(sizes) {
|
|
954
|
+
this.Layout.OnSplitDragEnd(sizes);
|
|
955
|
+
}
|
|
956
|
+
OnStepSplitDragEnd(sizes) {
|
|
957
|
+
this.Layout.OnStepSplitDragEnd(sizes);
|
|
958
|
+
}
|
|
959
|
+
ToggleStepPanel() {
|
|
960
|
+
this.Layout.ToggleStepPanel();
|
|
961
|
+
this.cdr.markForCheck();
|
|
962
|
+
}
|
|
963
|
+
/**
|
|
964
|
+
* The legend was toggled on the canvas toolbar — remember it.
|
|
965
|
+
*
|
|
966
|
+
* Driven from the toolbar rather than a button of our own: the canvas already has a legend
|
|
967
|
+
* control in the place people look for one, and adding a second in the header would be two
|
|
968
|
+
* controls for one setting, free to disagree.
|
|
969
|
+
*/
|
|
970
|
+
OnLegendToggled(show) {
|
|
971
|
+
this.Layout.SetLegendVisible(show);
|
|
972
|
+
this.cdr.markForCheck();
|
|
973
|
+
}
|
|
335
974
|
/** The rows after the active filter and search, in the chosen order — what the template renders. */
|
|
336
975
|
get VisibleRuns() {
|
|
337
976
|
const wanted = this.SearchText.trim().toLowerCase();
|
|
@@ -437,10 +1076,420 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
|
|
|
437
1076
|
this.SelectedRunID = closing ? null : run.ID;
|
|
438
1077
|
this.SelectedStepID = null;
|
|
439
1078
|
this.SelectedSteps = [];
|
|
1079
|
+
this.SelectedDeps = [];
|
|
1080
|
+
this.SelectedEdgeID = null;
|
|
1081
|
+
this.InspectorMode = 'step';
|
|
1082
|
+
this.resetEditors();
|
|
1083
|
+
this.detachFrames();
|
|
1084
|
+
this.ReplayPercent = null;
|
|
1085
|
+
this.GraphSettled = false;
|
|
1086
|
+
this.DebugState = EmptyDebugState();
|
|
1087
|
+
this.Invocation = {};
|
|
1088
|
+
// Frames are owned by <mj-task-graph-debugger>; it re-emits them for stall/engine chrome.
|
|
440
1089
|
this.publishAgentContext();
|
|
441
1090
|
this.cdr.markForCheck();
|
|
442
|
-
if (!closing)
|
|
1091
|
+
if (!closing) {
|
|
443
1092
|
void this.loadSteps(run.ID);
|
|
1093
|
+
void this.loadDebugState(run.ID);
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
// ─── live console: frames ────────────────────────────────────────────────
|
|
1097
|
+
//
|
|
1098
|
+
// <mj-task-graph-debugger> owns the frame subscription and re-emits each one. This host only
|
|
1099
|
+
// listens for stall / engine-tick chrome. Frames are ADVISORY; the widget's row reads remain
|
|
1100
|
+
// the truth, reconciled on settlement.
|
|
1101
|
+
/** The newest frame, bound straight into the run view for sub-second canvas updates. */
|
|
1102
|
+
GraphDebug;
|
|
1103
|
+
LatestFrame = null;
|
|
1104
|
+
/** The engine's recent heartbeat ticks (`PassCompleted`), newest last. Bounded. */
|
|
1105
|
+
EngineTicks = [];
|
|
1106
|
+
/** Everything seen this session for the selected run, newest first. Bounded. */
|
|
1107
|
+
FrameLog = [];
|
|
1108
|
+
/** Whether the selected run is paused (from `GraphPaused`/`GraphResumed` frames + verbs). */
|
|
1109
|
+
DebugPaused = false;
|
|
1110
|
+
/** Children are all terminal — the durable bag can still say paused after the last continue. */
|
|
1111
|
+
GraphSettled = false;
|
|
1112
|
+
/** A one-line diagnosis when the engine reports trouble — a lost worker, a held path. */
|
|
1113
|
+
StallNotice = null;
|
|
1114
|
+
/** Structured stall so a held edge can be answered, not just named. */
|
|
1115
|
+
Stall = null;
|
|
1116
|
+
/** Durable debug state from the parent row — frames are advisory, this is the truth. */
|
|
1117
|
+
DebugState = EmptyDebugState();
|
|
1118
|
+
/** Invocation `data`/`context` roots from the same parent bag (R3-3). */
|
|
1119
|
+
Invocation = {};
|
|
1120
|
+
/** Selected path, when the person clicked an edge rather than a step. */
|
|
1121
|
+
SelectedEdgeID = null;
|
|
1122
|
+
InspectorMode = 'step';
|
|
1123
|
+
/** Force-complete confirmation + output editor. */
|
|
1124
|
+
ForceCompleteOpen = false;
|
|
1125
|
+
ForceCompleteJson = '{}';
|
|
1126
|
+
ForceCompleteName = '';
|
|
1127
|
+
ForceCompleteError = null;
|
|
1128
|
+
/** Edit-input editor (Pending → UpdateTaskInput, Failed → RetryTask). */
|
|
1129
|
+
EditInputOpen = false;
|
|
1130
|
+
EditInputJson = '';
|
|
1131
|
+
EditInputError = null;
|
|
1132
|
+
/** True while a control verb round-trips, so the toolbar cannot double-fire. */
|
|
1133
|
+
get ControlBusy() {
|
|
1134
|
+
return this.GraphDebug?.Busy === true;
|
|
1135
|
+
}
|
|
1136
|
+
/** Replay position for a settled run: 0–100 along its wall-clock span, or null for "now". */
|
|
1137
|
+
ReplayPercent = null;
|
|
1138
|
+
/** Dependencies of the selected run's steps, for the what-if preview. */
|
|
1139
|
+
SelectedDeps = [];
|
|
1140
|
+
static FRAME_LOG_LIMIT = 250;
|
|
1141
|
+
static ENGINE_TICK_LIMIT = 10;
|
|
1142
|
+
ngOnDestroy() {
|
|
1143
|
+
this.detachFrames();
|
|
1144
|
+
super.ngOnDestroy();
|
|
1145
|
+
}
|
|
1146
|
+
isLiveStatus(status) {
|
|
1147
|
+
return status === 'In Progress' || status === 'Running' || status === 'Pending';
|
|
1148
|
+
}
|
|
1149
|
+
detachFrames() {
|
|
1150
|
+
this.LatestFrame = null;
|
|
1151
|
+
this.DebugPaused = false;
|
|
1152
|
+
this.StallNotice = null;
|
|
1153
|
+
this.Stall = null;
|
|
1154
|
+
}
|
|
1155
|
+
OnFrame(frame) {
|
|
1156
|
+
this.LatestFrame = frame;
|
|
1157
|
+
this.FrameLog = [frame, ...this.FrameLog].slice(0, WorkflowRunsResourceComponent_1.FRAME_LOG_LIMIT);
|
|
1158
|
+
switch (frame.kind) {
|
|
1159
|
+
case 'PassCompleted':
|
|
1160
|
+
this.EngineTicks = [...this.EngineTicks, frame].slice(-WorkflowRunsResourceComponent_1.ENGINE_TICK_LIMIT);
|
|
1161
|
+
break;
|
|
1162
|
+
case 'GraphPaused':
|
|
1163
|
+
case 'BreakpointHit':
|
|
1164
|
+
if (this.GraphSettled)
|
|
1165
|
+
break; // bag can still say paused after the last step
|
|
1166
|
+
this.DebugPaused = true;
|
|
1167
|
+
if (this.SelectedRunID)
|
|
1168
|
+
void this.loadDebugState(this.SelectedRunID);
|
|
1169
|
+
break;
|
|
1170
|
+
case 'GraphResumed':
|
|
1171
|
+
this.DebugPaused = false;
|
|
1172
|
+
if (this.SelectedRunID)
|
|
1173
|
+
void this.loadDebugState(this.SelectedRunID);
|
|
1174
|
+
break;
|
|
1175
|
+
case 'ClaimChanged':
|
|
1176
|
+
if (frame.claimEvent === 'heartbeat-lost') {
|
|
1177
|
+
this.setStall({
|
|
1178
|
+
kind: 'worker-lost',
|
|
1179
|
+
message: `"${frame.taskName ?? 'A step'}" lost its worker — the engine will requeue it.`,
|
|
1180
|
+
taskName: frame.taskName,
|
|
1181
|
+
taskID: frame.taskId,
|
|
1182
|
+
});
|
|
1183
|
+
}
|
|
1184
|
+
else if (frame.claimEvent === 'reclaimed') {
|
|
1185
|
+
this.clearStall();
|
|
1186
|
+
}
|
|
1187
|
+
break;
|
|
1188
|
+
case 'GateDecision':
|
|
1189
|
+
if (frame.verdict === 'held') {
|
|
1190
|
+
this.setStall({
|
|
1191
|
+
kind: 'held',
|
|
1192
|
+
message: `"${frame.taskName ?? 'A step'}" is waiting on a path that can't be answered.`,
|
|
1193
|
+
taskName: frame.taskName,
|
|
1194
|
+
taskID: frame.taskId,
|
|
1195
|
+
edgeID: frame.edgeId,
|
|
1196
|
+
conditionText: frame.conditionText,
|
|
1197
|
+
reason: frame.reason,
|
|
1198
|
+
});
|
|
1199
|
+
}
|
|
1200
|
+
break;
|
|
1201
|
+
case 'StepRefused':
|
|
1202
|
+
this.setStall({
|
|
1203
|
+
kind: 'step-refused',
|
|
1204
|
+
message: frame.reason ?? 'The step could not start yet; it stays queued.',
|
|
1205
|
+
reason: frame.reason,
|
|
1206
|
+
});
|
|
1207
|
+
break;
|
|
1208
|
+
case 'GraphSettled':
|
|
1209
|
+
this.markGraphSettled();
|
|
1210
|
+
this.clearStall();
|
|
1211
|
+
void this.loadData(); // the list row's status/duration just changed
|
|
1212
|
+
if (this.SelectedRunID) {
|
|
1213
|
+
void this.loadSteps(this.SelectedRunID);
|
|
1214
|
+
void this.loadDebugState(this.SelectedRunID);
|
|
1215
|
+
}
|
|
1216
|
+
break;
|
|
1217
|
+
case 'TaskCompleted':
|
|
1218
|
+
case 'TaskFailed':
|
|
1219
|
+
case 'TaskSkipped':
|
|
1220
|
+
case 'TaskBlocked':
|
|
1221
|
+
// Keep the step list in agreement with the canvas the frame just updated.
|
|
1222
|
+
if (this.SelectedRunID)
|
|
1223
|
+
void this.loadSteps(this.SelectedRunID);
|
|
1224
|
+
break;
|
|
1225
|
+
}
|
|
1226
|
+
this.cdr.markForCheck();
|
|
1227
|
+
}
|
|
1228
|
+
// ─── live console: control verbs ────────────────────────────────────────
|
|
1229
|
+
//
|
|
1230
|
+
// The drop-in debugger owns RouteOperation. These handlers just call its verbs.
|
|
1231
|
+
async OnPauseRun() {
|
|
1232
|
+
await this.GraphDebug?.Pause();
|
|
1233
|
+
this.DebugPaused = true;
|
|
1234
|
+
this.cdr.markForCheck();
|
|
1235
|
+
}
|
|
1236
|
+
async OnResumeRun() {
|
|
1237
|
+
await this.GraphDebug?.Resume();
|
|
1238
|
+
this.DebugPaused = false;
|
|
1239
|
+
this.cdr.markForCheck();
|
|
1240
|
+
}
|
|
1241
|
+
async OnStepRun(target) {
|
|
1242
|
+
await this.GraphDebug?.Step(target);
|
|
1243
|
+
}
|
|
1244
|
+
async OnCancelRun() {
|
|
1245
|
+
await this.GraphDebug?.Cancel();
|
|
1246
|
+
await this.loadData();
|
|
1247
|
+
}
|
|
1248
|
+
async OnSkipStep(step) {
|
|
1249
|
+
await this.GraphDebug?.SkipTask(step.ID);
|
|
1250
|
+
if (this.SelectedRunID)
|
|
1251
|
+
void this.loadSteps(this.SelectedRunID);
|
|
1252
|
+
}
|
|
1253
|
+
async OnRetryStep(step) {
|
|
1254
|
+
await this.GraphDebug?.RetryTask(step.ID);
|
|
1255
|
+
if (this.SelectedRunID)
|
|
1256
|
+
void this.loadSteps(this.SelectedRunID);
|
|
1257
|
+
}
|
|
1258
|
+
async OnBreakpointToggled(event) {
|
|
1259
|
+
await this.GraphDebug?.ToggleBreakpoint(event.TaskID, event.Enabled);
|
|
1260
|
+
}
|
|
1261
|
+
async OnRemoveBreakpoint(taskID) {
|
|
1262
|
+
await this.OnBreakpointToggled({ TaskID: taskID, Enabled: false });
|
|
1263
|
+
}
|
|
1264
|
+
OnSelectBreakpoint(taskID) {
|
|
1265
|
+
const step = this.SelectedSteps.find((s) => UUIDsEqual(s.ID, taskID));
|
|
1266
|
+
if (step)
|
|
1267
|
+
this.OnSelectStep(step);
|
|
1268
|
+
else {
|
|
1269
|
+
this.SelectedStepID = taskID;
|
|
1270
|
+
this.InspectorMode = 'step';
|
|
1271
|
+
if (!this.Layout.StepPanelOpen)
|
|
1272
|
+
this.ToggleStepPanel();
|
|
1273
|
+
this.cdr.markForCheck();
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
async OnOverrideEdge(edgeID, verdict) {
|
|
1277
|
+
await this.GraphDebug?.OverrideEdge(edgeID, verdict);
|
|
1278
|
+
if (verdict != null)
|
|
1279
|
+
this.clearStall();
|
|
1280
|
+
}
|
|
1281
|
+
OnGraphConnectionSelected(event) {
|
|
1282
|
+
if (!event.EdgeID)
|
|
1283
|
+
return;
|
|
1284
|
+
this.SelectedEdgeID = event.EdgeID;
|
|
1285
|
+
this.InspectorMode = 'edge';
|
|
1286
|
+
if (!this.Layout.StepPanelOpen)
|
|
1287
|
+
this.ToggleStepPanel();
|
|
1288
|
+
this.cdr.markForCheck();
|
|
1289
|
+
}
|
|
1290
|
+
get SelectedEdge() {
|
|
1291
|
+
if (!this.SelectedEdgeID)
|
|
1292
|
+
return null;
|
|
1293
|
+
return this.SelectedDeps.find((d) => UUIDsEqual(d.ID, this.SelectedEdgeID)) ?? null;
|
|
1294
|
+
}
|
|
1295
|
+
get SelectedEdgeIsConditional() {
|
|
1296
|
+
return !!this.SelectedEdge?.Condition?.trim();
|
|
1297
|
+
}
|
|
1298
|
+
get SelectedEdgeOverride() {
|
|
1299
|
+
if (!this.SelectedEdgeID)
|
|
1300
|
+
return null;
|
|
1301
|
+
return this.GraphDebug?.GetEdgeOverride(this.SelectedEdgeID) ?? null;
|
|
1302
|
+
}
|
|
1303
|
+
get SelectedEdgeFromName() {
|
|
1304
|
+
const edge = this.SelectedEdge;
|
|
1305
|
+
if (!edge)
|
|
1306
|
+
return '';
|
|
1307
|
+
return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, edge.DependsOnTaskID))?.Name ?? 'upstream';
|
|
1308
|
+
}
|
|
1309
|
+
get SelectedEdgeToName() {
|
|
1310
|
+
const edge = this.SelectedEdge;
|
|
1311
|
+
if (!edge)
|
|
1312
|
+
return '';
|
|
1313
|
+
return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, edge.TaskID))?.Name ?? 'downstream';
|
|
1314
|
+
}
|
|
1315
|
+
StepName(taskID) {
|
|
1316
|
+
return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, taskID))?.Name ?? 'a step';
|
|
1317
|
+
}
|
|
1318
|
+
HasBreakpoint(taskID) {
|
|
1319
|
+
return this.GraphDebug?.HasBreakpoint(taskID) ?? false;
|
|
1320
|
+
}
|
|
1321
|
+
/** Live or paused — the VS Code bar is how you drive it, including a start-paused debug. */
|
|
1322
|
+
CanDriveRun(run) {
|
|
1323
|
+
if (this.IsRunSettled(run))
|
|
1324
|
+
return false;
|
|
1325
|
+
return run.Status === 'In Progress' || run.Status === 'Running' || run.Status === 'Pending' || this.DebugPaused;
|
|
1326
|
+
}
|
|
1327
|
+
IsRunSettled(run) {
|
|
1328
|
+
return this.GraphSettled
|
|
1329
|
+
|| run.Status === 'Complete'
|
|
1330
|
+
|| run.Status === 'Failed'
|
|
1331
|
+
|| run.Status === 'Cancelled';
|
|
1332
|
+
}
|
|
1333
|
+
OnCanvasSettled() {
|
|
1334
|
+
this.markGraphSettled();
|
|
1335
|
+
this.cdr.markForCheck();
|
|
1336
|
+
}
|
|
1337
|
+
markGraphSettled() {
|
|
1338
|
+
this.GraphSettled = true;
|
|
1339
|
+
this.DebugPaused = false;
|
|
1340
|
+
this.DebugState = { ...this.DebugState, paused: false, pausedAtTaskID: null };
|
|
1341
|
+
}
|
|
1342
|
+
StepPayload(step, field) {
|
|
1343
|
+
const value = step.Record[field];
|
|
1344
|
+
if (typeof value === 'string')
|
|
1345
|
+
return value;
|
|
1346
|
+
if (value == null)
|
|
1347
|
+
return null;
|
|
1348
|
+
return JSON.stringify(value);
|
|
1349
|
+
}
|
|
1350
|
+
OnBreakpointCheckbox(step, event) {
|
|
1351
|
+
const target = event.target;
|
|
1352
|
+
const enabled = target instanceof HTMLInputElement && target.checked;
|
|
1353
|
+
void this.OnBreakpointToggled({ TaskID: step.ID, Enabled: enabled });
|
|
1354
|
+
}
|
|
1355
|
+
CanForceComplete(step) {
|
|
1356
|
+
if (this.isHumanStep(step))
|
|
1357
|
+
return false;
|
|
1358
|
+
return step.Status === 'Pending' || step.Status === 'Failed' || step.Status === 'Blocked';
|
|
1359
|
+
}
|
|
1360
|
+
CanEditInput(step) {
|
|
1361
|
+
return step.Status === 'Pending' || step.Status === 'Failed';
|
|
1362
|
+
}
|
|
1363
|
+
OpenForceComplete(step) {
|
|
1364
|
+
this.ForceCompleteOpen = true;
|
|
1365
|
+
this.ForceCompleteJson = this.prettyJson(step.Record['OutputPayload']) || '{}';
|
|
1366
|
+
this.ForceCompleteName = '';
|
|
1367
|
+
this.ForceCompleteError = null;
|
|
1368
|
+
this.EditInputOpen = false;
|
|
1369
|
+
this.cdr.markForCheck();
|
|
1370
|
+
}
|
|
1371
|
+
OpenEditInput(step) {
|
|
1372
|
+
this.EditInputOpen = true;
|
|
1373
|
+
this.EditInputJson = this.prettyJson(step.Record['InputPayload']) || '{}';
|
|
1374
|
+
this.EditInputError = null;
|
|
1375
|
+
this.ForceCompleteOpen = false;
|
|
1376
|
+
this.cdr.markForCheck();
|
|
1377
|
+
}
|
|
1378
|
+
async SubmitForceComplete(step) {
|
|
1379
|
+
if (this.ForceCompleteName.trim() !== step.Name) {
|
|
1380
|
+
this.ForceCompleteError = 'Type the step name exactly to confirm.';
|
|
1381
|
+
this.cdr.markForCheck();
|
|
1382
|
+
return;
|
|
1383
|
+
}
|
|
1384
|
+
const parsed = TryParseJsonObject(this.ForceCompleteJson);
|
|
1385
|
+
if (!parsed.ok) {
|
|
1386
|
+
this.ForceCompleteError = parsed.error;
|
|
1387
|
+
this.cdr.markForCheck();
|
|
1388
|
+
return;
|
|
1389
|
+
}
|
|
1390
|
+
this.ForceCompleteError = null;
|
|
1391
|
+
const ok = await this.GraphDebug?.ForceCompleteTask(step.ID, parsed.value);
|
|
1392
|
+
if (ok) {
|
|
1393
|
+
this.ForceCompleteOpen = false;
|
|
1394
|
+
if (this.SelectedRunID)
|
|
1395
|
+
void this.loadSteps(this.SelectedRunID);
|
|
1396
|
+
}
|
|
1397
|
+
}
|
|
1398
|
+
async SubmitEditInput(step) {
|
|
1399
|
+
const parsed = TryParseJsonObject(this.EditInputJson);
|
|
1400
|
+
if (!parsed.ok) {
|
|
1401
|
+
this.EditInputError = parsed.error;
|
|
1402
|
+
this.cdr.markForCheck();
|
|
1403
|
+
return;
|
|
1404
|
+
}
|
|
1405
|
+
this.EditInputError = null;
|
|
1406
|
+
const ok = step.Status === 'Failed'
|
|
1407
|
+
? await this.GraphDebug?.RetryTask(step.ID, parsed.value)
|
|
1408
|
+
: await this.GraphDebug?.UpdateTaskInput(step.ID, parsed.value);
|
|
1409
|
+
if (ok) {
|
|
1410
|
+
this.EditInputOpen = false;
|
|
1411
|
+
if (this.SelectedRunID)
|
|
1412
|
+
void this.loadSteps(this.SelectedRunID);
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
get InvocationJson() {
|
|
1416
|
+
return JSON.stringify(ParseJSONRecursive({ data: this.Invocation.data ?? null, context: this.Invocation.context ?? null }, JSON_PARSE_OPTIONS), null, 2);
|
|
1417
|
+
}
|
|
1418
|
+
get HasInvocation() {
|
|
1419
|
+
return this.Invocation.data != null || this.Invocation.context != null;
|
|
1420
|
+
}
|
|
1421
|
+
// ─── live console: inspector data ───────────────────────────────────────
|
|
1422
|
+
/** The newest claim event seen for the selected step, if any. */
|
|
1423
|
+
get SelectedStepClaim() {
|
|
1424
|
+
if (!this.SelectedStepID)
|
|
1425
|
+
return null;
|
|
1426
|
+
return this.FrameLog.find((f) => f.kind === 'ClaimChanged' && UUIDsEqual(f.taskId ?? '', this.SelectedStepID)) ?? null;
|
|
1427
|
+
}
|
|
1428
|
+
/** Latest verdict per path into/out of the selected step — "why did this branch run". */
|
|
1429
|
+
get SelectedStepVerdicts() {
|
|
1430
|
+
if (!this.SelectedStepID)
|
|
1431
|
+
return [];
|
|
1432
|
+
const byEdge = new Map();
|
|
1433
|
+
// FrameLog is newest-first, so the first sighting per edge is the latest verdict.
|
|
1434
|
+
for (const f of this.FrameLog) {
|
|
1435
|
+
if (f.kind !== 'GateDecision' || !f.edgeId)
|
|
1436
|
+
continue;
|
|
1437
|
+
const touches = UUIDsEqual(f.taskId ?? '', this.SelectedStepID) || UUIDsEqual(f.dependsOnTaskId ?? '', this.SelectedStepID);
|
|
1438
|
+
if (touches && !byEdge.has(f.edgeId))
|
|
1439
|
+
byEdge.set(f.edgeId, f);
|
|
1440
|
+
}
|
|
1441
|
+
return [...byEdge.values()];
|
|
1442
|
+
}
|
|
1443
|
+
/** What the selected step's runner last said it was doing. */
|
|
1444
|
+
get SelectedStepProgress() {
|
|
1445
|
+
if (!this.SelectedStepID)
|
|
1446
|
+
return null;
|
|
1447
|
+
return this.FrameLog.find((f) => f.kind === 'NodeProgress' && UUIDsEqual(f.taskId ?? '', this.SelectedStepID)) ?? null;
|
|
1448
|
+
}
|
|
1449
|
+
/**
|
|
1450
|
+
* What-if: how many steps would be cut off if the selected step failed — computed with the
|
|
1451
|
+
* engine's OWN blocking algorithm over the loaded rows, so the preview cannot disagree with
|
|
1452
|
+
* what the dispatcher would actually do.
|
|
1453
|
+
*/
|
|
1454
|
+
get SelectedStepWhatIf() {
|
|
1455
|
+
const step = this.SelectedStep;
|
|
1456
|
+
if (!step || this.SelectedSteps.length === 0)
|
|
1457
|
+
return null;
|
|
1458
|
+
const nodes = this.SelectedSteps.map((s) => ({
|
|
1459
|
+
id: s.ID,
|
|
1460
|
+
status: (UUIDsEqual(s.ID, step.ID) ? 'Failed' : s.Status),
|
|
1461
|
+
}));
|
|
1462
|
+
const edges = this.SelectedDeps.map((d) => ({
|
|
1463
|
+
taskId: d.TaskID,
|
|
1464
|
+
dependsOnTaskId: d.DependsOnTaskID,
|
|
1465
|
+
dependencyType: d.DependencyType,
|
|
1466
|
+
}));
|
|
1467
|
+
const blocked = ComputeTasksToBlock(nodes, edges, new Set());
|
|
1468
|
+
return { BlockedCount: [...blocked].filter((id) => !UUIDsEqual(id, step.ID)).length };
|
|
1469
|
+
}
|
|
1470
|
+
// ─── live console: replay ───────────────────────────────────────────────
|
|
1471
|
+
/** Whether the selected run can be scrubbed — it has settled and has a wall-clock span. */
|
|
1472
|
+
get CanReplay() {
|
|
1473
|
+
const run = this.SelectedRun;
|
|
1474
|
+
return !!run && !this.isLiveStatus(run.Status) && !!run.StartedAt && !!run.CompletedAt;
|
|
1475
|
+
}
|
|
1476
|
+
/** The scrub position as a timestamp inside the run's span, or null when showing the present. */
|
|
1477
|
+
get ReplayAt() {
|
|
1478
|
+
const run = this.SelectedRun;
|
|
1479
|
+
if (this.ReplayPercent == null || !run?.StartedAt || !run?.CompletedAt)
|
|
1480
|
+
return null;
|
|
1481
|
+
const start = run.StartedAt.getTime();
|
|
1482
|
+
const end = run.CompletedAt.getTime();
|
|
1483
|
+
return new Date(start + (end - start) * (this.ReplayPercent / 100));
|
|
1484
|
+
}
|
|
1485
|
+
OnReplayScrub(value) {
|
|
1486
|
+
const pct = Math.max(0, Math.min(100, Number(value)));
|
|
1487
|
+
this.ReplayPercent = Number.isFinite(pct) ? pct : null;
|
|
1488
|
+
this.cdr.markForCheck();
|
|
1489
|
+
}
|
|
1490
|
+
OnReplayReset() {
|
|
1491
|
+
this.ReplayPercent = null;
|
|
1492
|
+
this.cdr.markForCheck();
|
|
444
1493
|
}
|
|
445
1494
|
/**
|
|
446
1495
|
* Loads the selected run's steps.
|
|
@@ -464,8 +1513,16 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
|
|
|
464
1513
|
ResultType: 'entity_object',
|
|
465
1514
|
BypassCache: true,
|
|
466
1515
|
});
|
|
1516
|
+
// The edges too, for the what-if preview — same rows the run view reads for the canvas.
|
|
1517
|
+
const deps = await RunView.FromMetadataProvider(this.ProviderToUse).RunView({
|
|
1518
|
+
EntityName: 'MJ: Task Dependencies',
|
|
1519
|
+
ExtraFilter: `TaskID IN (SELECT ID FROM __mj.Task WHERE ParentID='${parentTaskID}')`,
|
|
1520
|
+
ResultType: 'entity_object',
|
|
1521
|
+
BypassCache: true,
|
|
1522
|
+
});
|
|
467
1523
|
if (!UUIDsEqual(this.SelectedRunID ?? '', parentTaskID))
|
|
468
1524
|
return; // selection moved on
|
|
1525
|
+
this.SelectedDeps = (deps.Success ? (deps.Results ?? []) : []);
|
|
469
1526
|
this.SelectedSteps = (result.Success ? (result.Results ?? []) : []).map((t) => ({
|
|
470
1527
|
ID: t.ID,
|
|
471
1528
|
Name: t.Name ?? '(unnamed step)',
|
|
@@ -488,10 +1545,17 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
|
|
|
488
1545
|
/** A node was clicked on the canvas — show that step's JSON. */
|
|
489
1546
|
OnGraphNodeSelected(event) {
|
|
490
1547
|
this.SelectedStepID = event.TaskID;
|
|
1548
|
+
this.InspectorMode = 'step';
|
|
1549
|
+
// Asking to see a step is asking for the panel. Leaving it closed would make the click look
|
|
1550
|
+
// like it did nothing.
|
|
1551
|
+
if (!this.Layout.StepPanelOpen)
|
|
1552
|
+
this.ToggleStepPanel();
|
|
491
1553
|
this.cdr.markForCheck();
|
|
492
1554
|
}
|
|
493
1555
|
OnSelectStep(step) {
|
|
494
1556
|
this.SelectedStepID = UUIDsEqual(this.SelectedStepID ?? '', step.ID) ? null : step.ID;
|
|
1557
|
+
this.InspectorMode = 'step';
|
|
1558
|
+
this.resetEditors();
|
|
495
1559
|
this.cdr.markForCheck();
|
|
496
1560
|
}
|
|
497
1561
|
OnDetailTab(tab) {
|
|
@@ -546,6 +1610,75 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
|
|
|
546
1610
|
return;
|
|
547
1611
|
this.navigationService.OpenEntityRecord('MJ: AI Agent Runs', CompositeKey.FromID(run.AgentRunID));
|
|
548
1612
|
}
|
|
1613
|
+
async loadDebugState(parentTaskID) {
|
|
1614
|
+
try {
|
|
1615
|
+
const result = await RunView.FromMetadataProvider(this.ProviderToUse).RunView({
|
|
1616
|
+
EntityName: 'MJ: Tasks',
|
|
1617
|
+
ExtraFilter: `ID='${parentTaskID}'`,
|
|
1618
|
+
ResultType: 'entity_object',
|
|
1619
|
+
BypassCache: true,
|
|
1620
|
+
});
|
|
1621
|
+
if (!UUIDsEqual(this.SelectedRunID ?? '', parentTaskID))
|
|
1622
|
+
return;
|
|
1623
|
+
const parent = result.Success ? result.Results?.[0] : undefined;
|
|
1624
|
+
const bag = ParseWorkflowRunParentBag(parent?.InputPayload);
|
|
1625
|
+
this.Invocation = bag.invocation;
|
|
1626
|
+
// Settled trumps the durable bag: $.debug.paused can still be true after the last
|
|
1627
|
+
// continue, and painting that as "paused here" hides that the run is over.
|
|
1628
|
+
if (this.GraphSettled) {
|
|
1629
|
+
this.DebugState = { ...bag.debug, paused: false, pausedAtTaskID: null };
|
|
1630
|
+
this.DebugPaused = false;
|
|
1631
|
+
}
|
|
1632
|
+
else {
|
|
1633
|
+
this.DebugState = bag.debug;
|
|
1634
|
+
this.DebugPaused = bag.debug.paused;
|
|
1635
|
+
}
|
|
1636
|
+
}
|
|
1637
|
+
catch {
|
|
1638
|
+
// A failed parent read leaves the last known debug state; frames remain the safety net.
|
|
1639
|
+
}
|
|
1640
|
+
this.cdr.markForCheck();
|
|
1641
|
+
}
|
|
1642
|
+
setStall(stall) {
|
|
1643
|
+
this.Stall = stall;
|
|
1644
|
+
this.StallNotice = stall.message;
|
|
1645
|
+
}
|
|
1646
|
+
clearStall() {
|
|
1647
|
+
this.Stall = null;
|
|
1648
|
+
this.StallNotice = null;
|
|
1649
|
+
}
|
|
1650
|
+
OnDismissStall() {
|
|
1651
|
+
this.clearStall();
|
|
1652
|
+
this.cdr.markForCheck();
|
|
1653
|
+
}
|
|
1654
|
+
resetEditors() {
|
|
1655
|
+
this.ForceCompleteOpen = false;
|
|
1656
|
+
this.ForceCompleteError = null;
|
|
1657
|
+
this.EditInputOpen = false;
|
|
1658
|
+
this.EditInputError = null;
|
|
1659
|
+
}
|
|
1660
|
+
isHumanStep(step) {
|
|
1661
|
+
const userID = step.Record['UserID'];
|
|
1662
|
+
return typeof userID === 'string' && userID.trim().length > 0;
|
|
1663
|
+
}
|
|
1664
|
+
prettyJson(value) {
|
|
1665
|
+
if (value == null || value === '')
|
|
1666
|
+
return '';
|
|
1667
|
+
if (typeof value === 'string') {
|
|
1668
|
+
try {
|
|
1669
|
+
return JSON.stringify(JSON.parse(value), null, 2);
|
|
1670
|
+
}
|
|
1671
|
+
catch {
|
|
1672
|
+
return value;
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1675
|
+
try {
|
|
1676
|
+
return JSON.stringify(value, null, 2);
|
|
1677
|
+
}
|
|
1678
|
+
catch {
|
|
1679
|
+
return '';
|
|
1680
|
+
}
|
|
1681
|
+
}
|
|
549
1682
|
/**
|
|
550
1683
|
* Reports surface state and registers what an agent may drive here.
|
|
551
1684
|
*
|
|
@@ -635,21 +1768,28 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
|
|
|
635
1768
|
]);
|
|
636
1769
|
}
|
|
637
1770
|
static ɵfac = function WorkflowRunsResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || WorkflowRunsResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
638
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WorkflowRunsResourceComponent, selectors: [["mj-workflow-runs"]],
|
|
639
|
-
i0.ɵɵ
|
|
640
|
-
|
|
1771
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WorkflowRunsResourceComponent, selectors: [["mj-workflow-runs"]], viewQuery: function WorkflowRunsResourceComponent_Query(rf, ctx) { if (rf & 1) {
|
|
1772
|
+
i0.ɵɵviewQuery(TaskGraphDebuggerComponent, 5);
|
|
1773
|
+
} if (rf & 2) {
|
|
1774
|
+
let _t;
|
|
1775
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.GraphDebug = _t.first);
|
|
1776
|
+
} }, hostBindings: function WorkflowRunsResourceComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1777
|
+
i0.ɵɵlistener("resize", function WorkflowRunsResourceComponent_resize_HostBindingHandler() { return ctx.onViewportResized(); }, i0.ɵɵresolveWindow);
|
|
1778
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 17, vars: 4, consts: [["GraphDebug", ""], ["Title", "Runs", "Icon", "fa-solid fa-timeline", "Subtitle", "Every workflow that has run \u2014 however it was started."], ["meta", ""], ["Label", "runs", 3, "Count", "Total"], ["actions", ""], [3, "Clicked", "Loading"], ["toolbar", ""], ["Placeholder", "Search runs", 3, "ValueChange", "Value"], [1, "wfr-status-filters"], ["type", "button", "mjButton", "", "size", "sm", 3, "variant"], ["text", "Loading runs..."], ["Variant", "error", 3, "Message"], ["Icon", "fa-solid fa-timeline", "Title", "Nothing has run yet", "Message", "When a workflow runs \u2014 started by hand, on a schedule, or by an agent \u2014 it will appear here."], ["Icon", "fa-solid fa-filter", "Title", "No runs match", "Message", "Nothing matches the current filter. Clear it to see everything that has run."], ["direction", "horizontal", "unit", "percent", 1, "wfr-split", 3, "gutterSize", "disabled"], ["type", "button", "mjButton", "", "size", "sm", 3, "click", "variant"], ["direction", "horizontal", "unit", "percent", 1, "wfr-split", 3, "dragEnd", "gutterSize", "disabled"], [3, "size", "minSize"], [1, "wfr-list"], ["role", "row", 1, "wfr-head"], ["type", "button", 1, "wfr-head-cell", "wfr-col-name", 3, "click"], ["aria-hidden", "true", 3, "ngClass"], ["type", "button", 1, "wfr-head-cell", "wfr-col-time", 3, "click"], ["type", "button", 1, "wfr-head-cell", "wfr-col-duration", 3, "click"], ["type", "button", 1, "wfr-head-cell", "wfr-col-status", 3, "click"], ["type", "button", 1, "wfr-row", 3, "wfr-row-selected"], [3, "size", "minSize", "visible"], [1, "wfr-detail"], ["type", "button", 1, "wfr-row", 3, "click"], [1, "wfr-col-name", "wfr-row-name"], [1, "wfr-col-time"], [1, "wfr-col-duration"], [1, "wfr-col-status", "wfr-row-status"], [1, "wfr-detail-head"], [1, "wfr-detail-title"], [1, "wfr-detail-name"], [1, "wfr-row-status"], [1, "wfr-detail-actions"], ["mjButton", "", "variant", "flat", "size", "sm"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "title"], ["mjButton", "", "variant", "flat", "size", "sm", "aria-label", "Close", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-xmark"], ["role", "tablist", 1, "wfr-detail-tabs"], ["type", "button", 1, "wfr-tab", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-diagram-project"], ["aria-hidden", "true", 1, "fa-solid", "fa-code"], ["role", "status", 1, "wfr-stall"], ["unit", "percent", 1, "wfr-graph-split", 3, "direction", "gutterSize"], [1, "wfr-json-pane"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-arrow-up-right-from-square"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click", "title"], ["aria-hidden", "true", 1, "fa-solid"], [1, "wfr-stall-body"], ["aria-hidden", "true", 1, "fa-solid", "fa-triangle-exclamation"], [1, "wfr-stall-copy"], [1, "wfr-stall-reason"], [1, "wfr-stall-actions"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click", "disabled"], ["unit", "percent", 1, "wfr-graph-split", 3, "dragEnd", "direction", "gutterSize"], [1, "wfr-graph-pane"], ["Height", "100%", 3, "NodeSelected", "ConnectionSelected", "LegendToggled", "Settled", "Frame", "PausedChange", "Provider", "ParentTaskID", "WorkflowName", "LiveUpdates", "ReplayAt", "ShowLegend"], [1, "wfr-replay"], ["aria-label", "Armed breakpoints", 1, "wfr-bp-bar"], ["aria-label", "Engine activity", 1, "wfr-engine"], [1, "wfr-steps-pane"], ["text", "Loading steps..."], ["aria-hidden", "true", 1, "fa-solid", "fa-clock-rotate-left"], ["type", "range", "min", "0", "max", "100", "step", "1", "aria-label", "Replay position", 3, "input", "value"], [1, "wfr-chip", "wfr-chip-paused"], ["type", "button", 1, "wfr-chip", "wfr-chip-break"], ["aria-hidden", "true", 1, "fa-solid", "fa-pause"], ["type", "button", 1, "wfr-chip", "wfr-chip-break", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-circle"], ["role", "button", "tabindex", "0", "aria-label", "Remove breakpoint", 1, "wfr-chip-x", 3, "click"], [1, "wfr-tick", 3, "wfr-tick-held"], [1, "wfr-tick", "wfr-tick-paused"], [1, "wfr-tick"], [1, "wfr-step-list"], ["type", "button", 1, "wfr-step", 3, "wfr-step-selected"], [1, "wfr-step-json"], ["Size", "compact", "Icon", "fa-solid fa-hand-pointer", "Title", "Select a step", "Message", "Click a step on the canvas or in the list to see everything it recorded."], ["type", "button", 1, "wfr-step", 3, "click"], [1, "wfr-step-name"], [1, "wfr-step-meta"], [1, "wfr-step-json-head"], [1, "wfr-chip", "wfr-chip-forced"], [1, "wfr-insp-card"], [1, "wfr-insp-label"], [1, "wfr-insp-actions"], [1, "wfr-insp-hint"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "disabled"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click", "disabled"], ["type", "button", 1, "wfr-bp", 3, "click", "disabled", "title"], ["aria-hidden", "true", 1, "fa-circle"], [1, "wfr-insp-card", 3, "wfr-insp-bad"], [1, "wfr-editor-card"], [1, "wfr-editor-card", "wfr-editor-danger"], [3, "InputPayload", "OutputPayload", "Invocation"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Declare this step not-taken; later steps proceed", 3, "disabled"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "disabled"], ["mjButton", "", "variant", "danger", "size", "sm", 3, "disabled"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Declare this step not-taken; later steps proceed", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-forward"], ["aria-hidden", "true", 1, "fa-solid", "fa-pen-to-square"], ["aria-hidden", "true", 1, "fa-solid", "fa-rotate-right"], ["mjButton", "", "variant", "danger", "size", "sm", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-flag-checkered"], ["rows", "8", "spellcheck", "false", 1, "mj-textarea", "wfr-json-edit", 3, "ngModelChange", "ngModel"], [1, "wfr-editor-error"], ["rows", "6", "spellcheck", "false", 1, "mj-textarea", "wfr-json-edit", 3, "ngModelChange", "ngModel"], ["type", "text", 1, "mj-input", 3, "ngModelChange", "ngModel", "placeholder"], [2, "width", "100%", 3, "ngModel", "language", "readonly"]], template: function WorkflowRunsResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1779
|
+
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 1)(2, "div", 2);
|
|
1780
|
+
i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_3_Template, 1, 2, "mj-stat-badge", 3);
|
|
641
1781
|
i0.ɵɵelementEnd();
|
|
642
|
-
i0.ɵɵelementStart(4, "div",
|
|
1782
|
+
i0.ɵɵelementStart(4, "div", 4)(5, "mj-refresh-button", 5);
|
|
643
1783
|
i0.ɵɵlistener("Clicked", function WorkflowRunsResourceComponent_Template_mj_refresh_button_Clicked_5_listener() { return ctx.loadData(); });
|
|
644
1784
|
i0.ɵɵelementEnd()();
|
|
645
|
-
i0.ɵɵelementStart(6, "div",
|
|
1785
|
+
i0.ɵɵelementStart(6, "div", 6)(7, "mj-page-search", 7);
|
|
646
1786
|
i0.ɵɵlistener("ValueChange", function WorkflowRunsResourceComponent_Template_mj_page_search_ValueChange_7_listener($event) { return ctx.OnSearch($event); });
|
|
647
1787
|
i0.ɵɵelementEnd();
|
|
648
|
-
i0.ɵɵelementStart(8, "div",
|
|
649
|
-
i0.ɵɵrepeaterCreate(9, WorkflowRunsResourceComponent_For_10_Template, 2, 2, "button",
|
|
1788
|
+
i0.ɵɵelementStart(8, "div", 8);
|
|
1789
|
+
i0.ɵɵrepeaterCreate(9, WorkflowRunsResourceComponent_For_10_Template, 2, 2, "button", 9, i0.ɵɵrepeaterTrackByIdentity);
|
|
650
1790
|
i0.ɵɵelementEnd()()();
|
|
651
1791
|
i0.ɵɵelementStart(11, "mj-page-body");
|
|
652
|
-
i0.ɵɵconditionalCreate(12, WorkflowRunsResourceComponent_Conditional_12_Template, 1, 0, "mj-loading",
|
|
1792
|
+
i0.ɵɵconditionalCreate(12, WorkflowRunsResourceComponent_Conditional_12_Template, 1, 0, "mj-loading", 10)(13, WorkflowRunsResourceComponent_Conditional_13_Template, 1, 1, "mj-alert", 11)(14, WorkflowRunsResourceComponent_Conditional_14_Template, 1, 0, "mj-empty-state", 12)(15, WorkflowRunsResourceComponent_Conditional_15_Template, 1, 0, "mj-empty-state", 13)(16, WorkflowRunsResourceComponent_Conditional_16_Template, 23, 13, "as-split", 14);
|
|
653
1793
|
i0.ɵɵelementEnd()();
|
|
654
1794
|
} if (rf & 2) {
|
|
655
1795
|
i0.ɵɵadvance(3);
|
|
@@ -662,15 +1802,21 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
|
|
|
662
1802
|
i0.ɵɵrepeater(ctx.StatusFilters);
|
|
663
1803
|
i0.ɵɵadvance(3);
|
|
664
1804
|
i0.ɵɵconditional(ctx.IsLoading ? 12 : ctx.LoadError ? 13 : ctx.Runs.length === 0 ? 14 : ctx.VisibleRuns.length === 0 ? 15 : 16);
|
|
665
|
-
} }, dependencies: [i1.NgClass, i2.NgControlStatus, i2.NgModel, i3.MJAlertComponent, i3.MJButtonDirective, i3.MJEmptyStateComponent, i3.MJPageBodyComponent, i3.MJPageHeaderComponent, i3.MJPageLayoutComponent, i3.MJPageSearchComponent, i3.MJRefreshButtonComponent, i3.MJStatBadgeComponent, i4.LoadingComponent, i5.TaskGraphRunViewComponent, i6.CodeEditorComponent, i1.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.wfr-status-filters[_ngcontent-%COMP%] {\n display: flex;\n gap: var(--mj-space-1);\n align-items: center;\n}\n\n\n\n\n.wfr-split[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr;\n gap: var(--mj-space-3);\n height: 100%;\n min-height: 0;\n}\n\n.wfr-split-open[_ngcontent-%COMP%] {\n grid-template-columns: minmax(28rem, 40%) 1fr;\n}\n\n@media (max-width: 900px) {\n .wfr-split-open[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n.wfr-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1);\n overflow-y: auto;\n min-height: 0;\n}\n\n.wfr-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n width: 100%;\n padding: var(--mj-space-2) var(--mj-space-3);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n text-align: left;\n cursor: pointer;\n color: var(--mj-text-primary);\n}\n\n.wfr-row[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-row[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n.wfr-row-selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.wfr-row-main[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wfr-row-name[_ngcontent-%COMP%] {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-row-when[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.wfr-row-status[_ngcontent-%COMP%] {\n flex: none;\n font-size: var(--mj-font-size-xs);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 2px var(--mj-space-2);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-page);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n\n\n\n\n.wfr-row-status[data-status='Complete'][_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Failed'][_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Running'][_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.wfr-detail[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-height: 0;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n}\n\n.wfr-detail-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-detail-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n min-width: 0;\n}\n\n.wfr-detail-name[_ngcontent-%COMP%] {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-detail-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-1);\n flex: none;\n}\n\n\n\n\n\n\n\n\n.wfr-head[_ngcontent-%COMP%], \n.wfr-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 1.3fr) minmax(0, 1.3fr) minmax(0, 0.7fr) minmax(0, 0.9fr);\n gap: var(--mj-space-2);\n align-items: center;\n}\n\n.wfr-head[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n z-index: 1;\n padding: 0 var(--mj-space-3) var(--mj-space-1);\n background: var(--mj-bg-page);\n}\n\n.wfr-head-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n padding: var(--mj-space-1) 0;\n font-size: var(--mj-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-head-cell[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.wfr-head-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n opacity: 0.65;\n font-size: 0.85em;\n}\n\n.wfr-col-time[_ngcontent-%COMP%], \n.wfr-col-duration[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.wfr-col-status[_ngcontent-%COMP%] {\n justify-self: start;\n}\n\n\n\n\n\n.wfr-detail-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: var(--mj-space-1);\n padding: 0 var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-tab[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n padding: var(--mj-space-2) var(--mj-space-2);\n font-size: var(--mj-font-size-sm);\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.wfr-tab-active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n\n\n.wfr-graph-pane[_ngcontent-%COMP%] {\n flex: 1 1 55%;\n min-height: 12rem;\n}\n\n.wfr-steps-pane[_ngcontent-%COMP%] {\n flex: 1 1 45%;\n display: flex;\n flex-direction: column;\n min-height: 0;\n border-top: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n.wfr-step-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: var(--mj-space-1);\n padding: var(--mj-space-2);\n border-bottom: 1px solid var(--mj-border-default);\n max-height: 30%;\n overflow-y: auto;\n}\n\n.wfr-step[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) var(--mj-space-2);\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n color: var(--mj-text-primary);\n font-size: var(--mj-font-size-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-step[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-step-selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n\n\n.wfr-step[data-status='Skipped'][_ngcontent-%COMP%] .wfr-step-name[_ngcontent-%COMP%] {\n text-decoration: line-through;\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.wfr-step-meta[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-json[_ngcontent-%COMP%], \n.wfr-json-pane[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: auto;\n}\n\n.wfr-step-json-head[_ngcontent-%COMP%] {\n padding: var(--mj-space-1) var(--mj-space-3);\n font-weight: 600;\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n}"], changeDetection: 0 });
|
|
1805
|
+
} }, dependencies: [i1.NgClass, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJAlertComponent, i3.MJButtonDirective, i3.MJEmptyStateComponent, i3.MJPageBodyComponent, i3.MJPageHeaderComponent, i3.MJPageLayoutComponent, i3.MJPageSearchComponent, i3.MJRefreshButtonComponent, i3.MJStatBadgeComponent, i4.LoadingComponent, i5.TaskGraphVariablesComponent, i5.TaskGraphDebuggerComponent, i6.CodeEditorComponent, i7.SplitComponent, i7.SplitAreaComponent, i1.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.wfr-status-filters[_ngcontent-%COMP%] {\n display: flex;\n gap: var(--mj-space-1);\n align-items: center;\n}\n\n\n\n\n.wfr-split[_ngcontent-%COMP%] {\n height: 100%;\n min-height: 0;\n}\n\n\n\n[_nghost-%COMP%] .wfr-split > .as-split-gutter, \n[_nghost-%COMP%] .wfr-graph-split > .as-split-gutter {\n background: transparent !important;\n position: relative;\n}\n\n[_nghost-%COMP%] .wfr-split > .as-split-gutter::after, \n[_nghost-%COMP%] .wfr-graph-split > .as-split-gutter::after {\n content: '';\n position: absolute;\n inset: 0;\n margin: auto;\n background: var(--mj-border-default);\n border-radius: var(--mj-radius-full);\n}\n\n[_nghost-%COMP%] .wfr-split.as-horizontal > .as-split-gutter::after, \n[_nghost-%COMP%] .wfr-graph-split.as-horizontal > .as-split-gutter::after {\n width: 2px;\n}\n\n[_nghost-%COMP%] .wfr-graph-split.as-vertical > .as-split-gutter::after {\n height: 2px;\n}\n\n[_nghost-%COMP%] .wfr-split > .as-split-gutter:hover::after, \n[_nghost-%COMP%] .wfr-graph-split > .as-split-gutter:hover::after {\n background: var(--mj-brand-primary);\n}\n\n\n\n\n\n.wfr-graph-split[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-height: 0;\n}\n\n.wfr-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1);\n overflow-y: auto;\n min-height: 0;\n}\n\n.wfr-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n width: 100%;\n padding: var(--mj-space-2) var(--mj-space-3);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n text-align: left;\n cursor: pointer;\n color: var(--mj-text-primary);\n}\n\n.wfr-row[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-row[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n.wfr-row-selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.wfr-row-main[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wfr-row-name[_ngcontent-%COMP%] {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-row-when[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.wfr-row-status[_ngcontent-%COMP%] {\n flex: none;\n font-size: var(--mj-font-size-xs);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 2px var(--mj-space-2);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-page);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n\n\n\n\n.wfr-row-status[data-status='Complete'][_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Failed'][_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Running'][_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.wfr-detail[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n \n\n\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n}\n\n.wfr-detail-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-detail-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n min-width: 0;\n}\n\n.wfr-detail-name[_ngcontent-%COMP%] {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-detail-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-1);\n flex: none;\n}\n\n\n\n\n\n\n\n\n.wfr-head[_ngcontent-%COMP%], \n.wfr-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 1.3fr) minmax(0, 1.3fr) minmax(0, 0.7fr) minmax(0, 0.9fr);\n gap: var(--mj-space-2);\n align-items: center;\n}\n\n.wfr-head[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n z-index: 1;\n padding: 0 var(--mj-space-3) var(--mj-space-1);\n background: var(--mj-bg-page);\n}\n\n.wfr-head-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n padding: var(--mj-space-1) 0;\n font-size: var(--mj-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-head-cell[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.wfr-head-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n opacity: 0.65;\n font-size: 0.85em;\n}\n\n.wfr-col-time[_ngcontent-%COMP%], \n.wfr-col-duration[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.wfr-col-status[_ngcontent-%COMP%] {\n justify-self: start;\n}\n\n\n\n\n\n.wfr-detail-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: var(--mj-space-1);\n padding: 0 var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-tab[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n padding: var(--mj-space-2) var(--mj-space-2);\n font-size: var(--mj-font-size-sm);\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.wfr-tab-active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.wfr-graph-pane[_ngcontent-%COMP%] {\n height: 100%;\n min-height: 12rem;\n}\n\n.wfr-steps-pane[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n border-left: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n\n\n[_nghost-%COMP%] .as-vertical .wfr-steps-pane {\n border-left: none;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.wfr-step-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: var(--mj-space-1);\n padding: var(--mj-space-2);\n border-bottom: 1px solid var(--mj-border-default);\n max-height: 8rem;\n overflow-y: auto;\n flex: none;\n}\n\n.wfr-step[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) var(--mj-space-2);\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n color: var(--mj-text-primary);\n font-size: var(--mj-font-size-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-step[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-step-selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n\n\n.wfr-step[data-status='Skipped'][_ngcontent-%COMP%] .wfr-step-name[_ngcontent-%COMP%] {\n text-decoration: line-through;\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.wfr-step-meta[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-json[_ngcontent-%COMP%], \n.wfr-json-pane[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: auto;\n}\n\n.wfr-step-json-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) var(--mj-space-3);\n font-weight: 600;\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n flex: none;\n}\n\n\n\n\n.wfr-stall[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px 12px;\n margin: 0 12px 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 45%, var(--mj-border-default));\n border-left: 4px solid var(--mj-status-warning);\n border-radius: var(--mj-radius-md);\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n font-size: var(--mj-font-size-sm);\n}\n.wfr-stall-body[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n.wfr-stall[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n.wfr-stall-copy[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n.wfr-stall-copy[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n}\n.wfr-stall-reason[_ngcontent-%COMP%] { color: var(--mj-text-secondary); }\n.wfr-stall-actions[_ngcontent-%COMP%] { display: flex; flex-wrap: wrap; gap: 6px; }\n\n.wfr-replay[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page);\n}\n.wfr-replay[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-text-secondary); }\n.wfr-replay[_ngcontent-%COMP%] input[type='range'][_ngcontent-%COMP%] { flex: 1; accent-color: var(--mj-brand-primary); }\n\n.wfr-engine[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n overflow-x: auto;\n padding: 6px 12px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page);\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n.wfr-tick[_ngcontent-%COMP%] {\n flex: none;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n white-space: nowrap;\n}\n.wfr-tick-held[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-status-warning, #d97706) 45%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-status-warning, #d97706) 8%, var(--mj-bg-surface));\n}\n.wfr-tick-paused[_ngcontent-%COMP%] { color: var(--mj-brand-primary); border-color: var(--mj-border-strong); }\n\n.wfr-insp-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 7px 10px;\n margin: 0 0 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-primary);\n}\n.wfr-insp-card[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n}\n.wfr-insp-label[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n}\n.wfr-insp-card[data-verdict='held'][_ngcontent-%COMP%], \n.wfr-insp-bad[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-status-warning, #d97706) 45%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-status-warning, #d97706) 8%, var(--mj-bg-surface));\n}\n.wfr-insp-card[data-verdict='satisfied'][_ngcontent-%COMP%] .wfr-insp-label[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n.wfr-insp-actions[_ngcontent-%COMP%] { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 8px; }\n.wfr-insp-hint[_ngcontent-%COMP%] {\n margin: 0 0 8px;\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-muted);\n}\n\n.wfr-bp-bar[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 6px 12px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page);\n}\n.wfr-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: var(--mj-font-size-xs);\n cursor: pointer;\n}\n.wfr-chip-break[_ngcontent-%COMP%] { color: var(--mj-status-error); border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent); }\n.wfr-chip-break[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 7px; }\n.wfr-chip-paused[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n cursor: default;\n}\n.wfr-chip-forced[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n border-color: color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n cursor: default;\n}\n.wfr-chip-x[_ngcontent-%COMP%] {\n font-size: 14px;\n line-height: 1;\n padding: 0 2px;\n}\n.wfr-chip-x[_ngcontent-%COMP%]:hover { color: var(--mj-text-primary); }\n\n.wfr-bp[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin: 0 0 8px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n.wfr-bp[_ngcontent-%COMP%]:hover { color: var(--mj-status-error); }\n.wfr-bp-on[_ngcontent-%COMP%], \n.wfr-bp-on[_ngcontent-%COMP%]:hover { color: var(--mj-status-error); }\n.wfr-bp[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 10px; }\n.wfr-bp[_ngcontent-%COMP%]:disabled { opacity: 0.45; cursor: default; }\n\n.wfr-editor-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px;\n margin: 0 0 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-card);\n}\n.wfr-editor-danger[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, var(--mj-border-default));\n}\n.wfr-json-edit[_ngcontent-%COMP%] {\n width: 100%;\n min-height: 120px;\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n resize: vertical;\n}\n.wfr-editor-error[_ngcontent-%COMP%] { color: var(--mj-status-error); font-size: var(--mj-font-size-xs); }"], changeDetection: 0 });
|
|
666
1806
|
};
|
|
667
|
-
WorkflowRunsResourceComponent = __decorate([
|
|
1807
|
+
WorkflowRunsResourceComponent = WorkflowRunsResourceComponent_1 = __decorate([
|
|
668
1808
|
RegisterClass(BaseResourceComponent, 'WorkflowRunsResource')
|
|
669
1809
|
], WorkflowRunsResourceComponent);
|
|
670
1810
|
export { WorkflowRunsResourceComponent };
|
|
671
1811
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WorkflowRunsResourceComponent, [{
|
|
672
1812
|
type: Component,
|
|
673
|
-
args: [{ standalone: false, selector: 'mj-workflow-runs', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mj-page-layout>\n <mj-page-header\n Title=\"Runs\"\n Icon=\"fa-solid fa-timeline\"\n Subtitle=\"Every workflow that has run \u2014 however it was started.\">\n\n <div meta>\n @if (!IsLoading && Runs.length > 0) {\n <mj-stat-badge\n [Count]=\"VisibleRuns.length\"\n [Total]=\"Runs.length\"\n Label=\"runs\"></mj-stat-badge>\n }\n </div>\n\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"loadData()\"></mj-refresh-button>\n </div>\n\n <div toolbar>\n <mj-page-search\n [Value]=\"SearchText\"\n Placeholder=\"Search runs\"\n (ValueChange)=\"OnSearch($event)\"></mj-page-search>\n\n <div class=\"wfr-status-filters\">\n @for (status of StatusFilters; track status) {\n <button\n type=\"button\"\n mjButton\n [variant]=\"StatusFilter === status ? 'primary' : 'flat'\"\n size=\"sm\"\n (click)=\"OnFilterByStatus(status)\">\n {{ status === 'all' ? 'All' : status }}\n </button>\n }\n </div>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n @if (IsLoading) {\n <mj-loading text=\"Loading runs...\"></mj-loading>\n } @else if (LoadError) {\n <mj-alert Variant=\"error\" [Message]=\"LoadError\"></mj-alert>\n } @else if (Runs.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-timeline\"\n Title=\"Nothing has run yet\"\n Message=\"When a workflow runs \u2014 started by hand, on a schedule, or by an agent \u2014 it will appear here.\">\n </mj-empty-state>\n } @else if (VisibleRuns.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-filter\"\n Title=\"No runs match\"\n Message=\"Nothing matches the current filter. Clear it to see everything that has run.\">\n </mj-empty-state>\n } @else {\n <div class=\"wfr-split\" [class.wfr-split-open]=\"SelectedRun\">\n <div class=\"wfr-list\">\n <!-- A header row that sorts. Every column a person scans by is sortable, because \"the\n longest run\" and \"the one that failed this morning\" are the two questions this list\n exists to answer and neither is answerable by scrolling. -->\n <div class=\"wfr-head\" role=\"row\">\n <button type=\"button\" class=\"wfr-head-cell wfr-col-name\" (click)=\"OnSort('Name')\">\n Workflow <i [ngClass]=\"SortIcon('Name')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-time\" (click)=\"OnSort('StartedAt')\">\n Started <i [ngClass]=\"SortIcon('StartedAt')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-time\" (click)=\"OnSort('CompletedAt')\">\n Ended <i [ngClass]=\"SortIcon('CompletedAt')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-duration\" (click)=\"OnSort('Duration')\">\n Duration <i [ngClass]=\"SortIcon('Duration')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-status\" (click)=\"OnSort('Status')\">\n Status <i [ngClass]=\"SortIcon('Status')\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @for (run of VisibleRuns; track run.ID) {\n <button\n type=\"button\"\n class=\"wfr-row\"\n [class.wfr-row-selected]=\"run.ID === SelectedRunID\"\n (click)=\"OnSelectRun(run)\">\n <span class=\"wfr-col-name wfr-row-name\">{{ run.Name }}</span>\n <!-- An em dash, never a fabricated time: a run that has not started has no start, and\n printing one would read as data. -->\n <span class=\"wfr-col-time\">{{ run.StartedAt ? (run.StartedAt | date:'MMM d, h:mm:ss a') : '\u2014' }}</span>\n <span class=\"wfr-col-time\">{{ run.CompletedAt ? (run.CompletedAt | date:'MMM d, h:mm:ss a') : '\u2014' }}</span>\n <span class=\"wfr-col-duration\">{{ run.Duration }}</span>\n <span class=\"wfr-col-status wfr-row-status\" [attr.data-status]=\"run.Status\">{{ run.Status }}</span>\n </button>\n }\n </div>\n\n @if (SelectedRun; as selected) {\n <!-- The canvas lives in the RIGHT PANEL on selection, not nested inside the list row.\n A graph needs room to be read; inlining one per row turns a scannable list into a\n stack of diagrams. -->\n <aside class=\"wfr-detail\">\n <header class=\"wfr-detail-head\">\n <div class=\"wfr-detail-title\">\n <span class=\"wfr-detail-name\">{{ selected.Name }}</span>\n <span class=\"wfr-row-status\" [attr.data-status]=\"selected.Status\">{{ selected.Status }}</span>\n </div>\n <div class=\"wfr-detail-actions\">\n @if (selected.AgentRunID) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnOpenAgentRun(selected)\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\" aria-hidden=\"true\"></i>\n Agent run\n </button>\n }\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnSelectRun(selected)\" aria-label=\"Close\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n <div class=\"wfr-detail-tabs\" role=\"tablist\">\n <button type=\"button\" class=\"wfr-tab\" [class.wfr-tab-active]=\"DetailTab === 'graph'\"\n (click)=\"OnDetailTab('graph')\">\n <i class=\"fa-solid fa-diagram-project\" aria-hidden=\"true\"></i> Workflow\n </button>\n <button type=\"button\" class=\"wfr-tab\" [class.wfr-tab-active]=\"DetailTab === 'json'\"\n (click)=\"OnDetailTab('json')\">\n <i class=\"fa-solid fa-code\" aria-hidden=\"true\"></i> JSON\n </button>\n </div>\n\n @if (DetailTab === 'graph') {\n <!-- The canvas, then whatever step is selected on it. Clicking a node shows that\n step's record \u2014 the same move the agent-run timeline offers, so a workflow reads\n the same way wherever it is opened from. -->\n <div class=\"wfr-graph-pane\">\n <mj-task-graph-run-view\n [Provider]=\"ProviderToUse\"\n [ParentTaskID]=\"selected.ID\"\n [WorkflowName]=\"selected.Name\"\n [LiveUpdates]=\"selected.Status === 'Running' || selected.Status === 'In Progress'\"\n Height=\"100%\"\n (NodeSelected)=\"OnGraphNodeSelected($event)\">\n </mj-task-graph-run-view>\n </div>\n\n <div class=\"wfr-steps-pane\">\n @if (StepsLoading) {\n <mj-loading text=\"Loading steps...\"></mj-loading>\n } @else {\n <div class=\"wfr-step-list\">\n @for (step of SelectedSteps; track step.ID) {\n <button type=\"button\" class=\"wfr-step\"\n [class.wfr-step-selected]=\"step.ID === SelectedStepID\"\n [attr.data-status]=\"step.Status\"\n (click)=\"OnSelectStep(step)\">\n <span class=\"wfr-step-name\">{{ step.Name }}</span>\n <span class=\"wfr-step-meta\">{{ step.StepType || 'Step' }}</span>\n <span class=\"wfr-row-status\" [attr.data-status]=\"step.Status\">{{ step.Status }}</span>\n </button>\n }\n </div>\n\n @if (SelectedStep; as step) {\n <div class=\"wfr-step-json\">\n <div class=\"wfr-step-json-head\">{{ step.Name }}</div>\n <mj-code-editor\n [ngModel]=\"SelectedStepJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%;\">\n </mj-code-editor>\n </div>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-hand-pointer\"\n Title=\"Select a step\"\n Message=\"Click a step on the canvas or in the list to see everything it recorded.\">\n </mj-empty-state>\n }\n }\n </div>\n } @else {\n <div class=\"wfr-json-pane\">\n <mj-code-editor\n [ngModel]=\"SelectedRunJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </aside>\n }\n </div>\n }\n </mj-page-body>\n</mj-page-layout>\n", styles: [":host {\n display: block;\n height: 100%;\n}\n\n.wfr-status-filters {\n display: flex;\n gap: var(--mj-space-1);\n align-items: center;\n}\n\n/* List alone until something is selected; two panes after. The canvas gets the larger share\n because a graph is the thing being read once it is open. */\n.wfr-split {\n display: grid;\n grid-template-columns: 1fr;\n gap: var(--mj-space-3);\n height: 100%;\n min-height: 0;\n}\n\n.wfr-split-open {\n grid-template-columns: minmax(28rem, 40%) 1fr;\n}\n\n@media (max-width: 900px) {\n .wfr-split-open {\n grid-template-columns: 1fr;\n }\n}\n\n.wfr-list {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1);\n overflow-y: auto;\n min-height: 0;\n}\n\n.wfr-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n width: 100%;\n padding: var(--mj-space-2) var(--mj-space-3);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n text-align: left;\n cursor: pointer;\n color: var(--mj-text-primary);\n}\n\n.wfr-row:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-row:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n.wfr-row-selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.wfr-row-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wfr-row-name {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-row-when {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.wfr-row-status {\n flex: none;\n font-size: var(--mj-font-size-xs);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 2px var(--mj-space-2);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-page);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n/* Status carries meaning, so it is encoded in colour as well as text \u2014 a failed run should be\n findable without reading every row. Skipped stays grey on purpose: a branch that was not taken\n is a normal outcome, not a warning. */\n.wfr-row-status[data-status='Complete'] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Failed'] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Running'] {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.wfr-detail {\n display: flex;\n flex-direction: column;\n min-height: 0;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n}\n\n.wfr-detail-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-detail-title {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n min-width: 0;\n}\n\n.wfr-detail-name {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-detail-actions {\n display: flex;\n align-items: center;\n gap: var(--mj-space-1);\n flex: none;\n}\n\n/* ============================================================\n The run list as a sortable table\n ============================================================\n A run list is scanned for two things \u2014 the slowest run and the one that failed \u2014 and neither is\n answerable by scrolling. Columns line up so a reader compares down a column rather than reading\n each row; `tabular-nums` keeps the timestamps from jittering as digits change. */\n.wfr-head,\n.wfr-row {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 1.3fr) minmax(0, 1.3fr) minmax(0, 0.7fr) minmax(0, 0.9fr);\n gap: var(--mj-space-2);\n align-items: center;\n}\n\n.wfr-head {\n position: sticky;\n top: 0;\n z-index: 1;\n padding: 0 var(--mj-space-3) var(--mj-space-1);\n background: var(--mj-bg-page);\n}\n\n.wfr-head-cell {\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n padding: var(--mj-space-1) 0;\n font-size: var(--mj-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-head-cell:hover {\n color: var(--mj-text-primary);\n}\n\n.wfr-head-cell i {\n opacity: 0.65;\n font-size: 0.85em;\n}\n\n.wfr-col-time,\n.wfr-col-duration {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.wfr-col-status {\n justify-self: start;\n}\n\n/* ============================================================\n Detail panel: canvas + step JSON, or the whole run as JSON\n ============================================================ */\n.wfr-detail-tabs {\n display: flex;\n gap: var(--mj-space-1);\n padding: 0 var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-tab {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n padding: var(--mj-space-2) var(--mj-space-2);\n font-size: var(--mj-font-size-sm);\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.wfr-tab-active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n/* The canvas takes the larger share; the step pane below it is a reading surface, not a diagram. */\n.wfr-graph-pane {\n flex: 1 1 55%;\n min-height: 12rem;\n}\n\n.wfr-steps-pane {\n flex: 1 1 45%;\n display: flex;\n flex-direction: column;\n min-height: 0;\n border-top: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n.wfr-step-list {\n display: flex;\n flex-wrap: wrap;\n gap: var(--mj-space-1);\n padding: var(--mj-space-2);\n border-bottom: 1px solid var(--mj-border-default);\n max-height: 30%;\n overflow-y: auto;\n}\n\n.wfr-step {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) var(--mj-space-2);\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n color: var(--mj-text-primary);\n font-size: var(--mj-font-size-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-step:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-step-selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n/* Work that never ran must not read like work that did \u2014 the same rule the run timeline follows. */\n.wfr-step[data-status='Skipped'] .wfr-step-name {\n text-decoration: line-through;\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-name {\n font-weight: 600;\n}\n\n.wfr-step-meta {\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-json,\n.wfr-json-pane {\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: auto;\n}\n\n.wfr-step-json-head {\n padding: var(--mj-space-1) var(--mj-space-3);\n font-weight: 600;\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n}\n"] }]
|
|
674
|
-
}], () => [{ type: i0.ChangeDetectorRef }],
|
|
675
|
-
|
|
1813
|
+
args: [{ standalone: false, selector: 'mj-workflow-runs', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mj-page-layout>\n <mj-page-header\n Title=\"Runs\"\n Icon=\"fa-solid fa-timeline\"\n Subtitle=\"Every workflow that has run \u2014 however it was started.\">\n\n <div meta>\n @if (!IsLoading && Runs.length > 0) {\n <mj-stat-badge\n [Count]=\"VisibleRuns.length\"\n [Total]=\"Runs.length\"\n Label=\"runs\"></mj-stat-badge>\n }\n </div>\n\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"loadData()\"></mj-refresh-button>\n </div>\n\n <div toolbar>\n <mj-page-search\n [Value]=\"SearchText\"\n Placeholder=\"Search runs\"\n (ValueChange)=\"OnSearch($event)\"></mj-page-search>\n\n <div class=\"wfr-status-filters\">\n @for (status of StatusFilters; track status) {\n <button\n type=\"button\"\n mjButton\n [variant]=\"StatusFilter === status ? 'primary' : 'flat'\"\n size=\"sm\"\n (click)=\"OnFilterByStatus(status)\">\n {{ status === 'all' ? 'All' : status }}\n </button>\n }\n </div>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n @if (IsLoading) {\n <mj-loading text=\"Loading runs...\"></mj-loading>\n } @else if (LoadError) {\n <mj-alert Variant=\"error\" [Message]=\"LoadError\"></mj-alert>\n } @else if (Runs.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-timeline\"\n Title=\"Nothing has run yet\"\n Message=\"When a workflow runs \u2014 started by hand, on a schedule, or by an agent \u2014 it will appear here.\">\n </mj-empty-state>\n } @else if (VisibleRuns.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-filter\"\n Title=\"No runs match\"\n Message=\"Nothing matches the current filter. Clear it to see everything that has run.\">\n </mj-empty-state>\n } @else {\n <as-split class=\"wfr-split\" direction=\"horizontal\" unit=\"percent\"\n [gutterSize]=\"8\" [disabled]=\"!SelectedRun\" (dragEnd)=\"OnSplitDragEnd($event.sizes)\">\n <as-split-area [size]=\"SelectedRun ? Layout.SplitSizes[0] : 100\" [minSize]=\"20\">\n <div class=\"wfr-list\">\n <!-- A header row that sorts. Every column a person scans by is sortable, because \"the\n longest run\" and \"the one that failed this morning\" are the two questions this list\n exists to answer and neither is answerable by scrolling. -->\n <div class=\"wfr-head\" role=\"row\">\n <button type=\"button\" class=\"wfr-head-cell wfr-col-name\" (click)=\"OnSort('Name')\">\n Workflow <i [ngClass]=\"SortIcon('Name')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-time\" (click)=\"OnSort('StartedAt')\">\n Started <i [ngClass]=\"SortIcon('StartedAt')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-time\" (click)=\"OnSort('CompletedAt')\">\n Ended <i [ngClass]=\"SortIcon('CompletedAt')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-duration\" (click)=\"OnSort('Duration')\">\n Duration <i [ngClass]=\"SortIcon('Duration')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-status\" (click)=\"OnSort('Status')\">\n Status <i [ngClass]=\"SortIcon('Status')\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @for (run of VisibleRuns; track run.ID) {\n <button\n type=\"button\"\n class=\"wfr-row\"\n [class.wfr-row-selected]=\"run.ID === SelectedRunID\"\n (click)=\"OnSelectRun(run)\">\n <span class=\"wfr-col-name wfr-row-name\">{{ run.Name }}</span>\n <!-- An em dash, never a fabricated time: a run that has not started has no start, and\n printing one would read as data. -->\n <span class=\"wfr-col-time\">{{ run.StartedAt ? (run.StartedAt | date:'MMM d, h:mm:ss a') : '\u2014' }}</span>\n <span class=\"wfr-col-time\">{{ run.CompletedAt ? (run.CompletedAt | date:'MMM d, h:mm:ss a') : '\u2014' }}</span>\n <span class=\"wfr-col-duration\">{{ run.Duration }}</span>\n <span class=\"wfr-col-status wfr-row-status\" [attr.data-status]=\"run.Status\">{{ run.Status }}</span>\n </button>\n }\n </div>\n </as-split-area>\n\n <as-split-area [size]=\"SelectedRun ? Layout.SplitSizes[1] : 0\" [minSize]=\"25\" [visible]=\"!!SelectedRun\">\n @if (SelectedRun; as selected) {\n <!-- The canvas lives in the RIGHT PANEL on selection, not nested inside the list row.\n A graph needs room to be read; inlining one per row turns a scannable list into a\n stack of diagrams. -->\n <aside class=\"wfr-detail\">\n <header class=\"wfr-detail-head\">\n <div class=\"wfr-detail-title\">\n <span class=\"wfr-detail-name\">{{ selected.Name }}</span>\n <span class=\"wfr-row-status\" [attr.data-status]=\"selected.Status\">{{ selected.Status }}</span>\n </div>\n <div class=\"wfr-detail-actions\">\n @if (selected.AgentRunID) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnOpenAgentRun(selected)\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\" aria-hidden=\"true\"></i>\n Agent run\n </button>\n }\n @if (DetailTab === 'graph') {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"ToggleStepPanel()\"\n [title]=\"Layout.StepPanelOpen ? 'Hide step details' : 'Show step details'\">\n <i class=\"fa-solid\" [class.fa-square-caret-right]=\"Layout.StepPanelOpen\"\n [class.fa-square-caret-left]=\"!Layout.StepPanelOpen\" aria-hidden=\"true\"></i>\n </button>\n }\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnSelectRun(selected)\" aria-label=\"Close\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n <div class=\"wfr-detail-tabs\" role=\"tablist\">\n <button type=\"button\" class=\"wfr-tab\" [class.wfr-tab-active]=\"DetailTab === 'graph'\"\n (click)=\"OnDetailTab('graph')\">\n <i class=\"fa-solid fa-diagram-project\" aria-hidden=\"true\"></i> Workflow\n </button>\n <button type=\"button\" class=\"wfr-tab\" [class.wfr-tab-active]=\"DetailTab === 'json'\"\n (click)=\"OnDetailTab('json')\">\n <i class=\"fa-solid fa-code\" aria-hidden=\"true\"></i> JSON\n </button>\n </div>\n\n @if (Stall) {\n <!-- The hardening review's signature failure \u2014 \"the run strands silently\" \u2014 made\n loud. A held path is now something the operator can answer, not just read. -->\n <div class=\"wfr-stall\" role=\"status\" [attr.data-kind]=\"Stall.kind\">\n <div class=\"wfr-stall-body\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>\n <div class=\"wfr-stall-copy\">\n <span>{{ Stall.message }}</span>\n @if (Stall.conditionText) {\n <code>{{ Stall.conditionText }}</code>\n }\n @if (Stall.reason) {\n <span class=\"wfr-stall-reason\">{{ Stall.reason }}</span>\n }\n </div>\n </div>\n @if (Stall.kind === 'held' && Stall.edgeID) {\n <div class=\"wfr-stall-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(Stall.edgeID!, 'true')\">\n Answer true\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(Stall.edgeID!, 'false')\">\n Answer false\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnDismissStall()\">\n Leave held\n </button>\n </div>\n }\n </div>\n }\n\n @if (DetailTab === 'graph') {\n <!-- Canvas BESIDE the step it opened, not above it. A JSON record in a strip along the\n bottom shows about ten lines, which is not enough of a record to read. -->\n <as-split class=\"wfr-graph-split\" [direction]=\"InnerSplitDirection\" unit=\"percent\"\n [gutterSize]=\"8\" (dragEnd)=\"OnStepSplitDragEnd($event.sizes)\">\n <as-split-area [size]=\"Layout.StepPanelOpen ? Layout.StepSplitSizes[0] : 100\" [minSize]=\"25\">\n <div class=\"wfr-graph-pane\">\n <mj-task-graph-debugger\n #GraphDebug\n [Provider]=\"ProviderToUse\"\n [ParentTaskID]=\"selected.ID\"\n [WorkflowName]=\"selected.Name\"\n [LiveUpdates]=\"selected.Status === 'Running' || selected.Status === 'In Progress'\"\n [ReplayAt]=\"ReplayAt\"\n [ShowLegend]=\"Layout.ShowLegend\"\n Height=\"100%\"\n (NodeSelected)=\"OnGraphNodeSelected($event)\"\n (ConnectionSelected)=\"OnGraphConnectionSelected($event)\"\n (LegendToggled)=\"OnLegendToggled($event)\"\n (Settled)=\"OnCanvasSettled()\"\n (Frame)=\"OnFrame($event)\"\n (PausedChange)=\"DebugPaused = $event\">\n </mj-task-graph-debugger>\n\n @if (CanReplay) {\n <!-- Replay: scrub through the settled run on the same canvas, reconstructed\n from each step's own timestamps. Read-only by construction. -->\n <div class=\"wfr-replay\">\n <i class=\"fa-solid fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n <input type=\"range\" min=\"0\" max=\"100\" step=\"1\"\n [value]=\"ReplayPercent ?? 100\"\n (input)=\"OnReplayScrub($any($event.target).value)\"\n aria-label=\"Replay position\" />\n @if (ReplayPercent !== null) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnReplayReset()\">Now</button>\n }\n </div>\n }\n\n @if (GraphDebug.Breakpoints.length > 0 || GraphDebug.PausedAtTaskID) {\n <div class=\"wfr-bp-bar\" aria-label=\"Armed breakpoints\">\n @if (GraphDebug.PausedAtTaskID) {\n <span class=\"wfr-chip wfr-chip-paused\">\n <i class=\"fa-solid fa-pause\" aria-hidden=\"true\"></i>\n Paused at {{ StepName(GraphDebug.PausedAtTaskID) }}\n </span>\n }\n @for (id of GraphDebug.Breakpoints; track id) {\n <button type=\"button\" class=\"wfr-chip wfr-chip-break\" (click)=\"OnSelectBreakpoint(id)\">\n <i class=\"fa-solid fa-circle\" aria-hidden=\"true\"></i>\n {{ StepName(id) }}\n <span class=\"wfr-chip-x\" (click)=\"OnRemoveBreakpoint(id); $event.stopPropagation()\"\n role=\"button\" tabindex=\"0\" aria-label=\"Remove breakpoint\">\u00D7</span>\n </button>\n }\n </div>\n }\n\n @if (EngineTicks.length > 0) {\n <!-- The engine strip: one tick per dispatcher pass. A stuck run is a strip\n that keeps ticking with nothing moving \u2014 the honest visual of a stall. -->\n <div class=\"wfr-engine\" aria-label=\"Engine activity\">\n @for (tick of EngineTicks; track tick.passNumber) {\n <span class=\"wfr-tick\" [class.wfr-tick-held]=\"(tick.heldCount ?? 0) > 0\">\n #{{ tick.passNumber }} \u00B7 ready {{ tick.eligibleCount ?? 0 }}\n \u00B7 held {{ tick.heldCount ?? 0 }} \u00B7 took {{ tick.claimedCount ?? 0 }}\n </span>\n }\n @if (GraphDebug.Paused) {\n <span class=\"wfr-tick wfr-tick-paused\">\u23F8 paused \u2014 nothing new starts</span>\n }\n </div>\n }\n </div>\n </as-split-area>\n\n <as-split-area [size]=\"Layout.StepPanelOpen ? Layout.StepSplitSizes[1] : 0\" [minSize]=\"20\"\n [visible]=\"Layout.StepPanelOpen\">\n <div class=\"wfr-steps-pane\">\n @if (StepsLoading) {\n <mj-loading text=\"Loading steps...\"></mj-loading>\n } @else {\n <div class=\"wfr-step-list\">\n @for (step of SelectedSteps; track step.ID) {\n <button type=\"button\" class=\"wfr-step\"\n [class.wfr-step-selected]=\"step.ID === SelectedStepID\"\n [attr.data-status]=\"step.Status\"\n (click)=\"OnSelectStep(step)\">\n <span class=\"wfr-step-name\">{{ step.Name }}</span>\n <span class=\"wfr-step-meta\">{{ step.StepType || 'Step' }}</span>\n </button>\n }\n </div>\n\n @if (InspectorMode === 'edge' && SelectedEdge; as edge) {\n <div class=\"wfr-step-json\">\n <div class=\"wfr-step-json-head\">\n <span>{{ SelectedEdgeFromName }} \u2192 {{ SelectedEdgeToName }}</span>\n @if (SelectedEdgeOverride) {\n <span class=\"wfr-chip wfr-chip-forced\">forced {{ SelectedEdgeOverride }}</span>\n }\n </div>\n <div class=\"wfr-insp-card\">\n <span class=\"wfr-insp-label\">Condition</span>\n @if (edge.Condition?.trim()) {\n <code>{{ edge.Condition }}</code>\n } @else {\n <span>Unconditional \u2014 this path always runs.</span>\n }\n </div>\n @if (SelectedEdgeIsConditional) {\n <div class=\"wfr-insp-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(edge.ID, 'true')\">Answer true</button>\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(edge.ID, 'false')\">Answer false</button>\n @if (SelectedEdgeOverride) {\n <button mjButton variant=\"flat\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(edge.ID, null)\">Clear override</button>\n }\n </div>\n } @else {\n <p class=\"wfr-insp-hint\">Skip the target step instead of overriding an unconditional path.</p>\n }\n </div>\n } @else if (SelectedStep; as step) {\n <div class=\"wfr-step-json\">\n <div class=\"wfr-step-json-head\">\n <span>{{ step.Name }}</span>\n <span class=\"wfr-row-status\" [attr.data-status]=\"step.Status\">{{ step.Status }}</span>\n </div>\n\n <button type=\"button\" class=\"wfr-bp\"\n [class.wfr-bp-on]=\"HasBreakpoint(step.ID)\"\n [disabled]=\"ControlBusy\"\n (click)=\"OnBreakpointToggled({ TaskID: step.ID, Enabled: !HasBreakpoint(step.ID) })\"\n [attr.aria-pressed]=\"HasBreakpoint(step.ID)\"\n [title]=\"HasBreakpoint(step.ID) ? 'Remove breakpoint' : 'Break before this step'\">\n <i class=\"fa-circle\"\n [class.fa-solid]=\"HasBreakpoint(step.ID)\"\n [class.fa-regular]=\"!HasBreakpoint(step.ID)\"\n aria-hidden=\"true\"></i>\n </button>\n\n <!-- The inspector: live engine facts about this step, from the frame\n stream \u2014 claim, path verdicts, runner progress, what-if. -->\n @if (SelectedStepProgress; as progress) {\n <div class=\"wfr-insp-card\">\n <span class=\"wfr-insp-label\">Doing now</span>\n <span>{{ progress.progressMessage }}\n @if (progress.progressPercent != null) { ({{ progress.progressPercent }}%) }\n </span>\n </div>\n }\n @if (SelectedStepClaim; as claim) {\n <div class=\"wfr-insp-card\" [class.wfr-insp-bad]=\"claim.claimEvent === 'heartbeat-lost'\">\n <span class=\"wfr-insp-label\">Worker</span>\n <span>\n @switch (claim.claimEvent) {\n @case ('claimed') { {{ claim.claimedBy }} \u2014 working }\n @case ('heartbeat-lost') { {{ claim.claimedBy }} \u2014 lost, will be requeued }\n @case ('reclaimed') { requeued by the engine }\n }\n </span>\n </div>\n }\n @for (verdict of SelectedStepVerdicts; track verdict.edgeId) {\n <div class=\"wfr-insp-card\" [attr.data-verdict]=\"verdict.verdict\">\n <span class=\"wfr-insp-label\">\n @switch (verdict.verdict) {\n @case ('satisfied') { Path taken }\n @case ('notTaken') { Path not taken }\n @case ('held') { Path can't be answered }\n }\n </span>\n <span>\n @if (verdict.conditionText) { <code>{{ verdict.conditionText }}</code> }\n @if (verdict.reason) { \u2014 {{ verdict.reason }} }\n </span>\n </div>\n }\n @if (SelectedStepWhatIf; as whatIf) {\n <div class=\"wfr-insp-card\">\n <span class=\"wfr-insp-label\">If this step fails</span>\n <span>{{ whatIf.BlockedCount }} step{{ whatIf.BlockedCount === 1 ? '' : 's' }} can no longer run</span>\n </div>\n }\n @if (step.Status === 'Pending' || step.Status === 'Failed' || CanForceComplete(step)) {\n <div class=\"wfr-insp-actions\">\n @if (step.Status === 'Pending') {\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnSkipStep(step)\"\n title=\"Declare this step not-taken; later steps proceed\">\n <i class=\"fa-solid fa-forward\" aria-hidden=\"true\"></i> Skip step\n </button>\n }\n @if (CanEditInput(step)) {\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OpenEditInput(step)\">\n <i class=\"fa-solid fa-pen-to-square\" aria-hidden=\"true\"></i>\n {{ step.Status === 'Failed' ? 'Edit input & retry' : 'Edit input' }}\n </button>\n }\n @if (step.Status === 'Failed') {\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnRetryStep(step)\">\n <i class=\"fa-solid fa-rotate-right\" aria-hidden=\"true\"></i> Retry\n </button>\n }\n @if (CanForceComplete(step)) {\n <button mjButton variant=\"danger\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OpenForceComplete(step)\">\n <i class=\"fa-solid fa-flag-checkered\" aria-hidden=\"true\"></i> Force complete\n </button>\n }\n </div>\n }\n\n @if (EditInputOpen) {\n <div class=\"wfr-editor-card\">\n <span class=\"wfr-insp-label\">{{ step.Status === 'Failed' ? 'Edit input and retry' : 'Edit input' }}</span>\n <p class=\"wfr-insp-hint\">Applies to this run only. Invalid JSON is refused here.</p>\n <textarea class=\"mj-textarea wfr-json-edit\" [(ngModel)]=\"EditInputJson\"\n rows=\"8\" spellcheck=\"false\"></textarea>\n @if (EditInputError) {\n <span class=\"wfr-editor-error\">{{ EditInputError }}</span>\n }\n <div class=\"wfr-insp-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"SubmitEditInput(step)\">\n {{ step.Status === 'Failed' ? 'Apply & retry' : 'Apply' }}\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"EditInputOpen = false\">Cancel</button>\n </div>\n </div>\n }\n\n @if (ForceCompleteOpen) {\n <div class=\"wfr-editor-card wfr-editor-danger\">\n <span class=\"wfr-insp-label\">Force complete</span>\n <p class=\"wfr-insp-hint\">Downstream conditions will evaluate against this output as if the step had produced it. Type the step name to confirm.</p>\n <textarea class=\"mj-textarea wfr-json-edit\" [(ngModel)]=\"ForceCompleteJson\"\n rows=\"6\" spellcheck=\"false\"></textarea>\n <input class=\"mj-input\" type=\"text\" [(ngModel)]=\"ForceCompleteName\"\n [placeholder]=\"'Type \u201C' + step.Name + '\u201D to confirm'\" />\n @if (ForceCompleteError) {\n <span class=\"wfr-editor-error\">{{ ForceCompleteError }}</span>\n }\n <div class=\"wfr-insp-actions\">\n <button mjButton variant=\"danger\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"SubmitForceComplete(step)\">Force complete</button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"ForceCompleteOpen = false\">Cancel</button>\n </div>\n </div>\n }\n\n <mj-task-graph-variables\n [InputPayload]=\"StepPayload(step, 'InputPayload')\"\n [OutputPayload]=\"StepPayload(step, 'OutputPayload')\"\n [Invocation]=\"Invocation\">\n </mj-task-graph-variables>\n </div>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-hand-pointer\"\n Title=\"Select a step\"\n Message=\"Click a step on the canvas or in the list to see everything it recorded.\">\n </mj-empty-state>\n }\n }\n </div>\n </as-split-area>\n </as-split>\n } @else {\n <div class=\"wfr-json-pane\">\n <mj-code-editor\n [ngModel]=\"SelectedRunJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </aside>\n }\n </as-split-area>\n </as-split>\n }\n </mj-page-body>\n</mj-page-layout>\n", styles: [":host {\n display: block;\n height: 100%;\n}\n\n.wfr-status-filters {\n display: flex;\n gap: var(--mj-space-1);\n align-items: center;\n}\n\n/* List alone until something is selected; two resizable panes after. The size is the user's \u2014 see\n the LAYOUT_KEYS note on the component for why it is persisted server-side rather than locally. */\n.wfr-split {\n height: 100%;\n min-height: 0;\n}\n\n/* A gutter you can find. The default is a hairline, which is discoverable only by accident. */\n:host ::ng-deep .wfr-split > .as-split-gutter,\n:host ::ng-deep .wfr-graph-split > .as-split-gutter {\n background: transparent !important;\n position: relative;\n}\n\n:host ::ng-deep .wfr-split > .as-split-gutter::after,\n:host ::ng-deep .wfr-graph-split > .as-split-gutter::after {\n content: '';\n position: absolute;\n inset: 0;\n margin: auto;\n background: var(--mj-border-default);\n border-radius: var(--mj-radius-full);\n}\n\n:host ::ng-deep .wfr-split.as-horizontal > .as-split-gutter::after,\n:host ::ng-deep .wfr-graph-split.as-horizontal > .as-split-gutter::after {\n width: 2px;\n}\n\n:host ::ng-deep .wfr-graph-split.as-vertical > .as-split-gutter::after {\n height: 2px;\n}\n\n:host ::ng-deep .wfr-split > .as-split-gutter:hover::after,\n:host ::ng-deep .wfr-graph-split > .as-split-gutter:hover::after {\n background: var(--mj-brand-primary);\n}\n\n/* The canvas and the step record sit SIDE BY SIDE \u2014 a JSON record in a strip along the bottom shows\n about ten lines. Stacks below the breakpoint, where three columns would leave each too narrow to\n use. */\n.wfr-graph-split {\n flex: 1 1 auto;\n min-height: 0;\n}\n\n.wfr-list {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1);\n overflow-y: auto;\n min-height: 0;\n}\n\n.wfr-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n width: 100%;\n padding: var(--mj-space-2) var(--mj-space-3);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n text-align: left;\n cursor: pointer;\n color: var(--mj-text-primary);\n}\n\n.wfr-row:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-row:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n.wfr-row-selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.wfr-row-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wfr-row-name {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-row-when {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.wfr-row-status {\n flex: none;\n font-size: var(--mj-font-size-xs);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 2px var(--mj-space-2);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-page);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n/* Status carries meaning, so it is encoded in colour as well as text \u2014 a failed run should be\n findable without reading every row. Skipped stays grey on purpose: a branch that was not taken\n is a normal outcome, not a warning. */\n.wfr-row-status[data-status='Complete'] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Failed'] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Running'] {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.wfr-detail {\n display: flex;\n flex-direction: column;\n /* Fills its split area. Without it the column sizes to its CONTENT, so the canvas below \u2014\n `flex: 1 1 auto` of an auto-height parent \u2014 got its intrinsic height and left dead space. */\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n}\n\n.wfr-detail-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-detail-title {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n min-width: 0;\n}\n\n.wfr-detail-name {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-detail-actions {\n display: flex;\n align-items: center;\n gap: var(--mj-space-1);\n flex: none;\n}\n\n/* ============================================================\n The run list as a sortable table\n ============================================================\n A run list is scanned for two things \u2014 the slowest run and the one that failed \u2014 and neither is\n answerable by scrolling. Columns line up so a reader compares down a column rather than reading\n each row; `tabular-nums` keeps the timestamps from jittering as digits change. */\n.wfr-head,\n.wfr-row {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 1.3fr) minmax(0, 1.3fr) minmax(0, 0.7fr) minmax(0, 0.9fr);\n gap: var(--mj-space-2);\n align-items: center;\n}\n\n.wfr-head {\n position: sticky;\n top: 0;\n z-index: 1;\n padding: 0 var(--mj-space-3) var(--mj-space-1);\n background: var(--mj-bg-page);\n}\n\n.wfr-head-cell {\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n padding: var(--mj-space-1) 0;\n font-size: var(--mj-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-head-cell:hover {\n color: var(--mj-text-primary);\n}\n\n.wfr-head-cell i {\n opacity: 0.65;\n font-size: 0.85em;\n}\n\n.wfr-col-time,\n.wfr-col-duration {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.wfr-col-status {\n justify-self: start;\n}\n\n/* ============================================================\n Detail panel: canvas + step JSON, or the whole run as JSON\n ============================================================ */\n.wfr-detail-tabs {\n display: flex;\n gap: var(--mj-space-1);\n padding: 0 var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-tab {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n padding: var(--mj-space-2) var(--mj-space-2);\n font-size: var(--mj-font-size-sm);\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.wfr-tab-active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.wfr-graph-pane {\n height: 100%;\n min-height: 12rem;\n}\n\n.wfr-steps-pane {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n border-left: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n/* Stacked layout puts the divider back on top, where the eye expects it. */\n:host ::ng-deep .as-vertical .wfr-steps-pane {\n border-left: none;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.wfr-step-list {\n display: flex;\n flex-wrap: wrap;\n gap: var(--mj-space-1);\n padding: var(--mj-space-2);\n border-bottom: 1px solid var(--mj-border-default);\n max-height: 8rem;\n overflow-y: auto;\n flex: none;\n}\n\n.wfr-step {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) var(--mj-space-2);\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n color: var(--mj-text-primary);\n font-size: var(--mj-font-size-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-step:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-step-selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n/* Work that never ran must not read like work that did \u2014 the same rule the run timeline follows. */\n.wfr-step[data-status='Skipped'] .wfr-step-name {\n text-decoration: line-through;\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-name {\n font-weight: 600;\n}\n\n.wfr-step-meta {\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-json,\n.wfr-json-pane {\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: auto;\n}\n\n.wfr-step-json-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) var(--mj-space-3);\n font-weight: 600;\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n flex: none;\n}\n\n/* \u2500\u2500 live console \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.wfr-stall {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px 12px;\n margin: 0 12px 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 45%, var(--mj-border-default));\n border-left: 4px solid var(--mj-status-warning);\n border-radius: var(--mj-radius-md);\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n font-size: var(--mj-font-size-sm);\n}\n.wfr-stall-body {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n.wfr-stall i { color: var(--mj-status-warning); }\n.wfr-stall-copy {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n.wfr-stall-copy code {\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n}\n.wfr-stall-reason { color: var(--mj-text-secondary); }\n.wfr-stall-actions { display: flex; flex-wrap: wrap; gap: 6px; }\n\n.wfr-replay {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page);\n}\n.wfr-replay i { color: var(--mj-text-secondary); }\n.wfr-replay input[type='range'] { flex: 1; accent-color: var(--mj-brand-primary); }\n\n.wfr-engine {\n display: flex;\n gap: 8px;\n overflow-x: auto;\n padding: 6px 12px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page);\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n.wfr-tick {\n flex: none;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n white-space: nowrap;\n}\n.wfr-tick-held {\n border-color: color-mix(in srgb, var(--mj-status-warning, #d97706) 45%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-status-warning, #d97706) 8%, var(--mj-bg-surface));\n}\n.wfr-tick-paused { color: var(--mj-brand-primary); border-color: var(--mj-border-strong); }\n\n.wfr-insp-card {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 7px 10px;\n margin: 0 0 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-primary);\n}\n.wfr-insp-card code {\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n}\n.wfr-insp-label {\n font-size: var(--mj-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n}\n.wfr-insp-card[data-verdict='held'],\n.wfr-insp-bad {\n border-color: color-mix(in srgb, var(--mj-status-warning, #d97706) 45%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-status-warning, #d97706) 8%, var(--mj-bg-surface));\n}\n.wfr-insp-card[data-verdict='satisfied'] .wfr-insp-label { color: var(--mj-status-success); }\n.wfr-insp-actions { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 8px; }\n.wfr-insp-hint {\n margin: 0 0 8px;\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-muted);\n}\n\n.wfr-bp-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 6px 12px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page);\n}\n.wfr-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: var(--mj-font-size-xs);\n cursor: pointer;\n}\n.wfr-chip-break { color: var(--mj-status-error); border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent); }\n.wfr-chip-break i { font-size: 7px; }\n.wfr-chip-paused {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n cursor: default;\n}\n.wfr-chip-forced {\n color: var(--mj-status-warning);\n border-color: color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n cursor: default;\n}\n.wfr-chip-x {\n font-size: 14px;\n line-height: 1;\n padding: 0 2px;\n}\n.wfr-chip-x:hover { color: var(--mj-text-primary); }\n\n.wfr-bp {\n width: 22px;\n height: 22px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin: 0 0 8px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n.wfr-bp:hover { color: var(--mj-status-error); }\n.wfr-bp-on,\n.wfr-bp-on:hover { color: var(--mj-status-error); }\n.wfr-bp i { font-size: 10px; }\n.wfr-bp:disabled { opacity: 0.45; cursor: default; }\n\n.wfr-editor-card {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px;\n margin: 0 0 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-card);\n}\n.wfr-editor-danger {\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, var(--mj-border-default));\n}\n.wfr-json-edit {\n width: 100%;\n min-height: 120px;\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n resize: vertical;\n}\n.wfr-editor-error { color: var(--mj-status-error); font-size: var(--mj-font-size-xs); }\n"] }]
|
|
1814
|
+
}], () => [{ type: i0.ChangeDetectorRef }], { onViewportResized: [{
|
|
1815
|
+
type: HostListener,
|
|
1816
|
+
args: ['window:resize']
|
|
1817
|
+
}], GraphDebug: [{
|
|
1818
|
+
type: ViewChild,
|
|
1819
|
+
args: [TaskGraphDebuggerComponent]
|
|
1820
|
+
}] }); })();
|
|
1821
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(WorkflowRunsResourceComponent, { className: "WorkflowRunsResourceComponent", filePath: "src/Workflows/components/workflow-runs-resource.component.ts", lineNumber: 101 }); })();
|
|
676
1822
|
//# sourceMappingURL=workflow-runs-resource.component.js.map
|