@memberjunction/ng-dashboards 5.21.0 → 5.22.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/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +102 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +583 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +148 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +773 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +241 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.js +1782 -0
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -0
- package/dist/AI/index.d.ts +3 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +6 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +50 -7
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +161 -193
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +11 -0
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +57 -0
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +10 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +35 -11
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts +1 -0
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +8 -4
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +181 -1
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +1704 -182
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +121 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +1058 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts +56 -0
- package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js +291 -0
- package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js.map +1 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +85 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +461 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/index.d.ts +4 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -0
- package/dist/KnowledgeHub/index.js +5 -0
- package/dist/KnowledgeHub/index.js.map +1 -0
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +5 -1
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1 -0
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +7 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +63 -8
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +9 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +109 -62
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +241 -200
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +7 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +63 -8
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +7 -5
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +9 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +128 -59
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +26 -19
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +40 -5
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -0
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +3 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +4 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +5 -1
- package/dist/public-api.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +5 -4
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +4 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +44 -42
|
@@ -8,101 +8,142 @@ import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
|
8
8
|
import { BaseDashboard } from '@memberjunction/ng-shared';
|
|
9
9
|
import { RegisterClass } from '@memberjunction/global';
|
|
10
10
|
import { Subject } from 'rxjs';
|
|
11
|
-
import { debounceTime } from 'rxjs/operators';
|
|
11
|
+
import { debounceTime, takeUntil } from 'rxjs/operators';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@
|
|
14
|
-
import * as i2 from "@
|
|
15
|
-
import * as i3 from "@memberjunction/ng-
|
|
16
|
-
import * as i4 from "
|
|
17
|
-
import * as i5 from "./components/testing-
|
|
18
|
-
import * as i6 from "./components/testing-
|
|
19
|
-
import * as i7 from "./components/testing-
|
|
13
|
+
import * as i1 from "@memberjunction/ng-testing";
|
|
14
|
+
import * as i2 from "@progress/kendo-angular-dialog";
|
|
15
|
+
import * as i3 from "@memberjunction/ng-versions";
|
|
16
|
+
import * as i4 from "@memberjunction/ng-shared-generic";
|
|
17
|
+
import * as i5 from "./components/testing-dashboard-tab.component";
|
|
18
|
+
import * as i6 from "./components/testing-runs.component";
|
|
19
|
+
import * as i7 from "./components/testing-analytics.component";
|
|
20
|
+
import * as i8 from "./components/testing-review.component";
|
|
20
21
|
function TestingDashboardComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
21
22
|
i0.ɵɵelementStart(0, "div", 1);
|
|
22
23
|
i0.ɵɵelement(1, "mj-loading", 3);
|
|
23
24
|
i0.ɵɵelementEnd();
|
|
24
25
|
} }
|
|
25
|
-
function
|
|
26
|
+
function TestingDashboardComponent_Conditional_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
26
27
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
27
|
-
i0.ɵɵelementStart(0, "div",
|
|
28
|
-
i0.ɵɵ
|
|
28
|
+
i0.ɵɵelementStart(0, "div", 4);
|
|
29
|
+
i0.ɵɵelement(1, "i", 11);
|
|
30
|
+
i0.ɵɵelementStart(2, "span", 12);
|
|
31
|
+
i0.ɵɵtext(3);
|
|
32
|
+
i0.ɵɵelementEnd();
|
|
33
|
+
i0.ɵɵelementStart(4, "span", 13);
|
|
34
|
+
i0.ɵɵtext(5);
|
|
35
|
+
i0.ɵɵelementEnd();
|
|
36
|
+
i0.ɵɵelementStart(6, "button", 14);
|
|
37
|
+
i0.ɵɵlistener("click", function TestingDashboardComponent_Conditional_2_Conditional_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnViewActiveRun(ctx_r1.ActiveRuns[0])); });
|
|
38
|
+
i0.ɵɵtext(7, "View");
|
|
39
|
+
i0.ɵɵelementEnd()();
|
|
40
|
+
} if (rf & 2) {
|
|
41
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
42
|
+
i0.ɵɵadvance(3);
|
|
43
|
+
i0.ɵɵtextInterpolate2("", ctx_r1.ActiveRuns.length, " test", ctx_r1.ActiveRuns.length === 1 ? "" : "s", " running");
|
|
44
|
+
i0.ɵɵadvance(2);
|
|
45
|
+
i0.ɵɵtextInterpolate2("", ctx_r1.ActiveRuns[0].TestName, " \u2014 ", ctx_r1.ActiveRuns[0].Progress, "%");
|
|
46
|
+
} }
|
|
47
|
+
function TestingDashboardComponent_Conditional_2_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
48
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
49
|
+
i0.ɵɵelementStart(0, "div", 15);
|
|
50
|
+
i0.ɵɵlistener("click", function TestingDashboardComponent_Conditional_2_For_4_Template_div_click_0_listener() { const $index_r4 = i0.ɵɵrestoreView(_r3).$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTabChange(ctx_r1.navigationItems[$index_r4])); });
|
|
29
51
|
i0.ɵɵelement(1, "i");
|
|
30
52
|
i0.ɵɵelementStart(2, "span");
|
|
31
53
|
i0.ɵɵtext(3);
|
|
32
54
|
i0.ɵɵelementEnd()();
|
|
33
55
|
} if (rf & 2) {
|
|
34
|
-
const
|
|
35
|
-
i0.ɵɵclassProp("active",
|
|
56
|
+
const navItem_r5 = ctx.$implicit;
|
|
57
|
+
i0.ɵɵclassProp("active", navItem_r5.selected);
|
|
36
58
|
i0.ɵɵadvance();
|
|
37
|
-
i0.ɵɵclassMap(
|
|
59
|
+
i0.ɵɵclassMap(navItem_r5.icon);
|
|
38
60
|
i0.ɵɵadvance(2);
|
|
39
|
-
i0.ɵɵtextInterpolate(
|
|
40
|
-
} }
|
|
41
|
-
function TestingDashboardComponent_Conditional_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
42
|
-
const _r5 = i0.ɵɵgetCurrentView();
|
|
43
|
-
i0.ɵɵelementStart(0, "app-testing-dashboard-tab", 10);
|
|
44
|
-
i0.ɵɵlistener("stateChange", function TestingDashboardComponent_Conditional_2_Conditional_7_Template_app_testing_dashboard_tab_stateChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onDashboardStateChange($event)); });
|
|
45
|
-
i0.ɵɵelementEnd();
|
|
46
|
-
} if (rf & 2) {
|
|
47
|
-
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
48
|
-
i0.ɵɵproperty("initialState", ctx_r2.dashboardState);
|
|
61
|
+
i0.ɵɵtextInterpolate(navItem_r5.text);
|
|
49
62
|
} }
|
|
50
63
|
function TestingDashboardComponent_Conditional_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
51
64
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
52
|
-
i0.ɵɵelementStart(0, "app-testing-
|
|
53
|
-
i0.ɵɵlistener("stateChange", function
|
|
65
|
+
i0.ɵɵelementStart(0, "app-testing-dashboard-tab", 16);
|
|
66
|
+
i0.ɵɵlistener("stateChange", function TestingDashboardComponent_Conditional_2_Conditional_8_Template_app_testing_dashboard_tab_stateChange_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDashboardStateChange($event)); });
|
|
54
67
|
i0.ɵɵelementEnd();
|
|
55
68
|
} if (rf & 2) {
|
|
56
|
-
const
|
|
57
|
-
i0.ɵɵproperty("initialState",
|
|
69
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
70
|
+
i0.ɵɵproperty("initialState", ctx_r1.dashboardState);
|
|
58
71
|
} }
|
|
59
72
|
function TestingDashboardComponent_Conditional_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
60
73
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
61
|
-
i0.ɵɵelementStart(0, "app-testing-
|
|
62
|
-
i0.ɵɵlistener("stateChange", function
|
|
74
|
+
i0.ɵɵelementStart(0, "app-testing-runs", 16);
|
|
75
|
+
i0.ɵɵlistener("stateChange", function TestingDashboardComponent_Conditional_2_Conditional_9_Template_app_testing_runs_stateChange_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onRunsStateChange($event)); });
|
|
63
76
|
i0.ɵɵelementEnd();
|
|
64
77
|
} if (rf & 2) {
|
|
65
|
-
const
|
|
66
|
-
i0.ɵɵproperty("initialState",
|
|
78
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
79
|
+
i0.ɵɵproperty("initialState", ctx_r1.runsState);
|
|
67
80
|
} }
|
|
68
81
|
function TestingDashboardComponent_Conditional_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
69
82
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
70
|
-
i0.ɵɵelementStart(0, "app-testing-
|
|
71
|
-
i0.ɵɵlistener("stateChange", function
|
|
83
|
+
i0.ɵɵelementStart(0, "app-testing-analytics", 16);
|
|
84
|
+
i0.ɵɵlistener("stateChange", function TestingDashboardComponent_Conditional_2_Conditional_10_Template_app_testing_analytics_stateChange_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onAnalyticsStateChange($event)); });
|
|
72
85
|
i0.ɵɵelementEnd();
|
|
73
86
|
} if (rf & 2) {
|
|
74
|
-
const
|
|
75
|
-
i0.ɵɵproperty("initialState",
|
|
87
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
88
|
+
i0.ɵɵproperty("initialState", ctx_r1.analyticsState);
|
|
89
|
+
} }
|
|
90
|
+
function TestingDashboardComponent_Conditional_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
91
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
92
|
+
i0.ɵɵelementStart(0, "app-testing-review", 16);
|
|
93
|
+
i0.ɵɵlistener("stateChange", function TestingDashboardComponent_Conditional_2_Conditional_11_Template_app_testing_review_stateChange_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onReviewStateChange($event)); });
|
|
94
|
+
i0.ɵɵelementEnd();
|
|
95
|
+
} if (rf & 2) {
|
|
96
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
97
|
+
i0.ɵɵproperty("initialState", ctx_r1.reviewState);
|
|
76
98
|
} }
|
|
77
99
|
function TestingDashboardComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
78
|
-
i0.ɵɵ
|
|
79
|
-
i0.ɵɵ
|
|
80
|
-
i0.ɵɵ
|
|
100
|
+
i0.ɵɵconditionalCreate(0, TestingDashboardComponent_Conditional_2_Conditional_0_Template, 8, 4, "div", 4);
|
|
101
|
+
i0.ɵɵelementStart(1, "div", 5)(2, "div", 6);
|
|
102
|
+
i0.ɵɵrepeaterCreate(3, TestingDashboardComponent_Conditional_2_For_4_Template, 4, 5, "div", 7, i0.ɵɵrepeaterTrackByIndex);
|
|
103
|
+
i0.ɵɵelement(5, "div", 8)(6, "app-evaluation-mode-toggle");
|
|
81
104
|
i0.ɵɵelementEnd();
|
|
82
|
-
i0.ɵɵelementStart(
|
|
83
|
-
i0.ɵɵconditionalCreate(
|
|
84
|
-
i0.ɵɵconditionalCreate(
|
|
85
|
-
i0.ɵɵconditionalCreate(
|
|
86
|
-
i0.ɵɵconditionalCreate(
|
|
105
|
+
i0.ɵɵelementStart(7, "div", 9);
|
|
106
|
+
i0.ɵɵconditionalCreate(8, TestingDashboardComponent_Conditional_2_Conditional_8_Template, 1, 1, "app-testing-dashboard-tab", 10);
|
|
107
|
+
i0.ɵɵconditionalCreate(9, TestingDashboardComponent_Conditional_2_Conditional_9_Template, 1, 1, "app-testing-runs", 10);
|
|
108
|
+
i0.ɵɵconditionalCreate(10, TestingDashboardComponent_Conditional_2_Conditional_10_Template, 1, 1, "app-testing-analytics", 10);
|
|
109
|
+
i0.ɵɵconditionalCreate(11, TestingDashboardComponent_Conditional_2_Conditional_11_Template, 1, 1, "app-testing-review", 10);
|
|
87
110
|
i0.ɵɵelementEnd()();
|
|
88
111
|
} if (rf & 2) {
|
|
89
|
-
const
|
|
90
|
-
i0.ɵɵ
|
|
91
|
-
i0.ɵɵ
|
|
112
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
113
|
+
i0.ɵɵconditional(ctx_r1.ActiveRuns.length > 0 ? 0 : -1);
|
|
114
|
+
i0.ɵɵadvance(3);
|
|
115
|
+
i0.ɵɵrepeater(ctx_r1.navigationConfig);
|
|
92
116
|
i0.ɵɵadvance(5);
|
|
93
|
-
i0.ɵɵconditional(
|
|
117
|
+
i0.ɵɵconditional(ctx_r1.activeTab === "dashboard" && ctx_r1.hasVisited("dashboard") ? 8 : -1);
|
|
94
118
|
i0.ɵɵadvance();
|
|
95
|
-
i0.ɵɵconditional(
|
|
119
|
+
i0.ɵɵconditional(ctx_r1.activeTab === "runs" && ctx_r1.hasVisited("runs") ? 9 : -1);
|
|
96
120
|
i0.ɵɵadvance();
|
|
97
|
-
i0.ɵɵconditional(
|
|
121
|
+
i0.ɵɵconditional(ctx_r1.activeTab === "analytics" && ctx_r1.hasVisited("analytics") ? 10 : -1);
|
|
98
122
|
i0.ɵɵadvance();
|
|
99
|
-
i0.ɵɵconditional(
|
|
123
|
+
i0.ɵɵconditional(ctx_r1.activeTab === "review" && ctx_r1.hasVisited("review") ? 11 : -1);
|
|
124
|
+
} }
|
|
125
|
+
function TestingDashboardComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
126
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
127
|
+
i0.ɵɵelementStart(0, "mj-slide-panel", 17);
|
|
128
|
+
i0.ɵɵlistener("Closed", function TestingDashboardComponent_Conditional_3_Template_mj_slide_panel_Closed_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnPanelClosed()); });
|
|
129
|
+
i0.ɵɵelementStart(1, "app-test-run-dialog", 18);
|
|
130
|
+
i0.ɵɵlistener("PanelClose", function TestingDashboardComponent_Conditional_3_Template_app_test_run_dialog_PanelClose_1_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnPanelClosed()); });
|
|
131
|
+
i0.ɵɵelementEnd()();
|
|
132
|
+
} if (rf & 2) {
|
|
133
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
134
|
+
i0.ɵɵproperty("Title", (ctx_r1.testingDialogService.PanelOptions == null ? null : ctx_r1.testingDialogService.PanelOptions.testId) ? "Test Execution" : "Run Test")("Resizable", true);
|
|
135
|
+
i0.ɵɵadvance();
|
|
136
|
+
i0.ɵɵproperty("PanelMode", true)("selectedTestId", (ctx_r1.testingDialogService.PanelOptions == null ? null : ctx_r1.testingDialogService.PanelOptions.testId) ?? null)("selectedSuiteId", (ctx_r1.testingDialogService.PanelOptions == null ? null : ctx_r1.testingDialogService.PanelOptions.suiteId) ?? null)("runMode", (ctx_r1.testingDialogService.PanelOptions == null ? null : ctx_r1.testingDialogService.PanelOptions.mode) ?? "test");
|
|
100
137
|
} }
|
|
101
138
|
let TestingDashboardComponent = class TestingDashboardComponent extends BaseDashboard {
|
|
102
139
|
cdr;
|
|
140
|
+
testingDialogService;
|
|
141
|
+
executionService;
|
|
103
142
|
isLoading = false;
|
|
104
143
|
activeTab = 'dashboard';
|
|
105
144
|
selectedIndex = 0;
|
|
145
|
+
// Active test runs from execution service
|
|
146
|
+
ActiveRuns = [];
|
|
106
147
|
// Component states
|
|
107
148
|
dashboardState = null;
|
|
108
149
|
runsState = null;
|
|
@@ -119,9 +160,12 @@ let TestingDashboardComponent = class TestingDashboardComponent extends BaseDash
|
|
|
119
160
|
{ text: 'Review', icon: 'fa-solid fa-clipboard-check', selected: false }
|
|
120
161
|
];
|
|
121
162
|
stateChangeSubject = new Subject();
|
|
122
|
-
|
|
163
|
+
destroy$ = new Subject();
|
|
164
|
+
constructor(cdr, testingDialogService, executionService) {
|
|
123
165
|
super();
|
|
124
166
|
this.cdr = cdr;
|
|
167
|
+
this.testingDialogService = testingDialogService;
|
|
168
|
+
this.executionService = executionService;
|
|
125
169
|
this.setupStateManagement();
|
|
126
170
|
this.updateNavigationSelection();
|
|
127
171
|
}
|
|
@@ -132,9 +176,19 @@ let TestingDashboardComponent = class TestingDashboardComponent extends BaseDash
|
|
|
132
176
|
this.visitedTabs.add(this.activeTab);
|
|
133
177
|
this.updateNavigationSelection();
|
|
134
178
|
this.emitStateChange();
|
|
179
|
+
this.executionService.ActiveRuns$.pipe(takeUntil(this.destroy$)).subscribe(runs => {
|
|
180
|
+
this.ActiveRuns = runs;
|
|
181
|
+
this.cdr.markForCheck();
|
|
182
|
+
});
|
|
183
|
+
this.testingDialogService.PanelStateChanged$.pipe(takeUntil(this.destroy$)).subscribe((isOpen) => {
|
|
184
|
+
console.log('[TestingDashboard] PanelStateChanged$:', isOpen, 'IsPanelOpen:', this.testingDialogService.IsPanelOpen);
|
|
185
|
+
this.cdr.detectChanges();
|
|
186
|
+
});
|
|
135
187
|
this.cdr.detectChanges();
|
|
136
188
|
}
|
|
137
189
|
ngOnDestroy() {
|
|
190
|
+
this.destroy$.next();
|
|
191
|
+
this.destroy$.complete();
|
|
138
192
|
this.stateChangeSubject.complete();
|
|
139
193
|
}
|
|
140
194
|
onTabChange(tabId) {
|
|
@@ -224,23 +278,38 @@ let TestingDashboardComponent = class TestingDashboardComponent extends BaseDash
|
|
|
224
278
|
const tabIndex = this.navigationItems.indexOf(this.activeTab);
|
|
225
279
|
return tabIndex >= 0 ? this.navigationConfig[tabIndex].text : 'Testing Dashboard';
|
|
226
280
|
}
|
|
281
|
+
OnPanelClosed() {
|
|
282
|
+
this.testingDialogService.ClosePanel();
|
|
283
|
+
this.cdr.markForCheck();
|
|
284
|
+
}
|
|
285
|
+
OnViewActiveRun(run) {
|
|
286
|
+
this.testingDialogService.OpenTestPanel(run.TestId);
|
|
287
|
+
this.cdr.markForCheck();
|
|
288
|
+
}
|
|
289
|
+
OnViewRunningTestFromTab(testId) {
|
|
290
|
+
this.testingDialogService.OpenTestPanel(testId);
|
|
291
|
+
this.cdr.detectChanges();
|
|
292
|
+
}
|
|
227
293
|
updateNavigationSelection() {
|
|
228
294
|
this.navigationConfig.forEach((item, index) => {
|
|
229
295
|
item.selected = this.navigationItems[index] === this.activeTab;
|
|
230
296
|
});
|
|
231
297
|
}
|
|
232
|
-
static ɵfac = function TestingDashboardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TestingDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
233
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestingDashboardComponent, selectors: [["mj-testing-dashboard"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
298
|
+
static ɵfac = function TestingDashboardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TestingDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.TestingDialogService), i0.ɵɵdirectiveInject(i1.TestingExecutionService)); };
|
|
299
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestingDashboardComponent, selectors: [["mj-testing-dashboard"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 3, consts: [["kendoDialogContainer", "", 1, "testing-dashboard-container"], [1, "loading-container"], ["Mode", "slide", 3, "Title", "Resizable"], ["text", "Loading Testing Dashboard...", "size", "large"], [1, "active-runs-banner"], [1, "dashboard-content-wrapper"], [1, "testing-dashboard-nav"], [1, "nav-item", 3, "active"], [1, "nav-spacer"], [1, "dashboard-content"], [3, "initialState"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "active-runs-count"], [1, "active-runs-detail"], [1, "active-runs-view-btn", 3, "click"], [1, "nav-item", 3, "click"], [3, "stateChange", "initialState"], ["Mode", "slide", 3, "Closed", "Title", "Resizable"], [3, "PanelClose", "PanelMode", "selectedTestId", "selectedSuiteId", "runMode"]], template: function TestingDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
234
300
|
i0.ɵɵelementStart(0, "div", 0);
|
|
235
301
|
i0.ɵɵconditionalCreate(1, TestingDashboardComponent_Conditional_1_Template, 2, 0, "div", 1);
|
|
236
|
-
i0.ɵɵconditionalCreate(2, TestingDashboardComponent_Conditional_2_Template,
|
|
302
|
+
i0.ɵɵconditionalCreate(2, TestingDashboardComponent_Conditional_2_Template, 12, 5);
|
|
303
|
+
i0.ɵɵconditionalCreate(3, TestingDashboardComponent_Conditional_3_Template, 2, 6, "mj-slide-panel", 2);
|
|
237
304
|
i0.ɵɵelementEnd();
|
|
238
305
|
} if (rf & 2) {
|
|
239
306
|
i0.ɵɵadvance();
|
|
240
307
|
i0.ɵɵconditional(ctx.isLoading ? 1 : -1);
|
|
241
308
|
i0.ɵɵadvance();
|
|
242
309
|
i0.ɵɵconditional(!ctx.isLoading ? 2 : -1);
|
|
243
|
-
|
|
310
|
+
i0.ɵɵadvance();
|
|
311
|
+
i0.ɵɵconditional(ctx.testingDialogService.IsPanelOpen ? 3 : -1);
|
|
312
|
+
} }, dependencies: [i2.DialogContainerDirective, i1.TestRunDialogComponent, i1.EvaluationModeToggleComponent, i3.MjSlidePanelComponent, i4.LoadingComponent, i5.TestingDashboardTabComponent, i6.TestingRunsComponent, i7.TestingAnalyticsComponent, i8.TestingReviewComponent], styles: ["\n\n\n\n\n\n.testing-dashboard-container[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n position: relative;\n overflow: hidden;\n}\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background: var(--mj-bg-surface);\n backdrop-filter: blur(8px);\n}\n\n.loading-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n display: inline-block;\n position: relative;\n width: 80px;\n height: 80px;\n}\n\n.spinner-ring[_ngcontent-%COMP%] {\n box-sizing: border-box;\n display: block;\n position: absolute;\n width: 64px;\n height: 64px;\n margin: 8px;\n border: 8px solid var(--mj-brand-primary);\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spinner-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n border-color: var(--mj-brand-primary) transparent transparent transparent;\n}\n\n.spinner-ring[_ngcontent-%COMP%]:nth-child(1) {\n animation-delay: -0.45s;\n}\n\n.spinner-ring[_ngcontent-%COMP%]:nth-child(2) {\n animation-delay: -0.3s;\n}\n\n.spinner-ring[_ngcontent-%COMP%]:nth-child(3) {\n animation-delay: -0.15s;\n}\n\n@keyframes _ngcontent-%COMP%_spinner-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.loading-text[_ngcontent-%COMP%] {\n margin-top: 20px;\n font-size: 16px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n\n\n.dashboard-content-wrapper[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.dashboard-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n}\n\n\n\n.testing-dashboard-nav[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-start;\n gap: 2px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n padding: 0 16px;\n position: relative;\n z-index: 10;\n}\n\n.nav-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 16px 24px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n border-bottom: 3px solid transparent;\n white-space: nowrap;\n position: relative;\n font-weight: 500;\n}\n\n.nav-item[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 3px;\n background: transparent;\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: 8px 8px 0 0;\n}\n\n.nav-item[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n}\n\n.nav-item[_ngcontent-%COMP%]:hover::before {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.nav-item.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.nav-item.active[_ngcontent-%COMP%]::before {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n z-index: 1;\n}\n\n.nav-item[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n transform: scale(1.1);\n}\n\n.nav-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n letter-spacing: 0.2px;\n position: relative;\n z-index: 1;\n}\n\n\n\n.nav-spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n\n\n.active-runs-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 20px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.active-runs-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.active-runs-count[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.active-runs-detail[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.active-runs-view-btn[_ngcontent-%COMP%] {\n padding: 4px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.2s;\n}\n\n.active-runs-view-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n@media (max-width: 768px) {\n .testing-dashboard-nav[_ngcontent-%COMP%] {\n padding: 0 8px;\n overflow-x: auto;\n }\n\n .nav-item[_ngcontent-%COMP%] {\n padding: 12px 16px;\n gap: 8px;\n }\n\n .nav-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n\n .active-runs-banner[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n padding: 8px 12px;\n gap: 6px;\n }\n\n .active-runs-detail[_ngcontent-%COMP%] {\n width: 100%;\n order: 3;\n }\n}\n\n@media (max-width: 480px) {\n .nav-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: none;\n }\n\n .nav-item[_ngcontent-%COMP%] {\n padding: 12px 14px;\n }\n}"], changeDetection: 0 });
|
|
244
313
|
};
|
|
245
314
|
TestingDashboardComponent = __decorate([
|
|
246
315
|
RegisterClass(BaseDashboard, 'TestingDashboard')
|
|
@@ -248,7 +317,7 @@ TestingDashboardComponent = __decorate([
|
|
|
248
317
|
export { TestingDashboardComponent };
|
|
249
318
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TestingDashboardComponent, [{
|
|
250
319
|
type: Component,
|
|
251
|
-
args: [{ standalone: false, selector: 'mj-testing-dashboard', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"testing-dashboard-container\" kendoDialogContainer>\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading Testing Dashboard...\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (!isLoading) {\n <div class=\"dashboard-content-wrapper\">\n <div class=\"testing-dashboard-nav\">\n @for (navItem of navigationConfig; track $index) {\n <div\n class=\"nav-item\"\n [class.active]=\"navItem.selected\"\n (click)=\"onTabChange(navigationItems[$index])\"\n >\n <i [class]=\"navItem.icon\"></i>\n <span>{{ navItem.text }}</span>\n </div>\n }\n <div class=\"nav-spacer\"></div>\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n </div>\n\n <div class=\"dashboard-content\">\n @if (activeTab === 'dashboard' && hasVisited('dashboard')) {\n <app-testing-dashboard-tab\n [initialState]=\"dashboardState\"\n (stateChange)=\"onDashboardStateChange($event)\"\n ></app-testing-dashboard-tab>\n }\n\n @if (activeTab === 'runs' && hasVisited('runs')) {\n <app-testing-runs\n [initialState]=\"runsState\"\n (stateChange)=\"onRunsStateChange($event)\"\n ></app-testing-runs>\n }\n\n @if (activeTab === 'analytics' && hasVisited('analytics')) {\n <app-testing-analytics\n [initialState]=\"analyticsState\"\n (stateChange)=\"onAnalyticsStateChange($event)\"\n ></app-testing-analytics>\n }\n\n @if (activeTab === 'review' && hasVisited('review')) {\n <app-testing-review\n [initialState]=\"reviewState\"\n (stateChange)=\"onReviewStateChange($event)\"\n ></app-testing-review>\n }\n </div>\n </div>\n }\n</div>\n", styles: ["/* ============================================\n Testing Dashboard - Premium Design System\n Based on AI Dashboard patterns\n ============================================ */\n\n.testing-dashboard-container {\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n position: relative;\n overflow: hidden;\n}\n\n/* Loading State */\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background: var(--mj-bg-surface);\n backdrop-filter: blur(8px);\n}\n\n.loading-content {\n text-align: center;\n}\n\n.loading-spinner {\n display: inline-block;\n position: relative;\n width: 80px;\n height: 80px;\n}\n\n.spinner-ring {\n box-sizing: border-box;\n display: block;\n position: absolute;\n width: 64px;\n height: 64px;\n margin: 8px;\n border: 8px solid var(--mj-brand-primary);\n border-radius: 50%;\n animation: spinner-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n border-color: var(--mj-brand-primary) transparent transparent transparent;\n}\n\n.spinner-ring:nth-child(1) {\n animation-delay: -0.45s;\n}\n\n.spinner-ring:nth-child(2) {\n animation-delay: -0.3s;\n}\n\n.spinner-ring:nth-child(3) {\n animation-delay: -0.15s;\n}\n\n@keyframes spinner-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.loading-text {\n margin-top: 20px;\n font-size: 16px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n/* Dashboard Layout */\n.dashboard-content-wrapper {\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.dashboard-content {\n flex: 1;\n overflow: hidden;\n}\n\n/* Premium Navigation Tabs */\n.testing-dashboard-nav {\n display: flex;\n justify-content: flex-start;\n gap: 2px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n padding: 0 16px;\n position: relative;\n z-index: 10;\n}\n\n.nav-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 16px 24px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n border-bottom: 3px solid transparent;\n white-space: nowrap;\n position: relative;\n font-weight: 500;\n}\n\n.nav-item::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 3px;\n background: transparent;\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: 8px 8px 0 0;\n}\n\n.nav-item:hover {\n color: var(--mj-brand-primary);\n}\n\n.nav-item:hover::before {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.nav-item.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.nav-item.active::before {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.nav-item i {\n font-size: 16px;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n z-index: 1;\n}\n\n.nav-item:hover i {\n transform: scale(1.1);\n}\n\n.nav-item span {\n font-size: 13px;\n font-weight: 600;\n letter-spacing: 0.2px;\n position: relative;\n z-index: 1;\n}\n\n/* Spacer for flex layout */\n.nav-spacer {\n flex: 1;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .testing-dashboard-nav {\n padding: 0 8px;\n overflow-x: auto;\n }\n\n .nav-item {\n padding: 12px 16px;\n gap: 8px;\n }\n\n .nav-item span {\n font-size: 11px;\n }\n\n .nav-item i {\n font-size: 18px;\n }\n}\n"] }]
|
|
252
|
-
}], () => [{ type: i0.ChangeDetectorRef }], null); })();
|
|
253
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestingDashboardComponent, { className: "TestingDashboardComponent", filePath: "src/Testing/testing-dashboard.component.ts", lineNumber:
|
|
320
|
+
args: [{ standalone: false, selector: 'mj-testing-dashboard', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"testing-dashboard-container\" kendoDialogContainer>\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading Testing Dashboard...\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (!isLoading) {\n <!-- Active Runs Banner -->\n @if (ActiveRuns.length > 0) {\n <div class=\"active-runs-banner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span class=\"active-runs-count\">{{ ActiveRuns.length }} test{{ ActiveRuns.length === 1 ? '' : 's' }} running</span>\n <span class=\"active-runs-detail\">{{ ActiveRuns[0].TestName }} — {{ ActiveRuns[0].Progress }}%</span>\n <button class=\"active-runs-view-btn\" (click)=\"OnViewActiveRun(ActiveRuns[0])\">View</button>\n </div>\n }\n\n <div class=\"dashboard-content-wrapper\">\n <div class=\"testing-dashboard-nav\">\n @for (navItem of navigationConfig; track $index) {\n <div\n class=\"nav-item\"\n [class.active]=\"navItem.selected\"\n (click)=\"onTabChange(navigationItems[$index])\"\n >\n <i [class]=\"navItem.icon\"></i>\n <span>{{ navItem.text }}</span>\n </div>\n }\n <div class=\"nav-spacer\"></div>\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n </div>\n\n <div class=\"dashboard-content\">\n @if (activeTab === 'dashboard' && hasVisited('dashboard')) {\n <app-testing-dashboard-tab\n [initialState]=\"dashboardState\"\n (stateChange)=\"onDashboardStateChange($event)\"\n ></app-testing-dashboard-tab>\n }\n\n @if (activeTab === 'runs' && hasVisited('runs')) {\n <app-testing-runs\n [initialState]=\"runsState\"\n (stateChange)=\"onRunsStateChange($event)\"\n ></app-testing-runs>\n }\n\n @if (activeTab === 'analytics' && hasVisited('analytics')) {\n <app-testing-analytics\n [initialState]=\"analyticsState\"\n (stateChange)=\"onAnalyticsStateChange($event)\"\n ></app-testing-analytics>\n }\n\n @if (activeTab === 'review' && hasVisited('review')) {\n <app-testing-review\n [initialState]=\"reviewState\"\n (stateChange)=\"onReviewStateChange($event)\"\n ></app-testing-review>\n }\n </div>\n </div>\n }\n\n <!-- Slide Panel for Test Execution -->\n @if (testingDialogService.IsPanelOpen) {\n <mj-slide-panel\n Mode=\"slide\"\n [Title]=\"testingDialogService.PanelOptions?.testId ? 'Test Execution' : 'Run Test'\"\n [Resizable]=\"true\"\n (Closed)=\"OnPanelClosed()\">\n <app-test-run-dialog\n [PanelMode]=\"true\"\n [selectedTestId]=\"testingDialogService.PanelOptions?.testId ?? null\"\n [selectedSuiteId]=\"testingDialogService.PanelOptions?.suiteId ?? null\"\n [runMode]=\"testingDialogService.PanelOptions?.mode ?? 'test'\"\n (PanelClose)=\"OnPanelClosed()\">\n </app-test-run-dialog>\n </mj-slide-panel>\n }\n</div>\n", styles: ["/* ============================================\n Testing Dashboard - Premium Design System\n Based on AI Dashboard patterns\n ============================================ */\n\n.testing-dashboard-container {\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n position: relative;\n overflow: hidden;\n}\n\n/* Loading State */\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background: var(--mj-bg-surface);\n backdrop-filter: blur(8px);\n}\n\n.loading-content {\n text-align: center;\n}\n\n.loading-spinner {\n display: inline-block;\n position: relative;\n width: 80px;\n height: 80px;\n}\n\n.spinner-ring {\n box-sizing: border-box;\n display: block;\n position: absolute;\n width: 64px;\n height: 64px;\n margin: 8px;\n border: 8px solid var(--mj-brand-primary);\n border-radius: 50%;\n animation: spinner-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n border-color: var(--mj-brand-primary) transparent transparent transparent;\n}\n\n.spinner-ring:nth-child(1) {\n animation-delay: -0.45s;\n}\n\n.spinner-ring:nth-child(2) {\n animation-delay: -0.3s;\n}\n\n.spinner-ring:nth-child(3) {\n animation-delay: -0.15s;\n}\n\n@keyframes spinner-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.loading-text {\n margin-top: 20px;\n font-size: 16px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n/* Dashboard Layout */\n.dashboard-content-wrapper {\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.dashboard-content {\n flex: 1;\n overflow: hidden;\n}\n\n/* Premium Navigation Tabs */\n.testing-dashboard-nav {\n display: flex;\n justify-content: flex-start;\n gap: 2px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n padding: 0 16px;\n position: relative;\n z-index: 10;\n}\n\n.nav-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 16px 24px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n border-bottom: 3px solid transparent;\n white-space: nowrap;\n position: relative;\n font-weight: 500;\n}\n\n.nav-item::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 3px;\n background: transparent;\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: 8px 8px 0 0;\n}\n\n.nav-item:hover {\n color: var(--mj-brand-primary);\n}\n\n.nav-item:hover::before {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.nav-item.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.nav-item.active::before {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.nav-item i {\n font-size: 16px;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n z-index: 1;\n}\n\n.nav-item:hover i {\n transform: scale(1.1);\n}\n\n.nav-item span {\n font-size: 13px;\n font-weight: 600;\n letter-spacing: 0.2px;\n position: relative;\n z-index: 1;\n}\n\n/* Spacer for flex layout */\n.nav-spacer {\n flex: 1;\n}\n\n/* Active Runs Banner */\n.active-runs-banner {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 20px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.active-runs-banner i {\n color: var(--mj-brand-primary);\n}\n\n.active-runs-count {\n font-weight: 600;\n}\n\n.active-runs-detail {\n color: var(--mj-text-secondary);\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.active-runs-view-btn {\n padding: 4px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.2s;\n}\n\n.active-runs-view-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .testing-dashboard-nav {\n padding: 0 8px;\n overflow-x: auto;\n }\n\n .nav-item {\n padding: 12px 16px;\n gap: 8px;\n }\n\n .nav-item span {\n font-size: 11px;\n }\n\n .nav-item i {\n font-size: 18px;\n }\n\n .active-runs-banner {\n flex-wrap: wrap;\n padding: 8px 12px;\n gap: 6px;\n }\n\n .active-runs-detail {\n width: 100%;\n order: 3;\n }\n}\n\n@media (max-width: 480px) {\n .nav-item span {\n display: none;\n }\n\n .nav-item {\n padding: 12px 14px;\n }\n}\n"] }]
|
|
321
|
+
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.TestingDialogService }, { type: i1.TestingExecutionService }], null); })();
|
|
322
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestingDashboardComponent, { className: "TestingDashboardComponent", filePath: "src/Testing/testing-dashboard.component.ts", lineNumber: 25 }); })();
|
|
254
323
|
//# sourceMappingURL=testing-dashboard.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing-dashboard.component.js","sourceRoot":"","sources":["../../src/Testing/testing-dashboard.component.ts","../../src/Testing/testing-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { ResourceData } from '@memberjunction/core-entities';\n\ninterface TestingDashboardState {\n activeTab: string;\n dashboardState: Record<string, unknown>;\n runsState: Record<string, unknown>;\n analyticsState: Record<string, unknown>;\n reviewState: Record<string, unknown>;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-testing-dashboard',\n templateUrl: './testing-dashboard.component.html',\n styleUrls: ['./testing-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n@RegisterClass(BaseDashboard, 'TestingDashboard')\nexport class TestingDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n\n public isLoading = false;\n public activeTab = 'dashboard';\n public selectedIndex = 0;\n\n // Component states\n public dashboardState: Record<string, unknown> | null = null;\n public runsState: Record<string, unknown> | null = null;\n public analyticsState: Record<string, unknown> | null = null;\n public reviewState: Record<string, unknown> | null = null;\n\n // Track visited tabs for lazy loading\n private visitedTabs = new Set<string>();\n\n // Navigation items\n public navigationItems: string[] = ['dashboard', 'runs', 'analytics', 'review'];\n\n public navigationConfig = [\n { text: 'Dashboard', icon: 'fa-solid fa-gauge-high', selected: false },\n { text: 'Runs', icon: 'fa-solid fa-play-circle', selected: false },\n { text: 'Analytics', icon: 'fa-solid fa-chart-bar', selected: false },\n { text: 'Review', icon: 'fa-solid fa-clipboard-check', selected: false }\n ];\n\n private stateChangeSubject = new Subject<TestingDashboardState>();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n this.setupStateManagement();\n this.updateNavigationSelection();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Testing';\n }\n\n ngAfterViewInit(): void {\n this.visitedTabs.add(this.activeTab);\n this.updateNavigationSelection();\n this.emitStateChange();\n this.cdr.detectChanges();\n }\n\n ngOnDestroy(): void {\n this.stateChangeSubject.complete();\n }\n\n public onTabChange(tabId: string): void {\n this.activeTab = tabId;\n const index = this.navigationItems.indexOf(tabId);\n this.selectedIndex = index >= 0 ? index : 0;\n this.updateNavigationSelection();\n this.visitedTabs.add(tabId);\n this.emitStateChange();\n this.cdr.markForCheck();\n }\n\n public hasVisited(tabId: string): boolean {\n return this.visitedTabs.has(tabId);\n }\n\n private setupStateManagement(): void {\n this.stateChangeSubject.pipe(\n debounceTime(50)\n ).subscribe(state => {\n this.UserStateChanged.emit(state);\n });\n }\n\n private emitStateChange(): void {\n const state: TestingDashboardState = {\n activeTab: this.activeTab,\n dashboardState: (this.dashboardState || {}) as Record<string, unknown>,\n runsState: (this.runsState || {}) as Record<string, unknown>,\n analyticsState: (this.analyticsState || {}) as Record<string, unknown>,\n reviewState: (this.reviewState || {}) as Record<string, unknown>\n };\n\n this.stateChangeSubject.next(state);\n }\n\n public onDashboardStateChange(state: Record<string, unknown>): void {\n this.dashboardState = state;\n this.emitStateChange();\n }\n\n public onRunsStateChange(state: Record<string, unknown>): void {\n this.runsState = state;\n this.emitStateChange();\n }\n\n public onAnalyticsStateChange(state: Record<string, unknown>): void {\n this.analyticsState = state;\n this.emitStateChange();\n }\n\n public onReviewStateChange(state: Record<string, unknown>): void {\n this.reviewState = state;\n this.emitStateChange();\n }\n\n public loadUserState(state: Partial<TestingDashboardState>): void {\n if (state.activeTab) {\n this.activeTab = state.activeTab;\n const index = this.navigationItems.indexOf(state.activeTab);\n this.selectedIndex = index >= 0 ? index : 0;\n this.visitedTabs.add(state.activeTab);\n this.updateNavigationSelection();\n }\n\n if (state.dashboardState) this.dashboardState = state.dashboardState;\n if (state.runsState) this.runsState = state.runsState;\n if (state.analyticsState) this.analyticsState = state.analyticsState;\n if (state.reviewState) this.reviewState = state.reviewState;\n\n this.cdr.markForCheck();\n }\n\n initDashboard(): void {\n try {\n this.isLoading = true;\n } catch (error) {\n console.error('Error initializing Testing dashboard:', error);\n this.Error.emit(new Error('Failed to initialize Testing dashboard. Please try again.'));\n } finally {\n this.isLoading = false;\n }\n }\n\n loadData(): void {\n if (this.Config?.userState) {\n setTimeout(() => {\n if (this.Config?.userState) {\n this.loadUserState(this.Config.userState);\n }\n }, 0);\n }\n\n this.NotifyLoadComplete();\n }\n\n public getCurrentTabLabel(): string {\n const tabIndex = this.navigationItems.indexOf(this.activeTab);\n return tabIndex >= 0 ? this.navigationConfig[tabIndex].text : 'Testing Dashboard';\n }\n\n private updateNavigationSelection(): void {\n this.navigationConfig.forEach((item, index) => {\n item.selected = this.navigationItems[index] === this.activeTab;\n });\n }\n}\n","<div class=\"testing-dashboard-container\" kendoDialogContainer>\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading Testing Dashboard...\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (!isLoading) {\n <div class=\"dashboard-content-wrapper\">\n <div class=\"testing-dashboard-nav\">\n @for (navItem of navigationConfig; track $index) {\n <div\n class=\"nav-item\"\n [class.active]=\"navItem.selected\"\n (click)=\"onTabChange(navigationItems[$index])\"\n >\n <i [class]=\"navItem.icon\"></i>\n <span>{{ navItem.text }}</span>\n </div>\n }\n <div class=\"nav-spacer\"></div>\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n </div>\n\n <div class=\"dashboard-content\">\n @if (activeTab === 'dashboard' && hasVisited('dashboard')) {\n <app-testing-dashboard-tab\n [initialState]=\"dashboardState\"\n (stateChange)=\"onDashboardStateChange($event)\"\n ></app-testing-dashboard-tab>\n }\n\n @if (activeTab === 'runs' && hasVisited('runs')) {\n <app-testing-runs\n [initialState]=\"runsState\"\n (stateChange)=\"onRunsStateChange($event)\"\n ></app-testing-runs>\n }\n\n @if (activeTab === 'analytics' && hasVisited('analytics')) {\n <app-testing-analytics\n [initialState]=\"analyticsState\"\n (stateChange)=\"onAnalyticsStateChange($event)\"\n ></app-testing-analytics>\n }\n\n @if (activeTab === 'review' && hasVisited('review')) {\n <app-testing-review\n [initialState]=\"reviewState\"\n (stateChange)=\"onReviewStateChange($event)\"\n ></app-testing-review>\n }\n </div>\n </div>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"testing-dashboard.component.js","sourceRoot":"","sources":["../../src/Testing/testing-dashboard.component.ts","../../src/Testing/testing-dashboard.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAA+C,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;;;;;;;;;;;ICFrD,8BAA+B;IAC7B,gCAA0E;IAC5E,iBAAM;;;;IAMJ,8BAAgC;IAC9B,wBAA2C;IAC3C,gCAAgC;IAAA,YAA4E;IAAA,iBAAO;IACnH,gCAAiC;IAAA,YAAkE;IAAA,iBAAO;IAC1G,kCAA8E;IAAzC,4MAAS,yCAA2B,CAAC,EAAE,KAAC;IAAC,oBAAI;IACpF,AADoF,iBAAS,EACvF;;;IAH4B,eAA4E;IAA5E,mHAA4E;IAC3E,eAAkE;IAAlE,wGAAkE;;;;IAQjG,+BAIC;IADC,0NAAS,qDAAoC,KAAC;IAE9C,oBAA8B;IAC9B,4BAAM;IAAA,YAAkB;IAC1B,AAD0B,iBAAO,EAC3B;;;IALJ,6CAAiC;IAG9B,cAAsB;IAAtB,8BAAsB;IACnB,eAAkB;IAAlB,qCAAkB;;;;IAS1B,qDAGC;IADC,iPAAe,qCAA8B,KAAC;IAC/C,iBAA4B;;;IAF3B,oDAA+B;;;;IAMjC,4CAGC;IADC,wOAAe,gCAAyB,KAAC;IAC1C,iBAAmB;;;IAFlB,+CAA0B;;;;IAM5B,iDAGC;IADC,8OAAe,qCAA8B,KAAC;IAC/C,iBAAwB;;;IAFvB,oDAA+B;;;;IAMjC,8CAGC;IADC,2OAAe,kCAA2B,KAAC;IAC5C,iBAAqB;;;IAFpB,iDAA4B;;;IAjDpC,yGAA6B;IAU3B,AADF,8BAAuC,aACF;IACjC,yHASC;IAED,AADA,yBAA8B,iCAC2B;IAC3D,iBAAM;IAEN,8BAA+B;IAC7B,gIAA4D;IAO5D,uHAAkD;IAOlD,8HAA4D;IAO5D,2HAAsD;IAO1D,AADE,iBAAM,EACF;;;IAtDN,uDAOC;IAIG,eASC;IATD,sCASC;IAMD,eAKC;IALD,6FAKC;IAED,cAKC;IALD,mFAKC;IAED,cAKC;IALD,8FAKC;IAED,cAKC;IALD,wFAKC;;;;IAOL,0CAI6B;IAA3B,wMAAU,sBAAe,KAAC;IAC1B,+CAKiC;IAA/B,qNAAc,sBAAe,KAAC;IAElC,AADE,iBAAsB,EACP;;;IATf,AADA,mKAAmF,mBACjE;IAGhB,cAAkB;IAGlB,AADA,AADA,AADA,gCAAkB,uIACkD,yIACE,gIACT;;ADrD9D,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,aAAa;IAgChD;IACD;IACC;IAhCH,SAAS,GAAG,KAAK,CAAC;IAClB,SAAS,GAAG,WAAW,CAAC;IACxB,aAAa,GAAG,CAAC,CAAC;IAEzB,0CAA0C;IACnC,UAAU,GAAgB,EAAE,CAAC;IAEpC,mBAAmB;IACZ,cAAc,GAAmC,IAAI,CAAC;IACtD,SAAS,GAAmC,IAAI,CAAC;IACjD,cAAc,GAAmC,IAAI,CAAC;IACtD,WAAW,GAAmC,IAAI,CAAC;IAE1D,sCAAsC;IAC9B,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,mBAAmB;IACZ,eAAe,GAAa,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEzE,gBAAgB,GAAG;QACxB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,KAAK,EAAE;QACtE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,KAAK,EAAE;QAClE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,KAAK,EAAE;QACrE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,6BAA6B,EAAE,QAAQ,EAAE,KAAK,EAAE;KACzE,CAAC;IAEM,kBAAkB,GAAG,IAAI,OAAO,EAAyB,CAAC;IAC1D,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAEvC,YACU,GAAsB,EACvB,oBAA0C,EACzC,gBAAyC;QAEjD,KAAK,EAAE,CAAC;QAJA,QAAG,GAAH,GAAG,CAAmB;QACvB,yBAAoB,GAApB,oBAAoB,CAAsB;QACzC,qBAAgB,GAAhB,gBAAgB,CAAyB;QAGjD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,yBAAyB,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe;QACb,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CACpC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YACjB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,IAAI,CAC/C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;YACrB,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;YACrH,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED,WAAW;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC;IACrC,CAAC;IAEM,WAAW,CAAC,KAAa;QAC9B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,UAAU,CAAC,KAAa;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAC1B,YAAY,CAAC,EAAE,CAAC,CACjB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YAClB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe;QACrB,MAAM,KAAK,GAA0B;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,cAAc,EAAE,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAA4B;YACtE,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAA4B;YAC5D,cAAc,EAAE,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAA4B;YACtE,WAAW,EAAE,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAA4B;SACjE,CAAC;QAEF,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAEM,sBAAsB,CAAC,KAA8B;QAC1D,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEM,iBAAiB,CAAC,KAA8B;QACrD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEM,sBAAsB,CAAC,KAA8B;QAC1D,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEM,mBAAmB,CAAC,KAA8B;QACvD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEM,aAAa,CAAC,KAAqC;QACxD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC5D,IAAI,CAAC,aAAa,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACnC,CAAC;QAED,IAAI,KAAK,CAAC,cAAc;YAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QACrE,IAAI,KAAK,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACtD,IAAI,KAAK,CAAC,cAAc;YAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QACrE,IAAI,KAAK,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAE5D,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,aAAa;QACX,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC,CAAC;QAC1F,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;YAC3B,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;oBAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC,EAAE,CAAC,CAAC,CAAC;QACR,CAAC;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEM,kBAAkB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9D,OAAO,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC;IACpF,CAAC;IAEM,aAAa;QAClB,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,eAAe,CAAC,GAAc;QACnC,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,wBAAwB,CAAC,MAAc;QAC5C,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEO,yBAAyB;QAC/B,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC5C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC;mHA/LU,yBAAyB;6DAAzB,yBAAyB;YCxBtC,8BAA8D;YAC5D,2FAAiB;YAMjB,kFAAkB;YA4DlB,sGAAwC;YAe1C,iBAAM;;YAjFJ,cAIC;YAJD,wCAIC;YAED,cAyDC;YAzDD,yCAyDC;YAGD,cAcC;YAdD,+DAcC;;;ADzDU,yBAAyB;IADrC,aAAa,CAAC,aAAa,EAAE,kBAAkB,CAAC;GACpC,yBAAyB,CAgMrC;;iFAhMY,yBAAyB;cARrC,SAAS;6BACI,KAAK,YACP,sBAAsB,mBAGf,uBAAuB,CAAC,MAAM;;kFAGpC,yBAAyB","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { TestingDialogService, TestingExecutionService, ActiveRun } from '@memberjunction/ng-testing';\n\ninterface TestingDashboardState {\n activeTab: string;\n dashboardState: Record<string, unknown>;\n runsState: Record<string, unknown>;\n analyticsState: Record<string, unknown>;\n reviewState: Record<string, unknown>;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-testing-dashboard',\n templateUrl: './testing-dashboard.component.html',\n styleUrls: ['./testing-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n@RegisterClass(BaseDashboard, 'TestingDashboard')\nexport class TestingDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n\n public isLoading = false;\n public activeTab = 'dashboard';\n public selectedIndex = 0;\n\n // Active test runs from execution service\n public ActiveRuns: ActiveRun[] = [];\n\n // Component states\n public dashboardState: Record<string, unknown> | null = null;\n public runsState: Record<string, unknown> | null = null;\n public analyticsState: Record<string, unknown> | null = null;\n public reviewState: Record<string, unknown> | null = null;\n\n // Track visited tabs for lazy loading\n private visitedTabs = new Set<string>();\n\n // Navigation items\n public navigationItems: string[] = ['dashboard', 'runs', 'analytics', 'review'];\n\n public navigationConfig = [\n { text: 'Dashboard', icon: 'fa-solid fa-gauge-high', selected: false },\n { text: 'Runs', icon: 'fa-solid fa-play-circle', selected: false },\n { text: 'Analytics', icon: 'fa-solid fa-chart-bar', selected: false },\n { text: 'Review', icon: 'fa-solid fa-clipboard-check', selected: false }\n ];\n\n private stateChangeSubject = new Subject<TestingDashboardState>();\n private destroy$ = new Subject<void>();\n\n constructor(\n private cdr: ChangeDetectorRef,\n public testingDialogService: TestingDialogService,\n private executionService: TestingExecutionService\n ) {\n super();\n this.setupStateManagement();\n this.updateNavigationSelection();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Testing';\n }\n\n ngAfterViewInit(): void {\n this.visitedTabs.add(this.activeTab);\n this.updateNavigationSelection();\n this.emitStateChange();\n\n this.executionService.ActiveRuns$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(runs => {\n this.ActiveRuns = runs;\n this.cdr.markForCheck();\n });\n\n this.testingDialogService.PanelStateChanged$.pipe(\n takeUntil(this.destroy$)\n ).subscribe((isOpen) => {\n console.log('[TestingDashboard] PanelStateChanged$:', isOpen, 'IsPanelOpen:', this.testingDialogService.IsPanelOpen);\n this.cdr.detectChanges();\n });\n\n this.cdr.detectChanges();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.stateChangeSubject.complete();\n }\n\n public onTabChange(tabId: string): void {\n this.activeTab = tabId;\n const index = this.navigationItems.indexOf(tabId);\n this.selectedIndex = index >= 0 ? index : 0;\n this.updateNavigationSelection();\n this.visitedTabs.add(tabId);\n this.emitStateChange();\n this.cdr.markForCheck();\n }\n\n public hasVisited(tabId: string): boolean {\n return this.visitedTabs.has(tabId);\n }\n\n private setupStateManagement(): void {\n this.stateChangeSubject.pipe(\n debounceTime(50)\n ).subscribe(state => {\n this.UserStateChanged.emit(state);\n });\n }\n\n private emitStateChange(): void {\n const state: TestingDashboardState = {\n activeTab: this.activeTab,\n dashboardState: (this.dashboardState || {}) as Record<string, unknown>,\n runsState: (this.runsState || {}) as Record<string, unknown>,\n analyticsState: (this.analyticsState || {}) as Record<string, unknown>,\n reviewState: (this.reviewState || {}) as Record<string, unknown>\n };\n\n this.stateChangeSubject.next(state);\n }\n\n public onDashboardStateChange(state: Record<string, unknown>): void {\n this.dashboardState = state;\n this.emitStateChange();\n }\n\n public onRunsStateChange(state: Record<string, unknown>): void {\n this.runsState = state;\n this.emitStateChange();\n }\n\n public onAnalyticsStateChange(state: Record<string, unknown>): void {\n this.analyticsState = state;\n this.emitStateChange();\n }\n\n public onReviewStateChange(state: Record<string, unknown>): void {\n this.reviewState = state;\n this.emitStateChange();\n }\n\n public loadUserState(state: Partial<TestingDashboardState>): void {\n if (state.activeTab) {\n this.activeTab = state.activeTab;\n const index = this.navigationItems.indexOf(state.activeTab);\n this.selectedIndex = index >= 0 ? index : 0;\n this.visitedTabs.add(state.activeTab);\n this.updateNavigationSelection();\n }\n\n if (state.dashboardState) this.dashboardState = state.dashboardState;\n if (state.runsState) this.runsState = state.runsState;\n if (state.analyticsState) this.analyticsState = state.analyticsState;\n if (state.reviewState) this.reviewState = state.reviewState;\n\n this.cdr.markForCheck();\n }\n\n initDashboard(): void {\n try {\n this.isLoading = true;\n } catch (error) {\n console.error('Error initializing Testing dashboard:', error);\n this.Error.emit(new Error('Failed to initialize Testing dashboard. Please try again.'));\n } finally {\n this.isLoading = false;\n }\n }\n\n loadData(): void {\n if (this.Config?.userState) {\n setTimeout(() => {\n if (this.Config?.userState) {\n this.loadUserState(this.Config.userState);\n }\n }, 0);\n }\n\n this.NotifyLoadComplete();\n }\n\n public getCurrentTabLabel(): string {\n const tabIndex = this.navigationItems.indexOf(this.activeTab);\n return tabIndex >= 0 ? this.navigationConfig[tabIndex].text : 'Testing Dashboard';\n }\n\n public OnPanelClosed(): void {\n this.testingDialogService.ClosePanel();\n this.cdr.markForCheck();\n }\n\n public OnViewActiveRun(run: ActiveRun): void {\n this.testingDialogService.OpenTestPanel(run.TestId);\n this.cdr.markForCheck();\n }\n\n public OnViewRunningTestFromTab(testId: string): void {\n this.testingDialogService.OpenTestPanel(testId);\n this.cdr.detectChanges();\n }\n\n private updateNavigationSelection(): void {\n this.navigationConfig.forEach((item, index) => {\n item.selected = this.navigationItems[index] === this.activeTab;\n });\n }\n}\n","<div class=\"testing-dashboard-container\" kendoDialogContainer>\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading Testing Dashboard...\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (!isLoading) {\n <!-- Active Runs Banner -->\n @if (ActiveRuns.length > 0) {\n <div class=\"active-runs-banner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span class=\"active-runs-count\">{{ ActiveRuns.length }} test{{ ActiveRuns.length === 1 ? '' : 's' }} running</span>\n <span class=\"active-runs-detail\">{{ ActiveRuns[0].TestName }} — {{ ActiveRuns[0].Progress }}%</span>\n <button class=\"active-runs-view-btn\" (click)=\"OnViewActiveRun(ActiveRuns[0])\">View</button>\n </div>\n }\n\n <div class=\"dashboard-content-wrapper\">\n <div class=\"testing-dashboard-nav\">\n @for (navItem of navigationConfig; track $index) {\n <div\n class=\"nav-item\"\n [class.active]=\"navItem.selected\"\n (click)=\"onTabChange(navigationItems[$index])\"\n >\n <i [class]=\"navItem.icon\"></i>\n <span>{{ navItem.text }}</span>\n </div>\n }\n <div class=\"nav-spacer\"></div>\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n </div>\n\n <div class=\"dashboard-content\">\n @if (activeTab === 'dashboard' && hasVisited('dashboard')) {\n <app-testing-dashboard-tab\n [initialState]=\"dashboardState\"\n (stateChange)=\"onDashboardStateChange($event)\"\n ></app-testing-dashboard-tab>\n }\n\n @if (activeTab === 'runs' && hasVisited('runs')) {\n <app-testing-runs\n [initialState]=\"runsState\"\n (stateChange)=\"onRunsStateChange($event)\"\n ></app-testing-runs>\n }\n\n @if (activeTab === 'analytics' && hasVisited('analytics')) {\n <app-testing-analytics\n [initialState]=\"analyticsState\"\n (stateChange)=\"onAnalyticsStateChange($event)\"\n ></app-testing-analytics>\n }\n\n @if (activeTab === 'review' && hasVisited('review')) {\n <app-testing-review\n [initialState]=\"reviewState\"\n (stateChange)=\"onReviewStateChange($event)\"\n ></app-testing-review>\n }\n </div>\n </div>\n }\n\n <!-- Slide Panel for Test Execution -->\n @if (testingDialogService.IsPanelOpen) {\n <mj-slide-panel\n Mode=\"slide\"\n [Title]=\"testingDialogService.PanelOptions?.testId ? 'Test Execution' : 'Run Test'\"\n [Resizable]=\"true\"\n (Closed)=\"OnPanelClosed()\">\n <app-test-run-dialog\n [PanelMode]=\"true\"\n [selectedTestId]=\"testingDialogService.PanelOptions?.testId ?? null\"\n [selectedSuiteId]=\"testingDialogService.PanelOptions?.suiteId ?? null\"\n [runMode]=\"testingDialogService.PanelOptions?.mode ?? 'test'\"\n (PanelClose)=\"OnPanelClosed()\">\n </app-test-run-dialog>\n </mj-slide-panel>\n }\n</div>\n"]}
|
|
@@ -13,31 +13,38 @@ import * as i11 from "./AI/components/prompts/prompt-version-control.component";
|
|
|
13
13
|
import * as i12 from "./AI/components/widgets/live-execution-widget.component";
|
|
14
14
|
import * as i13 from "./AI/components/charts/performance-heatmap.component";
|
|
15
15
|
import * as i14 from "./AI/components/requests/agent-requests-resource.component";
|
|
16
|
-
import * as i15 from "
|
|
17
|
-
import * as i16 from "
|
|
18
|
-
import * as i17 from "
|
|
19
|
-
import * as i18 from "
|
|
20
|
-
import * as i19 from "
|
|
21
|
-
import * as i20 from "
|
|
22
|
-
import * as i21 from "@
|
|
23
|
-
import * as i22 from "@
|
|
24
|
-
import * as i23 from "@progress/kendo-angular-
|
|
25
|
-
import * as i24 from "@progress/kendo-angular-
|
|
26
|
-
import * as i25 from "@
|
|
27
|
-
import * as i26 from "@
|
|
28
|
-
import * as i27 from "@
|
|
29
|
-
import * as i28 from "@
|
|
30
|
-
import * as i29 from "@
|
|
31
|
-
import * as i30 from "@
|
|
32
|
-
import * as i31 from "
|
|
33
|
-
import * as i32 from "
|
|
16
|
+
import * as i15 from "./AI/components/autotagging/autotagging-pipeline-resource.component";
|
|
17
|
+
import * as i16 from "./AI/components/duplicates/duplicate-detection-resource.component";
|
|
18
|
+
import * as i17 from "./AI/components/vectors/vector-management-resource.component";
|
|
19
|
+
import * as i18 from "./KnowledgeHub/components/search/knowledge-search-resource.component";
|
|
20
|
+
import * as i19 from "./KnowledgeHub/components/config/knowledge-config-resource.component";
|
|
21
|
+
import * as i20 from "./KnowledgeHub/components/results-detail/search-result-detail.component";
|
|
22
|
+
import * as i21 from "@angular/common";
|
|
23
|
+
import * as i22 from "@angular/forms";
|
|
24
|
+
import * as i23 from "@progress/kendo-angular-buttons";
|
|
25
|
+
import * as i24 from "@progress/kendo-angular-grid";
|
|
26
|
+
import * as i25 from "@progress/kendo-angular-dropdowns";
|
|
27
|
+
import * as i26 from "@progress/kendo-angular-inputs";
|
|
28
|
+
import * as i27 from "@progress/kendo-angular-indicators";
|
|
29
|
+
import * as i28 from "@progress/kendo-angular-dialog";
|
|
30
|
+
import * as i29 from "@progress/kendo-angular-layout";
|
|
31
|
+
import * as i30 from "@progress/kendo-angular-treeview";
|
|
32
|
+
import * as i31 from "@memberjunction/ng-container-directives";
|
|
33
|
+
import * as i32 from "@memberjunction/ng-code-editor";
|
|
34
|
+
import * as i33 from "@memberjunction/ng-shared-generic";
|
|
35
|
+
import * as i34 from "@memberjunction/ng-agents";
|
|
36
|
+
import * as i35 from "@memberjunction/ng-agent-requests";
|
|
37
|
+
import * as i36 from "@memberjunction/ng-trees";
|
|
38
|
+
import * as i37 from "./shared/shared-dashboard-widgets.module";
|
|
39
|
+
import * as i38 from "./shared/shared-pipes.module";
|
|
40
|
+
import * as i39 from "@memberjunction/ng-search";
|
|
34
41
|
/**
|
|
35
42
|
* AIDashboardsModule — AI feature area: models, prompts, agents,
|
|
36
43
|
* execution monitoring, system configuration, and instrumentation widgets.
|
|
37
44
|
*/
|
|
38
45
|
export declare class AIDashboardsModule {
|
|
39
46
|
static ɵfac: i0.ɵɵFactoryDeclaration<AIDashboardsModule, never>;
|
|
40
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<AIDashboardsModule, [typeof i1.ModelManagementComponent, typeof i2.PromptManagementComponent, typeof i3.PromptFilterPanelComponent, typeof i4.AgentConfigurationComponent, typeof i5.AgentFilterPanelComponent, typeof i6.AgentEditorComponent, typeof i7.ExecutionMonitoringComponent, typeof i8.SystemConfigurationComponent, typeof i9.SystemConfigFilterPanelComponent, typeof i10.ModelPromptPriorityMatrixComponent, typeof i11.PromptVersionControlComponent, typeof i12.LiveExecutionWidgetComponent, typeof i13.PerformanceHeatmapComponent, typeof i14.AgentRequestsResourceComponent], [typeof
|
|
47
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<AIDashboardsModule, [typeof i1.ModelManagementComponent, typeof i2.PromptManagementComponent, typeof i3.PromptFilterPanelComponent, typeof i4.AgentConfigurationComponent, typeof i5.AgentFilterPanelComponent, typeof i6.AgentEditorComponent, typeof i7.ExecutionMonitoringComponent, typeof i8.SystemConfigurationComponent, typeof i9.SystemConfigFilterPanelComponent, typeof i10.ModelPromptPriorityMatrixComponent, typeof i11.PromptVersionControlComponent, typeof i12.LiveExecutionWidgetComponent, typeof i13.PerformanceHeatmapComponent, typeof i14.AgentRequestsResourceComponent, typeof i15.AutotaggingPipelineResourceComponent, typeof i16.DuplicateDetectionResourceComponent, typeof i17.VectorManagementResourceComponent, typeof i18.KnowledgeSearchResourceComponent, typeof i19.KnowledgeConfigResourceComponent, typeof i20.SearchResultDetailComponent], [typeof i21.CommonModule, typeof i22.FormsModule, typeof i22.ReactiveFormsModule, typeof i23.ButtonsModule, typeof i24.GridModule, typeof i25.DropDownsModule, typeof i26.InputsModule, typeof i27.IndicatorsModule, typeof i28.DialogsModule, typeof i28.WindowModule, typeof i29.TabStripModule, typeof i29.SplitterModule, typeof i30.TreeViewModule, typeof i31.ContainerDirectivesModule, typeof i32.CodeEditorModule, typeof i33.SharedGenericModule, typeof i34.AgentsModule, typeof i35.AgentRequestsModule, typeof i36.NgTreesModule, typeof i37.SharedDashboardWidgetsModule, typeof i38.SharedPipesModule, typeof i39.SearchModule], [typeof i1.ModelManagementComponent, typeof i2.PromptManagementComponent, typeof i4.AgentConfigurationComponent, typeof i7.ExecutionMonitoringComponent, typeof i8.SystemConfigurationComponent, typeof i12.LiveExecutionWidgetComponent, typeof i13.PerformanceHeatmapComponent, typeof i14.AgentRequestsResourceComponent, typeof i15.AutotaggingPipelineResourceComponent, typeof i16.DuplicateDetectionResourceComponent, typeof i17.VectorManagementResourceComponent, typeof i18.KnowledgeSearchResourceComponent, typeof i19.KnowledgeConfigResourceComponent, typeof i20.SearchResultDetailComponent, typeof i37.SharedDashboardWidgetsModule]>;
|
|
41
48
|
static ɵinj: i0.ɵɵInjectorDeclaration<AIDashboardsModule>;
|
|
42
49
|
}
|
|
43
50
|
//# sourceMappingURL=ai-dashboards.module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-dashboards.module.d.ts","sourceRoot":"","sources":["../src/ai-dashboards.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ai-dashboards.module.d.ts","sourceRoot":"","sources":["../src/ai-dashboards.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDA;;;GAGG;AACH,qBAoEa,kBAAkB;yCAAlB,kBAAkB;0CAAlB,kBAAkB;0CAAlB,kBAAkB;CAAI"}
|
|
@@ -17,6 +17,7 @@ import { AgentRequestsModule } from '@memberjunction/ng-agent-requests';
|
|
|
17
17
|
import { NgTreesModule } from '@memberjunction/ng-trees';
|
|
18
18
|
import { SharedDashboardWidgetsModule } from './shared/shared-dashboard-widgets.module';
|
|
19
19
|
import { SharedPipesModule } from './shared/shared-pipes.module';
|
|
20
|
+
import { SearchModule } from '@memberjunction/ng-search';
|
|
20
21
|
// AI Components
|
|
21
22
|
import { ModelManagementComponent } from './AI/components/models/model-management.component';
|
|
22
23
|
import { PromptManagementComponent } from './AI/components/prompts/prompt-management.component';
|
|
@@ -33,7 +34,14 @@ import { PromptVersionControlComponent } from './AI/components/prompts/prompt-ve
|
|
|
33
34
|
import { LiveExecutionWidgetComponent } from './AI/components/widgets/live-execution-widget.component';
|
|
34
35
|
import { PerformanceHeatmapComponent } from './AI/components/charts/performance-heatmap.component';
|
|
35
36
|
import { AgentRequestsResourceComponent } from './AI/components/requests/agent-requests-resource.component';
|
|
37
|
+
import { AutotaggingPipelineResourceComponent } from './AI/components/autotagging/autotagging-pipeline-resource.component';
|
|
38
|
+
import { DuplicateDetectionResourceComponent } from './AI/components/duplicates/duplicate-detection-resource.component';
|
|
39
|
+
import { VectorManagementResourceComponent } from './AI/components/vectors/vector-management-resource.component';
|
|
36
40
|
import { AIInstrumentationService } from './AI/services/ai-instrumentation.service';
|
|
41
|
+
// Knowledge Hub components
|
|
42
|
+
import { KnowledgeSearchResourceComponent } from './KnowledgeHub/components/search/knowledge-search-resource.component';
|
|
43
|
+
import { KnowledgeConfigResourceComponent } from './KnowledgeHub/components/config/knowledge-config-resource.component';
|
|
44
|
+
import { SearchResultDetailComponent } from './KnowledgeHub/components/results-detail/search-result-detail.component';
|
|
37
45
|
import * as i0 from "@angular/core";
|
|
38
46
|
/**
|
|
39
47
|
* AIDashboardsModule — AI feature area: models, prompts, agents,
|
|
@@ -64,7 +72,8 @@ export class AIDashboardsModule {
|
|
|
64
72
|
AgentRequestsModule,
|
|
65
73
|
NgTreesModule,
|
|
66
74
|
SharedDashboardWidgetsModule,
|
|
67
|
-
SharedPipesModule,
|
|
75
|
+
SharedPipesModule,
|
|
76
|
+
SearchModule, SharedDashboardWidgetsModule] });
|
|
68
77
|
}
|
|
69
78
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIDashboardsModule, [{
|
|
70
79
|
type: NgModule,
|
|
@@ -83,7 +92,13 @@ export class AIDashboardsModule {
|
|
|
83
92
|
PromptVersionControlComponent,
|
|
84
93
|
LiveExecutionWidgetComponent,
|
|
85
94
|
PerformanceHeatmapComponent,
|
|
86
|
-
AgentRequestsResourceComponent
|
|
95
|
+
AgentRequestsResourceComponent,
|
|
96
|
+
AutotaggingPipelineResourceComponent,
|
|
97
|
+
DuplicateDetectionResourceComponent,
|
|
98
|
+
VectorManagementResourceComponent,
|
|
99
|
+
KnowledgeSearchResourceComponent,
|
|
100
|
+
KnowledgeConfigResourceComponent,
|
|
101
|
+
SearchResultDetailComponent
|
|
87
102
|
],
|
|
88
103
|
imports: [
|
|
89
104
|
CommonModule,
|
|
@@ -106,7 +121,8 @@ export class AIDashboardsModule {
|
|
|
106
121
|
AgentRequestsModule,
|
|
107
122
|
NgTreesModule,
|
|
108
123
|
SharedDashboardWidgetsModule,
|
|
109
|
-
SharedPipesModule
|
|
124
|
+
SharedPipesModule,
|
|
125
|
+
SearchModule
|
|
110
126
|
],
|
|
111
127
|
providers: [
|
|
112
128
|
AIInstrumentationService
|
|
@@ -120,6 +136,12 @@ export class AIDashboardsModule {
|
|
|
120
136
|
LiveExecutionWidgetComponent,
|
|
121
137
|
PerformanceHeatmapComponent,
|
|
122
138
|
AgentRequestsResourceComponent,
|
|
139
|
+
AutotaggingPipelineResourceComponent,
|
|
140
|
+
DuplicateDetectionResourceComponent,
|
|
141
|
+
VectorManagementResourceComponent,
|
|
142
|
+
KnowledgeSearchResourceComponent,
|
|
143
|
+
KnowledgeConfigResourceComponent,
|
|
144
|
+
SearchResultDetailComponent,
|
|
123
145
|
SharedDashboardWidgetsModule
|
|
124
146
|
]
|
|
125
147
|
}]
|
|
@@ -137,7 +159,13 @@ export class AIDashboardsModule {
|
|
|
137
159
|
PromptVersionControlComponent,
|
|
138
160
|
LiveExecutionWidgetComponent,
|
|
139
161
|
PerformanceHeatmapComponent,
|
|
140
|
-
AgentRequestsResourceComponent
|
|
162
|
+
AgentRequestsResourceComponent,
|
|
163
|
+
AutotaggingPipelineResourceComponent,
|
|
164
|
+
DuplicateDetectionResourceComponent,
|
|
165
|
+
VectorManagementResourceComponent,
|
|
166
|
+
KnowledgeSearchResourceComponent,
|
|
167
|
+
KnowledgeConfigResourceComponent,
|
|
168
|
+
SearchResultDetailComponent], imports: [CommonModule,
|
|
141
169
|
FormsModule,
|
|
142
170
|
ReactiveFormsModule,
|
|
143
171
|
ButtonsModule,
|
|
@@ -157,7 +185,8 @@ export class AIDashboardsModule {
|
|
|
157
185
|
AgentRequestsModule,
|
|
158
186
|
NgTreesModule,
|
|
159
187
|
SharedDashboardWidgetsModule,
|
|
160
|
-
SharedPipesModule
|
|
188
|
+
SharedPipesModule,
|
|
189
|
+
SearchModule], exports: [ModelManagementComponent,
|
|
161
190
|
PromptManagementComponent,
|
|
162
191
|
AgentConfigurationComponent,
|
|
163
192
|
ExecutionMonitoringComponent,
|
|
@@ -165,5 +194,11 @@ export class AIDashboardsModule {
|
|
|
165
194
|
LiveExecutionWidgetComponent,
|
|
166
195
|
PerformanceHeatmapComponent,
|
|
167
196
|
AgentRequestsResourceComponent,
|
|
197
|
+
AutotaggingPipelineResourceComponent,
|
|
198
|
+
DuplicateDetectionResourceComponent,
|
|
199
|
+
VectorManagementResourceComponent,
|
|
200
|
+
KnowledgeSearchResourceComponent,
|
|
201
|
+
KnowledgeConfigResourceComponent,
|
|
202
|
+
SearchResultDetailComponent,
|
|
168
203
|
SharedDashboardWidgetsModule] }); })();
|
|
169
204
|
//# sourceMappingURL=ai-dashboards.module.js.map
|