@memberjunction/ng-dashboards 6.2.0-edge.1 → 6.2.0-edge.3
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/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +3 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1 -2
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
- package/dist/AI/components/rubric-drift-series.d.ts +32 -0
- package/dist/AI/components/rubric-drift-series.d.ts.map +1 -0
- package/dist/AI/components/rubric-drift-series.js +49 -0
- package/dist/AI/components/rubric-drift-series.js.map +1 -0
- package/dist/AI/components/rubric-drift.component.d.ts +42 -0
- package/dist/AI/components/rubric-drift.component.d.ts.map +1 -0
- package/dist/AI/components/rubric-drift.component.js +197 -0
- package/dist/AI/components/rubric-drift.component.js.map +1 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +4 -3
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +5 -2
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +12 -1
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/form-override-dialog.component.js +128 -81
- package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +4 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +47 -13
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +5 -0
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +151 -136
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +3 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.d.ts +11 -0
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.js +17 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.js.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +52 -45
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +11 -0
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +47 -10
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Rubrics/catalog-grid.d.ts +4 -0
- package/dist/Rubrics/catalog-grid.d.ts.map +1 -0
- package/dist/Rubrics/catalog-grid.js +22 -0
- package/dist/Rubrics/catalog-grid.js.map +1 -0
- package/dist/Rubrics/rubrics-dashboard.component.d.ts +31 -0
- package/dist/Rubrics/rubrics-dashboard.component.d.ts.map +1 -0
- package/dist/Rubrics/rubrics-dashboard.component.js +285 -0
- package/dist/Rubrics/rubrics-dashboard.component.js.map +1 -0
- package/dist/Rubrics/rubrics-resource.component.d.ts +13 -0
- package/dist/Rubrics/rubrics-resource.component.d.ts.map +1 -0
- package/dist/Rubrics/rubrics-resource.component.js +42 -0
- package/dist/Rubrics/rubrics-resource.component.js.map +1 -0
- package/dist/Rubrics/scales-dashboard.component.d.ts +34 -0
- package/dist/Rubrics/scales-dashboard.component.d.ts.map +1 -0
- package/dist/Rubrics/scales-dashboard.component.js +204 -0
- package/dist/Rubrics/scales-dashboard.component.js.map +1 -0
- package/dist/Rubrics/scales-resource.component.d.ts +13 -0
- package/dist/Rubrics/scales-resource.component.d.ts.map +1 -0
- package/dist/Rubrics/scales-resource.component.js +42 -0
- package/dist/Rubrics/scales-resource.component.js.map +1 -0
- package/dist/TelephonyOperations/telephony-operations-agent-context.d.ts +107 -0
- package/dist/TelephonyOperations/telephony-operations-agent-context.d.ts.map +1 -0
- package/dist/TelephonyOperations/telephony-operations-agent-context.js +216 -0
- package/dist/TelephonyOperations/telephony-operations-agent-context.js.map +1 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts +57 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts.map +1 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.js +805 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.js.map +1 -0
- package/dist/Testing/components/testing-analytics.component.d.ts +15 -0
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +465 -296
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +6 -0
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +289 -173
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/widgets/test-run-detail-panel.component.d.ts +8 -1
- package/dist/Testing/components/widgets/test-run-detail-panel.component.d.ts.map +1 -1
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js +68 -43
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
- package/dist/WorkQueue/components/work-queue-bindings.component.d.ts +37 -0
- package/dist/WorkQueue/components/work-queue-bindings.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-bindings.component.js +210 -0
- package/dist/WorkQueue/components/work-queue-bindings.component.js.map +1 -0
- package/dist/WorkQueue/components/work-queue-dead-letters.component.d.ts +70 -0
- package/dist/WorkQueue/components/work-queue-dead-letters.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-dead-letters.component.js +496 -0
- package/dist/WorkQueue/components/work-queue-dead-letters.component.js.map +1 -0
- package/dist/WorkQueue/components/work-queue-discard-dialog.component.d.ts +22 -0
- package/dist/WorkQueue/components/work-queue-discard-dialog.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-discard-dialog.component.js +99 -0
- package/dist/WorkQueue/components/work-queue-discard-dialog.component.js.map +1 -0
- package/dist/WorkQueue/components/work-queue-overview.component.d.ts +29 -0
- package/dist/WorkQueue/components/work-queue-overview.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-overview.component.js +278 -0
- package/dist/WorkQueue/components/work-queue-overview.component.js.map +1 -0
- package/dist/WorkQueue/components/work-queue-partitions.component.d.ts +59 -0
- package/dist/WorkQueue/components/work-queue-partitions.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-partitions.component.js +359 -0
- package/dist/WorkQueue/components/work-queue-partitions.component.js.map +1 -0
- package/dist/WorkQueue/services/work-queue-operator.service.d.ts +22 -0
- package/dist/WorkQueue/services/work-queue-operator.service.d.ts.map +1 -0
- package/dist/WorkQueue/services/work-queue-operator.service.js +44 -0
- package/dist/WorkQueue/services/work-queue-operator.service.js.map +1 -0
- package/dist/WorkQueue/work-queue-agent-context.d.ts +67 -0
- package/dist/WorkQueue/work-queue-agent-context.d.ts.map +1 -0
- package/dist/WorkQueue/work-queue-agent-context.js +119 -0
- package/dist/WorkQueue/work-queue-agent-context.js.map +1 -0
- package/dist/WorkQueue/work-queue-dashboard.component.d.ts +94 -0
- package/dist/WorkQueue/work-queue-dashboard.component.d.ts.map +1 -0
- package/dist/WorkQueue/work-queue-dashboard.component.js +545 -0
- package/dist/WorkQueue/work-queue-dashboard.component.js.map +1 -0
- package/dist/WorkQueue/work-queue-types.d.ts +40 -0
- package/dist/WorkQueue/work-queue-types.d.ts.map +1 -0
- package/dist/WorkQueue/work-queue-types.js +2 -0
- package/dist/WorkQueue/work-queue-types.js.map +1 -0
- package/dist/core-dashboards.module.d.ts +29 -28
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +7 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +24 -22
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +14 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +5 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +7 -0
- package/dist/public-api.js.map +1 -1
- package/dist/rubrics-dashboards.module.d.ts +17 -0
- package/dist/rubrics-dashboards.module.d.ts.map +1 -0
- package/dist/rubrics-dashboards.module.js +76 -0
- package/dist/rubrics-dashboards.module.js.map +1 -0
- package/dist/work-queue-dashboards.module.d.ts +23 -0
- package/dist/work-queue-dashboards.module.d.ts.map +1 -0
- package/dist/work-queue-dashboards.module.js +92 -0
- package/dist/work-queue-dashboards.module.js.map +1 -0
- package/package.json +76 -64
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
1
|
+
import { Component, Input, Output, EventEmitter, inject } from '@angular/core';
|
|
2
|
+
import { TestingInstrumentationService } from '../../services/testing-instrumentation.service';
|
|
3
|
+
import { RubricRunView } from '@memberjunction/ng-testing';
|
|
2
4
|
import * as i0 from "@angular/core";
|
|
3
5
|
import * as i1 from "@angular/forms";
|
|
4
6
|
import * as i2 from "@memberjunction/ng-testing";
|
|
@@ -7,9 +9,9 @@ import * as i4 from "./oracle-breakdown-table.component";
|
|
|
7
9
|
import * as i5 from "@angular/common";
|
|
8
10
|
function TestRunDetailPanelComponent_Conditional_0_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
9
11
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
10
|
-
i0.ɵɵelementStart(0, "button",
|
|
12
|
+
i0.ɵɵelementStart(0, "button", 34);
|
|
11
13
|
i0.ɵɵlistener("click", function TestRunDetailPanelComponent_Conditional_0_Conditional_15_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onClose()); });
|
|
12
|
-
i0.ɵɵelement(1, "i",
|
|
14
|
+
i0.ɵɵelement(1, "i", 35);
|
|
13
15
|
i0.ɵɵelementEnd();
|
|
14
16
|
} }
|
|
15
17
|
function TestRunDetailPanelComponent_Conditional_0_Conditional_31_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -17,9 +19,9 @@ function TestRunDetailPanelComponent_Conditional_0_Conditional_31_Template(rf, c
|
|
|
17
19
|
i0.ɵɵelementStart(0, "div", 13)(1, "div", 14);
|
|
18
20
|
i0.ɵɵtext(2, "Target");
|
|
19
21
|
i0.ɵɵelementEnd();
|
|
20
|
-
i0.ɵɵelementStart(3, "div",
|
|
22
|
+
i0.ɵɵelementStart(3, "div", 36);
|
|
21
23
|
i0.ɵɵlistener("click", function TestRunDetailPanelComponent_Conditional_0_Conditional_31_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onViewTarget()); });
|
|
22
|
-
i0.ɵɵelement(4, "i",
|
|
24
|
+
i0.ɵɵelement(4, "i", 37);
|
|
23
25
|
i0.ɵɵtext(5);
|
|
24
26
|
i0.ɵɵelementEnd()();
|
|
25
27
|
} if (rf & 2) {
|
|
@@ -29,19 +31,25 @@ function TestRunDetailPanelComponent_Conditional_0_Conditional_31_Template(rf, c
|
|
|
29
31
|
} }
|
|
30
32
|
function TestRunDetailPanelComponent_Conditional_0_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
31
33
|
i0.ɵɵelementStart(0, "div", 18);
|
|
32
|
-
i0.ɵɵelement(1, "app-oracle-breakdown-table",
|
|
34
|
+
i0.ɵɵelement(1, "app-oracle-breakdown-table", 38);
|
|
33
35
|
i0.ɵɵelementEnd();
|
|
34
36
|
} if (rf & 2) {
|
|
35
37
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
36
38
|
i0.ɵɵadvance();
|
|
37
39
|
i0.ɵɵproperty("results", ctx_r2.oracleResults);
|
|
38
40
|
} }
|
|
39
|
-
function
|
|
40
|
-
i0.ɵɵelement(0, "
|
|
41
|
+
function TestRunDetailPanelComponent_Conditional_0_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
42
|
+
i0.ɵɵelement(0, "mj-testing-rubric-result", 19);
|
|
43
|
+
} if (rf & 2) {
|
|
44
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
45
|
+
i0.ɵɵproperty("OracleResults", ctx_r2.oracleResults)("Provider", ctx_r2.SessionProvider);
|
|
46
|
+
} }
|
|
47
|
+
function TestRunDetailPanelComponent_Conditional_0_Conditional_34_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
48
|
+
i0.ɵɵelement(0, "i", 42);
|
|
41
49
|
i0.ɵɵtext(1, " Result Details ");
|
|
42
50
|
} }
|
|
43
|
-
function
|
|
44
|
-
i0.ɵɵelementStart(0, "div",
|
|
51
|
+
function TestRunDetailPanelComponent_Conditional_0_Conditional_34_ng_template_3_Template(rf, ctx) { if (rf & 1) {
|
|
52
|
+
i0.ɵɵelementStart(0, "div", 43)(1, "pre", 44);
|
|
45
53
|
i0.ɵɵtext(2);
|
|
46
54
|
i0.ɵɵelementEnd()();
|
|
47
55
|
} if (rf & 2) {
|
|
@@ -49,11 +57,11 @@ function TestRunDetailPanelComponent_Conditional_0_Conditional_33_ng_template_3_
|
|
|
49
57
|
i0.ɵɵadvance(2);
|
|
50
58
|
i0.ɵɵtextInterpolate(ctx_r2.formatJSON(ctx_r2.resultDetails));
|
|
51
59
|
} }
|
|
52
|
-
function
|
|
60
|
+
function TestRunDetailPanelComponent_Conditional_0_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
53
61
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
54
|
-
i0.ɵɵelementStart(0, "div",
|
|
55
|
-
i0.ɵɵtwoWayListener("ExpandedChange", function
|
|
56
|
-
i0.ɵɵtemplate(2,
|
|
62
|
+
i0.ɵɵelementStart(0, "div", 20)(1, "mj-accordion-panel", 39);
|
|
63
|
+
i0.ɵɵtwoWayListener("ExpandedChange", function TestRunDetailPanelComponent_Conditional_0_Conditional_34_Template_mj_accordion_panel_ExpandedChange_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.showResultDetails, $event) || (ctx_r2.showResultDetails = $event); return i0.ɵɵresetView($event); });
|
|
64
|
+
i0.ɵɵtemplate(2, TestRunDetailPanelComponent_Conditional_0_Conditional_34_ng_template_2_Template, 2, 0, "ng-template", 40)(3, TestRunDetailPanelComponent_Conditional_0_Conditional_34_ng_template_3_Template, 3, 1, "ng-template", 41);
|
|
57
65
|
i0.ɵɵelementEnd()();
|
|
58
66
|
} if (rf & 2) {
|
|
59
67
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -98,36 +106,37 @@ function TestRunDetailPanelComponent_Conditional_0_Template(rf, ctx) { if (rf &
|
|
|
98
106
|
i0.ɵɵconditionalCreate(31, TestRunDetailPanelComponent_Conditional_0_Conditional_31_Template, 6, 1, "div", 13);
|
|
99
107
|
i0.ɵɵelementEnd();
|
|
100
108
|
i0.ɵɵconditionalCreate(32, TestRunDetailPanelComponent_Conditional_0_Conditional_32_Template, 2, 1, "div", 18);
|
|
101
|
-
i0.ɵɵconditionalCreate(33, TestRunDetailPanelComponent_Conditional_0_Conditional_33_Template,
|
|
102
|
-
i0.ɵɵ
|
|
103
|
-
i0.ɵɵ
|
|
104
|
-
i0.ɵɵ
|
|
109
|
+
i0.ɵɵconditionalCreate(33, TestRunDetailPanelComponent_Conditional_0_Conditional_33_Template, 1, 2, "mj-testing-rubric-result", 19);
|
|
110
|
+
i0.ɵɵconditionalCreate(34, TestRunDetailPanelComponent_Conditional_0_Conditional_34_Template, 4, 2, "div", 20);
|
|
111
|
+
i0.ɵɵelementStart(35, "div", 21)(36, "div", 22)(37, "h4");
|
|
112
|
+
i0.ɵɵelement(38, "i", 23);
|
|
113
|
+
i0.ɵɵtext(39, " Human Feedback ");
|
|
105
114
|
i0.ɵɵelementEnd()();
|
|
106
|
-
i0.ɵɵelementStart(
|
|
107
|
-
i0.ɵɵtext(
|
|
115
|
+
i0.ɵɵelementStart(40, "div", 24)(41, "div", 25)(42, "div", 26)(43, "label");
|
|
116
|
+
i0.ɵɵtext(44, "Rating (1-10)");
|
|
108
117
|
i0.ɵɵelementEnd();
|
|
109
|
-
i0.ɵɵelementStart(
|
|
110
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
118
|
+
i0.ɵɵelementStart(45, "input", 27);
|
|
119
|
+
i0.ɵɵtwoWayListener("ngModelChange", function TestRunDetailPanelComponent_Conditional_0_Template_input_ngModelChange_45_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.feedbackRating, $event) || (ctx_r2.feedbackRating = $event); return i0.ɵɵresetView($event); });
|
|
111
120
|
i0.ɵɵelementEnd()();
|
|
112
|
-
i0.ɵɵelementStart(
|
|
113
|
-
i0.ɵɵtext(
|
|
121
|
+
i0.ɵɵelementStart(46, "div", 26)(47, "label");
|
|
122
|
+
i0.ɵɵtext(48, "Is Correct?");
|
|
114
123
|
i0.ɵɵelementEnd();
|
|
115
|
-
i0.ɵɵelementStart(
|
|
116
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
124
|
+
i0.ɵɵelementStart(49, "div", 28)(50, "label", 29)(51, "input", 30);
|
|
125
|
+
i0.ɵɵtwoWayListener("ngModelChange", function TestRunDetailPanelComponent_Conditional_0_Template_input_ngModelChange_51_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.feedbackIsCorrect, $event) || (ctx_r2.feedbackIsCorrect = $event); return i0.ɵɵresetView($event); });
|
|
117
126
|
i0.ɵɵelementEnd();
|
|
118
|
-
i0.ɵɵelementStart(
|
|
119
|
-
i0.ɵɵtext(
|
|
127
|
+
i0.ɵɵelementStart(52, "span");
|
|
128
|
+
i0.ɵɵtext(53, "Yes, the automated result is correct");
|
|
120
129
|
i0.ɵɵelementEnd()()()()();
|
|
121
|
-
i0.ɵɵelementStart(
|
|
122
|
-
i0.ɵɵtext(
|
|
130
|
+
i0.ɵɵelementStart(54, "div", 26)(55, "label");
|
|
131
|
+
i0.ɵɵtext(56, "Comments");
|
|
123
132
|
i0.ɵɵelementEnd();
|
|
124
|
-
i0.ɵɵelementStart(
|
|
125
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
133
|
+
i0.ɵɵelementStart(57, "textarea", 31);
|
|
134
|
+
i0.ɵɵtwoWayListener("ngModelChange", function TestRunDetailPanelComponent_Conditional_0_Template_textarea_ngModelChange_57_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.feedbackComments, $event) || (ctx_r2.feedbackComments = $event); return i0.ɵɵresetView($event); });
|
|
126
135
|
i0.ɵɵelementEnd()();
|
|
127
|
-
i0.ɵɵelementStart(
|
|
128
|
-
i0.ɵɵlistener("click", function
|
|
129
|
-
i0.ɵɵelement(
|
|
130
|
-
i0.ɵɵtext(
|
|
136
|
+
i0.ɵɵelementStart(58, "button", 32);
|
|
137
|
+
i0.ɵɵlistener("click", function TestRunDetailPanelComponent_Conditional_0_Template_button_click_58_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSubmitFeedback()); });
|
|
138
|
+
i0.ɵɵelement(59, "i", 33);
|
|
139
|
+
i0.ɵɵtext(60);
|
|
131
140
|
i0.ɵɵelementEnd()()()()();
|
|
132
141
|
} if (rf & 2) {
|
|
133
142
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
@@ -136,7 +145,7 @@ function TestRunDetailPanelComponent_Conditional_0_Template(rf, ctx) { if (rf &
|
|
|
136
145
|
i0.ɵɵadvance(4);
|
|
137
146
|
i0.ɵɵtextInterpolate1(" ", ctx_r2.testRun.testType, " ");
|
|
138
147
|
i0.ɵɵadvance(3);
|
|
139
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(12,
|
|
148
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(12, 20, ctx_r2.testRun.runDateTime, "medium"), " ");
|
|
140
149
|
i0.ɵɵadvance(3);
|
|
141
150
|
i0.ɵɵproperty("status", ctx_r2.testRun.status);
|
|
142
151
|
i0.ɵɵadvance();
|
|
@@ -152,7 +161,9 @@ function TestRunDetailPanelComponent_Conditional_0_Template(rf, ctx) { if (rf &
|
|
|
152
161
|
i0.ɵɵadvance();
|
|
153
162
|
i0.ɵɵconditional(ctx_r2.oracleResults && ctx_r2.oracleResults.length > 0 ? 32 : -1);
|
|
154
163
|
i0.ɵɵadvance();
|
|
155
|
-
i0.ɵɵconditional(ctx_r2.
|
|
164
|
+
i0.ɵɵconditional(ctx_r2.RubricView ? 33 : -1);
|
|
165
|
+
i0.ɵɵadvance();
|
|
166
|
+
i0.ɵɵconditional(ctx_r2.resultDetails ? 34 : -1);
|
|
156
167
|
i0.ɵɵadvance(11);
|
|
157
168
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.feedbackRating);
|
|
158
169
|
i0.ɵɵadvance(6);
|
|
@@ -165,6 +176,12 @@ function TestRunDetailPanelComponent_Conditional_0_Template(rf, ctx) { if (rf &
|
|
|
165
176
|
i0.ɵɵtextInterpolate1(" ", ctx_r2.submittingFeedback ? "Submitting..." : "Submit Feedback", " ");
|
|
166
177
|
} }
|
|
167
178
|
export class TestRunDetailPanelComponent {
|
|
179
|
+
session = inject(TestingInstrumentationService, { optional: true });
|
|
180
|
+
/** The signed-in session provider. An input wins; otherwise the testing service's provider is used. */
|
|
181
|
+
Provider = null;
|
|
182
|
+
get SessionProvider() {
|
|
183
|
+
return this.Provider ?? this.session?.Provider ?? null;
|
|
184
|
+
}
|
|
168
185
|
TestRun;
|
|
169
186
|
/** @deprecated Use {@link TestRun}. */
|
|
170
187
|
set testRun(value) {
|
|
@@ -179,6 +196,9 @@ export class TestRunDetailPanelComponent {
|
|
|
179
196
|
set oracleResults(value) {
|
|
180
197
|
this.OracleResults = value;
|
|
181
198
|
}
|
|
199
|
+
get RubricView() {
|
|
200
|
+
return RubricRunView(this.OracleResults);
|
|
201
|
+
}
|
|
182
202
|
/** @deprecated Use {@link OracleResults}. */
|
|
183
203
|
get oracleResults() {
|
|
184
204
|
return this.OracleResults;
|
|
@@ -342,11 +362,11 @@ export class TestRunDetailPanelComponent {
|
|
|
342
362
|
return this.OnSubmitFeedback();
|
|
343
363
|
}
|
|
344
364
|
static ɵfac = function TestRunDetailPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TestRunDetailPanelComponent)(); };
|
|
345
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestRunDetailPanelComponent, selectors: [["app-test-run-detail-panel"]], inputs: { TestRun: "TestRun", testRun: "testRun", OracleResults: "OracleResults", oracleResults: "oracleResults", ResultDetails: "ResultDetails", resultDetails: "resultDetails", Closeable: "Closeable", closeable: "closeable" }, outputs: { Close: "Close", close: "close", ViewTarget: "ViewTarget", viewTarget: "viewTarget", SubmitFeedback: "SubmitFeedback", submitFeedback: "submitFeedback" }, standalone: false, decls: 1, vars: 1, consts: [[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"], [1, "close-btn"], [1, "detail-content"], [1, "metrics-section"], [1, "metric-card"], [1, "metric-label"], [3, "score", "showBar", "showIcon"], [3, "cost", "showIcon"], [1, "metric-value"], [1, "oracle-section"], [1, "details-section"], [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"], [3, "results"], ["Size", "sm", 3, "ExpandedChange", "FlushBody", "Expanded"], ["mjAccordionTitle", ""], ["mjAccordionBody", ""], [1, "fa-solid", "fa-file-alt", 2, "color", "var(--mj-brand-primary)"], [1, "details-content"], [1, "json-viewer"]], template: function TestRunDetailPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
346
|
-
i0.ɵɵconditionalCreate(0, TestRunDetailPanelComponent_Conditional_0_Template,
|
|
365
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestRunDetailPanelComponent, selectors: [["app-test-run-detail-panel"]], inputs: { Provider: "Provider", TestRun: "TestRun", testRun: "testRun", OracleResults: "OracleResults", oracleResults: "oracleResults", ResultDetails: "ResultDetails", resultDetails: "resultDetails", Closeable: "Closeable", closeable: "closeable" }, outputs: { Close: "Close", close: "close", ViewTarget: "ViewTarget", viewTarget: "viewTarget", SubmitFeedback: "SubmitFeedback", submitFeedback: "submitFeedback" }, standalone: false, decls: 1, vars: 1, consts: [[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"], [1, "close-btn"], [1, "detail-content"], [1, "metrics-section"], [1, "metric-card"], [1, "metric-label"], [3, "score", "showBar", "showIcon"], [3, "cost", "showIcon"], [1, "metric-value"], [1, "oracle-section"], [3, "OracleResults", "Provider"], [1, "details-section"], [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"], [3, "results"], ["Size", "sm", 3, "ExpandedChange", "FlushBody", "Expanded"], ["mjAccordionTitle", ""], ["mjAccordionBody", ""], [1, "fa-solid", "fa-file-alt", 2, "color", "var(--mj-brand-primary)"], [1, "details-content"], [1, "json-viewer"]], template: function TestRunDetailPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
366
|
+
i0.ɵɵconditionalCreate(0, TestRunDetailPanelComponent_Conditional_0_Template, 61, 23, "div", 0);
|
|
347
367
|
} if (rf & 2) {
|
|
348
368
|
i0.ɵɵconditional(ctx.testRun ? 0 : -1);
|
|
349
|
-
} }, dependencies: [i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.CheckboxControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.TestStatusBadgeComponent, i2.ScoreIndicatorComponent, i2.CostDisplayComponent, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective, i3.MJAccordionBodyDirective, i4.OracleBreakdownTableComponent, i5.DatePipe], styles: [".test-run-detail-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-md);\n }\n\n .detail-header[_ngcontent-%COMP%] {\n padding: 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-text-inverse);\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: var(--mj-bg-surface-card);\n padding: 16px;\n border-radius: 8px;\n border-left: 4px solid var(--mj-brand-primary);\n }\n\n .metric-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-secondary);\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: var(--mj-text-primary);\n }\n\n .target-link[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\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 var(--mj-border-default);\n }\n\n .section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\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: var(--mj-brand-primary);\n }\n\n \n\n\n\n .details-content[_ngcontent-%COMP%] {\n margin-top: 12px;\n }\n\n .json-viewer[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\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: var(--mj-bg-surface-card);\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: var(--mj-text-secondary);\n }\n\n .rating-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\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: var(--mj-text-primary);\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 var(--mj-border-default);\n border-radius: 4px;\n font-size: 13px;\n font-family: inherit;\n resize: vertical;\n }\n\n .submit-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-brand-primary-hover);\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 }"] });
|
|
369
|
+
} }, dependencies: [i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.CheckboxControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.TestStatusBadgeComponent, i2.ScoreIndicatorComponent, i2.CostDisplayComponent, i2.TestingRubricResultComponent, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective, i3.MJAccordionBodyDirective, i4.OracleBreakdownTableComponent, i5.DatePipe], styles: [".test-run-detail-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-md);\n }\n\n .detail-header[_ngcontent-%COMP%] {\n padding: 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-text-inverse);\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: var(--mj-bg-surface-card);\n padding: 16px;\n border-radius: 8px;\n border-left: 4px solid var(--mj-brand-primary);\n }\n\n .metric-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-secondary);\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: var(--mj-text-primary);\n }\n\n .target-link[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\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 var(--mj-border-default);\n }\n\n .section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\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: var(--mj-brand-primary);\n }\n\n \n\n\n\n .details-content[_ngcontent-%COMP%] {\n margin-top: 12px;\n }\n\n .json-viewer[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\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: var(--mj-bg-surface-card);\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: var(--mj-text-secondary);\n }\n\n .rating-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\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: var(--mj-text-primary);\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 var(--mj-border-default);\n border-radius: 4px;\n font-size: 13px;\n font-family: inherit;\n resize: vertical;\n }\n\n .submit-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-brand-primary-hover);\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 }"] });
|
|
350
370
|
}
|
|
351
371
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TestRunDetailPanelComponent, [{
|
|
352
372
|
type: Component,
|
|
@@ -407,6 +427,9 @@ export class TestRunDetailPanelComponent {
|
|
|
407
427
|
<app-oracle-breakdown-table [results]="oracleResults"></app-oracle-breakdown-table>
|
|
408
428
|
</div>
|
|
409
429
|
}
|
|
430
|
+
@if (RubricView) {
|
|
431
|
+
<mj-testing-rubric-result [OracleResults]="oracleResults" [Provider]="SessionProvider"></mj-testing-rubric-result>
|
|
432
|
+
}
|
|
410
433
|
<!-- Result Details -->
|
|
411
434
|
@if (resultDetails) {
|
|
412
435
|
<div class="details-section">
|
|
@@ -472,7 +495,9 @@ export class TestRunDetailPanelComponent {
|
|
|
472
495
|
</div>
|
|
473
496
|
}
|
|
474
497
|
`, styles: ["\n .test-run-detail-panel {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-md);\n }\n\n .detail-header {\n padding: 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-text-inverse);\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: var(--mj-bg-surface-card);\n padding: 16px;\n border-radius: 8px;\n border-left: 4px solid var(--mj-brand-primary);\n }\n\n .metric-label {\n font-size: 11px;\n color: var(--mj-text-secondary);\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: var(--mj-text-primary);\n }\n\n .target-link {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\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 var(--mj-border-default);\n }\n\n .section-header h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-header h4 i {\n color: var(--mj-brand-primary);\n }\n\n /* .toggle-btn removed \u2014 the Result Details chevron is now provided by\n <mj-accordion-panel>. (.section-header is kept; the Feedback section\n still uses it.) */\n\n .details-content {\n margin-top: 12px;\n }\n\n .json-viewer {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\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: var(--mj-bg-surface-card);\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: var(--mj-text-secondary);\n }\n\n .rating-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\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: var(--mj-text-primary);\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 var(--mj-border-default);\n border-radius: 4px;\n font-size: 13px;\n font-family: inherit;\n resize: vertical;\n }\n\n .submit-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-brand-primary-hover);\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 "] }]
|
|
475
|
-
}], null, {
|
|
498
|
+
}], null, { Provider: [{
|
|
499
|
+
type: Input
|
|
500
|
+
}], TestRun: [{
|
|
476
501
|
type: Input
|
|
477
502
|
}], testRun: [{
|
|
478
503
|
type: Input
|
|
@@ -501,5 +526,5 @@ export class TestRunDetailPanelComponent {
|
|
|
501
526
|
}], submitFeedback: [{
|
|
502
527
|
type: Output
|
|
503
528
|
}] }); })();
|
|
504
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestRunDetailPanelComponent, { className: "TestRunDetailPanelComponent", filePath: "src/Testing/components/widgets/test-run-detail-panel.component.ts", lineNumber:
|
|
529
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestRunDetailPanelComponent, { className: "TestRunDetailPanelComponent", filePath: "src/Testing/components/widgets/test-run-detail-panel.component.ts", lineNumber: 383 }); })();
|
|
505
530
|
//# sourceMappingURL=test-run-detail-panel.component.js.map
|
|
@@ -1 +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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","sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { TestRunSummary } from '../../services/testing-instrumentation.service';\nimport { OracleResult } from './oracle-breakdown-table.component';\n\n@Component({\n standalone: false,\n selector: 'app-test-run-detail-panel',\n template: `\n @if (testRun) {\n <div class=\"test-run-detail-panel\">\n <div class=\"detail-header\">\n <div class=\"header-left\">\n <h3>{{ testRun.testName }}</h3>\n <div class=\"header-meta\">\n <span class=\"test-type\">\n <i class=\"fa-solid fa-tag\"></i>\n {{ testRun.testType }}\n </span>\n <span class=\"run-time\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ testRun.runDateTime | date:'medium' }}\n </span>\n </div>\n </div>\n <div class=\"header-right\">\n <app-test-status-badge [status]=\"testRun.status\"></app-test-status-badge>\n @if (closeable) {\n <button class=\"close-btn\" (click)=\"onClose()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n <div class=\"detail-content\">\n <!-- Main Metrics -->\n <div class=\"metrics-section\">\n <div class=\"metric-card\">\n <div class=\"metric-label\">Score</div>\n <app-score-indicator [score]=\"testRun.score\" [showBar]=\"true\" [showIcon]=\"true\"></app-score-indicator>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Cost</div>\n <app-cost-display [cost]=\"testRun.cost\" [showIcon]=\"true\"></app-cost-display>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Duration</div>\n <div class=\"metric-value\">{{ formatDuration(testRun.duration) }}</div>\n </div>\n @if (testRun.targetType) {\n <div class=\"metric-card\">\n <div class=\"metric-label\">Target</div>\n <div class=\"metric-value target-link\" (click)=\"onViewTarget()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n {{ testRun.targetType }}\n </div>\n </div>\n }\n </div>\n <!-- Oracle Breakdown -->\n @if (oracleResults && oracleResults.length > 0) {\n <div class=\"oracle-section\">\n <app-oracle-breakdown-table [results]=\"oracleResults\"></app-oracle-breakdown-table>\n </div>\n }\n <!-- Result Details -->\n @if (resultDetails) {\n <div class=\"details-section\">\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\" [(Expanded)]=\"showResultDetails\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-file-alt\" style=\"color: var(--mj-brand-primary)\"></i>\n Result Details\n </ng-template>\n <ng-template mjAccordionBody>\n <div class=\"details-content\">\n <pre class=\"json-viewer\">{{ formatJSON(resultDetails) }}</pre>\n </div>\n </ng-template>\n </mj-accordion-panel>\n </div>\n }\n <!-- Feedback Section -->\n <div class=\"feedback-section\">\n <div class=\"section-header\">\n <h4>\n <i class=\"fa-solid fa-comment-dots\"></i>\n Human Feedback\n </h4>\n </div>\n <div class=\"feedback-form\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Rating (1-10)</label>\n <input\n type=\"number\"\n [(ngModel)]=\"feedbackRating\"\n min=\"1\"\n max=\"10\"\n class=\"rating-input\"\n />\n </div>\n <div class=\"form-group\">\n <label>Is Correct?</label>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"feedbackIsCorrect\" />\n <span>Yes, the automated result is correct</span>\n </label>\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <label>Comments</label>\n <textarea\n [(ngModel)]=\"feedbackComments\"\n rows=\"3\"\n class=\"comments-textarea\"\n placeholder=\"Enter your feedback comments...\"\n ></textarea>\n </div>\n <button class=\"submit-btn\" (click)=\"onSubmitFeedback()\" [disabled]=\"submittingFeedback\">\n <i class=\"fa-solid fa-paper-plane\"></i>\n {{ submittingFeedback ? 'Submitting...' : 'Submit Feedback' }}\n </button>\n </div>\n </div>\n </div>\n </div>\n }\n `,\n styles: [`\n .test-run-detail-panel {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-md);\n }\n\n .detail-header {\n padding: 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-text-inverse);\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: var(--mj-bg-surface-card);\n padding: 16px;\n border-radius: 8px;\n border-left: 4px solid var(--mj-brand-primary);\n }\n\n .metric-label {\n font-size: 11px;\n color: var(--mj-text-secondary);\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: var(--mj-text-primary);\n }\n\n .target-link {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\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 var(--mj-border-default);\n }\n\n .section-header h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-header h4 i {\n color: var(--mj-brand-primary);\n }\n\n /* .toggle-btn removed — the Result Details chevron is now provided by\n <mj-accordion-panel>. (.section-header is kept; the Feedback section\n still uses it.) */\n\n .details-content {\n margin-top: 12px;\n }\n\n .json-viewer {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\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: var(--mj-bg-surface-card);\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: var(--mj-text-secondary);\n }\n\n .rating-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\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: var(--mj-text-primary);\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 var(--mj-border-default);\n border-radius: 4px;\n font-size: 13px;\n font-family: inherit;\n resize: vertical;\n }\n\n .submit-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-brand-primary-hover);\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 `]\n})\nexport class TestRunDetailPanelComponent {\n @Input() TestRun!: TestRunSummary;\n\n /** @deprecated Use {@link TestRun}. */\n @Input() set testRun(value: TestRunSummary) {\n this.TestRun = value;\n }\n /** @deprecated Use {@link TestRun}. */\n get testRun(): TestRunSummary {\n return this.TestRun;\n }\n @Input() OracleResults: OracleResult[] = [];\n\n /** @deprecated Use {@link OracleResults}. */\n @Input() set oracleResults(value: OracleResult[]) {\n this.OracleResults = value;\n }\n /** @deprecated Use {@link OracleResults}. */\n get oracleResults(): OracleResult[] {\n return this.OracleResults;\n }\n @Input() ResultDetails: any = null;\n\n /** @deprecated Use {@link ResultDetails}. */\n @Input() set resultDetails(value: any) {\n this.ResultDetails = value;\n }\n /** @deprecated Use {@link ResultDetails}. */\n get resultDetails(): any {\n return this.ResultDetails;\n }\n @Input() Closeable = true;\n\n /** @deprecated Use {@link Closeable}. */\n @Input() set closeable(value: TestRunDetailPanelComponent['Closeable']) {\n this.Closeable = value;\n }\n /** @deprecated Use {@link Closeable}. */\n get closeable(): TestRunDetailPanelComponent['Closeable'] {\n return this.Closeable;\n }\n\n @Output() Close = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link Close}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (close) keeps working. Must stay AFTER Close: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() close = this.Close;\n @Output() ViewTarget = new EventEmitter<{ type: string; id: string }>();\n\n /**\n * @deprecated Use {@link ViewTarget}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (viewTarget) keeps working. Must stay AFTER ViewTarget: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() viewTarget = this.ViewTarget;\n @Output() SubmitFeedback = new EventEmitter<{\n rating: number;\n isCorrect: boolean;\n comments: string;\n }>();\n\n /**\n * @deprecated Use {@link SubmitFeedback}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (submitFeedback) keeps working. Must stay AFTER SubmitFeedback: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() submitFeedback = this.SubmitFeedback;\n\n ShowResultDetails = false;\n\n /** @deprecated Use {@link ShowResultDetails}. */\n get showResultDetails() {\n return this.ShowResultDetails;\n }\n /** @deprecated Use {@link ShowResultDetails}. */\n set showResultDetails(value) {\n this.ShowResultDetails = value;\n }\n FeedbackRating = 5;\n\n /** @deprecated Use {@link FeedbackRating}. */\n get feedbackRating() {\n return this.FeedbackRating;\n }\n /** @deprecated Use {@link FeedbackRating}. */\n set feedbackRating(value) {\n this.FeedbackRating = value;\n }\n FeedbackIsCorrect = true;\n\n /** @deprecated Use {@link FeedbackIsCorrect}. */\n get feedbackIsCorrect() {\n return this.FeedbackIsCorrect;\n }\n /** @deprecated Use {@link FeedbackIsCorrect}. */\n set feedbackIsCorrect(value) {\n this.FeedbackIsCorrect = value;\n }\n FeedbackComments = '';\n\n /** @deprecated Use {@link FeedbackComments}. */\n get feedbackComments() {\n return this.FeedbackComments;\n }\n /** @deprecated Use {@link FeedbackComments}. */\n set feedbackComments(value) {\n this.FeedbackComments = value;\n }\n SubmittingFeedback = false;\n\n /** @deprecated Use {@link SubmittingFeedback}. */\n get submittingFeedback() {\n return this.SubmittingFeedback;\n }\n /** @deprecated Use {@link SubmittingFeedback}. */\n set submittingFeedback(value) {\n this.SubmittingFeedback = value;\n }\n\n FormatDuration(milliseconds: number): string {\n if (milliseconds < 1000) {\n return `${milliseconds}ms`;\n }\n\n const seconds = Math.floor(milliseconds / 1000);\n const minutes = Math.floor(seconds / 60);\n\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n }\n\n /** @deprecated Use {@link FormatDuration}. */\n formatDuration(milliseconds: number): string {\n return this.FormatDuration(milliseconds);\n }\n\n FormatJSON(obj: any): string {\n try {\n return JSON.stringify(obj, null, 2);\n } catch (error) {\n return String(obj);\n }\n }\n\n /** @deprecated Use {@link FormatJSON}. */\n formatJSON(obj: any): string {\n return this.FormatJSON(obj);\n }\n\n // toggleResultDetails() removed — the Result Details disclosure is now an\n // <mj-accordion-panel> bound via [(Expanded)]=\"showResultDetails\" (pure flip,\n // default change detection), so no explicit toggle handler is needed.\n\n OnClose(): void {\n this.Close.emit();\n }\n\n /** @deprecated Use {@link OnClose}. */\n onClose(): void {\n return this.OnClose();\n }\n\n OnViewTarget(): void {\n if (this.TestRun.targetType && this.TestRun.targetLogID) {\n this.ViewTarget.emit({\n type: this.TestRun.targetType,\n id: this.TestRun.targetLogID\n });\n }\n }\n\n /** @deprecated Use {@link OnViewTarget}. */\n onViewTarget(): void {\n return this.OnViewTarget();\n }\n\n async OnSubmitFeedback(): Promise<void> {\n this.SubmittingFeedback = true;\n this.SubmitFeedback.emit({\n rating: this.FeedbackRating,\n isCorrect: this.FeedbackIsCorrect,\n comments: this.FeedbackComments\n });\n\n // Reset after submission\n setTimeout(() => {\n this.SubmittingFeedback = false;\n this.FeedbackRating = 5;\n this.FeedbackIsCorrect = true;\n this.FeedbackComments = '';\n }, 1000);\n }\n\n /** @deprecated Use {@link OnSubmitFeedback}. */\n async onSubmitFeedback(): Promise<void> {\n return this.OnSubmitFeedback();\n }\n}\n"]}
|
|
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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","sourcesContent":["import { Component, Input, Output, EventEmitter, inject } from '@angular/core';\nimport type { IMetadataProvider } from '@memberjunction/core';\nimport { TestRunSummary, TestingInstrumentationService } from '../../services/testing-instrumentation.service';\nimport { OracleResult } from './oracle-breakdown-table.component';\nimport { RubricRunView } from '@memberjunction/ng-testing';\n\n@Component({\n standalone: false,\n selector: 'app-test-run-detail-panel',\n template: `\n @if (testRun) {\n <div class=\"test-run-detail-panel\">\n <div class=\"detail-header\">\n <div class=\"header-left\">\n <h3>{{ testRun.testName }}</h3>\n <div class=\"header-meta\">\n <span class=\"test-type\">\n <i class=\"fa-solid fa-tag\"></i>\n {{ testRun.testType }}\n </span>\n <span class=\"run-time\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ testRun.runDateTime | date:'medium' }}\n </span>\n </div>\n </div>\n <div class=\"header-right\">\n <app-test-status-badge [status]=\"testRun.status\"></app-test-status-badge>\n @if (closeable) {\n <button class=\"close-btn\" (click)=\"onClose()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n <div class=\"detail-content\">\n <!-- Main Metrics -->\n <div class=\"metrics-section\">\n <div class=\"metric-card\">\n <div class=\"metric-label\">Score</div>\n <app-score-indicator [score]=\"testRun.score\" [showBar]=\"true\" [showIcon]=\"true\"></app-score-indicator>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Cost</div>\n <app-cost-display [cost]=\"testRun.cost\" [showIcon]=\"true\"></app-cost-display>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Duration</div>\n <div class=\"metric-value\">{{ formatDuration(testRun.duration) }}</div>\n </div>\n @if (testRun.targetType) {\n <div class=\"metric-card\">\n <div class=\"metric-label\">Target</div>\n <div class=\"metric-value target-link\" (click)=\"onViewTarget()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n {{ testRun.targetType }}\n </div>\n </div>\n }\n </div>\n <!-- Oracle Breakdown -->\n @if (oracleResults && oracleResults.length > 0) {\n <div class=\"oracle-section\">\n <app-oracle-breakdown-table [results]=\"oracleResults\"></app-oracle-breakdown-table>\n </div>\n }\n @if (RubricView) {\n <mj-testing-rubric-result [OracleResults]=\"oracleResults\" [Provider]=\"SessionProvider\"></mj-testing-rubric-result>\n }\n <!-- Result Details -->\n @if (resultDetails) {\n <div class=\"details-section\">\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\" [(Expanded)]=\"showResultDetails\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-file-alt\" style=\"color: var(--mj-brand-primary)\"></i>\n Result Details\n </ng-template>\n <ng-template mjAccordionBody>\n <div class=\"details-content\">\n <pre class=\"json-viewer\">{{ formatJSON(resultDetails) }}</pre>\n </div>\n </ng-template>\n </mj-accordion-panel>\n </div>\n }\n <!-- Feedback Section -->\n <div class=\"feedback-section\">\n <div class=\"section-header\">\n <h4>\n <i class=\"fa-solid fa-comment-dots\"></i>\n Human Feedback\n </h4>\n </div>\n <div class=\"feedback-form\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Rating (1-10)</label>\n <input\n type=\"number\"\n [(ngModel)]=\"feedbackRating\"\n min=\"1\"\n max=\"10\"\n class=\"rating-input\"\n />\n </div>\n <div class=\"form-group\">\n <label>Is Correct?</label>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"feedbackIsCorrect\" />\n <span>Yes, the automated result is correct</span>\n </label>\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <label>Comments</label>\n <textarea\n [(ngModel)]=\"feedbackComments\"\n rows=\"3\"\n class=\"comments-textarea\"\n placeholder=\"Enter your feedback comments...\"\n ></textarea>\n </div>\n <button class=\"submit-btn\" (click)=\"onSubmitFeedback()\" [disabled]=\"submittingFeedback\">\n <i class=\"fa-solid fa-paper-plane\"></i>\n {{ submittingFeedback ? 'Submitting...' : 'Submit Feedback' }}\n </button>\n </div>\n </div>\n </div>\n </div>\n }\n `,\n styles: [`\n .test-run-detail-panel {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-md);\n }\n\n .detail-header {\n padding: 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-text-inverse);\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: var(--mj-bg-surface-card);\n padding: 16px;\n border-radius: 8px;\n border-left: 4px solid var(--mj-brand-primary);\n }\n\n .metric-label {\n font-size: 11px;\n color: var(--mj-text-secondary);\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: var(--mj-text-primary);\n }\n\n .target-link {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\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 var(--mj-border-default);\n }\n\n .section-header h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-header h4 i {\n color: var(--mj-brand-primary);\n }\n\n /* .toggle-btn removed — the Result Details chevron is now provided by\n <mj-accordion-panel>. (.section-header is kept; the Feedback section\n still uses it.) */\n\n .details-content {\n margin-top: 12px;\n }\n\n .json-viewer {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\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: var(--mj-bg-surface-card);\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: var(--mj-text-secondary);\n }\n\n .rating-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\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: var(--mj-text-primary);\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 var(--mj-border-default);\n border-radius: 4px;\n font-size: 13px;\n font-family: inherit;\n resize: vertical;\n }\n\n .submit-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-brand-primary-hover);\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 `]\n})\nexport class TestRunDetailPanelComponent {\n private readonly session = inject(TestingInstrumentationService, { optional: true });\n\n /** The signed-in session provider. An input wins; otherwise the testing service's provider is used. */\n @Input() Provider: IMetadataProvider | null = null;\n\n public get SessionProvider(): IMetadataProvider | null {\n return this.Provider ?? this.session?.Provider ?? null;\n }\n\n @Input() TestRun!: TestRunSummary;\n\n /** @deprecated Use {@link TestRun}. */\n @Input() set testRun(value: TestRunSummary) {\n this.TestRun = value;\n }\n /** @deprecated Use {@link TestRun}. */\n get testRun(): TestRunSummary {\n return this.TestRun;\n }\n @Input() OracleResults: OracleResult[] = [];\n\n /** @deprecated Use {@link OracleResults}. */\n @Input() set oracleResults(value: OracleResult[]) {\n this.OracleResults = value;\n }\n get RubricView() {\n return RubricRunView(this.OracleResults);\n }\n\n /** @deprecated Use {@link OracleResults}. */\n get oracleResults(): OracleResult[] {\n return this.OracleResults;\n }\n @Input() ResultDetails: any = null;\n\n /** @deprecated Use {@link ResultDetails}. */\n @Input() set resultDetails(value: any) {\n this.ResultDetails = value;\n }\n /** @deprecated Use {@link ResultDetails}. */\n get resultDetails(): any {\n return this.ResultDetails;\n }\n @Input() Closeable = true;\n\n /** @deprecated Use {@link Closeable}. */\n @Input() set closeable(value: TestRunDetailPanelComponent['Closeable']) {\n this.Closeable = value;\n }\n /** @deprecated Use {@link Closeable}. */\n get closeable(): TestRunDetailPanelComponent['Closeable'] {\n return this.Closeable;\n }\n\n @Output() Close = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link Close}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (close) keeps working. Must stay AFTER Close: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() close = this.Close;\n @Output() ViewTarget = new EventEmitter<{ type: string; id: string }>();\n\n /**\n * @deprecated Use {@link ViewTarget}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (viewTarget) keeps working. Must stay AFTER ViewTarget: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() viewTarget = this.ViewTarget;\n @Output() SubmitFeedback = new EventEmitter<{\n rating: number;\n isCorrect: boolean;\n comments: string;\n }>();\n\n /**\n * @deprecated Use {@link SubmitFeedback}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (submitFeedback) keeps working. Must stay AFTER SubmitFeedback: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() submitFeedback = this.SubmitFeedback;\n\n ShowResultDetails = false;\n\n /** @deprecated Use {@link ShowResultDetails}. */\n get showResultDetails() {\n return this.ShowResultDetails;\n }\n /** @deprecated Use {@link ShowResultDetails}. */\n set showResultDetails(value) {\n this.ShowResultDetails = value;\n }\n FeedbackRating = 5;\n\n /** @deprecated Use {@link FeedbackRating}. */\n get feedbackRating() {\n return this.FeedbackRating;\n }\n /** @deprecated Use {@link FeedbackRating}. */\n set feedbackRating(value) {\n this.FeedbackRating = value;\n }\n FeedbackIsCorrect = true;\n\n /** @deprecated Use {@link FeedbackIsCorrect}. */\n get feedbackIsCorrect() {\n return this.FeedbackIsCorrect;\n }\n /** @deprecated Use {@link FeedbackIsCorrect}. */\n set feedbackIsCorrect(value) {\n this.FeedbackIsCorrect = value;\n }\n FeedbackComments = '';\n\n /** @deprecated Use {@link FeedbackComments}. */\n get feedbackComments() {\n return this.FeedbackComments;\n }\n /** @deprecated Use {@link FeedbackComments}. */\n set feedbackComments(value) {\n this.FeedbackComments = value;\n }\n SubmittingFeedback = false;\n\n /** @deprecated Use {@link SubmittingFeedback}. */\n get submittingFeedback() {\n return this.SubmittingFeedback;\n }\n /** @deprecated Use {@link SubmittingFeedback}. */\n set submittingFeedback(value) {\n this.SubmittingFeedback = value;\n }\n\n FormatDuration(milliseconds: number): string {\n if (milliseconds < 1000) {\n return `${milliseconds}ms`;\n }\n\n const seconds = Math.floor(milliseconds / 1000);\n const minutes = Math.floor(seconds / 60);\n\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n }\n\n /** @deprecated Use {@link FormatDuration}. */\n formatDuration(milliseconds: number): string {\n return this.FormatDuration(milliseconds);\n }\n\n FormatJSON(obj: any): string {\n try {\n return JSON.stringify(obj, null, 2);\n } catch (error) {\n return String(obj);\n }\n }\n\n /** @deprecated Use {@link FormatJSON}. */\n formatJSON(obj: any): string {\n return this.FormatJSON(obj);\n }\n\n // toggleResultDetails() removed — the Result Details disclosure is now an\n // <mj-accordion-panel> bound via [(Expanded)]=\"showResultDetails\" (pure flip,\n // default change detection), so no explicit toggle handler is needed.\n\n OnClose(): void {\n this.Close.emit();\n }\n\n /** @deprecated Use {@link OnClose}. */\n onClose(): void {\n return this.OnClose();\n }\n\n OnViewTarget(): void {\n if (this.TestRun.targetType && this.TestRun.targetLogID) {\n this.ViewTarget.emit({\n type: this.TestRun.targetType,\n id: this.TestRun.targetLogID\n });\n }\n }\n\n /** @deprecated Use {@link OnViewTarget}. */\n onViewTarget(): void {\n return this.OnViewTarget();\n }\n\n async OnSubmitFeedback(): Promise<void> {\n this.SubmittingFeedback = true;\n this.SubmitFeedback.emit({\n rating: this.FeedbackRating,\n isCorrect: this.FeedbackIsCorrect,\n comments: this.FeedbackComments\n });\n\n // Reset after submission\n setTimeout(() => {\n this.SubmittingFeedback = false;\n this.FeedbackRating = 5;\n this.FeedbackIsCorrect = true;\n this.FeedbackComments = '';\n }, 1000);\n }\n\n /** @deprecated Use {@link OnSubmitFeedback}. */\n async onSubmitFeedback(): Promise<void> {\n return this.OnSubmitFeedback();\n }\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ChangeDetectorRef, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
|
|
2
|
+
import type { IMetadataProvider } from '@memberjunction/core';
|
|
3
|
+
import type { WorkQueueValidateBindingsOutput } from '@memberjunction/core-entities';
|
|
4
|
+
import { WorkQueueOperatorService } from '../services/work-queue-operator.service';
|
|
5
|
+
import type { WorkQueueTransportOption } from '../work-queue-types';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
type BindingIssue = WorkQueueValidateBindingsOutput['issues'][number];
|
|
8
|
+
/**
|
|
9
|
+
* Runs WorkQueue.ValidateBindings for every transport (or one) and lists the issues by severity. Read-only: the
|
|
10
|
+
* fix is always a metadata or infrastructure change, so each issue links back to its subject in words.
|
|
11
|
+
*/
|
|
12
|
+
export declare class WorkQueueBindingsComponent implements OnChanges {
|
|
13
|
+
private readonly operator;
|
|
14
|
+
private readonly cdr;
|
|
15
|
+
Provider: IMetadataProvider;
|
|
16
|
+
Transports: WorkQueueTransportOption[];
|
|
17
|
+
Loaded: EventEmitter<{
|
|
18
|
+
Errors: number;
|
|
19
|
+
Warnings: number;
|
|
20
|
+
}>;
|
|
21
|
+
SelectedTransport: string | null;
|
|
22
|
+
Issues: BindingIssue[];
|
|
23
|
+
IsLoading: boolean;
|
|
24
|
+
HasRun: boolean;
|
|
25
|
+
LoadError: string | null;
|
|
26
|
+
LastRunAt: Date | null;
|
|
27
|
+
constructor(operator: WorkQueueOperatorService, cdr: ChangeDetectorRef);
|
|
28
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
29
|
+
get Errors(): BindingIssue[];
|
|
30
|
+
get Warnings(): BindingIssue[];
|
|
31
|
+
OnTransportChange(name: string): void;
|
|
32
|
+
Refresh(): Promise<void>;
|
|
33
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<WorkQueueBindingsComponent, never>;
|
|
34
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<WorkQueueBindingsComponent, "mj-work-queue-bindings", never, { "Provider": { "alias": "Provider"; "required": false; }; "Transports": { "alias": "Transports"; "required": false; }; }, { "Loaded": "Loaded"; }, never, never, false, never>;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=work-queue-bindings.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-queue-bindings.component.d.ts","sourceRoot":"","sources":["../../../src/WorkQueue/components/work-queue-bindings.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,iBAAiB,EAAa,YAAY,EAAS,SAAS,EAAU,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7I,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;;AAEpE,KAAK,YAAY,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE;;;GAGG;AACH,qBAOa,0BAA2B,YAAW,SAAS;IAY5C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAA4B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAX5E,QAAQ,EAAG,iBAAiB,CAAC;IAC7B,UAAU,EAAE,wBAAwB,EAAE,CAAM;IAC3C,MAAM;gBAA8B,MAAM;kBAAY,MAAM;OAAM;IAErE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,MAAM,EAAE,YAAY,EAAE,CAAM;IAC5B,SAAS,UAAS;IAClB,MAAM,UAAS;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAChC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAQ;gBAER,QAAQ,EAAE,wBAAwB,EAAmB,GAAG,EAAE,iBAAiB;IAEjG,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMhD,IAAW,MAAM,IAAI,YAAY,EAAE,CAElC;IAED,IAAW,QAAQ,IAAI,YAAY,EAAE,CAEpC;IAEM,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;yCAjC5B,0BAA0B;2CAA1B,0BAA0B;CAoDtC"}
|