@memberjunction/ng-dashboards 2.118.0 → 2.120.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/Testing/components/testing-execution.component.d.ts +1 -0
  2. package/dist/Testing/components/testing-execution.component.d.ts.map +1 -1
  3. package/dist/Testing/components/testing-execution.component.js +26 -9
  4. package/dist/Testing/components/testing-execution.component.js.map +1 -1
  5. package/dist/Testing/components/testing-feedback.component.d.ts +1 -1
  6. package/dist/Testing/components/testing-feedback.component.d.ts.map +1 -1
  7. package/dist/Testing/components/testing-feedback.component.js +3 -4
  8. package/dist/Testing/components/testing-feedback.component.js.map +1 -1
  9. package/dist/Testing/components/testing-overview.component.js +5 -6
  10. package/dist/Testing/components/testing-overview.component.js.map +1 -1
  11. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +2 -4
  12. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
  13. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +3 -5
  14. package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
  15. package/dist/Testing/testing-dashboard.component.js +33 -34
  16. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  17. package/dist/module.d.ts +24 -27
  18. package/dist/module.d.ts.map +1 -1
  19. package/dist/module.js +9 -17
  20. package/dist/module.js.map +1 -1
  21. package/package.json +13 -12
  22. package/dist/Testing/components/widgets/cost-display.component.d.ts +0 -16
  23. package/dist/Testing/components/widgets/cost-display.component.d.ts.map +0 -1
  24. package/dist/Testing/components/widgets/cost-display.component.js +0 -88
  25. package/dist/Testing/components/widgets/cost-display.component.js.map +0 -1
  26. package/dist/Testing/components/widgets/score-indicator.component.d.ts +0 -13
  27. package/dist/Testing/components/widgets/score-indicator.component.d.ts.map +0 -1
  28. package/dist/Testing/components/widgets/score-indicator.component.js +0 -93
  29. package/dist/Testing/components/widgets/score-indicator.component.js.map +0 -1
  30. package/dist/Testing/components/widgets/test-run-dialog.component.d.ts +0 -63
  31. package/dist/Testing/components/widgets/test-run-dialog.component.d.ts.map +0 -1
  32. package/dist/Testing/components/widgets/test-run-dialog.component.js +0 -989
  33. package/dist/Testing/components/widgets/test-run-dialog.component.js.map +0 -1
  34. package/dist/Testing/components/widgets/test-status-badge.component.d.ts +0 -10
  35. package/dist/Testing/components/widgets/test-status-badge.component.d.ts.map +0 -1
  36. package/dist/Testing/components/widgets/test-status-badge.component.js +0 -68
  37. package/dist/Testing/components/widgets/test-status-badge.component.js.map +0 -1
