@memberjunction/ng-dashboards 2.55.0 → 2.57.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/agents/agent-configuration.component.d.ts +12 -1
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +144 -115
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +3 -1
- package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management-v2.component.js +107 -125
- package/dist/AI/components/prompts/prompt-management-v2.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.d.ts +5 -0
- package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +9 -2
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +5 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +11 -4
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/package.json +10 -10
|
@@ -4,17 +4,16 @@ import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
|
|
|
4
4
|
import { Metadata, RunView } from '@memberjunction/core';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
import * as i1 from "@memberjunction/ng-shared";
|
|
7
|
-
import * as i2 from "@
|
|
8
|
-
import * as i3 from "@
|
|
9
|
-
import * as i4 from "@progress/kendo-angular-
|
|
10
|
-
import * as i5 from "
|
|
11
|
-
import * as i6 from "./model-prompt-priority-matrix.component";
|
|
7
|
+
import * as i2 from "@memberjunction/ng-ai-test-harness";
|
|
8
|
+
import * as i3 from "@angular/forms";
|
|
9
|
+
import * as i4 from "@progress/kendo-angular-layout";
|
|
10
|
+
import * as i5 from "./model-prompt-priority-matrix.component";
|
|
12
11
|
const _forTrack0 = ($index, $item) => $item.ID;
|
|
13
12
|
function PromptManagementV2Component_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
14
|
-
i0.ɵɵelementStart(0, "div", 1)(1, "div",
|
|
15
|
-
i0.ɵɵelement(3, "div",
|
|
13
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3);
|
|
14
|
+
i0.ɵɵelement(3, "div", 4)(4, "div", 4)(5, "div", 4);
|
|
16
15
|
i0.ɵɵelementEnd();
|
|
17
|
-
i0.ɵɵelementStart(6, "div",
|
|
16
|
+
i0.ɵɵelementStart(6, "div", 5);
|
|
18
17
|
i0.ɵɵtext(7);
|
|
19
18
|
i0.ɵɵelementEnd()()();
|
|
20
19
|
} if (rf & 2) {
|
|
@@ -29,7 +28,7 @@ function PromptManagementV2Component_Conditional_2_Conditional_8_Template(rf, ct
|
|
|
29
28
|
i0.ɵɵtext(0, " Show Filters ");
|
|
30
29
|
} }
|
|
31
30
|
function PromptManagementV2Component_Conditional_2_Conditional_23_For_26_Template(rf, ctx) { if (rf & 1) {
|
|
32
|
-
i0.ɵɵelementStart(0, "option",
|
|
31
|
+
i0.ɵɵelementStart(0, "option", 42);
|
|
33
32
|
i0.ɵɵtext(1);
|
|
34
33
|
i0.ɵɵelementEnd();
|
|
35
34
|
} if (rf & 2) {
|
|
@@ -39,7 +38,7 @@ function PromptManagementV2Component_Conditional_2_Conditional_23_For_26_Templat
|
|
|
39
38
|
i0.ɵɵtextInterpolate(category_r4.Name);
|
|
40
39
|
} }
|
|
41
40
|
function PromptManagementV2Component_Conditional_2_Conditional_23_For_35_Template(rf, ctx) { if (rf & 1) {
|
|
42
|
-
i0.ɵɵelementStart(0, "option",
|
|
41
|
+
i0.ɵɵelementStart(0, "option", 42);
|
|
43
42
|
i0.ɵɵtext(1);
|
|
44
43
|
i0.ɵɵelementEnd();
|
|
45
44
|
} if (rf & 2) {
|
|
@@ -50,66 +49,66 @@ function PromptManagementV2Component_Conditional_2_Conditional_23_For_35_Templat
|
|
|
50
49
|
} }
|
|
51
50
|
function PromptManagementV2Component_Conditional_2_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
52
51
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
53
|
-
i0.ɵɵelementStart(0, "kendo-splitter-pane",
|
|
52
|
+
i0.ɵɵelementStart(0, "kendo-splitter-pane", 24)(1, "div", 27)(2, "div", 28)(3, "h3");
|
|
54
53
|
i0.ɵɵtext(4, "Prompt Filters");
|
|
55
54
|
i0.ɵɵelementEnd();
|
|
56
|
-
i0.ɵɵelementStart(5, "div",
|
|
55
|
+
i0.ɵɵelementStart(5, "div", 29)(6, "span", 30);
|
|
57
56
|
i0.ɵɵtext(7);
|
|
58
57
|
i0.ɵɵelementEnd();
|
|
59
|
-
i0.ɵɵelementStart(8, "span",
|
|
58
|
+
i0.ɵɵelementStart(8, "span", 31);
|
|
60
59
|
i0.ɵɵtext(9);
|
|
61
60
|
i0.ɵɵelementEnd()();
|
|
62
|
-
i0.ɵɵelementStart(10, "button",
|
|
61
|
+
i0.ɵɵelementStart(10, "button", 32);
|
|
63
62
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_23_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.toggleFilterPanel()); });
|
|
64
|
-
i0.ɵɵelement(11, "span",
|
|
63
|
+
i0.ɵɵelement(11, "span", 33);
|
|
65
64
|
i0.ɵɵelementEnd()();
|
|
66
|
-
i0.ɵɵelementStart(12, "div",
|
|
67
|
-
i0.ɵɵelement(15, "span",
|
|
65
|
+
i0.ɵɵelementStart(12, "div", 34)(13, "div", 35)(14, "label", 36);
|
|
66
|
+
i0.ɵɵelement(15, "span", 37);
|
|
68
67
|
i0.ɵɵtext(16, " Name ");
|
|
69
68
|
i0.ɵɵelementEnd();
|
|
70
|
-
i0.ɵɵelementStart(17, "input",
|
|
69
|
+
i0.ɵɵelementStart(17, "input", 38);
|
|
71
70
|
i0.ɵɵlistener("input", function PromptManagementV2Component_Conditional_2_Conditional_23_Template_input_input_17_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onSearchChange($event.target.value)); });
|
|
72
71
|
i0.ɵɵelementEnd()();
|
|
73
|
-
i0.ɵɵelementStart(18, "div",
|
|
74
|
-
i0.ɵɵelement(20, "span",
|
|
72
|
+
i0.ɵɵelementStart(18, "div", 35)(19, "label", 36);
|
|
73
|
+
i0.ɵɵelement(20, "span", 39);
|
|
75
74
|
i0.ɵɵtext(21, " Category ");
|
|
76
75
|
i0.ɵɵelementEnd();
|
|
77
|
-
i0.ɵɵelementStart(22, "select",
|
|
76
|
+
i0.ɵɵelementStart(22, "select", 40);
|
|
78
77
|
i0.ɵɵlistener("change", function PromptManagementV2Component_Conditional_2_Conditional_23_Template_select_change_22_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onCategoryChange($event.target.value)); });
|
|
79
|
-
i0.ɵɵelementStart(23, "option",
|
|
78
|
+
i0.ɵɵelementStart(23, "option", 41);
|
|
80
79
|
i0.ɵɵtext(24, "All Categories");
|
|
81
80
|
i0.ɵɵelementEnd();
|
|
82
|
-
i0.ɵɵrepeaterCreate(25, PromptManagementV2Component_Conditional_2_Conditional_23_For_26_Template, 2, 2, "option",
|
|
81
|
+
i0.ɵɵrepeaterCreate(25, PromptManagementV2Component_Conditional_2_Conditional_23_For_26_Template, 2, 2, "option", 42, _forTrack0);
|
|
83
82
|
i0.ɵɵelementEnd()();
|
|
84
|
-
i0.ɵɵelementStart(27, "div",
|
|
85
|
-
i0.ɵɵelement(29, "span",
|
|
83
|
+
i0.ɵɵelementStart(27, "div", 35)(28, "label", 36);
|
|
84
|
+
i0.ɵɵelement(29, "span", 43);
|
|
86
85
|
i0.ɵɵtext(30, " Type ");
|
|
87
86
|
i0.ɵɵelementEnd();
|
|
88
|
-
i0.ɵɵelementStart(31, "select",
|
|
87
|
+
i0.ɵɵelementStart(31, "select", 40);
|
|
89
88
|
i0.ɵɵlistener("change", function PromptManagementV2Component_Conditional_2_Conditional_23_Template_select_change_31_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onTypeChange($event.target.value)); });
|
|
90
|
-
i0.ɵɵelementStart(32, "option",
|
|
89
|
+
i0.ɵɵelementStart(32, "option", 41);
|
|
91
90
|
i0.ɵɵtext(33, "All Types");
|
|
92
91
|
i0.ɵɵelementEnd();
|
|
93
|
-
i0.ɵɵrepeaterCreate(34, PromptManagementV2Component_Conditional_2_Conditional_23_For_35_Template, 2, 2, "option",
|
|
92
|
+
i0.ɵɵrepeaterCreate(34, PromptManagementV2Component_Conditional_2_Conditional_23_For_35_Template, 2, 2, "option", 42, _forTrack0);
|
|
94
93
|
i0.ɵɵelementEnd()();
|
|
95
|
-
i0.ɵɵelementStart(36, "div",
|
|
96
|
-
i0.ɵɵelement(38, "span",
|
|
94
|
+
i0.ɵɵelementStart(36, "div", 35)(37, "label", 36);
|
|
95
|
+
i0.ɵɵelement(38, "span", 44);
|
|
97
96
|
i0.ɵɵtext(39, " Status ");
|
|
98
97
|
i0.ɵɵelementEnd();
|
|
99
|
-
i0.ɵɵelementStart(40, "select",
|
|
98
|
+
i0.ɵɵelementStart(40, "select", 40);
|
|
100
99
|
i0.ɵɵlistener("change", function PromptManagementV2Component_Conditional_2_Conditional_23_Template_select_change_40_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onStatusChange($event.target.value)); });
|
|
101
|
-
i0.ɵɵelementStart(41, "option",
|
|
100
|
+
i0.ɵɵelementStart(41, "option", 41);
|
|
102
101
|
i0.ɵɵtext(42, "All Statuses");
|
|
103
102
|
i0.ɵɵelementEnd();
|
|
104
|
-
i0.ɵɵelementStart(43, "option",
|
|
103
|
+
i0.ɵɵelementStart(43, "option", 45);
|
|
105
104
|
i0.ɵɵtext(44, "Active");
|
|
106
105
|
i0.ɵɵelementEnd();
|
|
107
|
-
i0.ɵɵelementStart(45, "option",
|
|
106
|
+
i0.ɵɵelementStart(45, "option", 46);
|
|
108
107
|
i0.ɵɵtext(46, "Inactive");
|
|
109
108
|
i0.ɵɵelementEnd()()();
|
|
110
|
-
i0.ɵɵelementStart(47, "div",
|
|
109
|
+
i0.ɵɵelementStart(47, "div", 47)(48, "button", 48);
|
|
111
110
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_23_Template_button_click_48_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.clearFilters()); });
|
|
112
|
-
i0.ɵɵelement(49, "span",
|
|
111
|
+
i0.ɵɵelement(49, "span", 49);
|
|
113
112
|
i0.ɵɵtext(50, " Reset Filters ");
|
|
114
113
|
i0.ɵɵelementEnd()()()()();
|
|
115
114
|
} if (rf & 2) {
|
|
@@ -133,22 +132,22 @@ function PromptManagementV2Component_Conditional_2_Conditional_23_Template(rf, c
|
|
|
133
132
|
} }
|
|
134
133
|
function PromptManagementV2Component_Conditional_2_Conditional_26_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
135
134
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
136
|
-
i0.ɵɵelementStart(0, "button",
|
|
135
|
+
i0.ɵɵelementStart(0, "button", 52);
|
|
137
136
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_26_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.createNewPrompt()); });
|
|
138
|
-
i0.ɵɵelement(1, "i",
|
|
137
|
+
i0.ɵɵelement(1, "i", 22);
|
|
139
138
|
i0.ɵɵtext(2, " Create First Prompt ");
|
|
140
139
|
i0.ɵɵelementEnd();
|
|
141
140
|
} }
|
|
142
141
|
function PromptManagementV2Component_Conditional_2_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
143
|
-
i0.ɵɵelementStart(0, "div",
|
|
144
|
-
i0.ɵɵelement(1, "i",
|
|
142
|
+
i0.ɵɵelementStart(0, "div", 26);
|
|
143
|
+
i0.ɵɵelement(1, "i", 50);
|
|
145
144
|
i0.ɵɵelementStart(2, "h3");
|
|
146
145
|
i0.ɵɵtext(3, "No prompts found");
|
|
147
146
|
i0.ɵɵelementEnd();
|
|
148
147
|
i0.ɵɵelementStart(4, "p");
|
|
149
148
|
i0.ɵɵtext(5);
|
|
150
149
|
i0.ɵɵelementEnd();
|
|
151
|
-
i0.ɵɵtemplate(6, PromptManagementV2Component_Conditional_2_Conditional_26_Conditional_6_Template, 3, 0, "button",
|
|
150
|
+
i0.ɵɵtemplate(6, PromptManagementV2Component_Conditional_2_Conditional_26_Conditional_6_Template, 3, 0, "button", 51);
|
|
152
151
|
i0.ɵɵelementEnd();
|
|
153
152
|
} if (rf & 2) {
|
|
154
153
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
@@ -158,7 +157,7 @@ function PromptManagementV2Component_Conditional_2_Conditional_26_Template(rf, c
|
|
|
158
157
|
i0.ɵɵconditional(!ctx_r0.hasActiveFilters ? 6 : -1);
|
|
159
158
|
} }
|
|
160
159
|
function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
161
|
-
i0.ɵɵelementStart(0, "p",
|
|
160
|
+
i0.ɵɵelementStart(0, "p", 62);
|
|
162
161
|
i0.ɵɵtext(1);
|
|
163
162
|
i0.ɵɵelementEnd();
|
|
164
163
|
} if (rf & 2) {
|
|
@@ -167,53 +166,53 @@ function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_C
|
|
|
167
166
|
i0.ɵɵtextInterpolate(prompt_r8.Description);
|
|
168
167
|
} }
|
|
169
168
|
function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Conditional_9_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
170
|
-
i0.ɵɵelement(0, "i",
|
|
169
|
+
i0.ɵɵelement(0, "i", 76);
|
|
171
170
|
i0.ɵɵtext(1, " Yes ");
|
|
172
171
|
} }
|
|
173
172
|
function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Conditional_9_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
174
|
-
i0.ɵɵelement(0, "i",
|
|
173
|
+
i0.ɵɵelement(0, "i", 77);
|
|
175
174
|
i0.ɵɵtext(1, " No ");
|
|
176
175
|
} }
|
|
177
176
|
function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
178
177
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
179
|
-
i0.ɵɵelementStart(0, "div",
|
|
178
|
+
i0.ɵɵelementStart(0, "div", 64)(1, "div", 65)(2, "div", 66)(3, "span", 67);
|
|
180
179
|
i0.ɵɵtext(4, "Category");
|
|
181
180
|
i0.ɵɵelementEnd();
|
|
182
|
-
i0.ɵɵelementStart(5, "span",
|
|
181
|
+
i0.ɵɵelementStart(5, "span", 68);
|
|
183
182
|
i0.ɵɵtext(6);
|
|
184
183
|
i0.ɵɵelementEnd()();
|
|
185
|
-
i0.ɵɵelementStart(7, "div",
|
|
184
|
+
i0.ɵɵelementStart(7, "div", 66)(8, "span", 67);
|
|
186
185
|
i0.ɵɵtext(9, "Type");
|
|
187
186
|
i0.ɵɵelementEnd();
|
|
188
|
-
i0.ɵɵelementStart(10, "span",
|
|
187
|
+
i0.ɵɵelementStart(10, "span", 68);
|
|
189
188
|
i0.ɵɵtext(11);
|
|
190
189
|
i0.ɵɵelementEnd()();
|
|
191
|
-
i0.ɵɵelementStart(12, "div",
|
|
190
|
+
i0.ɵɵelementStart(12, "div", 66)(13, "span", 67);
|
|
192
191
|
i0.ɵɵtext(14, "Status");
|
|
193
192
|
i0.ɵɵelementEnd();
|
|
194
|
-
i0.ɵɵelementStart(15, "span",
|
|
193
|
+
i0.ɵɵelementStart(15, "span", 69);
|
|
195
194
|
i0.ɵɵtext(16);
|
|
196
195
|
i0.ɵɵelementEnd()()();
|
|
197
|
-
i0.ɵɵelementStart(17, "div",
|
|
196
|
+
i0.ɵɵelementStart(17, "div", 70)(18, "div", 66)(19, "span", 67);
|
|
198
197
|
i0.ɵɵtext(20, "Template");
|
|
199
198
|
i0.ɵɵelementEnd();
|
|
200
|
-
i0.ɵɵelementStart(21, "span",
|
|
199
|
+
i0.ɵɵelementStart(21, "span", 68);
|
|
201
200
|
i0.ɵɵtemplate(22, PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Conditional_9_Conditional_22_Template, 2, 0)(23, PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Conditional_9_Conditional_23_Template, 2, 0);
|
|
202
201
|
i0.ɵɵelementEnd()();
|
|
203
|
-
i0.ɵɵelementStart(24, "div",
|
|
202
|
+
i0.ɵɵelementStart(24, "div", 66)(25, "span", 67);
|
|
204
203
|
i0.ɵɵtext(26, "Contents");
|
|
205
204
|
i0.ɵɵelementEnd();
|
|
206
|
-
i0.ɵɵelementStart(27, "span",
|
|
205
|
+
i0.ɵɵelementStart(27, "span", 68);
|
|
207
206
|
i0.ɵɵtext(28);
|
|
208
207
|
i0.ɵɵelementEnd()()();
|
|
209
|
-
i0.ɵɵelementStart(29, "div",
|
|
208
|
+
i0.ɵɵelementStart(29, "div", 71)(30, "button", 72);
|
|
210
209
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Conditional_9_Template_button_click_30_listener($event) { i0.ɵɵrestoreView(_r9); const prompt_r8 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.testPrompt(prompt_r8.ID, $event)); });
|
|
211
|
-
i0.ɵɵelement(31, "i",
|
|
210
|
+
i0.ɵɵelement(31, "i", 73);
|
|
212
211
|
i0.ɵɵtext(32, " Run ");
|
|
213
212
|
i0.ɵɵelementEnd();
|
|
214
|
-
i0.ɵɵelementStart(33, "button",
|
|
213
|
+
i0.ɵɵelementStart(33, "button", 74);
|
|
215
214
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Conditional_9_Template_button_click_33_listener($event) { i0.ɵɵrestoreView(_r9); const prompt_r8 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(4); ctx_r0.openPrompt(prompt_r8.ID); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
216
|
-
i0.ɵɵelement(34, "i",
|
|
215
|
+
i0.ɵɵelement(34, "i", 75);
|
|
217
216
|
i0.ɵɵtext(35, " Open ");
|
|
218
217
|
i0.ɵɵelementEnd()()();
|
|
219
218
|
} if (rf & 2) {
|
|
@@ -236,19 +235,19 @@ function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_C
|
|
|
236
235
|
} }
|
|
237
236
|
function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
238
237
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
239
|
-
i0.ɵɵelementStart(0, "div",
|
|
238
|
+
i0.ɵɵelementStart(0, "div", 57)(1, "div", 58);
|
|
240
239
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Template_div_click_1_listener() { const prompt_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.togglePromptExpansion(prompt_r8.ID)); });
|
|
241
|
-
i0.ɵɵelementStart(2, "div",
|
|
240
|
+
i0.ɵɵelementStart(2, "div", 59);
|
|
242
241
|
i0.ɵɵelement(3, "i");
|
|
243
242
|
i0.ɵɵelementEnd();
|
|
244
|
-
i0.ɵɵelementStart(4, "div",
|
|
243
|
+
i0.ɵɵelementStart(4, "div", 60)(5, "h4", 61);
|
|
245
244
|
i0.ɵɵtext(6);
|
|
246
245
|
i0.ɵɵelementEnd();
|
|
247
|
-
i0.ɵɵtemplate(7, PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Conditional_7_Template, 2, 1, "p",
|
|
246
|
+
i0.ɵɵtemplate(7, PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Conditional_7_Template, 2, 1, "p", 62);
|
|
248
247
|
i0.ɵɵelementEnd();
|
|
249
|
-
i0.ɵɵelement(8, "i",
|
|
248
|
+
i0.ɵɵelement(8, "i", 63);
|
|
250
249
|
i0.ɵɵelementEnd();
|
|
251
|
-
i0.ɵɵtemplate(9, PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Conditional_9_Template, 36, 8, "div",
|
|
250
|
+
i0.ɵɵtemplate(9, PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Conditional_9_Template, 36, 8, "div", 64);
|
|
252
251
|
i0.ɵɵelementEnd();
|
|
253
252
|
} if (rf & 2) {
|
|
254
253
|
const prompt_r8 = ctx.$implicit;
|
|
@@ -266,8 +265,8 @@ function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_T
|
|
|
266
265
|
i0.ɵɵconditional(ctx_r0.expandedPromptId === prompt_r8.ID ? 9 : -1);
|
|
267
266
|
} }
|
|
268
267
|
function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_Template(rf, ctx) { if (rf & 1) {
|
|
269
|
-
i0.ɵɵelementStart(0, "div",
|
|
270
|
-
i0.ɵɵrepeaterCreate(1, PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Template, 10, 9, "div",
|
|
268
|
+
i0.ɵɵelementStart(0, "div", 53);
|
|
269
|
+
i0.ɵɵrepeaterCreate(1, PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_For_2_Template, 10, 9, "div", 56, _forTrack0);
|
|
271
270
|
i0.ɵɵelementEnd();
|
|
272
271
|
} if (rf & 2) {
|
|
273
272
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
@@ -275,14 +274,14 @@ function PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_Templat
|
|
|
275
274
|
i0.ɵɵrepeater(ctx_r0.filteredPrompts);
|
|
276
275
|
} }
|
|
277
276
|
function PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_For_18_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
278
|
-
i0.ɵɵelement(0, "i",
|
|
277
|
+
i0.ɵɵelement(0, "i", 76);
|
|
279
278
|
} }
|
|
280
279
|
function PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_For_18_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
281
|
-
i0.ɵɵelement(0, "i",
|
|
280
|
+
i0.ɵɵelement(0, "i", 77);
|
|
282
281
|
} }
|
|
283
282
|
function PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
284
283
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
285
|
-
i0.ɵɵelementStart(0, "tr")(1, "td")(2, "div",
|
|
284
|
+
i0.ɵɵelementStart(0, "tr")(1, "td")(2, "div", 79);
|
|
286
285
|
i0.ɵɵelement(3, "i");
|
|
287
286
|
i0.ɵɵtext(4);
|
|
288
287
|
i0.ɵɵelementEnd()();
|
|
@@ -292,19 +291,19 @@ function PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_For_18_
|
|
|
292
291
|
i0.ɵɵelementStart(7, "td");
|
|
293
292
|
i0.ɵɵtext(8);
|
|
294
293
|
i0.ɵɵelementEnd();
|
|
295
|
-
i0.ɵɵelementStart(9, "td")(10, "span",
|
|
294
|
+
i0.ɵɵelementStart(9, "td")(10, "span", 80);
|
|
296
295
|
i0.ɵɵtext(11);
|
|
297
296
|
i0.ɵɵelementEnd()();
|
|
298
297
|
i0.ɵɵelementStart(12, "td");
|
|
299
|
-
i0.ɵɵtemplate(13, PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_For_18_Conditional_13_Template, 1, 0, "i",
|
|
298
|
+
i0.ɵɵtemplate(13, PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_For_18_Conditional_13_Template, 1, 0, "i", 76)(14, PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_For_18_Conditional_14_Template, 1, 0, "i", 77);
|
|
300
299
|
i0.ɵɵelementEnd();
|
|
301
|
-
i0.ɵɵelementStart(15, "td")(16, "button",
|
|
300
|
+
i0.ɵɵelementStart(15, "td")(16, "button", 81);
|
|
302
301
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_For_18_Template_button_click_16_listener($event) { const prompt_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.testPrompt(prompt_r11.ID, $event)); });
|
|
303
|
-
i0.ɵɵelement(17, "i",
|
|
302
|
+
i0.ɵɵelement(17, "i", 73);
|
|
304
303
|
i0.ɵɵelementEnd();
|
|
305
|
-
i0.ɵɵelementStart(18, "button",
|
|
304
|
+
i0.ɵɵelementStart(18, "button", 82);
|
|
306
305
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_For_18_Template_button_click_18_listener() { const prompt_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.openPrompt(prompt_r11.ID)); });
|
|
307
|
-
i0.ɵɵelement(19, "i",
|
|
306
|
+
i0.ɵɵelement(19, "i", 75);
|
|
308
307
|
i0.ɵɵelementEnd()()();
|
|
309
308
|
} if (rf & 2) {
|
|
310
309
|
const prompt_r11 = ctx.$implicit;
|
|
@@ -327,7 +326,7 @@ function PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_For_18_
|
|
|
327
326
|
i0.ɵɵproperty("disabled", prompt_r11.Status !== "Active");
|
|
328
327
|
} }
|
|
329
328
|
function PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_Template(rf, ctx) { if (rf & 1) {
|
|
330
|
-
i0.ɵɵelementStart(0, "div",
|
|
329
|
+
i0.ɵɵelementStart(0, "div", 54)(1, "table", 78)(2, "thead")(3, "tr")(4, "th");
|
|
331
330
|
i0.ɵɵtext(5, "Name");
|
|
332
331
|
i0.ɵɵelementEnd();
|
|
333
332
|
i0.ɵɵelementStart(6, "th");
|
|
@@ -355,7 +354,7 @@ function PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_Templat
|
|
|
355
354
|
} }
|
|
356
355
|
function PromptManagementV2Component_Conditional_2_Conditional_27_Case_2_Template(rf, ctx) { if (rf & 1) {
|
|
357
356
|
const _r12 = i0.ɵɵgetCurrentView();
|
|
358
|
-
i0.ɵɵelementStart(0, "div",
|
|
357
|
+
i0.ɵɵelementStart(0, "div", 55)(1, "app-model-prompt-priority-matrix", 83);
|
|
359
358
|
i0.ɵɵlistener("promptSelected", function PromptManagementV2Component_Conditional_2_Conditional_27_Case_2_Template_app_model_prompt_priority_matrix_promptSelected_1_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openPrompt($event.ID)); });
|
|
360
359
|
i0.ɵɵelementEnd()();
|
|
361
360
|
} if (rf & 2) {
|
|
@@ -364,7 +363,7 @@ function PromptManagementV2Component_Conditional_2_Conditional_27_Case_2_Templat
|
|
|
364
363
|
i0.ɵɵproperty("selectedPrompts", ctx_r0.filteredPromptsAsEntities);
|
|
365
364
|
} }
|
|
366
365
|
function PromptManagementV2Component_Conditional_2_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
367
|
-
i0.ɵɵtemplate(0, PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_Template, 3, 0, "div",
|
|
366
|
+
i0.ɵɵtemplate(0, PromptManagementV2Component_Conditional_2_Conditional_27_Case_0_Template, 3, 0, "div", 53)(1, PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_Template, 19, 0, "div", 54)(2, PromptManagementV2Component_Conditional_2_Conditional_27_Case_2_Template, 2, 1, "div", 55);
|
|
368
367
|
} if (rf & 2) {
|
|
369
368
|
let tmp_2_0;
|
|
370
369
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
@@ -372,39 +371,39 @@ function PromptManagementV2Component_Conditional_2_Conditional_27_Template(rf, c
|
|
|
372
371
|
} }
|
|
373
372
|
function PromptManagementV2Component_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
374
373
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
375
|
-
i0.ɵɵelementStart(0, "div",
|
|
376
|
-
i0.ɵɵelement(3, "i",
|
|
374
|
+
i0.ɵɵelementStart(0, "div", 6)(1, "div", 7)(2, "h2", 8);
|
|
375
|
+
i0.ɵɵelement(3, "i", 9);
|
|
377
376
|
i0.ɵɵtext(4, " AI Prompts ");
|
|
378
377
|
i0.ɵɵelementEnd();
|
|
379
|
-
i0.ɵɵelementStart(5, "button",
|
|
378
|
+
i0.ɵɵelementStart(5, "button", 10);
|
|
380
379
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleFilters()); });
|
|
381
|
-
i0.ɵɵelement(6, "i",
|
|
380
|
+
i0.ɵɵelement(6, "i", 11);
|
|
382
381
|
i0.ɵɵtemplate(7, PromptManagementV2Component_Conditional_2_Conditional_7_Template, 1, 0)(8, PromptManagementV2Component_Conditional_2_Conditional_8_Template, 1, 0);
|
|
383
382
|
i0.ɵɵelementEnd();
|
|
384
|
-
i0.ɵɵelementStart(9, "span",
|
|
383
|
+
i0.ɵɵelementStart(9, "span", 12);
|
|
385
384
|
i0.ɵɵtext(10);
|
|
386
385
|
i0.ɵɵelementEnd()();
|
|
387
|
-
i0.ɵɵelementStart(11, "div",
|
|
386
|
+
i0.ɵɵelementStart(11, "div", 13)(12, "div", 14)(13, "button", 15);
|
|
388
387
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setViewMode("grid")); });
|
|
389
|
-
i0.ɵɵelement(14, "i",
|
|
388
|
+
i0.ɵɵelement(14, "i", 16);
|
|
390
389
|
i0.ɵɵelementEnd();
|
|
391
|
-
i0.ɵɵelementStart(15, "button",
|
|
390
|
+
i0.ɵɵelementStart(15, "button", 17);
|
|
392
391
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setViewMode("list")); });
|
|
393
|
-
i0.ɵɵelement(16, "i",
|
|
392
|
+
i0.ɵɵelement(16, "i", 18);
|
|
394
393
|
i0.ɵɵelementEnd();
|
|
395
|
-
i0.ɵɵelementStart(17, "button",
|
|
394
|
+
i0.ɵɵelementStart(17, "button", 19);
|
|
396
395
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setViewMode("priority-matrix")); });
|
|
397
|
-
i0.ɵɵelement(18, "i",
|
|
396
|
+
i0.ɵɵelement(18, "i", 20);
|
|
398
397
|
i0.ɵɵelementEnd()();
|
|
399
|
-
i0.ɵɵelementStart(19, "button",
|
|
398
|
+
i0.ɵɵelementStart(19, "button", 21);
|
|
400
399
|
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.createNewPrompt()); });
|
|
401
|
-
i0.ɵɵelement(20, "i",
|
|
400
|
+
i0.ɵɵelement(20, "i", 22);
|
|
402
401
|
i0.ɵɵtext(21, " New Prompt ");
|
|
403
402
|
i0.ɵɵelementEnd()()();
|
|
404
|
-
i0.ɵɵelementStart(22, "kendo-splitter",
|
|
405
|
-
i0.ɵɵtemplate(23, PromptManagementV2Component_Conditional_2_Conditional_23_Template, 51, 6, "kendo-splitter-pane",
|
|
406
|
-
i0.ɵɵelementStart(24, "kendo-splitter-pane")(25, "div",
|
|
407
|
-
i0.ɵɵtemplate(26, PromptManagementV2Component_Conditional_2_Conditional_26_Template, 7, 2, "div",
|
|
403
|
+
i0.ɵɵelementStart(22, "kendo-splitter", 23);
|
|
404
|
+
i0.ɵɵtemplate(23, PromptManagementV2Component_Conditional_2_Conditional_23_Template, 51, 6, "kendo-splitter-pane", 24);
|
|
405
|
+
i0.ɵɵelementStart(24, "kendo-splitter-pane")(25, "div", 25);
|
|
406
|
+
i0.ɵɵtemplate(26, PromptManagementV2Component_Conditional_2_Conditional_26_Template, 7, 2, "div", 26)(27, PromptManagementV2Component_Conditional_2_Conditional_27_Template, 3, 1);
|
|
408
407
|
i0.ɵɵelementEnd()()();
|
|
409
408
|
} if (rf & 2) {
|
|
410
409
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
@@ -423,22 +422,9 @@ function PromptManagementV2Component_Conditional_2_Template(rf, ctx) { if (rf &
|
|
|
423
422
|
i0.ɵɵadvance(3);
|
|
424
423
|
i0.ɵɵconditional(ctx_r0.filteredPrompts.length === 0 ? 26 : 27);
|
|
425
424
|
} }
|
|
426
|
-
function PromptManagementV2Component_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
427
|
-
const _r13 = i0.ɵɵgetCurrentView();
|
|
428
|
-
i0.ɵɵelementStart(0, "kendo-window", 85);
|
|
429
|
-
i0.ɵɵlistener("close", function PromptManagementV2Component_Conditional_3_Template_kendo_window_close_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.closeTestHarness()); });
|
|
430
|
-
i0.ɵɵelementStart(1, "mj-ai-test-harness", 86);
|
|
431
|
-
i0.ɵɵlistener("visibilityChange", function PromptManagementV2Component_Conditional_3_Template_mj_ai_test_harness_visibilityChange_1_listener() { i0.ɵɵrestoreView(_r13); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.closeTestHarness()); });
|
|
432
|
-
i0.ɵɵelementEnd()();
|
|
433
|
-
} if (rf & 2) {
|
|
434
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
435
|
-
i0.ɵɵpropertyInterpolate1("title", "Run AI Prompt - ", ctx_r0.selectedPromptForTest.Name || "Untitled", "");
|
|
436
|
-
i0.ɵɵproperty("width", 1200)("height", 800)("minWidth", 800)("minHeight", 600)("draggable", true)("resizable", true)("state", "default");
|
|
437
|
-
i0.ɵɵadvance();
|
|
438
|
-
i0.ɵɵproperty("mode", "prompt")("entity", ctx_r0.selectedPromptForTest)("isVisible", true);
|
|
439
|
-
} }
|
|
440
425
|
export class PromptManagementV2Component {
|
|
441
426
|
sharedService;
|
|
427
|
+
testHarnessService;
|
|
442
428
|
openEntityRecord = new EventEmitter();
|
|
443
429
|
stateChange = new EventEmitter();
|
|
444
430
|
initialState = null;
|
|
@@ -470,8 +456,9 @@ export class PromptManagementV2Component {
|
|
|
470
456
|
loadingMessageInterval;
|
|
471
457
|
destroy$ = new Subject();
|
|
472
458
|
selectedPromptForTest = null;
|
|
473
|
-
constructor(sharedService) {
|
|
459
|
+
constructor(sharedService, testHarnessService) {
|
|
474
460
|
this.sharedService = sharedService;
|
|
461
|
+
this.testHarnessService = testHarnessService;
|
|
475
462
|
}
|
|
476
463
|
ngOnInit() {
|
|
477
464
|
this.setupSearchListener();
|
|
@@ -526,7 +513,7 @@ export class PromptManagementV2Component {
|
|
|
526
513
|
},
|
|
527
514
|
{
|
|
528
515
|
EntityName: 'Templates',
|
|
529
|
-
ExtraFilter: `
|
|
516
|
+
ExtraFilter: `ID IN (SELECT TemplateID FROM __mj.AIPrompt)`,
|
|
530
517
|
MaxRows: 1000,
|
|
531
518
|
ResultType: 'entity_object'
|
|
532
519
|
},
|
|
@@ -663,13 +650,11 @@ export class PromptManagementV2Component {
|
|
|
663
650
|
if (event) {
|
|
664
651
|
event.stopPropagation();
|
|
665
652
|
}
|
|
666
|
-
//
|
|
667
|
-
|
|
668
|
-
if (prompt) {
|
|
669
|
-
this.selectedPromptForTest = prompt;
|
|
670
|
-
}
|
|
653
|
+
// Use the test harness service for window management features
|
|
654
|
+
this.testHarnessService.openForPrompt(promptId);
|
|
671
655
|
}
|
|
672
656
|
closeTestHarness() {
|
|
657
|
+
// No longer needed - window manages its own closure
|
|
673
658
|
this.selectedPromptForTest = null;
|
|
674
659
|
}
|
|
675
660
|
async createNewPrompt() {
|
|
@@ -738,28 +723,25 @@ export class PromptManagementV2Component {
|
|
|
738
723
|
this.searchSubject.next('');
|
|
739
724
|
this.applyFilters();
|
|
740
725
|
}
|
|
741
|
-
static ɵfac = function PromptManagementV2Component_Factory(t) { return new (t || PromptManagementV2Component)(i0.ɵɵdirectiveInject(i1.SharedService)); };
|
|
742
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PromptManagementV2Component, selectors: [["app-prompt-management-v2"]], inputs: { initialState: "initialState" }, outputs: { openEntityRecord: "openEntityRecord", stateChange: "stateChange" }, decls:
|
|
726
|
+
static ɵfac = function PromptManagementV2Component_Factory(t) { return new (t || PromptManagementV2Component)(i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i2.AITestHarnessDialogService)); };
|
|
727
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PromptManagementV2Component, selectors: [["app-prompt-management-v2"]], inputs: { initialState: "initialState" }, outputs: { openEntityRecord: "openEntityRecord", stateChange: "stateChange" }, decls: 3, vars: 1, consts: [[1, "prompt-management-v2"], [1, "loading-container"], [1, "loading-content"], [1, "loading-spinner"], [1, "spinner-ring"], [1, "loading-text"], [1, "dashboard-header", 2, "display", "flex !important", "justify-content", "space-between !important", "align-items", "center !important", "padding", "16px 24px !important", "background", "white !important"], [1, "header-info", 2, "display", "flex !important", "align-items", "center !important", "gap", "16px !important", "flex", "1 !important"], [1, "dashboard-title", 2, "margin", "0 !important", "display", "flex !important", "align-items", "center !important", "gap", "8px !important"], [1, "fa-solid", "fa-message"], ["type", "button", "title", "Toggle Filters", 1, "filter-toggle-btn", 3, "click"], [1, "fa-solid", "fa-filter"], [1, "item-count"], [1, "header-controls", 2, "display", "flex !important", "align-items", "center !important", "gap", "16px !important"], [1, "view-toggle"], ["type", "button", "title", "Grid View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-grip"], ["type", "button", "title", "List View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-list"], ["type", "button", "title", "Priority Matrix", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-chart-scatter"], ["type", "button", "title", "Create New Prompt", 1, "control-btn", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], ["orientation", "horizontal"], ["size", "320", "min", "250", "max", "400"], [1, "content-area"], [1, "empty-state"], [1, "filter-panel"], [1, "filter-panel-header"], [1, "filter-summary-inline"], [1, "summary-value"], [1, "summary-label"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "filter-content"], [1, "filter-group"], [1, "filter-label"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search prompts...", 1, "filter-input", 3, "input", "value"], [1, "fa-solid", "fa-folder"], [1, "filter-select", 3, "change", "value"], ["value", "all"], [3, "value"], [1, "fa-solid", "fa-tag"], [1, "fa-solid", "fa-toggle-on"], ["value", "active"], ["value", "inactive"], [1, "filter-actions"], ["title", "Reset all filters", 1, "reset-btn", 3, "click"], [1, "fa-solid", "fa-undo"], [1, "fa-solid", "fa-comment-dots", "fa-4x"], [1, "primary-action"], [1, "primary-action", 3, "click"], [1, "prompt-grid"], [1, "prompt-list"], [1, "priority-matrix-container"], [1, "prompt-card", 3, "expanded"], [1, "prompt-card"], [1, "card-header", 3, "click"], [1, "card-icon"], [1, "card-info"], [1, "prompt-name"], [1, "card-description"], [1, "fa-solid", "fa-chevron-down", "expand-icon"], [1, "card-content"], [1, "stats-grid"], [1, "stat"], [1, "stat-label"], [1, "stat-value"], [1, "stat-value", "status-badge"], [1, "stats-grid", 2, "margin-top", "12px"], [1, "card-footer"], ["title", "Run Prompt", 1, "action-button", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-play"], ["title", "Edit Prompt", 1, "action-button", 3, "click"], [1, "fa-solid", "fa-external-link-alt"], [1, "fa-solid", "fa-check-circle", "text-success"], [1, "fa-solid", "fa-times-circle", "text-muted"], [1, "data-table"], [1, "name-cell"], [1, "status-badge"], ["title", "Run Prompt", 1, "action-button", "small", "primary", 3, "click", "disabled"], ["title", "Edit Prompt", 1, "action-button", "small", 3, "click"], [3, "promptSelected", "selectedPrompts"]], template: function PromptManagementV2Component_Template(rf, ctx) { if (rf & 1) {
|
|
743
728
|
i0.ɵɵelementStart(0, "div", 0);
|
|
744
729
|
i0.ɵɵtemplate(1, PromptManagementV2Component_Conditional_1_Template, 8, 1, "div", 1)(2, PromptManagementV2Component_Conditional_2_Template, 28, 10);
|
|
745
730
|
i0.ɵɵelementEnd();
|
|
746
|
-
i0.ɵɵtemplate(3, PromptManagementV2Component_Conditional_3_Template, 2, 12, "kendo-window", 2);
|
|
747
731
|
} if (rf & 2) {
|
|
748
732
|
i0.ɵɵadvance();
|
|
749
733
|
i0.ɵɵconditional(ctx.isLoading ? 1 : 2);
|
|
750
|
-
i0.ɵɵadvance(2);
|
|
751
|
-
i0.ɵɵconditional(ctx.selectedPromptForTest ? 3 : -1);
|
|
752
|
-
} }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i3.SplitterComponent, i3.SplitterPaneComponent, i4.WindowComponent, i5.AITestHarnessComponent, i6.ModelPromptPriorityMatrixComponent], styles: [".prompt-management-v2[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: #f5f7fa;\n}\n\n//[_ngcontent-%COMP%] Loading[_ngcontent-%COMP%] state\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background-color: #f5f7fa;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n position: relative;\n width: 80px;\n height: 80px;\n margin: 0 auto 20px;\n}\n\n.spinner-ring[_ngcontent-%COMP%] {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-top-color: #17a2b8;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1.5s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;\n \n &:nth-child(2) {\n animation-delay: 0.15s;\n width: 70%;\n height: 70%;\n top: 15%;\n left: 15%;\n border-top-color: #28a745;\n }\n \n &:nth-child(3) {\n animation-delay: 0.3s;\n width: 40%;\n height: 40%;\n top: 30%;\n left: 30%;\n border-top-color: #ffc107;\n }\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 16px;\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 1; }\n}\n\n//[_ngcontent-%COMP%] Dashboard[_ngcontent-%COMP%] Header\n.dashboard-header[_ngcontent-%COMP%] {\n background: white;\n padding: 16px 24px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #17a2b8;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.item-count[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n//[_ngcontent-%COMP%] View[_ngcontent-%COMP%] Toggle\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f8f9fa;\n border-radius: 6px;\n padding: 2px;\n border: 1px solid #dee2e6;\n}\n\n.view-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 16px;\n}\n\n.view-btn[_ngcontent-%COMP%]:hover {\n color: #495057;\n}\n\n.view-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #17a2b8;\n box-shadow: 0 1px 2px rgba(0,0,0,0.08);\n}\n\n//[_ngcontent-%COMP%] Control[_ngcontent-%COMP%] Buttons\n.control-btn[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.control-btn.primary[_ngcontent-%COMP%] {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.control-btn.primary[_ngcontent-%COMP%]:hover {\n background: #138496;\n border-color: #117a8b;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);\n}\n\n//[_ngcontent-%COMP%] Splitter[_ngcontent-%COMP%] content\nkendo-splitter[_ngcontent-%COMP%] {\n flex: 1;\n background-color: #f5f7fa;\n margin-top: 8px;\n}\n\n//[_ngcontent-%COMP%] Filter[_ngcontent-%COMP%] panel\n.filter-panel[_ngcontent-%COMP%] {\n height: 100%;\n background: white;\n border-right: 1px solid #e0e0e0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n \n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 500;\n color: #333;\n flex: 1;\n }\n \n .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 12px;\n font-size: 12px;\n \n .summary-value {\n font-weight: 600;\n color: #2196f3;\n }\n \n .summary-label {\n color: #666;\n }\n }\n \n .close-btn {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: #666;\n border-radius: 3px;\n transition: all 0.2s;\n \n &:hover {\n background: #f0f0f0;\n color: #333;\n }\n \n .fa-solid {\n font-size: 12px;\n }\n }\n}\n\n.filter-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 12px;\n}\n\n.filter-group[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n \n .filter-label {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #555;\n \n .fa-solid {\n font-size: 11px;\n color: #2196f3;\n width: 12px;\n }\n }\n}\n\n.filter-input[_ngcontent-%COMP%], .filter-select[_ngcontent-%COMP%] {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 10px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n \n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n \n &::placeholder {\n color: #999;\n }\n}\n\n.filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.filter-actions[_ngcontent-%COMP%] {\n margin-top: 24px;\n padding-top: 16px;\n border-top: 1px solid #f0f0f0;\n \n .reset-btn {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 12px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n color: #666;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.2s;\n box-sizing: border-box;\n \n &:hover {\n background: #e9ecef;\n border-color: #ccc;\n color: #333;\n }\n \n .fa-solid {\n font-size: 11px;\n }\n }\n}\n\n//[_ngcontent-%COMP%] Content[_ngcontent-%COMP%] area\n.content-area[_ngcontent-%COMP%] {\n height: 100%;\n padding: 24px;\n overflow-y: auto;\n background: #f5f7fa;\n}\n\n//[_ngcontent-%COMP%] Empty[_ngcontent-%COMP%] state\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: #6c757d;\n \n i {\n margin-bottom: 24px;\n opacity: 0.3;\n }\n \n h3 {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 16px;\n }\n}\n\n//[_ngcontent-%COMP%] Grid[_ngcontent-%COMP%] view\n.prompt-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));\n gap: 20px;\n}\n\n.prompt-card[_ngcontent-%COMP%] {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n transition: all 0.3s ease;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);\n .expand-icon {\n transform: rotate(180deg);\n }\n }\n}\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 20px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n \n &:hover {\n background-color: #f8f9fa;\n }\n}\n\n.card-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n background-color: #e3f2fd;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 16px;\n flex-shrink: 0;\n \n i {\n font-size: 24px;\n color: #17a2b8;\n }\n}\n\n.card-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n \n .prompt-name {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n }\n\n .card-description {\n margin: 0;\n font-size: 13px;\n color: #6c757d;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 1.4;\n }\n}\n\n\n.expand-icon[_ngcontent-%COMP%] {\n color: #adb5bd;\n transition: transform 0.3s ease;\n margin-left: 12px;\n}\n\n.card-content[_ngcontent-%COMP%] {\n padding: 0 20px 20px;\n animation: _ngcontent-%COMP%_slideDown 0.3s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.description-section[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n \n h5 {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n color: #495057;\n line-height: 1.6;\n }\n}\n\n.stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.stat[_ngcontent-%COMP%] {\n text-align: center;\n \n .stat-label {\n display: block;\n font-size: 12px;\n color: #6c757d;\n margin-bottom: 4px;\n }\n \n .stat-value {\n display: block;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n }\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n \n &.active {\n background-color: #d4edda;\n color: #155724;\n }\n \n &.inactive {\n background-color: #f8d7da;\n color: #721c24;\n }\n}\n\n.card-footer[_ngcontent-%COMP%] {\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n display: flex;\n gap: 8px;\n}\n\n.action-button[_ngcontent-%COMP%] {\n padding: 6px 12px;\n background-color: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n color: #495057;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n \n &:hover {\n background-color: #e9ecef;\n border-color: #adb5bd;\n color: #212529;\n }\n \n &.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n \n &:hover:not(:disabled) {\n background: #1485a3;\n border-color: #1485a3;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n \n &:hover {\n transform: none;\n box-shadow: none;\n background: #17a2b8;\n }\n }\n }\n \n &.small {\n padding: 4px 8px;\n font-size: 12px;\n \n &.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n \n &:hover:not(:disabled) {\n background: #1485a3;\n border-color: #1485a3;\n }\n }\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n}\n\n//[_ngcontent-%COMP%] List[_ngcontent-%COMP%] view\n.prompt-list[_ngcontent-%COMP%] {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n overflow: hidden;\n}\n\n.data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n \n thead {\n background-color: #f8f9fa;\n \n tr {\n border-bottom: 2px solid #dee2e6;\n }\n \n th {\n padding: 12px 16px;\n text-align: left;\n font-size: 13px;\n font-weight: 600;\n color: #495057;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n }\n \n tbody {\n tr {\n border-bottom: 1px solid #e9ecef;\n transition: background-color 0.2s ease;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:last-child {\n border-bottom: none;\n }\n }\n \n td {\n padding: 16px;\n font-size: 14px;\n color: #495057;\n }\n }\n}\n\n.name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n color: #2c3e50;\n \n i {\n color: #17a2b8;\n }\n}\n\n//[_ngcontent-%COMP%] Priority[_ngcontent-%COMP%] matrix[_ngcontent-%COMP%] container\n.priority-matrix-container[_ngcontent-%COMP%] {\n height: 100%;\n background-color: white;\n border-radius: 12px;\n padding: 24px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n}\n\n//[_ngcontent-%COMP%] Responsive\n@media[_ngcontent-%COMP%] (max-width[_ngcontent-%COMP%]: 768px)[_ngcontent-%COMP%] {\n .prompt-header {\n flex-wrap: wrap;\n gap: 16px;\n }\n \n .header-right {\n width: 100%;\n justify-content: space-between;\n }\n \n .prompt-grid {\n grid-template-columns: 1fr;\n }\n \n .stats-grid {\n grid-template-columns: 1fr;\n }\n}\n\n//[_ngcontent-%COMP%] Text[_ngcontent-%COMP%] utility[_ngcontent-%COMP%] classes\n.text-success[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.text-muted[_ngcontent-%COMP%] {\n color: #6c757d;\n}"] });
|
|
734
|
+
} }, dependencies: [i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i4.SplitterComponent, i4.SplitterPaneComponent, i5.ModelPromptPriorityMatrixComponent], styles: [".prompt-management-v2[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: #f5f7fa;\n}\n\n//[_ngcontent-%COMP%] Loading[_ngcontent-%COMP%] state\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background-color: #f5f7fa;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n position: relative;\n width: 80px;\n height: 80px;\n margin: 0 auto 20px;\n}\n\n.spinner-ring[_ngcontent-%COMP%] {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-top-color: #17a2b8;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1.5s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;\n \n &:nth-child(2) {\n animation-delay: 0.15s;\n width: 70%;\n height: 70%;\n top: 15%;\n left: 15%;\n border-top-color: #28a745;\n }\n \n &:nth-child(3) {\n animation-delay: 0.3s;\n width: 40%;\n height: 40%;\n top: 30%;\n left: 30%;\n border-top-color: #ffc107;\n }\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 16px;\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 1; }\n}\n\n//[_ngcontent-%COMP%] Dashboard[_ngcontent-%COMP%] Header\n.dashboard-header[_ngcontent-%COMP%] {\n background: white;\n padding: 16px 24px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #17a2b8;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.item-count[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n//[_ngcontent-%COMP%] View[_ngcontent-%COMP%] Toggle\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f8f9fa;\n border-radius: 6px;\n padding: 2px;\n border: 1px solid #dee2e6;\n}\n\n.view-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 16px;\n}\n\n.view-btn[_ngcontent-%COMP%]:hover {\n color: #495057;\n}\n\n.view-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #17a2b8;\n box-shadow: 0 1px 2px rgba(0,0,0,0.08);\n}\n\n//[_ngcontent-%COMP%] Control[_ngcontent-%COMP%] Buttons\n.control-btn[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.control-btn.primary[_ngcontent-%COMP%] {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.control-btn.primary[_ngcontent-%COMP%]:hover {\n background: #138496;\n border-color: #117a8b;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);\n}\n\n//[_ngcontent-%COMP%] Splitter[_ngcontent-%COMP%] content\nkendo-splitter[_ngcontent-%COMP%] {\n flex: 1;\n background-color: #f5f7fa;\n margin-top: 8px;\n}\n\n//[_ngcontent-%COMP%] Filter[_ngcontent-%COMP%] panel\n.filter-panel[_ngcontent-%COMP%] {\n height: 100%;\n background: white;\n border-right: 1px solid #e0e0e0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n \n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 500;\n color: #333;\n flex: 1;\n }\n \n .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 12px;\n font-size: 12px;\n \n .summary-value {\n font-weight: 600;\n color: #2196f3;\n }\n \n .summary-label {\n color: #666;\n }\n }\n \n .close-btn {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: #666;\n border-radius: 3px;\n transition: all 0.2s;\n \n &:hover {\n background: #f0f0f0;\n color: #333;\n }\n \n .fa-solid {\n font-size: 12px;\n }\n }\n}\n\n.filter-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 12px;\n}\n\n.filter-group[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n \n .filter-label {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #555;\n \n .fa-solid {\n font-size: 11px;\n color: #2196f3;\n width: 12px;\n }\n }\n}\n\n.filter-input[_ngcontent-%COMP%], .filter-select[_ngcontent-%COMP%] {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 10px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n \n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n \n &::placeholder {\n color: #999;\n }\n}\n\n.filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.filter-actions[_ngcontent-%COMP%] {\n margin-top: 24px;\n padding-top: 16px;\n border-top: 1px solid #f0f0f0;\n \n .reset-btn {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 12px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n color: #666;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.2s;\n box-sizing: border-box;\n \n &:hover {\n background: #e9ecef;\n border-color: #ccc;\n color: #333;\n }\n \n .fa-solid {\n font-size: 11px;\n }\n }\n}\n\n//[_ngcontent-%COMP%] Content[_ngcontent-%COMP%] area\n.content-area[_ngcontent-%COMP%] {\n height: 100%;\n padding: 24px;\n overflow-y: auto;\n background: #f5f7fa;\n}\n\n//[_ngcontent-%COMP%] Empty[_ngcontent-%COMP%] state\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: #6c757d;\n \n i {\n margin-bottom: 24px;\n opacity: 0.3;\n }\n \n h3 {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 16px;\n }\n}\n\n//[_ngcontent-%COMP%] Grid[_ngcontent-%COMP%] view\n.prompt-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));\n gap: 20px;\n}\n\n.prompt-card[_ngcontent-%COMP%] {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n transition: all 0.3s ease;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);\n .expand-icon {\n transform: rotate(180deg);\n }\n }\n}\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 20px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n \n &:hover {\n background-color: #f8f9fa;\n }\n}\n\n.card-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n background-color: #e3f2fd;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 16px;\n flex-shrink: 0;\n \n i {\n font-size: 24px;\n color: #17a2b8;\n }\n}\n\n.card-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n \n .prompt-name {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n }\n\n .card-description {\n margin: 0;\n font-size: 13px;\n color: #6c757d;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 1.4;\n }\n}\n\n\n.expand-icon[_ngcontent-%COMP%] {\n color: #adb5bd;\n transition: transform 0.3s ease;\n margin-left: 12px;\n}\n\n.card-content[_ngcontent-%COMP%] {\n padding: 0 20px 20px;\n animation: _ngcontent-%COMP%_slideDown 0.3s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.description-section[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n \n h5 {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n color: #495057;\n line-height: 1.6;\n }\n}\n\n.stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.stat[_ngcontent-%COMP%] {\n text-align: center;\n \n .stat-label {\n display: block;\n font-size: 12px;\n color: #6c757d;\n margin-bottom: 4px;\n }\n \n .stat-value {\n display: block;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n }\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n \n &.active {\n background-color: #d4edda;\n color: #155724;\n }\n \n &.inactive {\n background-color: #f8d7da;\n color: #721c24;\n }\n}\n\n.card-footer[_ngcontent-%COMP%] {\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n display: flex;\n gap: 8px;\n}\n\n.action-button[_ngcontent-%COMP%] {\n padding: 6px 12px;\n background-color: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n color: #495057;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n \n &:hover {\n background-color: #e9ecef;\n border-color: #adb5bd;\n color: #212529;\n }\n \n &.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n \n &:hover:not(:disabled) {\n background: #1485a3;\n border-color: #1485a3;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n \n &:hover {\n transform: none;\n box-shadow: none;\n background: #17a2b8;\n }\n }\n }\n \n &.small {\n padding: 4px 8px;\n font-size: 12px;\n \n &.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n \n &:hover:not(:disabled) {\n background: #1485a3;\n border-color: #1485a3;\n }\n }\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n}\n\n//[_ngcontent-%COMP%] List[_ngcontent-%COMP%] view\n.prompt-list[_ngcontent-%COMP%] {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n overflow: hidden;\n}\n\n.data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n \n thead {\n background-color: #f8f9fa;\n \n tr {\n border-bottom: 2px solid #dee2e6;\n }\n \n th {\n padding: 12px 16px;\n text-align: left;\n font-size: 13px;\n font-weight: 600;\n color: #495057;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n }\n \n tbody {\n tr {\n border-bottom: 1px solid #e9ecef;\n transition: background-color 0.2s ease;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:last-child {\n border-bottom: none;\n }\n }\n \n td {\n padding: 16px;\n font-size: 14px;\n color: #495057;\n }\n }\n}\n\n.name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n color: #2c3e50;\n \n i {\n color: #17a2b8;\n }\n}\n\n//[_ngcontent-%COMP%] Priority[_ngcontent-%COMP%] matrix[_ngcontent-%COMP%] container\n.priority-matrix-container[_ngcontent-%COMP%] {\n height: 100%;\n background-color: white;\n border-radius: 12px;\n padding: 24px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n}\n\n//[_ngcontent-%COMP%] Responsive\n@media[_ngcontent-%COMP%] (max-width[_ngcontent-%COMP%]: 768px)[_ngcontent-%COMP%] {\n .prompt-header {\n flex-wrap: wrap;\n gap: 16px;\n }\n \n .header-right {\n width: 100%;\n justify-content: space-between;\n }\n \n .prompt-grid {\n grid-template-columns: 1fr;\n }\n \n .stats-grid {\n grid-template-columns: 1fr;\n }\n}\n\n//[_ngcontent-%COMP%] Text[_ngcontent-%COMP%] utility[_ngcontent-%COMP%] classes\n.text-success[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.text-muted[_ngcontent-%COMP%] {\n color: #6c757d;\n}"] });
|
|
753
735
|
}
|
|
754
736
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PromptManagementV2Component, [{
|
|
755
737
|
type: Component,
|
|
756
|
-
args: [{ selector: 'app-prompt-management-v2', template: "<div class=\"prompt-management-v2\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <div class=\"loading-spinner\">\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n </div>\n <div class=\"loading-text\">{{ currentLoadingMessage }}</div>\n </div>\n </div>\n } @else {\n <div class=\"dashboard-header\" style=\"display: flex !important; justify-content: space-between !important; align-items: center !important; padding: 16px 24px !important; background: white !important;\">\n <div class=\"header-info\" style=\"display: flex !important; align-items: center !important; gap: 16px !important; flex: 1 !important;\">\n <h2 class=\"dashboard-title\" style=\"margin: 0 !important; display: flex !important; align-items: center !important; gap: 8px !important;\">\n <i class=\"fa-solid fa-message\"></i>\n AI Prompts\n </h2>\n <button \n type=\"button\" \n class=\"filter-toggle-btn\"\n (click)=\"toggleFilters()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (showFilters) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ filteredPrompts.length }} prompts</span>\n </div>\n \n <div class=\"header-controls\" style=\"display: flex !important; align-items: center !important; gap: 16px !important;\">\n <div class=\"view-toggle\">\n <button \n type=\"button\" \n class=\"view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button \n type=\"button\" \n class=\"view-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"setViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button \n type=\"button\" \n class=\"view-btn\"\n [class.active]=\"viewMode === 'priority-matrix'\"\n (click)=\"setViewMode('priority-matrix')\"\n title=\"Priority Matrix\">\n <i class=\"fa-solid fa-chart-scatter\"></i>\n </button>\n </div>\n \n <button \n type=\"button\" \n class=\"control-btn primary\"\n (click)=\"createNewPrompt()\"\n title=\"Create New Prompt\">\n <i class=\"fa-solid fa-plus\"></i>\n New Prompt\n </button>\n </div>\n </div>\n\n <kendo-splitter orientation=\"horizontal\">\n @if (showFilters) {\n <kendo-splitter-pane size=\"320\" min=\"250\" max=\"400\">\n <div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Prompt Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredPrompts.length }}</span>\n <span class=\"summary-label\">of {{ prompts.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n \n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-search\"></span>\n Name\n </label>\n <input \n type=\"text\"\n class=\"filter-input\"\n placeholder=\"Search prompts...\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n\n <!-- Category Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-folder\"></span>\n Category\n </label>\n <select class=\"filter-select\" [value]=\"selectedCategory\" (change)=\"onCategoryChange($any($event.target).value)\">\n <option value=\"all\">All Categories</option>\n @for (category of categories; track category.ID) {\n <option [value]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-tag\"></span>\n Type\n </label>\n <select class=\"filter-select\" [value]=\"selectedType\" (change)=\"onTypeChange($any($event.target).value)\">\n <option value=\"all\">All Types</option>\n @for (type of types; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n Status\n </label>\n <select class=\"filter-select\" [value]=\"selectedStatus\" (change)=\"onStatusChange($any($event.target).value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n </select>\n </div>\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"clearFilters()\" title=\"Reset all filters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n }\n\n <kendo-splitter-pane>\n <div class=\"content-area\">\n @if (filteredPrompts.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-dots fa-4x\"></i>\n <h3>No prompts found</h3>\n <p>{{ hasActiveFilters ? 'Try adjusting your filters' : 'Create your first AI prompt to get started' }}</p>\n @if (!hasActiveFilters) {\n <button class=\"primary-action\" (click)=\"createNewPrompt()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create First Prompt\n </button>\n }\n </div>\n } @else {\n @switch (viewMode) {\n @case ('grid') {\n <div class=\"prompt-grid\">\n @for (prompt of filteredPrompts; track prompt.ID) {\n <div class=\"prompt-card\" [class.expanded]=\"expandedPromptId === prompt.ID\">\n <div class=\"card-header\" (click)=\"togglePromptExpansion(prompt.ID)\">\n <div class=\"card-icon\">\n <i [class]=\"getPromptIcon(prompt)\"></i>\n </div>\n <div class=\"card-info\">\n <h4 class=\"prompt-name\">{{ prompt.Name || 'Unnamed Prompt' }}</h4>\n @if (prompt.Description) {\n <p class=\"card-description\">{{ prompt.Description }}</p>\n }\n </div>\n <i class=\"fa-solid fa-chevron-down expand-icon\" [class.rotated]=\"expandedPromptId === prompt.ID\"></i>\n </div>\n\n @if (expandedPromptId === prompt.ID) {\n <div class=\"card-content\">\n <div class=\"stats-grid\">\n <div class=\"stat\">\n <span class=\"stat-label\">Category</span>\n <span class=\"stat-value\">{{ prompt.CategoryName }}</span>\n </div>\n <div class=\"stat\">\n <span class=\"stat-label\">Type</span>\n <span class=\"stat-value\">{{ prompt.TypeName }}</span>\n </div>\n <div class=\"stat\">\n <span class=\"stat-label\">Status</span>\n <span class=\"stat-value status-badge\" [class]=\"getStatusClass(prompt.Status)\">\n {{ prompt.Status }}\n </span>\n </div>\n </div>\n\n <div class=\"stats-grid\" style=\"margin-top: 12px;\">\n <div class=\"stat\">\n <span class=\"stat-label\">Template</span>\n <span class=\"stat-value\">\n @if (prompt.TemplateEntity) {\n <i class=\"fa-solid fa-check-circle text-success\"></i> Yes\n } @else {\n <i class=\"fa-solid fa-times-circle text-muted\"></i> No\n }\n </span>\n </div>\n <div class=\"stat\">\n <span class=\"stat-label\">Contents</span>\n <span class=\"stat-value\">{{ prompt.TemplateContents?.length || 0 }}</span>\n </div>\n </div>\n\n <div class=\"card-footer\">\n <button class=\"action-button primary\" (click)=\"testPrompt(prompt.ID, $event)\" [disabled]=\"prompt.Status !== 'Active'\" title=\"Run Prompt\">\n <i class=\"fa-solid fa-play\"></i>\n Run\n </button>\n <button class=\"action-button\" (click)=\"openPrompt(prompt.ID); $event.stopPropagation()\" title=\"Edit Prompt\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n \n @case ('list') {\n <div class=\"prompt-list\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Category</th>\n <th>Type</th>\n <th>Status</th>\n <th>Template</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (prompt of filteredPrompts; track prompt.ID) {\n <tr>\n <td>\n <div class=\"name-cell\">\n <i [class]=\"getPromptIcon(prompt)\"></i>\n {{ prompt.Name }}\n </div>\n </td>\n <td>{{ prompt.CategoryName }}</td>\n <td>{{ prompt.TypeName }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"getStatusClass(prompt.Status)\">\n {{ prompt.Status }}\n </span>\n </td>\n <td>\n @if (prompt.TemplateEntity) {\n <i class=\"fa-solid fa-check-circle text-success\"></i>\n } @else {\n <i class=\"fa-solid fa-times-circle text-muted\"></i>\n }\n </td>\n <td>\n <button class=\"action-button small primary\" (click)=\"testPrompt(prompt.ID, $event)\" [disabled]=\"prompt.Status !== 'Active'\" title=\"Run Prompt\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n <button class=\"action-button small\" (click)=\"openPrompt(prompt.ID)\" title=\"Edit Prompt\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n \n @case ('priority-matrix') {\n <div class=\"priority-matrix-container\">\n <app-model-prompt-priority-matrix \n [selectedPrompts]=\"filteredPromptsAsEntities\"\n (promptSelected)=\"openPrompt($event.ID)\">\n </app-model-prompt-priority-matrix>\n </div>\n }\n }\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n }\n</div>\n\n<!-- AI Prompt Test Harness -->\n@if (selectedPromptForTest) {\n <kendo-window \n [width]=\"1200\" \n [height]=\"800\" \n [minWidth]=\"800\"\n [minHeight]=\"600\"\n [draggable]=\"true\"\n [resizable]=\"true\"\n [state]=\"'default'\"\n (close)=\"closeTestHarness()\"\n title=\"Run AI Prompt - {{ selectedPromptForTest.Name || 'Untitled' }}\">\n <mj-ai-test-harness\n [mode]=\"'prompt'\"\n [entity]=\"selectedPromptForTest\"\n [isVisible]=\"true\"\n (visibilityChange)=\"closeTestHarness()\">\n </mj-ai-test-harness>\n </kendo-window>\n}", styles: [".prompt-management-v2 {\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: #f5f7fa;\n}\n\n// Loading state\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background-color: #f5f7fa;\n}\n\n.loading-content {\n text-align: center;\n}\n\n.loading-spinner {\n position: relative;\n width: 80px;\n height: 80px;\n margin: 0 auto 20px;\n}\n\n.spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-top-color: #17a2b8;\n border-radius: 50%;\n animation: spin 1.5s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;\n \n &:nth-child(2) {\n animation-delay: 0.15s;\n width: 70%;\n height: 70%;\n top: 15%;\n left: 15%;\n border-top-color: #28a745;\n }\n \n &:nth-child(3) {\n animation-delay: 0.3s;\n width: 40%;\n height: 40%;\n top: 30%;\n left: 30%;\n border-top-color: #ffc107;\n }\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text {\n color: #6c757d;\n font-size: 16px;\n animation: pulse 2s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 1; }\n}\n\n// Dashboard Header\n.dashboard-header {\n background: white;\n padding: 16px 24px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.header-info {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.dashboard-title i {\n color: #17a2b8;\n}\n\n.filter-toggle-btn {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-toggle-btn:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.item-count {\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n}\n\n.header-controls {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n// View Toggle\n.view-toggle {\n display: flex;\n background: #f8f9fa;\n border-radius: 6px;\n padding: 2px;\n border: 1px solid #dee2e6;\n}\n\n.view-btn {\n background: transparent;\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 16px;\n}\n\n.view-btn:hover {\n color: #495057;\n}\n\n.view-btn.active {\n background: white;\n color: #17a2b8;\n box-shadow: 0 1px 2px rgba(0,0,0,0.08);\n}\n\n// Control Buttons\n.control-btn {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.control-btn.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.control-btn.primary:hover {\n background: #138496;\n border-color: #117a8b;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);\n}\n\n// Splitter content\nkendo-splitter {\n flex: 1;\n background-color: #f5f7fa;\n margin-top: 8px;\n}\n\n// Filter panel\n.filter-panel {\n height: 100%;\n background: white;\n border-right: 1px solid #e0e0e0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.filter-panel-header {\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n \n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 500;\n color: #333;\n flex: 1;\n }\n \n .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 12px;\n font-size: 12px;\n \n .summary-value {\n font-weight: 600;\n color: #2196f3;\n }\n \n .summary-label {\n color: #666;\n }\n }\n \n .close-btn {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: #666;\n border-radius: 3px;\n transition: all 0.2s;\n \n &:hover {\n background: #f0f0f0;\n color: #333;\n }\n \n .fa-solid {\n font-size: 12px;\n }\n }\n}\n\n.filter-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 12px;\n}\n\n.filter-group {\n margin-bottom: 20px;\n \n .filter-label {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #555;\n \n .fa-solid {\n font-size: 11px;\n color: #2196f3;\n width: 12px;\n }\n }\n}\n\n.filter-input, .filter-select {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 10px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n \n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n \n &::placeholder {\n color: #999;\n }\n}\n\n.filter-select {\n cursor: pointer;\n}\n\n.filter-actions {\n margin-top: 24px;\n padding-top: 16px;\n border-top: 1px solid #f0f0f0;\n \n .reset-btn {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 12px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n color: #666;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.2s;\n box-sizing: border-box;\n \n &:hover {\n background: #e9ecef;\n border-color: #ccc;\n color: #333;\n }\n \n .fa-solid {\n font-size: 11px;\n }\n }\n}\n\n// Content area\n.content-area {\n height: 100%;\n padding: 24px;\n overflow-y: auto;\n background: #f5f7fa;\n}\n\n// Empty state\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: #6c757d;\n \n i {\n margin-bottom: 24px;\n opacity: 0.3;\n }\n \n h3 {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 16px;\n }\n}\n\n// Grid view\n.prompt-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));\n gap: 20px;\n}\n\n.prompt-card {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n transition: all 0.3s ease;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);\n .expand-icon {\n transform: rotate(180deg);\n }\n }\n}\n\n.card-header {\n display: flex;\n align-items: center;\n padding: 20px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n \n &:hover {\n background-color: #f8f9fa;\n }\n}\n\n.card-icon {\n width: 48px;\n height: 48px;\n background-color: #e3f2fd;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 16px;\n flex-shrink: 0;\n \n i {\n font-size: 24px;\n color: #17a2b8;\n }\n}\n\n.card-info {\n flex: 1;\n min-width: 0;\n \n .prompt-name {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n }\n\n .card-description {\n margin: 0;\n font-size: 13px;\n color: #6c757d;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 1.4;\n }\n}\n\n\n.expand-icon {\n color: #adb5bd;\n transition: transform 0.3s ease;\n margin-left: 12px;\n}\n\n.card-content {\n padding: 0 20px 20px;\n animation: slideDown 0.3s ease;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.description-section {\n margin-bottom: 16px;\n \n h5 {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n color: #495057;\n line-height: 1.6;\n }\n}\n\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.stat {\n text-align: center;\n \n .stat-label {\n display: block;\n font-size: 12px;\n color: #6c757d;\n margin-bottom: 4px;\n }\n \n .stat-value {\n display: block;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n }\n}\n\n.status-badge {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n \n &.active {\n background-color: #d4edda;\n color: #155724;\n }\n \n &.inactive {\n background-color: #f8d7da;\n color: #721c24;\n }\n}\n\n.card-footer {\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n display: flex;\n gap: 8px;\n}\n\n.action-button {\n padding: 6px 12px;\n background-color: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n color: #495057;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n \n &:hover {\n background-color: #e9ecef;\n border-color: #adb5bd;\n color: #212529;\n }\n \n &.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n \n &:hover:not(:disabled) {\n background: #1485a3;\n border-color: #1485a3;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n \n &:hover {\n transform: none;\n box-shadow: none;\n background: #17a2b8;\n }\n }\n }\n \n &.small {\n padding: 4px 8px;\n font-size: 12px;\n \n &.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n \n &:hover:not(:disabled) {\n background: #1485a3;\n border-color: #1485a3;\n }\n }\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n}\n\n// List view\n.prompt-list {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n overflow: hidden;\n}\n\n.data-table {\n width: 100%;\n border-collapse: collapse;\n \n thead {\n background-color: #f8f9fa;\n \n tr {\n border-bottom: 2px solid #dee2e6;\n }\n \n th {\n padding: 12px 16px;\n text-align: left;\n font-size: 13px;\n font-weight: 600;\n color: #495057;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n }\n \n tbody {\n tr {\n border-bottom: 1px solid #e9ecef;\n transition: background-color 0.2s ease;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:last-child {\n border-bottom: none;\n }\n }\n \n td {\n padding: 16px;\n font-size: 14px;\n color: #495057;\n }\n }\n}\n\n.name-cell {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n color: #2c3e50;\n \n i {\n color: #17a2b8;\n }\n}\n\n// Priority matrix container\n.priority-matrix-container {\n height: 100%;\n background-color: white;\n border-radius: 12px;\n padding: 24px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n}\n\n// Responsive\n@media (max-width: 768px) {\n .prompt-header {\n flex-wrap: wrap;\n gap: 16px;\n }\n \n .header-right {\n width: 100%;\n justify-content: space-between;\n }\n \n .prompt-grid {\n grid-template-columns: 1fr;\n }\n \n .stats-grid {\n grid-template-columns: 1fr;\n }\n}\n\n// Text utility classes\n.text-success {\n color: #28a745;\n}\n\n.text-muted {\n color: #6c757d;\n}"] }]
|
|
757
|
-
}], () => [{ type: i1.SharedService }], { openEntityRecord: [{
|
|
738
|
+
args: [{ selector: 'app-prompt-management-v2', template: "<div class=\"prompt-management-v2\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <div class=\"loading-spinner\">\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n </div>\n <div class=\"loading-text\">{{ currentLoadingMessage }}</div>\n </div>\n </div>\n } @else {\n <div class=\"dashboard-header\" style=\"display: flex !important; justify-content: space-between !important; align-items: center !important; padding: 16px 24px !important; background: white !important;\">\n <div class=\"header-info\" style=\"display: flex !important; align-items: center !important; gap: 16px !important; flex: 1 !important;\">\n <h2 class=\"dashboard-title\" style=\"margin: 0 !important; display: flex !important; align-items: center !important; gap: 8px !important;\">\n <i class=\"fa-solid fa-message\"></i>\n AI Prompts\n </h2>\n <button \n type=\"button\" \n class=\"filter-toggle-btn\"\n (click)=\"toggleFilters()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (showFilters) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ filteredPrompts.length }} prompts</span>\n </div>\n \n <div class=\"header-controls\" style=\"display: flex !important; align-items: center !important; gap: 16px !important;\">\n <div class=\"view-toggle\">\n <button \n type=\"button\" \n class=\"view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button \n type=\"button\" \n class=\"view-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"setViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button \n type=\"button\" \n class=\"view-btn\"\n [class.active]=\"viewMode === 'priority-matrix'\"\n (click)=\"setViewMode('priority-matrix')\"\n title=\"Priority Matrix\">\n <i class=\"fa-solid fa-chart-scatter\"></i>\n </button>\n </div>\n \n <button \n type=\"button\" \n class=\"control-btn primary\"\n (click)=\"createNewPrompt()\"\n title=\"Create New Prompt\">\n <i class=\"fa-solid fa-plus\"></i>\n New Prompt\n </button>\n </div>\n </div>\n\n <kendo-splitter orientation=\"horizontal\">\n @if (showFilters) {\n <kendo-splitter-pane size=\"320\" min=\"250\" max=\"400\">\n <div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Prompt Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredPrompts.length }}</span>\n <span class=\"summary-label\">of {{ prompts.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n \n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-search\"></span>\n Name\n </label>\n <input \n type=\"text\"\n class=\"filter-input\"\n placeholder=\"Search prompts...\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n\n <!-- Category Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-folder\"></span>\n Category\n </label>\n <select class=\"filter-select\" [value]=\"selectedCategory\" (change)=\"onCategoryChange($any($event.target).value)\">\n <option value=\"all\">All Categories</option>\n @for (category of categories; track category.ID) {\n <option [value]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-tag\"></span>\n Type\n </label>\n <select class=\"filter-select\" [value]=\"selectedType\" (change)=\"onTypeChange($any($event.target).value)\">\n <option value=\"all\">All Types</option>\n @for (type of types; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n Status\n </label>\n <select class=\"filter-select\" [value]=\"selectedStatus\" (change)=\"onStatusChange($any($event.target).value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n </select>\n </div>\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"clearFilters()\" title=\"Reset all filters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n }\n\n <kendo-splitter-pane>\n <div class=\"content-area\">\n @if (filteredPrompts.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-dots fa-4x\"></i>\n <h3>No prompts found</h3>\n <p>{{ hasActiveFilters ? 'Try adjusting your filters' : 'Create your first AI prompt to get started' }}</p>\n @if (!hasActiveFilters) {\n <button class=\"primary-action\" (click)=\"createNewPrompt()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create First Prompt\n </button>\n }\n </div>\n } @else {\n @switch (viewMode) {\n @case ('grid') {\n <div class=\"prompt-grid\">\n @for (prompt of filteredPrompts; track prompt.ID) {\n <div class=\"prompt-card\" [class.expanded]=\"expandedPromptId === prompt.ID\">\n <div class=\"card-header\" (click)=\"togglePromptExpansion(prompt.ID)\">\n <div class=\"card-icon\">\n <i [class]=\"getPromptIcon(prompt)\"></i>\n </div>\n <div class=\"card-info\">\n <h4 class=\"prompt-name\">{{ prompt.Name || 'Unnamed Prompt' }}</h4>\n @if (prompt.Description) {\n <p class=\"card-description\">{{ prompt.Description }}</p>\n }\n </div>\n <i class=\"fa-solid fa-chevron-down expand-icon\" [class.rotated]=\"expandedPromptId === prompt.ID\"></i>\n </div>\n\n @if (expandedPromptId === prompt.ID) {\n <div class=\"card-content\">\n <div class=\"stats-grid\">\n <div class=\"stat\">\n <span class=\"stat-label\">Category</span>\n <span class=\"stat-value\">{{ prompt.CategoryName }}</span>\n </div>\n <div class=\"stat\">\n <span class=\"stat-label\">Type</span>\n <span class=\"stat-value\">{{ prompt.TypeName }}</span>\n </div>\n <div class=\"stat\">\n <span class=\"stat-label\">Status</span>\n <span class=\"stat-value status-badge\" [class]=\"getStatusClass(prompt.Status)\">\n {{ prompt.Status }}\n </span>\n </div>\n </div>\n\n <div class=\"stats-grid\" style=\"margin-top: 12px;\">\n <div class=\"stat\">\n <span class=\"stat-label\">Template</span>\n <span class=\"stat-value\">\n @if (prompt.TemplateEntity) {\n <i class=\"fa-solid fa-check-circle text-success\"></i> Yes\n } @else {\n <i class=\"fa-solid fa-times-circle text-muted\"></i> No\n }\n </span>\n </div>\n <div class=\"stat\">\n <span class=\"stat-label\">Contents</span>\n <span class=\"stat-value\">{{ prompt.TemplateContents?.length || 0 }}</span>\n </div>\n </div>\n\n <div class=\"card-footer\">\n <button class=\"action-button primary\" (click)=\"testPrompt(prompt.ID, $event)\" [disabled]=\"prompt.Status !== 'Active'\" title=\"Run Prompt\">\n <i class=\"fa-solid fa-play\"></i>\n Run\n </button>\n <button class=\"action-button\" (click)=\"openPrompt(prompt.ID); $event.stopPropagation()\" title=\"Edit Prompt\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n \n @case ('list') {\n <div class=\"prompt-list\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Category</th>\n <th>Type</th>\n <th>Status</th>\n <th>Template</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (prompt of filteredPrompts; track prompt.ID) {\n <tr>\n <td>\n <div class=\"name-cell\">\n <i [class]=\"getPromptIcon(prompt)\"></i>\n {{ prompt.Name }}\n </div>\n </td>\n <td>{{ prompt.CategoryName }}</td>\n <td>{{ prompt.TypeName }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"getStatusClass(prompt.Status)\">\n {{ prompt.Status }}\n </span>\n </td>\n <td>\n @if (prompt.TemplateEntity) {\n <i class=\"fa-solid fa-check-circle text-success\"></i>\n } @else {\n <i class=\"fa-solid fa-times-circle text-muted\"></i>\n }\n </td>\n <td>\n <button class=\"action-button small primary\" (click)=\"testPrompt(prompt.ID, $event)\" [disabled]=\"prompt.Status !== 'Active'\" title=\"Run Prompt\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n <button class=\"action-button small\" (click)=\"openPrompt(prompt.ID)\" title=\"Edit Prompt\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n \n @case ('priority-matrix') {\n <div class=\"priority-matrix-container\">\n <app-model-prompt-priority-matrix \n [selectedPrompts]=\"filteredPromptsAsEntities\"\n (promptSelected)=\"openPrompt($event.ID)\">\n </app-model-prompt-priority-matrix>\n </div>\n }\n }\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n }\n</div>\n\n<!-- AI Prompt Test Harness - Now handled by service with minimize support -->", styles: [".prompt-management-v2 {\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: #f5f7fa;\n}\n\n// Loading state\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background-color: #f5f7fa;\n}\n\n.loading-content {\n text-align: center;\n}\n\n.loading-spinner {\n position: relative;\n width: 80px;\n height: 80px;\n margin: 0 auto 20px;\n}\n\n.spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-top-color: #17a2b8;\n border-radius: 50%;\n animation: spin 1.5s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;\n \n &:nth-child(2) {\n animation-delay: 0.15s;\n width: 70%;\n height: 70%;\n top: 15%;\n left: 15%;\n border-top-color: #28a745;\n }\n \n &:nth-child(3) {\n animation-delay: 0.3s;\n width: 40%;\n height: 40%;\n top: 30%;\n left: 30%;\n border-top-color: #ffc107;\n }\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text {\n color: #6c757d;\n font-size: 16px;\n animation: pulse 2s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 1; }\n}\n\n// Dashboard Header\n.dashboard-header {\n background: white;\n padding: 16px 24px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.header-info {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.dashboard-title i {\n color: #17a2b8;\n}\n\n.filter-toggle-btn {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-toggle-btn:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.item-count {\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n}\n\n.header-controls {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n// View Toggle\n.view-toggle {\n display: flex;\n background: #f8f9fa;\n border-radius: 6px;\n padding: 2px;\n border: 1px solid #dee2e6;\n}\n\n.view-btn {\n background: transparent;\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 16px;\n}\n\n.view-btn:hover {\n color: #495057;\n}\n\n.view-btn.active {\n background: white;\n color: #17a2b8;\n box-shadow: 0 1px 2px rgba(0,0,0,0.08);\n}\n\n// Control Buttons\n.control-btn {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.control-btn.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.control-btn.primary:hover {\n background: #138496;\n border-color: #117a8b;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);\n}\n\n// Splitter content\nkendo-splitter {\n flex: 1;\n background-color: #f5f7fa;\n margin-top: 8px;\n}\n\n// Filter panel\n.filter-panel {\n height: 100%;\n background: white;\n border-right: 1px solid #e0e0e0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.filter-panel-header {\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n \n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 500;\n color: #333;\n flex: 1;\n }\n \n .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 12px;\n font-size: 12px;\n \n .summary-value {\n font-weight: 600;\n color: #2196f3;\n }\n \n .summary-label {\n color: #666;\n }\n }\n \n .close-btn {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: #666;\n border-radius: 3px;\n transition: all 0.2s;\n \n &:hover {\n background: #f0f0f0;\n color: #333;\n }\n \n .fa-solid {\n font-size: 12px;\n }\n }\n}\n\n.filter-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 12px;\n}\n\n.filter-group {\n margin-bottom: 20px;\n \n .filter-label {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #555;\n \n .fa-solid {\n font-size: 11px;\n color: #2196f3;\n width: 12px;\n }\n }\n}\n\n.filter-input, .filter-select {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 10px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n \n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n \n &::placeholder {\n color: #999;\n }\n}\n\n.filter-select {\n cursor: pointer;\n}\n\n.filter-actions {\n margin-top: 24px;\n padding-top: 16px;\n border-top: 1px solid #f0f0f0;\n \n .reset-btn {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 12px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n color: #666;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.2s;\n box-sizing: border-box;\n \n &:hover {\n background: #e9ecef;\n border-color: #ccc;\n color: #333;\n }\n \n .fa-solid {\n font-size: 11px;\n }\n }\n}\n\n// Content area\n.content-area {\n height: 100%;\n padding: 24px;\n overflow-y: auto;\n background: #f5f7fa;\n}\n\n// Empty state\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: #6c757d;\n \n i {\n margin-bottom: 24px;\n opacity: 0.3;\n }\n \n h3 {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 16px;\n }\n}\n\n// Grid view\n.prompt-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));\n gap: 20px;\n}\n\n.prompt-card {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n transition: all 0.3s ease;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);\n .expand-icon {\n transform: rotate(180deg);\n }\n }\n}\n\n.card-header {\n display: flex;\n align-items: center;\n padding: 20px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n \n &:hover {\n background-color: #f8f9fa;\n }\n}\n\n.card-icon {\n width: 48px;\n height: 48px;\n background-color: #e3f2fd;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 16px;\n flex-shrink: 0;\n \n i {\n font-size: 24px;\n color: #17a2b8;\n }\n}\n\n.card-info {\n flex: 1;\n min-width: 0;\n \n .prompt-name {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n }\n\n .card-description {\n margin: 0;\n font-size: 13px;\n color: #6c757d;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 1.4;\n }\n}\n\n\n.expand-icon {\n color: #adb5bd;\n transition: transform 0.3s ease;\n margin-left: 12px;\n}\n\n.card-content {\n padding: 0 20px 20px;\n animation: slideDown 0.3s ease;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.description-section {\n margin-bottom: 16px;\n \n h5 {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n color: #495057;\n line-height: 1.6;\n }\n}\n\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.stat {\n text-align: center;\n \n .stat-label {\n display: block;\n font-size: 12px;\n color: #6c757d;\n margin-bottom: 4px;\n }\n \n .stat-value {\n display: block;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n }\n}\n\n.status-badge {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n \n &.active {\n background-color: #d4edda;\n color: #155724;\n }\n \n &.inactive {\n background-color: #f8d7da;\n color: #721c24;\n }\n}\n\n.card-footer {\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n display: flex;\n gap: 8px;\n}\n\n.action-button {\n padding: 6px 12px;\n background-color: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n color: #495057;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n \n &:hover {\n background-color: #e9ecef;\n border-color: #adb5bd;\n color: #212529;\n }\n \n &.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n \n &:hover:not(:disabled) {\n background: #1485a3;\n border-color: #1485a3;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n \n &:hover {\n transform: none;\n box-shadow: none;\n background: #17a2b8;\n }\n }\n }\n \n &.small {\n padding: 4px 8px;\n font-size: 12px;\n \n &.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n \n &:hover:not(:disabled) {\n background: #1485a3;\n border-color: #1485a3;\n }\n }\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n}\n\n// List view\n.prompt-list {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n overflow: hidden;\n}\n\n.data-table {\n width: 100%;\n border-collapse: collapse;\n \n thead {\n background-color: #f8f9fa;\n \n tr {\n border-bottom: 2px solid #dee2e6;\n }\n \n th {\n padding: 12px 16px;\n text-align: left;\n font-size: 13px;\n font-weight: 600;\n color: #495057;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n }\n \n tbody {\n tr {\n border-bottom: 1px solid #e9ecef;\n transition: background-color 0.2s ease;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:last-child {\n border-bottom: none;\n }\n }\n \n td {\n padding: 16px;\n font-size: 14px;\n color: #495057;\n }\n }\n}\n\n.name-cell {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n color: #2c3e50;\n \n i {\n color: #17a2b8;\n }\n}\n\n// Priority matrix container\n.priority-matrix-container {\n height: 100%;\n background-color: white;\n border-radius: 12px;\n padding: 24px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n}\n\n// Responsive\n@media (max-width: 768px) {\n .prompt-header {\n flex-wrap: wrap;\n gap: 16px;\n }\n \n .header-right {\n width: 100%;\n justify-content: space-between;\n }\n \n .prompt-grid {\n grid-template-columns: 1fr;\n }\n \n .stats-grid {\n grid-template-columns: 1fr;\n }\n}\n\n// Text utility classes\n.text-success {\n color: #28a745;\n}\n\n.text-muted {\n color: #6c757d;\n}"] }]
|
|
739
|
+
}], () => [{ type: i1.SharedService }, { type: i2.AITestHarnessDialogService }], { openEntityRecord: [{
|
|
758
740
|
type: Output
|
|
759
741
|
}], stateChange: [{
|
|
760
742
|
type: Output
|
|
761
743
|
}], initialState: [{
|
|
762
744
|
type: Input
|
|
763
745
|
}] }); })();
|
|
764
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PromptManagementV2Component, { className: "PromptManagementV2Component", filePath: "src/AI/components/prompts/prompt-management-v2.component.ts", lineNumber:
|
|
746
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PromptManagementV2Component, { className: "PromptManagementV2Component", filePath: "src/AI/components/prompts/prompt-management-v2.component.ts", lineNumber: 22 }); })();
|
|
765
747
|
//# sourceMappingURL=prompt-management-v2.component.js.map
|