@memberjunction/ng-core-entity-forms 5.1.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js +4 -4
- package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +18 -18
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +309 -309
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +9 -9
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +3 -3
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +8 -8
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +2 -2
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +2 -2
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +10 -10
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +3 -3
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +3 -3
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +8 -8
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +225 -225
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +7 -7
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +259 -259
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +3 -3
- package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +48 -48
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.d.ts +4 -4
- package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +164 -164
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +3 -3
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +299 -299
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +3 -3
- package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.js +11 -11
- package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.d.ts +8 -8
- package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +163 -163
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.d.ts +3 -3
- package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +175 -184
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +1 -0
- package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js +3 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.d.ts +3 -3
- package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +53 -53
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.d.ts +3 -3
- package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +161 -161
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-rubric-form.component.d.ts +3 -3
- package/dist/lib/custom/Tests/test-rubric-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-rubric-form.component.js +12 -12
- package/dist/lib/custom/Tests/test-rubric-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts +3 -3
- package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js +14 -14
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.d.ts +3 -3
- package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +140 -140
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts +3 -3
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +243 -243
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +3 -3
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +213 -213
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +6 -6
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +148 -148
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +1 -1
- package/dist/lib/custom/custom-forms.module.js +85 -85
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/generated/Entities/MJOpenApp/mjopenapp.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJOpenApp/mjopenapp.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js +5 -5
- package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js.map +1 -1
- package/package.json +30 -30
|
@@ -27,7 +27,7 @@ import * as i7 from "@memberjunction/ng-shared-generic";
|
|
|
27
27
|
import * as i8 from "./entity-link-pill.component";
|
|
28
28
|
const _c0 = () => [1, 2, 3, 4, 5];
|
|
29
29
|
const _c1 = () => [1, 2, 3];
|
|
30
|
-
function
|
|
30
|
+
function MJTestFormComponentExtended_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
31
31
|
i0.ɵɵelementStart(0, "span", 16);
|
|
32
32
|
i0.ɵɵelement(1, "i", 41);
|
|
33
33
|
i0.ɵɵtext(2);
|
|
@@ -37,7 +37,7 @@ function TestFormComponentExtended_Conditional_25_Template(rf, ctx) { if (rf & 1
|
|
|
37
37
|
i0.ɵɵadvance(2);
|
|
38
38
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.record.Type, " ");
|
|
39
39
|
} }
|
|
40
|
-
function
|
|
40
|
+
function MJTestFormComponentExtended_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
41
41
|
i0.ɵɵelementStart(0, "div", 21)(1, "p");
|
|
42
42
|
i0.ɵɵtext(2);
|
|
43
43
|
i0.ɵɵelementEnd()();
|
|
@@ -46,7 +46,7 @@ function TestFormComponentExtended_Conditional_34_Template(rf, ctx) { if (rf & 1
|
|
|
46
46
|
i0.ɵɵadvance(2);
|
|
47
47
|
i0.ɵɵtextInterpolate(ctx_r0.record.Description);
|
|
48
48
|
} }
|
|
49
|
-
function
|
|
49
|
+
function MJTestFormComponentExtended_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
50
50
|
i0.ɵɵelementStart(0, "div", 22)(1, "div", 42)(2, "div", 43);
|
|
51
51
|
i0.ɵɵtext(3, "Total Runs");
|
|
52
52
|
i0.ɵɵelementEnd();
|
|
@@ -87,7 +87,7 @@ function TestFormComponentExtended_Conditional_35_Template(rf, ctx) { if (rf & 1
|
|
|
87
87
|
i0.ɵɵadvance(5);
|
|
88
88
|
i0.ɵɵtextInterpolate(ctx_r0.formatDuration(ctx_r0.getAverageDuration()));
|
|
89
89
|
} }
|
|
90
|
-
function
|
|
90
|
+
function MJTestFormComponentExtended_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
91
91
|
i0.ɵɵelementStart(0, "span", 29);
|
|
92
92
|
i0.ɵɵtext(1);
|
|
93
93
|
i0.ɵɵelementEnd();
|
|
@@ -96,7 +96,7 @@ function TestFormComponentExtended_Conditional_50_Template(rf, ctx) { if (rf & 1
|
|
|
96
96
|
i0.ɵɵadvance();
|
|
97
97
|
i0.ɵɵtextInterpolate(ctx_r0.testRuns.length);
|
|
98
98
|
} }
|
|
99
|
-
function
|
|
99
|
+
function MJTestFormComponentExtended_Conditional_55_Template(rf, ctx) { if (rf & 1) {
|
|
100
100
|
i0.ɵɵelementStart(0, "span", 29);
|
|
101
101
|
i0.ɵɵtext(1);
|
|
102
102
|
i0.ɵɵelementEnd();
|
|
@@ -105,7 +105,7 @@ function TestFormComponentExtended_Conditional_55_Template(rf, ctx) { if (rf & 1
|
|
|
105
105
|
i0.ɵɵadvance();
|
|
106
106
|
i0.ɵɵtextInterpolate(ctx_r0.suiteTests.length);
|
|
107
107
|
} }
|
|
108
|
-
function
|
|
108
|
+
function MJTestFormComponentExtended_Conditional_61_Template(rf, ctx) { if (rf & 1) {
|
|
109
109
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
110
110
|
i0.ɵɵelementStart(0, "div", 33)(1, "div", 47)(2, "h3");
|
|
111
111
|
i0.ɵɵelement(3, "i", 48);
|
|
@@ -178,22 +178,22 @@ function TestFormComponentExtended_Conditional_61_Template(rf, ctx) { if (rf & 1
|
|
|
178
178
|
i0.ɵɵtext(62, " Test Definition");
|
|
179
179
|
i0.ɵɵelementEnd();
|
|
180
180
|
i0.ɵɵelementStart(63, "div", 56)(64, "button", 57);
|
|
181
|
-
i0.ɵɵlistener("click", function
|
|
181
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_61_Template_button_click_64_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setJsonView("input")); });
|
|
182
182
|
i0.ɵɵelement(65, "i", 58);
|
|
183
183
|
i0.ɵɵtext(66, " Input Definition ");
|
|
184
184
|
i0.ɵɵelementEnd();
|
|
185
185
|
i0.ɵɵelementStart(67, "button", 57);
|
|
186
|
-
i0.ɵɵlistener("click", function
|
|
186
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_61_Template_button_click_67_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setJsonView("expected")); });
|
|
187
187
|
i0.ɵɵelement(68, "i", 59);
|
|
188
188
|
i0.ɵɵtext(69, " Expected Outcomes ");
|
|
189
189
|
i0.ɵɵelementEnd();
|
|
190
190
|
i0.ɵɵelementStart(70, "button", 57);
|
|
191
|
-
i0.ɵɵlistener("click", function
|
|
191
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_61_Template_button_click_70_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setJsonView("config")); });
|
|
192
192
|
i0.ɵɵelement(71, "i", 60);
|
|
193
193
|
i0.ɵɵtext(72, " Configuration ");
|
|
194
194
|
i0.ɵɵelementEnd();
|
|
195
195
|
i0.ɵɵelementStart(73, "button", 57);
|
|
196
|
-
i0.ɵɵlistener("click", function
|
|
196
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_61_Template_button_click_73_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setJsonView("tags")); });
|
|
197
197
|
i0.ɵɵelement(74, "i", 61);
|
|
198
198
|
i0.ɵɵtext(75, " Tags ");
|
|
199
199
|
i0.ɵɵelementEnd()();
|
|
@@ -235,7 +235,7 @@ function TestFormComponentExtended_Conditional_61_Template(rf, ctx) { if (rf & 1
|
|
|
235
235
|
i0.ɵɵadvance(4);
|
|
236
236
|
i0.ɵɵproperty("value", ctx_r0.getJsonData())("readonly", true)("toolbar", ctx_r0.jsonToolbar)("lineWrapping", true);
|
|
237
237
|
} }
|
|
238
|
-
function
|
|
238
|
+
function MJTestFormComponentExtended_Conditional_62_Template(rf, ctx) { if (rf & 1) {
|
|
239
239
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
240
240
|
i0.ɵɵelementStart(0, "div", 34)(1, "div", 64)(2, "h3");
|
|
241
241
|
i0.ɵɵelement(3, "i", 65);
|
|
@@ -245,31 +245,31 @@ function TestFormComponentExtended_Conditional_62_Template(rf, ctx) { if (rf & 1
|
|
|
245
245
|
i0.ɵɵtext(8, "Priority");
|
|
246
246
|
i0.ɵɵelementEnd();
|
|
247
247
|
i0.ɵɵelementStart(9, "input", 68);
|
|
248
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
248
|
+
i0.ɵɵtwoWayListener("ngModelChange", function MJTestFormComponentExtended_Conditional_62_Template_input_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.record.Priority, $event) || (ctx_r0.record.Priority = $event); return i0.ɵɵresetView($event); });
|
|
249
249
|
i0.ɵɵelementEnd()();
|
|
250
250
|
i0.ɵɵelementStart(10, "div", 67)(11, "label");
|
|
251
251
|
i0.ɵɵtext(12, "Repeat Count");
|
|
252
252
|
i0.ɵɵelementEnd();
|
|
253
253
|
i0.ɵɵelementStart(13, "input", 69);
|
|
254
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
254
|
+
i0.ɵɵtwoWayListener("ngModelChange", function MJTestFormComponentExtended_Conditional_62_Template_input_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.record.RepeatCount, $event) || (ctx_r0.record.RepeatCount = $event); return i0.ɵɵresetView($event); });
|
|
255
255
|
i0.ɵɵelementEnd()();
|
|
256
256
|
i0.ɵɵelementStart(14, "div", 67)(15, "label");
|
|
257
257
|
i0.ɵɵtext(16, "Estimated Duration (seconds)");
|
|
258
258
|
i0.ɵɵelementEnd();
|
|
259
259
|
i0.ɵɵelementStart(17, "input", 70);
|
|
260
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
260
|
+
i0.ɵɵtwoWayListener("ngModelChange", function MJTestFormComponentExtended_Conditional_62_Template_input_ngModelChange_17_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.record.EstimatedDurationSeconds, $event) || (ctx_r0.record.EstimatedDurationSeconds = $event); return i0.ɵɵresetView($event); });
|
|
261
261
|
i0.ɵɵelementEnd()();
|
|
262
262
|
i0.ɵɵelementStart(18, "div", 67)(19, "label");
|
|
263
263
|
i0.ɵɵtext(20, "Estimated Cost (USD)");
|
|
264
264
|
i0.ɵɵelementEnd();
|
|
265
265
|
i0.ɵɵelementStart(21, "input", 71);
|
|
266
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
266
|
+
i0.ɵɵtwoWayListener("ngModelChange", function MJTestFormComponentExtended_Conditional_62_Template_input_ngModelChange_21_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.record.EstimatedCostUSD, $event) || (ctx_r0.record.EstimatedCostUSD = $event); return i0.ɵɵresetView($event); });
|
|
267
267
|
i0.ɵɵelementEnd()();
|
|
268
268
|
i0.ɵɵelementStart(22, "div", 72)(23, "label");
|
|
269
269
|
i0.ɵɵtext(24, "Max Execution Time (ms)");
|
|
270
270
|
i0.ɵɵelementEnd();
|
|
271
271
|
i0.ɵɵelementStart(25, "input", 73);
|
|
272
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
272
|
+
i0.ɵɵtwoWayListener("ngModelChange", function MJTestFormComponentExtended_Conditional_62_Template_input_ngModelChange_25_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.record.MaxExecutionTimeMS, $event) || (ctx_r0.record.MaxExecutionTimeMS = $event); return i0.ɵɵresetView($event); });
|
|
273
273
|
i0.ɵɵelementEnd();
|
|
274
274
|
i0.ɵɵelementStart(26, "span", 74);
|
|
275
275
|
i0.ɵɵtext(27, "Leave empty for default 5 minute timeout");
|
|
@@ -279,28 +279,28 @@ function TestFormComponentExtended_Conditional_62_Template(rf, ctx) { if (rf & 1
|
|
|
279
279
|
i0.ɵɵtext(31, " Input Definition (JSON)");
|
|
280
280
|
i0.ɵɵelementEnd();
|
|
281
281
|
i0.ɵɵelementStart(32, "div", 75)(33, "mj-code-editor", 76);
|
|
282
|
-
i0.ɵɵlistener("change", function
|
|
282
|
+
i0.ɵɵlistener("change", function MJTestFormComponentExtended_Conditional_62_Template_mj_code_editor_change_33_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.record.InputDefinition = $event); });
|
|
283
283
|
i0.ɵɵelementEnd()()();
|
|
284
284
|
i0.ɵɵelementStart(34, "div", 64)(35, "h3");
|
|
285
285
|
i0.ɵɵelement(36, "i", 59);
|
|
286
286
|
i0.ɵɵtext(37, " Expected Outcomes (JSON)");
|
|
287
287
|
i0.ɵɵelementEnd();
|
|
288
288
|
i0.ɵɵelementStart(38, "div", 75)(39, "mj-code-editor", 76);
|
|
289
|
-
i0.ɵɵlistener("change", function
|
|
289
|
+
i0.ɵɵlistener("change", function MJTestFormComponentExtended_Conditional_62_Template_mj_code_editor_change_39_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.record.ExpectedOutcomes = $event); });
|
|
290
290
|
i0.ɵɵelementEnd()()();
|
|
291
291
|
i0.ɵɵelementStart(40, "div", 64)(41, "h3");
|
|
292
292
|
i0.ɵɵelement(42, "i", 60);
|
|
293
293
|
i0.ɵɵtext(43, " Configuration (JSON)");
|
|
294
294
|
i0.ɵɵelementEnd();
|
|
295
295
|
i0.ɵɵelementStart(44, "div", 75)(45, "mj-code-editor", 76);
|
|
296
|
-
i0.ɵɵlistener("change", function
|
|
296
|
+
i0.ɵɵlistener("change", function MJTestFormComponentExtended_Conditional_62_Template_mj_code_editor_change_45_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.record.Configuration = $event); });
|
|
297
297
|
i0.ɵɵelementEnd()()();
|
|
298
298
|
i0.ɵɵelementStart(46, "div", 64)(47, "h3");
|
|
299
299
|
i0.ɵɵelement(48, "i", 61);
|
|
300
300
|
i0.ɵɵtext(49, " Tags (JSON Array)");
|
|
301
301
|
i0.ɵɵelementEnd();
|
|
302
302
|
i0.ɵɵelementStart(50, "div", 77)(51, "mj-code-editor", 76);
|
|
303
|
-
i0.ɵɵlistener("change", function
|
|
303
|
+
i0.ɵɵlistener("change", function MJTestFormComponentExtended_Conditional_62_Template_mj_code_editor_change_51_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.record.Tags = $event); });
|
|
304
304
|
i0.ɵɵelementEnd()()()();
|
|
305
305
|
} if (rf & 2) {
|
|
306
306
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
@@ -323,22 +323,22 @@ function TestFormComponentExtended_Conditional_62_Template(rf, ctx) { if (rf & 1
|
|
|
323
323
|
i0.ɵɵadvance(6);
|
|
324
324
|
i0.ɵɵproperty("value", ctx_r0.record.Tags || "[]")("readonly", false)("lineWrapping", true);
|
|
325
325
|
} }
|
|
326
|
-
function
|
|
326
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_1_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
327
327
|
i0.ɵɵelementStart(0, "div", 82);
|
|
328
328
|
i0.ɵɵelement(1, "div", 83);
|
|
329
329
|
i0.ɵɵelementStart(2, "div", 84);
|
|
330
330
|
i0.ɵɵelement(3, "div", 85)(4, "div", 86);
|
|
331
331
|
i0.ɵɵelementEnd()();
|
|
332
332
|
} }
|
|
333
|
-
function
|
|
333
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
334
334
|
i0.ɵɵelementStart(0, "div", 78)(1, "div", 81);
|
|
335
|
-
i0.ɵɵrepeaterCreate(2,
|
|
335
|
+
i0.ɵɵrepeaterCreate(2, MJTestFormComponentExtended_Conditional_63_Conditional_1_For_3_Template, 5, 0, "div", 82, i0.ɵɵrepeaterTrackByIdentity);
|
|
336
336
|
i0.ɵɵelementEnd()();
|
|
337
337
|
} if (rf & 2) {
|
|
338
338
|
i0.ɵɵadvance(2);
|
|
339
339
|
i0.ɵɵrepeater(i0.ɵɵpureFunction0(0, _c0));
|
|
340
340
|
} }
|
|
341
|
-
function
|
|
341
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
342
342
|
i0.ɵɵelementStart(0, "span");
|
|
343
343
|
i0.ɵɵelement(1, "i", 102);
|
|
344
344
|
i0.ɵɵtext(2);
|
|
@@ -349,7 +349,7 @@ function TestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditiona
|
|
|
349
349
|
i0.ɵɵadvance(2);
|
|
350
350
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.formatDuration(run_r5.DurationSeconds));
|
|
351
351
|
} }
|
|
352
|
-
function
|
|
352
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
353
353
|
i0.ɵɵelementStart(0, "span");
|
|
354
354
|
i0.ɵɵelement(1, "i", 103);
|
|
355
355
|
i0.ɵɵtext(2);
|
|
@@ -360,13 +360,13 @@ function TestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditiona
|
|
|
360
360
|
i0.ɵɵadvance(2);
|
|
361
361
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.formatCost(run_r5.CostUSD));
|
|
362
362
|
} }
|
|
363
|
-
function
|
|
363
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
364
364
|
i0.ɵɵelement(0, "mj-entity-link-pill", 97);
|
|
365
365
|
} if (rf & 2) {
|
|
366
366
|
const run_r5 = i0.ɵɵnextContext().$implicit;
|
|
367
367
|
i0.ɵɵproperty("entityName", run_r5.TargetLogEntity)("recordId", run_r5.TargetLogID);
|
|
368
368
|
} }
|
|
369
|
-
function
|
|
369
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
370
370
|
i0.ɵɵelementStart(0, "span", 99);
|
|
371
371
|
i0.ɵɵelement(1, "i", 90);
|
|
372
372
|
i0.ɵɵelementStart(2, "span");
|
|
@@ -381,12 +381,12 @@ function TestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditiona
|
|
|
381
381
|
i0.ɵɵadvance(2);
|
|
382
382
|
i0.ɵɵtextInterpolate(run_r5.Status);
|
|
383
383
|
} }
|
|
384
|
-
function
|
|
384
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_18_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
385
385
|
i0.ɵɵelementStart(0, "span", 104);
|
|
386
386
|
i0.ɵɵelement(1, "i", 106);
|
|
387
387
|
i0.ɵɵelementEnd();
|
|
388
388
|
} }
|
|
389
|
-
function
|
|
389
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_18_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
390
390
|
i0.ɵɵelementStart(0, "span", 107);
|
|
391
391
|
i0.ɵɵelement(1, "i", 108);
|
|
392
392
|
i0.ɵɵelementStart(2, "span");
|
|
@@ -402,9 +402,9 @@ function TestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditiona
|
|
|
402
402
|
i0.ɵɵadvance(3);
|
|
403
403
|
i0.ɵɵtextInterpolate(rating_r6);
|
|
404
404
|
} }
|
|
405
|
-
function
|
|
406
|
-
i0.ɵɵconditionalCreate(0,
|
|
407
|
-
i0.ɵɵconditionalCreate(1,
|
|
405
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
406
|
+
i0.ɵɵconditionalCreate(0, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_18_Conditional_0_Template, 2, 0, "span", 104);
|
|
407
|
+
i0.ɵɵconditionalCreate(1, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_18_Conditional_1_Template, 4, 10, "span", 105);
|
|
408
408
|
} if (rf & 2) {
|
|
409
409
|
let tmp_13_0;
|
|
410
410
|
let tmp_14_0;
|
|
@@ -414,12 +414,12 @@ function TestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditiona
|
|
|
414
414
|
i0.ɵɵadvance();
|
|
415
415
|
i0.ɵɵconditional((tmp_14_0 = (tmp_14_0 = ctx_r0.getFeedbackForRun(run_r5.ID)) == null ? null : tmp_14_0.Rating) ? 1 : -1, tmp_14_0);
|
|
416
416
|
} }
|
|
417
|
-
function
|
|
417
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_19_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
418
418
|
i0.ɵɵelementStart(0, "span", 109);
|
|
419
419
|
i0.ɵɵelement(1, "i", 111);
|
|
420
420
|
i0.ɵɵelementEnd();
|
|
421
421
|
} }
|
|
422
|
-
function
|
|
422
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_19_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
423
423
|
i0.ɵɵelementStart(0, "span", 112);
|
|
424
424
|
i0.ɵɵelement(1, "i", 111);
|
|
425
425
|
i0.ɵɵelementStart(2, "span");
|
|
@@ -432,16 +432,16 @@ function TestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditiona
|
|
|
432
432
|
i0.ɵɵadvance(3);
|
|
433
433
|
i0.ɵɵtextInterpolate1("", (run_r5.Score * 100).toFixed(0), "%");
|
|
434
434
|
} }
|
|
435
|
-
function
|
|
436
|
-
i0.ɵɵconditionalCreate(0,
|
|
437
|
-
i0.ɵɵconditionalCreate(1,
|
|
435
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
436
|
+
i0.ɵɵconditionalCreate(0, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_19_Conditional_0_Template, 2, 0, "span", 109);
|
|
437
|
+
i0.ɵɵconditionalCreate(1, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_19_Conditional_1_Template, 4, 10, "span", 110);
|
|
438
438
|
} if (rf & 2) {
|
|
439
439
|
const run_r5 = i0.ɵɵnextContext().$implicit;
|
|
440
440
|
i0.ɵɵconditional(run_r5.Score == null ? 0 : -1);
|
|
441
441
|
i0.ɵɵadvance();
|
|
442
442
|
i0.ɵɵconditional(run_r5.Score != null ? 1 : -1);
|
|
443
443
|
} }
|
|
444
|
-
function
|
|
444
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_20_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
445
445
|
i0.ɵɵelementStart(0, "span", 113);
|
|
446
446
|
i0.ɵɵtext(1);
|
|
447
447
|
i0.ɵɵelementEnd();
|
|
@@ -450,7 +450,7 @@ function TestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditiona
|
|
|
450
450
|
i0.ɵɵadvance();
|
|
451
451
|
i0.ɵɵtextInterpolate(tag_r7);
|
|
452
452
|
} }
|
|
453
|
-
function
|
|
453
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_20_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
454
454
|
i0.ɵɵelementStart(0, "span", 114);
|
|
455
455
|
i0.ɵɵtext(1);
|
|
456
456
|
i0.ɵɵelementEnd();
|
|
@@ -460,10 +460,10 @@ function TestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditiona
|
|
|
460
460
|
i0.ɵɵadvance();
|
|
461
461
|
i0.ɵɵtextInterpolate1("+", ctx_r0.getRunTags(run_r5).length - 3);
|
|
462
462
|
} }
|
|
463
|
-
function
|
|
463
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
464
464
|
i0.ɵɵelementStart(0, "div", 100);
|
|
465
|
-
i0.ɵɵrepeaterCreate(1,
|
|
466
|
-
i0.ɵɵconditionalCreate(3,
|
|
465
|
+
i0.ɵɵrepeaterCreate(1, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_20_For_2_Template, 2, 1, "span", 113, i0.ɵɵrepeaterTrackByIdentity);
|
|
466
|
+
i0.ɵɵconditionalCreate(3, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_20_Conditional_3_Template, 2, 1, "span", 114);
|
|
467
467
|
i0.ɵɵelementEnd();
|
|
468
468
|
} if (rf & 2) {
|
|
469
469
|
const run_r5 = i0.ɵɵnextContext().$implicit;
|
|
@@ -473,10 +473,10 @@ function TestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditiona
|
|
|
473
473
|
i0.ɵɵadvance(2);
|
|
474
474
|
i0.ɵɵconditional(ctx_r0.getRunTags(run_r5).length > 3 ? 3 : -1);
|
|
475
475
|
} }
|
|
476
|
-
function
|
|
476
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
477
477
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
478
478
|
i0.ɵɵelementStart(0, "div", 88);
|
|
479
|
-
i0.ɵɵlistener("click", function
|
|
479
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Template_div_click_0_listener() { const run_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openTestRun(run_r5.ID)); });
|
|
480
480
|
i0.ɵɵelementStart(1, "div", 89);
|
|
481
481
|
i0.ɵɵelement(2, "i", 90);
|
|
482
482
|
i0.ɵɵelementEnd();
|
|
@@ -490,16 +490,16 @@ function TestFormComponentExtended_Conditional_63_Conditional_2_For_2_Template(r
|
|
|
490
490
|
i0.ɵɵelement(11, "i", 96);
|
|
491
491
|
i0.ɵɵtext(12);
|
|
492
492
|
i0.ɵɵelementEnd();
|
|
493
|
-
i0.ɵɵconditionalCreate(13,
|
|
494
|
-
i0.ɵɵconditionalCreate(14,
|
|
495
|
-
i0.ɵɵconditionalCreate(15,
|
|
493
|
+
i0.ɵɵconditionalCreate(13, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_13_Template, 3, 1, "span");
|
|
494
|
+
i0.ɵɵconditionalCreate(14, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_14_Template, 3, 1, "span");
|
|
495
|
+
i0.ɵɵconditionalCreate(15, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_15_Template, 1, 2, "mj-entity-link-pill", 97);
|
|
496
496
|
i0.ɵɵelementEnd();
|
|
497
497
|
i0.ɵɵelementStart(16, "div", 98);
|
|
498
|
-
i0.ɵɵconditionalCreate(17,
|
|
499
|
-
i0.ɵɵconditionalCreate(18,
|
|
500
|
-
i0.ɵɵconditionalCreate(19,
|
|
498
|
+
i0.ɵɵconditionalCreate(17, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_17_Template, 4, 17, "span", 99);
|
|
499
|
+
i0.ɵɵconditionalCreate(18, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_18_Template, 2, 2);
|
|
500
|
+
i0.ɵɵconditionalCreate(19, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_19_Template, 2, 2);
|
|
501
501
|
i0.ɵɵelementEnd();
|
|
502
|
-
i0.ɵɵconditionalCreate(20,
|
|
502
|
+
i0.ɵɵconditionalCreate(20, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Conditional_20_Template, 4, 1, "div", 100);
|
|
503
503
|
i0.ɵɵelementEnd();
|
|
504
504
|
i0.ɵɵelement(21, "i", 101);
|
|
505
505
|
i0.ɵɵelementEnd();
|
|
@@ -533,16 +533,16 @@ function TestFormComponentExtended_Conditional_63_Conditional_2_For_2_Template(r
|
|
|
533
533
|
i0.ɵɵadvance();
|
|
534
534
|
i0.ɵɵconditional(ctx_r0.getRunTags(run_r5).length > 0 ? 20 : -1);
|
|
535
535
|
} }
|
|
536
|
-
function
|
|
536
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
537
537
|
i0.ɵɵelementStart(0, "div", 79);
|
|
538
|
-
i0.ɵɵrepeaterCreate(1,
|
|
538
|
+
i0.ɵɵrepeaterCreate(1, MJTestFormComponentExtended_Conditional_63_Conditional_2_For_2_Template, 22, 26, "div", 87, i0.ɵɵrepeaterTrackByIdentity);
|
|
539
539
|
i0.ɵɵelementEnd();
|
|
540
540
|
} if (rf & 2) {
|
|
541
541
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
542
542
|
i0.ɵɵadvance();
|
|
543
543
|
i0.ɵɵrepeater(ctx_r0.testRuns);
|
|
544
544
|
} }
|
|
545
|
-
function
|
|
545
|
+
function MJTestFormComponentExtended_Conditional_63_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
546
546
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
547
547
|
i0.ɵɵelementStart(0, "div", 80)(1, "div", 115);
|
|
548
548
|
i0.ɵɵelement(2, "i", 116);
|
|
@@ -554,16 +554,16 @@ function TestFormComponentExtended_Conditional_63_Conditional_3_Template(rf, ctx
|
|
|
554
554
|
i0.ɵɵtext(6, "Run this test to see execution history and results here.");
|
|
555
555
|
i0.ɵɵelementEnd();
|
|
556
556
|
i0.ɵɵelementStart(7, "button", 18);
|
|
557
|
-
i0.ɵɵlistener("click", function
|
|
557
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_63_Conditional_3_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.runTest()); });
|
|
558
558
|
i0.ɵɵelement(8, "i", 19);
|
|
559
559
|
i0.ɵɵtext(9, " Run Test Now ");
|
|
560
560
|
i0.ɵɵelementEnd()();
|
|
561
561
|
} }
|
|
562
|
-
function
|
|
562
|
+
function MJTestFormComponentExtended_Conditional_63_Template(rf, ctx) { if (rf & 1) {
|
|
563
563
|
i0.ɵɵelementStart(0, "div", 35);
|
|
564
|
-
i0.ɵɵconditionalCreate(1,
|
|
565
|
-
i0.ɵɵconditionalCreate(2,
|
|
566
|
-
i0.ɵɵconditionalCreate(3,
|
|
564
|
+
i0.ɵɵconditionalCreate(1, MJTestFormComponentExtended_Conditional_63_Conditional_1_Template, 4, 1, "div", 78);
|
|
565
|
+
i0.ɵɵconditionalCreate(2, MJTestFormComponentExtended_Conditional_63_Conditional_2_Template, 3, 0, "div", 79);
|
|
566
|
+
i0.ɵɵconditionalCreate(3, MJTestFormComponentExtended_Conditional_63_Conditional_3_Template, 10, 0, "div", 80);
|
|
567
567
|
i0.ɵɵelementEnd();
|
|
568
568
|
} if (rf & 2) {
|
|
569
569
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
@@ -574,22 +574,22 @@ function TestFormComponentExtended_Conditional_63_Template(rf, ctx) { if (rf & 1
|
|
|
574
574
|
i0.ɵɵadvance();
|
|
575
575
|
i0.ɵɵconditional(ctx_r0.testRunsLoaded && !ctx_r0.loadingRuns && ctx_r0.testRuns.length === 0 ? 3 : -1);
|
|
576
576
|
} }
|
|
577
|
-
function
|
|
577
|
+
function MJTestFormComponentExtended_Conditional_64_Conditional_1_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
578
578
|
i0.ɵɵelementStart(0, "div", 82);
|
|
579
579
|
i0.ɵɵelement(1, "div", 83);
|
|
580
580
|
i0.ɵɵelementStart(2, "div", 84);
|
|
581
581
|
i0.ɵɵelement(3, "div", 85)(4, "div", 86);
|
|
582
582
|
i0.ɵɵelementEnd()();
|
|
583
583
|
} }
|
|
584
|
-
function
|
|
584
|
+
function MJTestFormComponentExtended_Conditional_64_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
585
585
|
i0.ɵɵelementStart(0, "div", 78)(1, "div", 81);
|
|
586
|
-
i0.ɵɵrepeaterCreate(2,
|
|
586
|
+
i0.ɵɵrepeaterCreate(2, MJTestFormComponentExtended_Conditional_64_Conditional_1_For_3_Template, 5, 0, "div", 82, i0.ɵɵrepeaterTrackByIdentity);
|
|
587
587
|
i0.ɵɵelementEnd()();
|
|
588
588
|
} if (rf & 2) {
|
|
589
589
|
i0.ɵɵadvance(2);
|
|
590
590
|
i0.ɵɵrepeater(i0.ɵɵpureFunction0(0, _c1));
|
|
591
591
|
} }
|
|
592
|
-
function
|
|
592
|
+
function MJTestFormComponentExtended_Conditional_64_Conditional_2_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
593
593
|
i0.ɵɵelementStart(0, "span");
|
|
594
594
|
i0.ɵɵelement(1, "i", 48);
|
|
595
595
|
i0.ɵɵtext(2);
|
|
@@ -599,10 +599,10 @@ function TestFormComponentExtended_Conditional_64_Conditional_2_For_2_Conditiona
|
|
|
599
599
|
i0.ɵɵadvance(2);
|
|
600
600
|
i0.ɵɵtextInterpolate1(" ", suiteTest_r10.Status);
|
|
601
601
|
} }
|
|
602
|
-
function
|
|
602
|
+
function MJTestFormComponentExtended_Conditional_64_Conditional_2_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
603
603
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
604
604
|
i0.ɵɵelementStart(0, "div", 119);
|
|
605
|
-
i0.ɵɵlistener("click", function
|
|
605
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_64_Conditional_2_For_2_Template_div_click_0_listener() { const suiteTest_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openTestSuite(suiteTest_r10.SuiteID)); });
|
|
606
606
|
i0.ɵɵelementStart(1, "div", 120);
|
|
607
607
|
i0.ɵɵelement(2, "i", 30);
|
|
608
608
|
i0.ɵɵelementEnd();
|
|
@@ -613,7 +613,7 @@ function TestFormComponentExtended_Conditional_64_Conditional_2_For_2_Template(r
|
|
|
613
613
|
i0.ɵɵelement(8, "i", 124);
|
|
614
614
|
i0.ɵɵtext(9);
|
|
615
615
|
i0.ɵɵelementEnd();
|
|
616
|
-
i0.ɵɵconditionalCreate(10,
|
|
616
|
+
i0.ɵɵconditionalCreate(10, MJTestFormComponentExtended_Conditional_64_Conditional_2_For_2_Conditional_10_Template, 3, 1, "span");
|
|
617
617
|
i0.ɵɵelementEnd()();
|
|
618
618
|
i0.ɵɵelement(11, "i", 101);
|
|
619
619
|
i0.ɵɵelementEnd();
|
|
@@ -626,16 +626,16 @@ function TestFormComponentExtended_Conditional_64_Conditional_2_For_2_Template(r
|
|
|
626
626
|
i0.ɵɵadvance();
|
|
627
627
|
i0.ɵɵconditional(suiteTest_r10.Status ? 10 : -1);
|
|
628
628
|
} }
|
|
629
|
-
function
|
|
629
|
+
function MJTestFormComponentExtended_Conditional_64_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
630
630
|
i0.ɵɵelementStart(0, "div", 117);
|
|
631
|
-
i0.ɵɵrepeaterCreate(1,
|
|
631
|
+
i0.ɵɵrepeaterCreate(1, MJTestFormComponentExtended_Conditional_64_Conditional_2_For_2_Template, 12, 3, "div", 118, i0.ɵɵrepeaterTrackByIdentity);
|
|
632
632
|
i0.ɵɵelementEnd();
|
|
633
633
|
} if (rf & 2) {
|
|
634
634
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
635
635
|
i0.ɵɵadvance();
|
|
636
636
|
i0.ɵɵrepeater(ctx_r0.suiteTests);
|
|
637
637
|
} }
|
|
638
|
-
function
|
|
638
|
+
function MJTestFormComponentExtended_Conditional_64_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
639
639
|
i0.ɵɵelementStart(0, "div", 80)(1, "div", 115);
|
|
640
640
|
i0.ɵɵelement(2, "i", 125);
|
|
641
641
|
i0.ɵɵelementEnd();
|
|
@@ -646,11 +646,11 @@ function TestFormComponentExtended_Conditional_64_Conditional_3_Template(rf, ctx
|
|
|
646
646
|
i0.ɵɵtext(6, "This test is not included in any test suites. Add it to a suite to run it with other tests.");
|
|
647
647
|
i0.ɵɵelementEnd()();
|
|
648
648
|
} }
|
|
649
|
-
function
|
|
649
|
+
function MJTestFormComponentExtended_Conditional_64_Template(rf, ctx) { if (rf & 1) {
|
|
650
650
|
i0.ɵɵelementStart(0, "div", 36);
|
|
651
|
-
i0.ɵɵconditionalCreate(1,
|
|
652
|
-
i0.ɵɵconditionalCreate(2,
|
|
653
|
-
i0.ɵɵconditionalCreate(3,
|
|
651
|
+
i0.ɵɵconditionalCreate(1, MJTestFormComponentExtended_Conditional_64_Conditional_1_Template, 4, 1, "div", 78);
|
|
652
|
+
i0.ɵɵconditionalCreate(2, MJTestFormComponentExtended_Conditional_64_Conditional_2_Template, 3, 0, "div", 117);
|
|
653
|
+
i0.ɵɵconditionalCreate(3, MJTestFormComponentExtended_Conditional_64_Conditional_3_Template, 7, 0, "div", 80);
|
|
654
654
|
i0.ɵɵelementEnd();
|
|
655
655
|
} if (rf & 2) {
|
|
656
656
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
@@ -661,12 +661,12 @@ function TestFormComponentExtended_Conditional_64_Template(rf, ctx) { if (rf & 1
|
|
|
661
661
|
i0.ɵɵadvance();
|
|
662
662
|
i0.ɵɵconditional(ctx_r0.suiteTestsLoaded && !ctx_r0.loadingSuites && ctx_r0.suiteTests.length === 0 ? 3 : -1);
|
|
663
663
|
} }
|
|
664
|
-
function
|
|
664
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
665
665
|
i0.ɵɵelementStart(0, "div", 78);
|
|
666
666
|
i0.ɵɵelement(1, "mj-loading", 127);
|
|
667
667
|
i0.ɵɵelementEnd();
|
|
668
668
|
} }
|
|
669
|
-
function
|
|
669
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_17_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
670
670
|
i0.ɵɵelementStart(0, "div", 136)(1, "div", 141);
|
|
671
671
|
i0.ɵɵelement(2, "i", 142);
|
|
672
672
|
i0.ɵɵelementEnd();
|
|
@@ -684,7 +684,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_17_C
|
|
|
684
684
|
i0.ɵɵadvance();
|
|
685
685
|
i0.ɵɵclassProp("fa-arrow-up", ctx_r0.getPassRateTrend() === "up")("fa-arrow-down", ctx_r0.getPassRateTrend() === "down")("fa-minus", ctx_r0.getPassRateTrend() === "stable")("trend-up", ctx_r0.getPassRateTrend() === "up")("trend-down", ctx_r0.getPassRateTrend() === "down");
|
|
686
686
|
} }
|
|
687
|
-
function
|
|
687
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_17_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
688
688
|
i0.ɵɵelementStart(0, "div", 136)(1, "div", 137);
|
|
689
689
|
i0.ɵɵelement(2, "i", 144);
|
|
690
690
|
i0.ɵɵelementEnd();
|
|
@@ -699,7 +699,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_17_C
|
|
|
699
699
|
i0.ɵɵadvance(5);
|
|
700
700
|
i0.ɵɵtextInterpolate1("", (ctx_r0.getOverallAvgScore() * 100).toFixed(1), "%");
|
|
701
701
|
} }
|
|
702
|
-
function
|
|
702
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
703
703
|
i0.ɵɵelementStart(0, "div", 134)(1, "div", 136)(2, "div", 137);
|
|
704
704
|
i0.ɵɵelement(3, "i", 116);
|
|
705
705
|
i0.ɵɵelementEnd();
|
|
@@ -709,8 +709,8 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_17_T
|
|
|
709
709
|
i0.ɵɵelementStart(7, "div", 140);
|
|
710
710
|
i0.ɵɵtext(8, "Total Runs");
|
|
711
711
|
i0.ɵɵelementEnd()()();
|
|
712
|
-
i0.ɵɵconditionalCreate(9,
|
|
713
|
-
i0.ɵɵconditionalCreate(10,
|
|
712
|
+
i0.ɵɵconditionalCreate(9, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_17_Conditional_9_Template, 9, 11, "div", 136);
|
|
713
|
+
i0.ɵɵconditionalCreate(10, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_17_Conditional_10_Template, 8, 1, "div", 136);
|
|
714
714
|
i0.ɵɵelementStart(11, "div", 136)(12, "div", 137);
|
|
715
715
|
i0.ɵɵelement(13, "i", 102);
|
|
716
716
|
i0.ɵɵelementEnd();
|
|
@@ -742,27 +742,27 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_17_T
|
|
|
742
742
|
i0.ɵɵadvance(8);
|
|
743
743
|
i0.ɵɵtextInterpolate(ctx_r0.formatCost(ctx_r0.getOverallAvgCost()));
|
|
744
744
|
} }
|
|
745
|
-
function
|
|
745
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
746
746
|
i0.ɵɵelementStart(0, "th");
|
|
747
747
|
i0.ɵɵtext(1, "Passed");
|
|
748
748
|
i0.ɵɵelementEnd();
|
|
749
749
|
} }
|
|
750
|
-
function
|
|
750
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
751
751
|
i0.ɵɵelementStart(0, "th");
|
|
752
752
|
i0.ɵɵtext(1, "Failed");
|
|
753
753
|
i0.ɵɵelementEnd();
|
|
754
754
|
} }
|
|
755
|
-
function
|
|
755
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
756
756
|
i0.ɵɵelementStart(0, "th");
|
|
757
757
|
i0.ɵɵtext(1, "Pass Rate");
|
|
758
758
|
i0.ɵɵelementEnd();
|
|
759
759
|
} }
|
|
760
|
-
function
|
|
760
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
761
761
|
i0.ɵɵelementStart(0, "th");
|
|
762
762
|
i0.ɵɵtext(1, "Avg Score");
|
|
763
763
|
i0.ɵɵelementEnd();
|
|
764
764
|
} }
|
|
765
|
-
function
|
|
765
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_For_22_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
766
766
|
i0.ɵɵelementStart(0, "td", 150);
|
|
767
767
|
i0.ɵɵtext(1);
|
|
768
768
|
i0.ɵɵelementEnd();
|
|
@@ -771,7 +771,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_F
|
|
|
771
771
|
i0.ɵɵadvance();
|
|
772
772
|
i0.ɵɵtextInterpolate(day_r12.passCount);
|
|
773
773
|
} }
|
|
774
|
-
function
|
|
774
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_For_22_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
775
775
|
i0.ɵɵelementStart(0, "td", 151);
|
|
776
776
|
i0.ɵɵtext(1);
|
|
777
777
|
i0.ɵɵelementEnd();
|
|
@@ -780,7 +780,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_F
|
|
|
780
780
|
i0.ɵɵadvance();
|
|
781
781
|
i0.ɵɵtextInterpolate(day_r12.failCount);
|
|
782
782
|
} }
|
|
783
|
-
function
|
|
783
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_For_22_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
784
784
|
i0.ɵɵelementStart(0, "td", 152)(1, "div", 156);
|
|
785
785
|
i0.ɵɵelement(2, "div", 157);
|
|
786
786
|
i0.ɵɵelementStart(3, "span", 158);
|
|
@@ -793,7 +793,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_F
|
|
|
793
793
|
i0.ɵɵadvance(2);
|
|
794
794
|
i0.ɵɵtextInterpolate1("", day_r12.passRate.toFixed(1), "%");
|
|
795
795
|
} }
|
|
796
|
-
function
|
|
796
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_For_22_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
797
797
|
i0.ɵɵelementStart(0, "td", 153);
|
|
798
798
|
i0.ɵɵtext(1);
|
|
799
799
|
i0.ɵɵelementEnd();
|
|
@@ -802,7 +802,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_F
|
|
|
802
802
|
i0.ɵɵadvance();
|
|
803
803
|
i0.ɵɵtextInterpolate1("", (day_r12.avgScore * 100).toFixed(1), "%");
|
|
804
804
|
} }
|
|
805
|
-
function
|
|
805
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_For_22_Template(rf, ctx) { if (rf & 1) {
|
|
806
806
|
i0.ɵɵelementStart(0, "tr")(1, "td", 148);
|
|
807
807
|
i0.ɵɵtext(2);
|
|
808
808
|
i0.ɵɵpipe(3, "date");
|
|
@@ -810,10 +810,10 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_F
|
|
|
810
810
|
i0.ɵɵelementStart(4, "td", 149);
|
|
811
811
|
i0.ɵɵtext(5);
|
|
812
812
|
i0.ɵɵelementEnd();
|
|
813
|
-
i0.ɵɵconditionalCreate(6,
|
|
814
|
-
i0.ɵɵconditionalCreate(7,
|
|
815
|
-
i0.ɵɵconditionalCreate(8,
|
|
816
|
-
i0.ɵɵconditionalCreate(9,
|
|
813
|
+
i0.ɵɵconditionalCreate(6, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_For_22_Conditional_6_Template, 2, 1, "td", 150);
|
|
814
|
+
i0.ɵɵconditionalCreate(7, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_For_22_Conditional_7_Template, 2, 1, "td", 151);
|
|
815
|
+
i0.ɵɵconditionalCreate(8, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_For_22_Conditional_8_Template, 5, 3, "td", 152);
|
|
816
|
+
i0.ɵɵconditionalCreate(9, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_For_22_Conditional_9_Template, 2, 1, "td", 153);
|
|
817
817
|
i0.ɵɵelementStart(10, "td", 154);
|
|
818
818
|
i0.ɵɵtext(11);
|
|
819
819
|
i0.ɵɵelementEnd();
|
|
@@ -840,7 +840,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_F
|
|
|
840
840
|
i0.ɵɵadvance(2);
|
|
841
841
|
i0.ɵɵtextInterpolate(ctx_r0.formatCost(day_r12.avgCost));
|
|
842
842
|
} }
|
|
843
|
-
function
|
|
843
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
844
844
|
i0.ɵɵelementStart(0, "div", 135)(1, "h3");
|
|
845
845
|
i0.ɵɵelement(2, "i", 145);
|
|
846
846
|
i0.ɵɵtext(3, " Daily Performance");
|
|
@@ -851,10 +851,10 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_T
|
|
|
851
851
|
i0.ɵɵelementStart(10, "th");
|
|
852
852
|
i0.ɵɵtext(11, "Runs");
|
|
853
853
|
i0.ɵɵelementEnd();
|
|
854
|
-
i0.ɵɵconditionalCreate(12,
|
|
855
|
-
i0.ɵɵconditionalCreate(13,
|
|
856
|
-
i0.ɵɵconditionalCreate(14,
|
|
857
|
-
i0.ɵɵconditionalCreate(15,
|
|
854
|
+
i0.ɵɵconditionalCreate(12, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_Conditional_12_Template, 2, 0, "th");
|
|
855
|
+
i0.ɵɵconditionalCreate(13, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_Conditional_13_Template, 2, 0, "th");
|
|
856
|
+
i0.ɵɵconditionalCreate(14, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_Conditional_14_Template, 2, 0, "th");
|
|
857
|
+
i0.ɵɵconditionalCreate(15, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_Conditional_15_Template, 2, 0, "th");
|
|
858
858
|
i0.ɵɵelementStart(16, "th");
|
|
859
859
|
i0.ɵɵtext(17, "Avg Duration");
|
|
860
860
|
i0.ɵɵelementEnd();
|
|
@@ -862,7 +862,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_T
|
|
|
862
862
|
i0.ɵɵtext(19, "Avg Cost");
|
|
863
863
|
i0.ɵɵelementEnd()()();
|
|
864
864
|
i0.ɵɵelementStart(20, "tbody");
|
|
865
|
-
i0.ɵɵrepeaterCreate(21,
|
|
865
|
+
i0.ɵɵrepeaterCreate(21, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_For_22_Template, 14, 11, "tr", null, i0.ɵɵrepeaterTrackByIdentity);
|
|
866
866
|
i0.ɵɵelementEnd()()()();
|
|
867
867
|
} if (rf & 2) {
|
|
868
868
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
@@ -877,7 +877,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_T
|
|
|
877
877
|
i0.ɵɵadvance(6);
|
|
878
878
|
i0.ɵɵrepeater(ctx_r0.historyData);
|
|
879
879
|
} }
|
|
880
|
-
function
|
|
880
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
881
881
|
i0.ɵɵelementStart(0, "span", 170);
|
|
882
882
|
i0.ɵɵtext(1);
|
|
883
883
|
i0.ɵɵelementEnd();
|
|
@@ -886,7 +886,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_F
|
|
|
886
886
|
i0.ɵɵadvance();
|
|
887
887
|
i0.ɵɵtextInterpolate(tag_r15);
|
|
888
888
|
} }
|
|
889
|
-
function
|
|
889
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Conditional_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
890
890
|
i0.ɵɵelementStart(0, "span", 171);
|
|
891
891
|
i0.ɵɵtext(1);
|
|
892
892
|
i0.ɵɵelementEnd();
|
|
@@ -895,10 +895,10 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_F
|
|
|
895
895
|
i0.ɵɵadvance();
|
|
896
896
|
i0.ɵɵtextInterpolate1("+", suite_r14.tags.length - 3);
|
|
897
897
|
} }
|
|
898
|
-
function
|
|
898
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
899
899
|
i0.ɵɵelementStart(0, "div", 164);
|
|
900
|
-
i0.ɵɵrepeaterCreate(1,
|
|
901
|
-
i0.ɵɵconditionalCreate(3,
|
|
900
|
+
i0.ɵɵrepeaterCreate(1, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Conditional_4_For_2_Template, 2, 1, "span", 170, i0.ɵɵrepeaterTrackByIdentity);
|
|
901
|
+
i0.ɵɵconditionalCreate(3, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Conditional_4_Conditional_3_Template, 2, 1, "span", 171);
|
|
902
902
|
i0.ɵɵelementEnd();
|
|
903
903
|
} if (rf & 2) {
|
|
904
904
|
const suite_r14 = i0.ɵɵnextContext().$implicit;
|
|
@@ -907,7 +907,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_F
|
|
|
907
907
|
i0.ɵɵadvance(2);
|
|
908
908
|
i0.ɵɵconditional(suite_r14.tags.length > 3 ? 3 : -1);
|
|
909
909
|
} }
|
|
910
|
-
function
|
|
910
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
911
911
|
i0.ɵɵelementStart(0, "div", 166)(1, "span", 172);
|
|
912
912
|
i0.ɵɵtext(2);
|
|
913
913
|
i0.ɵɵelementEnd();
|
|
@@ -921,7 +921,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_F
|
|
|
921
921
|
i0.ɵɵadvance();
|
|
922
922
|
i0.ɵɵtextInterpolate1(" ", suite_r14.passRate.toFixed(1), "% ");
|
|
923
923
|
} }
|
|
924
|
-
function
|
|
924
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
925
925
|
i0.ɵɵelementStart(0, "div", 166)(1, "span", 167);
|
|
926
926
|
i0.ɵɵtext(2);
|
|
927
927
|
i0.ɵɵelementEnd();
|
|
@@ -933,7 +933,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_F
|
|
|
933
933
|
i0.ɵɵadvance(2);
|
|
934
934
|
i0.ɵɵtextInterpolate1("", (suite_r14.avgScore * 100).toFixed(1), "%");
|
|
935
935
|
} }
|
|
936
|
-
function
|
|
936
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
937
937
|
i0.ɵɵelementStart(0, "div", 166)(1, "span", 167);
|
|
938
938
|
i0.ɵɵtext(2);
|
|
939
939
|
i0.ɵɵelementEnd();
|
|
@@ -946,14 +946,14 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_F
|
|
|
946
946
|
i0.ɵɵadvance(2);
|
|
947
947
|
i0.ɵɵtextInterpolate(ctx_r0.getRelativeTime(suite_r14.lastRun));
|
|
948
948
|
} }
|
|
949
|
-
function
|
|
949
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
950
950
|
const _r13 = i0.ɵɵgetCurrentView();
|
|
951
951
|
i0.ɵɵelementStart(0, "div", 161);
|
|
952
|
-
i0.ɵɵlistener("click", function
|
|
952
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Template_div_click_0_listener() { const suite_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.openSuiteFromHistory(suite_r14.suiteId)); });
|
|
953
953
|
i0.ɵɵelementStart(1, "div", 162)(2, "div", 163);
|
|
954
954
|
i0.ɵɵtext(3);
|
|
955
955
|
i0.ɵɵelementEnd();
|
|
956
|
-
i0.ɵɵconditionalCreate(4,
|
|
956
|
+
i0.ɵɵconditionalCreate(4, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Conditional_4_Template, 4, 1, "div", 164);
|
|
957
957
|
i0.ɵɵelementEnd();
|
|
958
958
|
i0.ɵɵelementStart(5, "div", 165)(6, "div", 166)(7, "span", 167);
|
|
959
959
|
i0.ɵɵtext(8);
|
|
@@ -961,8 +961,8 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_F
|
|
|
961
961
|
i0.ɵɵelementStart(9, "span", 168);
|
|
962
962
|
i0.ɵɵtext(10, "Runs");
|
|
963
963
|
i0.ɵɵelementEnd()();
|
|
964
|
-
i0.ɵɵconditionalCreate(11,
|
|
965
|
-
i0.ɵɵconditionalCreate(12,
|
|
964
|
+
i0.ɵɵconditionalCreate(11, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Conditional_11_Template, 5, 5, "div", 166);
|
|
965
|
+
i0.ɵɵconditionalCreate(12, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Conditional_12_Template, 5, 1, "div", 166);
|
|
966
966
|
i0.ɵɵelementStart(13, "div", 166)(14, "span", 167);
|
|
967
967
|
i0.ɵɵtext(15);
|
|
968
968
|
i0.ɵɵelementEnd();
|
|
@@ -975,7 +975,7 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_F
|
|
|
975
975
|
i0.ɵɵelementStart(21, "span", 168);
|
|
976
976
|
i0.ɵɵtext(22, "Avg Cost");
|
|
977
977
|
i0.ɵɵelementEnd()();
|
|
978
|
-
i0.ɵɵconditionalCreate(23,
|
|
978
|
+
i0.ɵɵconditionalCreate(23, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Conditional_23_Template, 5, 1, "div", 166);
|
|
979
979
|
i0.ɵɵelementEnd();
|
|
980
980
|
i0.ɵɵelement(24, "i", 169);
|
|
981
981
|
i0.ɵɵelementEnd();
|
|
@@ -999,20 +999,20 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_F
|
|
|
999
999
|
i0.ɵɵadvance(3);
|
|
1000
1000
|
i0.ɵɵconditional(suite_r14.lastRun ? 23 : -1);
|
|
1001
1001
|
} }
|
|
1002
|
-
function
|
|
1002
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
1003
1003
|
i0.ɵɵelementStart(0, "div", 135)(1, "h3");
|
|
1004
1004
|
i0.ɵɵelement(2, "i", 30);
|
|
1005
1005
|
i0.ɵɵtext(3, " Performance by Suite");
|
|
1006
1006
|
i0.ɵɵelementEnd();
|
|
1007
1007
|
i0.ɵɵelementStart(4, "div", 159);
|
|
1008
|
-
i0.ɵɵrepeaterCreate(5,
|
|
1008
|
+
i0.ɵɵrepeaterCreate(5, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_For_6_Template, 25, 8, "div", 160, i0.ɵɵrepeaterTrackByIdentity);
|
|
1009
1009
|
i0.ɵɵelementEnd()();
|
|
1010
1010
|
} if (rf & 2) {
|
|
1011
1011
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
1012
1012
|
i0.ɵɵadvance(5);
|
|
1013
1013
|
i0.ɵɵrepeater(ctx_r0.suitePerformance);
|
|
1014
1014
|
} }
|
|
1015
|
-
function
|
|
1015
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
1016
1016
|
const _r16 = i0.ɵɵgetCurrentView();
|
|
1017
1017
|
i0.ɵɵelementStart(0, "div", 80)(1, "div", 115);
|
|
1018
1018
|
i0.ɵɵelement(2, "i", 31);
|
|
@@ -1024,41 +1024,41 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Conditional_20_T
|
|
|
1024
1024
|
i0.ɵɵtext(6, "Run this test to start building history and analytics data.");
|
|
1025
1025
|
i0.ɵɵelementEnd();
|
|
1026
1026
|
i0.ɵɵelementStart(7, "button", 18);
|
|
1027
|
-
i0.ɵɵlistener("click", function
|
|
1027
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_20_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r16); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.runTest()); });
|
|
1028
1028
|
i0.ɵɵelement(8, "i", 19);
|
|
1029
1029
|
i0.ɵɵtext(9, " Run Test Now ");
|
|
1030
1030
|
i0.ɵɵelementEnd()();
|
|
1031
1031
|
} }
|
|
1032
|
-
function
|
|
1032
|
+
function MJTestFormComponentExtended_Conditional_65_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1033
1033
|
const _r11 = i0.ɵɵgetCurrentView();
|
|
1034
1034
|
i0.ɵɵelementStart(0, "div", 126)(1, "div", 128)(2, "div", 129)(3, "span", 130);
|
|
1035
1035
|
i0.ɵɵtext(4, "Time Range:");
|
|
1036
1036
|
i0.ɵɵelementEnd();
|
|
1037
1037
|
i0.ɵɵelementStart(5, "button", 131);
|
|
1038
|
-
i0.ɵɵlistener("click", function
|
|
1038
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_65_Conditional_2_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.setHistoryTimeRange("7d")); });
|
|
1039
1039
|
i0.ɵɵtext(6, "7 Days");
|
|
1040
1040
|
i0.ɵɵelementEnd();
|
|
1041
1041
|
i0.ɵɵelementStart(7, "button", 131);
|
|
1042
|
-
i0.ɵɵlistener("click", function
|
|
1042
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_65_Conditional_2_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.setHistoryTimeRange("30d")); });
|
|
1043
1043
|
i0.ɵɵtext(8, "30 Days");
|
|
1044
1044
|
i0.ɵɵelementEnd();
|
|
1045
1045
|
i0.ɵɵelementStart(9, "button", 131);
|
|
1046
|
-
i0.ɵɵlistener("click", function
|
|
1046
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_65_Conditional_2_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.setHistoryTimeRange("90d")); });
|
|
1047
1047
|
i0.ɵɵtext(10, "90 Days");
|
|
1048
1048
|
i0.ɵɵelementEnd();
|
|
1049
1049
|
i0.ɵɵelementStart(11, "button", 131);
|
|
1050
|
-
i0.ɵɵlistener("click", function
|
|
1050
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_65_Conditional_2_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.setHistoryTimeRange("all")); });
|
|
1051
1051
|
i0.ɵɵtext(12, "All Time");
|
|
1052
1052
|
i0.ɵɵelementEnd()();
|
|
1053
1053
|
i0.ɵɵelementStart(13, "div", 132)(14, "button", 20);
|
|
1054
|
-
i0.ɵɵlistener("click", function
|
|
1054
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_65_Conditional_2_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.exportHistoryToCSV()); });
|
|
1055
1055
|
i0.ɵɵelement(15, "i", 133);
|
|
1056
1056
|
i0.ɵɵtext(16, " Export CSV ");
|
|
1057
1057
|
i0.ɵɵelementEnd()()();
|
|
1058
|
-
i0.ɵɵconditionalCreate(17,
|
|
1059
|
-
i0.ɵɵconditionalCreate(18,
|
|
1060
|
-
i0.ɵɵconditionalCreate(19,
|
|
1061
|
-
i0.ɵɵconditionalCreate(20,
|
|
1058
|
+
i0.ɵɵconditionalCreate(17, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_17_Template, 27, 5, "div", 134);
|
|
1059
|
+
i0.ɵɵconditionalCreate(18, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_18_Template, 23, 4, "div", 135);
|
|
1060
|
+
i0.ɵɵconditionalCreate(19, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_19_Template, 7, 0, "div", 135);
|
|
1061
|
+
i0.ɵɵconditionalCreate(20, MJTestFormComponentExtended_Conditional_65_Conditional_2_Conditional_20_Template, 10, 0, "div", 80);
|
|
1062
1062
|
i0.ɵɵelementEnd();
|
|
1063
1063
|
} if (rf & 2) {
|
|
1064
1064
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
@@ -1081,10 +1081,10 @@ function TestFormComponentExtended_Conditional_65_Conditional_2_Template(rf, ctx
|
|
|
1081
1081
|
i0.ɵɵadvance();
|
|
1082
1082
|
i0.ɵɵconditional(ctx_r0.historyData.length === 0 ? 20 : -1);
|
|
1083
1083
|
} }
|
|
1084
|
-
function
|
|
1084
|
+
function MJTestFormComponentExtended_Conditional_65_Template(rf, ctx) { if (rf & 1) {
|
|
1085
1085
|
i0.ɵɵelementStart(0, "div", 37);
|
|
1086
|
-
i0.ɵɵconditionalCreate(1,
|
|
1087
|
-
i0.ɵɵconditionalCreate(2,
|
|
1086
|
+
i0.ɵɵconditionalCreate(1, MJTestFormComponentExtended_Conditional_65_Conditional_1_Template, 2, 0, "div", 78);
|
|
1087
|
+
i0.ɵɵconditionalCreate(2, MJTestFormComponentExtended_Conditional_65_Conditional_2_Template, 21, 13, "div", 126);
|
|
1088
1088
|
i0.ɵɵelementEnd();
|
|
1089
1089
|
} if (rf & 2) {
|
|
1090
1090
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
@@ -1093,13 +1093,13 @@ function TestFormComponentExtended_Conditional_65_Template(rf, ctx) { if (rf & 1
|
|
|
1093
1093
|
i0.ɵɵadvance();
|
|
1094
1094
|
i0.ɵɵconditional(!ctx_r0.loadingHistory && ctx_r0.historyLoaded ? 2 : -1);
|
|
1095
1095
|
} }
|
|
1096
|
-
function
|
|
1096
|
+
function MJTestFormComponentExtended_Conditional_68_Template(rf, ctx) { if (rf & 1) {
|
|
1097
1097
|
const _r17 = i0.ɵɵgetCurrentView();
|
|
1098
1098
|
i0.ɵɵelementStart(0, "div", 40)(1, "div", 173);
|
|
1099
1099
|
i0.ɵɵelement(2, "i", 39);
|
|
1100
1100
|
i0.ɵɵtext(3, " Shortcuts ");
|
|
1101
1101
|
i0.ɵɵelementStart(4, "button", 174);
|
|
1102
|
-
i0.ɵɵlistener("click", function
|
|
1102
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Conditional_68_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r17); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleShortcuts()); });
|
|
1103
1103
|
i0.ɵɵelement(5, "i", 175);
|
|
1104
1104
|
i0.ɵɵelementEnd()();
|
|
1105
1105
|
i0.ɵɵelementStart(6, "div", 176)(7, "div", 177)(8, "span");
|
|
@@ -1133,7 +1133,7 @@ function TestFormComponentExtended_Conditional_68_Template(rf, ctx) { if (rf & 1
|
|
|
1133
1133
|
} }
|
|
1134
1134
|
/** Settings key for keyboard shortcuts visibility */
|
|
1135
1135
|
const SHORTCUTS_SETTINGS_KEY = '__mj.Testing.ShowKeyboardShortcuts';
|
|
1136
|
-
let
|
|
1136
|
+
let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTestFormComponent {
|
|
1137
1137
|
constructor() {
|
|
1138
1138
|
super(...arguments);
|
|
1139
1139
|
this.destroy$ = new Subject();
|
|
@@ -1848,12 +1848,12 @@ let TestFormComponentExtended = class TestFormComponentExtended extends MJTestFo
|
|
|
1848
1848
|
console.warn('Failed to save shortcuts setting:', error);
|
|
1849
1849
|
}
|
|
1850
1850
|
}
|
|
1851
|
-
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵ
|
|
1852
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type:
|
|
1853
|
-
i0.ɵɵlistener("keydown", function
|
|
1854
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 69, vars: 37, consts: [["kendoDialogContainer", "", 1, "test-form"], [1, "test-header"], ["aria-label", "Breadcrumb", 1, "breadcrumb"], ["href", "javascript:void(0)", 3, "click"], [1, "fas", "fa-vial"], [1, "breadcrumb-text"], [1, "current"], [1, "fas", "fa-chevron-right", "separator"], [1, "fas", "fa-flask"], [1, "header-content"], [1, "header-left"], [1, "test-icon"], [1, "test-info"], [1, "test-meta"], [1, "status-badge", 3, "ngClass"], [1, "fas", 3, "ngClass"], [1, "test-type"], [1, "header-actions"], ["kendoButton", "", "themeColor", "primary", 3, "click"], [1, "fas", "fa-play"], ["kendoButton", "", 3, "click", "disabled"], [1, "test-description"], [1, "metrics-bar"], [1, "tabs-container"], ["role", "tablist", 1, "tabs"], ["role", "tab", 1, "tab", 3, "click"], [1, "fas", "fa-th-large"], [1, "fas", "fa-sliders-h"], [1, "fas", "fa-history"], [1, "tab-badge"], [1, "fas", "fa-layer-group"], [1, "fas", "fa-chart-line"], [1, "tab-content"], [1, "overview-tab"], [1, "config-tab"], [1, "runs-tab"], [1, "suites-tab"], [1, "history-tab"], [1, "shortcuts-toggle", 3, "click", "title"], [1, "fas", "fa-keyboard"], [1, "keyboard-shortcuts"], [1, "fas", "fa-tag"], [1, "metric-card"], [1, "metric-label"], [1, "metric-value"], [1, "metric-progress"], [1, "metric-progress-fill"], [1, "info-section"], [1, "fas", "fa-info-circle"], [1, "info-grid"], [1, "info-item"], [1, "info-label"], [1, "info-value"], [1, "status-badge-inline", 3, "ngClass"], [1, "json-section"], [1, "fas", "fa-code"], [1, "json-tabs"], [1, "json-tab", 3, "click"], [1, "fas", "fa-sign-in-alt"], [1, "fas", "fa-check-double"], [1, "fas", "fa-cog"], [1, "fas", "fa-tags"], [1, "code-editor-container"], ["language", "json", 3, "value", "readonly", "toolbar", "lineWrapping"], [1, "config-section"], [1, "fas", "fa-cogs"], [1, "config-grid"], [1, "config-item"], ["type", "number", "placeholder", "Lower = Higher Priority", 1, "config-input", 3, "ngModelChange", "ngModel"], ["type", "number", "min", "1", 1, "config-input", 3, "ngModelChange", "ngModel"], ["type", "number", 1, "config-input", 3, "ngModelChange", "ngModel"], ["type", "number", "step", "0.000001", 1, "config-input", 3, "ngModelChange", "ngModel"], [1, "config-item", "full-width"], ["type", "number", "placeholder", "Default: 300000 (5 min)", 1, "config-input", 3, "ngModelChange", "ngModel"], [1, "config-hint"], [1, "config-editor-container"], ["language", "json", 3, "change", "value", "readonly", "lineWrapping"], [1, "config-editor-container", "small"], [1, "loading-state"], [1, "runs-list"], [1, "empty-state"], [1, "skeleton-list"], [1, "skeleton-card"], [1, "skeleton-icon"], [1, "skeleton-content"], [1, "skeleton-line", "wide"], [1, "skeleton-line", "narrow"], [1, "run-item"], [1, "run-item", 3, "click"], [1, "run-icon"], [1, "fas"], [1, "run-content"], [1, "run-header"], [1, "run-id"], [1, "run-status"], [1, "run-meta"], [1, "fas", "fa-calendar"], [3, "entityName", "recordId"], [1, "run-eval-stack"], [1, "eval-pill", "status-pill", 3, "ngClass", "title"], [1, "run-tags"], [1, "fas", "fa-chevron-right"], [1, "fas", "fa-clock"], [1, "fas", "fa-dollar-sign"], ["title", "Human Review: No rating submitted yet", 1, "eval-pill", "human-pill", "no-feedback"], [1, "eval-pill", "human-pill", "has-feedback", 3, "rating-low", "rating-medium", "rating-good", "rating-excellent", "title"], [1, "fas", "fa-user-slash"], [1, "eval-pill", "human-pill", "has-feedback", 3, "title"], [1, "fas", "fa-user"], ["title", "Auto Score: No automated score available", 1, "eval-pill", "auto-pill", "no-score"], [1, "eval-pill", "auto-pill", "has-score", 3, "score-low", "score-medium", "score-good", "score-excellent", "title"], [1, "fas", "fa-robot"], [1, "eval-pill", "auto-pill", "has-score", 3, "title"], [1, "run-tag"], [1, "run-tag-more"], [1, "empty-icon"], [1, "fas", "fa-play-circle"], [1, "suites-list"], [1, "suite-item"], [1, "suite-item", 3, "click"], [1, "suite-icon"], [1, "suite-content"], [1, "suite-name"], [1, "suite-meta"], [1, "fas", "fa-sort-numeric-up"], [1, "fas", "fa-folder-open"], [1, "history-content"], ["text", "Loading history..."], [1, "history-filters"], [1, "time-range-filters"], [1, "filter-label"], [1, "filter-btn", 3, "click"], [1, "history-actions"], [1, "fas", "fa-download"], [1, "history-kpi-cards"], [1, "history-section"], [1, "kpi-card"], [1, "kpi-icon"], [1, "kpi-content"], [1, "kpi-value"], [1, "kpi-label"], [1, "kpi-icon", "pass-rate"], [1, "fas", "fa-percentage"], [1, "fas", "trend-icon"], [1, "fas", "fa-star"], [1, "fas", "fa-calendar-alt"], [1, "history-table-container"], [1, "history-table"], [1, "date-cell"], [1, "runs-cell"], [1, "passed-cell"], [1, "failed-cell"], [1, "pass-rate-cell"], [1, "score-cell"], [1, "duration-cell"], [1, "cost-cell"], [1, "pass-rate-bar"], [1, "pass-rate-fill"], [1, "pass-rate-text"], [1, "suite-performance-list"], [1, "suite-perf-card"], [1, "suite-perf-card", 3, "click"], [1, "suite-perf-header"], [1, "suite-perf-name"], [1, "suite-perf-tags"], [1, "suite-perf-stats"], [1, "suite-stat"], [1, "stat-value"], [1, "stat-label"], [1, "fas", "fa-chevron-right", "suite-perf-arrow"], [1, "tag-mini"], [1, "tag-more"], [1, "stat-value", "pass-rate"], [1, "shortcuts-header"], ["title", "Hide shortcuts", 1, "shortcuts-close", 3, "click"], [1, "fas", "fa-times"], [1, "shortcut-list"], [1, "shortcut-item"], [1, "shortcut-keys"]], template: function
|
|
1851
|
+
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵMJTestFormComponentExtended_BaseFactory; return function MJTestFormComponentExtended_Factory(__ngFactoryType__) { return (ɵMJTestFormComponentExtended_BaseFactory || (ɵMJTestFormComponentExtended_BaseFactory = i0.ɵɵgetInheritedFactory(MJTestFormComponentExtended)))(__ngFactoryType__ || MJTestFormComponentExtended); }; })(); }
|
|
1852
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJTestFormComponentExtended, selectors: [["mj-test-form"]], hostBindings: function MJTestFormComponentExtended_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1853
|
+
i0.ɵɵlistener("keydown", function MJTestFormComponentExtended_keydown_HostBindingHandler($event) { return ctx.handleKeyboardShortcut($event); }, i0.ɵɵresolveDocument);
|
|
1854
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 69, vars: 37, consts: [["kendoDialogContainer", "", 1, "test-form"], [1, "test-header"], ["aria-label", "Breadcrumb", 1, "breadcrumb"], ["href", "javascript:void(0)", 3, "click"], [1, "fas", "fa-vial"], [1, "breadcrumb-text"], [1, "current"], [1, "fas", "fa-chevron-right", "separator"], [1, "fas", "fa-flask"], [1, "header-content"], [1, "header-left"], [1, "test-icon"], [1, "test-info"], [1, "test-meta"], [1, "status-badge", 3, "ngClass"], [1, "fas", 3, "ngClass"], [1, "test-type"], [1, "header-actions"], ["kendoButton", "", "themeColor", "primary", 3, "click"], [1, "fas", "fa-play"], ["kendoButton", "", 3, "click", "disabled"], [1, "test-description"], [1, "metrics-bar"], [1, "tabs-container"], ["role", "tablist", 1, "tabs"], ["role", "tab", 1, "tab", 3, "click"], [1, "fas", "fa-th-large"], [1, "fas", "fa-sliders-h"], [1, "fas", "fa-history"], [1, "tab-badge"], [1, "fas", "fa-layer-group"], [1, "fas", "fa-chart-line"], [1, "tab-content"], [1, "overview-tab"], [1, "config-tab"], [1, "runs-tab"], [1, "suites-tab"], [1, "history-tab"], [1, "shortcuts-toggle", 3, "click", "title"], [1, "fas", "fa-keyboard"], [1, "keyboard-shortcuts"], [1, "fas", "fa-tag"], [1, "metric-card"], [1, "metric-label"], [1, "metric-value"], [1, "metric-progress"], [1, "metric-progress-fill"], [1, "info-section"], [1, "fas", "fa-info-circle"], [1, "info-grid"], [1, "info-item"], [1, "info-label"], [1, "info-value"], [1, "status-badge-inline", 3, "ngClass"], [1, "json-section"], [1, "fas", "fa-code"], [1, "json-tabs"], [1, "json-tab", 3, "click"], [1, "fas", "fa-sign-in-alt"], [1, "fas", "fa-check-double"], [1, "fas", "fa-cog"], [1, "fas", "fa-tags"], [1, "code-editor-container"], ["language", "json", 3, "value", "readonly", "toolbar", "lineWrapping"], [1, "config-section"], [1, "fas", "fa-cogs"], [1, "config-grid"], [1, "config-item"], ["type", "number", "placeholder", "Lower = Higher Priority", 1, "config-input", 3, "ngModelChange", "ngModel"], ["type", "number", "min", "1", 1, "config-input", 3, "ngModelChange", "ngModel"], ["type", "number", 1, "config-input", 3, "ngModelChange", "ngModel"], ["type", "number", "step", "0.000001", 1, "config-input", 3, "ngModelChange", "ngModel"], [1, "config-item", "full-width"], ["type", "number", "placeholder", "Default: 300000 (5 min)", 1, "config-input", 3, "ngModelChange", "ngModel"], [1, "config-hint"], [1, "config-editor-container"], ["language", "json", 3, "change", "value", "readonly", "lineWrapping"], [1, "config-editor-container", "small"], [1, "loading-state"], [1, "runs-list"], [1, "empty-state"], [1, "skeleton-list"], [1, "skeleton-card"], [1, "skeleton-icon"], [1, "skeleton-content"], [1, "skeleton-line", "wide"], [1, "skeleton-line", "narrow"], [1, "run-item"], [1, "run-item", 3, "click"], [1, "run-icon"], [1, "fas"], [1, "run-content"], [1, "run-header"], [1, "run-id"], [1, "run-status"], [1, "run-meta"], [1, "fas", "fa-calendar"], [3, "entityName", "recordId"], [1, "run-eval-stack"], [1, "eval-pill", "status-pill", 3, "ngClass", "title"], [1, "run-tags"], [1, "fas", "fa-chevron-right"], [1, "fas", "fa-clock"], [1, "fas", "fa-dollar-sign"], ["title", "Human Review: No rating submitted yet", 1, "eval-pill", "human-pill", "no-feedback"], [1, "eval-pill", "human-pill", "has-feedback", 3, "rating-low", "rating-medium", "rating-good", "rating-excellent", "title"], [1, "fas", "fa-user-slash"], [1, "eval-pill", "human-pill", "has-feedback", 3, "title"], [1, "fas", "fa-user"], ["title", "Auto Score: No automated score available", 1, "eval-pill", "auto-pill", "no-score"], [1, "eval-pill", "auto-pill", "has-score", 3, "score-low", "score-medium", "score-good", "score-excellent", "title"], [1, "fas", "fa-robot"], [1, "eval-pill", "auto-pill", "has-score", 3, "title"], [1, "run-tag"], [1, "run-tag-more"], [1, "empty-icon"], [1, "fas", "fa-play-circle"], [1, "suites-list"], [1, "suite-item"], [1, "suite-item", 3, "click"], [1, "suite-icon"], [1, "suite-content"], [1, "suite-name"], [1, "suite-meta"], [1, "fas", "fa-sort-numeric-up"], [1, "fas", "fa-folder-open"], [1, "history-content"], ["text", "Loading history..."], [1, "history-filters"], [1, "time-range-filters"], [1, "filter-label"], [1, "filter-btn", 3, "click"], [1, "history-actions"], [1, "fas", "fa-download"], [1, "history-kpi-cards"], [1, "history-section"], [1, "kpi-card"], [1, "kpi-icon"], [1, "kpi-content"], [1, "kpi-value"], [1, "kpi-label"], [1, "kpi-icon", "pass-rate"], [1, "fas", "fa-percentage"], [1, "fas", "trend-icon"], [1, "fas", "fa-star"], [1, "fas", "fa-calendar-alt"], [1, "history-table-container"], [1, "history-table"], [1, "date-cell"], [1, "runs-cell"], [1, "passed-cell"], [1, "failed-cell"], [1, "pass-rate-cell"], [1, "score-cell"], [1, "duration-cell"], [1, "cost-cell"], [1, "pass-rate-bar"], [1, "pass-rate-fill"], [1, "pass-rate-text"], [1, "suite-performance-list"], [1, "suite-perf-card"], [1, "suite-perf-card", 3, "click"], [1, "suite-perf-header"], [1, "suite-perf-name"], [1, "suite-perf-tags"], [1, "suite-perf-stats"], [1, "suite-stat"], [1, "stat-value"], [1, "stat-label"], [1, "fas", "fa-chevron-right", "suite-perf-arrow"], [1, "tag-mini"], [1, "tag-more"], [1, "stat-value", "pass-rate"], [1, "shortcuts-header"], ["title", "Hide shortcuts", 1, "shortcuts-close", 3, "click"], [1, "fas", "fa-times"], [1, "shortcut-list"], [1, "shortcut-item"], [1, "shortcut-keys"]], template: function MJTestFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
|
|
1855
1855
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "nav", 2)(3, "ol")(4, "li")(5, "a", 3);
|
|
1856
|
-
i0.ɵɵlistener("click", function
|
|
1856
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Template_a_click_5_listener() { return ctx.navigateToTestingDashboard(); });
|
|
1857
1857
|
i0.ɵɵelement(6, "i", 4);
|
|
1858
1858
|
i0.ɵɵelementStart(7, "span", 5);
|
|
1859
1859
|
i0.ɵɵtext(8, "Testing");
|
|
@@ -1873,69 +1873,69 @@ let TestFormComponentExtended = class TestFormComponentExtended extends MJTestFo
|
|
|
1873
1873
|
i0.ɵɵelement(23, "i", 15);
|
|
1874
1874
|
i0.ɵɵtext(24);
|
|
1875
1875
|
i0.ɵɵelementEnd();
|
|
1876
|
-
i0.ɵɵconditionalCreate(25,
|
|
1876
|
+
i0.ɵɵconditionalCreate(25, MJTestFormComponentExtended_Conditional_25_Template, 3, 1, "span", 16);
|
|
1877
1877
|
i0.ɵɵelementEnd()()();
|
|
1878
1878
|
i0.ɵɵelementStart(26, "div", 17);
|
|
1879
1879
|
i0.ɵɵelement(27, "app-evaluation-mode-toggle");
|
|
1880
1880
|
i0.ɵɵelementStart(28, "button", 18);
|
|
1881
|
-
i0.ɵɵlistener("click", function
|
|
1881
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Template_button_click_28_listener() { return ctx.runTest(); });
|
|
1882
1882
|
i0.ɵɵelement(29, "i", 19);
|
|
1883
1883
|
i0.ɵɵtext(30, " Run Test ");
|
|
1884
1884
|
i0.ɵɵelementEnd();
|
|
1885
1885
|
i0.ɵɵelementStart(31, "button", 20);
|
|
1886
|
-
i0.ɵɵlistener("click", function
|
|
1886
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Template_button_click_31_listener() { return ctx.refresh(); });
|
|
1887
1887
|
i0.ɵɵelement(32, "i", 15);
|
|
1888
1888
|
i0.ɵɵtext(33);
|
|
1889
1889
|
i0.ɵɵelementEnd()()();
|
|
1890
|
-
i0.ɵɵconditionalCreate(34,
|
|
1891
|
-
i0.ɵɵconditionalCreate(35,
|
|
1890
|
+
i0.ɵɵconditionalCreate(34, MJTestFormComponentExtended_Conditional_34_Template, 3, 1, "div", 21);
|
|
1891
|
+
i0.ɵɵconditionalCreate(35, MJTestFormComponentExtended_Conditional_35_Template, 23, 6, "div", 22);
|
|
1892
1892
|
i0.ɵɵelementEnd();
|
|
1893
1893
|
i0.ɵɵelementStart(36, "div", 23)(37, "div", 24)(38, "button", 25);
|
|
1894
|
-
i0.ɵɵlistener("click", function
|
|
1894
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Template_button_click_38_listener() { return ctx.changeTab("overview"); });
|
|
1895
1895
|
i0.ɵɵelement(39, "i", 26);
|
|
1896
1896
|
i0.ɵɵelementStart(40, "span");
|
|
1897
1897
|
i0.ɵɵtext(41, "Overview");
|
|
1898
1898
|
i0.ɵɵelementEnd()();
|
|
1899
1899
|
i0.ɵɵelementStart(42, "button", 25);
|
|
1900
|
-
i0.ɵɵlistener("click", function
|
|
1900
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Template_button_click_42_listener() { return ctx.changeTab("config"); });
|
|
1901
1901
|
i0.ɵɵelement(43, "i", 27);
|
|
1902
1902
|
i0.ɵɵelementStart(44, "span");
|
|
1903
1903
|
i0.ɵɵtext(45, "Configuration");
|
|
1904
1904
|
i0.ɵɵelementEnd()();
|
|
1905
1905
|
i0.ɵɵelementStart(46, "button", 25);
|
|
1906
|
-
i0.ɵɵlistener("click", function
|
|
1906
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Template_button_click_46_listener() { return ctx.changeTab("runs"); });
|
|
1907
1907
|
i0.ɵɵelement(47, "i", 28);
|
|
1908
1908
|
i0.ɵɵelementStart(48, "span");
|
|
1909
1909
|
i0.ɵɵtext(49, "Runs");
|
|
1910
1910
|
i0.ɵɵelementEnd();
|
|
1911
|
-
i0.ɵɵconditionalCreate(50,
|
|
1911
|
+
i0.ɵɵconditionalCreate(50, MJTestFormComponentExtended_Conditional_50_Template, 2, 1, "span", 29);
|
|
1912
1912
|
i0.ɵɵelementEnd();
|
|
1913
1913
|
i0.ɵɵelementStart(51, "button", 25);
|
|
1914
|
-
i0.ɵɵlistener("click", function
|
|
1914
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Template_button_click_51_listener() { return ctx.changeTab("suites"); });
|
|
1915
1915
|
i0.ɵɵelement(52, "i", 30);
|
|
1916
1916
|
i0.ɵɵelementStart(53, "span");
|
|
1917
1917
|
i0.ɵɵtext(54, "Test Suites");
|
|
1918
1918
|
i0.ɵɵelementEnd();
|
|
1919
|
-
i0.ɵɵconditionalCreate(55,
|
|
1919
|
+
i0.ɵɵconditionalCreate(55, MJTestFormComponentExtended_Conditional_55_Template, 2, 1, "span", 29);
|
|
1920
1920
|
i0.ɵɵelementEnd();
|
|
1921
1921
|
i0.ɵɵelementStart(56, "button", 25);
|
|
1922
|
-
i0.ɵɵlistener("click", function
|
|
1922
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Template_button_click_56_listener() { return ctx.changeTab("analytics"); });
|
|
1923
1923
|
i0.ɵɵelement(57, "i", 31);
|
|
1924
1924
|
i0.ɵɵelementStart(58, "span");
|
|
1925
1925
|
i0.ɵɵtext(59, "Analytics");
|
|
1926
1926
|
i0.ɵɵelementEnd()()()();
|
|
1927
1927
|
i0.ɵɵelementStart(60, "div", 32);
|
|
1928
|
-
i0.ɵɵconditionalCreate(61,
|
|
1929
|
-
i0.ɵɵconditionalCreate(62,
|
|
1930
|
-
i0.ɵɵconditionalCreate(63,
|
|
1931
|
-
i0.ɵɵconditionalCreate(64,
|
|
1932
|
-
i0.ɵɵconditionalCreate(65,
|
|
1928
|
+
i0.ɵɵconditionalCreate(61, MJTestFormComponentExtended_Conditional_61_Template, 78, 29, "div", 33);
|
|
1929
|
+
i0.ɵɵconditionalCreate(62, MJTestFormComponentExtended_Conditional_62_Template, 52, 17, "div", 34);
|
|
1930
|
+
i0.ɵɵconditionalCreate(63, MJTestFormComponentExtended_Conditional_63_Template, 4, 3, "div", 35);
|
|
1931
|
+
i0.ɵɵconditionalCreate(64, MJTestFormComponentExtended_Conditional_64_Template, 4, 3, "div", 36);
|
|
1932
|
+
i0.ɵɵconditionalCreate(65, MJTestFormComponentExtended_Conditional_65_Template, 3, 2, "div", 37);
|
|
1933
1933
|
i0.ɵɵelementEnd();
|
|
1934
1934
|
i0.ɵɵelementStart(66, "button", 38);
|
|
1935
|
-
i0.ɵɵlistener("click", function
|
|
1935
|
+
i0.ɵɵlistener("click", function MJTestFormComponentExtended_Template_button_click_66_listener() { return ctx.toggleShortcuts(); });
|
|
1936
1936
|
i0.ɵɵelement(67, "i", 39);
|
|
1937
1937
|
i0.ɵɵelementEnd();
|
|
1938
|
-
i0.ɵɵconditionalCreate(68,
|
|
1938
|
+
i0.ɵɵconditionalCreate(68, MJTestFormComponentExtended_Conditional_68_Template, 32, 0, "div", 40);
|
|
1939
1939
|
i0.ɵɵelementEnd();
|
|
1940
1940
|
} if (rf & 2) {
|
|
1941
1941
|
i0.ɵɵadvance(13);
|
|
@@ -1997,16 +1997,16 @@ let TestFormComponentExtended = class TestFormComponentExtended extends MJTestFo
|
|
|
1997
1997
|
i0.ɵɵconditional(ctx.showShortcuts ? 68 : -1);
|
|
1998
1998
|
} }, dependencies: [i1.NgClass, i2.DefaultValueAccessor, i2.NumberValueAccessor, i2.NgControlStatus, i2.MinValidator, i2.NgModel, i3.DialogContainerDirective, i4.ButtonComponent, i5.CodeEditorComponent, i6.EvaluationModeToggleComponent, i7.LoadingComponent, i8.EntityLinkPillComponent, i1.DatePipe], styles: ["\n\n\n\n\n\n\n\n[_nghost-%COMP%] {\n --test-primary: #2563eb;\n --test-primary-light: #3b82f6;\n --test-primary-dark: #1d4ed8;\n --test-success: #10b981;\n --test-success-light: #d1fae5;\n --test-error: #ef4444;\n --test-error-light: #fee2e2;\n --test-warning: #f59e0b;\n --test-warning-light: #fef3c7;\n --test-disabled: #6b7280;\n --test-bg: #f8fafc;\n --test-surface: #ffffff;\n --test-border: #e2e8f0;\n --test-text: #1e293b;\n --test-text-secondary: #64748b;\n --test-text-muted: #94a3b8;\n --test-radius-sm: 6px;\n --test-radius-md: 10px;\n --test-radius-lg: 16px;\n --test-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\n --test-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --test-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n --test-transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: block;\n height: 100%;\n}\n\n\n\n.breadcrumb[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.breadcrumb[_ngcontent-%COMP%] ol[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: 13px;\n}\n\n.breadcrumb[_ngcontent-%COMP%] li[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.breadcrumb[_ngcontent-%COMP%] a[_ngcontent-%COMP%] {\n color: var(--test-primary);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n border-radius: 6px;\n transition: background 0.15s;\n}\n\n.breadcrumb[_ngcontent-%COMP%] a[_ngcontent-%COMP%]:hover {\n background: rgba(37, 99, 235, 0.1);\n text-decoration: none;\n}\n\n.breadcrumb[_ngcontent-%COMP%] .separator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--test-text-muted);\n margin: 0 4px;\n}\n\n.breadcrumb[_ngcontent-%COMP%] .current[_ngcontent-%COMP%] {\n color: var(--test-text-secondary);\n font-weight: 500;\n}\n\n.breadcrumb-text[_ngcontent-%COMP%] {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n\n.test-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--test-bg);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n\n\n\n\n.test-header[_ngcontent-%COMP%] {\n background: var(--test-surface);\n border-bottom: 1px solid var(--test-border);\n padding: 20px;\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n gap: 16px;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n flex: 1;\n min-width: 0;\n}\n\n\n\n.test-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: var(--test-radius-md);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 24px;\n flex-shrink: 0;\n box-shadow: var(--test-shadow-md);\n transition: var(--test-transition);\n}\n\n.test-icon[_ngcontent-%COMP%]:hover {\n transform: scale(1.05);\n}\n\n\n\n.test-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.test-info[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: clamp(18px, 4vw, 24px);\n font-weight: 700;\n color: var(--test-text);\n line-height: 1.2;\n word-wrap: break-word;\n}\n\n.test-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n color: white;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n box-shadow: var(--test-shadow-sm);\n}\n\n.status-badge.status-active[_ngcontent-%COMP%] { background: linear-gradient(135deg, var(--test-success) 0%, #059669 100%); }\n.status-badge.status-disabled[_ngcontent-%COMP%] { background: linear-gradient(135deg, var(--test-disabled) 0%, #4b5563 100%); }\n.status-badge.status-pending[_ngcontent-%COMP%] { background: linear-gradient(135deg, var(--test-warning) 0%, #d97706 100%); }\n\n.status-badge-inline[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 10px;\n border-radius: 10px;\n color: white;\n font-size: 11px;\n font-weight: 600;\n}\n\n.status-badge-inline.status-active[_ngcontent-%COMP%] { background: var(--test-success); }\n.status-badge-inline.status-disabled[_ngcontent-%COMP%] { background: var(--test-disabled); }\n.status-badge-inline.status-pending[_ngcontent-%COMP%] { background: var(--test-warning); }\n\n.test-type[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 14px;\n color: var(--test-text-secondary);\n padding: 4px 10px;\n background: var(--test-bg);\n border-radius: var(--test-radius-sm);\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.header-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n white-space: nowrap;\n}\n\n\n\n.test-description[_ngcontent-%COMP%] {\n padding: 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-radius: var(--test-radius-md);\n margin-bottom: 16px;\n border: 1px solid var(--test-border);\n}\n\n.test-description[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--test-text-secondary);\n line-height: 1.6;\n font-size: 14px;\n}\n\n\n\n\n\n.metrics-bar[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 12px;\n}\n\n.metric-card[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-md);\n padding: 14px;\n text-align: center;\n transition: var(--test-transition);\n}\n\n.metric-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: var(--test-shadow-md);\n}\n\n.metric-label[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--test-text-muted);\n margin-bottom: 6px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 700;\n color: var(--test-text);\n}\n\n\n\n.metric-progress[_ngcontent-%COMP%] {\n margin-top: 8px;\n height: 4px;\n background: var(--test-border);\n border-radius: 2px;\n overflow: hidden;\n}\n\n.metric-progress-fill[_ngcontent-%COMP%] {\n height: 100%;\n background: linear-gradient(90deg, var(--test-success) 0%, #34d399 100%);\n border-radius: 2px;\n transition: width 0.5s ease-out;\n}\n\n\n\n\n\n.tabs-container[_ngcontent-%COMP%] {\n background: var(--test-surface);\n border-bottom: 1px solid var(--test-border);\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n.tabs[_ngcontent-%COMP%] {\n display: flex;\n padding: 0 20px;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.tabs[_ngcontent-%COMP%]::-webkit-scrollbar {\n display: none;\n}\n\n.tab[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 18px;\n border: none;\n background: transparent;\n border-bottom: 3px solid transparent;\n color: var(--test-text-secondary);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: var(--test-transition);\n white-space: nowrap;\n}\n\n.tab[_ngcontent-%COMP%]:hover {\n color: var(--test-primary);\n background: rgba(37, 99, 235, 0.05);\n}\n\n.tab.active[_ngcontent-%COMP%] {\n color: var(--test-primary);\n border-bottom-color: var(--test-primary);\n font-weight: 600;\n}\n\n.tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 15px;\n}\n\n.tab-badge[_ngcontent-%COMP%] {\n background: var(--test-border);\n color: var(--test-text-secondary);\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n transition: var(--test-transition);\n}\n\n.tab.active[_ngcontent-%COMP%] .tab-badge[_ngcontent-%COMP%] {\n background: rgba(37, 99, 235, 0.15);\n color: var(--test-primary);\n}\n\n.tab-shortcut[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--test-text-muted);\n background: var(--test-bg);\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 600;\n margin-left: 4px;\n}\n\n\n\n\n\n.tab-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n scroll-behavior: smooth;\n}\n\n\n\n\n\n.overview-tab[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n\n\n.info-section[_ngcontent-%COMP%] {\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n padding: 24px;\n box-shadow: var(--test-shadow-sm);\n}\n\n.info-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 20px 0;\n font-size: 18px;\n font-weight: 700;\n color: var(--test-text);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.info-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--test-primary);\n}\n\n.info-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.info-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.info-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--test-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--test-text);\n word-wrap: break-word;\n font-weight: 500;\n}\n\n\n\n.json-section[_ngcontent-%COMP%] {\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n padding: 24px;\n box-shadow: var(--test-shadow-sm);\n}\n\n.json-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 16px 0;\n font-size: 18px;\n font-weight: 700;\n color: var(--test-text);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--test-primary);\n}\n\n.json-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n margin-bottom: 16px;\n background: var(--test-bg);\n border-radius: var(--test-radius-md);\n padding: 4px;\n flex-wrap: wrap;\n}\n\n.json-tab[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 100px;\n padding: 10px 14px;\n border: none;\n background: transparent;\n color: var(--test-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n border-radius: var(--test-radius-sm);\n transition: var(--test-transition);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n}\n\n.json-tab[_ngcontent-%COMP%]:hover {\n color: var(--test-text);\n background: rgba(0, 0, 0, 0.05);\n}\n\n.json-tab.active[_ngcontent-%COMP%] {\n background: var(--test-surface);\n color: var(--test-primary);\n font-weight: 600;\n box-shadow: var(--test-shadow-sm);\n}\n\n.json-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.code-editor-container[_ngcontent-%COMP%] {\n border-radius: var(--test-radius-md);\n overflow: hidden;\n border: 1px solid var(--test-border);\n min-height: 200px;\n max-height: 400px;\n}\n\n\n\n\n\n.config-tab[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease-out;\n}\n\n.config-section[_ngcontent-%COMP%] {\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n padding: 24px;\n box-shadow: var(--test-shadow-sm);\n}\n\n.config-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 20px 0;\n font-size: 18px;\n font-weight: 700;\n color: var(--test-text);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.config-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--test-primary);\n}\n\n.config-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n gap: 20px;\n}\n\n.config-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.config-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.config-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--test-text-muted);\n}\n\n.config-input[_ngcontent-%COMP%] {\n padding: 10px 14px;\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-sm);\n font-size: 14px;\n transition: var(--test-transition);\n background: var(--test-surface);\n}\n\n.config-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--test-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.config-input[_ngcontent-%COMP%]::placeholder {\n color: var(--test-text-muted);\n}\n\n.config-hint[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--test-text-muted);\n margin-top: 4px;\n}\n\n.config-editor-container[_ngcontent-%COMP%] {\n border-radius: var(--test-radius-md);\n overflow: hidden;\n border: 1px solid var(--test-border);\n min-height: 200px;\n}\n\n.config-editor-container.small[_ngcontent-%COMP%] {\n min-height: 100px;\n max-height: 150px;\n}\n\n\n\n\n\n.runs-tab[_ngcontent-%COMP%], \n.suites-tab[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease-out;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.skeleton-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.skeleton-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 16px;\n background: var(--test-surface);\n border-radius: var(--test-radius-md);\n border: 1px solid var(--test-border);\n}\n\n.skeleton-icon[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n border-radius: var(--test-radius-md);\n background: linear-gradient(90deg, #e2e8f0 25%, #f1f5f9 50%, #e2e8f0 75%);\n background-size: 200% 100%;\n animation: _ngcontent-%COMP%_shimmer 1.5s infinite;\n flex-shrink: 0;\n}\n\n.skeleton-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.skeleton-line[_ngcontent-%COMP%] {\n height: 14px;\n border-radius: 4px;\n background: linear-gradient(90deg, #e2e8f0 25%, #f1f5f9 50%, #e2e8f0 75%);\n background-size: 200% 100%;\n animation: _ngcontent-%COMP%_shimmer 1.5s infinite;\n}\n\n.skeleton-line.wide[_ngcontent-%COMP%] { width: 70%; }\n.skeleton-line.narrow[_ngcontent-%COMP%] { width: 40%; }\n\n@keyframes _ngcontent-%COMP%_shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n}\n\n\n\n.runs-list[_ngcontent-%COMP%], \n.suites-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.run-item[_ngcontent-%COMP%], \n.suite-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 16px;\n background: var(--test-surface);\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-md);\n cursor: pointer;\n transition: var(--test-transition);\n}\n\n.run-item[_ngcontent-%COMP%]:hover, \n.suite-item[_ngcontent-%COMP%]:hover {\n background: rgba(37, 99, 235, 0.05);\n border-color: var(--test-primary-light);\n transform: translateX(4px);\n box-shadow: var(--test-shadow-sm);\n}\n\n.run-icon[_ngcontent-%COMP%], \n.suite-icon[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--test-radius-md);\n color: white;\n font-size: 18px;\n flex-shrink: 0;\n box-shadow: var(--test-shadow-sm);\n}\n\n.suite-icon[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n}\n\n.run-content[_ngcontent-%COMP%], \n.suite-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 4px;\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--test-text);\n}\n\n.run-status[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 700;\n text-transform: uppercase;\n}\n\n.suite-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--test-text);\n margin-bottom: 4px;\n}\n\n.run-meta[_ngcontent-%COMP%], \n.suite-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--test-text-secondary);\n flex-wrap: wrap;\n}\n\n.run-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%], \n.suite-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.run-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.suite-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--test-text-muted);\n font-size: 11px;\n}\n\n.run-item[_ngcontent-%COMP%] > i.fa-chevron-right[_ngcontent-%COMP%], \n.suite-item[_ngcontent-%COMP%] > i.fa-chevron-right[_ngcontent-%COMP%] {\n color: var(--test-text-muted);\n font-size: 14px;\n transition: var(--test-transition);\n}\n\n.run-item[_ngcontent-%COMP%]:hover > i.fa-chevron-right[_ngcontent-%COMP%], \n.suite-item[_ngcontent-%COMP%]:hover > i.fa-chevron-right[_ngcontent-%COMP%] {\n color: var(--test-primary);\n transform: translateX(2px);\n}\n\n\n\n.run-eval-stack[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n flex-wrap: wrap;\n}\n\n\n\n.eval-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n transition: var(--test-transition);\n}\n\n.eval-pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.eval-pill.status-pill.status-passed[_ngcontent-%COMP%] {\n background: #dcfce7;\n color: #16a34a;\n}\n\n.eval-pill.status-pill.status-failed[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.eval-pill.status-pill.status-error[_ngcontent-%COMP%] {\n background: #fef3c7;\n color: #d97706;\n}\n\n.eval-pill.status-pill.status-timeout[_ngcontent-%COMP%] {\n background: #fef3c7;\n color: #d97706;\n}\n\n.eval-pill.status-pill.status-skipped[_ngcontent-%COMP%], \n.eval-pill.status-pill.status-pending[_ngcontent-%COMP%] {\n background: #f1f5f9;\n color: #64748b;\n}\n\n.eval-pill.status-pill.status-running[_ngcontent-%COMP%] {\n background: #dbeafe;\n color: #2563eb;\n}\n\n\n\n.eval-pill.human-pill.no-feedback[_ngcontent-%COMP%] {\n background: #f1f5f9;\n color: #94a3b8;\n padding: 4px 8px;\n}\n\n.eval-pill.human-pill.has-feedback.rating-low[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.eval-pill.human-pill.has-feedback.rating-medium[_ngcontent-%COMP%] {\n background: #fef3c7;\n color: #d97706;\n}\n\n.eval-pill.human-pill.has-feedback.rating-good[_ngcontent-%COMP%] {\n background: #d1fae5;\n color: #059669;\n}\n\n.eval-pill.human-pill.has-feedback.rating-excellent[_ngcontent-%COMP%] {\n background: #dcfce7;\n color: #16a34a;\n}\n\n\n\n.eval-pill.auto-pill.no-score[_ngcontent-%COMP%] {\n background: #f1f5f9;\n color: #94a3b8;\n padding: 4px 8px;\n}\n\n.eval-pill.auto-pill.has-score.score-low[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.eval-pill.auto-pill.has-score.score-medium[_ngcontent-%COMP%] {\n background: #fef3c7;\n color: #d97706;\n}\n\n.eval-pill.auto-pill.has-score.score-good[_ngcontent-%COMP%] {\n background: #d1fae5;\n color: #059669;\n}\n\n.eval-pill.auto-pill.has-score.score-excellent[_ngcontent-%COMP%] {\n background: #dcfce7;\n color: #16a34a;\n}\n\n\n\n.run-tags[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 8px;\n flex-wrap: wrap;\n}\n\n.run-tag[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background: rgba(37, 99, 235, 0.1);\n color: var(--test-primary);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n}\n\n.run-tag-more[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background: var(--test-border);\n color: var(--test-text-muted);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n}\n\n\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 24px;\n text-align: center;\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--test-bg);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n color: var(--test-text-muted);\n}\n\n.empty-state[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--test-text);\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 20px 0;\n font-size: 14px;\n color: var(--test-text-secondary);\n max-width: 300px;\n}\n\n\n\n.no-data[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: var(--test-text-muted);\n text-align: center;\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n}\n\n.no-data[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.no-data[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n\n\n\n\n.shortcuts-toggle[_ngcontent-%COMP%] {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: var(--test-surface);\n border: 1px solid var(--test-border);\n box-shadow: var(--test-shadow-md);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--test-text-secondary);\n font-size: 14px;\n z-index: 99;\n transition: var(--test-transition);\n opacity: 0.7;\n}\n\n.shortcuts-toggle[_ngcontent-%COMP%]:hover {\n opacity: 1;\n transform: scale(1.1);\n color: var(--test-primary);\n border-color: var(--test-primary);\n}\n\n.keyboard-shortcuts[_ngcontent-%COMP%] {\n position: fixed;\n bottom: 20px;\n right: 20px;\n background: var(--test-surface);\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-md);\n padding: 12px 16px;\n box-shadow: var(--test-shadow-lg);\n font-size: 12px;\n color: var(--test-text-secondary);\n z-index: 100;\n max-width: 260px;\n}\n\n.shortcuts-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 10px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--test-border);\n font-weight: 600;\n color: var(--test-text);\n}\n\n.shortcuts-close[_ngcontent-%COMP%] {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--test-text-muted);\n font-size: 12px;\n padding: 2px 4px;\n border-radius: 4px;\n transition: var(--test-transition);\n}\n\n.shortcuts-close[_ngcontent-%COMP%]:hover {\n color: var(--test-text);\n background: var(--test-border);\n}\n\n.shortcut-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.shortcut-item[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.shortcut-keys[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n.shortcut-keys[_ngcontent-%COMP%] kbd[_ngcontent-%COMP%] {\n background: var(--test-bg);\n border: 1px solid var(--test-border);\n border-radius: 4px;\n padding: 2px 6px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-size: 11px;\n color: var(--test-text);\n}\n\n\n\n\n\n@media (max-width: 1024px) {\n .metrics-bar[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .info-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .config-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .keyboard-shortcuts[_ngcontent-%COMP%], .shortcuts-toggle[_ngcontent-%COMP%] {\n display: none;\n }\n}\n\n\n\n\n\n@media (max-width: 768px) {\n .test-form[_ngcontent-%COMP%] {\n height: auto;\n min-height: 100%;\n }\n\n .test-header[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .header-content[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n }\n\n .header-left[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .test-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n font-size: 20px;\n }\n\n .test-info[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n\n .test-meta[_ngcontent-%COMP%] {\n gap: 8px;\n }\n\n .status-badge[_ngcontent-%COMP%] {\n padding: 4px 10px;\n font-size: 11px;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: stretch;\n }\n\n .header-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex: 1;\n }\n\n .metrics-bar[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n gap: 10px;\n }\n\n .metric-card[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .metric-value[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .tabs[_ngcontent-%COMP%] {\n padding: 0 12px;\n }\n\n .tab[_ngcontent-%COMP%] {\n padding: 12px 14px;\n font-size: 13px;\n gap: 6px;\n }\n\n .tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .tab-shortcut[_ngcontent-%COMP%] {\n display: none;\n }\n\n .tab-content[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .info-section[_ngcontent-%COMP%], \n .json-section[_ngcontent-%COMP%], \n .config-section[_ngcontent-%COMP%] {\n padding: 18px;\n }\n\n .info-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .json-tabs[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .json-tab[_ngcontent-%COMP%] {\n min-width: 0;\n justify-content: flex-start;\n }\n\n .run-item[_ngcontent-%COMP%], \n .suite-item[_ngcontent-%COMP%] {\n padding: 14px;\n }\n\n .run-icon[_ngcontent-%COMP%], \n .suite-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: 16px;\n }\n\n .run-meta[_ngcontent-%COMP%], \n .suite-meta[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 4px;\n }\n\n .empty-state[_ngcontent-%COMP%] {\n padding: 40px 20px;\n }\n\n .empty-icon[_ngcontent-%COMP%] {\n width: 64px;\n height: 64px;\n }\n\n .empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 28px;\n }\n}\n\n\n\n\n\n@media (max-width: 480px) {\n .test-header[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .header-left[_ngcontent-%COMP%] {\n gap: 12px;\n }\n\n .test-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: 18px;\n border-radius: 8px;\n }\n\n .test-info[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .metrics-bar[_ngcontent-%COMP%] {\n grid-template-columns: 1fr 1fr;\n }\n\n .tabs[_ngcontent-%COMP%] {\n padding: 0 8px;\n }\n\n .tab[_ngcontent-%COMP%] {\n padding: 10px 12px;\n font-size: 12px;\n }\n\n .tab-badge[_ngcontent-%COMP%] {\n display: none;\n }\n\n .tab-content[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .run-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n }\n}\n\n\n\n\n\n@media (hover: none) and (pointer: coarse) {\n .tab[_ngcontent-%COMP%], \n .json-tab[_ngcontent-%COMP%], \n .run-item[_ngcontent-%COMP%], \n .suite-item[_ngcontent-%COMP%] {\n -webkit-tap-highlight-color: transparent;\n }\n\n .run-item[_ngcontent-%COMP%]:active, \n .suite-item[_ngcontent-%COMP%]:active {\n background: rgba(37, 99, 235, 0.1);\n transform: scale(0.98);\n }\n\n .tab[_ngcontent-%COMP%]:active, \n .json-tab[_ngcontent-%COMP%]:active {\n background: rgba(37, 99, 235, 0.1);\n }\n\n \n\n .tab[_ngcontent-%COMP%] {\n min-height: 48px;\n }\n\n .run-item[_ngcontent-%COMP%], \n .suite-item[_ngcontent-%COMP%] {\n min-height: 64px;\n }\n}\n\n\n\n\n\n@media (prefers-reduced-motion: reduce) {\n *[_ngcontent-%COMP%], \n *[_ngcontent-%COMP%]::before, \n *[_ngcontent-%COMP%]::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n\n .skeleton-icon[_ngcontent-%COMP%], \n .skeleton-line[_ngcontent-%COMP%] {\n animation: none;\n background: #e2e8f0;\n }\n}\n\n\n\n\n\n.history-tab[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease-out;\n}\n\n.history-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n\n\n.history-filters[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n padding: 16px;\n background: var(--test-surface);\n border-radius: var(--test-radius-md);\n box-shadow: var(--test-shadow-sm);\n}\n\n.time-range-filters[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.filter-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--test-text-secondary);\n margin-right: 4px;\n}\n\n.filter-btn[_ngcontent-%COMP%] {\n padding: 8px 16px;\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-sm);\n background: var(--test-surface);\n color: var(--test-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: var(--test-transition);\n}\n\n.filter-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--test-primary-light);\n color: var(--test-primary);\n background: rgba(37, 99, 235, 0.05);\n}\n\n.filter-btn.active[_ngcontent-%COMP%] {\n background: var(--test-primary);\n color: white;\n border-color: var(--test-primary);\n}\n\n.history-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n.history-kpi-cards[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 16px;\n}\n\n.kpi-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 18px;\n background: var(--test-surface);\n border-radius: var(--test-radius-md);\n box-shadow: var(--test-shadow-sm);\n transition: var(--test-transition);\n}\n\n.kpi-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: var(--test-shadow-md);\n}\n\n.kpi-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, var(--test-primary) 0%, var(--test-primary-dark) 100%);\n border-radius: var(--test-radius-md);\n color: white;\n font-size: 20px;\n flex-shrink: 0;\n}\n\n.kpi-icon.pass-rate[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, var(--test-success) 0%, #059669 100%);\n}\n\n.kpi-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.kpi-value[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 700;\n color: var(--test-text);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.kpi-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--test-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-top: 2px;\n}\n\n.trend-icon[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.trend-icon.trend-up[_ngcontent-%COMP%] {\n color: var(--test-success);\n}\n\n.trend-icon.trend-down[_ngcontent-%COMP%] {\n color: var(--test-error);\n}\n\n\n\n.history-section[_ngcontent-%COMP%] {\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n padding: 24px;\n box-shadow: var(--test-shadow-sm);\n}\n\n.history-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 20px 0;\n font-size: 18px;\n font-weight: 700;\n color: var(--test-text);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.history-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--test-primary);\n}\n\n\n\n.history-table-container[_ngcontent-%COMP%] {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.history-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 14px;\n}\n\n.history-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.history-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n text-align: left;\n border-bottom: 1px solid var(--test-border);\n}\n\n.history-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--test-text-muted);\n background: var(--test-bg);\n}\n\n.history-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: rgba(37, 99, 235, 0.03);\n}\n\n.date-cell[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--test-text);\n}\n\n.passed-cell[_ngcontent-%COMP%] {\n color: var(--test-success);\n font-weight: 600;\n}\n\n.failed-cell[_ngcontent-%COMP%] {\n color: var(--test-error);\n font-weight: 600;\n}\n\n.pass-rate-cell[_ngcontent-%COMP%] {\n min-width: 120px;\n}\n\n.pass-rate-bar[_ngcontent-%COMP%] {\n position: relative;\n height: 24px;\n background: var(--test-bg);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.pass-rate-fill[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n background: linear-gradient(90deg, var(--test-success) 0%, #34d399 100%);\n border-radius: 12px;\n transition: width 0.5s ease-out;\n}\n\n.pass-rate-text[_ngcontent-%COMP%] {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n font-size: 11px;\n font-weight: 700;\n color: var(--test-text);\n z-index: 1;\n}\n\n\n\n.suite-performance-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.suite-perf-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 18px;\n background: var(--test-bg);\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-md);\n cursor: pointer;\n transition: var(--test-transition);\n}\n\n.suite-perf-card[_ngcontent-%COMP%]:hover {\n background: rgba(37, 99, 235, 0.05);\n border-color: var(--test-primary-light);\n transform: translateX(4px);\n}\n\n.suite-perf-header[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.suite-perf-name[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 600;\n color: var(--test-text);\n margin-bottom: 6px;\n}\n\n.suite-perf-tags[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.tag-mini[_ngcontent-%COMP%] {\n display: inline-flex;\n padding: 2px 8px;\n background: rgba(37, 99, 235, 0.1);\n color: var(--test-primary);\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n}\n\n.tag-more[_ngcontent-%COMP%] {\n display: inline-flex;\n padding: 2px 8px;\n background: var(--test-border);\n color: var(--test-text-muted);\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n}\n\n.suite-perf-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.suite-stat[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n}\n\n.suite-stat[_ngcontent-%COMP%] .stat-value[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 700;\n color: var(--test-text);\n}\n\n.suite-stat[_ngcontent-%COMP%] .stat-value.pass-rate.high[_ngcontent-%COMP%] {\n color: var(--test-success);\n}\n\n.suite-stat[_ngcontent-%COMP%] .stat-value.pass-rate.low[_ngcontent-%COMP%] {\n color: var(--test-error);\n}\n\n.suite-stat[_ngcontent-%COMP%] .stat-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--test-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.suite-perf-arrow[_ngcontent-%COMP%] {\n color: var(--test-text-muted);\n font-size: 14px;\n transition: var(--test-transition);\n}\n\n.suite-perf-card[_ngcontent-%COMP%]:hover .suite-perf-arrow[_ngcontent-%COMP%] {\n color: var(--test-primary);\n transform: translateX(2px);\n}\n\n\n\n\n\n@media print {\n .test-form[_ngcontent-%COMP%] {\n background: white;\n height: auto;\n }\n\n .header-actions[_ngcontent-%COMP%], \n .tabs-container[_ngcontent-%COMP%], \n .keyboard-shortcuts[_ngcontent-%COMP%] {\n display: none !important;\n }\n\n .tab-content[_ngcontent-%COMP%] {\n overflow: visible;\n padding: 0;\n }\n\n .info-section[_ngcontent-%COMP%], \n .json-section[_ngcontent-%COMP%], \n .config-section[_ngcontent-%COMP%], \n .empty-state[_ngcontent-%COMP%] {\n break-inside: avoid;\n box-shadow: none;\n border: 1px solid #ddd;\n }\n}"], changeDetection: 0 }); }
|
|
1999
1999
|
};
|
|
2000
|
-
|
|
2000
|
+
MJTestFormComponentExtended = __decorate([
|
|
2001
2001
|
RegisterClass(BaseFormComponent, 'MJ: Tests')
|
|
2002
|
-
],
|
|
2003
|
-
export {
|
|
2004
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(
|
|
2002
|
+
], MJTestFormComponentExtended);
|
|
2003
|
+
export { MJTestFormComponentExtended };
|
|
2004
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJTestFormComponentExtended, [{
|
|
2005
2005
|
type: Component,
|
|
2006
2006
|
args: [{ standalone: false, selector: 'mj-test-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"test-form\" kendoDialogContainer>\n <!-- Header Section -->\n <div class=\"test-header\">\n <!-- Breadcrumb Navigation -->\n <nav class=\"breadcrumb\" aria-label=\"Breadcrumb\">\n <ol>\n <li>\n <a href=\"javascript:void(0)\" (click)=\"navigateToTestingDashboard()\">\n <i class=\"fas fa-vial\"></i>\n <span class=\"breadcrumb-text\">Testing</span>\n </a>\n </li>\n <li class=\"current\">\n <i class=\"fas fa-chevron-right separator\"></i>\n <i class=\"fas fa-flask\"></i>\n <span>{{ record.Name }}</span>\n </li>\n </ol>\n </nav>\n\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"test-icon\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas fa-flask\"></i>\n </div>\n <div class=\"test-info\">\n <h1>{{ record.Name }}</h1>\n <div class=\"test-meta\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass()\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n {{ record.Status }}\n </span>\n @if (record.Type) {\n <span class=\"test-type\">\n <i class=\"fas fa-tag\"></i>\n {{ record.Type }}\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"header-actions\">\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n <button kendoButton (click)=\"runTest()\" themeColor=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test\n </button>\n <button kendoButton (click)=\"refresh()\" [disabled]=\"isRefreshing\">\n <i class=\"fas\" [ngClass]=\"isRefreshing ? 'fa-sync fa-spin' : 'fa-sync'\"></i>\n {{ isRefreshing ? 'Refreshing...' : 'Refresh' }}\n </button>\n </div>\n </div>\n\n <!-- Test Description -->\n @if (record.Description) {\n <div class=\"test-description\">\n <p>{{ record.Description }}</p>\n </div>\n }\n\n <!-- Metrics Bar -->\n @if (testRunsLoaded && testRuns.length > 0) {\n <div class=\"metrics-bar\">\n <div class=\"metric-card\">\n <div class=\"metric-label\">Total Runs</div>\n <div class=\"metric-value\">{{ testRuns.length }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Pass Rate</div>\n <div class=\"metric-value\">{{ getPassRate().toFixed(1) }}%</div>\n <div class=\"metric-progress\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"getPassRate()\"></div>\n </div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Avg Cost</div>\n <div class=\"metric-value\">{{ formatCost(getAverageCost()) }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Avg Duration</div>\n <div class=\"metric-value\">{{ formatDuration(getAverageDuration()) }}</div>\n </div>\n </div>\n }\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div class=\"tabs\" role=\"tablist\">\n <button class=\"tab\"\n [class.active]=\"activeTab === 'overview'\"\n (click)=\"changeTab('overview')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'overview'\">\n <i class=\"fas fa-th-large\"></i>\n <span>Overview</span>\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'config'\"\n (click)=\"changeTab('config')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'config'\">\n <i class=\"fas fa-sliders-h\"></i>\n <span>Configuration</span>\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'runs'\"\n (click)=\"changeTab('runs')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'runs'\">\n <i class=\"fas fa-history\"></i>\n <span>Runs</span>\n @if (testRunsLoaded) {\n <span class=\"tab-badge\">{{ testRuns.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'suites'\"\n (click)=\"changeTab('suites')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'suites'\">\n <i class=\"fas fa-layer-group\"></i>\n <span>Test Suites</span>\n @if (suiteTestsLoaded) {\n <span class=\"tab-badge\">{{ suiteTests.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'analytics'\"\n (click)=\"changeTab('analytics')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'analytics'\">\n <i class=\"fas fa-chart-line\"></i>\n <span>Analytics</span>\n </button>\n </div>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\">\n <!-- Overview Tab -->\n @if (activeTab === 'overview') {\n <div class=\"overview-tab\">\n <!-- Basic Information -->\n <div class=\"info-section\">\n <h3><i class=\"fas fa-info-circle\"></i> Test Information</h3>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <div class=\"info-label\">Name</div>\n <div class=\"info-value\">{{ record.Name }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Type</div>\n <div class=\"info-value\">{{ record.Type || 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Status</div>\n <div class=\"info-value\">\n <span class=\"status-badge-inline\" [ngClass]=\"getStatusClass()\">{{ record.Status }}</span>\n </div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Priority</div>\n <div class=\"info-value\">{{ record.Priority || 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Estimated Duration</div>\n <div class=\"info-value\">{{ record.EstimatedDurationSeconds ? formatDuration(record.EstimatedDurationSeconds) : 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Estimated Cost</div>\n <div class=\"info-value\">{{ record.EstimatedCostUSD ? formatCost(record.EstimatedCostUSD) : 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Repeat Count</div>\n <div class=\"info-value\">{{ record.RepeatCount || 1 }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Max Execution Time</div>\n <div class=\"info-value\">{{ formatTimeout(record.MaxExecutionTimeMS) }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Created</div>\n <div class=\"info-value\">{{ record.__mj_CreatedAt | date:'medium' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Updated</div>\n <div class=\"info-value\">{{ record.__mj_UpdatedAt | date:'medium' }}</div>\n </div>\n </div>\n </div>\n <!-- JSON Data Views -->\n <div class=\"json-section\">\n <h3><i class=\"fas fa-code\"></i> Test Definition</h3>\n <div class=\"json-tabs\">\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'input'\"\n (click)=\"setJsonView('input')\">\n <i class=\"fas fa-sign-in-alt\"></i>\n Input Definition\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'expected'\"\n (click)=\"setJsonView('expected')\">\n <i class=\"fas fa-check-double\"></i>\n Expected Outcomes\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'config'\"\n (click)=\"setJsonView('config')\">\n <i class=\"fas fa-cog\"></i>\n Configuration\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'tags'\"\n (click)=\"setJsonView('tags')\">\n <i class=\"fas fa-tags\"></i>\n Tags\n </button>\n </div>\n <div class=\"code-editor-container\">\n <mj-code-editor\n [value]=\"getJsonData()\"\n language=\"json\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n }\n\n <!-- Configuration Tab -->\n @if (activeTab === 'config') {\n <div class=\"config-tab\">\n <div class=\"config-section\">\n <h3><i class=\"fas fa-cogs\"></i> Execution Settings</h3>\n <div class=\"config-grid\">\n <div class=\"config-item\">\n <label>Priority</label>\n <input type=\"number\" [(ngModel)]=\"record.Priority\" class=\"config-input\" placeholder=\"Lower = Higher Priority\" />\n </div>\n <div class=\"config-item\">\n <label>Repeat Count</label>\n <input type=\"number\" [(ngModel)]=\"record.RepeatCount\" class=\"config-input\" min=\"1\" />\n </div>\n <div class=\"config-item\">\n <label>Estimated Duration (seconds)</label>\n <input type=\"number\" [(ngModel)]=\"record.EstimatedDurationSeconds\" class=\"config-input\" />\n </div>\n <div class=\"config-item\">\n <label>Estimated Cost (USD)</label>\n <input type=\"number\" step=\"0.000001\" [(ngModel)]=\"record.EstimatedCostUSD\" class=\"config-input\" />\n </div>\n <div class=\"config-item full-width\">\n <label>Max Execution Time (ms)</label>\n <input type=\"number\" [(ngModel)]=\"record.MaxExecutionTimeMS\" class=\"config-input\" placeholder=\"Default: 300000 (5 min)\" />\n <span class=\"config-hint\">Leave empty for default 5 minute timeout</span>\n </div>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-sign-in-alt\"></i> Input Definition (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.InputDefinition || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.InputDefinition = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-check-double\"></i> Expected Outcomes (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.ExpectedOutcomes || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.ExpectedOutcomes = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-cog\"></i> Configuration (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.Configuration || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.Configuration = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-tags\"></i> Tags (JSON Array)</h3>\n <div class=\"config-editor-container small\">\n <mj-code-editor\n [value]=\"record.Tags || '[]'\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.Tags = $event\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n }\n\n <!-- Test Runs Tab -->\n @if (activeTab === 'runs') {\n <div class=\"runs-tab\">\n <!-- Loading State -->\n @if (loadingRuns) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3,4,5]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Runs List -->\n @if (!loadingRuns && testRuns.length > 0) {\n <div class=\"runs-list\">\n @for (run of testRuns; track run) {\n <div class=\"run-item\" (click)=\"openTestRun(run.ID)\">\n <div class=\"run-icon\" [style.background-color]=\"getRunStatusColor(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Passed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-exclamation]=\"run.Status === 'Error'\"\n [class.fa-stopwatch]=\"run.Status === 'Timeout'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"></i>\n </div>\n <div class=\"run-content\">\n <div class=\"run-header\">\n <span class=\"run-id\">Run #{{ run.ID.substring(0, 8) }}</span>\n <span class=\"run-status\" [style.color]=\"getRunStatusColor(run.Status)\">{{ run.Status }}</span>\n </div>\n <div class=\"run-meta\">\n <span><i class=\"fas fa-calendar\"></i> {{ getRelativeTime(run.StartedAt) }}</span>\n @if (run.DurationSeconds) {\n <span><i class=\"fas fa-clock\"></i> {{ formatDuration(run.DurationSeconds) }}</span>\n }\n @if (run.CostUSD) {\n <span><i class=\"fas fa-dollar-sign\"></i> {{ formatCost(run.CostUSD) }}</span>\n }\n @if (run.TargetLogEntityID && run.TargetLogID) {\n <mj-entity-link-pill\n [entityName]=\"run.TargetLogEntity\"\n [recordId]=\"run.TargetLogID\">\n </mj-entity-link-pill>\n }\n </div>\n <!-- Evaluation indicators -->\n <div class=\"run-eval-stack\">\n <!-- Status indicator -->\n @if (evalPreferences.showExecution) {\n <span class=\"eval-pill status-pill\"\n [ngClass]=\"'status-' + run.Status.toLowerCase()\"\n [title]=\"getStatusTooltip(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Passed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-exclamation]=\"run.Status === 'Error'\"\n [class.fa-hourglass-end]=\"run.Status === 'Timeout'\"\n [class.fa-forward]=\"run.Status === 'Skipped'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"></i>\n <span>{{ run.Status }}</span>\n </span>\n }\n <!-- Human feedback indicator -->\n @if (evalPreferences.showHuman) {\n @if (!getFeedbackForRun(run.ID)?.Rating) {\n <span class=\"eval-pill human-pill no-feedback\"\n title=\"Human Review: No rating submitted yet\">\n <i class=\"fas fa-user-slash\"></i>\n </span>\n }\n @if (getFeedbackForRun(run.ID)?.Rating; as rating) {\n <span class=\"eval-pill human-pill has-feedback\"\n [class.rating-low]=\"rating <= 4\"\n [class.rating-medium]=\"rating >= 5 && rating <= 6\"\n [class.rating-good]=\"rating >= 7 && rating <= 8\"\n [class.rating-excellent]=\"rating >= 9\"\n [title]=\"getHumanTooltip(rating, getFeedbackForRun(run.ID)?.CorrectionSummary || getFeedbackForRun(run.ID)?.Comments || null)\">\n <i class=\"fas fa-user\"></i>\n <span>{{ rating }}</span>\n </span>\n }\n }\n <!-- Auto score indicator -->\n @if (evalPreferences.showAuto) {\n @if (run.Score == null) {\n <span class=\"eval-pill auto-pill no-score\"\n title=\"Auto Score: No automated score available\">\n <i class=\"fas fa-robot\"></i>\n </span>\n }\n @if (run.Score != null) {\n <span class=\"eval-pill auto-pill has-score\"\n [class.score-low]=\"run.Score < 0.5\"\n [class.score-medium]=\"run.Score >= 0.5 && run.Score < 0.7\"\n [class.score-good]=\"run.Score >= 0.7 && run.Score < 0.85\"\n [class.score-excellent]=\"run.Score >= 0.85\"\n [title]=\"'Auto Score: ' + (run.Score * 100).toFixed(0) + '% automated evaluation'\">\n <i class=\"fas fa-robot\"></i>\n <span>{{ (run.Score * 100).toFixed(0) }}%</span>\n </span>\n }\n }\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"run-tags\">\n @for (tag of getRunTags(run).slice(0, 3); track tag) {\n <span class=\"run-tag\">{{ tag }}</span>\n }\n @if (getRunTags(run).length > 3) {\n <span class=\"run-tag-more\">+{{ getRunTags(run).length - 3 }}</span>\n }\n </div>\n }\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (testRunsLoaded && !loadingRuns && testRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-play-circle\"></i>\n </div>\n <h4>No Test Runs Yet</h4>\n <p>Run this test to see execution history and results here.</p>\n <button kendoButton (click)=\"runTest()\" themeColor=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Test Suites Tab -->\n @if (activeTab === 'suites') {\n <div class=\"suites-tab\">\n <!-- Loading State -->\n @if (loadingSuites) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Suites List -->\n @if (!loadingSuites && suiteTests.length > 0) {\n <div class=\"suites-list\">\n @for (suiteTest of suiteTests; track suiteTest) {\n <div class=\"suite-item\" (click)=\"openTestSuite(suiteTest.SuiteID)\">\n <div class=\"suite-icon\">\n <i class=\"fas fa-layer-group\"></i>\n </div>\n <div class=\"suite-content\">\n <div class=\"suite-name\">{{ suiteTest.Suite }}</div>\n <div class=\"suite-meta\">\n <span><i class=\"fas fa-sort-numeric-up\"></i> Sequence: {{ suiteTest.Sequence }}</span>\n @if (suiteTest.Status) {\n <span><i class=\"fas fa-info-circle\"></i> {{ suiteTest.Status }}</span>\n }\n </div>\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (suiteTestsLoaded && !loadingSuites && suiteTests.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-folder-open\"></i>\n </div>\n <h4>Not Part of Any Suite</h4>\n <p>This test is not included in any test suites. Add it to a suite to run it with other tests.</p>\n </div>\n }\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"history-tab\">\n <!-- Loading State -->\n @if (loadingHistory) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading history...\"></mj-loading>\n </div>\n }\n <!-- History Content -->\n @if (!loadingHistory && historyLoaded) {\n <div class=\"history-content\">\n <!-- Filters -->\n <div class=\"history-filters\">\n <div class=\"time-range-filters\">\n <span class=\"filter-label\">Time Range:</span>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '7d'\"\n (click)=\"setHistoryTimeRange('7d')\">7 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '30d'\"\n (click)=\"setHistoryTimeRange('30d')\">30 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '90d'\"\n (click)=\"setHistoryTimeRange('90d')\">90 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === 'all'\"\n (click)=\"setHistoryTimeRange('all')\">All Time</button>\n </div>\n <div class=\"history-actions\">\n <button kendoButton (click)=\"exportHistoryToCSV()\" [disabled]=\"historyData.length === 0\">\n <i class=\"fas fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n <!-- KPI Cards -->\n @if (historyData.length > 0) {\n <div class=\"history-kpi-cards\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-play-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ getTotalRuns() }}</div>\n <div class=\"kpi-label\">Total Runs</div>\n </div>\n </div>\n @if (evalPreferences.showExecution) {\n <div class=\"kpi-card\">\n <div class=\"kpi-icon pass-rate\">\n <i class=\"fas fa-percentage\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">\n {{ getOverallPassRate().toFixed(1) }}%\n <i class=\"fas trend-icon\"\n [class.fa-arrow-up]=\"getPassRateTrend() === 'up'\"\n [class.fa-arrow-down]=\"getPassRateTrend() === 'down'\"\n [class.fa-minus]=\"getPassRateTrend() === 'stable'\"\n [class.trend-up]=\"getPassRateTrend() === 'up'\"\n [class.trend-down]=\"getPassRateTrend() === 'down'\"></i>\n </div>\n <div class=\"kpi-label\">Pass Rate</div>\n </div>\n </div>\n }\n @if (evalPreferences.showAuto) {\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-star\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ (getOverallAvgScore() * 100).toFixed(1) }}%</div>\n <div class=\"kpi-label\">Avg Score</div>\n </div>\n </div>\n }\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatDuration(getOverallAvgDuration()) }}</div>\n <div class=\"kpi-label\">Avg Duration</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatCost(getOverallAvgCost()) }}</div>\n <div class=\"kpi-label\">Avg Cost</div>\n </div>\n </div>\n </div>\n }\n <!-- Daily History Table -->\n @if (historyData.length > 0) {\n <div class=\"history-section\">\n <h3><i class=\"fas fa-calendar-alt\"></i> Daily Performance</h3>\n <div class=\"history-table-container\">\n <table class=\"history-table\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Runs</th>\n @if (evalPreferences.showExecution) {\n <th>Passed</th>\n }\n @if (evalPreferences.showExecution) {\n <th>Failed</th>\n }\n @if (evalPreferences.showExecution) {\n <th>Pass Rate</th>\n }\n @if (evalPreferences.showAuto) {\n <th>Avg Score</th>\n }\n <th>Avg Duration</th>\n <th>Avg Cost</th>\n </tr>\n </thead>\n <tbody>\n @for (day of historyData; track day) {\n <tr>\n <td class=\"date-cell\">{{ day.date | date:'mediumDate' }}</td>\n <td class=\"runs-cell\">{{ day.runCount }}</td>\n @if (evalPreferences.showExecution) {\n <td class=\"passed-cell\">{{ day.passCount }}</td>\n }\n @if (evalPreferences.showExecution) {\n <td class=\"failed-cell\">{{ day.failCount }}</td>\n }\n @if (evalPreferences.showExecution) {\n <td class=\"pass-rate-cell\">\n <div class=\"pass-rate-bar\">\n <div class=\"pass-rate-fill\" [style.width.%]=\"day.passRate\"></div>\n <span class=\"pass-rate-text\">{{ day.passRate.toFixed(1) }}%</span>\n </div>\n </td>\n }\n @if (evalPreferences.showAuto) {\n <td class=\"score-cell\">{{ (day.avgScore * 100).toFixed(1) }}%</td>\n }\n <td class=\"duration-cell\">{{ formatDuration(day.avgDuration) }}</td>\n <td class=\"cost-cell\">{{ formatCost(day.avgCost) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n <!-- Suite Performance -->\n @if (suitePerformance.length > 0) {\n <div class=\"history-section\">\n <h3><i class=\"fas fa-layer-group\"></i> Performance by Suite</h3>\n <div class=\"suite-performance-list\">\n @for (suite of suitePerformance; track suite) {\n <div class=\"suite-perf-card\" (click)=\"openSuiteFromHistory(suite.suiteId)\">\n <div class=\"suite-perf-header\">\n <div class=\"suite-perf-name\">{{ suite.suiteName }}</div>\n @if (suite.tags.length > 0) {\n <div class=\"suite-perf-tags\">\n @for (tag of suite.tags.slice(0, 3); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n @if (suite.tags.length > 3) {\n <span class=\"tag-more\">+{{ suite.tags.length - 3 }}</span>\n }\n </div>\n }\n </div>\n <div class=\"suite-perf-stats\">\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ suite.totalRuns }}</span>\n <span class=\"stat-label\">Runs</span>\n </div>\n @if (evalPreferences.showExecution) {\n <div class=\"suite-stat\">\n <span class=\"stat-value pass-rate\" [class.high]=\"suite.passRate >= 80\" [class.low]=\"suite.passRate < 50\">\n {{ suite.passRate.toFixed(1) }}%\n </span>\n <span class=\"stat-label\">Pass Rate</span>\n </div>\n }\n @if (evalPreferences.showAuto) {\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ (suite.avgScore * 100).toFixed(1) }}%</span>\n <span class=\"stat-label\">Avg Score</span>\n </div>\n }\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ formatDuration(suite.avgDuration) }}</span>\n <span class=\"stat-label\">Avg Duration</span>\n </div>\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ formatCost(suite.avgCost) }}</span>\n <span class=\"stat-label\">Avg Cost</span>\n </div>\n @if (suite.lastRun) {\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ getRelativeTime(suite.lastRun) }}</span>\n <span class=\"stat-label\">Last Run</span>\n </div>\n }\n </div>\n <i class=\"fas fa-chevron-right suite-perf-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (historyData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-chart-line\"></i>\n </div>\n <h4>No History Available</h4>\n <p>Run this test to start building history and analytics data.</p>\n <button kendoButton (click)=\"runTest()\" themeColor=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test Now\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Keyboard Shortcuts Toggle Button -->\n <button class=\"shortcuts-toggle\" (click)=\"toggleShortcuts()\" [title]=\"showShortcuts ? 'Hide keyboard shortcuts' : 'Show keyboard shortcuts'\">\n <i class=\"fas fa-keyboard\"></i>\n </button>\n\n <!-- Keyboard Shortcuts Hint (Desktop Only) -->\n @if (showShortcuts) {\n <div class=\"keyboard-shortcuts\">\n <div class=\"shortcuts-header\">\n <i class=\"fas fa-keyboard\"></i>\n Shortcuts\n <button class=\"shortcuts-close\" (click)=\"toggleShortcuts()\" title=\"Hide shortcuts\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"shortcut-list\">\n <div class=\"shortcut-item\">\n <span>Refresh</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>R</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Run Test</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>Enter</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Switch Tabs</span>\n <span class=\"shortcut-keys\"><kbd>1</kbd>-<kbd>5</kbd></span>\n </div>\n </div>\n </div>\n }\n</div>\n", styles: ["/* ===========================\n Test Form - World-Class UX\n Premium Test Definition Styles\n =========================== */\n\n/* CSS Custom Properties for Theming - using :host for Angular encapsulation */\n:host {\n --test-primary: #2563eb;\n --test-primary-light: #3b82f6;\n --test-primary-dark: #1d4ed8;\n --test-success: #10b981;\n --test-success-light: #d1fae5;\n --test-error: #ef4444;\n --test-error-light: #fee2e2;\n --test-warning: #f59e0b;\n --test-warning-light: #fef3c7;\n --test-disabled: #6b7280;\n --test-bg: #f8fafc;\n --test-surface: #ffffff;\n --test-border: #e2e8f0;\n --test-text: #1e293b;\n --test-text-secondary: #64748b;\n --test-text-muted: #94a3b8;\n --test-radius-sm: 6px;\n --test-radius-md: 10px;\n --test-radius-lg: 16px;\n --test-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\n --test-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --test-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n --test-transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: block;\n height: 100%;\n}\n\n/* Breadcrumb */\n.breadcrumb {\n margin-bottom: 16px;\n}\n\n.breadcrumb ol {\n display: flex;\n align-items: center;\n gap: 4px;\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: 13px;\n}\n\n.breadcrumb li {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.breadcrumb a {\n color: var(--test-primary);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n border-radius: 6px;\n transition: background 0.15s;\n}\n\n.breadcrumb a:hover {\n background: rgba(37, 99, 235, 0.1);\n text-decoration: none;\n}\n\n.breadcrumb .separator {\n font-size: 10px;\n color: var(--test-text-muted);\n margin: 0 4px;\n}\n\n.breadcrumb .current {\n color: var(--test-text-secondary);\n font-weight: 500;\n}\n\n.breadcrumb-text {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Base Container */\n.test-form {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--test-bg);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n/* ===========================\n Header Section\n =========================== */\n.test-header {\n background: var(--test-surface);\n border-bottom: 1px solid var(--test-border);\n padding: 20px;\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n gap: 16px;\n}\n\n.header-left {\n display: flex;\n gap: 16px;\n flex: 1;\n min-width: 0;\n}\n\n/* Test Icon */\n.test-icon {\n width: 56px;\n height: 56px;\n border-radius: var(--test-radius-md);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 24px;\n flex-shrink: 0;\n box-shadow: var(--test-shadow-md);\n transition: var(--test-transition);\n}\n\n.test-icon:hover {\n transform: scale(1.05);\n}\n\n/* Test Info */\n.test-info {\n flex: 1;\n min-width: 0;\n}\n\n.test-info h1 {\n margin: 0 0 8px 0;\n font-size: clamp(18px, 4vw, 24px);\n font-weight: 700;\n color: var(--test-text);\n line-height: 1.2;\n word-wrap: break-word;\n}\n\n.test-meta {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n/* Status Badge */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n color: white;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n box-shadow: var(--test-shadow-sm);\n}\n\n.status-badge.status-active { background: linear-gradient(135deg, var(--test-success) 0%, #059669 100%); }\n.status-badge.status-disabled { background: linear-gradient(135deg, var(--test-disabled) 0%, #4b5563 100%); }\n.status-badge.status-pending { background: linear-gradient(135deg, var(--test-warning) 0%, #d97706 100%); }\n\n.status-badge-inline {\n display: inline-flex;\n align-items: center;\n padding: 2px 10px;\n border-radius: 10px;\n color: white;\n font-size: 11px;\n font-weight: 600;\n}\n\n.status-badge-inline.status-active { background: var(--test-success); }\n.status-badge-inline.status-disabled { background: var(--test-disabled); }\n.status-badge-inline.status-pending { background: var(--test-warning); }\n\n.test-type {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 14px;\n color: var(--test-text-secondary);\n padding: 4px 10px;\n background: var(--test-bg);\n border-radius: var(--test-radius-sm);\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.header-actions button {\n white-space: nowrap;\n}\n\n/* Test Description */\n.test-description {\n padding: 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-radius: var(--test-radius-md);\n margin-bottom: 16px;\n border: 1px solid var(--test-border);\n}\n\n.test-description p {\n margin: 0;\n color: var(--test-text-secondary);\n line-height: 1.6;\n font-size: 14px;\n}\n\n/* ===========================\n Metrics Bar\n =========================== */\n.metrics-bar {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 12px;\n}\n\n.metric-card {\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-md);\n padding: 14px;\n text-align: center;\n transition: var(--test-transition);\n}\n\n.metric-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--test-shadow-md);\n}\n\n.metric-label {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--test-text-muted);\n margin-bottom: 6px;\n}\n\n.metric-value {\n font-size: 18px;\n font-weight: 700;\n color: var(--test-text);\n}\n\n/* Progress bar in metric card */\n.metric-progress {\n margin-top: 8px;\n height: 4px;\n background: var(--test-border);\n border-radius: 2px;\n overflow: hidden;\n}\n\n.metric-progress-fill {\n height: 100%;\n background: linear-gradient(90deg, var(--test-success) 0%, #34d399 100%);\n border-radius: 2px;\n transition: width 0.5s ease-out;\n}\n\n/* ===========================\n Tabs Navigation\n =========================== */\n.tabs-container {\n background: var(--test-surface);\n border-bottom: 1px solid var(--test-border);\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n.tabs {\n display: flex;\n padding: 0 20px;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.tabs::-webkit-scrollbar {\n display: none;\n}\n\n.tab {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 18px;\n border: none;\n background: transparent;\n border-bottom: 3px solid transparent;\n color: var(--test-text-secondary);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: var(--test-transition);\n white-space: nowrap;\n}\n\n.tab:hover {\n color: var(--test-primary);\n background: rgba(37, 99, 235, 0.05);\n}\n\n.tab.active {\n color: var(--test-primary);\n border-bottom-color: var(--test-primary);\n font-weight: 600;\n}\n\n.tab i {\n font-size: 15px;\n}\n\n.tab-badge {\n background: var(--test-border);\n color: var(--test-text-secondary);\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n transition: var(--test-transition);\n}\n\n.tab.active .tab-badge {\n background: rgba(37, 99, 235, 0.15);\n color: var(--test-primary);\n}\n\n.tab-shortcut {\n font-size: 10px;\n color: var(--test-text-muted);\n background: var(--test-bg);\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 600;\n margin-left: 4px;\n}\n\n/* ===========================\n Tab Content Area\n =========================== */\n.tab-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n scroll-behavior: smooth;\n}\n\n/* ===========================\n Overview Tab\n =========================== */\n.overview-tab {\n display: flex;\n flex-direction: column;\n gap: 20px;\n animation: fadeIn 0.3s ease-out;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* Info Section */\n.info-section {\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n padding: 24px;\n box-shadow: var(--test-shadow-sm);\n}\n\n.info-section h3 {\n margin: 0 0 20px 0;\n font-size: 18px;\n font-weight: 700;\n color: var(--test-text);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.info-section h3 i {\n color: var(--test-primary);\n}\n\n.info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.info-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.info-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--test-text-muted);\n}\n\n.info-value {\n font-size: 14px;\n color: var(--test-text);\n word-wrap: break-word;\n font-weight: 500;\n}\n\n/* JSON Section */\n.json-section {\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n padding: 24px;\n box-shadow: var(--test-shadow-sm);\n}\n\n.json-section h3 {\n margin: 0 0 16px 0;\n font-size: 18px;\n font-weight: 700;\n color: var(--test-text);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-section h3 i {\n color: var(--test-primary);\n}\n\n.json-tabs {\n display: flex;\n gap: 4px;\n margin-bottom: 16px;\n background: var(--test-bg);\n border-radius: var(--test-radius-md);\n padding: 4px;\n flex-wrap: wrap;\n}\n\n.json-tab {\n flex: 1;\n min-width: 100px;\n padding: 10px 14px;\n border: none;\n background: transparent;\n color: var(--test-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n border-radius: var(--test-radius-sm);\n transition: var(--test-transition);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n}\n\n.json-tab:hover {\n color: var(--test-text);\n background: rgba(0, 0, 0, 0.05);\n}\n\n.json-tab.active {\n background: var(--test-surface);\n color: var(--test-primary);\n font-weight: 600;\n box-shadow: var(--test-shadow-sm);\n}\n\n.json-tab i {\n font-size: 12px;\n}\n\n.code-editor-container {\n border-radius: var(--test-radius-md);\n overflow: hidden;\n border: 1px solid var(--test-border);\n min-height: 200px;\n max-height: 400px;\n}\n\n/* ===========================\n Configuration Tab\n =========================== */\n.config-tab {\n display: flex;\n flex-direction: column;\n gap: 20px;\n animation: fadeIn 0.3s ease-out;\n}\n\n.config-section {\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n padding: 24px;\n box-shadow: var(--test-shadow-sm);\n}\n\n.config-section h3 {\n margin: 0 0 20px 0;\n font-size: 18px;\n font-weight: 700;\n color: var(--test-text);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.config-section h3 i {\n color: var(--test-primary);\n}\n\n.config-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n gap: 20px;\n}\n\n.config-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.config-item.full-width {\n grid-column: 1 / -1;\n}\n\n.config-item label {\n font-size: 12px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--test-text-muted);\n}\n\n.config-input {\n padding: 10px 14px;\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-sm);\n font-size: 14px;\n transition: var(--test-transition);\n background: var(--test-surface);\n}\n\n.config-input:focus {\n outline: none;\n border-color: var(--test-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.config-input::placeholder {\n color: var(--test-text-muted);\n}\n\n.config-hint {\n font-size: 11px;\n color: var(--test-text-muted);\n margin-top: 4px;\n}\n\n.config-editor-container {\n border-radius: var(--test-radius-md);\n overflow: hidden;\n border: 1px solid var(--test-border);\n min-height: 200px;\n}\n\n.config-editor-container.small {\n min-height: 100px;\n max-height: 150px;\n}\n\n/* ===========================\n Runs Tab\n =========================== */\n.runs-tab,\n.suites-tab {\n animation: fadeIn 0.3s ease-out;\n}\n\n/* Loading States & Skeletons */\n.loading-state {\n padding: 0;\n}\n\n.skeleton-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.skeleton-card {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 16px;\n background: var(--test-surface);\n border-radius: var(--test-radius-md);\n border: 1px solid var(--test-border);\n}\n\n.skeleton-icon {\n width: 44px;\n height: 44px;\n border-radius: var(--test-radius-md);\n background: linear-gradient(90deg, #e2e8f0 25%, #f1f5f9 50%, #e2e8f0 75%);\n background-size: 200% 100%;\n animation: shimmer 1.5s infinite;\n flex-shrink: 0;\n}\n\n.skeleton-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.skeleton-line {\n height: 14px;\n border-radius: 4px;\n background: linear-gradient(90deg, #e2e8f0 25%, #f1f5f9 50%, #e2e8f0 75%);\n background-size: 200% 100%;\n animation: shimmer 1.5s infinite;\n}\n\n.skeleton-line.wide { width: 70%; }\n.skeleton-line.narrow { width: 40%; }\n\n@keyframes shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n}\n\n/* Runs List */\n.runs-list,\n.suites-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.run-item,\n.suite-item {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 16px;\n background: var(--test-surface);\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-md);\n cursor: pointer;\n transition: var(--test-transition);\n}\n\n.run-item:hover,\n.suite-item:hover {\n background: rgba(37, 99, 235, 0.05);\n border-color: var(--test-primary-light);\n transform: translateX(4px);\n box-shadow: var(--test-shadow-sm);\n}\n\n.run-icon,\n.suite-icon {\n width: 44px;\n height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--test-radius-md);\n color: white;\n font-size: 18px;\n flex-shrink: 0;\n box-shadow: var(--test-shadow-sm);\n}\n\n.suite-icon {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n}\n\n.run-content,\n.suite-content {\n flex: 1;\n min-width: 0;\n}\n\n.run-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 4px;\n}\n\n.run-id {\n font-size: 14px;\n font-weight: 600;\n color: var(--test-text);\n}\n\n.run-status {\n font-size: 12px;\n font-weight: 700;\n text-transform: uppercase;\n}\n\n.suite-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--test-text);\n margin-bottom: 4px;\n}\n\n.run-meta,\n.suite-meta {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--test-text-secondary);\n flex-wrap: wrap;\n}\n\n.run-meta span,\n.suite-meta span {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.run-meta span i,\n.suite-meta span i {\n color: var(--test-text-muted);\n font-size: 11px;\n}\n\n.run-item > i.fa-chevron-right,\n.suite-item > i.fa-chevron-right {\n color: var(--test-text-muted);\n font-size: 14px;\n transition: var(--test-transition);\n}\n\n.run-item:hover > i.fa-chevron-right,\n.suite-item:hover > i.fa-chevron-right {\n color: var(--test-primary);\n transform: translateX(2px);\n}\n\n/* Run Evaluation Stack */\n.run-eval-stack {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n flex-wrap: wrap;\n}\n\n/* Evaluation Pills */\n.eval-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n transition: var(--test-transition);\n}\n\n.eval-pill i {\n font-size: 10px;\n}\n\n/* Status pill colors */\n.eval-pill.status-pill.status-passed {\n background: #dcfce7;\n color: #16a34a;\n}\n\n.eval-pill.status-pill.status-failed {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.eval-pill.status-pill.status-error {\n background: #fef3c7;\n color: #d97706;\n}\n\n.eval-pill.status-pill.status-timeout {\n background: #fef3c7;\n color: #d97706;\n}\n\n.eval-pill.status-pill.status-skipped,\n.eval-pill.status-pill.status-pending {\n background: #f1f5f9;\n color: #64748b;\n}\n\n.eval-pill.status-pill.status-running {\n background: #dbeafe;\n color: #2563eb;\n}\n\n/* Human feedback pills */\n.eval-pill.human-pill.no-feedback {\n background: #f1f5f9;\n color: #94a3b8;\n padding: 4px 8px;\n}\n\n.eval-pill.human-pill.has-feedback.rating-low {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.eval-pill.human-pill.has-feedback.rating-medium {\n background: #fef3c7;\n color: #d97706;\n}\n\n.eval-pill.human-pill.has-feedback.rating-good {\n background: #d1fae5;\n color: #059669;\n}\n\n.eval-pill.human-pill.has-feedback.rating-excellent {\n background: #dcfce7;\n color: #16a34a;\n}\n\n/* Auto score pills */\n.eval-pill.auto-pill.no-score {\n background: #f1f5f9;\n color: #94a3b8;\n padding: 4px 8px;\n}\n\n.eval-pill.auto-pill.has-score.score-low {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.eval-pill.auto-pill.has-score.score-medium {\n background: #fef3c7;\n color: #d97706;\n}\n\n.eval-pill.auto-pill.has-score.score-good {\n background: #d1fae5;\n color: #059669;\n}\n\n.eval-pill.auto-pill.has-score.score-excellent {\n background: #dcfce7;\n color: #16a34a;\n}\n\n/* Run Tags */\n.run-tags {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 8px;\n flex-wrap: wrap;\n}\n\n.run-tag {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background: rgba(37, 99, 235, 0.1);\n color: var(--test-primary);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n}\n\n.run-tag-more {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background: var(--test-border);\n color: var(--test-text-muted);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n}\n\n/* ===========================\n Empty States\n =========================== */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 24px;\n text-align: center;\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n}\n\n.empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--test-bg);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon i {\n font-size: 36px;\n color: var(--test-text-muted);\n}\n\n.empty-state h4 {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--test-text);\n}\n\n.empty-state p {\n margin: 0 0 20px 0;\n font-size: 14px;\n color: var(--test-text-secondary);\n max-width: 300px;\n}\n\n/* Legacy no-data for backwards compatibility */\n.no-data {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: var(--test-text-muted);\n text-align: center;\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n}\n\n.no-data i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.no-data p {\n margin: 0;\n font-size: 14px;\n}\n\n/* ===========================\n Keyboard Shortcuts Popup\n =========================== */\n/* Keyboard shortcuts toggle button */\n.shortcuts-toggle {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: var(--test-surface);\n border: 1px solid var(--test-border);\n box-shadow: var(--test-shadow-md);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--test-text-secondary);\n font-size: 14px;\n z-index: 99;\n transition: var(--test-transition);\n opacity: 0.7;\n}\n\n.shortcuts-toggle:hover {\n opacity: 1;\n transform: scale(1.1);\n color: var(--test-primary);\n border-color: var(--test-primary);\n}\n\n.keyboard-shortcuts {\n position: fixed;\n bottom: 20px;\n right: 20px;\n background: var(--test-surface);\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-md);\n padding: 12px 16px;\n box-shadow: var(--test-shadow-lg);\n font-size: 12px;\n color: var(--test-text-secondary);\n z-index: 100;\n max-width: 260px;\n}\n\n.shortcuts-header {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 10px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--test-border);\n font-weight: 600;\n color: var(--test-text);\n}\n\n.shortcuts-close {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--test-text-muted);\n font-size: 12px;\n padding: 2px 4px;\n border-radius: 4px;\n transition: var(--test-transition);\n}\n\n.shortcuts-close:hover {\n color: var(--test-text);\n background: var(--test-border);\n}\n\n.shortcut-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.shortcut-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.shortcut-keys {\n display: flex;\n gap: 4px;\n}\n\n.shortcut-keys kbd {\n background: var(--test-bg);\n border: 1px solid var(--test-border);\n border-radius: 4px;\n padding: 2px 6px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-size: 11px;\n color: var(--test-text);\n}\n\n/* ===========================\n Responsive Design - Tablet\n =========================== */\n@media (max-width: 1024px) {\n .metrics-bar {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .info-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .config-grid {\n grid-template-columns: 1fr;\n }\n\n .keyboard-shortcuts, .shortcuts-toggle {\n display: none;\n }\n}\n\n/* ===========================\n Responsive Design - Mobile\n =========================== */\n@media (max-width: 768px) {\n .test-form {\n height: auto;\n min-height: 100%;\n }\n\n .test-header {\n padding: 16px;\n }\n\n .header-content {\n flex-direction: column;\n gap: 16px;\n }\n\n .header-left {\n width: 100%;\n }\n\n .test-icon {\n width: 48px;\n height: 48px;\n font-size: 20px;\n }\n\n .test-info h1 {\n font-size: 18px;\n }\n\n .test-meta {\n gap: 8px;\n }\n\n .status-badge {\n padding: 4px 10px;\n font-size: 11px;\n }\n\n .header-actions {\n width: 100%;\n justify-content: stretch;\n }\n\n .header-actions button {\n flex: 1;\n }\n\n .metrics-bar {\n grid-template-columns: repeat(2, 1fr);\n gap: 10px;\n }\n\n .metric-card {\n padding: 12px;\n }\n\n .metric-value {\n font-size: 16px;\n }\n\n .tabs {\n padding: 0 12px;\n }\n\n .tab {\n padding: 12px 14px;\n font-size: 13px;\n gap: 6px;\n }\n\n .tab i {\n font-size: 14px;\n }\n\n .tab-shortcut {\n display: none;\n }\n\n .tab-content {\n padding: 16px;\n }\n\n .info-section,\n .json-section,\n .config-section {\n padding: 18px;\n }\n\n .info-grid {\n grid-template-columns: 1fr;\n }\n\n .json-tabs {\n flex-direction: column;\n }\n\n .json-tab {\n min-width: 0;\n justify-content: flex-start;\n }\n\n .run-item,\n .suite-item {\n padding: 14px;\n }\n\n .run-icon,\n .suite-icon {\n width: 40px;\n height: 40px;\n font-size: 16px;\n }\n\n .run-meta,\n .suite-meta {\n flex-direction: column;\n gap: 4px;\n }\n\n .empty-state {\n padding: 40px 20px;\n }\n\n .empty-icon {\n width: 64px;\n height: 64px;\n }\n\n .empty-icon i {\n font-size: 28px;\n }\n}\n\n/* ===========================\n Responsive Design - Small Mobile\n =========================== */\n@media (max-width: 480px) {\n .test-header {\n padding: 12px;\n }\n\n .header-left {\n gap: 12px;\n }\n\n .test-icon {\n width: 40px;\n height: 40px;\n font-size: 18px;\n border-radius: 8px;\n }\n\n .test-info h1 {\n font-size: 16px;\n }\n\n .metrics-bar {\n grid-template-columns: 1fr 1fr;\n }\n\n .tabs {\n padding: 0 8px;\n }\n\n .tab {\n padding: 10px 12px;\n font-size: 12px;\n }\n\n .tab-badge {\n display: none;\n }\n\n .tab-content {\n padding: 12px;\n }\n\n .run-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n }\n}\n\n/* ===========================\n Touch Device Optimizations\n =========================== */\n@media (hover: none) and (pointer: coarse) {\n .tab,\n .json-tab,\n .run-item,\n .suite-item {\n -webkit-tap-highlight-color: transparent;\n }\n\n .run-item:active,\n .suite-item:active {\n background: rgba(37, 99, 235, 0.1);\n transform: scale(0.98);\n }\n\n .tab:active,\n .json-tab:active {\n background: rgba(37, 99, 235, 0.1);\n }\n\n /* Larger touch targets */\n .tab {\n min-height: 48px;\n }\n\n .run-item,\n .suite-item {\n min-height: 64px;\n }\n}\n\n/* ===========================\n Reduced Motion\n =========================== */\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n\n .skeleton-icon,\n .skeleton-line {\n animation: none;\n background: #e2e8f0;\n }\n}\n\n/* ===========================\n History Tab\n =========================== */\n.history-tab {\n animation: fadeIn 0.3s ease-out;\n}\n\n.history-content {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n/* History Filters */\n.history-filters {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n padding: 16px;\n background: var(--test-surface);\n border-radius: var(--test-radius-md);\n box-shadow: var(--test-shadow-sm);\n}\n\n.time-range-filters {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.filter-label {\n font-size: 13px;\n font-weight: 600;\n color: var(--test-text-secondary);\n margin-right: 4px;\n}\n\n.filter-btn {\n padding: 8px 16px;\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-sm);\n background: var(--test-surface);\n color: var(--test-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: var(--test-transition);\n}\n\n.filter-btn:hover {\n border-color: var(--test-primary-light);\n color: var(--test-primary);\n background: rgba(37, 99, 235, 0.05);\n}\n\n.filter-btn.active {\n background: var(--test-primary);\n color: white;\n border-color: var(--test-primary);\n}\n\n.history-actions {\n display: flex;\n gap: 8px;\n}\n\n/* KPI Cards */\n.history-kpi-cards {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 16px;\n}\n\n.kpi-card {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 18px;\n background: var(--test-surface);\n border-radius: var(--test-radius-md);\n box-shadow: var(--test-shadow-sm);\n transition: var(--test-transition);\n}\n\n.kpi-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--test-shadow-md);\n}\n\n.kpi-icon {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, var(--test-primary) 0%, var(--test-primary-dark) 100%);\n border-radius: var(--test-radius-md);\n color: white;\n font-size: 20px;\n flex-shrink: 0;\n}\n\n.kpi-icon.pass-rate {\n background: linear-gradient(135deg, var(--test-success) 0%, #059669 100%);\n}\n\n.kpi-content {\n flex: 1;\n min-width: 0;\n}\n\n.kpi-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--test-text);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.kpi-label {\n font-size: 12px;\n color: var(--test-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-top: 2px;\n}\n\n.trend-icon {\n font-size: 14px;\n}\n\n.trend-icon.trend-up {\n color: var(--test-success);\n}\n\n.trend-icon.trend-down {\n color: var(--test-error);\n}\n\n/* History Section */\n.history-section {\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n padding: 24px;\n box-shadow: var(--test-shadow-sm);\n}\n\n.history-section h3 {\n margin: 0 0 20px 0;\n font-size: 18px;\n font-weight: 700;\n color: var(--test-text);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.history-section h3 i {\n color: var(--test-primary);\n}\n\n/* History Table */\n.history-table-container {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.history-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 14px;\n}\n\n.history-table th,\n.history-table td {\n padding: 12px 16px;\n text-align: left;\n border-bottom: 1px solid var(--test-border);\n}\n\n.history-table th {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--test-text-muted);\n background: var(--test-bg);\n}\n\n.history-table tbody tr:hover {\n background: rgba(37, 99, 235, 0.03);\n}\n\n.date-cell {\n font-weight: 600;\n color: var(--test-text);\n}\n\n.passed-cell {\n color: var(--test-success);\n font-weight: 600;\n}\n\n.failed-cell {\n color: var(--test-error);\n font-weight: 600;\n}\n\n.pass-rate-cell {\n min-width: 120px;\n}\n\n.pass-rate-bar {\n position: relative;\n height: 24px;\n background: var(--test-bg);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.pass-rate-fill {\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n background: linear-gradient(90deg, var(--test-success) 0%, #34d399 100%);\n border-radius: 12px;\n transition: width 0.5s ease-out;\n}\n\n.pass-rate-text {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n font-size: 11px;\n font-weight: 700;\n color: var(--test-text);\n z-index: 1;\n}\n\n/* Suite Performance List */\n.suite-performance-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.suite-perf-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 18px;\n background: var(--test-bg);\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-md);\n cursor: pointer;\n transition: var(--test-transition);\n}\n\n.suite-perf-card:hover {\n background: rgba(37, 99, 235, 0.05);\n border-color: var(--test-primary-light);\n transform: translateX(4px);\n}\n\n.suite-perf-header {\n flex: 1;\n min-width: 0;\n}\n\n.suite-perf-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--test-text);\n margin-bottom: 6px;\n}\n\n.suite-perf-tags {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.tag-mini {\n display: inline-flex;\n padding: 2px 8px;\n background: rgba(37, 99, 235, 0.1);\n color: var(--test-primary);\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n}\n\n.tag-more {\n display: inline-flex;\n padding: 2px 8px;\n background: var(--test-border);\n color: var(--test-text-muted);\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n}\n\n.suite-perf-stats {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.suite-stat {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n}\n\n.suite-stat .stat-value {\n font-size: 16px;\n font-weight: 700;\n color: var(--test-text);\n}\n\n.suite-stat .stat-value.pass-rate.high {\n color: var(--test-success);\n}\n\n.suite-stat .stat-value.pass-rate.low {\n color: var(--test-error);\n}\n\n.suite-stat .stat-label {\n font-size: 10px;\n color: var(--test-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.suite-perf-arrow {\n color: var(--test-text-muted);\n font-size: 14px;\n transition: var(--test-transition);\n}\n\n.suite-perf-card:hover .suite-perf-arrow {\n color: var(--test-primary);\n transform: translateX(2px);\n}\n\n/* ===========================\n Print Styles\n =========================== */\n@media print {\n .test-form {\n background: white;\n height: auto;\n }\n\n .header-actions,\n .tabs-container,\n .keyboard-shortcuts {\n display: none !important;\n }\n\n .tab-content {\n overflow: visible;\n padding: 0;\n }\n\n .info-section,\n .json-section,\n .config-section,\n .empty-state {\n break-inside: avoid;\n box-shadow: none;\n border: 1px solid #ddd;\n }\n}\n"] }]
|
|
2007
2007
|
}], null, { handleKeyboardShortcut: [{
|
|
2008
2008
|
type: HostListener,
|
|
2009
2009
|
args: ['document:keydown', ['$event']]
|
|
2010
2010
|
}] }); })();
|
|
2011
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(
|
|
2011
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJTestFormComponentExtended, { className: "MJTestFormComponentExtended", filePath: "src/lib/custom/Tests/test-form.component.ts", lineNumber: 62 }); })();
|
|
2012
2012
|
//# sourceMappingURL=test-form.component.js.map
|