@memberjunction/ng-dashboards 2.117.0 → 2.119.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/Testing/components/testing-analytics.component.d.ts +56 -0
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -0
- package/dist/Testing/components/testing-analytics.component.js +746 -0
- package/dist/Testing/components/testing-analytics.component.js.map +1 -0
- package/dist/Testing/components/testing-execution.component.d.ts +59 -0
- package/dist/Testing/components/testing-execution.component.d.ts.map +1 -0
- package/dist/Testing/components/testing-execution.component.js +647 -0
- package/dist/Testing/components/testing-execution.component.js.map +1 -0
- package/dist/Testing/components/testing-feedback.component.d.ts +55 -0
- package/dist/Testing/components/testing-feedback.component.d.ts.map +1 -0
- package/dist/Testing/components/testing-feedback.component.js +788 -0
- package/dist/Testing/components/testing-feedback.component.js.map +1 -0
- package/dist/Testing/components/testing-overview.component.d.ts +30 -0
- package/dist/Testing/components/testing-overview.component.d.ts.map +1 -0
- package/dist/Testing/components/testing-overview.component.js +341 -0
- package/dist/Testing/components/testing-overview.component.js.map +1 -0
- package/dist/Testing/components/testing-version-comparison.component.d.ts +58 -0
- package/dist/Testing/components/testing-version-comparison.component.d.ts.map +1 -0
- package/dist/Testing/components/testing-version-comparison.component.js +801 -0
- package/dist/Testing/components/testing-version-comparison.component.js.map +1 -0
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.d.ts +20 -0
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.d.ts.map +1 -0
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +278 -0
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -0
- package/dist/Testing/components/widgets/suite-tree.component.d.ts +28 -0
- package/dist/Testing/components/widgets/suite-tree.component.d.ts.map +1 -0
- package/dist/Testing/components/widgets/suite-tree.component.js +275 -0
- package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -0
- package/dist/Testing/components/widgets/test-run-detail-panel.component.d.ts +34 -0
- package/dist/Testing/components/widgets/test-run-detail-panel.component.d.ts.map +1 -0
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js +371 -0
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -0
- package/dist/Testing/services/testing-instrumentation.service.d.ts +152 -0
- package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -0
- package/dist/Testing/services/testing-instrumentation.service.js +579 -0
- package/dist/Testing/services/testing-instrumentation.service.js.map +1 -0
- package/dist/Testing/testing-dashboard.component.d.ts +52 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -0
- package/dist/Testing/testing-dashboard.component.js +271 -0
- package/dist/Testing/testing-dashboard.component.js.map +1 -0
- package/dist/module.d.ts +30 -20
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +50 -9
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +13 -10
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
import * as i2 from "@angular/forms";
|
|
5
|
+
import * as i3 from "@memberjunction/ng-testing";
|
|
6
|
+
import * as i4 from "./oracle-breakdown-table.component";
|
|
7
|
+
function TestRunDetailPanelComponent_div_0_button_15_Template(rf, ctx) { if (rf & 1) {
|
|
8
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
9
|
+
i0.ɵɵelementStart(0, "button", 35);
|
|
10
|
+
i0.ɵɵlistener("click", function TestRunDetailPanelComponent_div_0_button_15_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onClose()); });
|
|
11
|
+
i0.ɵɵelement(1, "i", 36);
|
|
12
|
+
i0.ɵɵelementEnd();
|
|
13
|
+
} }
|
|
14
|
+
function TestRunDetailPanelComponent_div_0_div_31_Template(rf, ctx) { if (rf & 1) {
|
|
15
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
16
|
+
i0.ɵɵelementStart(0, "div", 14)(1, "div", 15);
|
|
17
|
+
i0.ɵɵtext(2, "Target");
|
|
18
|
+
i0.ɵɵelementEnd();
|
|
19
|
+
i0.ɵɵelementStart(3, "div", 37);
|
|
20
|
+
i0.ɵɵlistener("click", function TestRunDetailPanelComponent_div_0_div_31_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onViewTarget()); });
|
|
21
|
+
i0.ɵɵelement(4, "i", 38);
|
|
22
|
+
i0.ɵɵtext(5);
|
|
23
|
+
i0.ɵɵelementEnd()();
|
|
24
|
+
} if (rf & 2) {
|
|
25
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
26
|
+
i0.ɵɵadvance(5);
|
|
27
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.testRun.targetType, " ");
|
|
28
|
+
} }
|
|
29
|
+
function TestRunDetailPanelComponent_div_0_div_32_Template(rf, ctx) { if (rf & 1) {
|
|
30
|
+
i0.ɵɵelementStart(0, "div", 39);
|
|
31
|
+
i0.ɵɵelement(1, "app-oracle-breakdown-table", 40);
|
|
32
|
+
i0.ɵɵelementEnd();
|
|
33
|
+
} if (rf & 2) {
|
|
34
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
35
|
+
i0.ɵɵadvance();
|
|
36
|
+
i0.ɵɵproperty("results", ctx_r2.oracleResults);
|
|
37
|
+
} }
|
|
38
|
+
function TestRunDetailPanelComponent_div_0_div_33_div_7_Template(rf, ctx) { if (rf & 1) {
|
|
39
|
+
i0.ɵɵelementStart(0, "div", 46)(1, "pre", 47);
|
|
40
|
+
i0.ɵɵtext(2);
|
|
41
|
+
i0.ɵɵelementEnd()();
|
|
42
|
+
} if (rf & 2) {
|
|
43
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
44
|
+
i0.ɵɵadvance(2);
|
|
45
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatJSON(ctx_r2.resultDetails));
|
|
46
|
+
} }
|
|
47
|
+
function TestRunDetailPanelComponent_div_0_div_33_Template(rf, ctx) { if (rf & 1) {
|
|
48
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
49
|
+
i0.ɵɵelementStart(0, "div", 41)(1, "div", 23)(2, "h4");
|
|
50
|
+
i0.ɵɵelement(3, "i", 42);
|
|
51
|
+
i0.ɵɵtext(4, " Result Details ");
|
|
52
|
+
i0.ɵɵelementEnd();
|
|
53
|
+
i0.ɵɵelementStart(5, "button", 43);
|
|
54
|
+
i0.ɵɵlistener("click", function TestRunDetailPanelComponent_div_0_div_33_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleResultDetails()); });
|
|
55
|
+
i0.ɵɵelement(6, "i", 44);
|
|
56
|
+
i0.ɵɵelementEnd()();
|
|
57
|
+
i0.ɵɵtemplate(7, TestRunDetailPanelComponent_div_0_div_33_div_7_Template, 3, 1, "div", 45);
|
|
58
|
+
i0.ɵɵelementEnd();
|
|
59
|
+
} if (rf & 2) {
|
|
60
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
61
|
+
i0.ɵɵadvance(6);
|
|
62
|
+
i0.ɵɵclassProp("fa-chevron-down", !ctx_r2.showResultDetails)("fa-chevron-up", ctx_r2.showResultDetails);
|
|
63
|
+
i0.ɵɵadvance();
|
|
64
|
+
i0.ɵɵproperty("ngIf", ctx_r2.showResultDetails);
|
|
65
|
+
} }
|
|
66
|
+
function TestRunDetailPanelComponent_div_0_Template(rf, ctx) { if (rf & 1) {
|
|
67
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
68
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "h3");
|
|
69
|
+
i0.ɵɵtext(4);
|
|
70
|
+
i0.ɵɵelementEnd();
|
|
71
|
+
i0.ɵɵelementStart(5, "div", 4)(6, "span", 5);
|
|
72
|
+
i0.ɵɵelement(7, "i", 6);
|
|
73
|
+
i0.ɵɵtext(8);
|
|
74
|
+
i0.ɵɵelementEnd();
|
|
75
|
+
i0.ɵɵelementStart(9, "span", 7);
|
|
76
|
+
i0.ɵɵelement(10, "i", 8);
|
|
77
|
+
i0.ɵɵtext(11);
|
|
78
|
+
i0.ɵɵpipe(12, "date");
|
|
79
|
+
i0.ɵɵelementEnd()()();
|
|
80
|
+
i0.ɵɵelementStart(13, "div", 9);
|
|
81
|
+
i0.ɵɵelement(14, "app-test-status-badge", 10);
|
|
82
|
+
i0.ɵɵtemplate(15, TestRunDetailPanelComponent_div_0_button_15_Template, 2, 0, "button", 11);
|
|
83
|
+
i0.ɵɵelementEnd()();
|
|
84
|
+
i0.ɵɵelementStart(16, "div", 12)(17, "div", 13)(18, "div", 14)(19, "div", 15);
|
|
85
|
+
i0.ɵɵtext(20, "Score");
|
|
86
|
+
i0.ɵɵelementEnd();
|
|
87
|
+
i0.ɵɵelement(21, "app-score-indicator", 16);
|
|
88
|
+
i0.ɵɵelementEnd();
|
|
89
|
+
i0.ɵɵelementStart(22, "div", 14)(23, "div", 15);
|
|
90
|
+
i0.ɵɵtext(24, "Cost");
|
|
91
|
+
i0.ɵɵelementEnd();
|
|
92
|
+
i0.ɵɵelement(25, "app-cost-display", 17);
|
|
93
|
+
i0.ɵɵelementEnd();
|
|
94
|
+
i0.ɵɵelementStart(26, "div", 14)(27, "div", 15);
|
|
95
|
+
i0.ɵɵtext(28, "Duration");
|
|
96
|
+
i0.ɵɵelementEnd();
|
|
97
|
+
i0.ɵɵelementStart(29, "div", 18);
|
|
98
|
+
i0.ɵɵtext(30);
|
|
99
|
+
i0.ɵɵelementEnd()();
|
|
100
|
+
i0.ɵɵtemplate(31, TestRunDetailPanelComponent_div_0_div_31_Template, 6, 1, "div", 19);
|
|
101
|
+
i0.ɵɵelementEnd();
|
|
102
|
+
i0.ɵɵtemplate(32, TestRunDetailPanelComponent_div_0_div_32_Template, 2, 1, "div", 20)(33, TestRunDetailPanelComponent_div_0_div_33_Template, 8, 5, "div", 21);
|
|
103
|
+
i0.ɵɵelementStart(34, "div", 22)(35, "div", 23)(36, "h4");
|
|
104
|
+
i0.ɵɵelement(37, "i", 24);
|
|
105
|
+
i0.ɵɵtext(38, " Human Feedback ");
|
|
106
|
+
i0.ɵɵelementEnd()();
|
|
107
|
+
i0.ɵɵelementStart(39, "div", 25)(40, "div", 26)(41, "div", 27)(42, "label");
|
|
108
|
+
i0.ɵɵtext(43, "Rating (1-10)");
|
|
109
|
+
i0.ɵɵelementEnd();
|
|
110
|
+
i0.ɵɵelementStart(44, "input", 28);
|
|
111
|
+
i0.ɵɵtwoWayListener("ngModelChange", function TestRunDetailPanelComponent_div_0_Template_input_ngModelChange_44_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.feedbackRating, $event) || (ctx_r2.feedbackRating = $event); return i0.ɵɵresetView($event); });
|
|
112
|
+
i0.ɵɵelementEnd()();
|
|
113
|
+
i0.ɵɵelementStart(45, "div", 27)(46, "label");
|
|
114
|
+
i0.ɵɵtext(47, "Is Correct?");
|
|
115
|
+
i0.ɵɵelementEnd();
|
|
116
|
+
i0.ɵɵelementStart(48, "div", 29)(49, "label", 30)(50, "input", 31);
|
|
117
|
+
i0.ɵɵtwoWayListener("ngModelChange", function TestRunDetailPanelComponent_div_0_Template_input_ngModelChange_50_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.feedbackIsCorrect, $event) || (ctx_r2.feedbackIsCorrect = $event); return i0.ɵɵresetView($event); });
|
|
118
|
+
i0.ɵɵelementEnd();
|
|
119
|
+
i0.ɵɵelementStart(51, "span");
|
|
120
|
+
i0.ɵɵtext(52, "Yes, the automated result is correct");
|
|
121
|
+
i0.ɵɵelementEnd()()()()();
|
|
122
|
+
i0.ɵɵelementStart(53, "div", 27)(54, "label");
|
|
123
|
+
i0.ɵɵtext(55, "Comments");
|
|
124
|
+
i0.ɵɵelementEnd();
|
|
125
|
+
i0.ɵɵelementStart(56, "textarea", 32);
|
|
126
|
+
i0.ɵɵtwoWayListener("ngModelChange", function TestRunDetailPanelComponent_div_0_Template_textarea_ngModelChange_56_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.feedbackComments, $event) || (ctx_r2.feedbackComments = $event); return i0.ɵɵresetView($event); });
|
|
127
|
+
i0.ɵɵelementEnd()();
|
|
128
|
+
i0.ɵɵelementStart(57, "button", 33);
|
|
129
|
+
i0.ɵɵlistener("click", function TestRunDetailPanelComponent_div_0_Template_button_click_57_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSubmitFeedback()); });
|
|
130
|
+
i0.ɵɵelement(58, "i", 34);
|
|
131
|
+
i0.ɵɵtext(59);
|
|
132
|
+
i0.ɵɵelementEnd()()()()();
|
|
133
|
+
} if (rf & 2) {
|
|
134
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
135
|
+
i0.ɵɵadvance(4);
|
|
136
|
+
i0.ɵɵtextInterpolate(ctx_r2.testRun.testName);
|
|
137
|
+
i0.ɵɵadvance(4);
|
|
138
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.testRun.testType, " ");
|
|
139
|
+
i0.ɵɵadvance(3);
|
|
140
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(12, 19, ctx_r2.testRun.runDateTime, "medium"), " ");
|
|
141
|
+
i0.ɵɵadvance(3);
|
|
142
|
+
i0.ɵɵproperty("status", ctx_r2.testRun.status);
|
|
143
|
+
i0.ɵɵadvance();
|
|
144
|
+
i0.ɵɵproperty("ngIf", ctx_r2.closeable);
|
|
145
|
+
i0.ɵɵadvance(6);
|
|
146
|
+
i0.ɵɵproperty("score", ctx_r2.testRun.score)("showBar", true)("showIcon", true);
|
|
147
|
+
i0.ɵɵadvance(4);
|
|
148
|
+
i0.ɵɵproperty("cost", ctx_r2.testRun.cost)("showIcon", true);
|
|
149
|
+
i0.ɵɵadvance(5);
|
|
150
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatDuration(ctx_r2.testRun.duration));
|
|
151
|
+
i0.ɵɵadvance();
|
|
152
|
+
i0.ɵɵproperty("ngIf", ctx_r2.testRun.targetType);
|
|
153
|
+
i0.ɵɵadvance();
|
|
154
|
+
i0.ɵɵproperty("ngIf", ctx_r2.oracleResults && ctx_r2.oracleResults.length > 0);
|
|
155
|
+
i0.ɵɵadvance();
|
|
156
|
+
i0.ɵɵproperty("ngIf", ctx_r2.resultDetails);
|
|
157
|
+
i0.ɵɵadvance(11);
|
|
158
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.feedbackRating);
|
|
159
|
+
i0.ɵɵadvance(6);
|
|
160
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.feedbackIsCorrect);
|
|
161
|
+
i0.ɵɵadvance(6);
|
|
162
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.feedbackComments);
|
|
163
|
+
i0.ɵɵadvance();
|
|
164
|
+
i0.ɵɵproperty("disabled", ctx_r2.submittingFeedback);
|
|
165
|
+
i0.ɵɵadvance(2);
|
|
166
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.submittingFeedback ? "Submitting..." : "Submit Feedback", " ");
|
|
167
|
+
} }
|
|
168
|
+
export class TestRunDetailPanelComponent {
|
|
169
|
+
testRun;
|
|
170
|
+
oracleResults = [];
|
|
171
|
+
resultDetails = null;
|
|
172
|
+
closeable = true;
|
|
173
|
+
close = new EventEmitter();
|
|
174
|
+
viewTarget = new EventEmitter();
|
|
175
|
+
submitFeedback = new EventEmitter();
|
|
176
|
+
showResultDetails = false;
|
|
177
|
+
feedbackRating = 5;
|
|
178
|
+
feedbackIsCorrect = true;
|
|
179
|
+
feedbackComments = '';
|
|
180
|
+
submittingFeedback = false;
|
|
181
|
+
formatDuration(milliseconds) {
|
|
182
|
+
if (milliseconds < 1000) {
|
|
183
|
+
return `${milliseconds}ms`;
|
|
184
|
+
}
|
|
185
|
+
const seconds = Math.floor(milliseconds / 1000);
|
|
186
|
+
const minutes = Math.floor(seconds / 60);
|
|
187
|
+
if (minutes > 0) {
|
|
188
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
189
|
+
}
|
|
190
|
+
return `${seconds}s`;
|
|
191
|
+
}
|
|
192
|
+
formatJSON(obj) {
|
|
193
|
+
try {
|
|
194
|
+
return JSON.stringify(obj, null, 2);
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
return String(obj);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
toggleResultDetails() {
|
|
201
|
+
this.showResultDetails = !this.showResultDetails;
|
|
202
|
+
}
|
|
203
|
+
onClose() {
|
|
204
|
+
this.close.emit();
|
|
205
|
+
}
|
|
206
|
+
onViewTarget() {
|
|
207
|
+
if (this.testRun.targetType && this.testRun.targetLogID) {
|
|
208
|
+
this.viewTarget.emit({
|
|
209
|
+
type: this.testRun.targetType,
|
|
210
|
+
id: this.testRun.targetLogID
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async onSubmitFeedback() {
|
|
215
|
+
this.submittingFeedback = true;
|
|
216
|
+
this.submitFeedback.emit({
|
|
217
|
+
rating: this.feedbackRating,
|
|
218
|
+
isCorrect: this.feedbackIsCorrect,
|
|
219
|
+
comments: this.feedbackComments
|
|
220
|
+
});
|
|
221
|
+
// Reset after submission
|
|
222
|
+
setTimeout(() => {
|
|
223
|
+
this.submittingFeedback = false;
|
|
224
|
+
this.feedbackRating = 5;
|
|
225
|
+
this.feedbackIsCorrect = true;
|
|
226
|
+
this.feedbackComments = '';
|
|
227
|
+
}, 1000);
|
|
228
|
+
}
|
|
229
|
+
static ɵfac = function TestRunDetailPanelComponent_Factory(t) { return new (t || TestRunDetailPanelComponent)(); };
|
|
230
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestRunDetailPanelComponent, selectors: [["app-test-run-detail-panel"]], inputs: { testRun: "testRun", oracleResults: "oracleResults", resultDetails: "resultDetails", closeable: "closeable" }, outputs: { close: "close", viewTarget: "viewTarget", submitFeedback: "submitFeedback" }, decls: 1, vars: 1, consts: [["class", "test-run-detail-panel", 4, "ngIf"], [1, "test-run-detail-panel"], [1, "detail-header"], [1, "header-left"], [1, "header-meta"], [1, "test-type"], [1, "fa-solid", "fa-tag"], [1, "run-time"], [1, "fa-solid", "fa-clock"], [1, "header-right"], [3, "status"], ["class", "close-btn", 3, "click", 4, "ngIf"], [1, "detail-content"], [1, "metrics-section"], [1, "metric-card"], [1, "metric-label"], [3, "score", "showBar", "showIcon"], [3, "cost", "showIcon"], [1, "metric-value"], ["class", "metric-card", 4, "ngIf"], ["class", "oracle-section", 4, "ngIf"], ["class", "details-section", 4, "ngIf"], [1, "feedback-section"], [1, "section-header"], [1, "fa-solid", "fa-comment-dots"], [1, "feedback-form"], [1, "form-row"], [1, "form-group"], ["type", "number", "min", "1", "max", "10", 1, "rating-input", 3, "ngModelChange", "ngModel"], [1, "checkbox-group"], [1, "checkbox-label"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], ["rows", "3", "placeholder", "Enter your feedback comments...", 1, "comments-textarea", 3, "ngModelChange", "ngModel"], [1, "submit-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-paper-plane"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "metric-value", "target-link", 3, "click"], [1, "fa-solid", "fa-external-link-alt"], [1, "oracle-section"], [3, "results"], [1, "details-section"], [1, "fa-solid", "fa-file-alt"], [1, "toggle-btn", 3, "click"], [1, "fa-solid"], ["class", "details-content", 4, "ngIf"], [1, "details-content"], [1, "json-viewer"]], template: function TestRunDetailPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
231
|
+
i0.ɵɵtemplate(0, TestRunDetailPanelComponent_div_0_Template, 60, 22, "div", 0);
|
|
232
|
+
} if (rf & 2) {
|
|
233
|
+
i0.ɵɵproperty("ngIf", ctx.testRun);
|
|
234
|
+
} }, dependencies: [i1.NgIf, i2.DefaultValueAccessor, i2.NumberValueAccessor, i2.CheckboxControlValueAccessor, i2.NgControlStatus, i2.MinValidator, i2.MaxValidator, i2.NgModel, i3.TestStatusBadgeComponent, i3.ScoreIndicatorComponent, i3.CostDisplayComponent, i4.OracleBreakdownTableComponent, i1.DatePipe], styles: [".test-run-detail-panel[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .detail-header[_ngcontent-%COMP%] {\n padding: 20px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n }\n\n .header-left[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n }\n\n .header-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n font-size: 12px;\n opacity: 0.9;\n }\n\n .header-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .close-btn[_ngcontent-%COMP%] {\n background: rgba(255, 255, 255, 0.2);\n border: none;\n color: white;\n padding: 8px 12px;\n border-radius: 4px;\n cursor: pointer;\n transition: background 0.2s ease;\n }\n\n .close-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.3);\n }\n\n .detail-content[_ngcontent-%COMP%] {\n padding: 20px;\n }\n\n .metrics-section[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 16px;\n margin-bottom: 24px;\n }\n\n .metric-card[_ngcontent-%COMP%] {\n background: #f8f9fa;\n padding: 16px;\n border-radius: 8px;\n border-left: 4px solid #2196f3;\n }\n\n .metric-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #666;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n\n .metric-value[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n }\n\n .target-link[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n color: #2196f3;\n cursor: pointer;\n font-size: 14px;\n }\n\n .target-link[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n }\n\n .oracle-section[_ngcontent-%COMP%], \n .details-section[_ngcontent-%COMP%], \n .feedback-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n }\n\n .section-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .toggle-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: #666;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background 0.2s ease;\n }\n\n .toggle-btn[_ngcontent-%COMP%]:hover {\n background: #f0f0f0;\n }\n\n .details-content[_ngcontent-%COMP%] {\n margin-top: 12px;\n }\n\n .json-viewer[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n padding: 16px;\n font-size: 11px;\n line-height: 1.5;\n overflow-x: auto;\n max-height: 300px;\n overflow-y: auto;\n font-family: 'Courier New', monospace;\n }\n\n .feedback-form[_ngcontent-%COMP%] {\n background: #f8f9fa;\n padding: 16px;\n border-radius: 8px;\n }\n\n .form-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 2fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: #666;\n }\n\n .rating-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .checkbox-group[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n }\n\n .checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: #333;\n cursor: pointer;\n }\n\n .checkbox-label[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n }\n\n .comments-textarea[_ngcontent-%COMP%] {\n padding: 10px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 13px;\n font-family: inherit;\n resize: vertical;\n }\n\n .submit-btn[_ngcontent-%COMP%] {\n background: #2196f3;\n color: white;\n border: none;\n padding: 10px 20px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: background 0.2s ease;\n }\n\n .submit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #1976d2;\n }\n\n .submit-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n @media (max-width: 768px) {\n .form-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .metrics-section[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n }"] });
|
|
235
|
+
}
|
|
236
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TestRunDetailPanelComponent, [{
|
|
237
|
+
type: Component,
|
|
238
|
+
args: [{ selector: 'app-test-run-detail-panel', template: `
|
|
239
|
+
<div class="test-run-detail-panel" *ngIf="testRun">
|
|
240
|
+
<div class="detail-header">
|
|
241
|
+
<div class="header-left">
|
|
242
|
+
<h3>{{ testRun.testName }}</h3>
|
|
243
|
+
<div class="header-meta">
|
|
244
|
+
<span class="test-type">
|
|
245
|
+
<i class="fa-solid fa-tag"></i>
|
|
246
|
+
{{ testRun.testType }}
|
|
247
|
+
</span>
|
|
248
|
+
<span class="run-time">
|
|
249
|
+
<i class="fa-solid fa-clock"></i>
|
|
250
|
+
{{ testRun.runDateTime | date:'medium' }}
|
|
251
|
+
</span>
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
254
|
+
<div class="header-right">
|
|
255
|
+
<app-test-status-badge [status]="testRun.status"></app-test-status-badge>
|
|
256
|
+
<button class="close-btn" (click)="onClose()" *ngIf="closeable">
|
|
257
|
+
<i class="fa-solid fa-times"></i>
|
|
258
|
+
</button>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
|
|
262
|
+
<div class="detail-content">
|
|
263
|
+
<!-- Main Metrics -->
|
|
264
|
+
<div class="metrics-section">
|
|
265
|
+
<div class="metric-card">
|
|
266
|
+
<div class="metric-label">Score</div>
|
|
267
|
+
<app-score-indicator [score]="testRun.score" [showBar]="true" [showIcon]="true"></app-score-indicator>
|
|
268
|
+
</div>
|
|
269
|
+
<div class="metric-card">
|
|
270
|
+
<div class="metric-label">Cost</div>
|
|
271
|
+
<app-cost-display [cost]="testRun.cost" [showIcon]="true"></app-cost-display>
|
|
272
|
+
</div>
|
|
273
|
+
<div class="metric-card">
|
|
274
|
+
<div class="metric-label">Duration</div>
|
|
275
|
+
<div class="metric-value">{{ formatDuration(testRun.duration) }}</div>
|
|
276
|
+
</div>
|
|
277
|
+
<div class="metric-card" *ngIf="testRun.targetType">
|
|
278
|
+
<div class="metric-label">Target</div>
|
|
279
|
+
<div class="metric-value target-link" (click)="onViewTarget()">
|
|
280
|
+
<i class="fa-solid fa-external-link-alt"></i>
|
|
281
|
+
{{ testRun.targetType }}
|
|
282
|
+
</div>
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
|
|
286
|
+
<!-- Oracle Breakdown -->
|
|
287
|
+
<div class="oracle-section" *ngIf="oracleResults && oracleResults.length > 0">
|
|
288
|
+
<app-oracle-breakdown-table [results]="oracleResults"></app-oracle-breakdown-table>
|
|
289
|
+
</div>
|
|
290
|
+
|
|
291
|
+
<!-- Result Details -->
|
|
292
|
+
<div class="details-section" *ngIf="resultDetails">
|
|
293
|
+
<div class="section-header">
|
|
294
|
+
<h4>
|
|
295
|
+
<i class="fa-solid fa-file-alt"></i>
|
|
296
|
+
Result Details
|
|
297
|
+
</h4>
|
|
298
|
+
<button class="toggle-btn" (click)="toggleResultDetails()">
|
|
299
|
+
<i class="fa-solid" [class.fa-chevron-down]="!showResultDetails" [class.fa-chevron-up]="showResultDetails"></i>
|
|
300
|
+
</button>
|
|
301
|
+
</div>
|
|
302
|
+
<div class="details-content" *ngIf="showResultDetails">
|
|
303
|
+
<pre class="json-viewer">{{ formatJSON(resultDetails) }}</pre>
|
|
304
|
+
</div>
|
|
305
|
+
</div>
|
|
306
|
+
|
|
307
|
+
<!-- Feedback Section -->
|
|
308
|
+
<div class="feedback-section">
|
|
309
|
+
<div class="section-header">
|
|
310
|
+
<h4>
|
|
311
|
+
<i class="fa-solid fa-comment-dots"></i>
|
|
312
|
+
Human Feedback
|
|
313
|
+
</h4>
|
|
314
|
+
</div>
|
|
315
|
+
<div class="feedback-form">
|
|
316
|
+
<div class="form-row">
|
|
317
|
+
<div class="form-group">
|
|
318
|
+
<label>Rating (1-10)</label>
|
|
319
|
+
<input
|
|
320
|
+
type="number"
|
|
321
|
+
[(ngModel)]="feedbackRating"
|
|
322
|
+
min="1"
|
|
323
|
+
max="10"
|
|
324
|
+
class="rating-input"
|
|
325
|
+
/>
|
|
326
|
+
</div>
|
|
327
|
+
<div class="form-group">
|
|
328
|
+
<label>Is Correct?</label>
|
|
329
|
+
<div class="checkbox-group">
|
|
330
|
+
<label class="checkbox-label">
|
|
331
|
+
<input type="checkbox" [(ngModel)]="feedbackIsCorrect" />
|
|
332
|
+
<span>Yes, the automated result is correct</span>
|
|
333
|
+
</label>
|
|
334
|
+
</div>
|
|
335
|
+
</div>
|
|
336
|
+
</div>
|
|
337
|
+
<div class="form-group">
|
|
338
|
+
<label>Comments</label>
|
|
339
|
+
<textarea
|
|
340
|
+
[(ngModel)]="feedbackComments"
|
|
341
|
+
rows="3"
|
|
342
|
+
class="comments-textarea"
|
|
343
|
+
placeholder="Enter your feedback comments..."
|
|
344
|
+
></textarea>
|
|
345
|
+
</div>
|
|
346
|
+
<button class="submit-btn" (click)="onSubmitFeedback()" [disabled]="submittingFeedback">
|
|
347
|
+
<i class="fa-solid fa-paper-plane"></i>
|
|
348
|
+
{{ submittingFeedback ? 'Submitting...' : 'Submit Feedback' }}
|
|
349
|
+
</button>
|
|
350
|
+
</div>
|
|
351
|
+
</div>
|
|
352
|
+
</div>
|
|
353
|
+
</div>
|
|
354
|
+
`, styles: ["\n .test-run-detail-panel {\n background: white;\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .detail-header {\n padding: 20px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n }\n\n .header-left h3 {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n }\n\n .header-meta {\n display: flex;\n gap: 16px;\n font-size: 12px;\n opacity: 0.9;\n }\n\n .header-meta span {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .header-right {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .close-btn {\n background: rgba(255, 255, 255, 0.2);\n border: none;\n color: white;\n padding: 8px 12px;\n border-radius: 4px;\n cursor: pointer;\n transition: background 0.2s ease;\n }\n\n .close-btn:hover {\n background: rgba(255, 255, 255, 0.3);\n }\n\n .detail-content {\n padding: 20px;\n }\n\n .metrics-section {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 16px;\n margin-bottom: 24px;\n }\n\n .metric-card {\n background: #f8f9fa;\n padding: 16px;\n border-radius: 8px;\n border-left: 4px solid #2196f3;\n }\n\n .metric-label {\n font-size: 11px;\n color: #666;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n\n .metric-value {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n }\n\n .target-link {\n display: flex;\n align-items: center;\n gap: 6px;\n color: #2196f3;\n cursor: pointer;\n font-size: 14px;\n }\n\n .target-link:hover {\n text-decoration: underline;\n }\n\n .oracle-section,\n .details-section,\n .feedback-section {\n margin-bottom: 24px;\n }\n\n .section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .section-header h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-header h4 i {\n color: #2196f3;\n }\n\n .toggle-btn {\n background: none;\n border: none;\n color: #666;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background 0.2s ease;\n }\n\n .toggle-btn:hover {\n background: #f0f0f0;\n }\n\n .details-content {\n margin-top: 12px;\n }\n\n .json-viewer {\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n padding: 16px;\n font-size: 11px;\n line-height: 1.5;\n overflow-x: auto;\n max-height: 300px;\n overflow-y: auto;\n font-family: 'Courier New', monospace;\n }\n\n .feedback-form {\n background: #f8f9fa;\n padding: 16px;\n border-radius: 8px;\n }\n\n .form-row {\n display: grid;\n grid-template-columns: 1fr 2fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .form-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-group label {\n font-size: 12px;\n font-weight: 600;\n color: #666;\n }\n\n .rating-input {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .checkbox-group {\n display: flex;\n align-items: center;\n }\n\n .checkbox-label {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: #333;\n cursor: pointer;\n }\n\n .checkbox-label input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n }\n\n .comments-textarea {\n padding: 10px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 13px;\n font-family: inherit;\n resize: vertical;\n }\n\n .submit-btn {\n background: #2196f3;\n color: white;\n border: none;\n padding: 10px 20px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: background 0.2s ease;\n }\n\n .submit-btn:hover:not(:disabled) {\n background: #1976d2;\n }\n\n .submit-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n @media (max-width: 768px) {\n .form-row {\n grid-template-columns: 1fr;\n }\n\n .metrics-section {\n grid-template-columns: 1fr;\n }\n }\n "] }]
|
|
355
|
+
}], null, { testRun: [{
|
|
356
|
+
type: Input
|
|
357
|
+
}], oracleResults: [{
|
|
358
|
+
type: Input
|
|
359
|
+
}], resultDetails: [{
|
|
360
|
+
type: Input
|
|
361
|
+
}], closeable: [{
|
|
362
|
+
type: Input
|
|
363
|
+
}], close: [{
|
|
364
|
+
type: Output
|
|
365
|
+
}], viewTarget: [{
|
|
366
|
+
type: Output
|
|
367
|
+
}], submitFeedback: [{
|
|
368
|
+
type: Output
|
|
369
|
+
}] }); })();
|
|
370
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestRunDetailPanelComponent, { className: "TestRunDetailPanelComponent", filePath: "src/Testing/components/widgets/test-run-detail-panel.component.ts", lineNumber: 382 }); })();
|
|
371
|
+
//# sourceMappingURL=test-run-detail-panel.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-run-detail-panel.component.js","sourceRoot":"","sources":["../../../../src/Testing/components/widgets/test-run-detail-panel.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export interface TestingDashboardKPIs {
|
|
4
|
+
totalTestsActive: number;
|
|
5
|
+
passRateThisMonth: number;
|
|
6
|
+
totalCostThisMonth: number;
|
|
7
|
+
averageDuration: number;
|
|
8
|
+
testsPendingReview: number;
|
|
9
|
+
totalTestRuns: number;
|
|
10
|
+
failedTests: number;
|
|
11
|
+
skippedTests: number;
|
|
12
|
+
passRateTrend: number;
|
|
13
|
+
}
|
|
14
|
+
export interface TestRunSummary {
|
|
15
|
+
id: string;
|
|
16
|
+
testId: string;
|
|
17
|
+
testName: string;
|
|
18
|
+
suiteName: string;
|
|
19
|
+
testType: string;
|
|
20
|
+
status: 'Passed' | 'Failed' | 'Skipped' | 'Error' | 'Running';
|
|
21
|
+
score: number;
|
|
22
|
+
duration: number;
|
|
23
|
+
cost: number;
|
|
24
|
+
runDateTime: Date;
|
|
25
|
+
targetType: string;
|
|
26
|
+
targetLogID: string;
|
|
27
|
+
}
|
|
28
|
+
export interface SuiteHierarchyNode {
|
|
29
|
+
id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
parentID: string | null;
|
|
32
|
+
level: number;
|
|
33
|
+
children: SuiteHierarchyNode[];
|
|
34
|
+
testCount: number;
|
|
35
|
+
passRate: number;
|
|
36
|
+
totalCost: number;
|
|
37
|
+
averageScore: number;
|
|
38
|
+
expanded?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface VersionMetrics {
|
|
41
|
+
version: string;
|
|
42
|
+
gitCommit: string;
|
|
43
|
+
agentVersion: string;
|
|
44
|
+
runDate: Date;
|
|
45
|
+
totalTests: number;
|
|
46
|
+
passRate: number;
|
|
47
|
+
averageScore: number;
|
|
48
|
+
totalCost: number;
|
|
49
|
+
averageDuration: number;
|
|
50
|
+
newFailures: number;
|
|
51
|
+
newPasses: number;
|
|
52
|
+
}
|
|
53
|
+
export interface TestTrendData {
|
|
54
|
+
timestamp: Date;
|
|
55
|
+
totalRuns: number;
|
|
56
|
+
passed: number;
|
|
57
|
+
failed: number;
|
|
58
|
+
skipped: number;
|
|
59
|
+
errors: number;
|
|
60
|
+
averageScore: number;
|
|
61
|
+
totalCost: number;
|
|
62
|
+
averageDuration: number;
|
|
63
|
+
}
|
|
64
|
+
export interface FeedbackPending {
|
|
65
|
+
testRunID: string;
|
|
66
|
+
testName: string;
|
|
67
|
+
automatedScore: number;
|
|
68
|
+
automatedStatus: string;
|
|
69
|
+
runDateTime: Date;
|
|
70
|
+
reason: 'no-feedback' | 'high-score-failed' | 'low-score-passed';
|
|
71
|
+
}
|
|
72
|
+
export interface TestAnalytics {
|
|
73
|
+
topFailingTests: Array<{
|
|
74
|
+
testName: string;
|
|
75
|
+
failureCount: number;
|
|
76
|
+
failureRate: number;
|
|
77
|
+
}>;
|
|
78
|
+
mostExpensiveTests: Array<{
|
|
79
|
+
testName: string;
|
|
80
|
+
totalCost: number;
|
|
81
|
+
avgCost: number;
|
|
82
|
+
}>;
|
|
83
|
+
slowestTests: Array<{
|
|
84
|
+
testName: string;
|
|
85
|
+
avgDuration: number;
|
|
86
|
+
maxDuration: number;
|
|
87
|
+
}>;
|
|
88
|
+
costByType: Array<{
|
|
89
|
+
testType: string;
|
|
90
|
+
totalCost: number;
|
|
91
|
+
testCount: number;
|
|
92
|
+
}>;
|
|
93
|
+
costBySuite: Array<{
|
|
94
|
+
suiteName: string;
|
|
95
|
+
totalCost: number;
|
|
96
|
+
testCount: number;
|
|
97
|
+
}>;
|
|
98
|
+
passingRateByType: Array<{
|
|
99
|
+
testType: string;
|
|
100
|
+
passRate: number;
|
|
101
|
+
totalTests: number;
|
|
102
|
+
}>;
|
|
103
|
+
}
|
|
104
|
+
export interface FeedbackStats {
|
|
105
|
+
totalFeedback: number;
|
|
106
|
+
reviewedCount: number;
|
|
107
|
+
avgRating: number;
|
|
108
|
+
agreementRate: number;
|
|
109
|
+
disagreementRate: number;
|
|
110
|
+
accuracyRate: number;
|
|
111
|
+
}
|
|
112
|
+
export declare class TestingInstrumentationService {
|
|
113
|
+
private readonly _dateRange$;
|
|
114
|
+
private readonly _suiteFilter$;
|
|
115
|
+
private readonly _testTypeFilter$;
|
|
116
|
+
private readonly _refreshTrigger$;
|
|
117
|
+
private readonly _isLoading$;
|
|
118
|
+
private readonly metadata;
|
|
119
|
+
readonly isLoading$: Observable<boolean>;
|
|
120
|
+
readonly dateRange$: Observable<{
|
|
121
|
+
start: Date;
|
|
122
|
+
end: Date;
|
|
123
|
+
}>;
|
|
124
|
+
constructor();
|
|
125
|
+
readonly kpis$: Observable<TestingDashboardKPIs>;
|
|
126
|
+
readonly testRuns$: Observable<TestRunSummary[]>;
|
|
127
|
+
readonly suiteHierarchy$: Observable<SuiteHierarchyNode[]>;
|
|
128
|
+
readonly trends$: Observable<TestTrendData[]>;
|
|
129
|
+
readonly analytics$: Observable<TestAnalytics>;
|
|
130
|
+
readonly pendingFeedback$: Observable<FeedbackPending[]>;
|
|
131
|
+
readonly feedbackStats$: Observable<FeedbackStats>;
|
|
132
|
+
private checkLoadingComplete;
|
|
133
|
+
setDateRange(start: Date, end: Date): void;
|
|
134
|
+
setSuiteFilter(suiteId: string | null): void;
|
|
135
|
+
setTestTypeFilter(typeId: string | null): void;
|
|
136
|
+
refresh(): void;
|
|
137
|
+
private loadKPIs;
|
|
138
|
+
private countTestsPendingReview;
|
|
139
|
+
private loadTestRuns;
|
|
140
|
+
private loadSuiteHierarchy;
|
|
141
|
+
private loadTrends;
|
|
142
|
+
private loadAnalytics;
|
|
143
|
+
private loadPendingFeedback;
|
|
144
|
+
private loadFeedbackStats;
|
|
145
|
+
submitFeedback(testRunID: string, rating: number, isCorrect: boolean, comments: string): Promise<boolean>;
|
|
146
|
+
getVersionMetrics(): Promise<VersionMetrics[]>;
|
|
147
|
+
private createTimeBuckets;
|
|
148
|
+
private getBucketSize;
|
|
149
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TestingInstrumentationService, never>;
|
|
150
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<TestingInstrumentationService>;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=testing-instrumentation.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing-instrumentation.service.d.ts","sourceRoot":"","sources":["../../../src/Testing/services/testing-instrumentation.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAwC,MAAM,MAAM,CAAC;;AAaxE,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,IAAI,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,IAAI,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,IAAI,CAAC;IAClB,MAAM,EAAE,aAAa,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;CAClE;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxF,kBAAkB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpF,YAAY,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpF,UAAU,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E,WAAW,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChF,iBAAiB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtF;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAGa,6BAA6B;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGzB;IAEH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4C;IAC1E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA4C;IAC7E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkC;IACnE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuC;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAG3C,QAAQ,CAAC,UAAU,sBAAmC;IACtD,QAAQ,CAAC,UAAU;eAbyC,IAAI;aAAO,IAAI;OAarB;;IAKtD,QAAQ,CAAC,KAAK,mCAKZ;IAEF,QAAQ,CAAC,SAAS,+BAUhB;IAEF,QAAQ,CAAC,eAAe,mCAKtB;IAEF,QAAQ,CAAC,OAAO,8BAKd;IAEF,QAAQ,CAAC,UAAU,4BAKjB;IAEF,QAAQ,CAAC,gBAAgB,gCAKvB;IAEF,QAAQ,CAAC,cAAc,4BAKrB;IAEF,OAAO,CAAC,oBAAoB;IAM5B,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,IAAI;IAI1C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI5C,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI9C,OAAO,IAAI,IAAI;YAID,QAAQ;YA+ER,uBAAuB;YAiBvB,YAAY;YA6CZ,kBAAkB;YA8ElB,UAAU;YA8DV,aAAa;YAoHb,mBAAmB;YAiEnB,iBAAiB;IAgDzB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBzG,iBAAiB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAkDpD,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,aAAa;yCAhrBV,6BAA6B;6CAA7B,6BAA6B;CA8rBzC"}
|