@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
|
@@ -25,10 +25,10 @@ import * as i6 from "./entity-link-pill.component";
|
|
|
25
25
|
const _c0 = () => [1, 2, 3];
|
|
26
26
|
const _c1 = () => [1, 2];
|
|
27
27
|
const _c2 = () => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
|
28
|
-
function
|
|
28
|
+
function MJTestRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
29
29
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
30
30
|
i0.ɵɵelementStart(0, "div", 64);
|
|
31
|
-
i0.ɵɵlistener("click", function
|
|
31
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.retryLoad()); });
|
|
32
32
|
i0.ɵɵelement(1, "i", 65);
|
|
33
33
|
i0.ɵɵelementStart(2, "span");
|
|
34
34
|
i0.ɵɵtext(3);
|
|
@@ -42,12 +42,12 @@ function TestRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (rf &
|
|
|
42
42
|
i0.ɵɵadvance(3);
|
|
43
43
|
i0.ɵɵtextInterpolate(ctx_r1.error);
|
|
44
44
|
} }
|
|
45
|
-
function
|
|
45
|
+
function MJTestRunFormComponentExtended_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
46
46
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
47
47
|
i0.ɵɵelementStart(0, "li");
|
|
48
48
|
i0.ɵɵelement(1, "i", 8);
|
|
49
49
|
i0.ɵɵelementStart(2, "a", 4);
|
|
50
|
-
i0.ɵɵlistener("click", function
|
|
50
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_10_Template_a_click_2_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openTest()); });
|
|
51
51
|
i0.ɵɵelement(3, "i", 67);
|
|
52
52
|
i0.ɵɵelementStart(4, "span", 6);
|
|
53
53
|
i0.ɵɵtext(5);
|
|
@@ -57,7 +57,7 @@ function TestRunFormComponentExtended_Conditional_10_Template(rf, ctx) { if (rf
|
|
|
57
57
|
i0.ɵɵadvance(5);
|
|
58
58
|
i0.ɵɵtextInterpolate(ctx_r1.test.Name);
|
|
59
59
|
} }
|
|
60
|
-
function
|
|
60
|
+
function MJTestRunFormComponentExtended_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
61
61
|
i0.ɵɵelementStart(0, "span", 17);
|
|
62
62
|
i0.ɵɵelement(1, "i", 67);
|
|
63
63
|
i0.ɵɵtext(2);
|
|
@@ -67,13 +67,13 @@ function TestRunFormComponentExtended_Conditional_27_Template(rf, ctx) { if (rf
|
|
|
67
67
|
i0.ɵɵadvance(2);
|
|
68
68
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.test.Type, " ");
|
|
69
69
|
} }
|
|
70
|
-
function
|
|
70
|
+
function MJTestRunFormComponentExtended_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
71
71
|
i0.ɵɵelementStart(0, "span", 17);
|
|
72
72
|
i0.ɵɵelement(1, "i", 68);
|
|
73
73
|
i0.ɵɵtext(2, " Auto-refreshing ");
|
|
74
74
|
i0.ɵɵelementEnd();
|
|
75
75
|
} }
|
|
76
|
-
function
|
|
76
|
+
function MJTestRunFormComponentExtended_Conditional_66_Template(rf, ctx) { if (rf & 1) {
|
|
77
77
|
i0.ɵɵelementStart(0, "div", 34);
|
|
78
78
|
i0.ɵɵelement(1, "div", 69);
|
|
79
79
|
i0.ɵɵelementEnd();
|
|
@@ -82,7 +82,7 @@ function TestRunFormComponentExtended_Conditional_66_Template(rf, ctx) { if (rf
|
|
|
82
82
|
i0.ɵɵadvance();
|
|
83
83
|
i0.ɵɵstyleProp("width", ctx_r1.getScorePercentage(), "%")("background-color", ctx_r1.getStatusColor());
|
|
84
84
|
} }
|
|
85
|
-
function
|
|
85
|
+
function MJTestRunFormComponentExtended_Conditional_75_Template(rf, ctx) { if (rf & 1) {
|
|
86
86
|
i0.ɵɵelementStart(0, "div", 34);
|
|
87
87
|
i0.ɵɵelement(1, "div", 69);
|
|
88
88
|
i0.ɵɵelementEnd();
|
|
@@ -91,7 +91,7 @@ function TestRunFormComponentExtended_Conditional_75_Template(rf, ctx) { if (rf
|
|
|
91
91
|
i0.ɵɵadvance();
|
|
92
92
|
i0.ɵɵstyleProp("width", ctx_r1.getPassRatePercentage(), "%")("background-color", ctx_r1.getStatusColor());
|
|
93
93
|
} }
|
|
94
|
-
function
|
|
94
|
+
function MJTestRunFormComponentExtended_Conditional_84_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
95
95
|
i0.ɵɵelementStart(0, "span", 70);
|
|
96
96
|
i0.ɵɵelement(1, "i", 73);
|
|
97
97
|
i0.ɵɵtext(2);
|
|
@@ -101,10 +101,10 @@ function TestRunFormComponentExtended_Conditional_84_Conditional_1_Template(rf,
|
|
|
101
101
|
i0.ɵɵadvance(2);
|
|
102
102
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.RunByUser, " ");
|
|
103
103
|
} }
|
|
104
|
-
function
|
|
104
|
+
function MJTestRunFormComponentExtended_Conditional_84_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
105
105
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
106
106
|
i0.ɵɵelementStart(0, "span", 74);
|
|
107
|
-
i0.ɵɵlistener("click", function
|
|
107
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_84_Conditional_2_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openTestSuiteRun()); });
|
|
108
108
|
i0.ɵɵelement(1, "i", 75);
|
|
109
109
|
i0.ɵɵtext(2);
|
|
110
110
|
i0.ɵɵelementEnd();
|
|
@@ -113,17 +113,17 @@ function TestRunFormComponentExtended_Conditional_84_Conditional_2_Template(rf,
|
|
|
113
113
|
i0.ɵɵadvance(2);
|
|
114
114
|
i0.ɵɵtextInterpolate1(" Part of Suite Run (Seq: ", ctx_r1.record.Sequence, ") ");
|
|
115
115
|
} }
|
|
116
|
-
function
|
|
116
|
+
function MJTestRunFormComponentExtended_Conditional_84_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
117
117
|
i0.ɵɵelement(0, "mj-entity-link-pill", 72);
|
|
118
118
|
} if (rf & 2) {
|
|
119
119
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
120
120
|
i0.ɵɵproperty("entityName", ctx_r1.record.TargetLogEntity)("recordId", ctx_r1.record.TargetLogID);
|
|
121
121
|
} }
|
|
122
|
-
function
|
|
122
|
+
function MJTestRunFormComponentExtended_Conditional_84_Template(rf, ctx) { if (rf & 1) {
|
|
123
123
|
i0.ɵɵelementStart(0, "div", 37);
|
|
124
|
-
i0.ɵɵconditionalCreate(1,
|
|
125
|
-
i0.ɵɵconditionalCreate(2,
|
|
126
|
-
i0.ɵɵconditionalCreate(3,
|
|
124
|
+
i0.ɵɵconditionalCreate(1, MJTestRunFormComponentExtended_Conditional_84_Conditional_1_Template, 3, 1, "span", 70);
|
|
125
|
+
i0.ɵɵconditionalCreate(2, MJTestRunFormComponentExtended_Conditional_84_Conditional_2_Template, 3, 1, "span", 71);
|
|
126
|
+
i0.ɵɵconditionalCreate(3, MJTestRunFormComponentExtended_Conditional_84_Conditional_3_Template, 1, 2, "mj-entity-link-pill", 72);
|
|
127
127
|
i0.ɵɵelementEnd();
|
|
128
128
|
} if (rf & 2) {
|
|
129
129
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -134,7 +134,7 @@ function TestRunFormComponentExtended_Conditional_84_Template(rf, ctx) { if (rf
|
|
|
134
134
|
i0.ɵɵadvance();
|
|
135
135
|
i0.ɵɵconditional(ctx_r1.record.TargetLogEntityID && ctx_r1.record.TargetLogID ? 3 : -1);
|
|
136
136
|
} }
|
|
137
|
-
function
|
|
137
|
+
function MJTestRunFormComponentExtended_Conditional_85_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
138
138
|
i0.ɵɵelementStart(0, "span", 83);
|
|
139
139
|
i0.ɵɵtext(1);
|
|
140
140
|
i0.ɵɵelementEnd();
|
|
@@ -143,29 +143,29 @@ function TestRunFormComponentExtended_Conditional_85_Conditional_4_For_2_Templat
|
|
|
143
143
|
i0.ɵɵadvance();
|
|
144
144
|
i0.ɵɵtextInterpolate(tag_r6);
|
|
145
145
|
} }
|
|
146
|
-
function
|
|
146
|
+
function MJTestRunFormComponentExtended_Conditional_85_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
147
147
|
i0.ɵɵelementStart(0, "div", 79);
|
|
148
|
-
i0.ɵɵrepeaterCreate(1,
|
|
148
|
+
i0.ɵɵrepeaterCreate(1, MJTestRunFormComponentExtended_Conditional_85_Conditional_4_For_2_Template, 2, 1, "span", 83, i0.ɵɵrepeaterTrackByIdentity);
|
|
149
149
|
i0.ɵɵelementEnd();
|
|
150
150
|
} if (rf & 2) {
|
|
151
151
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
152
152
|
i0.ɵɵadvance();
|
|
153
153
|
i0.ɵɵrepeater(ctx_r1.tags);
|
|
154
154
|
} }
|
|
155
|
-
function
|
|
155
|
+
function MJTestRunFormComponentExtended_Conditional_85_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
156
156
|
i0.ɵɵelementStart(0, "span", 80);
|
|
157
157
|
i0.ɵɵtext(1, "No tags");
|
|
158
158
|
i0.ɵɵelementEnd();
|
|
159
159
|
} }
|
|
160
|
-
function
|
|
160
|
+
function MJTestRunFormComponentExtended_Conditional_85_Template(rf, ctx) { if (rf & 1) {
|
|
161
161
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
162
162
|
i0.ɵɵelementStart(0, "div", 38)(1, "div", 76)(2, "span", 77);
|
|
163
163
|
i0.ɵɵelement(3, "i", 78);
|
|
164
164
|
i0.ɵɵelementEnd();
|
|
165
|
-
i0.ɵɵconditionalCreate(4,
|
|
166
|
-
i0.ɵɵconditionalCreate(5,
|
|
165
|
+
i0.ɵɵconditionalCreate(4, MJTestRunFormComponentExtended_Conditional_85_Conditional_4_Template, 3, 0, "div", 79);
|
|
166
|
+
i0.ɵɵconditionalCreate(5, MJTestRunFormComponentExtended_Conditional_85_Conditional_5_Template, 2, 0, "span", 80);
|
|
167
167
|
i0.ɵɵelementStart(6, "button", 81);
|
|
168
|
-
i0.ɵɵlistener("click", function
|
|
168
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_85_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.startEditingTags()); });
|
|
169
169
|
i0.ɵɵelement(7, "i", 82);
|
|
170
170
|
i0.ɵɵtext(8, " Add ");
|
|
171
171
|
i0.ɵɵelementEnd()()();
|
|
@@ -176,12 +176,12 @@ function TestRunFormComponentExtended_Conditional_85_Template(rf, ctx) { if (rf
|
|
|
176
176
|
i0.ɵɵadvance();
|
|
177
177
|
i0.ɵɵconditional(ctx_r1.tags.length === 0 ? 5 : -1);
|
|
178
178
|
} }
|
|
179
|
-
function
|
|
179
|
+
function MJTestRunFormComponentExtended_Conditional_86_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
180
180
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
181
181
|
i0.ɵɵelementStart(0, "span", 88);
|
|
182
182
|
i0.ɵɵtext(1);
|
|
183
183
|
i0.ɵɵelementStart(2, "button", 97);
|
|
184
|
-
i0.ɵɵlistener("click", function
|
|
184
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_86_For_8_Template_button_click_2_listener() { const tag_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.removeTag(tag_r9)); });
|
|
185
185
|
i0.ɵɵelement(3, "i", 98);
|
|
186
186
|
i0.ɵɵelementEnd()();
|
|
187
187
|
} if (rf & 2) {
|
|
@@ -189,39 +189,39 @@ function TestRunFormComponentExtended_Conditional_86_For_8_Template(rf, ctx) { i
|
|
|
189
189
|
i0.ɵɵadvance();
|
|
190
190
|
i0.ɵɵtextInterpolate1(" ", tag_r9, " ");
|
|
191
191
|
} }
|
|
192
|
-
function
|
|
192
|
+
function MJTestRunFormComponentExtended_Conditional_86_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
193
193
|
i0.ɵɵelementStart(0, "span", 89);
|
|
194
194
|
i0.ɵɵtext(1, "No tags yet");
|
|
195
195
|
i0.ɵɵelementEnd();
|
|
196
196
|
} }
|
|
197
|
-
function
|
|
197
|
+
function MJTestRunFormComponentExtended_Conditional_86_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
198
198
|
i0.ɵɵelement(0, "i", 95);
|
|
199
199
|
} }
|
|
200
|
-
function
|
|
200
|
+
function MJTestRunFormComponentExtended_Conditional_86_Template(rf, ctx) { if (rf & 1) {
|
|
201
201
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
202
202
|
i0.ɵɵelementStart(0, "div", 39)(1, "div", 84)(2, "span", 85);
|
|
203
203
|
i0.ɵɵelement(3, "i", 78);
|
|
204
204
|
i0.ɵɵtext(4, " Edit Tags");
|
|
205
205
|
i0.ɵɵelementEnd()();
|
|
206
206
|
i0.ɵɵelementStart(5, "div", 86)(6, "div", 87);
|
|
207
|
-
i0.ɵɵrepeaterCreate(7,
|
|
208
|
-
i0.ɵɵconditionalCreate(9,
|
|
207
|
+
i0.ɵɵrepeaterCreate(7, MJTestRunFormComponentExtended_Conditional_86_For_8_Template, 4, 1, "span", 88, i0.ɵɵrepeaterTrackByIdentity);
|
|
208
|
+
i0.ɵɵconditionalCreate(9, MJTestRunFormComponentExtended_Conditional_86_Conditional_9_Template, 2, 0, "span", 89);
|
|
209
209
|
i0.ɵɵelementEnd();
|
|
210
210
|
i0.ɵɵelementStart(10, "div", 90)(11, "input", 91);
|
|
211
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
212
|
-
i0.ɵɵlistener("keyup.enter", function
|
|
211
|
+
i0.ɵɵtwoWayListener("ngModelChange", function MJTestRunFormComponentExtended_Conditional_86_Template_input_ngModelChange_11_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.newTag, $event) || (ctx_r1.newTag = $event); return i0.ɵɵresetView($event); });
|
|
212
|
+
i0.ɵɵlistener("keyup.enter", function MJTestRunFormComponentExtended_Conditional_86_Template_input_keyup_enter_11_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.addTag()); });
|
|
213
213
|
i0.ɵɵelementEnd();
|
|
214
214
|
i0.ɵɵelementStart(12, "button", 92);
|
|
215
|
-
i0.ɵɵlistener("click", function
|
|
215
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_86_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.addTag()); });
|
|
216
216
|
i0.ɵɵelement(13, "i", 82);
|
|
217
217
|
i0.ɵɵelementEnd()()();
|
|
218
218
|
i0.ɵɵelementStart(14, "div", 93)(15, "button", 94);
|
|
219
|
-
i0.ɵɵlistener("click", function
|
|
220
|
-
i0.ɵɵconditionalCreate(16,
|
|
219
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_86_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.saveTags()); });
|
|
220
|
+
i0.ɵɵconditionalCreate(16, MJTestRunFormComponentExtended_Conditional_86_Conditional_16_Template, 1, 0, "i", 95);
|
|
221
221
|
i0.ɵɵtext(17);
|
|
222
222
|
i0.ɵɵelementEnd();
|
|
223
223
|
i0.ɵɵelementStart(18, "button", 96);
|
|
224
|
-
i0.ɵɵlistener("click", function
|
|
224
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_86_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelEditingTags()); });
|
|
225
225
|
i0.ɵɵtext(19, "Cancel");
|
|
226
226
|
i0.ɵɵelementEnd()()();
|
|
227
227
|
} if (rf & 2) {
|
|
@@ -241,7 +241,7 @@ function TestRunFormComponentExtended_Conditional_86_Template(rf, ctx) { if (rf
|
|
|
241
241
|
i0.ɵɵadvance();
|
|
242
242
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.savingTags ? "Saving..." : "Save", " ");
|
|
243
243
|
} }
|
|
244
|
-
function
|
|
244
|
+
function MJTestRunFormComponentExtended_Conditional_101_Template(rf, ctx) { if (rf & 1) {
|
|
245
245
|
i0.ɵɵelementStart(0, "span", 48);
|
|
246
246
|
i0.ɵɵtext(1);
|
|
247
247
|
i0.ɵɵelementEnd();
|
|
@@ -250,7 +250,7 @@ function TestRunFormComponentExtended_Conditional_101_Template(rf, ctx) { if (rf
|
|
|
250
250
|
i0.ɵɵadvance();
|
|
251
251
|
i0.ɵɵtextInterpolate(ctx_r1.aiAgentRuns.length + ctx_r1.aiPromptRuns.length);
|
|
252
252
|
} }
|
|
253
|
-
function
|
|
253
|
+
function MJTestRunFormComponentExtended_Conditional_106_Template(rf, ctx) { if (rf & 1) {
|
|
254
254
|
i0.ɵɵelementStart(0, "span", 48);
|
|
255
255
|
i0.ɵɵtext(1);
|
|
256
256
|
i0.ɵɵelementEnd();
|
|
@@ -259,10 +259,10 @@ function TestRunFormComponentExtended_Conditional_106_Template(rf, ctx) { if (rf
|
|
|
259
259
|
i0.ɵɵadvance();
|
|
260
260
|
i0.ɵɵtextInterpolate(ctx_r1.feedbacks.length);
|
|
261
261
|
} }
|
|
262
|
-
function
|
|
262
|
+
function MJTestRunFormComponentExtended_Conditional_111_Template(rf, ctx) { if (rf & 1) {
|
|
263
263
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
264
264
|
i0.ɵɵelementStart(0, "button", 99);
|
|
265
|
-
i0.ɵɵlistener("click", function
|
|
265
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_111_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.changeTab("log")); });
|
|
266
266
|
i0.ɵɵelement(1, "i", 100);
|
|
267
267
|
i0.ɵɵelementStart(2, "span");
|
|
268
268
|
i0.ɵɵtext(3, "Log");
|
|
@@ -272,10 +272,10 @@ function TestRunFormComponentExtended_Conditional_111_Template(rf, ctx) { if (rf
|
|
|
272
272
|
i0.ɵɵclassProp("active", ctx_r1.activeTab === "log");
|
|
273
273
|
i0.ɵɵattribute("aria-selected", ctx_r1.activeTab === "log");
|
|
274
274
|
} }
|
|
275
|
-
function
|
|
275
|
+
function MJTestRunFormComponentExtended_Conditional_113_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
276
276
|
i0.ɵɵelement(0, "div", 104);
|
|
277
277
|
} }
|
|
278
|
-
function
|
|
278
|
+
function MJTestRunFormComponentExtended_Conditional_113_Conditional_16_For_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
279
279
|
i0.ɵɵelementStart(0, "div", 130);
|
|
280
280
|
i0.ɵɵtext(1);
|
|
281
281
|
i0.ɵɵelementEnd();
|
|
@@ -284,7 +284,7 @@ function TestRunFormComponentExtended_Conditional_113_Conditional_16_For_9_Condi
|
|
|
284
284
|
i0.ɵɵadvance();
|
|
285
285
|
i0.ɵɵtextInterpolate(check_r12.message);
|
|
286
286
|
} }
|
|
287
|
-
function
|
|
287
|
+
function MJTestRunFormComponentExtended_Conditional_113_Conditional_16_For_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
288
288
|
i0.ɵɵelementStart(0, "div", 131)(1, "span", 132);
|
|
289
289
|
i0.ɵɵtext(2, "Weight:");
|
|
290
290
|
i0.ɵɵelementEnd();
|
|
@@ -295,16 +295,16 @@ function TestRunFormComponentExtended_Conditional_113_Conditional_16_For_9_Condi
|
|
|
295
295
|
i0.ɵɵadvance(3);
|
|
296
296
|
i0.ɵɵtextInterpolate1(" ", check_r12.weight, " ");
|
|
297
297
|
} }
|
|
298
|
-
function
|
|
298
|
+
function MJTestRunFormComponentExtended_Conditional_113_Conditional_16_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
299
299
|
i0.ɵɵelementStart(0, "div", 125)(1, "div", 126);
|
|
300
300
|
i0.ɵɵelement(2, "i", 127);
|
|
301
301
|
i0.ɵɵelementEnd();
|
|
302
302
|
i0.ɵɵelementStart(3, "div", 128)(4, "div", 129);
|
|
303
303
|
i0.ɵɵtext(5);
|
|
304
304
|
i0.ɵɵelementEnd();
|
|
305
|
-
i0.ɵɵconditionalCreate(6,
|
|
305
|
+
i0.ɵɵconditionalCreate(6, MJTestRunFormComponentExtended_Conditional_113_Conditional_16_For_9_Conditional_6_Template, 2, 1, "div", 130);
|
|
306
306
|
i0.ɵɵelementEnd();
|
|
307
|
-
i0.ɵɵconditionalCreate(7,
|
|
307
|
+
i0.ɵɵconditionalCreate(7, MJTestRunFormComponentExtended_Conditional_113_Conditional_16_For_9_Conditional_7_Template, 4, 1, "div", 131);
|
|
308
308
|
i0.ɵɵelementEnd();
|
|
309
309
|
} if (rf & 2) {
|
|
310
310
|
const check_r12 = ctx.$implicit;
|
|
@@ -320,7 +320,7 @@ function TestRunFormComponentExtended_Conditional_113_Conditional_16_For_9_Templ
|
|
|
320
320
|
i0.ɵɵadvance();
|
|
321
321
|
i0.ɵɵconditional(check_r12.weight ? 7 : -1);
|
|
322
322
|
} }
|
|
323
|
-
function
|
|
323
|
+
function MJTestRunFormComponentExtended_Conditional_113_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
324
324
|
i0.ɵɵelementStart(0, "div", 110)(1, "div", 112)(2, "h3");
|
|
325
325
|
i0.ɵɵelement(3, "i", 121);
|
|
326
326
|
i0.ɵɵtext(4, " Check Results");
|
|
@@ -329,7 +329,7 @@ function TestRunFormComponentExtended_Conditional_113_Conditional_16_Template(rf
|
|
|
329
329
|
i0.ɵɵtext(6);
|
|
330
330
|
i0.ɵɵelementEnd()();
|
|
331
331
|
i0.ɵɵelementStart(7, "div", 123);
|
|
332
|
-
i0.ɵɵrepeaterCreate(8,
|
|
332
|
+
i0.ɵɵrepeaterCreate(8, MJTestRunFormComponentExtended_Conditional_113_Conditional_16_For_9_Template, 8, 13, "div", 124, i0.ɵɵrepeaterTrackByIdentity);
|
|
333
333
|
i0.ɵɵelementEnd()();
|
|
334
334
|
} if (rf & 2) {
|
|
335
335
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -338,12 +338,12 @@ function TestRunFormComponentExtended_Conditional_113_Conditional_16_Template(rf
|
|
|
338
338
|
i0.ɵɵadvance(2);
|
|
339
339
|
i0.ɵɵrepeater(ctx_r1.getCheckResults());
|
|
340
340
|
} }
|
|
341
|
-
function
|
|
341
|
+
function MJTestRunFormComponentExtended_Conditional_113_Template(rf, ctx) { if (rf & 1) {
|
|
342
342
|
const _r11 = i0.ɵɵgetCurrentView();
|
|
343
343
|
i0.ɵɵelementStart(0, "div", 55)(1, "div", 101)(2, "div", 102)(3, "div", 103);
|
|
344
344
|
i0.ɵɵelement(4, "i", 12);
|
|
345
345
|
i0.ɵɵelementEnd();
|
|
346
|
-
i0.ɵɵconditionalCreate(5,
|
|
346
|
+
i0.ɵɵconditionalCreate(5, MJTestRunFormComponentExtended_Conditional_113_Conditional_5_Template, 1, 0, "div", 104);
|
|
347
347
|
i0.ɵɵelementEnd();
|
|
348
348
|
i0.ɵɵelementStart(6, "div", 105)(7, "h2");
|
|
349
349
|
i0.ɵɵtext(8);
|
|
@@ -357,23 +357,23 @@ function TestRunFormComponentExtended_Conditional_113_Template(rf, ctx) { if (rf
|
|
|
357
357
|
i0.ɵɵelementStart(14, "span", 109);
|
|
358
358
|
i0.ɵɵtext(15);
|
|
359
359
|
i0.ɵɵelementEnd()()()();
|
|
360
|
-
i0.ɵɵconditionalCreate(16,
|
|
360
|
+
i0.ɵɵconditionalCreate(16, MJTestRunFormComponentExtended_Conditional_113_Conditional_16_Template, 10, 2, "div", 110);
|
|
361
361
|
i0.ɵɵelementStart(17, "div", 111)(18, "div", 112)(19, "h3");
|
|
362
362
|
i0.ɵɵelement(20, "i", 113);
|
|
363
363
|
i0.ɵɵtext(21, " Data Comparison");
|
|
364
364
|
i0.ɵɵelementEnd()();
|
|
365
365
|
i0.ɵɵelementStart(22, "div", 114)(23, "button", 115);
|
|
366
|
-
i0.ɵɵlistener("click", function
|
|
366
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_113_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setComparisonView("input")); });
|
|
367
367
|
i0.ɵɵelement(24, "i", 116);
|
|
368
368
|
i0.ɵɵtext(25, " Input ");
|
|
369
369
|
i0.ɵɵelementEnd();
|
|
370
370
|
i0.ɵɵelementStart(26, "button", 115);
|
|
371
|
-
i0.ɵɵlistener("click", function
|
|
371
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_113_Template_button_click_26_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setComparisonView("expected")); });
|
|
372
372
|
i0.ɵɵelement(27, "i", 117);
|
|
373
373
|
i0.ɵɵtext(28, " Expected ");
|
|
374
374
|
i0.ɵɵelementEnd();
|
|
375
375
|
i0.ɵɵelementStart(29, "button", 115);
|
|
376
|
-
i0.ɵɵlistener("click", function
|
|
376
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_113_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setComparisonView("actual")); });
|
|
377
377
|
i0.ɵɵelement(30, "i", 118);
|
|
378
378
|
i0.ɵɵtext(31, " Actual ");
|
|
379
379
|
i0.ɵɵelementEnd()();
|
|
@@ -406,10 +406,10 @@ function TestRunFormComponentExtended_Conditional_113_Template(rf, ctx) { if (rf
|
|
|
406
406
|
i0.ɵɵadvance(4);
|
|
407
407
|
i0.ɵɵproperty("value", ctx_r1.getComparisonData())("readonly", true)("toolbar", ctx_r1.jsonToolbar)("lineWrapping", true);
|
|
408
408
|
} }
|
|
409
|
-
function
|
|
409
|
+
function MJTestRunFormComponentExtended_Conditional_114_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
410
410
|
const _r14 = i0.ɵɵgetCurrentView();
|
|
411
411
|
i0.ɵɵelementStart(0, "div", 148);
|
|
412
|
-
i0.ɵɵlistener("click", function
|
|
412
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_114_Conditional_10_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openTest()); });
|
|
413
413
|
i0.ɵɵelementStart(1, "div", 135);
|
|
414
414
|
i0.ɵɵelement(2, "i", 67);
|
|
415
415
|
i0.ɵɵelementEnd();
|
|
@@ -426,7 +426,7 @@ function TestRunFormComponentExtended_Conditional_114_Conditional_10_Template(rf
|
|
|
426
426
|
i0.ɵɵadvance(7);
|
|
427
427
|
i0.ɵɵtextInterpolate(ctx_r1.test.Name);
|
|
428
428
|
} }
|
|
429
|
-
function
|
|
429
|
+
function MJTestRunFormComponentExtended_Conditional_114_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
430
430
|
i0.ɵɵelementStart(0, "div", 146)(1, "div", 151)(2, "h3");
|
|
431
431
|
i0.ɵɵelement(3, "i", 65);
|
|
432
432
|
i0.ɵɵtext(4, " Error Message");
|
|
@@ -439,7 +439,7 @@ function TestRunFormComponentExtended_Conditional_114_Conditional_45_Template(rf
|
|
|
439
439
|
i0.ɵɵadvance(6);
|
|
440
440
|
i0.ɵɵproperty("value", ctx_r1.record.ErrorMessage)("readonly", true)("toolbar", ctx_r1.jsonToolbar)("lineWrapping", true);
|
|
441
441
|
} }
|
|
442
|
-
function
|
|
442
|
+
function MJTestRunFormComponentExtended_Conditional_114_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
443
443
|
i0.ɵɵelementStart(0, "div", 147)(1, "div", 112)(2, "h3");
|
|
444
444
|
i0.ɵɵelement(3, "i", 154);
|
|
445
445
|
i0.ɵɵtext(4, " Result Details");
|
|
@@ -452,7 +452,7 @@ function TestRunFormComponentExtended_Conditional_114_Conditional_46_Template(rf
|
|
|
452
452
|
i0.ɵɵadvance(6);
|
|
453
453
|
i0.ɵɵproperty("value", ctx_r1.getFormattedResultDetails())("readonly", true)("toolbar", ctx_r1.jsonToolbar)("lineWrapping", true);
|
|
454
454
|
} }
|
|
455
|
-
function
|
|
455
|
+
function MJTestRunFormComponentExtended_Conditional_114_Template(rf, ctx) { if (rf & 1) {
|
|
456
456
|
i0.ɵɵelementStart(0, "div", 56)(1, "div", 133)(2, "div", 134)(3, "div", 135);
|
|
457
457
|
i0.ɵɵelement(4, "i", 136);
|
|
458
458
|
i0.ɵɵelementEnd();
|
|
@@ -462,7 +462,7 @@ function TestRunFormComponentExtended_Conditional_114_Template(rf, ctx) { if (rf
|
|
|
462
462
|
i0.ɵɵelementStart(8, "div", 139);
|
|
463
463
|
i0.ɵɵtext(9);
|
|
464
464
|
i0.ɵɵelementEnd()()();
|
|
465
|
-
i0.ɵɵconditionalCreate(10,
|
|
465
|
+
i0.ɵɵconditionalCreate(10, MJTestRunFormComponentExtended_Conditional_114_Conditional_10_Template, 9, 1, "div", 140);
|
|
466
466
|
i0.ɵɵelementStart(11, "div", 134)(12, "div", 135);
|
|
467
467
|
i0.ɵɵelement(13, "i", 141);
|
|
468
468
|
i0.ɵɵelementEnd();
|
|
@@ -501,8 +501,8 @@ function TestRunFormComponentExtended_Conditional_114_Template(rf, ctx) { if (rf
|
|
|
501
501
|
i0.ɵɵelementStart(43, "div", 142);
|
|
502
502
|
i0.ɵɵtext(44);
|
|
503
503
|
i0.ɵɵelementEnd()()()();
|
|
504
|
-
i0.ɵɵconditionalCreate(45,
|
|
505
|
-
i0.ɵɵconditionalCreate(46,
|
|
504
|
+
i0.ɵɵconditionalCreate(45, MJTestRunFormComponentExtended_Conditional_114_Conditional_45_Template, 7, 4, "div", 146);
|
|
505
|
+
i0.ɵɵconditionalCreate(46, MJTestRunFormComponentExtended_Conditional_114_Conditional_46_Template, 7, 4, "div", 147);
|
|
506
506
|
i0.ɵɵelementEnd();
|
|
507
507
|
} if (rf & 2) {
|
|
508
508
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -524,22 +524,22 @@ function TestRunFormComponentExtended_Conditional_114_Template(rf, ctx) { if (rf
|
|
|
524
524
|
i0.ɵɵadvance();
|
|
525
525
|
i0.ɵɵconditional(ctx_r1.parsedData.resultDetails ? 46 : -1);
|
|
526
526
|
} }
|
|
527
|
-
function
|
|
527
|
+
function MJTestRunFormComponentExtended_Conditional_115_Conditional_1_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
528
528
|
i0.ɵɵelementStart(0, "div", 160);
|
|
529
529
|
i0.ɵɵelement(1, "div", 161);
|
|
530
530
|
i0.ɵɵelementStart(2, "div", 162);
|
|
531
531
|
i0.ɵɵelement(3, "div", 163)(4, "div", 164);
|
|
532
532
|
i0.ɵɵelementEnd()();
|
|
533
533
|
} }
|
|
534
|
-
function
|
|
534
|
+
function MJTestRunFormComponentExtended_Conditional_115_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
535
535
|
i0.ɵɵelementStart(0, "div", 156)(1, "div", 159);
|
|
536
|
-
i0.ɵɵrepeaterCreate(2,
|
|
536
|
+
i0.ɵɵrepeaterCreate(2, MJTestRunFormComponentExtended_Conditional_115_Conditional_1_For_3_Template, 5, 0, "div", 160, i0.ɵɵrepeaterTrackByIdentity);
|
|
537
537
|
i0.ɵɵelementEnd()();
|
|
538
538
|
} if (rf & 2) {
|
|
539
539
|
i0.ɵɵadvance(2);
|
|
540
540
|
i0.ɵɵrepeater(i0.ɵɵpureFunction0(0, _c0));
|
|
541
541
|
} }
|
|
542
|
-
function
|
|
542
|
+
function MJTestRunFormComponentExtended_Conditional_115_Conditional_2_For_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
543
543
|
i0.ɵɵelementStart(0, "span", 174);
|
|
544
544
|
i0.ɵɵelement(1, "i", 36);
|
|
545
545
|
i0.ɵɵtext(2);
|
|
@@ -550,10 +550,10 @@ function TestRunFormComponentExtended_Conditional_115_Conditional_2_For_9_Condit
|
|
|
550
550
|
i0.ɵɵadvance(2);
|
|
551
551
|
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(3, 1, run_r16.TotalCost, "1.4-4"), " ");
|
|
552
552
|
} }
|
|
553
|
-
function
|
|
553
|
+
function MJTestRunFormComponentExtended_Conditional_115_Conditional_2_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
554
554
|
const _r15 = i0.ɵɵgetCurrentView();
|
|
555
555
|
i0.ɵɵelementStart(0, "div", 168);
|
|
556
|
-
i0.ɵɵlistener("click", function
|
|
556
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_115_Conditional_2_For_9_Template_div_click_0_listener() { const run_r16 = i0.ɵɵrestoreView(_r15).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.openAIAgentRun(run_r16.ID)); });
|
|
557
557
|
i0.ɵɵelementStart(1, "div", 169);
|
|
558
558
|
i0.ɵɵelement(2, "i", 47);
|
|
559
559
|
i0.ɵɵelementEnd();
|
|
@@ -563,7 +563,7 @@ function TestRunFormComponentExtended_Conditional_115_Conditional_2_For_9_Templa
|
|
|
563
563
|
i0.ɵɵelementStart(6, "div", 172)(7, "span", 173);
|
|
564
564
|
i0.ɵɵtext(8);
|
|
565
565
|
i0.ɵɵelementEnd();
|
|
566
|
-
i0.ɵɵconditionalCreate(9,
|
|
566
|
+
i0.ɵɵconditionalCreate(9, MJTestRunFormComponentExtended_Conditional_115_Conditional_2_For_9_Conditional_9_Template, 4, 4, "span", 174);
|
|
567
567
|
i0.ɵɵelementEnd()();
|
|
568
568
|
i0.ɵɵelement(10, "i", 175);
|
|
569
569
|
i0.ɵɵelementEnd();
|
|
@@ -578,7 +578,7 @@ function TestRunFormComponentExtended_Conditional_115_Conditional_2_For_9_Templa
|
|
|
578
578
|
i0.ɵɵadvance();
|
|
579
579
|
i0.ɵɵconditional(run_r16.TotalCost ? 9 : -1);
|
|
580
580
|
} }
|
|
581
|
-
function
|
|
581
|
+
function MJTestRunFormComponentExtended_Conditional_115_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
582
582
|
i0.ɵɵelementStart(0, "div", 157)(1, "div", 112)(2, "h3");
|
|
583
583
|
i0.ɵɵelement(3, "i", 47);
|
|
584
584
|
i0.ɵɵtext(4, " AI Agent Runs");
|
|
@@ -587,7 +587,7 @@ function TestRunFormComponentExtended_Conditional_115_Conditional_2_Template(rf,
|
|
|
587
587
|
i0.ɵɵtext(6);
|
|
588
588
|
i0.ɵɵelementEnd()();
|
|
589
589
|
i0.ɵɵelementStart(7, "div", 166);
|
|
590
|
-
i0.ɵɵrepeaterCreate(8,
|
|
590
|
+
i0.ɵɵrepeaterCreate(8, MJTestRunFormComponentExtended_Conditional_115_Conditional_2_For_9_Template, 11, 5, "div", 167, i0.ɵɵrepeaterTrackByIdentity);
|
|
591
591
|
i0.ɵɵelementEnd()();
|
|
592
592
|
} if (rf & 2) {
|
|
593
593
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -596,7 +596,7 @@ function TestRunFormComponentExtended_Conditional_115_Conditional_2_Template(rf,
|
|
|
596
596
|
i0.ɵɵadvance(2);
|
|
597
597
|
i0.ɵɵrepeater(ctx_r1.aiAgentRuns);
|
|
598
598
|
} }
|
|
599
|
-
function
|
|
599
|
+
function MJTestRunFormComponentExtended_Conditional_115_Conditional_3_For_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
600
600
|
i0.ɵɵelementStart(0, "span", 174);
|
|
601
601
|
i0.ɵɵelement(1, "i", 36);
|
|
602
602
|
i0.ɵɵtext(2);
|
|
@@ -607,10 +607,10 @@ function TestRunFormComponentExtended_Conditional_115_Conditional_3_For_9_Condit
|
|
|
607
607
|
i0.ɵɵadvance(2);
|
|
608
608
|
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(3, 1, run_r18.TotalCost, "1.4-4"), " ");
|
|
609
609
|
} }
|
|
610
|
-
function
|
|
610
|
+
function MJTestRunFormComponentExtended_Conditional_115_Conditional_3_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
611
611
|
const _r17 = i0.ɵɵgetCurrentView();
|
|
612
612
|
i0.ɵɵelementStart(0, "div", 168);
|
|
613
|
-
i0.ɵɵlistener("click", function
|
|
613
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_115_Conditional_3_For_9_Template_div_click_0_listener() { const run_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.openAIPromptRun(run_r18.ID)); });
|
|
614
614
|
i0.ɵɵelementStart(1, "div", 177);
|
|
615
615
|
i0.ɵɵelement(2, "i", 176);
|
|
616
616
|
i0.ɵɵelementEnd();
|
|
@@ -618,7 +618,7 @@ function TestRunFormComponentExtended_Conditional_115_Conditional_3_For_9_Templa
|
|
|
618
618
|
i0.ɵɵtext(5);
|
|
619
619
|
i0.ɵɵelementEnd();
|
|
620
620
|
i0.ɵɵelementStart(6, "div", 172);
|
|
621
|
-
i0.ɵɵconditionalCreate(7,
|
|
621
|
+
i0.ɵɵconditionalCreate(7, MJTestRunFormComponentExtended_Conditional_115_Conditional_3_For_9_Conditional_7_Template, 4, 4, "span", 174);
|
|
622
622
|
i0.ɵɵelementEnd()();
|
|
623
623
|
i0.ɵɵelement(8, "i", 175);
|
|
624
624
|
i0.ɵɵelementEnd();
|
|
@@ -629,7 +629,7 @@ function TestRunFormComponentExtended_Conditional_115_Conditional_3_For_9_Templa
|
|
|
629
629
|
i0.ɵɵadvance(2);
|
|
630
630
|
i0.ɵɵconditional(run_r18.TotalCost ? 7 : -1);
|
|
631
631
|
} }
|
|
632
|
-
function
|
|
632
|
+
function MJTestRunFormComponentExtended_Conditional_115_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
633
633
|
i0.ɵɵelementStart(0, "div", 157)(1, "div", 112)(2, "h3");
|
|
634
634
|
i0.ɵɵelement(3, "i", 176);
|
|
635
635
|
i0.ɵɵtext(4, " AI Prompt Runs");
|
|
@@ -638,7 +638,7 @@ function TestRunFormComponentExtended_Conditional_115_Conditional_3_Template(rf,
|
|
|
638
638
|
i0.ɵɵtext(6);
|
|
639
639
|
i0.ɵɵelementEnd()();
|
|
640
640
|
i0.ɵɵelementStart(7, "div", 166);
|
|
641
|
-
i0.ɵɵrepeaterCreate(8,
|
|
641
|
+
i0.ɵɵrepeaterCreate(8, MJTestRunFormComponentExtended_Conditional_115_Conditional_3_For_9_Template, 9, 2, "div", 167, i0.ɵɵrepeaterTrackByIdentity);
|
|
642
642
|
i0.ɵɵelementEnd()();
|
|
643
643
|
} if (rf & 2) {
|
|
644
644
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -647,7 +647,7 @@ function TestRunFormComponentExtended_Conditional_115_Conditional_3_Template(rf,
|
|
|
647
647
|
i0.ɵɵadvance(2);
|
|
648
648
|
i0.ɵɵrepeater(ctx_r1.aiPromptRuns);
|
|
649
649
|
} }
|
|
650
|
-
function
|
|
650
|
+
function MJTestRunFormComponentExtended_Conditional_115_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
651
651
|
i0.ɵɵelementStart(0, "div", 158)(1, "div", 178);
|
|
652
652
|
i0.ɵɵelement(2, "i", 47);
|
|
653
653
|
i0.ɵɵelementEnd();
|
|
@@ -658,12 +658,12 @@ function TestRunFormComponentExtended_Conditional_115_Conditional_4_Template(rf,
|
|
|
658
658
|
i0.ɵɵtext(6, "This test execution didn't involve any AI agent or prompt runs.");
|
|
659
659
|
i0.ɵɵelementEnd()();
|
|
660
660
|
} }
|
|
661
|
-
function
|
|
661
|
+
function MJTestRunFormComponentExtended_Conditional_115_Template(rf, ctx) { if (rf & 1) {
|
|
662
662
|
i0.ɵɵelementStart(0, "div", 57);
|
|
663
|
-
i0.ɵɵconditionalCreate(1,
|
|
664
|
-
i0.ɵɵconditionalCreate(2,
|
|
665
|
-
i0.ɵɵconditionalCreate(3,
|
|
666
|
-
i0.ɵɵconditionalCreate(4,
|
|
663
|
+
i0.ɵɵconditionalCreate(1, MJTestRunFormComponentExtended_Conditional_115_Conditional_1_Template, 4, 1, "div", 156);
|
|
664
|
+
i0.ɵɵconditionalCreate(2, MJTestRunFormComponentExtended_Conditional_115_Conditional_2_Template, 10, 1, "div", 157);
|
|
665
|
+
i0.ɵɵconditionalCreate(3, MJTestRunFormComponentExtended_Conditional_115_Conditional_3_Template, 10, 1, "div", 157);
|
|
666
|
+
i0.ɵɵconditionalCreate(4, MJTestRunFormComponentExtended_Conditional_115_Conditional_4_Template, 7, 0, "div", 158);
|
|
667
667
|
i0.ɵɵelementEnd();
|
|
668
668
|
} if (rf & 2) {
|
|
669
669
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -677,29 +677,29 @@ function TestRunFormComponentExtended_Conditional_115_Template(rf, ctx) { if (rf
|
|
|
677
677
|
i0.ɵɵadvance();
|
|
678
678
|
i0.ɵɵconditional(ctx_r1.aiRunsLoaded && ctx_r1.aiAgentRuns.length === 0 && ctx_r1.aiPromptRuns.length === 0 ? 4 : -1);
|
|
679
679
|
} }
|
|
680
|
-
function
|
|
680
|
+
function MJTestRunFormComponentExtended_Conditional_116_Conditional_1_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
681
681
|
i0.ɵɵelementStart(0, "div", 160);
|
|
682
682
|
i0.ɵɵelement(1, "div", 180);
|
|
683
683
|
i0.ɵɵelementStart(2, "div", 162);
|
|
684
684
|
i0.ɵɵelement(3, "div", 163)(4, "div", 164)(5, "div", 181);
|
|
685
685
|
i0.ɵɵelementEnd()();
|
|
686
686
|
} }
|
|
687
|
-
function
|
|
687
|
+
function MJTestRunFormComponentExtended_Conditional_116_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
688
688
|
i0.ɵɵelementStart(0, "div", 156)(1, "div", 159);
|
|
689
|
-
i0.ɵɵrepeaterCreate(2,
|
|
689
|
+
i0.ɵɵrepeaterCreate(2, MJTestRunFormComponentExtended_Conditional_116_Conditional_1_For_3_Template, 6, 0, "div", 160, i0.ɵɵrepeaterTrackByIdentity);
|
|
690
690
|
i0.ɵɵelementEnd()();
|
|
691
691
|
} if (rf & 2) {
|
|
692
692
|
i0.ɵɵadvance(2);
|
|
693
693
|
i0.ɵɵrepeater(i0.ɵɵpureFunction0(0, _c1));
|
|
694
694
|
} }
|
|
695
|
-
function
|
|
695
|
+
function MJTestRunFormComponentExtended_Conditional_116_Conditional_2_For_2_For_13_Template(rf, ctx) { if (rf & 1) {
|
|
696
696
|
i0.ɵɵelement(0, "i", 33);
|
|
697
697
|
} if (rf & 2) {
|
|
698
698
|
const s_r19 = ctx.$implicit;
|
|
699
699
|
const feedback_r20 = i0.ɵɵnextContext().$implicit;
|
|
700
700
|
i0.ɵɵclassProp("filled", s_r19 <= (feedback_r20.Rating || 0));
|
|
701
701
|
} }
|
|
702
|
-
function
|
|
702
|
+
function MJTestRunFormComponentExtended_Conditional_116_Conditional_2_For_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
703
703
|
i0.ɵɵelementStart(0, "div", 193)(1, "span", 195);
|
|
704
704
|
i0.ɵɵelement(2, "i", 127);
|
|
705
705
|
i0.ɵɵtext(3);
|
|
@@ -713,7 +713,7 @@ function TestRunFormComponentExtended_Conditional_116_Conditional_2_For_2_Condit
|
|
|
713
713
|
i0.ɵɵadvance();
|
|
714
714
|
i0.ɵɵtextInterpolate1(" ", feedback_r20.IsCorrect ? "Marked Correct" : "Marked Incorrect", " ");
|
|
715
715
|
} }
|
|
716
|
-
function
|
|
716
|
+
function MJTestRunFormComponentExtended_Conditional_116_Conditional_2_For_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
717
717
|
i0.ɵɵelementStart(0, "div", 194)(1, "p");
|
|
718
718
|
i0.ɵɵtext(2);
|
|
719
719
|
i0.ɵɵelementEnd()();
|
|
@@ -722,7 +722,7 @@ function TestRunFormComponentExtended_Conditional_116_Conditional_2_For_2_Condit
|
|
|
722
722
|
i0.ɵɵadvance(2);
|
|
723
723
|
i0.ɵɵtextInterpolate(feedback_r20.CorrectionSummary);
|
|
724
724
|
} }
|
|
725
|
-
function
|
|
725
|
+
function MJTestRunFormComponentExtended_Conditional_116_Conditional_2_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
726
726
|
i0.ɵɵelementStart(0, "div", 182)(1, "div", 183)(2, "div", 184)(3, "div", 185);
|
|
727
727
|
i0.ɵɵelement(4, "i", 73);
|
|
728
728
|
i0.ɵɵelementEnd();
|
|
@@ -733,13 +733,13 @@ function TestRunFormComponentExtended_Conditional_116_Conditional_2_For_2_Templa
|
|
|
733
733
|
i0.ɵɵtext(8);
|
|
734
734
|
i0.ɵɵelementEnd()();
|
|
735
735
|
i0.ɵɵelementStart(9, "div", 188)(10, "div", 189)(11, "div", 190);
|
|
736
|
-
i0.ɵɵrepeaterCreate(12,
|
|
736
|
+
i0.ɵɵrepeaterCreate(12, MJTestRunFormComponentExtended_Conditional_116_Conditional_2_For_2_For_13_Template, 1, 2, "i", 191, i0.ɵɵrepeaterTrackByIdentity);
|
|
737
737
|
i0.ɵɵelementEnd();
|
|
738
738
|
i0.ɵɵelementStart(14, "span", 192);
|
|
739
739
|
i0.ɵɵtext(15);
|
|
740
740
|
i0.ɵɵelementEnd()();
|
|
741
|
-
i0.ɵɵconditionalCreate(16,
|
|
742
|
-
i0.ɵɵconditionalCreate(17,
|
|
741
|
+
i0.ɵɵconditionalCreate(16, MJTestRunFormComponentExtended_Conditional_116_Conditional_2_For_2_Conditional_16_Template, 4, 9, "div", 193);
|
|
742
|
+
i0.ɵɵconditionalCreate(17, MJTestRunFormComponentExtended_Conditional_116_Conditional_2_For_2_Conditional_17_Template, 3, 1, "div", 194);
|
|
743
743
|
i0.ɵɵelementEnd()();
|
|
744
744
|
} if (rf & 2) {
|
|
745
745
|
const feedback_r20 = ctx.$implicit;
|
|
@@ -757,16 +757,16 @@ function TestRunFormComponentExtended_Conditional_116_Conditional_2_For_2_Templa
|
|
|
757
757
|
i0.ɵɵadvance();
|
|
758
758
|
i0.ɵɵconditional(feedback_r20.CorrectionSummary ? 17 : -1);
|
|
759
759
|
} }
|
|
760
|
-
function
|
|
760
|
+
function MJTestRunFormComponentExtended_Conditional_116_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
761
761
|
i0.ɵɵelementStart(0, "div", 179);
|
|
762
|
-
i0.ɵɵrepeaterCreate(1,
|
|
762
|
+
i0.ɵɵrepeaterCreate(1, MJTestRunFormComponentExtended_Conditional_116_Conditional_2_For_2_Template, 18, 6, "div", 182, i0.ɵɵrepeaterTrackByIdentity);
|
|
763
763
|
i0.ɵɵelementEnd();
|
|
764
764
|
} if (rf & 2) {
|
|
765
765
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
766
766
|
i0.ɵɵadvance();
|
|
767
767
|
i0.ɵɵrepeater(ctx_r1.feedbacks);
|
|
768
768
|
} }
|
|
769
|
-
function
|
|
769
|
+
function MJTestRunFormComponentExtended_Conditional_116_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
770
770
|
i0.ɵɵelementStart(0, "div", 158)(1, "div", 178);
|
|
771
771
|
i0.ɵɵelement(2, "i", 50);
|
|
772
772
|
i0.ɵɵelementEnd();
|
|
@@ -777,11 +777,11 @@ function TestRunFormComponentExtended_Conditional_116_Conditional_3_Template(rf,
|
|
|
777
777
|
i0.ɵɵtext(6, "No one has reviewed this test run yet. Be the first to provide feedback!");
|
|
778
778
|
i0.ɵɵelementEnd()();
|
|
779
779
|
} }
|
|
780
|
-
function
|
|
780
|
+
function MJTestRunFormComponentExtended_Conditional_116_Template(rf, ctx) { if (rf & 1) {
|
|
781
781
|
i0.ɵɵelementStart(0, "div", 58);
|
|
782
|
-
i0.ɵɵconditionalCreate(1,
|
|
783
|
-
i0.ɵɵconditionalCreate(2,
|
|
784
|
-
i0.ɵɵconditionalCreate(3,
|
|
782
|
+
i0.ɵɵconditionalCreate(1, MJTestRunFormComponentExtended_Conditional_116_Conditional_1_Template, 4, 1, "div", 156);
|
|
783
|
+
i0.ɵɵconditionalCreate(2, MJTestRunFormComponentExtended_Conditional_116_Conditional_2_Template, 3, 0, "div", 179);
|
|
784
|
+
i0.ɵɵconditionalCreate(3, MJTestRunFormComponentExtended_Conditional_116_Conditional_3_Template, 7, 0, "div", 158);
|
|
785
785
|
i0.ɵɵelementEnd();
|
|
786
786
|
} if (rf & 2) {
|
|
787
787
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -793,7 +793,7 @@ function TestRunFormComponentExtended_Conditional_116_Template(rf, ctx) { if (rf
|
|
|
793
793
|
i0.ɵɵadvance();
|
|
794
794
|
i0.ɵɵconditional(ctx_r1.feedbackLoaded && ctx_r1.feedbacks.length === 0 ? 3 : -1);
|
|
795
795
|
} }
|
|
796
|
-
function
|
|
796
|
+
function MJTestRunFormComponentExtended_Conditional_117_Template(rf, ctx) { if (rf & 1) {
|
|
797
797
|
i0.ɵɵelementStart(0, "div", 59);
|
|
798
798
|
i0.ɵɵelement(1, "mj-execution-context", 196);
|
|
799
799
|
i0.ɵɵelementEnd();
|
|
@@ -803,7 +803,7 @@ function TestRunFormComponentExtended_Conditional_117_Template(rf, ctx) { if (rf
|
|
|
803
803
|
i0.ɵɵadvance();
|
|
804
804
|
i0.ɵɵproperty("machineName", ctx_r1.record.MachineName)("machineId", ctx_r1.record.MachineID)("runByUserName", ctx_r1.record.RunByUserName)("runByUserEmail", ctx_r1.record.RunByUserEmail)("runContextDetailsJson", ctx_r1.record.RunContextDetails);
|
|
805
805
|
} }
|
|
806
|
-
function
|
|
806
|
+
function MJTestRunFormComponentExtended_Conditional_118_Template(rf, ctx) { if (rf & 1) {
|
|
807
807
|
const _r21 = i0.ɵɵgetCurrentView();
|
|
808
808
|
i0.ɵɵelementStart(0, "div", 60)(1, "div", 197)(2, "div", 198);
|
|
809
809
|
i0.ɵɵelement(3, "i", 100);
|
|
@@ -811,7 +811,7 @@ function TestRunFormComponentExtended_Conditional_118_Template(rf, ctx) { if (rf
|
|
|
811
811
|
i0.ɵɵtext(5, "Execution Log");
|
|
812
812
|
i0.ɵɵelementEnd()();
|
|
813
813
|
i0.ɵɵelementStart(6, "div", 199)(7, "button", 200);
|
|
814
|
-
i0.ɵɵlistener("click", function
|
|
814
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Conditional_118_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.copyLogToClipboard()); });
|
|
815
815
|
i0.ɵɵelement(8, "i", 201);
|
|
816
816
|
i0.ɵɵelementStart(9, "span", 21);
|
|
817
817
|
i0.ɵɵtext(10, "Copy");
|
|
@@ -825,7 +825,7 @@ function TestRunFormComponentExtended_Conditional_118_Template(rf, ctx) { if (rf
|
|
|
825
825
|
i0.ɵɵadvance(12);
|
|
826
826
|
i0.ɵɵproperty("value", ctx_r1.record.Log || "")("readonly", true)("toolbar", ctx_r1.jsonToolbar)("lineWrapping", true);
|
|
827
827
|
} }
|
|
828
|
-
let
|
|
828
|
+
let MJTestRunFormComponentExtended = class MJTestRunFormComponentExtended extends MJTestRunFormComponent {
|
|
829
829
|
constructor() {
|
|
830
830
|
super(...arguments);
|
|
831
831
|
this.destroy$ = new Subject();
|
|
@@ -1319,19 +1319,19 @@ let TestRunFormComponentExtended = class TestRunFormComponentExtended extends MJ
|
|
|
1319
1319
|
return `${diffDays}d ago`;
|
|
1320
1320
|
return d.toLocaleDateString();
|
|
1321
1321
|
}
|
|
1322
|
-
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵ
|
|
1323
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type:
|
|
1324
|
-
i0.ɵɵlistener("keydown", function
|
|
1325
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 137, vars: 59, consts: [[1, "test-run-form"], [1, "error-banner"], [1, "test-run-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, "header-content"], [1, "header-left"], [1, "status-indicator"], [1, "fas", 3, "ngClass"], [1, "test-run-info"], [1, "run-id"], [1, "test-run-meta"], [1, "status-badge"], [1, "meta-item"], [1, "header-actions"], ["kendoButton", "", "title", "Re-run this test (Cmd+Shift+R)", 3, "click", "disabled"], [1, "fas", "fa-redo"], [1, "btn-text"], ["kendoButton", "", "title", "Refresh (Cmd+R)", 3, "click", "disabled"], [1, "fas", "fa-sync-alt"], [1, "metrics-bar"], [1, "metric-card"], [1, "metric-icon"], [1, "fas", "fa-clock"], [1, "metric-content"], [1, "metric-label"], [1, "metric-value"], [1, "metric-detail"], [1, "fas", "fa-stopwatch"], [1, "fas", "fa-star"], [1, "metric-progress"], [1, "fas", "fa-check-double"], [1, "fas", "fa-dollar-sign"], [1, "secondary-info"], [1, "tags-bar"], [1, "tags-editor-panel"], [1, "tabs-container"], ["role", "tablist", 1, "tabs"], ["role", "tab", "title", "Press 1", 1, "tab", 3, "click"], [1, "fas", "fa-chart-pie"], ["role", "tab", "title", "Press 2", 1, "tab", 3, "click"], [1, "fas", "fa-info-circle"], ["role", "tab", "title", "Press 3", 1, "tab", 3, "click"], [1, "fas", "fa-robot"], [1, "tab-badge"], ["role", "tab", "title", "Press 4", 1, "tab", 3, "click"], [1, "fas", "fa-comments"], ["role", "tab", "title", "Press 5", 1, "tab", 3, "click"], [1, "fas", "fa-microchip"], ["role", "tab", "title", "Press 6", 1, "tab", 3, "active"], [1, "tab-content"], [1, "overview-tab"], [1, "details-tab"], [1, "ai-runs-tab"], [1, "feedback-tab"], [1, "execution-tab"], [1, "log-tab"], ["title", "Keyboard Shortcuts", 1, "shortcuts-hint"], [1, "fas", "fa-keyboard"], [1, "shortcuts-popup"], [1, "error-banner", 3, "click"], [1, "fas", "fa-exclamation-triangle"], [1, "retry-btn"], [1, "fas", "fa-flask"], [1, "fas", "fa-sync-alt", "fa-spin"], [1, "progress-bar"], [1, "info-chip"], [1, "info-chip", "clickable"], [3, "entityName", "recordId"], [1, "fas", "fa-user"], [1, "info-chip", "clickable", 3, "click"], [1, "fas", "fa-layer-group"], [1, "tags-bar-content"], [1, "tags-bar-label"], [1, "fas", "fa-tags"], [1, "tags-bar-chips"], [1, "tags-bar-empty"], ["title", "Edit tags", 1, "tags-bar-edit", 3, "click"], [1, "fas", "fa-plus"], [1, "tag-inline"], [1, "tags-editor-header"], [1, "tags-editor-title"], [1, "tags-editor-body"], [1, "tags-editor-chips"], [1, "tag-editable"], [1, "tags-empty-hint"], [1, "tags-editor-input"], ["type", "text", "placeholder", "Type a tag and press Enter...", 1, "tag-text-input", 3, "ngModelChange", "keyup.enter", "ngModel"], ["kendoButton", "", "fillMode", "flat", 3, "click", "disabled"], [1, "tags-editor-footer"], ["kendoButton", "", "themeColor", "primary", 3, "click", "disabled"], [1, "fas", "fa-spinner", "fa-spin"], ["kendoButton", "", "fillMode", "flat", 3, "click"], ["title", "Remove tag", 1, "tag-remove-btn", 3, "click"], [1, "fas", "fa-times"], ["role", "tab", "title", "Press 6", 1, "tab", 3, "click"], [1, "fas", "fa-terminal"], [1, "result-hero"], [1, "result-icon-wrapper"], [1, "result-icon"], [1, "result-pulse"], [1, "result-text"], [1, "result-details"], [1, "result-score"], [1, "result-divider"], [1, "result-checks"], [1, "check-results"], [1, "comparison-section"], [1, "section-header"], [1, "fas", "fa-exchange-alt"], [1, "comparison-tabs"], [1, "comparison-tab", 3, "click"], [1, "fas", "fa-sign-in-alt"], [1, "fas", "fa-bullseye"], [1, "fas", "fa-check-square"], [1, "comparison-content"], ["language", "json", 3, "value", "readonly", "toolbar", "lineWrapping"], [1, "fas", "fa-tasks"], [1, "check-summary"], [1, "check-list"], [1, "check-item", 3, "passed", "failed", "animation-delay"], [1, "check-item"], [1, "check-status"], [1, "fas"], [1, "check-content"], [1, "check-name"], [1, "check-message"], [1, "check-weight"], [1, "weight-label"], [1, "details-grid"], [1, "detail-card"], [1, "detail-icon"], [1, "fas", "fa-fingerprint"], [1, "detail-content"], [1, "detail-label"], [1, "detail-value", "monospace"], [1, "detail-card", "clickable"], [1, "fas", "fa-tag"], [1, "detail-value"], [1, "fas", "fa-play-circle"], [1, "fas", "fa-stop-circle"], [1, "fas", "fa-hourglass-half"], [1, "error-section"], [1, "result-details-section"], [1, "detail-card", "clickable", 3, "click"], [1, "detail-value", "link"], [1, "fas", "fa-external-link-alt", "detail-action"], [1, "section-header", "error"], [1, "error-content"], [3, "value", "readonly", "toolbar", "lineWrapping"], [1, "fas", "fa-file-code"], [1, "result-details-content"], [1, "loading-state"], [1, "ai-section"], [1, "empty-state"], [1, "skeleton-list"], [1, "skeleton-card"], [1, "skeleton-icon"], [1, "skeleton-content"], [1, "skeleton-line", "wide"], [1, "skeleton-line", "narrow"], [1, "count-badge"], [1, "ai-run-list"], [1, "ai-run-card"], [1, "ai-run-card", 3, "click"], [1, "ai-run-icon", "agent"], [1, "ai-run-content"], [1, "ai-run-name"], [1, "ai-run-meta"], [1, "status-chip"], [1, "cost-chip"], [1, "fas", "fa-chevron-right", "ai-run-arrow"], [1, "fas", "fa-comment-dots"], [1, "ai-run-icon", "prompt"], [1, "empty-icon"], [1, "feedback-list"], [1, "skeleton-avatar"], [1, "skeleton-line", "medium"], [1, "feedback-item"], [1, "feedback-header"], [1, "feedback-user"], [1, "user-avatar"], [1, "user-name"], [1, "feedback-date"], [1, "feedback-body"], [1, "feedback-rating"], [1, "rating-stars"], [1, "fas", "fa-star", 3, "filled"], [1, "rating-value"], [1, "feedback-verdict"], [1, "feedback-comments"], [1, "verdict-badge"], [3, "machineName", "machineId", "runByUserName", "runByUserEmail", "runContextDetailsJson"], [1, "log-header"], [1, "log-title"], [1, "log-actions"], ["kendoButton", "", "look", "flat", 3, "click"], [1, "fas", "fa-copy"], [1, "log-container"]], template: function
|
|
1322
|
+
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵMJTestRunFormComponentExtended_BaseFactory; return function MJTestRunFormComponentExtended_Factory(__ngFactoryType__) { return (ɵMJTestRunFormComponentExtended_BaseFactory || (ɵMJTestRunFormComponentExtended_BaseFactory = i0.ɵɵgetInheritedFactory(MJTestRunFormComponentExtended)))(__ngFactoryType__ || MJTestRunFormComponentExtended); }; })(); }
|
|
1323
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJTestRunFormComponentExtended, selectors: [["mj-test-run-form"]], hostBindings: function MJTestRunFormComponentExtended_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1324
|
+
i0.ɵɵlistener("keydown", function MJTestRunFormComponentExtended_keydown_HostBindingHandler($event) { return ctx.handleKeyboardShortcut($event); }, i0.ɵɵresolveDocument);
|
|
1325
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 137, vars: 59, consts: [[1, "test-run-form"], [1, "error-banner"], [1, "test-run-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, "header-content"], [1, "header-left"], [1, "status-indicator"], [1, "fas", 3, "ngClass"], [1, "test-run-info"], [1, "run-id"], [1, "test-run-meta"], [1, "status-badge"], [1, "meta-item"], [1, "header-actions"], ["kendoButton", "", "title", "Re-run this test (Cmd+Shift+R)", 3, "click", "disabled"], [1, "fas", "fa-redo"], [1, "btn-text"], ["kendoButton", "", "title", "Refresh (Cmd+R)", 3, "click", "disabled"], [1, "fas", "fa-sync-alt"], [1, "metrics-bar"], [1, "metric-card"], [1, "metric-icon"], [1, "fas", "fa-clock"], [1, "metric-content"], [1, "metric-label"], [1, "metric-value"], [1, "metric-detail"], [1, "fas", "fa-stopwatch"], [1, "fas", "fa-star"], [1, "metric-progress"], [1, "fas", "fa-check-double"], [1, "fas", "fa-dollar-sign"], [1, "secondary-info"], [1, "tags-bar"], [1, "tags-editor-panel"], [1, "tabs-container"], ["role", "tablist", 1, "tabs"], ["role", "tab", "title", "Press 1", 1, "tab", 3, "click"], [1, "fas", "fa-chart-pie"], ["role", "tab", "title", "Press 2", 1, "tab", 3, "click"], [1, "fas", "fa-info-circle"], ["role", "tab", "title", "Press 3", 1, "tab", 3, "click"], [1, "fas", "fa-robot"], [1, "tab-badge"], ["role", "tab", "title", "Press 4", 1, "tab", 3, "click"], [1, "fas", "fa-comments"], ["role", "tab", "title", "Press 5", 1, "tab", 3, "click"], [1, "fas", "fa-microchip"], ["role", "tab", "title", "Press 6", 1, "tab", 3, "active"], [1, "tab-content"], [1, "overview-tab"], [1, "details-tab"], [1, "ai-runs-tab"], [1, "feedback-tab"], [1, "execution-tab"], [1, "log-tab"], ["title", "Keyboard Shortcuts", 1, "shortcuts-hint"], [1, "fas", "fa-keyboard"], [1, "shortcuts-popup"], [1, "error-banner", 3, "click"], [1, "fas", "fa-exclamation-triangle"], [1, "retry-btn"], [1, "fas", "fa-flask"], [1, "fas", "fa-sync-alt", "fa-spin"], [1, "progress-bar"], [1, "info-chip"], [1, "info-chip", "clickable"], [3, "entityName", "recordId"], [1, "fas", "fa-user"], [1, "info-chip", "clickable", 3, "click"], [1, "fas", "fa-layer-group"], [1, "tags-bar-content"], [1, "tags-bar-label"], [1, "fas", "fa-tags"], [1, "tags-bar-chips"], [1, "tags-bar-empty"], ["title", "Edit tags", 1, "tags-bar-edit", 3, "click"], [1, "fas", "fa-plus"], [1, "tag-inline"], [1, "tags-editor-header"], [1, "tags-editor-title"], [1, "tags-editor-body"], [1, "tags-editor-chips"], [1, "tag-editable"], [1, "tags-empty-hint"], [1, "tags-editor-input"], ["type", "text", "placeholder", "Type a tag and press Enter...", 1, "tag-text-input", 3, "ngModelChange", "keyup.enter", "ngModel"], ["kendoButton", "", "fillMode", "flat", 3, "click", "disabled"], [1, "tags-editor-footer"], ["kendoButton", "", "themeColor", "primary", 3, "click", "disabled"], [1, "fas", "fa-spinner", "fa-spin"], ["kendoButton", "", "fillMode", "flat", 3, "click"], ["title", "Remove tag", 1, "tag-remove-btn", 3, "click"], [1, "fas", "fa-times"], ["role", "tab", "title", "Press 6", 1, "tab", 3, "click"], [1, "fas", "fa-terminal"], [1, "result-hero"], [1, "result-icon-wrapper"], [1, "result-icon"], [1, "result-pulse"], [1, "result-text"], [1, "result-details"], [1, "result-score"], [1, "result-divider"], [1, "result-checks"], [1, "check-results"], [1, "comparison-section"], [1, "section-header"], [1, "fas", "fa-exchange-alt"], [1, "comparison-tabs"], [1, "comparison-tab", 3, "click"], [1, "fas", "fa-sign-in-alt"], [1, "fas", "fa-bullseye"], [1, "fas", "fa-check-square"], [1, "comparison-content"], ["language", "json", 3, "value", "readonly", "toolbar", "lineWrapping"], [1, "fas", "fa-tasks"], [1, "check-summary"], [1, "check-list"], [1, "check-item", 3, "passed", "failed", "animation-delay"], [1, "check-item"], [1, "check-status"], [1, "fas"], [1, "check-content"], [1, "check-name"], [1, "check-message"], [1, "check-weight"], [1, "weight-label"], [1, "details-grid"], [1, "detail-card"], [1, "detail-icon"], [1, "fas", "fa-fingerprint"], [1, "detail-content"], [1, "detail-label"], [1, "detail-value", "monospace"], [1, "detail-card", "clickable"], [1, "fas", "fa-tag"], [1, "detail-value"], [1, "fas", "fa-play-circle"], [1, "fas", "fa-stop-circle"], [1, "fas", "fa-hourglass-half"], [1, "error-section"], [1, "result-details-section"], [1, "detail-card", "clickable", 3, "click"], [1, "detail-value", "link"], [1, "fas", "fa-external-link-alt", "detail-action"], [1, "section-header", "error"], [1, "error-content"], [3, "value", "readonly", "toolbar", "lineWrapping"], [1, "fas", "fa-file-code"], [1, "result-details-content"], [1, "loading-state"], [1, "ai-section"], [1, "empty-state"], [1, "skeleton-list"], [1, "skeleton-card"], [1, "skeleton-icon"], [1, "skeleton-content"], [1, "skeleton-line", "wide"], [1, "skeleton-line", "narrow"], [1, "count-badge"], [1, "ai-run-list"], [1, "ai-run-card"], [1, "ai-run-card", 3, "click"], [1, "ai-run-icon", "agent"], [1, "ai-run-content"], [1, "ai-run-name"], [1, "ai-run-meta"], [1, "status-chip"], [1, "cost-chip"], [1, "fas", "fa-chevron-right", "ai-run-arrow"], [1, "fas", "fa-comment-dots"], [1, "ai-run-icon", "prompt"], [1, "empty-icon"], [1, "feedback-list"], [1, "skeleton-avatar"], [1, "skeleton-line", "medium"], [1, "feedback-item"], [1, "feedback-header"], [1, "feedback-user"], [1, "user-avatar"], [1, "user-name"], [1, "feedback-date"], [1, "feedback-body"], [1, "feedback-rating"], [1, "rating-stars"], [1, "fas", "fa-star", 3, "filled"], [1, "rating-value"], [1, "feedback-verdict"], [1, "feedback-comments"], [1, "verdict-badge"], [3, "machineName", "machineId", "runByUserName", "runByUserEmail", "runContextDetailsJson"], [1, "log-header"], [1, "log-title"], [1, "log-actions"], ["kendoButton", "", "look", "flat", 3, "click"], [1, "fas", "fa-copy"], [1, "log-container"]], template: function MJTestRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
|
|
1326
1326
|
i0.ɵɵelementStart(0, "div", 0);
|
|
1327
|
-
i0.ɵɵconditionalCreate(1,
|
|
1327
|
+
i0.ɵɵconditionalCreate(1, MJTestRunFormComponentExtended_Conditional_1_Template, 7, 1, "div", 1);
|
|
1328
1328
|
i0.ɵɵelementStart(2, "div", 2)(3, "nav", 3)(4, "ol")(5, "li")(6, "a", 4);
|
|
1329
|
-
i0.ɵɵlistener("click", function
|
|
1329
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Template_a_click_6_listener() { return ctx.navigateToTestingDashboard(); });
|
|
1330
1330
|
i0.ɵɵelement(7, "i", 5);
|
|
1331
1331
|
i0.ɵɵelementStart(8, "span", 6);
|
|
1332
1332
|
i0.ɵɵtext(9, "Testing");
|
|
1333
1333
|
i0.ɵɵelementEnd()()();
|
|
1334
|
-
i0.ɵɵconditionalCreate(10,
|
|
1334
|
+
i0.ɵɵconditionalCreate(10, MJTestRunFormComponentExtended_Conditional_10_Template, 6, 1, "li");
|
|
1335
1335
|
i0.ɵɵelementStart(11, "li", 7);
|
|
1336
1336
|
i0.ɵɵelement(12, "i", 8);
|
|
1337
1337
|
i0.ɵɵelementStart(13, "span");
|
|
@@ -1348,17 +1348,17 @@ let TestRunFormComponentExtended = class TestRunFormComponentExtended extends MJ
|
|
|
1348
1348
|
i0.ɵɵelementStart(24, "div", 15)(25, "span", 16);
|
|
1349
1349
|
i0.ɵɵtext(26);
|
|
1350
1350
|
i0.ɵɵelementEnd();
|
|
1351
|
-
i0.ɵɵconditionalCreate(27,
|
|
1352
|
-
i0.ɵɵconditionalCreate(28,
|
|
1351
|
+
i0.ɵɵconditionalCreate(27, MJTestRunFormComponentExtended_Conditional_27_Template, 3, 1, "span", 17);
|
|
1352
|
+
i0.ɵɵconditionalCreate(28, MJTestRunFormComponentExtended_Conditional_28_Template, 3, 0, "span", 17);
|
|
1353
1353
|
i0.ɵɵelementEnd()()();
|
|
1354
1354
|
i0.ɵɵelementStart(29, "div", 18)(30, "button", 19);
|
|
1355
|
-
i0.ɵɵlistener("click", function
|
|
1355
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Template_button_click_30_listener() { return ctx.reRunTest(); });
|
|
1356
1356
|
i0.ɵɵelement(31, "i", 20);
|
|
1357
1357
|
i0.ɵɵelementStart(32, "span", 21);
|
|
1358
1358
|
i0.ɵɵtext(33, "Re-run");
|
|
1359
1359
|
i0.ɵɵelementEnd()();
|
|
1360
1360
|
i0.ɵɵelementStart(34, "button", 22);
|
|
1361
|
-
i0.ɵɵlistener("click", function
|
|
1361
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Template_button_click_34_listener() { return ctx.refresh(); });
|
|
1362
1362
|
i0.ɵɵelement(35, "i", 23);
|
|
1363
1363
|
i0.ɵɵelementStart(36, "span", 21);
|
|
1364
1364
|
i0.ɵɵtext(37, "Refresh");
|
|
@@ -1394,7 +1394,7 @@ let TestRunFormComponentExtended = class TestRunFormComponentExtended extends MJ
|
|
|
1394
1394
|
i0.ɵɵelementStart(64, "div", 30);
|
|
1395
1395
|
i0.ɵɵtext(65);
|
|
1396
1396
|
i0.ɵɵelementEnd();
|
|
1397
|
-
i0.ɵɵconditionalCreate(66,
|
|
1397
|
+
i0.ɵɵconditionalCreate(66, MJTestRunFormComponentExtended_Conditional_66_Template, 2, 4, "div", 34);
|
|
1398
1398
|
i0.ɵɵelementEnd()();
|
|
1399
1399
|
i0.ɵɵelementStart(67, "div", 25)(68, "div", 26);
|
|
1400
1400
|
i0.ɵɵelement(69, "i", 35);
|
|
@@ -1405,7 +1405,7 @@ let TestRunFormComponentExtended = class TestRunFormComponentExtended extends MJ
|
|
|
1405
1405
|
i0.ɵɵelementStart(73, "div", 30);
|
|
1406
1406
|
i0.ɵɵtext(74);
|
|
1407
1407
|
i0.ɵɵelementEnd();
|
|
1408
|
-
i0.ɵɵconditionalCreate(75,
|
|
1408
|
+
i0.ɵɵconditionalCreate(75, MJTestRunFormComponentExtended_Conditional_75_Template, 2, 4, "div", 34);
|
|
1409
1409
|
i0.ɵɵelementEnd()();
|
|
1410
1410
|
i0.ɵɵelementStart(76, "div", 25)(77, "div", 26);
|
|
1411
1411
|
i0.ɵɵelement(78, "i", 36);
|
|
@@ -1416,53 +1416,53 @@ let TestRunFormComponentExtended = class TestRunFormComponentExtended extends MJ
|
|
|
1416
1416
|
i0.ɵɵelementStart(82, "div", 30);
|
|
1417
1417
|
i0.ɵɵtext(83);
|
|
1418
1418
|
i0.ɵɵelementEnd()()()();
|
|
1419
|
-
i0.ɵɵconditionalCreate(84,
|
|
1420
|
-
i0.ɵɵconditionalCreate(85,
|
|
1421
|
-
i0.ɵɵconditionalCreate(86,
|
|
1419
|
+
i0.ɵɵconditionalCreate(84, MJTestRunFormComponentExtended_Conditional_84_Template, 4, 3, "div", 37);
|
|
1420
|
+
i0.ɵɵconditionalCreate(85, MJTestRunFormComponentExtended_Conditional_85_Template, 9, 2, "div", 38);
|
|
1421
|
+
i0.ɵɵconditionalCreate(86, MJTestRunFormComponentExtended_Conditional_86_Template, 20, 6, "div", 39);
|
|
1422
1422
|
i0.ɵɵelementEnd();
|
|
1423
1423
|
i0.ɵɵelementStart(87, "div", 40)(88, "div", 41)(89, "button", 42);
|
|
1424
|
-
i0.ɵɵlistener("click", function
|
|
1424
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Template_button_click_89_listener() { return ctx.changeTab("overview"); });
|
|
1425
1425
|
i0.ɵɵelement(90, "i", 43);
|
|
1426
1426
|
i0.ɵɵelementStart(91, "span");
|
|
1427
1427
|
i0.ɵɵtext(92, "Overview");
|
|
1428
1428
|
i0.ɵɵelementEnd()();
|
|
1429
1429
|
i0.ɵɵelementStart(93, "button", 44);
|
|
1430
|
-
i0.ɵɵlistener("click", function
|
|
1430
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Template_button_click_93_listener() { return ctx.changeTab("details"); });
|
|
1431
1431
|
i0.ɵɵelement(94, "i", 45);
|
|
1432
1432
|
i0.ɵɵelementStart(95, "span");
|
|
1433
1433
|
i0.ɵɵtext(96, "Details");
|
|
1434
1434
|
i0.ɵɵelementEnd()();
|
|
1435
1435
|
i0.ɵɵelementStart(97, "button", 46);
|
|
1436
|
-
i0.ɵɵlistener("click", function
|
|
1436
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Template_button_click_97_listener() { return ctx.changeTab("ai-runs"); });
|
|
1437
1437
|
i0.ɵɵelement(98, "i", 47);
|
|
1438
1438
|
i0.ɵɵelementStart(99, "span");
|
|
1439
1439
|
i0.ɵɵtext(100, "AI Runs");
|
|
1440
1440
|
i0.ɵɵelementEnd();
|
|
1441
|
-
i0.ɵɵconditionalCreate(101,
|
|
1441
|
+
i0.ɵɵconditionalCreate(101, MJTestRunFormComponentExtended_Conditional_101_Template, 2, 1, "span", 48);
|
|
1442
1442
|
i0.ɵɵelementEnd();
|
|
1443
1443
|
i0.ɵɵelementStart(102, "button", 49);
|
|
1444
|
-
i0.ɵɵlistener("click", function
|
|
1444
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Template_button_click_102_listener() { return ctx.changeTab("feedback"); });
|
|
1445
1445
|
i0.ɵɵelement(103, "i", 50);
|
|
1446
1446
|
i0.ɵɵelementStart(104, "span");
|
|
1447
1447
|
i0.ɵɵtext(105, "Feedback");
|
|
1448
1448
|
i0.ɵɵelementEnd();
|
|
1449
|
-
i0.ɵɵconditionalCreate(106,
|
|
1449
|
+
i0.ɵɵconditionalCreate(106, MJTestRunFormComponentExtended_Conditional_106_Template, 2, 1, "span", 48);
|
|
1450
1450
|
i0.ɵɵelementEnd();
|
|
1451
1451
|
i0.ɵɵelementStart(107, "button", 51);
|
|
1452
|
-
i0.ɵɵlistener("click", function
|
|
1452
|
+
i0.ɵɵlistener("click", function MJTestRunFormComponentExtended_Template_button_click_107_listener() { return ctx.changeTab("execution"); });
|
|
1453
1453
|
i0.ɵɵelement(108, "i", 52);
|
|
1454
1454
|
i0.ɵɵelementStart(109, "span");
|
|
1455
1455
|
i0.ɵɵtext(110, "Execution");
|
|
1456
1456
|
i0.ɵɵelementEnd()();
|
|
1457
|
-
i0.ɵɵconditionalCreate(111,
|
|
1457
|
+
i0.ɵɵconditionalCreate(111, MJTestRunFormComponentExtended_Conditional_111_Template, 4, 3, "button", 53);
|
|
1458
1458
|
i0.ɵɵelementEnd()();
|
|
1459
1459
|
i0.ɵɵelementStart(112, "div", 54);
|
|
1460
|
-
i0.ɵɵconditionalCreate(113,
|
|
1461
|
-
i0.ɵɵconditionalCreate(114,
|
|
1462
|
-
i0.ɵɵconditionalCreate(115,
|
|
1463
|
-
i0.ɵɵconditionalCreate(116,
|
|
1464
|
-
i0.ɵɵconditionalCreate(117,
|
|
1465
|
-
i0.ɵɵconditionalCreate(118,
|
|
1460
|
+
i0.ɵɵconditionalCreate(113, MJTestRunFormComponentExtended_Conditional_113_Template, 34, 20, "div", 55);
|
|
1461
|
+
i0.ɵɵconditionalCreate(114, MJTestRunFormComponentExtended_Conditional_114_Template, 47, 15, "div", 56);
|
|
1462
|
+
i0.ɵɵconditionalCreate(115, MJTestRunFormComponentExtended_Conditional_115_Template, 5, 5, "div", 57);
|
|
1463
|
+
i0.ɵɵconditionalCreate(116, MJTestRunFormComponentExtended_Conditional_116_Template, 4, 4, "div", 58);
|
|
1464
|
+
i0.ɵɵconditionalCreate(117, MJTestRunFormComponentExtended_Conditional_117_Template, 2, 6, "div", 59);
|
|
1465
|
+
i0.ɵɵconditionalCreate(118, MJTestRunFormComponentExtended_Conditional_118_Template, 13, 5, "div", 60);
|
|
1466
1466
|
i0.ɵɵelementEnd();
|
|
1467
1467
|
i0.ɵɵelementStart(119, "div", 61);
|
|
1468
1468
|
i0.ɵɵelement(120, "i", 62);
|
|
@@ -1571,16 +1571,16 @@ let TestRunFormComponentExtended = class TestRunFormComponentExtended extends MJ
|
|
|
1571
1571
|
i0.ɵɵconditional(ctx.activeTab === "log" ? 118 : -1);
|
|
1572
1572
|
} }, dependencies: [i1.NgClass, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.ButtonComponent, i4.CodeEditorComponent, i5.ExecutionContextComponent, i6.EntityLinkPillComponent, i1.DecimalPipe, 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-timeout: #f97316;\n --test-timeout-light: #ffedd5;\n --test-running: #3b82f6;\n --test-pending: #8b5cf6;\n --test-skipped: #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.test-run-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.error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 12px 20px;\n background: linear-gradient(135deg, var(--test-error) 0%, #dc2626 100%);\n color: white;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: var(--test-transition);\n animation: _ngcontent-%COMP%_slideDown 0.3s ease-out;\n}\n\n.error-banner[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%);\n}\n\n.error-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.retry-btn[_ngcontent-%COMP%] {\n background: rgba(255, 255, 255, 0.2);\n border: 1px solid rgba(255, 255, 255, 0.3);\n color: white;\n padding: 6px 12px;\n border-radius: var(--test-radius-sm);\n cursor: pointer;\n font-size: 12px;\n font-weight: 600;\n transition: var(--test-transition);\n}\n\n.retry-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.3);\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n transform: translateY(-100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n\n\n\n\n.test-run-header[_ngcontent-%COMP%] {\n background: var(--test-surface);\n border-bottom: 1px solid var(--test-border);\n padding: 20px;\n position: relative;\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 flex-wrap: wrap;\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: var(--test-radius-sm);\n transition: var(--test-transition);\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.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\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.status-indicator[_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.status-indicator[_ngcontent-%COMP%]:hover {\n transform: scale(1.05);\n}\n\n\n\n.test-run-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.test-run-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-run-info[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] .run-id[_ngcontent-%COMP%] {\n color: var(--test-text-secondary);\n font-weight: 500;\n}\n\n.test-run-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\n\n.meta-item[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 14px;\n color: var(--test-text-secondary);\n}\n\n.meta-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\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.btn-text[_ngcontent-%COMP%] {\n margin-left: 6px;\n}\n\n\n\n\n\n.metrics-bar[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.metric-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\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 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-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--test-surface);\n border-radius: var(--test-radius-sm);\n color: var(--test-primary);\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.metric-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\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: 4px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 700;\n color: var(--test-text);\n}\n\n.metric-detail[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--test-text-muted);\n margin-top: 2px;\n}\n\n\n\n.metric-progress[_ngcontent-%COMP%] {\n margin-top: 6px;\n height: 4px;\n background: var(--test-border);\n border-radius: 2px;\n overflow: hidden;\n}\n\n.progress-bar[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 2px;\n transition: width 0.5s ease-out;\n}\n\n\n\n.secondary-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding-top: 16px;\n border-top: 1px solid var(--test-border);\n flex-wrap: wrap;\n}\n\n.info-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--test-text-secondary);\n padding: 6px 12px;\n background: var(--test-bg);\n border-radius: 20px;\n transition: var(--test-transition);\n}\n\n.info-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.info-chip.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.info-chip.clickable[_ngcontent-%COMP%]:hover {\n background: rgba(37, 99, 235, 0.1);\n color: var(--test-primary);\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 position: relative;\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.shortcut-hint[_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 font-family: -apple-system, BlinkMacSystemFont, sans-serif;\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.result-hero[_ngcontent-%COMP%] {\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n padding: 32px;\n text-align: center;\n border: 2px solid var(--test-border);\n box-shadow: var(--test-shadow-sm);\n transition: var(--test-transition);\n}\n\n.result-hero.passed[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #ecfdf5 0%, var(--test-success-light) 100%);\n border-color: var(--test-success);\n}\n\n.result-hero.failed[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fef2f2 0%, var(--test-error-light) 100%);\n border-color: var(--test-error);\n}\n\n.result-hero.error[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fffbeb 0%, var(--test-warning-light) 100%);\n border-color: var(--test-warning);\n}\n\n.result-hero.timeout[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fff7ed 0%, var(--test-timeout-light) 100%);\n border-color: var(--test-timeout);\n}\n\n.result-hero.running[_ngcontent-%COMP%], \n.result-hero.pending[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%);\n border-color: var(--test-primary-light);\n}\n\n.result-icon-wrapper[_ngcontent-%COMP%] {\n position: relative;\n display: inline-block;\n margin-bottom: 16px;\n}\n\n.result-icon[_ngcontent-%COMP%] {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--test-surface);\n border-radius: 50%;\n font-size: 40px;\n margin: 0 auto;\n box-shadow: var(--test-shadow-md);\n}\n\n.result-hero.passed[_ngcontent-%COMP%] .result-icon[_ngcontent-%COMP%] { color: var(--test-success); }\n.result-hero.failed[_ngcontent-%COMP%] .result-icon[_ngcontent-%COMP%] { color: var(--test-error); }\n.result-hero.error[_ngcontent-%COMP%] .result-icon[_ngcontent-%COMP%] { color: var(--test-warning); }\n.result-hero.timeout[_ngcontent-%COMP%] .result-icon[_ngcontent-%COMP%] { color: var(--test-timeout); }\n.result-hero.running[_ngcontent-%COMP%] .result-icon[_ngcontent-%COMP%], \n.result-hero.pending[_ngcontent-%COMP%] .result-icon[_ngcontent-%COMP%] { color: var(--test-primary); }\n\n.result-pulse[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 100px;\n height: 100px;\n border-radius: 50%;\n background: rgba(59, 130, 246, 0.2);\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.5; }\n 50% { transform: translate(-50%, -50%) scale(1.2); opacity: 0; }\n}\n\n.result-text[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: clamp(24px, 5vw, 32px);\n font-weight: 800;\n color: var(--test-text);\n}\n\n.result-details[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.result-score[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--test-text-secondary);\n}\n\n.result-divider[_ngcontent-%COMP%] {\n color: var(--test-border);\n}\n\n.result-checks[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--test-text-muted);\n}\n\n\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n gap: 12px;\n}\n\n.section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 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.section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--test-primary);\n}\n\n.section-header.error[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--test-error);\n}\n\n.check-summary[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--test-text-secondary);\n}\n\n\n\n.check-results[_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.check-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.check-item[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 14px 16px;\n border-radius: var(--test-radius-md);\n border: 1px solid var(--test-border);\n transition: var(--test-transition);\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease-out backwards;\n}\n\n.check-item[_ngcontent-%COMP%]:hover {\n transform: translateX(4px);\n}\n\n.check-item.passed[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f0fdf4 0%, #dcfce7 100%);\n border-color: #86efac;\n}\n\n.check-item.failed[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);\n border-color: #fca5a5;\n}\n\n.check-status[_ngcontent-%COMP%] {\n font-size: 20px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.check-item.passed[_ngcontent-%COMP%] .check-status[_ngcontent-%COMP%] { color: var(--test-success); }\n.check-item.failed[_ngcontent-%COMP%] .check-status[_ngcontent-%COMP%] { color: var(--test-error); }\n\n.check-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.check-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--test-text);\n margin-bottom: 4px;\n}\n\n.check-message[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--test-text-secondary);\n line-height: 1.5;\n word-wrap: break-word;\n}\n\n.check-weight[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--test-text-muted);\n flex-shrink: 0;\n text-align: right;\n}\n\n.weight-label[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n\n\n.comparison-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.comparison-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}\n\n.comparison-tab[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 16px;\n border: none;\n background: transparent;\n color: var(--test-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n border-radius: var(--test-radius-sm);\n transition: var(--test-transition);\n}\n\n.comparison-tab[_ngcontent-%COMP%]:hover {\n color: var(--test-text);\n background: rgba(0, 0, 0, 0.05);\n}\n\n.comparison-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.comparison-content[_ngcontent-%COMP%] {\n border-radius: var(--test-radius-md);\n overflow: hidden;\n border: 1px solid var(--test-border);\n}\n\n\n\n\n\n.details-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.details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 12px;\n}\n\n.detail-card[_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 transition: var(--test-transition);\n}\n\n.detail-card.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.detail-card.clickable[_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.detail-icon[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--test-bg);\n border-radius: var(--test-radius-md);\n color: var(--test-primary);\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.detail-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.detail-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 margin-bottom: 4px;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--test-text);\n word-wrap: break-word;\n font-weight: 500;\n}\n\n.detail-value.monospace[_ngcontent-%COMP%] {\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 12px;\n}\n\n.detail-value.link[_ngcontent-%COMP%] {\n color: var(--test-primary);\n}\n\n.detail-action[_ngcontent-%COMP%] {\n color: var(--test-text-muted);\n font-size: 12px;\n transition: var(--test-transition);\n}\n\n.detail-card.clickable[_ngcontent-%COMP%]:hover .detail-action[_ngcontent-%COMP%] {\n color: var(--test-primary);\n}\n\n\n\n.error-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.error-content[_ngcontent-%COMP%] {\n border-radius: var(--test-radius-md);\n overflow: hidden;\n border: 1px solid #fca5a5;\n}\n\n\n\n.result-details-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.result-details-content[_ngcontent-%COMP%] {\n border-radius: var(--test-radius-md);\n overflow: hidden;\n border: 1px solid var(--test-border);\n}\n\n\n\n\n\n.ai-runs-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.ai-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.count-badge[_ngcontent-%COMP%] {\n background: var(--test-bg);\n color: var(--test-text-secondary);\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.ai-run-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.ai-run-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 16px;\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.ai-run-card[_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.ai-run-icon[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\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 color: white;\n border-radius: var(--test-radius-md);\n font-size: 18px;\n flex-shrink: 0;\n box-shadow: var(--test-shadow-sm);\n}\n\n.ai-run-icon.agent[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, var(--test-primary) 0%, var(--test-primary-dark) 100%);\n}\n\n.ai-run-icon.prompt[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #9333ea 0%, #7c3aed 100%);\n}\n\n.ai-run-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.ai-run-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--test-text);\n margin-bottom: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ai-run-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n font-size: 12px;\n color: var(--test-text-secondary);\n flex-wrap: wrap;\n}\n\n.status-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-chip.complete[_ngcontent-%COMP%], \n.status-chip.completed[_ngcontent-%COMP%], \n.status-chip.passed[_ngcontent-%COMP%] {\n background: var(--test-success-light);\n color: #059669;\n}\n\n.status-chip.failed[_ngcontent-%COMP%], \n.status-chip.error[_ngcontent-%COMP%] {\n background: var(--test-error-light);\n color: #dc2626;\n}\n\n.status-chip.running[_ngcontent-%COMP%] {\n background: #dbeafe;\n color: var(--test-primary);\n}\n\n.cost-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n color: var(--test-text-muted);\n}\n\n.ai-run-arrow[_ngcontent-%COMP%] {\n color: var(--test-text-muted);\n font-size: 14px;\n transition: var(--test-transition);\n}\n\n.ai-run-card[_ngcontent-%COMP%]:hover .ai-run-arrow[_ngcontent-%COMP%] {\n color: var(--test-primary);\n transform: translateX(2px);\n}\n\n\n\n\n\n.feedback-tab[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease-out;\n}\n\n.feedback-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.feedback-item[_ngcontent-%COMP%] {\n padding: 20px;\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n border: 1px solid var(--test-border);\n box-shadow: var(--test-shadow-sm);\n transition: var(--test-transition);\n}\n\n.feedback-item[_ngcontent-%COMP%]:hover {\n border-color: var(--test-primary-light);\n}\n\n.feedback-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.feedback-user[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.user-avatar[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--test-bg);\n border-radius: 50%;\n color: var(--test-primary);\n font-size: 14px;\n}\n\n.user-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--test-text);\n}\n\n.feedback-date[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--test-text-muted);\n}\n\n.feedback-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.feedback-rating[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.rating-stars[_ngcontent-%COMP%] {\n display: flex;\n gap: 2px;\n}\n\n.rating-stars[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--test-border);\n}\n\n.rating-stars[_ngcontent-%COMP%] i.filled[_ngcontent-%COMP%] {\n color: #fbbf24;\n}\n\n.rating-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--test-text);\n}\n\n.feedback-verdict[_ngcontent-%COMP%] {\n display: flex;\n}\n\n.verdict-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.verdict-badge.correct[_ngcontent-%COMP%] {\n background: var(--test-success-light);\n color: #059669;\n}\n\n.verdict-badge.incorrect[_ngcontent-%COMP%] {\n background: var(--test-error-light);\n color: #dc2626;\n}\n\n.feedback-comments[_ngcontent-%COMP%] {\n padding: 14px;\n background: var(--test-bg);\n border-radius: var(--test-radius-md);\n border-left: 3px solid var(--test-primary);\n}\n\n.feedback-comments[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n line-height: 1.6;\n color: var(--test-text);\n}\n\n\n\n\n\n.log-tab[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0;\n height: 100%;\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease-out;\n}\n\n.log-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--test-surface);\n padding: 16px 20px;\n border-radius: var(--test-radius-lg) var(--test-radius-lg) 0 0;\n border: 1px solid var(--test-border);\n border-bottom: none;\n}\n\n.log-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.log-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--test-text-secondary);\n font-size: 16px;\n}\n\n.log-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: var(--test-text);\n}\n\n.log-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.log-container[_ngcontent-%COMP%] {\n flex: 1;\n border-radius: 0 0 var(--test-radius-lg) var(--test-radius-lg);\n overflow: hidden;\n min-height: 300px;\n border: 1px solid var(--test-border);\n border-top: none;\n}\n\n\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n padding: 20px;\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.skeleton-avatar[_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}\n\n.skeleton-avatar[_ngcontent-%COMP%] {\n border-radius: 50%;\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.medium[_ngcontent-%COMP%] { width: 55%; }\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\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%] h3[_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;\n font-size: 14px;\n color: var(--test-text-secondary);\n max-width: 300px;\n}\n\n\n\n\n\n.shortcuts-hint[_ngcontent-%COMP%] {\n position: fixed;\n bottom: 20px;\n right: 20px;\n z-index: 100;\n}\n\n.shortcuts-hint[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--test-surface);\n border: 1px solid var(--test-border);\n border-radius: 50%;\n color: var(--test-text-muted);\n font-size: 16px;\n cursor: pointer;\n box-shadow: var(--test-shadow-md);\n transition: var(--test-transition);\n}\n\n.shortcuts-hint[_ngcontent-%COMP%]:hover > i[_ngcontent-%COMP%] {\n color: var(--test-primary);\n border-color: var(--test-primary-light);\n}\n\n.shortcuts-popup[_ngcontent-%COMP%] {\n display: none;\n position: absolute;\n bottom: 50px;\n right: 0;\n background: var(--test-surface);\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-md);\n padding: 16px;\n box-shadow: var(--test-shadow-lg);\n min-width: 200px;\n}\n\n.shortcuts-hint[_ngcontent-%COMP%]:hover .shortcuts-popup[_ngcontent-%COMP%] {\n display: block;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}\n\n.shortcuts-popup[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--test-text);\n}\n\n.shortcuts-popup[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.shortcuts-popup[_ngcontent-%COMP%] li[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 6px 0;\n font-size: 13px;\n color: var(--test-text-secondary);\n}\n\n.shortcuts-popup[_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, 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(3, 1fr);\n }\n\n .details-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .shortcuts-hint[_ngcontent-%COMP%] {\n display: none;\n }\n}\n\n\n\n\n\n@media (max-width: 768px) {\n .test-run-form[_ngcontent-%COMP%] {\n height: auto;\n min-height: 100%;\n }\n\n .test-run-header[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .breadcrumb[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n }\n\n .breadcrumb[_ngcontent-%COMP%] ol[_ngcontent-%COMP%] {\n font-size: 12px;\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 .status-indicator[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n font-size: 20px;\n }\n\n .test-run-info[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n\n .test-run-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-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n font-size: 14px;\n }\n\n .metric-value[_ngcontent-%COMP%] {\n font-size: 14px;\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 .shortcut-hint[_ngcontent-%COMP%] {\n display: none;\n }\n\n .tab-content[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .result-hero[_ngcontent-%COMP%] {\n padding: 24px 20px;\n }\n\n .result-icon[_ngcontent-%COMP%] {\n width: 64px;\n height: 64px;\n font-size: 32px;\n }\n\n .result-text[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n font-size: 24px;\n }\n\n .result-score[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .check-results[_ngcontent-%COMP%], \n .comparison-section[_ngcontent-%COMP%], \n .ai-section[_ngcontent-%COMP%], \n .feedback-item[_ngcontent-%COMP%] {\n padding: 18px;\n }\n\n .check-item[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .comparison-tabs[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 4px;\n }\n\n .comparison-tab[_ngcontent-%COMP%] {\n text-align: center;\n }\n\n .details-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .detail-card[_ngcontent-%COMP%] {\n padding: 14px;\n }\n\n .ai-run-card[_ngcontent-%COMP%] {\n padding: 14px;\n }\n\n .ai-run-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: 16px;\n }\n\n .ai-run-meta[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 4px;\n }\n\n .feedback-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .log-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .log-actions[_ngcontent-%COMP%] {\n justify-content: stretch;\n }\n\n .log-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex: 1;\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-run-header[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .header-left[_ngcontent-%COMP%] {\n gap: 12px;\n }\n\n .status-indicator[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: 18px;\n border-radius: 8px;\n }\n\n .test-run-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 .metric-card[_ngcontent-%COMP%] {\n padding: 10px;\n flex-direction: column;\n text-align: center;\n }\n\n .metric-icon[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n }\n\n .metric-label[_ngcontent-%COMP%] {\n font-size: 9px;\n }\n\n .metric-value[_ngcontent-%COMP%] {\n font-size: 14px;\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 .result-hero[_ngcontent-%COMP%] {\n padding: 20px 16px;\n }\n\n .result-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n font-size: 28px;\n }\n\n .result-text[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n font-size: 20px;\n }\n\n .result-score[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .result-checks[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .check-item[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 8px;\n }\n\n .check-weight[_ngcontent-%COMP%] {\n text-align: left;\n }\n}\n\n\n\n\n\n@media (hover: none) and (pointer: coarse) {\n .tab[_ngcontent-%COMP%], \n .comparison-tab[_ngcontent-%COMP%], \n .ai-run-card[_ngcontent-%COMP%], \n .check-item[_ngcontent-%COMP%], \n .feedback-item[_ngcontent-%COMP%], \n .detail-card.clickable[_ngcontent-%COMP%] {\n -webkit-tap-highlight-color: transparent;\n }\n\n .ai-run-card[_ngcontent-%COMP%]:active, \n .detail-card.clickable[_ngcontent-%COMP%]:active {\n background: rgba(37, 99, 235, 0.1);\n transform: scale(0.98);\n }\n\n .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 .ai-run-card[_ngcontent-%COMP%], \n .detail-card[_ngcontent-%COMP%] {\n min-height: 64px;\n }\n}\n\n\n\n\n\n@media (prefers-contrast: high) {\n .status-badge[_ngcontent-%COMP%] {\n border: 2px solid currentColor;\n }\n\n .check-item[_ngcontent-%COMP%] {\n border-width: 2px;\n }\n\n .tab.active[_ngcontent-%COMP%] {\n border-bottom-width: 4px;\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-avatar[_ngcontent-%COMP%], \n .skeleton-line[_ngcontent-%COMP%] {\n animation: none;\n background: #e2e8f0;\n }\n\n .result-pulse[_ngcontent-%COMP%] {\n animation: none;\n display: none;\n }\n}\n\n\n\n\n\n@media print {\n .test-run-form[_ngcontent-%COMP%] {\n background: white;\n height: auto;\n }\n\n .header-actions[_ngcontent-%COMP%], \n .tabs-container[_ngcontent-%COMP%], \n .shortcuts-hint[_ngcontent-%COMP%], \n .log-actions[_ngcontent-%COMP%] {\n display: none !important;\n }\n\n .tab-content[_ngcontent-%COMP%] {\n overflow: visible;\n padding: 0;\n }\n\n .result-hero[_ngcontent-%COMP%], \n .check-results[_ngcontent-%COMP%], \n .details-grid[_ngcontent-%COMP%], \n .ai-section[_ngcontent-%COMP%], \n .feedback-item[_ngcontent-%COMP%] {\n break-inside: avoid;\n box-shadow: none;\n border: 1px solid #ddd;\n }\n\n .comparison-content[_ngcontent-%COMP%], \n .log-container[_ngcontent-%COMP%] {\n max-height: none;\n overflow: visible;\n }\n}\n\n\n\n\n\n.tags-bar[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding: 8px 14px;\n background: linear-gradient(135deg, rgba(37, 99, 235, 0.04) 0%, rgba(37, 99, 235, 0.08) 100%);\n border: 1px solid rgba(37, 99, 235, 0.15);\n border-radius: 8px;\n max-width: 600px;\n}\n\n.tags-bar-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.tags-bar-label[_ngcontent-%COMP%] {\n color: var(--test-text-secondary);\n font-size: 14px;\n}\n\n.tags-bar-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n opacity: 0.6;\n}\n\n.tags-bar-chips[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n flex: 1;\n}\n\n.tag-inline[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 4px 10px;\n background: rgba(37, 99, 235, 0.1);\n color: var(--test-primary);\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n letter-spacing: 0.01em;\n}\n\n.tags-bar-empty[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--test-text-secondary);\n opacity: 0.7;\n flex: 1;\n}\n\n.tags-bar-edit[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: transparent;\n border: 1px dashed var(--test-border);\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n color: var(--test-text-secondary);\n cursor: pointer;\n transition: var(--test-transition);\n}\n\n.tags-bar-edit[_ngcontent-%COMP%]:hover {\n border-color: var(--test-primary);\n color: var(--test-primary);\n background: rgba(37, 99, 235, 0.05);\n}\n\n.tags-bar-edit[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n\n\n.tags-editor-panel[_ngcontent-%COMP%] {\n margin-top: 16px;\n background: var(--test-surface);\n border: 1px solid var(--test-primary);\n border-radius: var(--test-radius-md);\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(37, 99, 235, 0.1);\n max-width: 600px;\n}\n\n.tags-editor-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n background: rgba(37, 99, 235, 0.08);\n border-bottom: 1px solid rgba(37, 99, 235, 0.2);\n}\n\n.tags-editor-title[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--test-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.tags-editor-body[_ngcontent-%COMP%] {\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.tags-editor-chips[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n min-height: 32px;\n}\n\n.tag-editable[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 8px 5px 12px;\n background: var(--test-surface);\n border: 1px solid var(--test-primary);\n color: var(--test-primary);\n border-radius: 14px;\n font-size: 12px;\n font-weight: 500;\n}\n\n.tag-remove-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n background: transparent;\n border: none;\n color: var(--test-primary);\n cursor: pointer;\n border-radius: 50%;\n font-size: 9px;\n opacity: 0.6;\n transition: var(--test-transition);\n}\n\n.tag-remove-btn[_ngcontent-%COMP%]:hover {\n opacity: 1;\n background: var(--test-error-light);\n color: var(--test-error);\n}\n\n.tags-empty-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--test-text-secondary);\n font-style: italic;\n padding: 4px 0;\n}\n\n.tags-editor-input[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.tag-text-input[_ngcontent-%COMP%] {\n flex: 1;\n padding: 10px 14px;\n border: 1px solid var(--test-border);\n border-radius: 8px;\n font-size: 13px;\n background: var(--test-bg);\n}\n\n.tag-text-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--test-primary);\n background: var(--test-surface);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.tag-text-input[_ngcontent-%COMP%]::placeholder {\n color: var(--test-text-secondary);\n opacity: 0.6;\n}\n\n.tags-editor-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-start;\n gap: 8px;\n padding: 12px 16px;\n background: var(--test-bg);\n border-top: 1px solid var(--test-border);\n}\n\n\n\n@media (max-width: 768px) {\n .tags-bar[_ngcontent-%COMP%] {\n padding: 8px 12px;\n }\n\n .tags-bar-content[_ngcontent-%COMP%] {\n gap: 8px;\n }\n\n .tag-inline[_ngcontent-%COMP%] {\n padding: 3px 8px;\n font-size: 10px;\n }\n\n .tags-editor-panel[_ngcontent-%COMP%] {\n margin-top: 12px;\n }\n\n .tags-editor-body[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .tags-editor-footer[_ngcontent-%COMP%] {\n padding: 10px 12px;\n }\n}"], changeDetection: 0 }); }
|
|
1573
1573
|
};
|
|
1574
|
-
|
|
1574
|
+
MJTestRunFormComponentExtended = __decorate([
|
|
1575
1575
|
RegisterClass(BaseFormComponent, 'MJ: Test Runs')
|
|
1576
|
-
],
|
|
1577
|
-
export {
|
|
1578
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(
|
|
1576
|
+
], MJTestRunFormComponentExtended);
|
|
1577
|
+
export { MJTestRunFormComponentExtended };
|
|
1578
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJTestRunFormComponentExtended, [{
|
|
1579
1579
|
type: Component,
|
|
1580
1580
|
args: [{ standalone: false, selector: 'mj-test-run-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"test-run-form\" [class.is-mobile]=\"false\">\n <!-- Error State -->\n @if (error) {\n <div class=\"error-banner\" (click)=\"retryLoad()\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <span>{{ error }}</span>\n <button class=\"retry-btn\">\n <i class=\"fas fa-redo\"></i> Retry\n </button>\n </div>\n }\n\n <!-- Header Section -->\n <div class=\"test-run-header\" [class]=\"getStatusClass()\">\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 @if (test) {\n <li>\n <i class=\"fas fa-chevron-right separator\"></i>\n <a href=\"javascript:void(0)\" (click)=\"openTest()\">\n <i class=\"fas fa-flask\"></i>\n <span class=\"breadcrumb-text\">{{ test.Name }}</span>\n </a>\n </li>\n }\n <li class=\"current\">\n <i class=\"fas fa-chevron-right separator\"></i>\n <span>Run #{{ record.ID.substring(0, 8) }}</span>\n </li>\n </ol>\n </nav>\n\n <div class=\"header-content\">\n <div class=\"header-left\">\n <!-- Status Indicator -->\n <div class=\"status-indicator\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n </div>\n\n <div class=\"test-run-info\">\n <h1>\n Test Run\n <span class=\"run-id\">#{{ record.ID.substring(0, 8) }}</span>\n </h1>\n <div class=\"test-run-meta\">\n <span class=\"status-badge\" [style.background-color]=\"getStatusColor()\">\n {{ record.Status }}\n </span>\n @if (test) {\n <span class=\"meta-item\">\n <i class=\"fas fa-flask\"></i>\n {{ test.Type }}\n </span>\n }\n @if (autoRefreshEnabled) {\n <span class=\"meta-item\">\n <i class=\"fas fa-sync-alt fa-spin\"></i>\n Auto-refreshing\n </span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"header-actions\">\n <button kendoButton (click)=\"reRunTest()\" [disabled]=\"!record.TestID\" title=\"Re-run this test (Cmd+Shift+R)\">\n <i class=\"fas fa-redo\"></i>\n <span class=\"btn-text\">Re-run</span>\n </button>\n <button kendoButton (click)=\"refresh()\" [disabled]=\"isRefreshing\" title=\"Refresh (Cmd+R)\">\n <i class=\"fas fa-sync-alt\" [class.fa-spin]=\"isRefreshing\"></i>\n <span class=\"btn-text\">Refresh</span>\n </button>\n </div>\n </div>\n\n <!-- Metrics Bar -->\n <div class=\"metrics-bar\">\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Started</div>\n <div class=\"metric-value\">{{ getRelativeTime(record.StartedAt) }}</div>\n <div class=\"metric-detail\">{{ record.StartedAt | date:'short' }}</div>\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-stopwatch\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Duration</div>\n <div class=\"metric-value\">{{ calculateDuration() }}</div>\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-star\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Score</div>\n <div class=\"metric-value\">{{ formatScore(record.Score) }}</div>\n @if (record.Score != null) {\n <div class=\"metric-progress\">\n <div class=\"progress-bar\" [style.width.%]=\"getScorePercentage()\" [style.background-color]=\"getStatusColor()\"></div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-check-double\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Checks</div>\n <div class=\"metric-value\">{{ record.PassedChecks }}/{{ record.TotalChecks }}</div>\n @if (record.TotalChecks) {\n <div class=\"metric-progress\">\n <div class=\"progress-bar\" [style.width.%]=\"getPassRatePercentage()\" [style.background-color]=\"getStatusColor()\"></div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Cost</div>\n <div class=\"metric-value\">{{ formatCost(record.CostUSD) }}</div>\n </div>\n </div>\n </div>\n\n <!-- Secondary Info -->\n @if (record.RunByUser || testSuiteRun || record.TargetLogEntityID) {\n <div class=\"secondary-info\">\n @if (record.RunByUser) {\n <span class=\"info-chip\">\n <i class=\"fas fa-user\"></i>\n {{ record.RunByUser }}\n </span>\n }\n @if (testSuiteRun) {\n <span class=\"info-chip clickable\" (click)=\"openTestSuiteRun()\">\n <i class=\"fas fa-layer-group\"></i>\n Part of Suite Run (Seq: {{ record.Sequence }})\n </span>\n }\n <!-- Target Entity Link Pill -->\n @if (record.TargetLogEntityID && record.TargetLogID) {\n <mj-entity-link-pill\n [entityName]=\"record.TargetLogEntity\"\n [recordId]=\"record.TargetLogID\">\n </mj-entity-link-pill>\n }\n </div>\n }\n\n <!-- Tags Section - Sleek inline design -->\n @if (!editingTags) {\n <div class=\"tags-bar\">\n <div class=\"tags-bar-content\">\n <span class=\"tags-bar-label\"><i class=\"fas fa-tags\"></i></span>\n @if (tags.length > 0) {\n <div class=\"tags-bar-chips\">\n @for (tag of tags; track tag) {\n <span class=\"tag-inline\">{{ tag }}</span>\n }\n </div>\n }\n @if (tags.length === 0) {\n <span class=\"tags-bar-empty\">No tags</span>\n }\n <button class=\"tags-bar-edit\" (click)=\"startEditingTags()\" title=\"Edit tags\">\n <i class=\"fas fa-plus\"></i> Add\n </button>\n </div>\n </div>\n }\n\n <!-- Tags Editor - Expanded when editing -->\n @if (editingTags) {\n <div class=\"tags-editor-panel\">\n <div class=\"tags-editor-header\">\n <span class=\"tags-editor-title\"><i class=\"fas fa-tags\"></i> Edit Tags</span>\n </div>\n <div class=\"tags-editor-body\">\n <div class=\"tags-editor-chips\">\n @for (tag of tags; track tag) {\n <span class=\"tag-editable\">\n {{ tag }}\n <button class=\"tag-remove-btn\" (click)=\"removeTag(tag)\" title=\"Remove tag\">\n <i class=\"fas fa-times\"></i>\n </button>\n </span>\n }\n @if (tags.length === 0) {\n <span class=\"tags-empty-hint\">No tags yet</span>\n }\n </div>\n <div class=\"tags-editor-input\">\n <input type=\"text\"\n [(ngModel)]=\"newTag\"\n placeholder=\"Type a tag and press Enter...\"\n (keyup.enter)=\"addTag()\"\n class=\"tag-text-input\" />\n <button kendoButton (click)=\"addTag()\" [disabled]=\"!newTag.trim()\" fillMode=\"flat\">\n <i class=\"fas fa-plus\"></i>\n </button>\n </div>\n </div>\n <div class=\"tags-editor-footer\">\n <button kendoButton (click)=\"saveTags()\" themeColor=\"primary\" [disabled]=\"savingTags\">\n @if (savingTags) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n {{ savingTags ? 'Saving...' : 'Save' }}\n </button>\n <button kendoButton (click)=\"cancelEditingTags()\" fillMode=\"flat\">Cancel</button>\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\" [class.active]=\"activeTab === 'overview'\" (click)=\"changeTab('overview')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'overview'\" title=\"Press 1\">\n <i class=\"fas fa-chart-pie\"></i>\n <span>Overview</span>\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'details'\" (click)=\"changeTab('details')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'details'\" title=\"Press 2\">\n <i class=\"fas fa-info-circle\"></i>\n <span>Details</span>\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'ai-runs'\" (click)=\"changeTab('ai-runs')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'ai-runs'\" title=\"Press 3\">\n <i class=\"fas fa-robot\"></i>\n <span>AI Runs</span>\n @if (aiRunsLoaded) {\n <span class=\"tab-badge\">{{ aiAgentRuns.length + aiPromptRuns.length }}</span>\n }\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'feedback'\" (click)=\"changeTab('feedback')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'feedback'\" title=\"Press 4\">\n <i class=\"fas fa-comments\"></i>\n <span>Feedback</span>\n @if (feedbackLoaded) {\n <span class=\"tab-badge\">{{ feedbacks.length }}</span>\n }\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'execution'\" (click)=\"changeTab('execution')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'execution'\" title=\"Press 5\">\n <i class=\"fas fa-microchip\"></i>\n <span>Execution</span>\n </button>\n @if (record.Log) {\n <button class=\"tab\" [class.active]=\"activeTab === 'log'\" (click)=\"changeTab('log')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'log'\" title=\"Press 6\">\n <i class=\"fas fa-terminal\"></i>\n <span>Log</span>\n </button>\n }\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\" [@fadeIn]>\n <!-- Result Hero -->\n <div class=\"result-hero\" [class]=\"getStatusClass()\">\n <div class=\"result-icon-wrapper\">\n <div class=\"result-icon\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n </div>\n @if (record.Status === 'Running') {\n <div class=\"result-pulse\"></div>\n }\n </div>\n <div class=\"result-text\">\n <h2>TEST {{ record.Status.toUpperCase() }}</h2>\n <div class=\"result-details\">\n <span class=\"result-score\">Score: {{ formatScore(record.Score) }}</span>\n <span class=\"result-divider\">|</span>\n <span class=\"result-checks\">{{ record.PassedChecks }} of {{ record.TotalChecks }} checks passed</span>\n </div>\n </div>\n </div>\n <!-- Check Results -->\n @if (getCheckResults().length > 0) {\n <div class=\"check-results\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-tasks\"></i> Check Results</h3>\n <span class=\"check-summary\">{{ record.PassedChecks }} passed, {{ record.FailedChecks }} failed</span>\n </div>\n <div class=\"check-list\">\n @for (check of getCheckResults(); track check; let i = $index) {\n <div class=\"check-item\"\n [class.passed]=\"check.passed\" [class.failed]=\"!check.passed\"\n [style.animation-delay.ms]=\"i * 50\">\n <div class=\"check-status\">\n <i class=\"fas\" [class.fa-check-circle]=\"check.passed\" [class.fa-times-circle]=\"!check.passed\"></i>\n </div>\n <div class=\"check-content\">\n <div class=\"check-name\">{{ check.name }}</div>\n @if (check.message) {\n <div class=\"check-message\">{{ check.message }}</div>\n }\n </div>\n @if (check.weight) {\n <div class=\"check-weight\">\n <span class=\"weight-label\">Weight:</span> {{ check.weight }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n <!-- Data Comparison -->\n <div class=\"comparison-section\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-exchange-alt\"></i> Data Comparison</h3>\n </div>\n <div class=\"comparison-tabs\">\n <button class=\"comparison-tab\" [class.active]=\"comparisonView === 'input'\" (click)=\"setComparisonView('input')\">\n <i class=\"fas fa-sign-in-alt\"></i> Input\n </button>\n <button class=\"comparison-tab\" [class.active]=\"comparisonView === 'expected'\" (click)=\"setComparisonView('expected')\">\n <i class=\"fas fa-bullseye\"></i> Expected\n </button>\n <button class=\"comparison-tab\" [class.active]=\"comparisonView === 'actual'\" (click)=\"setComparisonView('actual')\">\n <i class=\"fas fa-check-square\"></i> Actual\n </button>\n </div>\n <div class=\"comparison-content\">\n <mj-code-editor\n [value]=\"getComparisonData()\"\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 <!-- Details Tab -->\n @if (activeTab === 'details') {\n <div class=\"details-tab\" [@fadeIn]>\n <div class=\"details-grid\">\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-fingerprint\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Test Run ID</div>\n <div class=\"detail-value monospace\">{{ record.ID }}</div>\n </div>\n </div>\n @if (test) {\n <div class=\"detail-card clickable\" (click)=\"openTest()\">\n <div class=\"detail-icon\"><i class=\"fas fa-flask\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Test</div>\n <div class=\"detail-value link\">{{ test.Name }}</div>\n </div>\n <i class=\"fas fa-external-link-alt detail-action\"></i>\n </div>\n }\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-tag\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Target Type</div>\n <div class=\"detail-value\">{{ record.TargetType || 'N/A' }}</div>\n </div>\n </div>\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-play-circle\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Started At</div>\n <div class=\"detail-value\">{{ record.StartedAt | date:'medium' }}</div>\n </div>\n </div>\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-stop-circle\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Completed At</div>\n <div class=\"detail-value\">{{ record.CompletedAt | date:'medium' }}</div>\n </div>\n </div>\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-hourglass-half\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Duration</div>\n <div class=\"detail-value\">{{ calculateDuration() }}</div>\n </div>\n </div>\n </div>\n <!-- Error Message -->\n @if (record.ErrorMessage) {\n <div class=\"error-section\">\n <div class=\"section-header error\">\n <h3><i class=\"fas fa-exclamation-triangle\"></i> Error Message</h3>\n </div>\n <div class=\"error-content\">\n <mj-code-editor\n [value]=\"record.ErrorMessage\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n }\n <!-- Result Details -->\n @if (parsedData.resultDetails) {\n <div class=\"result-details-section\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-file-code\"></i> Result Details</h3>\n </div>\n <div class=\"result-details-content\">\n <mj-code-editor\n [value]=\"getFormattedResultDetails()\"\n language=\"json\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- AI Runs Tab -->\n @if (activeTab === 'ai-runs') {\n <div class=\"ai-runs-tab\" [@fadeIn]>\n <!-- Loading State -->\n @if (loadingAIRuns) {\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 <!-- AI Agent Runs -->\n @if (!loadingAIRuns && aiAgentRuns.length > 0) {\n <div class=\"ai-section\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-robot\"></i> AI Agent Runs</h3>\n <span class=\"count-badge\">{{ aiAgentRuns.length }}</span>\n </div>\n <div class=\"ai-run-list\">\n @for (run of aiAgentRuns; track run) {\n <div class=\"ai-run-card\" (click)=\"openAIAgentRun(run.ID)\">\n <div class=\"ai-run-icon agent\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <div class=\"ai-run-content\">\n <div class=\"ai-run-name\">{{ run.Agent }}</div>\n <div class=\"ai-run-meta\">\n <span class=\"status-chip\" [class]=\"run.Status.toLowerCase()\">{{ run.Status }}</span>\n @if (run.TotalCost) {\n <span class=\"cost-chip\">\n <i class=\"fas fa-dollar-sign\"></i> {{ run.TotalCost | number:'1.4-4' }}\n </span>\n }\n </div>\n </div>\n <i class=\"fas fa-chevron-right ai-run-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n <!-- AI Prompt Runs -->\n @if (!loadingAIRuns && aiPromptRuns.length > 0) {\n <div class=\"ai-section\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-comment-dots\"></i> AI Prompt Runs</h3>\n <span class=\"count-badge\">{{ aiPromptRuns.length }}</span>\n </div>\n <div class=\"ai-run-list\">\n @for (run of aiPromptRuns; track run) {\n <div class=\"ai-run-card\" (click)=\"openAIPromptRun(run.ID)\">\n <div class=\"ai-run-icon prompt\">\n <i class=\"fas fa-comment-dots\"></i>\n </div>\n <div class=\"ai-run-content\">\n <div class=\"ai-run-name\">{{ run.Prompt || run.Model }}</div>\n <div class=\"ai-run-meta\">\n @if (run.TotalCost) {\n <span class=\"cost-chip\">\n <i class=\"fas fa-dollar-sign\"></i> {{ run.TotalCost | number:'1.4-4' }}\n </span>\n }\n </div>\n </div>\n <i class=\"fas fa-chevron-right ai-run-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (aiRunsLoaded && aiAgentRuns.length === 0 && aiPromptRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <h3>No AI Runs</h3>\n <p>This test execution didn't involve any AI agent or prompt runs.</p>\n </div>\n }\n </div>\n }\n\n <!-- Feedback Tab -->\n @if (activeTab === 'feedback') {\n <div class=\"feedback-tab\" [@fadeIn]>\n <!-- Loading State -->\n @if (loadingFeedback) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-avatar\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n <div class=\"skeleton-line medium\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Feedback List -->\n @if (!loadingFeedback && feedbacks.length > 0) {\n <div class=\"feedback-list\">\n @for (feedback of feedbacks; track feedback) {\n <div class=\"feedback-item\">\n <div class=\"feedback-header\">\n <div class=\"feedback-user\">\n <div class=\"user-avatar\">\n <i class=\"fas fa-user\"></i>\n </div>\n <span class=\"user-name\">{{ feedback.ReviewerUser }}</span>\n </div>\n <div class=\"feedback-date\">\n {{ getRelativeTime(feedback.__mj_CreatedAt) }}\n </div>\n </div>\n <div class=\"feedback-body\">\n <div class=\"feedback-rating\">\n <div class=\"rating-stars\">\n @for (s of [1,2,3,4,5,6,7,8,9,10]; track s) {\n <i class=\"fas fa-star\"\n [class.filled]=\"s <= (feedback.Rating || 0)\"></i>\n }\n </div>\n <span class=\"rating-value\">{{ feedback.Rating }}/10</span>\n </div>\n @if (feedback.IsCorrect !== null) {\n <div class=\"feedback-verdict\">\n <span class=\"verdict-badge\" [class.correct]=\"feedback.IsCorrect\" [class.incorrect]=\"!feedback.IsCorrect\">\n <i class=\"fas\" [class.fa-check]=\"feedback.IsCorrect\" [class.fa-times]=\"!feedback.IsCorrect\"></i>\n {{ feedback.IsCorrect ? 'Marked Correct' : 'Marked Incorrect' }}\n </span>\n </div>\n }\n @if (feedback.CorrectionSummary) {\n <div class=\"feedback-comments\">\n <p>{{ feedback.CorrectionSummary }}</p>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (feedbackLoaded && feedbacks.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-comments\"></i>\n </div>\n <h3>No Feedback Yet</h3>\n <p>No one has reviewed this test run yet. Be the first to provide feedback!</p>\n </div>\n }\n </div>\n }\n\n <!-- Execution Context Tab -->\n @if (activeTab === 'execution') {\n <div class=\"execution-tab\" [@fadeIn]>\n <mj-execution-context\n [machineName]=\"record.MachineName\"\n [machineId]=\"record.MachineID\"\n [runByUserName]=\"record.RunByUserName\"\n [runByUserEmail]=\"record.RunByUserEmail\"\n [runContextDetailsJson]=\"record.RunContextDetails\">\n </mj-execution-context>\n </div>\n }\n\n <!-- Execution Log Tab -->\n @if (activeTab === 'log') {\n <div class=\"log-tab\" [@fadeIn]>\n <div class=\"log-header\">\n <div class=\"log-title\">\n <i class=\"fas fa-terminal\"></i>\n <h3>Execution Log</h3>\n </div>\n <div class=\"log-actions\">\n <button kendoButton (click)=\"copyLogToClipboard()\" look=\"flat\">\n <i class=\"fas fa-copy\"></i>\n <span class=\"btn-text\">Copy</span>\n </button>\n </div>\n </div>\n <div class=\"log-container\">\n <mj-code-editor\n [value]=\"record.Log || ''\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n\n <!-- Keyboard Shortcuts Help (shown on hover of ? icon) -->\n <div class=\"shortcuts-hint\" title=\"Keyboard Shortcuts\">\n <i class=\"fas fa-keyboard\"></i>\n <div class=\"shortcuts-popup\">\n <h4>Keyboard Shortcuts</h4>\n <ul>\n <li><kbd>1-6</kbd> Switch tabs</li>\n <li><kbd>Cmd+R</kbd> Refresh</li>\n <li><kbd>Cmd+Shift+R</kbd> Re-run test</li>\n </ul>\n </div>\n </div>\n</div>\n", styles: ["/* ===========================\n Test Run Form - World-Class UX\n Premium Testing Dashboard 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-timeout: #f97316;\n --test-timeout-light: #ffedd5;\n --test-running: #3b82f6;\n --test-pending: #8b5cf6;\n --test-skipped: #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/* Base Container */\n.test-run-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 Error Banner\n =========================== */\n.error-banner {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 12px 20px;\n background: linear-gradient(135deg, var(--test-error) 0%, #dc2626 100%);\n color: white;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: var(--test-transition);\n animation: slideDown 0.3s ease-out;\n}\n\n.error-banner:hover {\n background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%);\n}\n\n.error-banner i {\n font-size: 16px;\n}\n\n.retry-btn {\n background: rgba(255, 255, 255, 0.2);\n border: 1px solid rgba(255, 255, 255, 0.3);\n color: white;\n padding: 6px 12px;\n border-radius: var(--test-radius-sm);\n cursor: pointer;\n font-size: 12px;\n font-weight: 600;\n transition: var(--test-transition);\n}\n\n.retry-btn:hover {\n background: rgba(255, 255, 255, 0.3);\n}\n\n@keyframes slideDown {\n from {\n transform: translateY(-100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n/* ===========================\n Header Section\n =========================== */\n.test-run-header {\n background: var(--test-surface);\n border-bottom: 1px solid var(--test-border);\n padding: 20px;\n position: relative;\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 flex-wrap: wrap;\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: var(--test-radius-sm);\n transition: var(--test-transition);\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/* Header Content */\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n gap: 16px;\n}\n\n.header-left {\n display: flex;\n gap: 16px;\n flex: 1;\n min-width: 0;\n}\n\n/* Status Indicator */\n.status-indicator {\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.status-indicator:hover {\n transform: scale(1.05);\n}\n\n/* Test Run Info */\n.test-run-info {\n flex: 1;\n min-width: 0;\n}\n\n.test-run-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-run-info h1 .run-id {\n color: var(--test-text-secondary);\n font-weight: 500;\n}\n\n.test-run-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/* Meta Item */\n.meta-item {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 14px;\n color: var(--test-text-secondary);\n}\n\n.meta-item i {\n font-size: 12px;\n}\n\n/* Header Actions */\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.btn-text {\n margin-left: 6px;\n}\n\n/* ===========================\n Metrics Bar\n =========================== */\n.metrics-bar {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.metric-card {\n display: flex;\n align-items: center;\n gap: 12px;\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 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-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--test-surface);\n border-radius: var(--test-radius-sm);\n color: var(--test-primary);\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.metric-content {\n flex: 1;\n min-width: 0;\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: 4px;\n}\n\n.metric-value {\n font-size: 16px;\n font-weight: 700;\n color: var(--test-text);\n}\n\n.metric-detail {\n font-size: 11px;\n color: var(--test-text-muted);\n margin-top: 2px;\n}\n\n/* Progress bar in metric card */\n.metric-progress {\n margin-top: 6px;\n height: 4px;\n background: var(--test-border);\n border-radius: 2px;\n overflow: hidden;\n}\n\n.progress-bar {\n height: 100%;\n border-radius: 2px;\n transition: width 0.5s ease-out;\n}\n\n/* Secondary Info */\n.secondary-info {\n display: flex;\n gap: 12px;\n padding-top: 16px;\n border-top: 1px solid var(--test-border);\n flex-wrap: wrap;\n}\n\n.info-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--test-text-secondary);\n padding: 6px 12px;\n background: var(--test-bg);\n border-radius: 20px;\n transition: var(--test-transition);\n}\n\n.info-chip i {\n font-size: 12px;\n}\n\n.info-chip.clickable {\n cursor: pointer;\n}\n\n.info-chip.clickable:hover {\n background: rgba(37, 99, 235, 0.1);\n color: var(--test-primary);\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 position: relative;\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.shortcut-hint {\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 font-family: -apple-system, BlinkMacSystemFont, sans-serif;\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/* Result Hero Card */\n.result-hero {\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n padding: 32px;\n text-align: center;\n border: 2px solid var(--test-border);\n box-shadow: var(--test-shadow-sm);\n transition: var(--test-transition);\n}\n\n.result-hero.passed {\n background: linear-gradient(135deg, #ecfdf5 0%, var(--test-success-light) 100%);\n border-color: var(--test-success);\n}\n\n.result-hero.failed {\n background: linear-gradient(135deg, #fef2f2 0%, var(--test-error-light) 100%);\n border-color: var(--test-error);\n}\n\n.result-hero.error {\n background: linear-gradient(135deg, #fffbeb 0%, var(--test-warning-light) 100%);\n border-color: var(--test-warning);\n}\n\n.result-hero.timeout {\n background: linear-gradient(135deg, #fff7ed 0%, var(--test-timeout-light) 100%);\n border-color: var(--test-timeout);\n}\n\n.result-hero.running,\n.result-hero.pending {\n background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%);\n border-color: var(--test-primary-light);\n}\n\n.result-icon-wrapper {\n position: relative;\n display: inline-block;\n margin-bottom: 16px;\n}\n\n.result-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--test-surface);\n border-radius: 50%;\n font-size: 40px;\n margin: 0 auto;\n box-shadow: var(--test-shadow-md);\n}\n\n.result-hero.passed .result-icon { color: var(--test-success); }\n.result-hero.failed .result-icon { color: var(--test-error); }\n.result-hero.error .result-icon { color: var(--test-warning); }\n.result-hero.timeout .result-icon { color: var(--test-timeout); }\n.result-hero.running .result-icon,\n.result-hero.pending .result-icon { color: var(--test-primary); }\n\n.result-pulse {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 100px;\n height: 100px;\n border-radius: 50%;\n background: rgba(59, 130, 246, 0.2);\n animation: pulse 2s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.5; }\n 50% { transform: translate(-50%, -50%) scale(1.2); opacity: 0; }\n}\n\n.result-text h2 {\n margin: 0 0 12px 0;\n font-size: clamp(24px, 5vw, 32px);\n font-weight: 800;\n color: var(--test-text);\n}\n\n.result-details {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.result-score {\n font-size: 18px;\n font-weight: 600;\n color: var(--test-text-secondary);\n}\n\n.result-divider {\n color: var(--test-border);\n}\n\n.result-checks {\n font-size: 16px;\n color: var(--test-text-muted);\n}\n\n/* Section Headers */\n.section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n gap: 12px;\n}\n\n.section-header h3 {\n margin: 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.section-header h3 i {\n color: var(--test-primary);\n}\n\n.section-header.error h3 i {\n color: var(--test-error);\n}\n\n.check-summary {\n font-size: 13px;\n color: var(--test-text-secondary);\n}\n\n/* Check Results Section */\n.check-results {\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.check-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.check-item {\n display: flex;\n gap: 12px;\n padding: 14px 16px;\n border-radius: var(--test-radius-md);\n border: 1px solid var(--test-border);\n transition: var(--test-transition);\n animation: fadeIn 0.3s ease-out backwards;\n}\n\n.check-item:hover {\n transform: translateX(4px);\n}\n\n.check-item.passed {\n background: linear-gradient(135deg, #f0fdf4 0%, #dcfce7 100%);\n border-color: #86efac;\n}\n\n.check-item.failed {\n background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);\n border-color: #fca5a5;\n}\n\n.check-status {\n font-size: 20px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.check-item.passed .check-status { color: var(--test-success); }\n.check-item.failed .check-status { color: var(--test-error); }\n\n.check-content {\n flex: 1;\n min-width: 0;\n}\n\n.check-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--test-text);\n margin-bottom: 4px;\n}\n\n.check-message {\n font-size: 13px;\n color: var(--test-text-secondary);\n line-height: 1.5;\n word-wrap: break-word;\n}\n\n.check-weight {\n font-size: 12px;\n color: var(--test-text-muted);\n flex-shrink: 0;\n text-align: right;\n}\n\n.weight-label {\n font-weight: 500;\n}\n\n/* Comparison Section */\n.comparison-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.comparison-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}\n\n.comparison-tab {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 16px;\n border: none;\n background: transparent;\n color: var(--test-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n border-radius: var(--test-radius-sm);\n transition: var(--test-transition);\n}\n\n.comparison-tab:hover {\n color: var(--test-text);\n background: rgba(0, 0, 0, 0.05);\n}\n\n.comparison-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.comparison-content {\n border-radius: var(--test-radius-md);\n overflow: hidden;\n border: 1px solid var(--test-border);\n}\n\n/* ===========================\n Details Tab\n =========================== */\n.details-tab {\n display: flex;\n flex-direction: column;\n gap: 20px;\n animation: fadeIn 0.3s ease-out;\n}\n\n.details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 12px;\n}\n\n.detail-card {\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 transition: var(--test-transition);\n}\n\n.detail-card.clickable {\n cursor: pointer;\n}\n\n.detail-card.clickable:hover {\n background: rgba(37, 99, 235, 0.05);\n border-color: var(--test-primary-light);\n transform: translateX(4px);\n}\n\n.detail-icon {\n width: 44px;\n height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--test-bg);\n border-radius: var(--test-radius-md);\n color: var(--test-primary);\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.detail-content {\n flex: 1;\n min-width: 0;\n}\n\n.detail-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 margin-bottom: 4px;\n}\n\n.detail-value {\n font-size: 14px;\n color: var(--test-text);\n word-wrap: break-word;\n font-weight: 500;\n}\n\n.detail-value.monospace {\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 12px;\n}\n\n.detail-value.link {\n color: var(--test-primary);\n}\n\n.detail-action {\n color: var(--test-text-muted);\n font-size: 12px;\n transition: var(--test-transition);\n}\n\n.detail-card.clickable:hover .detail-action {\n color: var(--test-primary);\n}\n\n/* Error Section */\n.error-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.error-content {\n border-radius: var(--test-radius-md);\n overflow: hidden;\n border: 1px solid #fca5a5;\n}\n\n/* Result Details Section */\n.result-details-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.result-details-content {\n border-radius: var(--test-radius-md);\n overflow: hidden;\n border: 1px solid var(--test-border);\n}\n\n/* ===========================\n AI Runs Tab\n =========================== */\n.ai-runs-tab {\n display: flex;\n flex-direction: column;\n gap: 20px;\n animation: fadeIn 0.3s ease-out;\n}\n\n.ai-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.count-badge {\n background: var(--test-bg);\n color: var(--test-text-secondary);\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.ai-run-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.ai-run-card {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 16px;\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.ai-run-card: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.ai-run-icon {\n width: 44px;\n height: 44px;\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 color: white;\n border-radius: var(--test-radius-md);\n font-size: 18px;\n flex-shrink: 0;\n box-shadow: var(--test-shadow-sm);\n}\n\n.ai-run-icon.agent {\n background: linear-gradient(135deg, var(--test-primary) 0%, var(--test-primary-dark) 100%);\n}\n\n.ai-run-icon.prompt {\n background: linear-gradient(135deg, #9333ea 0%, #7c3aed 100%);\n}\n\n.ai-run-content {\n flex: 1;\n min-width: 0;\n}\n\n.ai-run-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--test-text);\n margin-bottom: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ai-run-meta {\n display: flex;\n gap: 10px;\n font-size: 12px;\n color: var(--test-text-secondary);\n flex-wrap: wrap;\n}\n\n.status-chip {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-chip.complete,\n.status-chip.completed,\n.status-chip.passed {\n background: var(--test-success-light);\n color: #059669;\n}\n\n.status-chip.failed,\n.status-chip.error {\n background: var(--test-error-light);\n color: #dc2626;\n}\n\n.status-chip.running {\n background: #dbeafe;\n color: var(--test-primary);\n}\n\n.cost-chip {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n color: var(--test-text-muted);\n}\n\n.ai-run-arrow {\n color: var(--test-text-muted);\n font-size: 14px;\n transition: var(--test-transition);\n}\n\n.ai-run-card:hover .ai-run-arrow {\n color: var(--test-primary);\n transform: translateX(2px);\n}\n\n/* ===========================\n Feedback Tab\n =========================== */\n.feedback-tab {\n animation: fadeIn 0.3s ease-out;\n}\n\n.feedback-list {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.feedback-item {\n padding: 20px;\n background: var(--test-surface);\n border-radius: var(--test-radius-lg);\n border: 1px solid var(--test-border);\n box-shadow: var(--test-shadow-sm);\n transition: var(--test-transition);\n}\n\n.feedback-item:hover {\n border-color: var(--test-primary-light);\n}\n\n.feedback-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.feedback-user {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.user-avatar {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--test-bg);\n border-radius: 50%;\n color: var(--test-primary);\n font-size: 14px;\n}\n\n.user-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--test-text);\n}\n\n.feedback-date {\n font-size: 12px;\n color: var(--test-text-muted);\n}\n\n.feedback-body {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.feedback-rating {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.rating-stars {\n display: flex;\n gap: 2px;\n}\n\n.rating-stars i {\n font-size: 14px;\n color: var(--test-border);\n}\n\n.rating-stars i.filled {\n color: #fbbf24;\n}\n\n.rating-value {\n font-size: 14px;\n font-weight: 600;\n color: var(--test-text);\n}\n\n.feedback-verdict {\n display: flex;\n}\n\n.verdict-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.verdict-badge.correct {\n background: var(--test-success-light);\n color: #059669;\n}\n\n.verdict-badge.incorrect {\n background: var(--test-error-light);\n color: #dc2626;\n}\n\n.feedback-comments {\n padding: 14px;\n background: var(--test-bg);\n border-radius: var(--test-radius-md);\n border-left: 3px solid var(--test-primary);\n}\n\n.feedback-comments p {\n margin: 0;\n font-size: 14px;\n line-height: 1.6;\n color: var(--test-text);\n}\n\n/* ===========================\n Log Tab\n =========================== */\n.log-tab {\n display: flex;\n flex-direction: column;\n gap: 0;\n height: 100%;\n animation: fadeIn 0.3s ease-out;\n}\n\n.log-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--test-surface);\n padding: 16px 20px;\n border-radius: var(--test-radius-lg) var(--test-radius-lg) 0 0;\n border: 1px solid var(--test-border);\n border-bottom: none;\n}\n\n.log-title {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.log-title i {\n color: var(--test-text-secondary);\n font-size: 16px;\n}\n\n.log-title h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: var(--test-text);\n}\n\n.log-actions {\n display: flex;\n gap: 8px;\n}\n\n.log-container {\n flex: 1;\n border-radius: 0 0 var(--test-radius-lg) var(--test-radius-lg);\n overflow: hidden;\n min-height: 300px;\n border: 1px solid var(--test-border);\n border-top: none;\n}\n\n/* ===========================\n Loading States & Skeletons\n =========================== */\n.loading-state {\n padding: 20px;\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.skeleton-avatar {\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}\n\n.skeleton-avatar {\n border-radius: 50%;\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.medium { width: 55%; }\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/* ===========================\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 h3 {\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;\n font-size: 14px;\n color: var(--test-text-secondary);\n max-width: 300px;\n}\n\n/* ===========================\n Keyboard Shortcuts Help\n =========================== */\n.shortcuts-hint {\n position: fixed;\n bottom: 20px;\n right: 20px;\n z-index: 100;\n}\n\n.shortcuts-hint > i {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--test-surface);\n border: 1px solid var(--test-border);\n border-radius: 50%;\n color: var(--test-text-muted);\n font-size: 16px;\n cursor: pointer;\n box-shadow: var(--test-shadow-md);\n transition: var(--test-transition);\n}\n\n.shortcuts-hint:hover > i {\n color: var(--test-primary);\n border-color: var(--test-primary-light);\n}\n\n.shortcuts-popup {\n display: none;\n position: absolute;\n bottom: 50px;\n right: 0;\n background: var(--test-surface);\n border: 1px solid var(--test-border);\n border-radius: var(--test-radius-md);\n padding: 16px;\n box-shadow: var(--test-shadow-lg);\n min-width: 200px;\n}\n\n.shortcuts-hint:hover .shortcuts-popup {\n display: block;\n animation: fadeIn 0.2s ease-out;\n}\n\n.shortcuts-popup h4 {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--test-text);\n}\n\n.shortcuts-popup ul {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.shortcuts-popup li {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 6px 0;\n font-size: 13px;\n color: var(--test-text-secondary);\n}\n\n.shortcuts-popup 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, 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(3, 1fr);\n }\n\n .details-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .shortcuts-hint {\n display: none;\n }\n}\n\n/* ===========================\n Responsive Design - Mobile\n =========================== */\n@media (max-width: 768px) {\n .test-run-form {\n height: auto;\n min-height: 100%;\n }\n\n .test-run-header {\n padding: 16px;\n }\n\n .breadcrumb {\n margin-bottom: 12px;\n }\n\n .breadcrumb ol {\n font-size: 12px;\n }\n\n .header-content {\n flex-direction: column;\n gap: 16px;\n }\n\n .header-left {\n width: 100%;\n }\n\n .status-indicator {\n width: 48px;\n height: 48px;\n font-size: 20px;\n }\n\n .test-run-info h1 {\n font-size: 18px;\n }\n\n .test-run-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-icon {\n width: 36px;\n height: 36px;\n font-size: 14px;\n }\n\n .metric-value {\n font-size: 14px;\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 .shortcut-hint {\n display: none;\n }\n\n .tab-content {\n padding: 16px;\n }\n\n .result-hero {\n padding: 24px 20px;\n }\n\n .result-icon {\n width: 64px;\n height: 64px;\n font-size: 32px;\n }\n\n .result-text h2 {\n font-size: 24px;\n }\n\n .result-score {\n font-size: 16px;\n }\n\n .check-results,\n .comparison-section,\n .ai-section,\n .feedback-item {\n padding: 18px;\n }\n\n .check-item {\n padding: 12px;\n }\n\n .comparison-tabs {\n flex-direction: column;\n gap: 4px;\n }\n\n .comparison-tab {\n text-align: center;\n }\n\n .details-grid {\n grid-template-columns: 1fr;\n }\n\n .detail-card {\n padding: 14px;\n }\n\n .ai-run-card {\n padding: 14px;\n }\n\n .ai-run-icon {\n width: 40px;\n height: 40px;\n font-size: 16px;\n }\n\n .ai-run-meta {\n flex-direction: column;\n gap: 4px;\n }\n\n .feedback-header {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .log-header {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .log-actions {\n justify-content: stretch;\n }\n\n .log-actions button {\n flex: 1;\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-run-header {\n padding: 12px;\n }\n\n .header-left {\n gap: 12px;\n }\n\n .status-indicator {\n width: 40px;\n height: 40px;\n font-size: 18px;\n border-radius: 8px;\n }\n\n .test-run-info h1 {\n font-size: 16px;\n }\n\n .metrics-bar {\n grid-template-columns: 1fr 1fr;\n }\n\n .metric-card {\n padding: 10px;\n flex-direction: column;\n text-align: center;\n }\n\n .metric-icon {\n margin-bottom: 8px;\n }\n\n .metric-label {\n font-size: 9px;\n }\n\n .metric-value {\n font-size: 14px;\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 .result-hero {\n padding: 20px 16px;\n }\n\n .result-icon {\n width: 56px;\n height: 56px;\n font-size: 28px;\n }\n\n .result-text h2 {\n font-size: 20px;\n }\n\n .result-score {\n font-size: 14px;\n }\n\n .result-checks {\n font-size: 12px;\n }\n\n .section-header h3 {\n font-size: 16px;\n }\n\n .check-item {\n flex-direction: column;\n gap: 8px;\n }\n\n .check-weight {\n text-align: left;\n }\n}\n\n/* ===========================\n Touch Device Optimizations\n =========================== */\n@media (hover: none) and (pointer: coarse) {\n .tab,\n .comparison-tab,\n .ai-run-card,\n .check-item,\n .feedback-item,\n .detail-card.clickable {\n -webkit-tap-highlight-color: transparent;\n }\n\n .ai-run-card:active,\n .detail-card.clickable:active {\n background: rgba(37, 99, 235, 0.1);\n transform: scale(0.98);\n }\n\n .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 .ai-run-card,\n .detail-card {\n min-height: 64px;\n }\n}\n\n/* ===========================\n High Contrast Mode\n =========================== */\n@media (prefers-contrast: high) {\n .status-badge {\n border: 2px solid currentColor;\n }\n\n .check-item {\n border-width: 2px;\n }\n\n .tab.active {\n border-bottom-width: 4px;\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-avatar,\n .skeleton-line {\n animation: none;\n background: #e2e8f0;\n }\n\n .result-pulse {\n animation: none;\n display: none;\n }\n}\n\n/* ===========================\n Print Styles\n =========================== */\n@media print {\n .test-run-form {\n background: white;\n height: auto;\n }\n\n .header-actions,\n .tabs-container,\n .shortcuts-hint,\n .log-actions {\n display: none !important;\n }\n\n .tab-content {\n overflow: visible;\n padding: 0;\n }\n\n .result-hero,\n .check-results,\n .details-grid,\n .ai-section,\n .feedback-item {\n break-inside: avoid;\n box-shadow: none;\n border: 1px solid #ddd;\n }\n\n .comparison-content,\n .log-container {\n max-height: none;\n overflow: visible;\n }\n}\n\n/* ===========================\n Tags Bar - Sleek Inline Display\n =========================== */\n.tags-bar {\n margin-top: 16px;\n padding: 8px 14px;\n background: linear-gradient(135deg, rgba(37, 99, 235, 0.04) 0%, rgba(37, 99, 235, 0.08) 100%);\n border: 1px solid rgba(37, 99, 235, 0.15);\n border-radius: 8px;\n max-width: 600px;\n}\n\n.tags-bar-content {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.tags-bar-label {\n color: var(--test-text-secondary);\n font-size: 14px;\n}\n\n.tags-bar-label i {\n opacity: 0.6;\n}\n\n.tags-bar-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n flex: 1;\n}\n\n.tag-inline {\n display: inline-flex;\n align-items: center;\n padding: 4px 10px;\n background: rgba(37, 99, 235, 0.1);\n color: var(--test-primary);\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n letter-spacing: 0.01em;\n}\n\n.tags-bar-empty {\n font-size: 12px;\n color: var(--test-text-secondary);\n opacity: 0.7;\n flex: 1;\n}\n\n.tags-bar-edit {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: transparent;\n border: 1px dashed var(--test-border);\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n color: var(--test-text-secondary);\n cursor: pointer;\n transition: var(--test-transition);\n}\n\n.tags-bar-edit:hover {\n border-color: var(--test-primary);\n color: var(--test-primary);\n background: rgba(37, 99, 235, 0.05);\n}\n\n.tags-bar-edit i {\n font-size: 10px;\n}\n\n/* ===========================\n Tags Editor Panel - Expanded Edit Mode\n =========================== */\n.tags-editor-panel {\n margin-top: 16px;\n background: var(--test-surface);\n border: 1px solid var(--test-primary);\n border-radius: var(--test-radius-md);\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(37, 99, 235, 0.1);\n max-width: 600px;\n}\n\n.tags-editor-header {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n background: rgba(37, 99, 235, 0.08);\n border-bottom: 1px solid rgba(37, 99, 235, 0.2);\n}\n\n.tags-editor-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--test-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.tags-editor-body {\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.tags-editor-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n min-height: 32px;\n}\n\n.tag-editable {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 8px 5px 12px;\n background: var(--test-surface);\n border: 1px solid var(--test-primary);\n color: var(--test-primary);\n border-radius: 14px;\n font-size: 12px;\n font-weight: 500;\n}\n\n.tag-remove-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n background: transparent;\n border: none;\n color: var(--test-primary);\n cursor: pointer;\n border-radius: 50%;\n font-size: 9px;\n opacity: 0.6;\n transition: var(--test-transition);\n}\n\n.tag-remove-btn:hover {\n opacity: 1;\n background: var(--test-error-light);\n color: var(--test-error);\n}\n\n.tags-empty-hint {\n font-size: 12px;\n color: var(--test-text-secondary);\n font-style: italic;\n padding: 4px 0;\n}\n\n.tags-editor-input {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.tag-text-input {\n flex: 1;\n padding: 10px 14px;\n border: 1px solid var(--test-border);\n border-radius: 8px;\n font-size: 13px;\n background: var(--test-bg);\n}\n\n.tag-text-input:focus {\n outline: none;\n border-color: var(--test-primary);\n background: var(--test-surface);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.tag-text-input::placeholder {\n color: var(--test-text-secondary);\n opacity: 0.6;\n}\n\n.tags-editor-footer {\n display: flex;\n justify-content: flex-start;\n gap: 8px;\n padding: 12px 16px;\n background: var(--test-bg);\n border-top: 1px solid var(--test-border);\n}\n\n/* Mobile Responsive for Tags */\n@media (max-width: 768px) {\n .tags-bar {\n padding: 8px 12px;\n }\n\n .tags-bar-content {\n gap: 8px;\n }\n\n .tag-inline {\n padding: 3px 8px;\n font-size: 10px;\n }\n\n .tags-editor-panel {\n margin-top: 12px;\n }\n\n .tags-editor-body {\n padding: 12px;\n }\n\n .tags-editor-footer {\n padding: 10px 12px;\n }\n}\n"] }]
|
|
1581
1581
|
}], null, { handleKeyboardShortcut: [{
|
|
1582
1582
|
type: HostListener,
|
|
1583
1583
|
args: ['document:keydown', ['$event']]
|
|
1584
1584
|
}] }); })();
|
|
1585
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(
|
|
1585
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJTestRunFormComponentExtended, { className: "MJTestRunFormComponentExtended", filePath: "src/lib/custom/Tests/test-run-form.component.ts", lineNumber: 36 }); })();
|
|
1586
1586
|
//# sourceMappingURL=test-run-form.component.js.map
|