@@ -1,989 +0,0 @@
1
- import { Component, ChangeDetectionStrategy } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { TestEngineBase } from '@memberjunction/testing-engine-base';
4
- import { GraphQLTestingClient } from '@memberjunction/graphql-dataprovider';
5
- import { Metadata } from '@memberjunction/core';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@progress/kendo-angular-dialog";
8
- import * as i2 from "@angular/forms";
9
- import * as i3 from "@angular/common";
10
- const _forTrack0 = ($index, $item) => $item.ID;
11
- const _forTrack1 = ($index, $item) => $item.step;
12
- function TestRunDialogComponent_Conditional_1_Conditional_10_Conditional_4_Template(rf, ctx) { if (rf & 1) {
13
- const _r4 = i0.ɵɵgetCurrentView();
14
- i0.ɵɵelementStart(0, "button", 20);
15
- i0.ɵɵlistener("click", function TestRunDialogComponent_Conditional_1_Conditional_10_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
16
- i0.ɵɵelement(1, "i", 21);
17
- i0.ɵɵelementEnd();
18
- } }
19
- function TestRunDialogComponent_Conditional_1_Conditional_10_For_7_Conditional_8_Template(rf, ctx) { if (rf & 1) {
20
- i0.ɵɵelementStart(0, "div", 27);
21
- i0.ɵɵelement(1, "i", 28);
22
- i0.ɵɵelementEnd();
23
- } }
24
- function TestRunDialogComponent_Conditional_1_Conditional_10_For_7_Template(rf, ctx) { if (rf & 1) {
25
- const _r5 = i0.ɵɵgetCurrentView();
26
- i0.ɵɵelementStart(0, "div", 22);
27
- i0.ɵɵlistener("click", function TestRunDialogComponent_Conditional_1_Conditional_10_For_7_Template_div_click_0_listener() { const test_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.selectTest(test_r6.ID)); });
28
- i0.ɵɵelementStart(1, "div", 23);
29
- i0.ɵɵelement(2, "i", 7);
30
- i0.ɵɵelementEnd();
31
- i0.ɵɵelementStart(3, "div", 24)(4, "div", 25);
32
- i0.ɵɵtext(5);
33
- i0.ɵɵelementEnd();
34
- i0.ɵɵelementStart(6, "div", 26);
35
- i0.ɵɵtext(7);
36
- i0.ɵɵelementEnd()();
37
- i0.ɵɵtemplate(8, TestRunDialogComponent_Conditional_1_Conditional_10_For_7_Conditional_8_Template, 2, 0, "div", 27);
38
- i0.ɵɵelementEnd();
39
- } if (rf & 2) {
40
- const test_r6 = ctx.$implicit;
41
- const ctx_r1 = i0.ɵɵnextContext(3);
42
- i0.ɵɵclassProp("selected", ctx_r1.selectedTestId === test_r6.ID);
43
- i0.ɵɵadvance(5);
44
- i0.ɵɵtextInterpolate(test_r6.Name);
45
- i0.ɵɵadvance(2);
46
- i0.ɵɵtextInterpolate2("", test_r6.Type, " \u2022 ", test_r6.Description || "No description", "");
47
- i0.ɵɵadvance();
48
- i0.ɵɵconditional(ctx_r1.selectedTestId === test_r6.ID ? 8 : -1);
49
- } }
50
- function TestRunDialogComponent_Conditional_1_Conditional_10_ForEmpty_8_Template(rf, ctx) { if (rf & 1) {
51
- i0.ɵɵelementStart(0, "div", 19);
52
- i0.ɵɵelement(1, "i", 29);
53
- i0.ɵɵelementStart(2, "p");
54
- i0.ɵɵtext(3, "No tests found");
55
- i0.ɵɵelementEnd()();
56
- } }
57
- function TestRunDialogComponent_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
58
- const _r3 = i0.ɵɵgetCurrentView();
59
- i0.ɵɵelementStart(0, "div", 9)(1, "div", 13);
60
- i0.ɵɵelement(2, "i", 14);
61
- i0.ɵɵelementStart(3, "input", 15);
62
- i0.ɵɵtwoWayListener("ngModelChange", function TestRunDialogComponent_Conditional_1_Conditional_10_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.searchText, $event) || (ctx_r1.searchText = $event); return i0.ɵɵresetView($event); });
63
- i0.ɵɵlistener("input", function TestRunDialogComponent_Conditional_1_Conditional_10_Template_input_input_3_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.filterItems()); });
64
- i0.ɵɵelementEnd();
65
- i0.ɵɵtemplate(4, TestRunDialogComponent_Conditional_1_Conditional_10_Conditional_4_Template, 2, 0, "button", 16);
66
- i0.ɵɵelementEnd();
67
- i0.ɵɵelementStart(5, "div", 17);
68
- i0.ɵɵrepeaterCreate(6, TestRunDialogComponent_Conditional_1_Conditional_10_For_7_Template, 9, 6, "div", 18, _forTrack0, false, TestRunDialogComponent_Conditional_1_Conditional_10_ForEmpty_8_Template, 4, 0, "div", 19);
69
- i0.ɵɵelementEnd()();
70
- } if (rf & 2) {
71
- const ctx_r1 = i0.ɵɵnextContext(2);
72
- i0.ɵɵadvance(3);
73
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.searchText);
74
- i0.ɵɵadvance();
75
- i0.ɵɵconditional(ctx_r1.searchText ? 4 : -1);
76
- i0.ɵɵadvance(2);
77
- i0.ɵɵrepeater(ctx_r1.filteredTests);
78
- } }
79
- function TestRunDialogComponent_Conditional_1_Conditional_11_Conditional_4_Template(rf, ctx) { if (rf & 1) {
80
- const _r8 = i0.ɵɵgetCurrentView();
81
- i0.ɵɵelementStart(0, "button", 20);
82
- i0.ɵɵlistener("click", function TestRunDialogComponent_Conditional_1_Conditional_11_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
83
- i0.ɵɵelement(1, "i", 21);
84
- i0.ɵɵelementEnd();
85
- } }
86
- function TestRunDialogComponent_Conditional_1_Conditional_11_For_7_Conditional_8_Template(rf, ctx) { if (rf & 1) {
87
- i0.ɵɵelementStart(0, "div", 27);
88
- i0.ɵɵelement(1, "i", 28);
89
- i0.ɵɵelementEnd();
90
- } }
91
- function TestRunDialogComponent_Conditional_1_Conditional_11_For_7_Template(rf, ctx) { if (rf & 1) {
92
- const _r9 = i0.ɵɵgetCurrentView();
93
- i0.ɵɵelementStart(0, "div", 22);
94
- i0.ɵɵlistener("click", function TestRunDialogComponent_Conditional_1_Conditional_11_For_7_Template_div_click_0_listener() { const suite_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.selectSuite(suite_r10.ID)); });
95
- i0.ɵɵelementStart(1, "div", 31);
96
- i0.ɵɵelement(2, "i", 8);
97
- i0.ɵɵelementEnd();
98
- i0.ɵɵelementStart(3, "div", 24)(4, "div", 25);
99
- i0.ɵɵtext(5);
100
- i0.ɵɵelementEnd();
101
- i0.ɵɵelementStart(6, "div", 26);
102
- i0.ɵɵtext(7);
103
- i0.ɵɵelementEnd()();
104
- i0.ɵɵtemplate(8, TestRunDialogComponent_Conditional_1_Conditional_11_For_7_Conditional_8_Template, 2, 0, "div", 27);
105
- i0.ɵɵelementEnd();
106
- } if (rf & 2) {
107
- const suite_r10 = ctx.$implicit;
108
- const ctx_r1 = i0.ɵɵnextContext(3);
109
- i0.ɵɵclassProp("selected", ctx_r1.selectedSuiteId === suite_r10.ID);
110
- i0.ɵɵadvance(5);
111
- i0.ɵɵtextInterpolate(suite_r10.Name);
112
- i0.ɵɵadvance(2);
113
- i0.ɵɵtextInterpolate(suite_r10.Description || "No description");
114
- i0.ɵɵadvance();
115
- i0.ɵɵconditional(ctx_r1.selectedSuiteId === suite_r10.ID ? 8 : -1);
116
- } }
117
- function TestRunDialogComponent_Conditional_1_Conditional_11_ForEmpty_8_Template(rf, ctx) { if (rf & 1) {
118
- i0.ɵɵelementStart(0, "div", 19);
119
- i0.ɵɵelement(1, "i", 29);
120
- i0.ɵɵelementStart(2, "p");
121
- i0.ɵɵtext(3, "No test suites found");
122
- i0.ɵɵelementEnd()();
123
- } }
124
- function TestRunDialogComponent_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
125
- const _r7 = i0.ɵɵgetCurrentView();
126
- i0.ɵɵelementStart(0, "div", 9)(1, "div", 13);
127
- i0.ɵɵelement(2, "i", 14);
128
- i0.ɵɵelementStart(3, "input", 30);
129
- i0.ɵɵtwoWayListener("ngModelChange", function TestRunDialogComponent_Conditional_1_Conditional_11_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.searchText, $event) || (ctx_r1.searchText = $event); return i0.ɵɵresetView($event); });
130
- i0.ɵɵlistener("input", function TestRunDialogComponent_Conditional_1_Conditional_11_Template_input_input_3_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.filterItems()); });
131
- i0.ɵɵelementEnd();
132
- i0.ɵɵtemplate(4, TestRunDialogComponent_Conditional_1_Conditional_11_Conditional_4_Template, 2, 0, "button", 16);
133
- i0.ɵɵelementEnd();
134
- i0.ɵɵelementStart(5, "div", 17);
135
- i0.ɵɵrepeaterCreate(6, TestRunDialogComponent_Conditional_1_Conditional_11_For_7_Template, 9, 5, "div", 18, _forTrack0, false, TestRunDialogComponent_Conditional_1_Conditional_11_ForEmpty_8_Template, 4, 0, "div", 19);
136
- i0.ɵɵelementEnd()();
137
- } if (rf & 2) {
138
- const ctx_r1 = i0.ɵɵnextContext(2);
139
- i0.ɵɵadvance(3);
140
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.searchText);
141
- i0.ɵɵadvance();
142
- i0.ɵɵconditional(ctx_r1.searchText ? 4 : -1);
143
- i0.ɵɵadvance(2);
144
- i0.ɵɵrepeater(ctx_r1.filteredSuites);
145
- } }
146
- function TestRunDialogComponent_Conditional_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
147
- const _r11 = i0.ɵɵgetCurrentView();
148
- i0.ɵɵelementStart(0, "label", 11)(1, "input", 12);
149
- i0.ɵɵtwoWayListener("ngModelChange", function TestRunDialogComponent_Conditional_1_Conditional_17_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.parallel, $event) || (ctx_r1.parallel = $event); return i0.ɵɵresetView($event); });
150
- i0.ɵɵelementEnd();
151
- i0.ɵɵelementStart(2, "span");
152
- i0.ɵɵtext(3, "Run tests in parallel");
153
- i0.ɵɵelementEnd()();
154
- } if (rf & 2) {
155
- const ctx_r1 = i0.ɵɵnextContext(2);
156
- i0.ɵɵadvance();
157
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.parallel);
158
- } }
159
- function TestRunDialogComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
160
- const _r1 = i0.ɵɵgetCurrentView();
161
- i0.ɵɵelementStart(0, "div", 1)(1, "div", 5)(2, "button", 6);
162
- i0.ɵɵlistener("click", function TestRunDialogComponent_Conditional_1_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setRunMode("test")); });
163
- i0.ɵɵelement(3, "i", 7);
164
- i0.ɵɵelementStart(4, "span");
165
- i0.ɵɵtext(5, "Single Test");
166
- i0.ɵɵelementEnd()();
167
- i0.ɵɵelementStart(6, "button", 6);
168
- i0.ɵɵlistener("click", function TestRunDialogComponent_Conditional_1_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setRunMode("suite")); });
169
- i0.ɵɵelement(7, "i", 8);
170
- i0.ɵɵelementStart(8, "span");
171
- i0.ɵɵtext(9, "Test Suite");
172
- i0.ɵɵelementEnd()()();
173
- i0.ɵɵtemplate(10, TestRunDialogComponent_Conditional_1_Conditional_10_Template, 9, 3, "div", 9)(11, TestRunDialogComponent_Conditional_1_Conditional_11_Template, 9, 3, "div", 9);
174
- i0.ɵɵelementStart(12, "div", 10)(13, "label", 11)(14, "input", 12);
175
- i0.ɵɵtwoWayListener("ngModelChange", function TestRunDialogComponent_Conditional_1_Template_input_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.verbose, $event) || (ctx_r1.verbose = $event); return i0.ɵɵresetView($event); });
176
- i0.ɵɵelementEnd();
177
- i0.ɵɵelementStart(15, "span");
178
- i0.ɵɵtext(16, "Verbose logging");
179
- i0.ɵɵelementEnd()();
180
- i0.ɵɵtemplate(17, TestRunDialogComponent_Conditional_1_Conditional_17_Template, 4, 1, "label", 11);
181
- i0.ɵɵelementEnd()();
182
- } if (rf & 2) {
183
- const ctx_r1 = i0.ɵɵnextContext();
184
- i0.ɵɵadvance(2);
185
- i0.ɵɵclassProp("active", ctx_r1.runMode === "test");
186
- i0.ɵɵadvance(4);
187
- i0.ɵɵclassProp("active", ctx_r1.runMode === "suite");
188
- i0.ɵɵadvance(4);
189
- i0.ɵɵconditional(ctx_r1.runMode === "test" ? 10 : -1);
190
- i0.ɵɵadvance();
191
- i0.ɵɵconditional(ctx_r1.runMode === "suite" ? 11 : -1);
192
- i0.ɵɵadvance(3);
193
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.verbose);
194
- i0.ɵɵadvance(3);
195
- i0.ɵɵconditional(ctx_r1.runMode === "suite" ? 17 : -1);
196
- } }
197
- function TestRunDialogComponent_Conditional_2_For_15_Conditional_2_Template(rf, ctx) { if (rf & 1) {
198
- i0.ɵɵelement(0, "i", 46);
199
- } }
200
- function TestRunDialogComponent_Conditional_2_For_15_Conditional_3_Template(rf, ctx) { if (rf & 1) {
201
- i0.ɵɵelement(0, "i", 47);
202
- } }
203
- function TestRunDialogComponent_Conditional_2_For_15_Conditional_4_Template(rf, ctx) { if (rf & 1) {
204
- i0.ɵɵelement(0, "i", 48);
205
- } }
206
- function TestRunDialogComponent_Conditional_2_For_15_Conditional_8_Template(rf, ctx) { if (rf & 1) {
207
- i0.ɵɵelementStart(0, "div", 51);
208
- i0.ɵɵtext(1);
209
- i0.ɵɵelementEnd();
210
- } if (rf & 2) {
211
- const step_r12 = i0.ɵɵnextContext().$implicit;
212
- i0.ɵɵadvance();
213
- i0.ɵɵtextInterpolate(step_r12.message);
214
- } }
215
- function TestRunDialogComponent_Conditional_2_For_15_Template(rf, ctx) { if (rf & 1) {
216
- i0.ɵɵelementStart(0, "div", 44)(1, "div", 45);
217
- i0.ɵɵtemplate(2, TestRunDialogComponent_Conditional_2_For_15_Conditional_2_Template, 1, 0, "i", 46)(3, TestRunDialogComponent_Conditional_2_For_15_Conditional_3_Template, 1, 0, "i", 47)(4, TestRunDialogComponent_Conditional_2_For_15_Conditional_4_Template, 1, 0, "i", 48);
218
- i0.ɵɵelementEnd();
219
- i0.ɵɵelementStart(5, "div", 49)(6, "div", 50);
220
- i0.ɵɵtext(7);
221
- i0.ɵɵelementEnd();
222
- i0.ɵɵtemplate(8, TestRunDialogComponent_Conditional_2_For_15_Conditional_8_Template, 2, 1, "div", 51);
223
- i0.ɵɵelementEnd()();
224
- } if (rf & 2) {
225
- const step_r12 = ctx.$implicit;
226
- i0.ɵɵclassProp("active", step_r12.active)("completed", step_r12.completed);
227
- i0.ɵɵadvance(2);
228
- i0.ɵɵconditional(step_r12.completed ? 2 : step_r12.active ? 3 : 4);
229
- i0.ɵɵadvance(5);
230
- i0.ɵɵtextInterpolate(step_r12.label);
231
- i0.ɵɵadvance();
232
- i0.ɵɵconditional(step_r12.message ? 8 : -1);
233
- } }
234
- function TestRunDialogComponent_Conditional_2_Conditional_16_For_7_Template(rf, ctx) { if (rf & 1) {
235
- i0.ɵɵelementStart(0, "div", 56)(1, "span", 57);
236
- i0.ɵɵtext(2);
237
- i0.ɵɵpipe(3, "date");
238
- i0.ɵɵelementEnd();
239
- i0.ɵɵelementStart(4, "span", 58);
240
- i0.ɵɵtext(5);
241
- i0.ɵɵelementEnd()();
242
- } if (rf & 2) {
243
- const entry_r13 = ctx.$implicit;
244
- i0.ɵɵclassMap(entry_r13.type);
245
- i0.ɵɵadvance(2);
246
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(3, 4, entry_r13.timestamp, "HH:mm:ss"));
247
- i0.ɵɵadvance(3);
248
- i0.ɵɵtextInterpolate(entry_r13.message);
249
- } }
250
- function TestRunDialogComponent_Conditional_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
251
- i0.ɵɵelementStart(0, "div", 42)(1, "div", 52);
252
- i0.ɵɵelement(2, "i", 53);
253
- i0.ɵɵelementStart(3, "span");
254
- i0.ɵɵtext(4, "Execution Log");
255
- i0.ɵɵelementEnd()();
256
- i0.ɵɵelementStart(5, "div", 54);
257
- i0.ɵɵrepeaterCreate(6, TestRunDialogComponent_Conditional_2_Conditional_16_For_7_Template, 6, 7, "div", 55, i0.ɵɵrepeaterTrackByIndex);
258
- i0.ɵɵelementEnd()();
259
- } if (rf & 2) {
260
- const ctx_r1 = i0.ɵɵnextContext(2);
261
- i0.ɵɵadvance(6);
262
- i0.ɵɵrepeater(ctx_r1.executionLog);
263
- } }
264
- function TestRunDialogComponent_Conditional_2_Conditional_17_Conditional_6_Conditional_16_Template(rf, ctx) { if (rf & 1) {
265
- i0.ɵɵelementStart(0, "div", 63)(1, "span", 64);
266
- i0.ɵɵtext(2, "Cost:");
267
- i0.ɵɵelementEnd();
268
- i0.ɵɵelementStart(3, "span", 65);
269
- i0.ɵɵtext(4);
270
- i0.ɵɵpipe(5, "number");
271
- i0.ɵɵelementEnd()();
272
- } if (rf & 2) {
273
- const ctx_r1 = i0.ɵɵnextContext(4);
274
- i0.ɵɵadvance(4);
275
- i0.ɵɵtextInterpolate1("$", i0.ɵɵpipeBind2(5, 1, ctx_r1.result.result.totalCost, "1.6-6"), "");
276
- } }
277
- function TestRunDialogComponent_Conditional_2_Conditional_17_Conditional_6_Template(rf, ctx) { if (rf & 1) {
278
- i0.ɵɵelementStart(0, "div", 63)(1, "span", 64);
279
- i0.ɵɵtext(2, "Status:");
280
- i0.ɵɵelementEnd();
281
- i0.ɵɵelementStart(3, "span", 65);
282
- i0.ɵɵtext(4);
283
- i0.ɵɵelementEnd()();
284
- i0.ɵɵelementStart(5, "div", 63)(6, "span", 64);
285
- i0.ɵɵtext(7, "Score:");
286
- i0.ɵɵelementEnd();
287
- i0.ɵɵelementStart(8, "span", 65);
288
- i0.ɵɵtext(9);
289
- i0.ɵɵpipe(10, "number");
290
- i0.ɵɵelementEnd()();
291
- i0.ɵɵelementStart(11, "div", 63)(12, "span", 64);
292
- i0.ɵɵtext(13, "Duration:");
293
- i0.ɵɵelementEnd();
294
- i0.ɵɵelementStart(14, "span", 65);
295
- i0.ɵɵtext(15);
296
- i0.ɵɵelementEnd()();
297
- i0.ɵɵtemplate(16, TestRunDialogComponent_Conditional_2_Conditional_17_Conditional_6_Conditional_16_Template, 6, 4, "div", 63);
298
- } if (rf & 2) {
299
- const ctx_r1 = i0.ɵɵnextContext(3);
300
- i0.ɵɵadvance(4);
301
- i0.ɵɵtextInterpolate((ctx_r1.result.result == null ? null : ctx_r1.result.result.status) || "Unknown");
302
- i0.ɵɵadvance(5);
303
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(10, 4, (ctx_r1.result.result == null ? null : ctx_r1.result.result.score) || 0, "1.4-4"));
304
- i0.ɵɵadvance(6);
305
- i0.ɵɵtextInterpolate1("", ctx_r1.result.executionTimeMs, "ms");
306
- i0.ɵɵadvance();
307
- i0.ɵɵconditional((ctx_r1.result.result == null ? null : ctx_r1.result.result.totalCost) ? 16 : -1);
308
- } }
309
- function TestRunDialogComponent_Conditional_2_Conditional_17_Conditional_7_Template(rf, ctx) { if (rf & 1) {
310
- i0.ɵɵelementStart(0, "div", 62);
311
- i0.ɵɵelement(1, "i", 66);
312
- i0.ɵɵelementStart(2, "span");
313
- i0.ɵɵtext(3);
314
- i0.ɵɵelementEnd()();
315
- } if (rf & 2) {
316
- const ctx_r1 = i0.ɵɵnextContext(3);
317
- i0.ɵɵadvance(3);
318
- i0.ɵɵtextInterpolate(ctx_r1.result.errorMessage);
319
- } }
320
- function TestRunDialogComponent_Conditional_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
321
- i0.ɵɵelementStart(0, "div", 59)(1, "div", 60);
322
- i0.ɵɵelement(2, "i", 34);
323
- i0.ɵɵelementStart(3, "span");
324
- i0.ɵɵtext(4);
325
- i0.ɵɵelementEnd()();
326
- i0.ɵɵelementStart(5, "div", 61);
327
- i0.ɵɵtemplate(6, TestRunDialogComponent_Conditional_2_Conditional_17_Conditional_6_Template, 17, 7)(7, TestRunDialogComponent_Conditional_2_Conditional_17_Conditional_7_Template, 4, 1, "div", 62);
328
- i0.ɵɵelementEnd()();
329
- } if (rf & 2) {
330
- const ctx_r1 = i0.ɵɵnextContext(2);
331
- i0.ɵɵclassProp("success", !ctx_r1.hasError)("error", ctx_r1.hasError);
332
- i0.ɵɵadvance(2);
333
- i0.ɵɵclassProp("fa-check-circle", !ctx_r1.hasError)("fa-exclamation-circle", ctx_r1.hasError);
334
- i0.ɵɵadvance(2);
335
- i0.ɵɵtextInterpolate(ctx_r1.hasError ? "Execution Failed" : "Execution Completed");
336
- i0.ɵɵadvance(2);
337
- i0.ɵɵconditional(!ctx_r1.hasError ? 6 : 7);
338
- } }
339
- function TestRunDialogComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
340
- i0.ɵɵelementStart(0, "div", 2)(1, "div", 32)(2, "div", 33);
341
- i0.ɵɵelement(3, "i", 34);
342
- i0.ɵɵelementStart(4, "span");
343
- i0.ɵɵtext(5);
344
- i0.ɵɵelementEnd()();
345
- i0.ɵɵelementStart(6, "div", 35);
346
- i0.ɵɵtext(7);
347
- i0.ɵɵelementEnd()();
348
- i0.ɵɵelementStart(8, "div", 36)(9, "div", 37);
349
- i0.ɵɵelement(10, "div", 38);
350
- i0.ɵɵelementEnd();
351
- i0.ɵɵelementStart(11, "div", 39);
352
- i0.ɵɵtext(12);
353
- i0.ɵɵelementEnd()();
354
- i0.ɵɵelementStart(13, "div", 40);
355
- i0.ɵɵrepeaterCreate(14, TestRunDialogComponent_Conditional_2_For_15_Template, 9, 7, "div", 41, _forTrack1);
356
- i0.ɵɵelementEnd();
357
- i0.ɵɵtemplate(16, TestRunDialogComponent_Conditional_2_Conditional_16_Template, 8, 0, "div", 42)(17, TestRunDialogComponent_Conditional_2_Conditional_17_Template, 8, 10, "div", 43);
358
- i0.ɵɵelementEnd();
359
- } if (rf & 2) {
360
- const ctx_r1 = i0.ɵɵnextContext();
361
- i0.ɵɵadvance(3);
362
- i0.ɵɵclassProp("fa-spinner", ctx_r1.isRunning)("fa-spin", ctx_r1.isRunning)("fa-check-circle", ctx_r1.hasCompleted && !ctx_r1.hasError)("fa-exclamation-circle", ctx_r1.hasCompleted && ctx_r1.hasError);
363
- i0.ɵɵadvance(2);
364
- i0.ɵɵtextInterpolate(ctx_r1.executionTitle);
365
- i0.ɵɵadvance();
366
- i0.ɵɵclassProp("running", ctx_r1.isRunning)("success", ctx_r1.hasCompleted && !ctx_r1.hasError)("error", ctx_r1.hasCompleted && ctx_r1.hasError);
367
- i0.ɵɵadvance();
368
- i0.ɵɵtextInterpolate1(" ", ctx_r1.executionStatus, " ");
369
- i0.ɵɵadvance(3);
370
- i0.ɵɵstyleProp("width", ctx_r1.progress, "%");
371
- i0.ɵɵadvance(2);
372
- i0.ɵɵtextInterpolate1("", ctx_r1.progress, "%");
373
- i0.ɵɵadvance(2);
374
- i0.ɵɵrepeater(ctx_r1.progressSteps);
375
- i0.ɵɵadvance(2);
376
- i0.ɵɵconditional(ctx_r1.executionLog.length > 0 ? 16 : -1);
377
- i0.ɵɵadvance();
378
- i0.ɵɵconditional(ctx_r1.hasCompleted && ctx_r1.result ? 17 : -1);
379
- } }
380
- function TestRunDialogComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
381
- const _r14 = i0.ɵɵgetCurrentView();
382
- i0.ɵɵelementStart(0, "button", 67);
383
- i0.ɵɵlistener("click", function TestRunDialogComponent_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onClose()); });
384
- i0.ɵɵtext(1, "Cancel");
385
- i0.ɵɵelementEnd();
386
- i0.ɵɵelementStart(2, "button", 68);
387
- i0.ɵɵlistener("click", function TestRunDialogComponent_Conditional_4_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.runTest()); });
388
- i0.ɵɵelement(3, "i", 69);
389
- i0.ɵɵtext(4);
390
- i0.ɵɵelementEnd();
391
- } if (rf & 2) {
392
- const ctx_r1 = i0.ɵɵnextContext();
393
- i0.ɵɵadvance(2);
394
- i0.ɵɵproperty("disabled", !ctx_r1.canRun());
395
- i0.ɵɵadvance(2);
396
- i0.ɵɵtextInterpolate1(" Run ", ctx_r1.runMode === "test" ? "Test" : "Suite", " ");
397
- } }
398
- function TestRunDialogComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
399
- const _r15 = i0.ɵɵgetCurrentView();
400
- i0.ɵɵelementStart(0, "button", 67);
401
- i0.ɵɵlistener("click", function TestRunDialogComponent_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onClose()); });
402
- i0.ɵɵtext(1, "Close");
403
- i0.ɵɵelementEnd();
404
- i0.ɵɵelementStart(2, "button", 70);
405
- i0.ɵɵlistener("click", function TestRunDialogComponent_Conditional_5_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.resetDialog()); });
406
- i0.ɵɵelement(3, "i", 71);
407
- i0.ɵɵtext(4, " Run Another ");
408
- i0.ɵɵelementEnd();
409
- } }
410
- function TestRunDialogComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
411
- i0.ɵɵelementStart(0, "button", 4);
412
- i0.ɵɵelement(1, "i", 47);
413
- i0.ɵɵtext(2, " Running... ");
414
- i0.ɵɵelementEnd();
415
- } if (rf & 2) {
416
- i0.ɵɵproperty("disabled", true);
417
- } }
418
- export class TestRunDialogComponent {
419
- dialogRef;
420
- cdr;
421
- destroy$ = new Subject();
422
- testingClient;
423
- engine;
424
- // Selection state
425
- runMode = 'test';
426
- searchText = '';
427
- selectedTestId = null;
428
- selectedSuiteId = null;
429
- verbose = true;
430
- parallel = false;
431
- // Data
432
- allTests = [];
433
- allSuites = [];
434
- filteredTests = [];
435
- filteredSuites = [];
436
- // Execution state
437
- isRunning = false;
438
- hasCompleted = false;
439
- hasError = false;
440
- progress = 0;
441
- executionTitle = '';
442
- executionStatus = '';
443
- result = null;
444
- progressSteps = [
445
- { step: 'loading_test', label: 'Loading Configuration', message: '', active: false, completed: false },
446
- { step: 'initializing_driver', label: 'Initializing Driver', message: '', active: false, completed: false },
447
- { step: 'executing_test', label: 'Executing Test', message: '', active: false, completed: false },
448
- { step: 'evaluating_oracles', label: 'Evaluating Oracles', message: '', active: false, completed: false },
449
- { step: 'complete', label: 'Complete', message: '', active: false, completed: false }
450
- ];
451
- executionLog = [];
452
- get dialogTitle() {
453
- if (this.isRunning || this.hasCompleted) {
454
- return 'Test Execution';
455
- }
456
- return 'Run Test';
457
- }
458
- constructor(dialogRef, cdr) {
459
- this.dialogRef = dialogRef;
460
- this.cdr = cdr;
461
- // Get GraphQLDataProvider from Metadata.Provider (it's already configured in the Angular app)
462
- const dataProvider = Metadata.Provider;
463
- this.testingClient = new GraphQLTestingClient(dataProvider);
464
- }
465
- async ngOnInit() {
466
- // Get engine instance and load metadata
467
- this.engine = TestEngineBase.Instance;
468
- // Load tests and suites from cache
469
- this.allTests = this.engine.Tests.filter(t => t.Status === 'Active');
470
- this.allSuites = this.engine.TestSuites.filter(s => s.Status === 'Active');
471
- this.filterItems();
472
- this.cdr.markForCheck();
473
- }
474
- ngOnDestroy() {
475
- this.destroy$.next();
476
- this.destroy$.complete();
477
- }
478
- setRunMode(mode) {
479
- this.runMode = mode;
480
- this.searchText = '';
481
- this.selectedTestId = null;
482
- this.selectedSuiteId = null;
483
- this.filterItems();
484
- this.cdr.markForCheck();
485
- }
486
- filterItems() {
487
- const search = this.searchText.toLowerCase();
488
- if (this.runMode === 'test') {
489
- this.filteredTests = this.allTests.filter(t => t.Name.toLowerCase().includes(search) ||
490
- (t.Description && t.Description.toLowerCase().includes(search)));
491
- }
492
- else {
493
- this.filteredSuites = this.allSuites.filter(s => s.Name.toLowerCase().includes(search) ||
494
- (s.Description && s.Description.toLowerCase().includes(search)));
495
- }
496
- this.cdr.markForCheck();
497
- }
498
- clearSearch() {
499
- this.searchText = '';
500
- this.filterItems();
501
- }
502
- selectTest(testId) {
503
- this.selectedTestId = testId;
504
- this.cdr.markForCheck();
505
- }
506
- selectSuite(suiteId) {
507
- this.selectedSuiteId = suiteId;
508
- this.cdr.markForCheck();
509
- }
510
- canRun() {
511
- return (this.runMode === 'test' && this.selectedTestId != null) ||
512
- (this.runMode === 'suite' && this.selectedSuiteId != null);
513
- }
514
- async runTest() {
515
- if (!this.canRun())
516
- return;
517
- this.isRunning = true;
518
- this.hasCompleted = false;
519
- this.hasError = false;
520
- this.progress = 0;
521
- this.executionLog = [];
522
- this.resetProgressSteps();
523
- if (this.runMode === 'test') {
524
- const test = this.allTests.find(t => t.ID === this.selectedTestId);
525
- this.executionTitle = test ? test.Name : 'Running Test...';
526
- this.executionStatus = 'Running';
527
- this.addLogEntry(`Starting test: ${test?.Name}`, 'info');
528
- await this.executeTest();
529
- }
530
- else {
531
- const suite = this.allSuites.find(s => s.ID === this.selectedSuiteId);
532
- this.executionTitle = suite ? suite.Name : 'Running Suite...';
533
- this.executionStatus = 'Running';
534
- this.addLogEntry(`Starting suite: ${suite?.Name}`, 'info');
535
- await this.executeSuite();
536
- }
537
- this.cdr.markForCheck();
538
- }
539
- async executeTest() {
540
- try {
541
- const result = await this.testingClient.RunTest({
542
- testId: this.selectedTestId,
543
- verbose: this.verbose,
544
- onProgress: (progress) => {
545
- // Update progress percentage
546
- this.progress = progress.percentage;
547
- // Update progress steps based on current step
548
- this.updateProgressStep(progress.currentStep);
549
- // Add log entry for this progress update
550
- this.addLogEntry(progress.message, 'info');
551
- // Trigger change detection
552
- this.cdr.markForCheck();
553
- }
554
- });
555
- this.result = result;
556
- this.progress = 100;
557
- this.hasCompleted = true;
558
- this.hasError = !result.success;
559
- this.executionStatus = result.success ? 'Completed' : 'Failed';
560
- this.completeAllSteps();
561
- if (result.success) {
562
- this.addLogEntry('Test completed successfully', 'success');
563
- }
564
- else {
565
- this.addLogEntry(`Test failed: ${result.errorMessage}`, 'error');
566
- }
567
- }
568
- catch (error) {
569
- this.hasCompleted = true;
570
- this.hasError = true;
571
- this.executionStatus = 'Error';
572
- this.result = {
573
- success: false,
574
- errorMessage: error.message
575
- };
576
- this.addLogEntry(`Error: ${error.message}`, 'error');
577
- }
578
- finally {
579
- this.isRunning = false;
580
- this.cdr.markForCheck();
581
- }
582
- }
583
- async executeSuite() {
584
- try {
585
- const result = await this.testingClient.RunTestSuite({
586
- suiteId: this.selectedSuiteId,
587
- verbose: this.verbose,
588
- parallel: this.parallel,
589
- onProgress: (progress) => {
590
- // Update progress percentage
591
- this.progress = progress.percentage;
592
- // Update progress steps based on current step
593
- this.updateProgressStep(progress.currentStep);
594
- // Add log entry for this progress update
595
- this.addLogEntry(progress.message, 'info');
596
- // Trigger change detection
597
- this.cdr.markForCheck();
598
- }
599
- });
600
- this.result = result;
601
- this.progress = 100;
602
- this.hasCompleted = true;
603
- this.hasError = !result.success;
604
- this.executionStatus = result.success ? 'Completed' : 'Failed';
605
- this.completeAllSteps();
606
- if (result.success) {
607
- this.addLogEntry('Suite completed successfully', 'success');
608
- }
609
- else {
610
- this.addLogEntry(`Suite failed: ${result.errorMessage}`, 'error');
611
- }
612
- }
613
- catch (error) {
614
- this.hasCompleted = true;
615
- this.hasError = true;
616
- this.executionStatus = 'Error';
617
- this.result = {
618
- success: false,
619
- errorMessage: error.message
620
- };
621
- this.addLogEntry(`Error: ${error.message}`, 'error');
622
- }
623
- finally {
624
- this.isRunning = false;
625
- this.cdr.markForCheck();
626
- }
627
- }
628
- updateProgress(update) {
629
- this.progress = update.percentage;
630
- // Update step states
631
- const stepIndex = this.progressSteps.findIndex(s => s.step === update.step);
632
- if (stepIndex >= 0) {
633
- // Mark previous steps as completed
634
- for (let i = 0; i < stepIndex; i++) {
635
- this.progressSteps[i].completed = true;
636
- this.progressSteps[i].active = false;
637
- }
638
- // Mark current step as active
639
- this.progressSteps[stepIndex].active = true;
640
- this.progressSteps[stepIndex].message = update.message;
641
- }
642
- this.addLogEntry(update.message, 'info');
643
- this.cdr.markForCheck();
644
- }
645
- updateProgressStep(currentStep) {
646
- // Map test engine steps to our UI steps
647
- const stepMapping = {
648
- 'loading_test': 'loading_test',
649
- 'initializing': 'initializing_driver',
650
- 'executing': 'executing_test',
651
- 'evaluating': 'evaluating_oracles',
652
- 'complete': 'complete'
653
- };
654
- const mappedStep = stepMapping[currentStep] || currentStep;
655
- const stepIndex = this.progressSteps.findIndex(s => s.step === mappedStep);
656
- if (stepIndex >= 0) {
657
- // Mark previous steps as completed
658
- for (let i = 0; i < stepIndex; i++) {
659
- this.progressSteps[i].completed = true;
660
- this.progressSteps[i].active = false;
661
- }
662
- // Mark current step as active
663
- this.progressSteps[stepIndex].active = true;
664
- this.progressSteps[stepIndex].completed = false;
665
- }
666
- }
667
- resetProgressSteps() {
668
- this.progressSteps.forEach(step => {
669
- step.active = false;
670
- step.completed = false;
671
- step.message = '';
672
- });
673
- }
674
- completeAllSteps() {
675
- this.progressSteps.forEach(step => {
676
- step.active = false;
677
- step.completed = true;
678
- });
679
- }
680
- addLogEntry(message, type) {
681
- this.executionLog.push({
682
- timestamp: new Date(),
683
- message,
684
- type
685
- });
686
- // Keep log manageable
687
- if (this.executionLog.length > 100) {
688
- this.executionLog = this.executionLog.slice(-100);
689
- }
690
- }
691
- resetDialog() {
692
- this.isRunning = false;
693
- this.hasCompleted = false;
694
- this.hasError = false;
695
- this.progress = 0;
696
- this.executionTitle = '';
697
- this.executionStatus = '';
698
- this.result = null;
699
- this.executionLog = [];
700
- this.selectedTestId = null;
701
- this.selectedSuiteId = null;
702
- this.searchText = '';
703
- this.resetProgressSteps();
704
- this.filterItems();
705
- this.cdr.markForCheck();
706
- }
707
- onClose() {
708
- if (!this.isRunning) {
709
- this.dialogRef.close();
710
- }
711
- }
712
- static ɵfac = function TestRunDialogComponent_Factory(t) { return new (t || TestRunDialogComponent)(i0.ɵɵdirectiveInject(i1.DialogRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
713
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestRunDialogComponent, selectors: [["app-test-run-dialog"]], decls: 7, vars: 3, consts: [[1, "test-run-dialog"], [1, "selection-mode"], [1, "execution-mode"], [1, "dialog-actions"], [1, "action-btn", "run-btn", 3, "disabled"], [1, "mode-tabs"], [1, "mode-tab", 3, "click"], [1, "fa-solid", "fa-flask"], [1, "fa-solid", "fa-layer-group"], [1, "selection-panel"], [1, "options-panel"], [1, "checkbox-label"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "search-box"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search tests...", 3, "ngModelChange", "input", "ngModel"], [1, "clear-btn"], [1, "items-list"], [1, "item", 3, "selected"], [1, "no-items"], [1, "clear-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "item", 3, "click"], [1, "item-icon"], [1, "item-content"], [1, "item-name"], [1, "item-meta"], [1, "item-check"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-inbox"], ["type", "text", "placeholder", "Search test suites...", 3, "ngModelChange", "input", "ngModel"], [1, "item-icon", "suite"], [1, "execution-header"], [1, "execution-title"], [1, "fa-solid"], [1, "execution-status"], [1, "progress-container"], [1, "progress-bar"], [1, "progress-fill"], [1, "progress-text"], [1, "progress-steps"], [1, "step", 3, "active", "completed"], [1, "execution-log"], [1, "result-summary", 3, "success", "error"], [1, "step"], [1, "step-icon"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-circle"], [1, "step-content"], [1, "step-label"], [1, "step-message"], [1, "log-header"], [1, "fa-solid", "fa-terminal"], [1, "log-content"], [1, "log-entry", 3, "class"], [1, "log-entry"], [1, "log-time"], [1, "log-message"], [1, "result-summary"], [1, "result-header"], [1, "result-details"], [1, "error-message"], [1, "result-item"], [1, "result-label"], [1, "result-value"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "action-btn", "cancel-btn", 3, "click"], [1, "action-btn", "run-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-play"], [1, "action-btn", "run-btn", 3, "click"], [1, "fa-solid", "fa-redo"]], template: function TestRunDialogComponent_Template(rf, ctx) { if (rf & 1) {
714
- i0.ɵɵelementStart(0, "div", 0);
715
- i0.ɵɵtemplate(1, TestRunDialogComponent_Conditional_1_Template, 18, 8, "div", 1)(2, TestRunDialogComponent_Conditional_2_Template, 18, 21, "div", 2);
716
- i0.ɵɵelementStart(3, "div", 3);
717
- i0.ɵɵtemplate(4, TestRunDialogComponent_Conditional_4_Template, 5, 2)(5, TestRunDialogComponent_Conditional_5_Template, 5, 0)(6, TestRunDialogComponent_Conditional_6_Template, 3, 1, "button", 4);
718
- i0.ɵɵelementEnd()();
719
- } if (rf & 2) {
720
- i0.ɵɵadvance();
721
- i0.ɵɵconditional(!ctx.isRunning && !ctx.hasCompleted ? 1 : -1);
722
- i0.ɵɵadvance();
723
- i0.ɵɵconditional(ctx.isRunning || ctx.hasCompleted ? 2 : -1);
724
- i0.ɵɵadvance(2);
725
- i0.ɵɵconditional(!ctx.isRunning && !ctx.hasCompleted ? 4 : ctx.hasCompleted ? 5 : 6);
726
- } }, dependencies: [i2.DefaultValueAccessor, i2.CheckboxControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.DecimalPipe, i3.DatePipe], styles: [".test-run-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #f8f9fa;\n }\n\n .dialog-actions[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 20px;\n background: white;\n border-top: 1px solid #e0e0e0;\n margin-top: auto;\n }\n\n .action-btn[_ngcontent-%COMP%] {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .cancel-btn[_ngcontent-%COMP%] {\n background: #f5f5f5;\n color: #666;\n }\n\n .cancel-btn[_ngcontent-%COMP%]:hover {\n background: #e0e0e0;\n }\n\n .run-btn[_ngcontent-%COMP%] {\n background: #2196f3;\n color: white;\n }\n\n .run-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #1976d2;\n }\n\n .run-btn[_ngcontent-%COMP%]:disabled {\n background: #ccc;\n cursor: not-allowed;\n opacity: 0.6;\n }\n\n \n\n .selection-mode[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n overflow: hidden;\n padding: 20px;\n }\n\n .mode-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n background: white;\n padding: 8px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n flex-shrink: 0;\n }\n\n .mode-tab[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n border: none;\n background: transparent;\n color: #666;\n font-size: 14px;\n font-weight: 500;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .mode-tab[_ngcontent-%COMP%]:hover {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .mode-tab.active[_ngcontent-%COMP%] {\n background: #2196f3;\n color: white;\n }\n\n .mode-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .selection-panel[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n background: white;\n border-radius: 8px;\n padding: 16px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n overflow: hidden;\n }\n\n .search-box[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: #f5f7fa;\n border: 2px solid #e0e4e8;\n border-radius: 6px;\n transition: border-color 0.2s ease;\n }\n\n .search-box[_ngcontent-%COMP%]:focus-within {\n border-color: #2196f3;\n }\n\n .search-box[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #999;\n font-size: 14px;\n }\n\n .search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n outline: none;\n font-size: 14px;\n color: #333;\n }\n\n .search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder {\n color: #999;\n }\n\n .clear-btn[_ngcontent-%COMP%] {\n padding: 4px 8px;\n border: none;\n background: transparent;\n color: #999;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.2s ease;\n }\n\n .clear-btn[_ngcontent-%COMP%]:hover {\n background: rgba(0,0,0,0.05);\n color: #666;\n }\n\n .items-list[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-height: 0;\n }\n\n .item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 14px;\n padding: 16px;\n background: #f8f9fa;\n border: 2px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n min-width: 0;\n max-width: 100%;\n }\n\n .item[_ngcontent-%COMP%]:hover {\n background: #e3f2fd;\n border-color: #90caf9;\n }\n\n .item.selected[_ngcontent-%COMP%] {\n background: #e3f2fd;\n border-color: #2196f3;\n }\n\n .item-icon[_ngcontent-%COMP%] {\n width: 42px;\n height: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #2196f3;\n color: white;\n border-radius: 8px;\n font-size: 18px;\n flex-shrink: 0;\n }\n\n .item-icon.suite[_ngcontent-%COMP%] {\n background: #9c27b0;\n }\n\n .item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .item-name[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 600;\n color: #333;\n line-height: 1.3;\n word-wrap: break-word;\n overflow-wrap: break-word;\n }\n\n .item-meta[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #666;\n line-height: 1.4;\n word-wrap: break-word;\n overflow-wrap: break-word;\n white-space: normal;\n }\n\n .item-check[_ngcontent-%COMP%] {\n color: #2196f3;\n font-size: 20px;\n }\n\n .no-items[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #999;\n padding: 40px;\n text-align: center;\n }\n\n .no-items[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 12px;\n opacity: 0.3;\n }\n\n .no-items[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n }\n\n .options-panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n\n .checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n }\n\n .checkbox-label[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n .checkbox-label[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #333;\n }\n\n \n\n .execution-mode[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n overflow: hidden;\n padding: 20px;\n }\n\n .execution-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n\n .execution-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n }\n\n .execution-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #2196f3;\n }\n\n .execution-title[_ngcontent-%COMP%] i.fa-check-circle[_ngcontent-%COMP%] {\n color: #4caf50;\n }\n\n .execution-title[_ngcontent-%COMP%] i.fa-exclamation-circle[_ngcontent-%COMP%] {\n color: #f44336;\n }\n\n .execution-status[_ngcontent-%COMP%] {\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .execution-status.running[_ngcontent-%COMP%] {\n background: #e3f2fd;\n color: #2196f3;\n }\n\n .execution-status.success[_ngcontent-%COMP%] {\n background: #e8f5e9;\n color: #4caf50;\n }\n\n .execution-status.error[_ngcontent-%COMP%] {\n background: #ffebee;\n color: #f44336;\n }\n\n .progress-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n\n .progress-bar[_ngcontent-%COMP%] {\n flex: 1;\n height: 8px;\n background: #e0e0e0;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .progress-fill[_ngcontent-%COMP%] {\n height: 100%;\n background: linear-gradient(90deg, #2196f3, #21cbf3);\n border-radius: 4px;\n transition: width 0.3s ease;\n }\n\n .progress-text[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: #2196f3;\n min-width: 45px;\n text-align: right;\n }\n\n .progress-steps[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 16px;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n max-height: 150px;\n overflow-y: auto;\n flex-shrink: 0;\n }\n\n .step[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 8px;\n border-radius: 6px;\n transition: all 0.2s ease;\n }\n\n .step.active[_ngcontent-%COMP%] {\n background: #e3f2fd;\n }\n\n .step.completed[_ngcontent-%COMP%] {\n opacity: 0.6;\n }\n\n .step-icon[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #999;\n font-size: 12px;\n }\n\n .step.active[_ngcontent-%COMP%] .step-icon[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .step.completed[_ngcontent-%COMP%] .step-icon[_ngcontent-%COMP%] {\n color: #4caf50;\n }\n\n .step-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .step-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: #333;\n margin-bottom: 2px;\n }\n\n .step-message[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #666;\n }\n\n .execution-log[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background: #1e1e1e;\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n flex: 1;\n min-height: 0;\n }\n\n .log-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #2d2d2d;\n color: #fff;\n font-size: 13px;\n font-weight: 600;\n border-bottom: 1px solid #3d3d3d;\n }\n\n .log-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #4caf50;\n }\n\n .log-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 12px 16px;\n font-family: 'Courier New', monospace;\n font-size: 13px;\n line-height: 1.5;\n min-height: 0;\n }\n\n .log-entry[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-bottom: 4px;\n color: #e0e0e0;\n }\n\n .log-entry.error[_ngcontent-%COMP%] {\n color: #f44336;\n }\n\n .log-entry.success[_ngcontent-%COMP%] {\n color: #4caf50;\n }\n\n .log-entry.info[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .log-time[_ngcontent-%COMP%] {\n color: #999;\n min-width: 60px;\n }\n\n .log-message[_ngcontent-%COMP%] {\n flex: 1;\n }\n\n .result-summary[_ngcontent-%COMP%] {\n padding: 16px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n\n .result-summary.success[_ngcontent-%COMP%] {\n background: #e8f5e9;\n border: 2px solid #4caf50;\n }\n\n .result-summary.error[_ngcontent-%COMP%] {\n background: #ffebee;\n border: 2px solid #f44336;\n }\n\n .result-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 16px;\n font-weight: 600;\n margin-bottom: 16px;\n }\n\n .result-summary.success[_ngcontent-%COMP%] .result-header[_ngcontent-%COMP%] {\n color: #2e7d32;\n }\n\n .result-summary.error[_ngcontent-%COMP%] .result-header[_ngcontent-%COMP%] {\n color: #c62828;\n }\n\n .result-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n }\n\n .result-details[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .result-item[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n padding: 8px 12px;\n background: rgba(255,255,255,0.5);\n border-radius: 4px;\n }\n\n .result-label[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #666;\n font-size: 13px;\n }\n\n .result-value[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #333;\n font-size: 13px;\n }\n\n .error-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px;\n background: rgba(255,255,255,0.7);\n border-radius: 6px;\n color: #c62828;\n font-size: 13px;\n line-height: 1.5;\n word-break: break-word;\n }\n\n .error-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .error-message[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n flex: 1;\n }"], changeDetection: 0 });
727
- }
728
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TestRunDialogComponent, [{
729
- type: Component,
730
- args: [{ selector: 'app-test-run-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: `
731
- <div class="test-run-dialog">
732
- @if (!isRunning && !hasCompleted) {
733
- <!-- Selection Mode -->
734
- <div class="selection-mode">
735
- <div class="mode-tabs">
736
- <button
737
- class="mode-tab"
738
- [class.active]="runMode === 'test'"
739
- (click)="setRunMode('test')"
740
- >
741
- <i class="fa-solid fa-flask"></i>
742
- <span>Single Test</span>
743
- </button>
744
- <button
745
- class="mode-tab"
746
- [class.active]="runMode === 'suite'"
747
- (click)="setRunMode('suite')"
748
- >
749
- <i class="fa-solid fa-layer-group"></i>
750
- <span>Test Suite</span>
751
- </button>
752
- </div>
753
-
754
- @if (runMode === 'test') {
755
- <div class="selection-panel">
756
- <div class="search-box">
757
- <i class="fa-solid fa-search"></i>
758
- <input
759
- type="text"
760
- [(ngModel)]="searchText"
761
- (input)="filterItems()"
762
- placeholder="Search tests..."
763
- />
764
- @if (searchText) {
765
- <button class="clear-btn" (click)="clearSearch()">
766
- <i class="fa-solid fa-times"></i>
767
- </button>
768
- }
769
- </div>
770
-
771
- <div class="items-list">
772
- @for (test of filteredTests; track test.ID) {
773
- <div
774
- class="item"
775
- [class.selected]="selectedTestId === test.ID"
776
- (click)="selectTest(test.ID)"
777
- >
778
- <div class="item-icon">
779
- <i class="fa-solid fa-flask"></i>
780
- </div>
781
- <div class="item-content">
782
- <div class="item-name">{{ test.Name }}</div>
783
- <div class="item-meta">{{ test.Type }} • {{ test.Description || 'No description' }}</div>
784
- </div>
785
- @if (selectedTestId === test.ID) {
786
- <div class="item-check">
787
- <i class="fa-solid fa-check-circle"></i>
788
- </div>
789
- }
790
- </div>
791
- }
792
- @empty {
793
- <div class="no-items">
794
- <i class="fa-solid fa-inbox"></i>
795
- <p>No tests found</p>
796
- </div>
797
- }
798
- </div>
799
- </div>
800
- }
801
-
802
- @if (runMode === 'suite') {
803
- <div class="selection-panel">
804
- <div class="search-box">
805
- <i class="fa-solid fa-search"></i>
806
- <input
807
- type="text"
808
- [(ngModel)]="searchText"
809
- (input)="filterItems()"
810
- placeholder="Search test suites..."
811
- />
812
- @if (searchText) {
813
- <button class="clear-btn" (click)="clearSearch()">
814
- <i class="fa-solid fa-times"></i>
815
- </button>
816
- }
817
- </div>
818
-
819
- <div class="items-list">
820
- @for (suite of filteredSuites; track suite.ID) {
821
- <div
822
- class="item"
823
- [class.selected]="selectedSuiteId === suite.ID"
824
- (click)="selectSuite(suite.ID)"
825
- >
826
- <div class="item-icon suite">
827
- <i class="fa-solid fa-layer-group"></i>
828
- </div>
829
- <div class="item-content">
830
- <div class="item-name">{{ suite.Name }}</div>
831
- <div class="item-meta">{{ suite.Description || 'No description' }}</div>
832
- </div>
833
- @if (selectedSuiteId === suite.ID) {
834
- <div class="item-check">
835
- <i class="fa-solid fa-check-circle"></i>
836
- </div>
837
- }
838
- </div>
839
- }
840
- @empty {
841
- <div class="no-items">
842
- <i class="fa-solid fa-inbox"></i>
843
- <p>No test suites found</p>
844
- </div>
845
- }
846
- </div>
847
- </div>
848
- }
849
-
850
- <div class="options-panel">
851
- <label class="checkbox-label">
852
- <input type="checkbox" [(ngModel)]="verbose" />
853
- <span>Verbose logging</span>
854
- </label>
855
- @if (runMode === 'suite') {
856
- <label class="checkbox-label">
857
- <input type="checkbox" [(ngModel)]="parallel" />
858
- <span>Run tests in parallel</span>
859
- </label>
860
- }
861
- </div>
862
- </div>
863
- }
864
-
865
- @if (isRunning || hasCompleted) {
866
- <!-- Execution Mode -->
867
- <div class="execution-mode">
868
- <div class="execution-header">
869
- <div class="execution-title">
870
- <i class="fa-solid" [class.fa-spinner]="isRunning" [class.fa-spin]="isRunning" [class.fa-check-circle]="hasCompleted && !hasError" [class.fa-exclamation-circle]="hasCompleted && hasError"></i>
871
- <span>{{ executionTitle }}</span>
872
- </div>
873
- <div class="execution-status" [class.running]="isRunning" [class.success]="hasCompleted && !hasError" [class.error]="hasCompleted && hasError">
874
- {{ executionStatus }}
875
- </div>
876
- </div>
877
-
878
- <div class="progress-container">
879
- <div class="progress-bar">
880
- <div class="progress-fill" [style.width.%]="progress"></div>
881
- </div>
882
- <div class="progress-text">{{ progress }}%</div>
883
- </div>
884
-
885
- <div class="progress-steps">
886
- @for (step of progressSteps; track step.step) {
887
- <div class="step" [class.active]="step.active" [class.completed]="step.completed">
888
- <div class="step-icon">
889
- @if (step.completed) {
890
- <i class="fa-solid fa-check"></i>
891
- } @else if (step.active) {
892
- <i class="fa-solid fa-spinner fa-spin"></i>
893
- } @else {
894
- <i class="fa-solid fa-circle"></i>
895
- }
896
- </div>
897
- <div class="step-content">
898
- <div class="step-label">{{ step.label }}</div>
899
- @if (step.message) {
900
- <div class="step-message">{{ step.message }}</div>
901
- }
902
- </div>
903
- </div>
904
- }
905
- </div>
906
-
907
- @if (executionLog.length > 0) {
908
- <div class="execution-log">
909
- <div class="log-header">
910
- <i class="fa-solid fa-terminal"></i>
911
- <span>Execution Log</span>
912
- </div>
913
- <div class="log-content">
914
- @for (entry of executionLog; track $index) {
915
- <div class="log-entry" [class]="entry.type">
916
- <span class="log-time">{{ entry.timestamp | date:'HH:mm:ss' }}</span>
917
- <span class="log-message">{{ entry.message }}</span>
918
- </div>
919
- }
920
- </div>
921
- </div>
922
- }
923
-
924
- @if (hasCompleted && result) {
925
- <div class="result-summary" [class.success]="!hasError" [class.error]="hasError">
926
- <div class="result-header">
927
- <i class="fa-solid" [class.fa-check-circle]="!hasError" [class.fa-exclamation-circle]="hasError"></i>
928
- <span>{{ hasError ? 'Execution Failed' : 'Execution Completed' }}</span>
929
- </div>
930
- <div class="result-details">
931
- @if (!hasError) {
932
- <div class="result-item">
933
- <span class="result-label">Status:</span>
934
- <span class="result-value">{{ result.result?.status || 'Unknown' }}</span>
935
- </div>
936
- <div class="result-item">
937
- <span class="result-label">Score:</span>
938
- <span class="result-value">{{ (result.result?.score || 0) | number:'1.4-4' }}</span>
939
- </div>
940
- <div class="result-item">
941
- <span class="result-label">Duration:</span>
942
- <span class="result-value">{{ result.executionTimeMs }}ms</span>
943
- </div>
944
- @if (result.result?.totalCost) {
945
- <div class="result-item">
946
- <span class="result-label">Cost:</span>
947
- <span class="result-value">\${{ result.result.totalCost | number:'1.6-6' }}</span>
948
- </div>
949
- }
950
- } @else {
951
- <div class="error-message">
952
- <i class="fa-solid fa-exclamation-triangle"></i>
953
- <span>{{ result.errorMessage }}</span>
954
- </div>
955
- }
956
- </div>
957
- </div>
958
- }
959
- </div>
960
- }
961
-
962
- <!-- Dialog Actions -->
963
- <div class="dialog-actions">
964
- @if (!isRunning && !hasCompleted) {
965
- <button class="action-btn cancel-btn" (click)="onClose()">Cancel</button>
966
- <button class="action-btn run-btn"
967
- [disabled]="!canRun()"
968
- (click)="runTest()">
969
- <i class="fa-solid fa-play"></i>
970
- Run {{ runMode === 'test' ? 'Test' : 'Suite' }}
971
- </button>
972
- } @else if (hasCompleted) {
973
- <button class="action-btn cancel-btn" (click)="onClose()">Close</button>
974
- <button class="action-btn run-btn" (click)="resetDialog()">
975
- <i class="fa-solid fa-redo"></i>
976
- Run Another
977
- </button>
978
- } @else {
979
- <button class="action-btn run-btn" [disabled]="true">
980
- <i class="fa-solid fa-spinner fa-spin"></i>
981
- Running...
982
- </button>
983
- }
984
- </div>
985
- </div>
986
- `, styles: ["\n .test-run-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #f8f9fa;\n }\n\n .dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 20px;\n background: white;\n border-top: 1px solid #e0e0e0;\n margin-top: auto;\n }\n\n .action-btn {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .cancel-btn {\n background: #f5f5f5;\n color: #666;\n }\n\n .cancel-btn:hover {\n background: #e0e0e0;\n }\n\n .run-btn {\n background: #2196f3;\n color: white;\n }\n\n .run-btn:hover:not(:disabled) {\n background: #1976d2;\n }\n\n .run-btn:disabled {\n background: #ccc;\n cursor: not-allowed;\n opacity: 0.6;\n }\n\n /* Selection Mode */\n .selection-mode {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n overflow: hidden;\n padding: 20px;\n }\n\n .mode-tabs {\n display: flex;\n gap: 8px;\n background: white;\n padding: 8px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n flex-shrink: 0;\n }\n\n .mode-tab {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n border: none;\n background: transparent;\n color: #666;\n font-size: 14px;\n font-weight: 500;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .mode-tab:hover {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .mode-tab.active {\n background: #2196f3;\n color: white;\n }\n\n .mode-tab i {\n font-size: 16px;\n }\n\n .selection-panel {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n background: white;\n border-radius: 8px;\n padding: 16px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n overflow: hidden;\n }\n\n .search-box {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: #f5f7fa;\n border: 2px solid #e0e4e8;\n border-radius: 6px;\n transition: border-color 0.2s ease;\n }\n\n .search-box:focus-within {\n border-color: #2196f3;\n }\n\n .search-box i {\n color: #999;\n font-size: 14px;\n }\n\n .search-box input {\n flex: 1;\n border: none;\n background: transparent;\n outline: none;\n font-size: 14px;\n color: #333;\n }\n\n .search-box input::placeholder {\n color: #999;\n }\n\n .clear-btn {\n padding: 4px 8px;\n border: none;\n background: transparent;\n color: #999;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.2s ease;\n }\n\n .clear-btn:hover {\n background: rgba(0,0,0,0.05);\n color: #666;\n }\n\n .items-list {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-height: 0;\n }\n\n .item {\n display: flex;\n align-items: flex-start;\n gap: 14px;\n padding: 16px;\n background: #f8f9fa;\n border: 2px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n min-width: 0;\n max-width: 100%;\n }\n\n .item:hover {\n background: #e3f2fd;\n border-color: #90caf9;\n }\n\n .item.selected {\n background: #e3f2fd;\n border-color: #2196f3;\n }\n\n .item-icon {\n width: 42px;\n height: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #2196f3;\n color: white;\n border-radius: 8px;\n font-size: 18px;\n flex-shrink: 0;\n }\n\n .item-icon.suite {\n background: #9c27b0;\n }\n\n .item-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .item-name {\n font-size: 15px;\n font-weight: 600;\n color: #333;\n line-height: 1.3;\n word-wrap: break-word;\n overflow-wrap: break-word;\n }\n\n .item-meta {\n font-size: 13px;\n color: #666;\n line-height: 1.4;\n word-wrap: break-word;\n overflow-wrap: break-word;\n white-space: normal;\n }\n\n .item-check {\n color: #2196f3;\n font-size: 20px;\n }\n\n .no-items {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #999;\n padding: 40px;\n text-align: center;\n }\n\n .no-items i {\n font-size: 48px;\n margin-bottom: 12px;\n opacity: 0.3;\n }\n\n .no-items p {\n margin: 0;\n font-size: 14px;\n }\n\n .options-panel {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n\n .checkbox-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n }\n\n .checkbox-label input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n .checkbox-label span {\n font-size: 14px;\n color: #333;\n }\n\n /* Execution Mode */\n .execution-mode {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n overflow: hidden;\n padding: 20px;\n }\n\n .execution-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n\n .execution-title {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n }\n\n .execution-title i {\n font-size: 20px;\n color: #2196f3;\n }\n\n .execution-title i.fa-check-circle {\n color: #4caf50;\n }\n\n .execution-title i.fa-exclamation-circle {\n color: #f44336;\n }\n\n .execution-status {\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .execution-status.running {\n background: #e3f2fd;\n color: #2196f3;\n }\n\n .execution-status.success {\n background: #e8f5e9;\n color: #4caf50;\n }\n\n .execution-status.error {\n background: #ffebee;\n color: #f44336;\n }\n\n .progress-container {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n\n .progress-bar {\n flex: 1;\n height: 8px;\n background: #e0e0e0;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #2196f3, #21cbf3);\n border-radius: 4px;\n transition: width 0.3s ease;\n }\n\n .progress-text {\n font-size: 14px;\n font-weight: 600;\n color: #2196f3;\n min-width: 45px;\n text-align: right;\n }\n\n .progress-steps {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 16px;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n max-height: 150px;\n overflow-y: auto;\n flex-shrink: 0;\n }\n\n .step {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 8px;\n border-radius: 6px;\n transition: all 0.2s ease;\n }\n\n .step.active {\n background: #e3f2fd;\n }\n\n .step.completed {\n opacity: 0.6;\n }\n\n .step-icon {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #999;\n font-size: 12px;\n }\n\n .step.active .step-icon {\n color: #2196f3;\n }\n\n .step.completed .step-icon {\n color: #4caf50;\n }\n\n .step-content {\n flex: 1;\n min-width: 0;\n }\n\n .step-label {\n font-size: 13px;\n font-weight: 600;\n color: #333;\n margin-bottom: 2px;\n }\n\n .step-message {\n font-size: 12px;\n color: #666;\n }\n\n .execution-log {\n display: flex;\n flex-direction: column;\n background: #1e1e1e;\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n flex: 1;\n min-height: 0;\n }\n\n .log-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #2d2d2d;\n color: #fff;\n font-size: 13px;\n font-weight: 600;\n border-bottom: 1px solid #3d3d3d;\n }\n\n .log-header i {\n color: #4caf50;\n }\n\n .log-content {\n flex: 1;\n overflow-y: auto;\n padding: 12px 16px;\n font-family: 'Courier New', monospace;\n font-size: 13px;\n line-height: 1.5;\n min-height: 0;\n }\n\n .log-entry {\n display: flex;\n gap: 12px;\n margin-bottom: 4px;\n color: #e0e0e0;\n }\n\n .log-entry.error {\n color: #f44336;\n }\n\n .log-entry.success {\n color: #4caf50;\n }\n\n .log-entry.info {\n color: #2196f3;\n }\n\n .log-time {\n color: #999;\n min-width: 60px;\n }\n\n .log-message {\n flex: 1;\n }\n\n .result-summary {\n padding: 16px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n\n .result-summary.success {\n background: #e8f5e9;\n border: 2px solid #4caf50;\n }\n\n .result-summary.error {\n background: #ffebee;\n border: 2px solid #f44336;\n }\n\n .result-header {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 16px;\n font-weight: 600;\n margin-bottom: 16px;\n }\n\n .result-summary.success .result-header {\n color: #2e7d32;\n }\n\n .result-summary.error .result-header {\n color: #c62828;\n }\n\n .result-header i {\n font-size: 24px;\n }\n\n .result-details {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .result-item {\n display: flex;\n justify-content: space-between;\n padding: 8px 12px;\n background: rgba(255,255,255,0.5);\n border-radius: 4px;\n }\n\n .result-label {\n font-weight: 600;\n color: #666;\n font-size: 13px;\n }\n\n .result-value {\n font-weight: 600;\n color: #333;\n font-size: 13px;\n }\n\n .error-message {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px;\n background: rgba(255,255,255,0.7);\n border-radius: 6px;\n color: #c62828;\n font-size: 13px;\n line-height: 1.5;\n word-break: break-word;\n }\n\n .error-message i {\n font-size: 20px;\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .error-message span {\n flex: 1;\n }\n "] }]
987
- }], () => [{ type: i1.DialogRef }, { type: i0.ChangeDetectorRef }], null); })();
988
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestRunDialogComponent, { className: "TestRunDialogComponent", filePath: "src/Testing/components/widgets/test-run-dialog.component.ts", lineNumber: 892 }); })();
989
- //# sourceMappingURL=test-run-dialog.component.js.map