@memberjunction/ng-dashboards 2.70.0 → 2.71.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 +25 -6
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +139 -67
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +26 -2
- package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management-v2.component.js +288 -189
- package/dist/AI/components/prompts/prompt-management-v2.component.js.map +1 -1
- package/package.json +10 -10
|
@@ -2,12 +2,14 @@ import { Component, Output, EventEmitter, Input } from '@angular/core';
|
|
|
2
2
|
import { Subject, BehaviorSubject } from 'rxjs';
|
|
3
3
|
import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
|
|
4
4
|
import { Metadata, RunView } from '@memberjunction/core';
|
|
5
|
+
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
import * as i1 from "@memberjunction/ng-shared";
|
|
7
8
|
import * as i2 from "@memberjunction/ng-ai-test-harness";
|
|
8
|
-
import * as i3 from "@angular/
|
|
9
|
-
import * as i4 from "@
|
|
10
|
-
import * as i5 from "
|
|
9
|
+
import * as i3 from "@angular/router";
|
|
10
|
+
import * as i4 from "@angular/forms";
|
|
11
|
+
import * as i5 from "@progress/kendo-angular-layout";
|
|
12
|
+
import * as i6 from "./model-prompt-priority-matrix.component";
|
|
11
13
|
const _forTrack0 = ($index, $item) => $item.ID;
|
|
12
14
|
function PromptManagementV2Component_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
13
15
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3);
|
|
@@ -27,88 +29,96 @@ function PromptManagementV2Component_Conditional_2_Conditional_7_Template(rf, ct
|
|
|
27
29
|
function PromptManagementV2Component_Conditional_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
28
30
|
i0.ɵɵtext(0, " Show Filters ");
|
|
29
31
|
} }
|
|
30
|
-
function
|
|
31
|
-
i0.ɵɵ
|
|
32
|
+
function PromptManagementV2Component_Conditional_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
33
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
34
|
+
i0.ɵɵelementStart(0, "button", 26);
|
|
35
|
+
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_19_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.createNewPrompt()); });
|
|
36
|
+
i0.ɵɵelement(1, "i", 27);
|
|
37
|
+
i0.ɵɵtext(2, " New Prompt ");
|
|
38
|
+
i0.ɵɵelementEnd();
|
|
39
|
+
} }
|
|
40
|
+
function PromptManagementV2Component_Conditional_2_Conditional_21_For_26_Template(rf, ctx) { if (rf & 1) {
|
|
41
|
+
i0.ɵɵelementStart(0, "option", 43);
|
|
32
42
|
i0.ɵɵtext(1);
|
|
33
43
|
i0.ɵɵelementEnd();
|
|
34
44
|
} if (rf & 2) {
|
|
35
|
-
const
|
|
36
|
-
i0.ɵɵproperty("value",
|
|
45
|
+
const category_r5 = ctx.$implicit;
|
|
46
|
+
i0.ɵɵproperty("value", category_r5.ID);
|
|
37
47
|
i0.ɵɵadvance();
|
|
38
|
-
i0.ɵɵtextInterpolate(
|
|
48
|
+
i0.ɵɵtextInterpolate(category_r5.Name);
|
|
39
49
|
} }
|
|
40
|
-
function
|
|
41
|
-
i0.ɵɵelementStart(0, "option",
|
|
50
|
+
function PromptManagementV2Component_Conditional_2_Conditional_21_For_35_Template(rf, ctx) { if (rf & 1) {
|
|
51
|
+
i0.ɵɵelementStart(0, "option", 43);
|
|
42
52
|
i0.ɵɵtext(1);
|
|
43
53
|
i0.ɵɵelementEnd();
|
|
44
54
|
} if (rf & 2) {
|
|
45
|
-
const
|
|
46
|
-
i0.ɵɵproperty("value",
|
|
55
|
+
const type_r6 = ctx.$implicit;
|
|
56
|
+
i0.ɵɵproperty("value", type_r6.ID);
|
|
47
57
|
i0.ɵɵadvance();
|
|
48
|
-
i0.ɵɵtextInterpolate(
|
|
58
|
+
i0.ɵɵtextInterpolate(type_r6.Name);
|
|
49
59
|
} }
|
|
50
|
-
function
|
|
51
|
-
const
|
|
52
|
-
i0.ɵɵelementStart(0, "kendo-splitter-pane",
|
|
60
|
+
function PromptManagementV2Component_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
61
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
62
|
+
i0.ɵɵelementStart(0, "kendo-splitter-pane", 23)(1, "div", 28)(2, "div", 29)(3, "h3");
|
|
53
63
|
i0.ɵɵtext(4, "Prompt Filters");
|
|
54
64
|
i0.ɵɵelementEnd();
|
|
55
|
-
i0.ɵɵelementStart(5, "div",
|
|
65
|
+
i0.ɵɵelementStart(5, "div", 30)(6, "span", 31);
|
|
56
66
|
i0.ɵɵtext(7);
|
|
57
67
|
i0.ɵɵelementEnd();
|
|
58
|
-
i0.ɵɵelementStart(8, "span",
|
|
68
|
+
i0.ɵɵelementStart(8, "span", 32);
|
|
59
69
|
i0.ɵɵtext(9);
|
|
60
70
|
i0.ɵɵelementEnd()();
|
|
61
|
-
i0.ɵɵelementStart(10, "button",
|
|
62
|
-
i0.ɵɵlistener("click", function
|
|
63
|
-
i0.ɵɵelement(11, "span",
|
|
71
|
+
i0.ɵɵelementStart(10, "button", 33);
|
|
72
|
+
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_21_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.toggleFilterPanel()); });
|
|
73
|
+
i0.ɵɵelement(11, "span", 34);
|
|
64
74
|
i0.ɵɵelementEnd()();
|
|
65
|
-
i0.ɵɵelementStart(12, "div",
|
|
66
|
-
i0.ɵɵelement(15, "span",
|
|
75
|
+
i0.ɵɵelementStart(12, "div", 35)(13, "div", 36)(14, "label", 37);
|
|
76
|
+
i0.ɵɵelement(15, "span", 38);
|
|
67
77
|
i0.ɵɵtext(16, " Name ");
|
|
68
78
|
i0.ɵɵelementEnd();
|
|
69
|
-
i0.ɵɵelementStart(17, "input",
|
|
70
|
-
i0.ɵɵlistener("input", function
|
|
79
|
+
i0.ɵɵelementStart(17, "input", 39);
|
|
80
|
+
i0.ɵɵlistener("input", function PromptManagementV2Component_Conditional_2_Conditional_21_Template_input_input_17_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onSearchChange($event.target.value)); });
|
|
71
81
|
i0.ɵɵelementEnd()();
|
|
72
|
-
i0.ɵɵelementStart(18, "div",
|
|
73
|
-
i0.ɵɵelement(20, "span",
|
|
82
|
+
i0.ɵɵelementStart(18, "div", 36)(19, "label", 37);
|
|
83
|
+
i0.ɵɵelement(20, "span", 40);
|
|
74
84
|
i0.ɵɵtext(21, " Category ");
|
|
75
85
|
i0.ɵɵelementEnd();
|
|
76
|
-
i0.ɵɵelementStart(22, "select",
|
|
77
|
-
i0.ɵɵlistener("change", function
|
|
78
|
-
i0.ɵɵelementStart(23, "option",
|
|
86
|
+
i0.ɵɵelementStart(22, "select", 41);
|
|
87
|
+
i0.ɵɵlistener("change", function PromptManagementV2Component_Conditional_2_Conditional_21_Template_select_change_22_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onCategoryChange($event.target.value)); });
|
|
88
|
+
i0.ɵɵelementStart(23, "option", 42);
|
|
79
89
|
i0.ɵɵtext(24, "All Categories");
|
|
80
90
|
i0.ɵɵelementEnd();
|
|
81
|
-
i0.ɵɵrepeaterCreate(25,
|
|
91
|
+
i0.ɵɵrepeaterCreate(25, PromptManagementV2Component_Conditional_2_Conditional_21_For_26_Template, 2, 2, "option", 43, _forTrack0);
|
|
82
92
|
i0.ɵɵelementEnd()();
|
|
83
|
-
i0.ɵɵelementStart(27, "div",
|
|
84
|
-
i0.ɵɵelement(29, "span",
|
|
93
|
+
i0.ɵɵelementStart(27, "div", 36)(28, "label", 37);
|
|
94
|
+
i0.ɵɵelement(29, "span", 44);
|
|
85
95
|
i0.ɵɵtext(30, " Type ");
|
|
86
96
|
i0.ɵɵelementEnd();
|
|
87
|
-
i0.ɵɵelementStart(31, "select",
|
|
88
|
-
i0.ɵɵlistener("change", function
|
|
89
|
-
i0.ɵɵelementStart(32, "option",
|
|
97
|
+
i0.ɵɵelementStart(31, "select", 41);
|
|
98
|
+
i0.ɵɵlistener("change", function PromptManagementV2Component_Conditional_2_Conditional_21_Template_select_change_31_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onTypeChange($event.target.value)); });
|
|
99
|
+
i0.ɵɵelementStart(32, "option", 42);
|
|
90
100
|
i0.ɵɵtext(33, "All Types");
|
|
91
101
|
i0.ɵɵelementEnd();
|
|
92
|
-
i0.ɵɵrepeaterCreate(34,
|
|
102
|
+
i0.ɵɵrepeaterCreate(34, PromptManagementV2Component_Conditional_2_Conditional_21_For_35_Template, 2, 2, "option", 43, _forTrack0);
|
|
93
103
|
i0.ɵɵelementEnd()();
|
|
94
|
-
i0.ɵɵelementStart(36, "div",
|
|
95
|
-
i0.ɵɵelement(38, "span",
|
|
104
|
+
i0.ɵɵelementStart(36, "div", 36)(37, "label", 37);
|
|
105
|
+
i0.ɵɵelement(38, "span", 45);
|
|
96
106
|
i0.ɵɵtext(39, " Status ");
|
|
97
107
|
i0.ɵɵelementEnd();
|
|
98
|
-
i0.ɵɵelementStart(40, "select",
|
|
99
|
-
i0.ɵɵlistener("change", function
|
|
100
|
-
i0.ɵɵelementStart(41, "option",
|
|
108
|
+
i0.ɵɵelementStart(40, "select", 41);
|
|
109
|
+
i0.ɵɵlistener("change", function PromptManagementV2Component_Conditional_2_Conditional_21_Template_select_change_40_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onStatusChange($event.target.value)); });
|
|
110
|
+
i0.ɵɵelementStart(41, "option", 42);
|
|
101
111
|
i0.ɵɵtext(42, "All Statuses");
|
|
102
112
|
i0.ɵɵelementEnd();
|
|
103
|
-
i0.ɵɵelementStart(43, "option",
|
|
113
|
+
i0.ɵɵelementStart(43, "option", 46);
|
|
104
114
|
i0.ɵɵtext(44, "Active");
|
|
105
115
|
i0.ɵɵelementEnd();
|
|
106
|
-
i0.ɵɵelementStart(45, "option",
|
|
116
|
+
i0.ɵɵelementStart(45, "option", 47);
|
|
107
117
|
i0.ɵɵtext(46, "Inactive");
|
|
108
118
|
i0.ɵɵelementEnd()()();
|
|
109
|
-
i0.ɵɵelementStart(47, "div",
|
|
110
|
-
i0.ɵɵlistener("click", function
|
|
111
|
-
i0.ɵɵelement(49, "span",
|
|
119
|
+
i0.ɵɵelementStart(47, "div", 48)(48, "button", 49);
|
|
120
|
+
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_21_Template_button_click_48_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.clearFilters()); });
|
|
121
|
+
i0.ɵɵelement(49, "span", 50);
|
|
112
122
|
i0.ɵɵtext(50, " Reset Filters ");
|
|
113
123
|
i0.ɵɵelementEnd()()()()();
|
|
114
124
|
} if (rf & 2) {
|
|
@@ -130,158 +140,179 @@ function PromptManagementV2Component_Conditional_2_Conditional_23_Template(rf, c
|
|
|
130
140
|
i0.ɵɵadvance(6);
|
|
131
141
|
i0.ɵɵproperty("value", ctx_r0.selectedStatus);
|
|
132
142
|
} }
|
|
133
|
-
function
|
|
134
|
-
const
|
|
135
|
-
i0.ɵɵelementStart(0, "button",
|
|
136
|
-
i0.ɵɵlistener("click", function
|
|
137
|
-
i0.ɵɵelement(1, "i",
|
|
143
|
+
function PromptManagementV2Component_Conditional_2_Conditional_24_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
144
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
145
|
+
i0.ɵɵelementStart(0, "button", 53);
|
|
146
|
+
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_24_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.createNewPrompt()); });
|
|
147
|
+
i0.ɵɵelement(1, "i", 27);
|
|
138
148
|
i0.ɵɵtext(2, " Create First Prompt ");
|
|
139
149
|
i0.ɵɵelementEnd();
|
|
140
150
|
} }
|
|
141
|
-
function
|
|
142
|
-
i0.ɵɵelementStart(0, "div",
|
|
143
|
-
i0.ɵɵelement(1, "i",
|
|
151
|
+
function PromptManagementV2Component_Conditional_2_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
152
|
+
i0.ɵɵelementStart(0, "div", 25);
|
|
153
|
+
i0.ɵɵelement(1, "i", 51);
|
|
144
154
|
i0.ɵɵelementStart(2, "h3");
|
|
145
155
|
i0.ɵɵtext(3, "No prompts found");
|
|
146
156
|
i0.ɵɵelementEnd();
|
|
147
157
|
i0.ɵɵelementStart(4, "p");
|
|
148
158
|
i0.ɵɵtext(5);
|
|
149
159
|
i0.ɵɵelementEnd();
|
|
150
|
-
i0.ɵɵtemplate(6,
|
|
160
|
+
i0.ɵɵtemplate(6, PromptManagementV2Component_Conditional_2_Conditional_24_Conditional_6_Template, 3, 0, "button", 52);
|
|
151
161
|
i0.ɵɵelementEnd();
|
|
152
162
|
} if (rf & 2) {
|
|
153
163
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
154
164
|
i0.ɵɵadvance(5);
|
|
155
165
|
i0.ɵɵtextInterpolate(ctx_r0.hasActiveFilters ? "Try adjusting your filters" : "Create your first AI prompt to get started");
|
|
156
166
|
i0.ɵɵadvance();
|
|
157
|
-
i0.ɵɵconditional(!ctx_r0.hasActiveFilters ? 6 : -1);
|
|
167
|
+
i0.ɵɵconditional(!ctx_r0.hasActiveFilters && ctx_r0.UserCanCreatePrompts ? 6 : -1);
|
|
158
168
|
} }
|
|
159
|
-
function
|
|
160
|
-
i0.ɵɵelementStart(0, "p",
|
|
169
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
170
|
+
i0.ɵɵelementStart(0, "p", 63);
|
|
161
171
|
i0.ɵɵtext(1);
|
|
162
172
|
i0.ɵɵelementEnd();
|
|
163
173
|
} if (rf & 2) {
|
|
164
|
-
const
|
|
174
|
+
const prompt_r9 = i0.ɵɵnextContext().$implicit;
|
|
165
175
|
i0.ɵɵadvance();
|
|
166
|
-
i0.ɵɵtextInterpolate(
|
|
176
|
+
i0.ɵɵtextInterpolate(prompt_r9.Description);
|
|
167
177
|
} }
|
|
168
|
-
function
|
|
169
|
-
i0.ɵɵelement(0, "i",
|
|
178
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
179
|
+
i0.ɵɵelement(0, "i", 73);
|
|
170
180
|
i0.ɵɵtext(1, " Yes ");
|
|
171
181
|
} }
|
|
172
|
-
function
|
|
173
|
-
i0.ɵɵelement(0, "i",
|
|
182
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
183
|
+
i0.ɵɵelement(0, "i", 74);
|
|
174
184
|
i0.ɵɵtext(1, " No ");
|
|
175
185
|
} }
|
|
176
|
-
function
|
|
177
|
-
const
|
|
178
|
-
i0.ɵɵelementStart(0, "
|
|
186
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
187
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
188
|
+
i0.ɵɵelementStart(0, "button", 75);
|
|
189
|
+
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Conditional_30_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r10); const prompt_r9 = i0.ɵɵnextContext(2).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.testPrompt(prompt_r9.ID, $event)); });
|
|
190
|
+
i0.ɵɵelement(1, "i", 76);
|
|
191
|
+
i0.ɵɵtext(2, " Run ");
|
|
192
|
+
i0.ɵɵelementEnd();
|
|
193
|
+
i0.ɵɵelementStart(3, "button", 77);
|
|
194
|
+
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Conditional_30_Template_button_click_3_listener($event) { i0.ɵɵrestoreView(_r10); const prompt_r9 = i0.ɵɵnextContext(2).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); ctx_r0.openPrompt(prompt_r9.ID); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
195
|
+
i0.ɵɵelement(4, "i", 78);
|
|
196
|
+
i0.ɵɵtext(5, " Open ");
|
|
197
|
+
i0.ɵɵelementEnd();
|
|
198
|
+
} if (rf & 2) {
|
|
199
|
+
const prompt_r9 = i0.ɵɵnextContext(2).$implicit;
|
|
200
|
+
i0.ɵɵproperty("disabled", prompt_r9.Status !== "Active");
|
|
201
|
+
} }
|
|
202
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
203
|
+
i0.ɵɵelementStart(0, "div", 65)(1, "div", 66)(2, "div", 67)(3, "span", 68);
|
|
179
204
|
i0.ɵɵtext(4, "Category");
|
|
180
205
|
i0.ɵɵelementEnd();
|
|
181
|
-
i0.ɵɵelementStart(5, "span",
|
|
206
|
+
i0.ɵɵelementStart(5, "span", 69);
|
|
182
207
|
i0.ɵɵtext(6);
|
|
183
208
|
i0.ɵɵelementEnd()();
|
|
184
|
-
i0.ɵɵelementStart(7, "div",
|
|
209
|
+
i0.ɵɵelementStart(7, "div", 67)(8, "span", 68);
|
|
185
210
|
i0.ɵɵtext(9, "Type");
|
|
186
211
|
i0.ɵɵelementEnd();
|
|
187
|
-
i0.ɵɵelementStart(10, "span",
|
|
212
|
+
i0.ɵɵelementStart(10, "span", 69);
|
|
188
213
|
i0.ɵɵtext(11);
|
|
189
214
|
i0.ɵɵelementEnd()();
|
|
190
|
-
i0.ɵɵelementStart(12, "div",
|
|
215
|
+
i0.ɵɵelementStart(12, "div", 67)(13, "span", 68);
|
|
191
216
|
i0.ɵɵtext(14, "Status");
|
|
192
217
|
i0.ɵɵelementEnd();
|
|
193
|
-
i0.ɵɵelementStart(15, "span",
|
|
218
|
+
i0.ɵɵelementStart(15, "span", 70);
|
|
194
219
|
i0.ɵɵtext(16);
|
|
195
220
|
i0.ɵɵelementEnd()()();
|
|
196
|
-
i0.ɵɵelementStart(17, "div",
|
|
221
|
+
i0.ɵɵelementStart(17, "div", 71)(18, "div", 67)(19, "span", 68);
|
|
197
222
|
i0.ɵɵtext(20, "Template");
|
|
198
223
|
i0.ɵɵelementEnd();
|
|
199
|
-
i0.ɵɵelementStart(21, "span",
|
|
200
|
-
i0.ɵɵtemplate(22,
|
|
224
|
+
i0.ɵɵelementStart(21, "span", 69);
|
|
225
|
+
i0.ɵɵtemplate(22, PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Conditional_22_Template, 2, 0)(23, PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Conditional_23_Template, 2, 0);
|
|
201
226
|
i0.ɵɵelementEnd()();
|
|
202
|
-
i0.ɵɵelementStart(24, "div",
|
|
227
|
+
i0.ɵɵelementStart(24, "div", 67)(25, "span", 68);
|
|
203
228
|
i0.ɵɵtext(26, "Contents");
|
|
204
229
|
i0.ɵɵelementEnd();
|
|
205
|
-
i0.ɵɵelementStart(27, "span",
|
|
230
|
+
i0.ɵɵelementStart(27, "span", 69);
|
|
206
231
|
i0.ɵɵtext(28);
|
|
207
232
|
i0.ɵɵelementEnd()()();
|
|
208
|
-
i0.ɵɵelementStart(29, "div",
|
|
209
|
-
i0.ɵɵ
|
|
210
|
-
i0.ɵɵ
|
|
211
|
-
i0.ɵɵtext(32, " Run ");
|
|
212
|
-
i0.ɵɵelementEnd();
|
|
213
|
-
i0.ɵɵelementStart(33, "button", 74);
|
|
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()); });
|
|
215
|
-
i0.ɵɵelement(34, "i", 75);
|
|
216
|
-
i0.ɵɵtext(35, " Open ");
|
|
217
|
-
i0.ɵɵelementEnd()()();
|
|
233
|
+
i0.ɵɵelementStart(29, "div", 72);
|
|
234
|
+
i0.ɵɵtemplate(30, PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Conditional_30_Template, 6, 1);
|
|
235
|
+
i0.ɵɵelementEnd()();
|
|
218
236
|
} if (rf & 2) {
|
|
219
|
-
const
|
|
237
|
+
const prompt_r9 = i0.ɵɵnextContext().$implicit;
|
|
220
238
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
221
239
|
i0.ɵɵadvance(6);
|
|
222
|
-
i0.ɵɵtextInterpolate(
|
|
240
|
+
i0.ɵɵtextInterpolate(prompt_r9.CategoryName);
|
|
223
241
|
i0.ɵɵadvance(5);
|
|
224
|
-
i0.ɵɵtextInterpolate(
|
|
242
|
+
i0.ɵɵtextInterpolate(prompt_r9.TypeName);
|
|
225
243
|
i0.ɵɵadvance(4);
|
|
226
|
-
i0.ɵɵclassMap(ctx_r0.getStatusClass(
|
|
244
|
+
i0.ɵɵclassMap(ctx_r0.getStatusClass(prompt_r9.Status));
|
|
227
245
|
i0.ɵɵadvance();
|
|
228
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
246
|
+
i0.ɵɵtextInterpolate1(" ", prompt_r9.Status, " ");
|
|
229
247
|
i0.ɵɵadvance(6);
|
|
230
|
-
i0.ɵɵconditional(
|
|
248
|
+
i0.ɵɵconditional(prompt_r9.TemplateEntity ? 22 : 23);
|
|
231
249
|
i0.ɵɵadvance(6);
|
|
232
|
-
i0.ɵɵtextInterpolate((
|
|
250
|
+
i0.ɵɵtextInterpolate((prompt_r9.TemplateContents == null ? null : prompt_r9.TemplateContents.length) || 0);
|
|
233
251
|
i0.ɵɵadvance(2);
|
|
234
|
-
i0.ɵɵ
|
|
252
|
+
i0.ɵɵconditional(ctx_r0.UserCanReadPrompts ? 30 : -1);
|
|
235
253
|
} }
|
|
236
|
-
function
|
|
237
|
-
const
|
|
238
|
-
i0.ɵɵelementStart(0, "div",
|
|
239
|
-
i0.ɵɵlistener("click", function
|
|
240
|
-
i0.ɵɵelementStart(2, "div",
|
|
254
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
255
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
256
|
+
i0.ɵɵelementStart(0, "div", 58)(1, "div", 59);
|
|
257
|
+
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Template_div_click_1_listener() { const prompt_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.togglePromptExpansion(prompt_r9.ID)); });
|
|
258
|
+
i0.ɵɵelementStart(2, "div", 60);
|
|
241
259
|
i0.ɵɵelement(3, "i");
|
|
242
260
|
i0.ɵɵelementEnd();
|
|
243
|
-
i0.ɵɵelementStart(4, "div",
|
|
261
|
+
i0.ɵɵelementStart(4, "div", 61)(5, "h4", 62);
|
|
244
262
|
i0.ɵɵtext(6);
|
|
245
263
|
i0.ɵɵelementEnd();
|
|
246
|
-
i0.ɵɵtemplate(7,
|
|
264
|
+
i0.ɵɵtemplate(7, PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_7_Template, 2, 1, "p", 63);
|
|
247
265
|
i0.ɵɵelementEnd();
|
|
248
|
-
i0.ɵɵelement(8, "i",
|
|
266
|
+
i0.ɵɵelement(8, "i", 64);
|
|
249
267
|
i0.ɵɵelementEnd();
|
|
250
|
-
i0.ɵɵtemplate(9,
|
|
268
|
+
i0.ɵɵtemplate(9, PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Template, 31, 8, "div", 65);
|
|
251
269
|
i0.ɵɵelementEnd();
|
|
252
270
|
} if (rf & 2) {
|
|
253
|
-
const
|
|
271
|
+
const prompt_r9 = ctx.$implicit;
|
|
254
272
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
255
|
-
i0.ɵɵclassProp("expanded", ctx_r0.expandedPromptId ===
|
|
273
|
+
i0.ɵɵclassProp("expanded", ctx_r0.expandedPromptId === prompt_r9.ID);
|
|
256
274
|
i0.ɵɵadvance(3);
|
|
257
|
-
i0.ɵɵclassMap(ctx_r0.getPromptIcon(
|
|
275
|
+
i0.ɵɵclassMap(ctx_r0.getPromptIcon(prompt_r9));
|
|
258
276
|
i0.ɵɵadvance(3);
|
|
259
|
-
i0.ɵɵtextInterpolate(
|
|
277
|
+
i0.ɵɵtextInterpolate(prompt_r9.Name || "Unnamed Prompt");
|
|
260
278
|
i0.ɵɵadvance();
|
|
261
|
-
i0.ɵɵconditional(
|
|
279
|
+
i0.ɵɵconditional(prompt_r9.Description ? 7 : -1);
|
|
262
280
|
i0.ɵɵadvance();
|
|
263
|
-
i0.ɵɵclassProp("rotated", ctx_r0.expandedPromptId ===
|
|
281
|
+
i0.ɵɵclassProp("rotated", ctx_r0.expandedPromptId === prompt_r9.ID);
|
|
264
282
|
i0.ɵɵadvance();
|
|
265
|
-
i0.ɵɵconditional(ctx_r0.expandedPromptId ===
|
|
283
|
+
i0.ɵɵconditional(ctx_r0.expandedPromptId === prompt_r9.ID ? 9 : -1);
|
|
266
284
|
} }
|
|
267
|
-
function
|
|
268
|
-
i0.ɵɵelementStart(0, "div",
|
|
269
|
-
i0.ɵɵrepeaterCreate(1,
|
|
285
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_Template(rf, ctx) { if (rf & 1) {
|
|
286
|
+
i0.ɵɵelementStart(0, "div", 54);
|
|
287
|
+
i0.ɵɵrepeaterCreate(1, PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Template, 10, 9, "div", 57, _forTrack0);
|
|
270
288
|
i0.ɵɵelementEnd();
|
|
271
289
|
} if (rf & 2) {
|
|
272
290
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
273
291
|
i0.ɵɵadvance();
|
|
274
292
|
i0.ɵɵrepeater(ctx_r0.filteredPrompts);
|
|
275
293
|
} }
|
|
276
|
-
function
|
|
277
|
-
i0.ɵɵelement(0, "i",
|
|
294
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_1_For_18_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
295
|
+
i0.ɵɵelement(0, "i", 73);
|
|
278
296
|
} }
|
|
279
|
-
function
|
|
280
|
-
i0.ɵɵelement(0, "i",
|
|
297
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_1_For_18_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
298
|
+
i0.ɵɵelement(0, "i", 74);
|
|
281
299
|
} }
|
|
282
|
-
function
|
|
283
|
-
const
|
|
284
|
-
i0.ɵɵelementStart(0, "
|
|
300
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_1_For_18_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
301
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
302
|
+
i0.ɵɵelementStart(0, "button", 82);
|
|
303
|
+
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_25_Case_1_For_18_Conditional_16_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r11); const prompt_r12 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.testPrompt(prompt_r12.ID, $event)); });
|
|
304
|
+
i0.ɵɵelement(1, "i", 76);
|
|
305
|
+
i0.ɵɵelementEnd();
|
|
306
|
+
i0.ɵɵelementStart(2, "button", 83);
|
|
307
|
+
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_2_Conditional_25_Case_1_For_18_Conditional_16_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r11); const prompt_r12 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.openPrompt(prompt_r12.ID)); });
|
|
308
|
+
i0.ɵɵelement(3, "i", 78);
|
|
309
|
+
i0.ɵɵelementEnd();
|
|
310
|
+
} if (rf & 2) {
|
|
311
|
+
const prompt_r12 = i0.ɵɵnextContext().$implicit;
|
|
312
|
+
i0.ɵɵproperty("disabled", prompt_r12.Status !== "Active");
|
|
313
|
+
} }
|
|
314
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_1_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
315
|
+
i0.ɵɵelementStart(0, "tr")(1, "td")(2, "div", 80);
|
|
285
316
|
i0.ɵɵelement(3, "i");
|
|
286
317
|
i0.ɵɵtext(4);
|
|
287
318
|
i0.ɵɵelementEnd()();
|
|
@@ -291,42 +322,37 @@ function PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_For_18_
|
|
|
291
322
|
i0.ɵɵelementStart(7, "td");
|
|
292
323
|
i0.ɵɵtext(8);
|
|
293
324
|
i0.ɵɵelementEnd();
|
|
294
|
-
i0.ɵɵelementStart(9, "td")(10, "span",
|
|
325
|
+
i0.ɵɵelementStart(9, "td")(10, "span", 81);
|
|
295
326
|
i0.ɵɵtext(11);
|
|
296
327
|
i0.ɵɵelementEnd()();
|
|
297
328
|
i0.ɵɵelementStart(12, "td");
|
|
298
|
-
i0.ɵɵtemplate(13,
|
|
299
|
-
i0.ɵɵelementEnd();
|
|
300
|
-
i0.ɵɵelementStart(15, "td")(16, "button", 81);
|
|
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)); });
|
|
302
|
-
i0.ɵɵelement(17, "i", 73);
|
|
329
|
+
i0.ɵɵtemplate(13, PromptManagementV2Component_Conditional_2_Conditional_25_Case_1_For_18_Conditional_13_Template, 1, 0, "i", 73)(14, PromptManagementV2Component_Conditional_2_Conditional_25_Case_1_For_18_Conditional_14_Template, 1, 0, "i", 74);
|
|
303
330
|
i0.ɵɵelementEnd();
|
|
304
|
-
i0.ɵɵelementStart(
|
|
305
|
-
i0.ɵɵ
|
|
306
|
-
i0.ɵɵ
|
|
307
|
-
i0.ɵɵelementEnd()()();
|
|
331
|
+
i0.ɵɵelementStart(15, "td");
|
|
332
|
+
i0.ɵɵtemplate(16, PromptManagementV2Component_Conditional_2_Conditional_25_Case_1_For_18_Conditional_16_Template, 4, 1);
|
|
333
|
+
i0.ɵɵelementEnd()();
|
|
308
334
|
} if (rf & 2) {
|
|
309
|
-
const
|
|
335
|
+
const prompt_r12 = ctx.$implicit;
|
|
310
336
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
311
337
|
i0.ɵɵadvance(3);
|
|
312
|
-
i0.ɵɵclassMap(ctx_r0.getPromptIcon(
|
|
338
|
+
i0.ɵɵclassMap(ctx_r0.getPromptIcon(prompt_r12));
|
|
313
339
|
i0.ɵɵadvance();
|
|
314
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
340
|
+
i0.ɵɵtextInterpolate1(" ", prompt_r12.Name, " ");
|
|
315
341
|
i0.ɵɵadvance(2);
|
|
316
|
-
i0.ɵɵtextInterpolate(
|
|
342
|
+
i0.ɵɵtextInterpolate(prompt_r12.CategoryName);
|
|
317
343
|
i0.ɵɵadvance(2);
|
|
318
|
-
i0.ɵɵtextInterpolate(
|
|
344
|
+
i0.ɵɵtextInterpolate(prompt_r12.TypeName);
|
|
319
345
|
i0.ɵɵadvance(2);
|
|
320
|
-
i0.ɵɵclassMap(ctx_r0.getStatusClass(
|
|
346
|
+
i0.ɵɵclassMap(ctx_r0.getStatusClass(prompt_r12.Status));
|
|
321
347
|
i0.ɵɵadvance();
|
|
322
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
348
|
+
i0.ɵɵtextInterpolate1(" ", prompt_r12.Status, " ");
|
|
323
349
|
i0.ɵɵadvance(2);
|
|
324
|
-
i0.ɵɵconditional(
|
|
350
|
+
i0.ɵɵconditional(prompt_r12.TemplateEntity ? 13 : 14);
|
|
325
351
|
i0.ɵɵadvance(3);
|
|
326
|
-
i0.ɵɵ
|
|
352
|
+
i0.ɵɵconditional(ctx_r0.UserCanReadPrompts ? 16 : -1);
|
|
327
353
|
} }
|
|
328
|
-
function
|
|
329
|
-
i0.ɵɵelementStart(0, "div",
|
|
354
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_1_Template(rf, ctx) { if (rf & 1) {
|
|
355
|
+
i0.ɵɵelementStart(0, "div", 55)(1, "table", 79)(2, "thead")(3, "tr")(4, "th");
|
|
330
356
|
i0.ɵɵtext(5, "Name");
|
|
331
357
|
i0.ɵɵelementEnd();
|
|
332
358
|
i0.ɵɵelementStart(6, "th");
|
|
@@ -345,25 +371,33 @@ function PromptManagementV2Component_Conditional_2_Conditional_27_Case_1_Templat
|
|
|
345
371
|
i0.ɵɵtext(15, "Actions");
|
|
346
372
|
i0.ɵɵelementEnd()()();
|
|
347
373
|
i0.ɵɵelementStart(16, "tbody");
|
|
348
|
-
i0.ɵɵrepeaterCreate(17,
|
|
374
|
+
i0.ɵɵrepeaterCreate(17, PromptManagementV2Component_Conditional_2_Conditional_25_Case_1_For_18_Template, 17, 10, "tr", null, _forTrack0);
|
|
349
375
|
i0.ɵɵelementEnd()()();
|
|
350
376
|
} if (rf & 2) {
|
|
351
377
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
352
378
|
i0.ɵɵadvance(17);
|
|
353
379
|
i0.ɵɵrepeater(ctx_r0.filteredPrompts);
|
|
354
380
|
} }
|
|
355
|
-
function
|
|
356
|
-
const
|
|
357
|
-
i0.ɵɵelementStart(0, "
|
|
358
|
-
i0.ɵɵlistener("promptSelected", function
|
|
359
|
-
i0.ɵɵelementEnd()
|
|
381
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
382
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
383
|
+
i0.ɵɵelementStart(0, "app-model-prompt-priority-matrix", 85);
|
|
384
|
+
i0.ɵɵlistener("promptSelected", function PromptManagementV2Component_Conditional_2_Conditional_25_Case_2_Conditional_1_Template_app_model_prompt_priority_matrix_promptSelected_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.openPrompt($event.ID)); });
|
|
385
|
+
i0.ɵɵelementEnd();
|
|
386
|
+
} if (rf & 2) {
|
|
387
|
+
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
388
|
+
i0.ɵɵproperty("selectedPrompts", ctx_r0.filteredPromptsAsEntities);
|
|
389
|
+
} }
|
|
390
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Case_2_Template(rf, ctx) { if (rf & 1) {
|
|
391
|
+
i0.ɵɵelementStart(0, "div", 56);
|
|
392
|
+
i0.ɵɵtemplate(1, PromptManagementV2Component_Conditional_2_Conditional_25_Case_2_Conditional_1_Template, 1, 1, "app-model-prompt-priority-matrix", 84);
|
|
393
|
+
i0.ɵɵelementEnd();
|
|
360
394
|
} if (rf & 2) {
|
|
361
395
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
362
396
|
i0.ɵɵadvance();
|
|
363
|
-
i0.ɵɵ
|
|
397
|
+
i0.ɵɵconditional(ctx_r0.UserCanReadPrompts ? 1 : -1);
|
|
364
398
|
} }
|
|
365
|
-
function
|
|
366
|
-
i0.ɵɵtemplate(0,
|
|
399
|
+
function PromptManagementV2Component_Conditional_2_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
400
|
+
i0.ɵɵtemplate(0, PromptManagementV2Component_Conditional_2_Conditional_25_Case_0_Template, 3, 0, "div", 54)(1, PromptManagementV2Component_Conditional_2_Conditional_25_Case_1_Template, 19, 0, "div", 55)(2, PromptManagementV2Component_Conditional_2_Conditional_25_Case_2_Template, 2, 1, "div", 56);
|
|
367
401
|
} if (rf & 2) {
|
|
368
402
|
let tmp_2_0;
|
|
369
403
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
@@ -395,15 +429,12 @@ function PromptManagementV2Component_Conditional_2_Template(rf, ctx) { if (rf &
|
|
|
395
429
|
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")); });
|
|
396
430
|
i0.ɵɵelement(18, "i", 20);
|
|
397
431
|
i0.ɵɵelementEnd()();
|
|
398
|
-
i0.ɵɵ
|
|
399
|
-
i0.ɵɵ
|
|
400
|
-
i0.ɵɵ
|
|
401
|
-
i0.ɵɵ
|
|
402
|
-
i0.ɵɵ
|
|
403
|
-
i0.ɵɵ
|
|
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);
|
|
432
|
+
i0.ɵɵtemplate(19, PromptManagementV2Component_Conditional_2_Conditional_19_Template, 3, 0, "button", 21);
|
|
433
|
+
i0.ɵɵelementEnd()();
|
|
434
|
+
i0.ɵɵelementStart(20, "kendo-splitter", 22);
|
|
435
|
+
i0.ɵɵtemplate(21, PromptManagementV2Component_Conditional_2_Conditional_21_Template, 51, 6, "kendo-splitter-pane", 23);
|
|
436
|
+
i0.ɵɵelementStart(22, "kendo-splitter-pane")(23, "div", 24);
|
|
437
|
+
i0.ɵɵtemplate(24, PromptManagementV2Component_Conditional_2_Conditional_24_Template, 7, 2, "div", 25)(25, PromptManagementV2Component_Conditional_2_Conditional_25_Template, 3, 1);
|
|
407
438
|
i0.ɵɵelementEnd()()();
|
|
408
439
|
} if (rf & 2) {
|
|
409
440
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
@@ -417,14 +448,17 @@ function PromptManagementV2Component_Conditional_2_Template(rf, ctx) { if (rf &
|
|
|
417
448
|
i0.ɵɵclassProp("active", ctx_r0.viewMode === "list");
|
|
418
449
|
i0.ɵɵadvance(2);
|
|
419
450
|
i0.ɵɵclassProp("active", ctx_r0.viewMode === "priority-matrix");
|
|
420
|
-
i0.ɵɵadvance(
|
|
421
|
-
i0.ɵɵconditional(ctx_r0.
|
|
451
|
+
i0.ɵɵadvance(2);
|
|
452
|
+
i0.ɵɵconditional(ctx_r0.UserCanCreatePrompts ? 19 : -1);
|
|
453
|
+
i0.ɵɵadvance(2);
|
|
454
|
+
i0.ɵɵconditional(ctx_r0.showFilters ? 21 : -1);
|
|
422
455
|
i0.ɵɵadvance(3);
|
|
423
|
-
i0.ɵɵconditional(ctx_r0.filteredPrompts.length === 0 ?
|
|
456
|
+
i0.ɵɵconditional(ctx_r0.filteredPrompts.length === 0 ? 24 : 25);
|
|
424
457
|
} }
|
|
425
458
|
export class PromptManagementV2Component {
|
|
426
459
|
sharedService;
|
|
427
460
|
testHarnessService;
|
|
461
|
+
router;
|
|
428
462
|
openEntityRecord = new EventEmitter();
|
|
429
463
|
stateChange = new EventEmitter();
|
|
430
464
|
initialState = null;
|
|
@@ -456,9 +490,79 @@ export class PromptManagementV2Component {
|
|
|
456
490
|
loadingMessageInterval;
|
|
457
491
|
destroy$ = new Subject();
|
|
458
492
|
selectedPromptForTest = null;
|
|
459
|
-
|
|
493
|
+
// === Permission Checks ===
|
|
494
|
+
/** Cache for permission checks to avoid repeated calculations */
|
|
495
|
+
_permissionCache = new Map();
|
|
496
|
+
_metadata = new Metadata();
|
|
497
|
+
/** Check if user can create AI Prompts */
|
|
498
|
+
get UserCanCreatePrompts() {
|
|
499
|
+
return this.checkEntityPermission('AI Prompts', 'Create');
|
|
500
|
+
}
|
|
501
|
+
/** Check if user can read AI Prompts */
|
|
502
|
+
get UserCanReadPrompts() {
|
|
503
|
+
return this.checkEntityPermission('AI Prompts', 'Read');
|
|
504
|
+
}
|
|
505
|
+
/** Check if user can update AI Prompts */
|
|
506
|
+
get UserCanUpdatePrompts() {
|
|
507
|
+
return this.checkEntityPermission('AI Prompts', 'Update');
|
|
508
|
+
}
|
|
509
|
+
/** Check if user can delete AI Prompts */
|
|
510
|
+
get UserCanDeletePrompts() {
|
|
511
|
+
return this.checkEntityPermission('AI Prompts', 'Delete');
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Helper method to check entity permissions with caching
|
|
515
|
+
* @param entityName - The name of the entity to check permissions for
|
|
516
|
+
* @param permissionType - The type of permission to check (Create, Read, Update, Delete)
|
|
517
|
+
* @returns boolean indicating if user has the permission
|
|
518
|
+
*/
|
|
519
|
+
checkEntityPermission(entityName, permissionType) {
|
|
520
|
+
const cacheKey = `${entityName}_${permissionType}`;
|
|
521
|
+
if (this._permissionCache.has(cacheKey)) {
|
|
522
|
+
return this._permissionCache.get(cacheKey);
|
|
523
|
+
}
|
|
524
|
+
try {
|
|
525
|
+
const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);
|
|
526
|
+
if (!entityInfo) {
|
|
527
|
+
console.warn(`Entity '${entityName}' not found for permission check`);
|
|
528
|
+
this._permissionCache.set(cacheKey, false);
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
531
|
+
const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);
|
|
532
|
+
let hasPermission = false;
|
|
533
|
+
switch (permissionType) {
|
|
534
|
+
case 'Create':
|
|
535
|
+
hasPermission = userPermissions.CanCreate;
|
|
536
|
+
break;
|
|
537
|
+
case 'Read':
|
|
538
|
+
hasPermission = userPermissions.CanRead;
|
|
539
|
+
break;
|
|
540
|
+
case 'Update':
|
|
541
|
+
hasPermission = userPermissions.CanUpdate;
|
|
542
|
+
break;
|
|
543
|
+
case 'Delete':
|
|
544
|
+
hasPermission = userPermissions.CanDelete;
|
|
545
|
+
break;
|
|
546
|
+
}
|
|
547
|
+
this._permissionCache.set(cacheKey, hasPermission);
|
|
548
|
+
return hasPermission;
|
|
549
|
+
}
|
|
550
|
+
catch (error) {
|
|
551
|
+
console.error(`Error checking ${permissionType} permission for ${entityName}:`, error);
|
|
552
|
+
this._permissionCache.set(cacheKey, false);
|
|
553
|
+
return false;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Clears the permission cache. Call this when user context changes or permissions are updated.
|
|
558
|
+
*/
|
|
559
|
+
clearPermissionCache() {
|
|
560
|
+
this._permissionCache.clear();
|
|
561
|
+
}
|
|
562
|
+
constructor(sharedService, testHarnessService, router) {
|
|
460
563
|
this.sharedService = sharedService;
|
|
461
564
|
this.testHarnessService = testHarnessService;
|
|
565
|
+
this.router = router;
|
|
462
566
|
}
|
|
463
567
|
ngOnInit() {
|
|
464
568
|
this.setupSearchListener();
|
|
@@ -544,7 +648,7 @@ export class PromptManagementV2Component {
|
|
|
544
648
|
}
|
|
545
649
|
catch (error) {
|
|
546
650
|
console.error('Error loading prompt data:', error);
|
|
547
|
-
|
|
651
|
+
MJNotificationService.Instance.CreateSimpleNotification('Error loading prompts', 'error', 3000);
|
|
548
652
|
}
|
|
549
653
|
finally {
|
|
550
654
|
this.isLoading = false;
|
|
@@ -647,26 +751,21 @@ export class PromptManagementV2Component {
|
|
|
647
751
|
// No longer needed - window manages its own closure
|
|
648
752
|
this.selectedPromptForTest = null;
|
|
649
753
|
}
|
|
650
|
-
|
|
754
|
+
createNewPrompt() {
|
|
651
755
|
try {
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
entityName: 'AI Prompts',
|
|
660
|
-
recordId: newPrompt.ID
|
|
661
|
-
});
|
|
662
|
-
// Reload the data
|
|
663
|
-
await this.loadInitialData();
|
|
756
|
+
// Navigate to new record form using the MemberJunction pattern
|
|
757
|
+
// Empty third parameter means new record
|
|
758
|
+
this.router.navigate(['resource', 'record', ''], // Empty record ID = new record
|
|
759
|
+
{
|
|
760
|
+
queryParams: {
|
|
761
|
+
Entity: 'AI Prompts'
|
|
762
|
+
// Could add NewRecordValues here for pre-populated defaults if needed
|
|
664
763
|
}
|
|
665
|
-
}
|
|
764
|
+
});
|
|
666
765
|
}
|
|
667
766
|
catch (error) {
|
|
668
|
-
console.error('Error
|
|
669
|
-
|
|
767
|
+
console.error('Error navigating to new prompt form:', error);
|
|
768
|
+
MJNotificationService.Instance.CreateSimpleNotification('Error opening new prompt form', 'error', 3000);
|
|
670
769
|
}
|
|
671
770
|
}
|
|
672
771
|
getPromptIcon(prompt) {
|
|
@@ -713,25 +812,25 @@ export class PromptManagementV2Component {
|
|
|
713
812
|
this.searchSubject.next('');
|
|
714
813
|
this.applyFilters();
|
|
715
814
|
}
|
|
716
|
-
static ɵfac = function PromptManagementV2Component_Factory(t) { return new (t || PromptManagementV2Component)(i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i2.AITestHarnessDialogService)); };
|
|
717
|
-
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",
|
|
815
|
+
static ɵfac = function PromptManagementV2Component_Factory(t) { return new (t || PromptManagementV2Component)(i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i2.AITestHarnessDialogService), i0.ɵɵdirectiveInject(i3.Router)); };
|
|
816
|
+
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"], ["orientation", "horizontal"], ["size", "320", "min", "250", "max", "400"], [1, "content-area"], [1, "empty-state"], ["type", "button", "title", "Create New Prompt", 1, "control-btn", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], [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"], [1, "fa-solid", "fa-check-circle", "text-success"], [1, "fa-solid", "fa-times-circle", "text-muted"], ["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, "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, "selectedPrompts"], [3, "promptSelected", "selectedPrompts"]], template: function PromptManagementV2Component_Template(rf, ctx) { if (rf & 1) {
|
|
718
817
|
i0.ɵɵelementStart(0, "div", 0);
|
|
719
|
-
i0.ɵɵtemplate(1, PromptManagementV2Component_Conditional_1_Template, 8, 1, "div", 1)(2, PromptManagementV2Component_Conditional_2_Template,
|
|
818
|
+
i0.ɵɵtemplate(1, PromptManagementV2Component_Conditional_1_Template, 8, 1, "div", 1)(2, PromptManagementV2Component_Conditional_2_Template, 26, 11);
|
|
720
819
|
i0.ɵɵelementEnd();
|
|
721
820
|
} if (rf & 2) {
|
|
722
821
|
i0.ɵɵadvance();
|
|
723
822
|
i0.ɵɵconditional(ctx.isLoading ? 1 : 2);
|
|
724
|
-
} }, 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}"] });
|
|
823
|
+
} }, dependencies: [i4.NgSelectOption, i4.ɵNgSelectMultipleOption, i5.SplitterComponent, i5.SplitterPaneComponent, 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}"] });
|
|
725
824
|
}
|
|
726
825
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PromptManagementV2Component, [{
|
|
727
826
|
type: Component,
|
|
728
|
-
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}"] }]
|
|
729
|
-
}], () => [{ type: i1.SharedService }, { type: i2.AITestHarnessDialogService }], { openEntityRecord: [{
|
|
827
|
+
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 @if (UserCanCreatePrompts) {\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 }\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 && UserCanCreatePrompts) {\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 @if (UserCanReadPrompts) {\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 }\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 @if (UserCanReadPrompts) {\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 }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n \n @case ('priority-matrix') {\n <div class=\"priority-matrix-container\">\n @if (UserCanReadPrompts) {\n <app-model-prompt-priority-matrix \n [selectedPrompts]=\"filteredPromptsAsEntities\"\n (promptSelected)=\"openPrompt($event.ID)\">\n </app-model-prompt-priority-matrix>\n }\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}"] }]
|
|
828
|
+
}], () => [{ type: i1.SharedService }, { type: i2.AITestHarnessDialogService }, { type: i3.Router }], { openEntityRecord: [{
|
|
730
829
|
type: Output
|
|
731
830
|
}], stateChange: [{
|
|
732
831
|
type: Output
|
|
733
832
|
}], initialState: [{
|
|
734
833
|
type: Input
|
|
735
834
|
}] }); })();
|
|
736
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PromptManagementV2Component, { className: "PromptManagementV2Component", filePath: "src/AI/components/prompts/prompt-management-v2.component.ts", lineNumber:
|
|
835
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PromptManagementV2Component, { className: "PromptManagementV2Component", filePath: "src/AI/components/prompts/prompt-management-v2.component.ts", lineNumber: 24 }); })();
|
|
737
836
|
//# sourceMappingURL=prompt-management-v2.component.js.map
|