@memberjunction/ng-dashboards 2.128.0 → 2.129.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 +34 -1
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +419 -109
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +3 -3
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +3 -3
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/{model-management-v2.component.d.ts → model-management.component.d.ts} +21 -5
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -0
- package/dist/AI/components/models/model-management.component.js +1283 -0
- package/dist/AI/components/models/model-management.component.js.map +1 -0
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
- package/dist/AI/components/prompts/{prompt-management-v2.component.d.ts → prompt-management.component.d.ts} +30 -5
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -0
- package/dist/AI/components/prompts/prompt-management.component.js +1079 -0
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -0
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts +2 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
- package/dist/AI/components/system/system-configuration.component.d.ts +55 -11
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +790 -131
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -1
- package/dist/AI/components/widgets/kpi-card.component.js +3 -3
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
- package/dist/AI/index.d.ts +2 -2
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +2 -2
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -6
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/Communication/communication-dashboard.component.d.ts +2 -0
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +5 -2
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +3 -2
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +7 -3
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/Credentials/components/credential-category-edit-panel.component.d.ts +44 -0
- package/dist/Credentials/components/credential-category-edit-panel.component.d.ts.map +1 -0
- package/dist/Credentials/components/credential-category-edit-panel.component.js +456 -0
- package/dist/Credentials/components/credential-category-edit-panel.component.js.map +1 -0
- package/dist/Credentials/components/credential-edit-panel.component.d.ts +70 -0
- package/dist/Credentials/components/credential-edit-panel.component.d.ts.map +1 -0
- package/dist/Credentials/components/credential-edit-panel.component.js +694 -0
- package/dist/Credentials/components/credential-edit-panel.component.js.map +1 -0
- package/dist/Credentials/components/credential-type-edit-panel.component.d.ts +56 -0
- package/dist/Credentials/components/credential-type-edit-panel.component.d.ts.map +1 -0
- package/dist/Credentials/components/credential-type-edit-panel.component.js +563 -0
- package/dist/Credentials/components/credential-type-edit-panel.component.js.map +1 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +81 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js +864 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +61 -0
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -0
- package/dist/Credentials/components/credentials-categories-resource.component.js +816 -0
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +83 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -0
- package/dist/Credentials/components/credentials-list-resource.component.js +1253 -0
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts +99 -0
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -0
- package/dist/Credentials/components/credentials-overview-resource.component.js +936 -0
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +70 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -0
- package/dist/Credentials/components/credentials-types-resource.component.js +868 -0
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -0
- package/dist/Credentials/credentials-dashboard.component.d.ts +37 -0
- package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -0
- package/dist/Credentials/credentials-dashboard.component.js +290 -0
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -0
- package/dist/Credentials/index.d.ts +7 -0
- package/dist/Credentials/index.d.ts.map +1 -0
- package/dist/Credentials/index.js +9 -0
- package/dist/Credentials/index.js.map +1 -0
- package/dist/Credentials/pipes/group-by.pipe.d.ts +13 -0
- package/dist/Credentials/pipes/group-by.pipe.d.ts.map +1 -0
- package/dist/Credentials/pipes/group-by.pipe.js +29 -0
- package/dist/Credentials/pipes/group-by.pipe.js.map +1 -0
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +2 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +5 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts +5 -5
- package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +125 -151
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +15 -19
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +70 -26
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +6 -5
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +174 -166
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +2 -0
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +5 -2
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +4 -2
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/SystemDiagnostics/index.d.ts +2 -0
- package/dist/SystemDiagnostics/index.d.ts.map +1 -0
- package/dist/SystemDiagnostics/index.js +3 -0
- package/dist/SystemDiagnostics/index.js.map +1 -0
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +497 -0
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -0
- package/dist/SystemDiagnostics/system-diagnostics.component.js +6063 -0
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -0
- package/dist/Testing/testing-dashboard.component.d.ts +2 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +5 -2
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/module.d.ts +103 -95
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +90 -29
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +3 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +21 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +28 -25
- package/dist/AI/components/models/model-management-v2.component.d.ts.map +0 -1
- package/dist/AI/components/models/model-management-v2.component.js +0 -981
- package/dist/AI/components/models/model-management-v2.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-management-v2.component.js +0 -811
- package/dist/AI/components/prompts/prompt-management-v2.component.js.map +0 -1
- package/dist/EntityAdmin/components/entity-details.component.d.ts +0 -50
- package/dist/EntityAdmin/components/entity-details.component.d.ts.map +0 -1
- package/dist/EntityAdmin/components/entity-details.component.js +0 -680
- package/dist/EntityAdmin/components/entity-details.component.js.map +0 -1
- package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts +0 -31
- package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts.map +0 -1
- package/dist/EntityAdmin/components/entity-filter-panel.component.js +0 -160
- package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +0 -1
- package/dist/EntityAdmin/components/erd-composite.component.d.ts +0 -73
- package/dist/EntityAdmin/components/erd-composite.component.d.ts.map +0 -1
- package/dist/EntityAdmin/components/erd-composite.component.js +0 -271
- package/dist/EntityAdmin/components/erd-composite.component.js.map +0 -1
- package/dist/EntityAdmin/components/erd-diagram.component.d.ts +0 -47
- package/dist/EntityAdmin/components/erd-diagram.component.d.ts.map +0 -1
- package/dist/EntityAdmin/components/erd-diagram.component.js +0 -618
- package/dist/EntityAdmin/components/erd-diagram.component.js.map +0 -1
|
@@ -1,811 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
import { Component } from '@angular/core';
|
|
8
|
-
import { Subject, BehaviorSubject } from 'rxjs';
|
|
9
|
-
import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
|
|
10
|
-
import { Metadata, RunView, CompositeKey } from '@memberjunction/core';
|
|
11
|
-
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
12
|
-
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
13
|
-
import { RegisterClass } from '@memberjunction/global';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "@memberjunction/ng-shared";
|
|
16
|
-
import * as i2 from "@memberjunction/ng-ai-test-harness";
|
|
17
|
-
import * as i3 from "@angular/forms";
|
|
18
|
-
import * as i4 from "@progress/kendo-angular-layout";
|
|
19
|
-
import * as i5 from "@memberjunction/ng-shared-generic";
|
|
20
|
-
const _forTrack0 = ($index, $item) => $item.ID;
|
|
21
|
-
function PromptManagementV2Component_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
22
|
-
i0.ɵɵtext(0, " Hide Filters ");
|
|
23
|
-
} }
|
|
24
|
-
function PromptManagementV2Component_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
25
|
-
i0.ɵɵtext(0, " Show Filters ");
|
|
26
|
-
} }
|
|
27
|
-
function PromptManagementV2Component_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
-
const _r1 = i0.ɵɵgetCurrentView();
|
|
29
|
-
i0.ɵɵelementStart(0, "button", 44);
|
|
30
|
-
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_18_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createNewPrompt()); });
|
|
31
|
-
i0.ɵɵelement(1, "i", 45);
|
|
32
|
-
i0.ɵɵtext(2, " New Prompt ");
|
|
33
|
-
i0.ɵɵelementEnd();
|
|
34
|
-
} }
|
|
35
|
-
function PromptManagementV2Component_For_47_Template(rf, ctx) { if (rf & 1) {
|
|
36
|
-
i0.ɵɵelementStart(0, "option", 33);
|
|
37
|
-
i0.ɵɵtext(1);
|
|
38
|
-
i0.ɵɵelementEnd();
|
|
39
|
-
} if (rf & 2) {
|
|
40
|
-
const category_r3 = ctx.$implicit;
|
|
41
|
-
i0.ɵɵproperty("value", category_r3.ID);
|
|
42
|
-
i0.ɵɵadvance();
|
|
43
|
-
i0.ɵɵtextInterpolate(category_r3.Name);
|
|
44
|
-
} }
|
|
45
|
-
function PromptManagementV2Component_For_56_Template(rf, ctx) { if (rf & 1) {
|
|
46
|
-
i0.ɵɵelementStart(0, "option", 33);
|
|
47
|
-
i0.ɵɵtext(1);
|
|
48
|
-
i0.ɵɵelementEnd();
|
|
49
|
-
} if (rf & 2) {
|
|
50
|
-
const type_r4 = ctx.$implicit;
|
|
51
|
-
i0.ɵɵproperty("value", type_r4.ID);
|
|
52
|
-
i0.ɵɵadvance();
|
|
53
|
-
i0.ɵɵtextInterpolate(type_r4.Name);
|
|
54
|
-
} }
|
|
55
|
-
function PromptManagementV2Component_Conditional_74_Template(rf, ctx) { if (rf & 1) {
|
|
56
|
-
i0.ɵɵelementStart(0, "div", 43);
|
|
57
|
-
i0.ɵɵelement(1, "mj-loading", 46);
|
|
58
|
-
i0.ɵɵelementEnd();
|
|
59
|
-
} if (rf & 2) {
|
|
60
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
61
|
-
i0.ɵɵadvance();
|
|
62
|
-
i0.ɵɵproperty("text", ctx_r1.currentLoadingMessage);
|
|
63
|
-
} }
|
|
64
|
-
function PromptManagementV2Component_Conditional_75_Conditional_0_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
65
|
-
const _r5 = i0.ɵɵgetCurrentView();
|
|
66
|
-
i0.ɵɵelementStart(0, "button", 49);
|
|
67
|
-
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_75_Conditional_0_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.createNewPrompt()); });
|
|
68
|
-
i0.ɵɵelement(1, "i", 45);
|
|
69
|
-
i0.ɵɵtext(2, " Create New Prompt ");
|
|
70
|
-
i0.ɵɵelementEnd();
|
|
71
|
-
} }
|
|
72
|
-
function PromptManagementV2Component_Conditional_75_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
73
|
-
i0.ɵɵelementStart(0, "div", 47);
|
|
74
|
-
i0.ɵɵelement(1, "i", 4);
|
|
75
|
-
i0.ɵɵelementStart(2, "h3");
|
|
76
|
-
i0.ɵɵtext(3, "No prompts found");
|
|
77
|
-
i0.ɵɵelementEnd();
|
|
78
|
-
i0.ɵɵelementStart(4, "p");
|
|
79
|
-
i0.ɵɵtext(5);
|
|
80
|
-
i0.ɵɵelementEnd();
|
|
81
|
-
i0.ɵɵtemplate(6, PromptManagementV2Component_Conditional_75_Conditional_0_Conditional_6_Template, 3, 0, "button", 48);
|
|
82
|
-
i0.ɵɵelementEnd();
|
|
83
|
-
} if (rf & 2) {
|
|
84
|
-
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
85
|
-
i0.ɵɵadvance(5);
|
|
86
|
-
i0.ɵɵtextInterpolate(ctx_r1.hasActiveFilters ? "Try adjusting your filters" : "Create your first AI prompt to get started");
|
|
87
|
-
i0.ɵɵadvance();
|
|
88
|
-
i0.ɵɵconditional(!ctx_r1.hasActiveFilters && ctx_r1.UserCanCreatePrompts ? 6 : -1);
|
|
89
|
-
} }
|
|
90
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
91
|
-
i0.ɵɵelementStart(0, "span", 60);
|
|
92
|
-
i0.ɵɵelement(1, "i", 70);
|
|
93
|
-
i0.ɵɵtext(2);
|
|
94
|
-
i0.ɵɵelementEnd();
|
|
95
|
-
} if (rf & 2) {
|
|
96
|
-
const prompt_r7 = i0.ɵɵnextContext().$implicit;
|
|
97
|
-
i0.ɵɵclassMap("status-" + prompt_r7.Status.toLowerCase());
|
|
98
|
-
i0.ɵɵadvance(2);
|
|
99
|
-
i0.ɵɵtextInterpolate1(" ", prompt_r7.Status, " ");
|
|
100
|
-
} }
|
|
101
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
102
|
-
i0.ɵɵelementStart(0, "p", 64);
|
|
103
|
-
i0.ɵɵtext(1);
|
|
104
|
-
i0.ɵɵelementEnd();
|
|
105
|
-
} if (rf & 2) {
|
|
106
|
-
const prompt_r7 = i0.ɵɵnextContext().$implicit;
|
|
107
|
-
i0.ɵɵadvance();
|
|
108
|
-
i0.ɵɵtextInterpolate(prompt_r7.Description);
|
|
109
|
-
} }
|
|
110
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
111
|
-
i0.ɵɵelementStart(0, "p", 65);
|
|
112
|
-
i0.ɵɵtext(1, "No description provided");
|
|
113
|
-
i0.ɵɵelementEnd();
|
|
114
|
-
} }
|
|
115
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_17_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
116
|
-
i0.ɵɵelement(0, "i", 75);
|
|
117
|
-
i0.ɵɵtext(1, " Yes ");
|
|
118
|
-
} }
|
|
119
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_17_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
120
|
-
i0.ɵɵelement(0, "i", 76);
|
|
121
|
-
i0.ɵɵtext(1, " No ");
|
|
122
|
-
} }
|
|
123
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
124
|
-
i0.ɵɵelementStart(0, "div", 66)(1, "div", 71)(2, "div", 72)(3, "span", 73);
|
|
125
|
-
i0.ɵɵtext(4, "Type");
|
|
126
|
-
i0.ɵɵelementEnd();
|
|
127
|
-
i0.ɵɵelementStart(5, "span", 74);
|
|
128
|
-
i0.ɵɵtext(6);
|
|
129
|
-
i0.ɵɵelementEnd()();
|
|
130
|
-
i0.ɵɵelementStart(7, "div", 72)(8, "span", 73);
|
|
131
|
-
i0.ɵɵtext(9, "Template");
|
|
132
|
-
i0.ɵɵelementEnd();
|
|
133
|
-
i0.ɵɵelementStart(10, "span", 74);
|
|
134
|
-
i0.ɵɵtemplate(11, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_17_Conditional_11_Template, 2, 0)(12, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_17_Conditional_12_Template, 2, 0);
|
|
135
|
-
i0.ɵɵelementEnd()()()();
|
|
136
|
-
} if (rf & 2) {
|
|
137
|
-
const prompt_r7 = i0.ɵɵnextContext().$implicit;
|
|
138
|
-
i0.ɵɵadvance(6);
|
|
139
|
-
i0.ɵɵtextInterpolate(prompt_r7.TypeName);
|
|
140
|
-
i0.ɵɵadvance(5);
|
|
141
|
-
i0.ɵɵconditional(prompt_r7.TemplateEntity ? 11 : 12);
|
|
142
|
-
} }
|
|
143
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
144
|
-
const _r8 = i0.ɵɵgetCurrentView();
|
|
145
|
-
i0.ɵɵelementStart(0, "button", 77);
|
|
146
|
-
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_19_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r8); const prompt_r7 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.openPrompt(prompt_r7.ID); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
147
|
-
i0.ɵɵelement(1, "i", 78);
|
|
148
|
-
i0.ɵɵtext(2, " Open ");
|
|
149
|
-
i0.ɵɵelementEnd();
|
|
150
|
-
} }
|
|
151
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
152
|
-
const _r9 = i0.ɵɵgetCurrentView();
|
|
153
|
-
i0.ɵɵelementStart(0, "button", 79);
|
|
154
|
-
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_20_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r9); const prompt_r7 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.testPrompt(prompt_r7.ID, $event)); });
|
|
155
|
-
i0.ɵɵelement(1, "i", 80);
|
|
156
|
-
i0.ɵɵtext(2, " Run ");
|
|
157
|
-
i0.ɵɵelementEnd();
|
|
158
|
-
} }
|
|
159
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
160
|
-
const _r6 = i0.ɵɵgetCurrentView();
|
|
161
|
-
i0.ɵɵelementStart(0, "div", 53)(1, "div", 54);
|
|
162
|
-
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Template_div_click_1_listener() { const prompt_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.togglePromptExpansion(prompt_r7.ID)); });
|
|
163
|
-
i0.ɵɵelementStart(2, "div", 55)(3, "div", 56);
|
|
164
|
-
i0.ɵɵelement(4, "i");
|
|
165
|
-
i0.ɵɵelementEnd();
|
|
166
|
-
i0.ɵɵelementStart(5, "div", 57)(6, "h4", 58);
|
|
167
|
-
i0.ɵɵtext(7);
|
|
168
|
-
i0.ɵɵelementEnd();
|
|
169
|
-
i0.ɵɵelementStart(8, "div", 59)(9, "span", 60);
|
|
170
|
-
i0.ɵɵelement(10, "i", 30);
|
|
171
|
-
i0.ɵɵtext(11);
|
|
172
|
-
i0.ɵɵelementEnd();
|
|
173
|
-
i0.ɵɵtemplate(12, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_12_Template, 3, 3, "span", 61);
|
|
174
|
-
i0.ɵɵelementEnd()()();
|
|
175
|
-
i0.ɵɵelement(13, "i", 62);
|
|
176
|
-
i0.ɵɵelementEnd();
|
|
177
|
-
i0.ɵɵelementStart(14, "div", 63);
|
|
178
|
-
i0.ɵɵtemplate(15, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_15_Template, 2, 1, "p", 64)(16, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_16_Template, 2, 0, "p", 65)(17, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_17_Template, 13, 2, "div", 66);
|
|
179
|
-
i0.ɵɵelementEnd();
|
|
180
|
-
i0.ɵɵelementStart(18, "div", 67);
|
|
181
|
-
i0.ɵɵtemplate(19, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_19_Template, 3, 0, "button", 68)(20, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_20_Template, 3, 0, "button", 69);
|
|
182
|
-
i0.ɵɵelementEnd()();
|
|
183
|
-
} if (rf & 2) {
|
|
184
|
-
const prompt_r7 = ctx.$implicit;
|
|
185
|
-
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
186
|
-
i0.ɵɵclassProp("expanded", ctx_r1.expandedPromptId === prompt_r7.ID);
|
|
187
|
-
i0.ɵɵadvance(4);
|
|
188
|
-
i0.ɵɵclassMap(ctx_r1.getPromptIcon(prompt_r7));
|
|
189
|
-
i0.ɵɵadvance(3);
|
|
190
|
-
i0.ɵɵtextInterpolate(prompt_r7.Name);
|
|
191
|
-
i0.ɵɵadvance(4);
|
|
192
|
-
i0.ɵɵtextInterpolate1(" ", prompt_r7.CategoryName, " ");
|
|
193
|
-
i0.ɵɵadvance();
|
|
194
|
-
i0.ɵɵconditional(prompt_r7.Status ? 12 : -1);
|
|
195
|
-
i0.ɵɵadvance();
|
|
196
|
-
i0.ɵɵclassProp("rotated", ctx_r1.expandedPromptId === prompt_r7.ID);
|
|
197
|
-
i0.ɵɵadvance(2);
|
|
198
|
-
i0.ɵɵconditional(prompt_r7.Description ? 15 : 16);
|
|
199
|
-
i0.ɵɵadvance(2);
|
|
200
|
-
i0.ɵɵconditional(ctx_r1.expandedPromptId === prompt_r7.ID ? 17 : -1);
|
|
201
|
-
i0.ɵɵadvance(2);
|
|
202
|
-
i0.ɵɵconditional(ctx_r1.UserCanReadPrompts ? 19 : -1);
|
|
203
|
-
i0.ɵɵadvance();
|
|
204
|
-
i0.ɵɵconditional(prompt_r7.Status === "Active" && ctx_r1.UserCanReadPrompts ? 20 : -1);
|
|
205
|
-
} }
|
|
206
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
207
|
-
i0.ɵɵelementStart(0, "div", 50);
|
|
208
|
-
i0.ɵɵrepeaterCreate(1, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_For_2_Template, 21, 13, "div", 52, _forTrack0);
|
|
209
|
-
i0.ɵɵelementEnd();
|
|
210
|
-
} if (rf & 2) {
|
|
211
|
-
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
212
|
-
i0.ɵɵadvance();
|
|
213
|
-
i0.ɵɵrepeater(ctx_r1.filteredPrompts);
|
|
214
|
-
} }
|
|
215
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
216
|
-
i0.ɵɵelementStart(0, "div", 84);
|
|
217
|
-
i0.ɵɵtext(1);
|
|
218
|
-
i0.ɵɵelementEnd();
|
|
219
|
-
} if (rf & 2) {
|
|
220
|
-
const prompt_r10 = i0.ɵɵnextContext().$implicit;
|
|
221
|
-
i0.ɵɵadvance();
|
|
222
|
-
i0.ɵɵtextInterpolate(prompt_r10.Description);
|
|
223
|
-
} }
|
|
224
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
225
|
-
i0.ɵɵelement(0, "i", 86);
|
|
226
|
-
} }
|
|
227
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
228
|
-
i0.ɵɵelement(0, "i", 87);
|
|
229
|
-
} }
|
|
230
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
231
|
-
const _r11 = i0.ɵɵgetCurrentView();
|
|
232
|
-
i0.ɵɵelementStart(0, "button", 91);
|
|
233
|
-
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Conditional_21_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const prompt_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.openPrompt(prompt_r10.ID)); });
|
|
234
|
-
i0.ɵɵelement(1, "i", 78);
|
|
235
|
-
i0.ɵɵelementEnd();
|
|
236
|
-
} }
|
|
237
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
238
|
-
const _r12 = i0.ɵɵgetCurrentView();
|
|
239
|
-
i0.ɵɵelementStart(0, "button", 92);
|
|
240
|
-
i0.ɵɵlistener("click", function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Conditional_22_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r12); const prompt_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.testPrompt(prompt_r10.ID, $event)); });
|
|
241
|
-
i0.ɵɵelement(1, "i", 80);
|
|
242
|
-
i0.ɵɵelementEnd();
|
|
243
|
-
} }
|
|
244
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
245
|
-
i0.ɵɵelementStart(0, "tr")(1, "td")(2, "div", 82)(3, "div", 83);
|
|
246
|
-
i0.ɵɵelement(4, "i");
|
|
247
|
-
i0.ɵɵelementEnd();
|
|
248
|
-
i0.ɵɵelementStart(5, "div")(6, "div", 58);
|
|
249
|
-
i0.ɵɵtext(7);
|
|
250
|
-
i0.ɵɵelementEnd();
|
|
251
|
-
i0.ɵɵtemplate(8, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Conditional_8_Template, 2, 1, "div", 84);
|
|
252
|
-
i0.ɵɵelementEnd()()();
|
|
253
|
-
i0.ɵɵelementStart(9, "td");
|
|
254
|
-
i0.ɵɵtext(10);
|
|
255
|
-
i0.ɵɵelementEnd();
|
|
256
|
-
i0.ɵɵelementStart(11, "td");
|
|
257
|
-
i0.ɵɵtext(12);
|
|
258
|
-
i0.ɵɵelementEnd();
|
|
259
|
-
i0.ɵɵelementStart(13, "td")(14, "span", 85);
|
|
260
|
-
i0.ɵɵtext(15);
|
|
261
|
-
i0.ɵɵelementEnd()();
|
|
262
|
-
i0.ɵɵelementStart(16, "td");
|
|
263
|
-
i0.ɵɵtemplate(17, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Conditional_17_Template, 1, 0, "i", 86)(18, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Conditional_18_Template, 1, 0, "i", 87);
|
|
264
|
-
i0.ɵɵelementEnd();
|
|
265
|
-
i0.ɵɵelementStart(19, "td")(20, "div", 88);
|
|
266
|
-
i0.ɵɵtemplate(21, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Conditional_21_Template, 2, 0, "button", 89)(22, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Conditional_22_Template, 2, 0, "button", 90);
|
|
267
|
-
i0.ɵɵelementEnd()()();
|
|
268
|
-
} if (rf & 2) {
|
|
269
|
-
const prompt_r10 = ctx.$implicit;
|
|
270
|
-
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
271
|
-
i0.ɵɵadvance(4);
|
|
272
|
-
i0.ɵɵclassMap(ctx_r1.getPromptIcon(prompt_r10));
|
|
273
|
-
i0.ɵɵadvance(3);
|
|
274
|
-
i0.ɵɵtextInterpolate(prompt_r10.Name);
|
|
275
|
-
i0.ɵɵadvance();
|
|
276
|
-
i0.ɵɵconditional(prompt_r10.Description ? 8 : -1);
|
|
277
|
-
i0.ɵɵadvance(2);
|
|
278
|
-
i0.ɵɵtextInterpolate(prompt_r10.CategoryName);
|
|
279
|
-
i0.ɵɵadvance(2);
|
|
280
|
-
i0.ɵɵtextInterpolate(prompt_r10.TypeName);
|
|
281
|
-
i0.ɵɵadvance(2);
|
|
282
|
-
i0.ɵɵclassMap("status-" + (prompt_r10.Status || "unknown").toLowerCase());
|
|
283
|
-
i0.ɵɵadvance();
|
|
284
|
-
i0.ɵɵtextInterpolate1(" ", prompt_r10.Status || "Unknown", " ");
|
|
285
|
-
i0.ɵɵadvance(2);
|
|
286
|
-
i0.ɵɵconditional(prompt_r10.TemplateEntity ? 17 : 18);
|
|
287
|
-
i0.ɵɵadvance(4);
|
|
288
|
-
i0.ɵɵconditional(ctx_r1.UserCanReadPrompts ? 21 : -1);
|
|
289
|
-
i0.ɵɵadvance();
|
|
290
|
-
i0.ɵɵconditional(prompt_r10.Status === "Active" && ctx_r1.UserCanReadPrompts ? 22 : -1);
|
|
291
|
-
} }
|
|
292
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
293
|
-
i0.ɵɵelementStart(0, "div", 51)(1, "table", 81)(2, "thead")(3, "tr")(4, "th");
|
|
294
|
-
i0.ɵɵtext(5, "Name");
|
|
295
|
-
i0.ɵɵelementEnd();
|
|
296
|
-
i0.ɵɵelementStart(6, "th");
|
|
297
|
-
i0.ɵɵtext(7, "Category");
|
|
298
|
-
i0.ɵɵelementEnd();
|
|
299
|
-
i0.ɵɵelementStart(8, "th");
|
|
300
|
-
i0.ɵɵtext(9, "Type");
|
|
301
|
-
i0.ɵɵelementEnd();
|
|
302
|
-
i0.ɵɵelementStart(10, "th");
|
|
303
|
-
i0.ɵɵtext(11, "Status");
|
|
304
|
-
i0.ɵɵelementEnd();
|
|
305
|
-
i0.ɵɵelementStart(12, "th");
|
|
306
|
-
i0.ɵɵtext(13, "Template");
|
|
307
|
-
i0.ɵɵelementEnd();
|
|
308
|
-
i0.ɵɵelementStart(14, "th");
|
|
309
|
-
i0.ɵɵtext(15, "Actions");
|
|
310
|
-
i0.ɵɵelementEnd()()();
|
|
311
|
-
i0.ɵɵelementStart(16, "tbody");
|
|
312
|
-
i0.ɵɵrepeaterCreate(17, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_For_18_Template, 23, 12, "tr", null, _forTrack0);
|
|
313
|
-
i0.ɵɵelementEnd()()();
|
|
314
|
-
} if (rf & 2) {
|
|
315
|
-
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
316
|
-
i0.ɵɵadvance(17);
|
|
317
|
-
i0.ɵɵrepeater(ctx_r1.filteredPrompts);
|
|
318
|
-
} }
|
|
319
|
-
function PromptManagementV2Component_Conditional_75_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
320
|
-
i0.ɵɵtemplate(0, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_0_Template, 3, 0, "div", 50)(1, PromptManagementV2Component_Conditional_75_Conditional_1_Conditional_1_Template, 19, 0, "div", 51);
|
|
321
|
-
} if (rf & 2) {
|
|
322
|
-
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
323
|
-
i0.ɵɵconditional(ctx_r1.viewMode === "grid" ? 0 : -1);
|
|
324
|
-
i0.ɵɵadvance();
|
|
325
|
-
i0.ɵɵconditional(ctx_r1.viewMode === "list" ? 1 : -1);
|
|
326
|
-
} }
|
|
327
|
-
function PromptManagementV2Component_Conditional_75_Template(rf, ctx) { if (rf & 1) {
|
|
328
|
-
i0.ɵɵtemplate(0, PromptManagementV2Component_Conditional_75_Conditional_0_Template, 7, 2, "div", 47)(1, PromptManagementV2Component_Conditional_75_Conditional_1_Template, 2, 2);
|
|
329
|
-
} if (rf & 2) {
|
|
330
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
331
|
-
i0.ɵɵconditional(ctx_r1.filteredPrompts.length === 0 ? 0 : 1);
|
|
332
|
-
} }
|
|
333
|
-
/**
|
|
334
|
-
* Tree-shaking prevention function - ensures component is included in builds
|
|
335
|
-
*/
|
|
336
|
-
export function LoadAIPromptsResource() {
|
|
337
|
-
// Force inclusion in production builds
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* AI Prompts Resource - displays AI prompt management
|
|
341
|
-
* Extends BaseResourceComponent to work with the resource type system
|
|
342
|
-
*/
|
|
343
|
-
let PromptManagementV2Component = class PromptManagementV2Component extends BaseResourceComponent {
|
|
344
|
-
sharedService;
|
|
345
|
-
testHarnessService;
|
|
346
|
-
navigationService;
|
|
347
|
-
// View state
|
|
348
|
-
viewMode = 'grid';
|
|
349
|
-
isLoading = true;
|
|
350
|
-
showFilters = true;
|
|
351
|
-
expandedPromptId = null;
|
|
352
|
-
// Data
|
|
353
|
-
prompts = [];
|
|
354
|
-
filteredPrompts = [];
|
|
355
|
-
categories = [];
|
|
356
|
-
types = [];
|
|
357
|
-
// Filtering
|
|
358
|
-
searchTerm = '';
|
|
359
|
-
searchSubject = new BehaviorSubject('');
|
|
360
|
-
selectedCategory = 'all';
|
|
361
|
-
selectedType = 'all';
|
|
362
|
-
selectedStatus = 'all';
|
|
363
|
-
// Loading messages
|
|
364
|
-
loadingMessages = [
|
|
365
|
-
'Loading AI prompts...',
|
|
366
|
-
'Fetching templates...',
|
|
367
|
-
'Organizing categories...',
|
|
368
|
-
'Almost there...'
|
|
369
|
-
];
|
|
370
|
-
currentLoadingMessage = this.loadingMessages[0];
|
|
371
|
-
loadingMessageIndex = 0;
|
|
372
|
-
loadingMessageInterval;
|
|
373
|
-
destroy$ = new Subject();
|
|
374
|
-
selectedPromptForTest = null;
|
|
375
|
-
// === Permission Checks ===
|
|
376
|
-
/** Cache for permission checks to avoid repeated calculations */
|
|
377
|
-
_permissionCache = new Map();
|
|
378
|
-
_metadata = new Metadata();
|
|
379
|
-
/** Check if user can create AI Prompts */
|
|
380
|
-
get UserCanCreatePrompts() {
|
|
381
|
-
return this.checkEntityPermission('AI Prompts', 'Create');
|
|
382
|
-
}
|
|
383
|
-
/** Check if user can read AI Prompts */
|
|
384
|
-
get UserCanReadPrompts() {
|
|
385
|
-
return this.checkEntityPermission('AI Prompts', 'Read');
|
|
386
|
-
}
|
|
387
|
-
/** Check if user can update AI Prompts */
|
|
388
|
-
get UserCanUpdatePrompts() {
|
|
389
|
-
return this.checkEntityPermission('AI Prompts', 'Update');
|
|
390
|
-
}
|
|
391
|
-
/** Check if user can delete AI Prompts */
|
|
392
|
-
get UserCanDeletePrompts() {
|
|
393
|
-
return this.checkEntityPermission('AI Prompts', 'Delete');
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* Helper method to check entity permissions with caching
|
|
397
|
-
* @param entityName - The name of the entity to check permissions for
|
|
398
|
-
* @param permissionType - The type of permission to check (Create, Read, Update, Delete)
|
|
399
|
-
* @returns boolean indicating if user has the permission
|
|
400
|
-
*/
|
|
401
|
-
checkEntityPermission(entityName, permissionType) {
|
|
402
|
-
const cacheKey = `${entityName}_${permissionType}`;
|
|
403
|
-
if (this._permissionCache.has(cacheKey)) {
|
|
404
|
-
return this._permissionCache.get(cacheKey);
|
|
405
|
-
}
|
|
406
|
-
try {
|
|
407
|
-
const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);
|
|
408
|
-
if (!entityInfo) {
|
|
409
|
-
console.warn(`Entity '${entityName}' not found for permission check`);
|
|
410
|
-
this._permissionCache.set(cacheKey, false);
|
|
411
|
-
return false;
|
|
412
|
-
}
|
|
413
|
-
const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);
|
|
414
|
-
let hasPermission = false;
|
|
415
|
-
switch (permissionType) {
|
|
416
|
-
case 'Create':
|
|
417
|
-
hasPermission = userPermissions.CanCreate;
|
|
418
|
-
break;
|
|
419
|
-
case 'Read':
|
|
420
|
-
hasPermission = userPermissions.CanRead;
|
|
421
|
-
break;
|
|
422
|
-
case 'Update':
|
|
423
|
-
hasPermission = userPermissions.CanUpdate;
|
|
424
|
-
break;
|
|
425
|
-
case 'Delete':
|
|
426
|
-
hasPermission = userPermissions.CanDelete;
|
|
427
|
-
break;
|
|
428
|
-
}
|
|
429
|
-
this._permissionCache.set(cacheKey, hasPermission);
|
|
430
|
-
return hasPermission;
|
|
431
|
-
}
|
|
432
|
-
catch (error) {
|
|
433
|
-
console.error(`Error checking ${permissionType} permission for ${entityName}:`, error);
|
|
434
|
-
this._permissionCache.set(cacheKey, false);
|
|
435
|
-
return false;
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
/**
|
|
439
|
-
* Clears the permission cache. Call this when user context changes or permissions are updated.
|
|
440
|
-
*/
|
|
441
|
-
clearPermissionCache() {
|
|
442
|
-
this._permissionCache.clear();
|
|
443
|
-
}
|
|
444
|
-
constructor(sharedService, testHarnessService, navigationService) {
|
|
445
|
-
super();
|
|
446
|
-
this.sharedService = sharedService;
|
|
447
|
-
this.testHarnessService = testHarnessService;
|
|
448
|
-
this.navigationService = navigationService;
|
|
449
|
-
}
|
|
450
|
-
ngOnInit() {
|
|
451
|
-
this.setupSearchListener();
|
|
452
|
-
this.startLoadingMessages();
|
|
453
|
-
this.loadInitialData();
|
|
454
|
-
if (this.Data?.Configuration) {
|
|
455
|
-
this.applyInitialState(this.Data.Configuration);
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
ngOnDestroy() {
|
|
459
|
-
this.destroy$.next();
|
|
460
|
-
this.destroy$.complete();
|
|
461
|
-
if (this.loadingMessageInterval) {
|
|
462
|
-
clearInterval(this.loadingMessageInterval);
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
setupSearchListener() {
|
|
466
|
-
this.searchSubject.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(searchTerm => {
|
|
467
|
-
this.searchTerm = searchTerm;
|
|
468
|
-
this.applyFilters();
|
|
469
|
-
});
|
|
470
|
-
}
|
|
471
|
-
startLoadingMessages() {
|
|
472
|
-
this.loadingMessageInterval = setInterval(() => {
|
|
473
|
-
this.loadingMessageIndex = (this.loadingMessageIndex + 1) % this.loadingMessages.length;
|
|
474
|
-
this.currentLoadingMessage = this.loadingMessages[this.loadingMessageIndex];
|
|
475
|
-
}, 2000);
|
|
476
|
-
}
|
|
477
|
-
async loadInitialData() {
|
|
478
|
-
try {
|
|
479
|
-
const rv = new RunView();
|
|
480
|
-
const md = new Metadata();
|
|
481
|
-
// Load all data in parallel using RunViews
|
|
482
|
-
const [promptResults, categoryResults, typeResults, templateResults, templateContentResults] = await rv.RunViews([
|
|
483
|
-
{
|
|
484
|
-
EntityName: 'AI Prompts',
|
|
485
|
-
OrderBy: 'Name'
|
|
486
|
-
},
|
|
487
|
-
{
|
|
488
|
-
EntityName: 'AI Prompt Categories',
|
|
489
|
-
OrderBy: 'Name',
|
|
490
|
-
},
|
|
491
|
-
{
|
|
492
|
-
EntityName: 'AI Prompt Types',
|
|
493
|
-
OrderBy: 'Name'
|
|
494
|
-
},
|
|
495
|
-
{
|
|
496
|
-
EntityName: 'Templates',
|
|
497
|
-
ExtraFilter: `ID IN (SELECT TemplateID FROM __mj.AIPrompt)`
|
|
498
|
-
},
|
|
499
|
-
{
|
|
500
|
-
EntityName: 'Template Contents'
|
|
501
|
-
}
|
|
502
|
-
]);
|
|
503
|
-
this.categories = categoryResults.Results;
|
|
504
|
-
this.types = typeResults.Results;
|
|
505
|
-
// Combine prompts with their templates
|
|
506
|
-
const templates = templateResults.Results;
|
|
507
|
-
const templateContents = templateContentResults.Results;
|
|
508
|
-
// Create lookup maps
|
|
509
|
-
const templateMap = new Map(templates.map(t => [t.ID, t]));
|
|
510
|
-
const templateContentMap = new Map();
|
|
511
|
-
templateContents.forEach(tc => {
|
|
512
|
-
const contents = templateContentMap.get(tc.TemplateID) || [];
|
|
513
|
-
contents.push(tc);
|
|
514
|
-
templateContentMap.set(tc.TemplateID, contents);
|
|
515
|
-
});
|
|
516
|
-
const categoryMap = new Map(this.categories.map(c => [c.ID, c.Name]));
|
|
517
|
-
const typeMap = new Map(this.types.map(t => [t.ID, t.Name]));
|
|
518
|
-
// Combine the data - keep the actual entity objects
|
|
519
|
-
this.prompts = promptResults.Results.map(prompt => {
|
|
520
|
-
const template = templateMap.get(prompt.ID);
|
|
521
|
-
// Add the extra properties directly to the entity
|
|
522
|
-
prompt.TemplateEntity = template;
|
|
523
|
-
prompt.TemplateContents = template ? (templateContentMap.get(template.ID) || []) : [];
|
|
524
|
-
prompt.CategoryName = prompt.CategoryID ? categoryMap.get(prompt.CategoryID) || 'Unknown' : 'Uncategorized';
|
|
525
|
-
prompt.TypeName = prompt.TypeID ? typeMap.get(prompt.TypeID) || 'Unknown' : 'Untyped';
|
|
526
|
-
return prompt;
|
|
527
|
-
});
|
|
528
|
-
this.filteredPrompts = [...this.prompts];
|
|
529
|
-
this.applyFilters();
|
|
530
|
-
}
|
|
531
|
-
catch (error) {
|
|
532
|
-
console.error('Error loading prompt data:', error);
|
|
533
|
-
MJNotificationService.Instance.CreateSimpleNotification('Error loading prompts', 'error', 3000);
|
|
534
|
-
}
|
|
535
|
-
finally {
|
|
536
|
-
this.isLoading = false;
|
|
537
|
-
if (this.loadingMessageInterval) {
|
|
538
|
-
clearInterval(this.loadingMessageInterval);
|
|
539
|
-
}
|
|
540
|
-
this.NotifyLoadComplete();
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
applyInitialState(state) {
|
|
544
|
-
if (state.viewMode)
|
|
545
|
-
this.viewMode = state.viewMode;
|
|
546
|
-
if (state.showFilters !== undefined)
|
|
547
|
-
this.showFilters = state.showFilters;
|
|
548
|
-
if (state.searchTerm)
|
|
549
|
-
this.searchTerm = state.searchTerm;
|
|
550
|
-
if (state.selectedCategory)
|
|
551
|
-
this.selectedCategory = state.selectedCategory;
|
|
552
|
-
if (state.selectedType)
|
|
553
|
-
this.selectedType = state.selectedType;
|
|
554
|
-
if (state.selectedStatus)
|
|
555
|
-
this.selectedStatus = state.selectedStatus;
|
|
556
|
-
}
|
|
557
|
-
onSearchChange(value) {
|
|
558
|
-
this.searchSubject.next(value);
|
|
559
|
-
}
|
|
560
|
-
toggleFilters() {
|
|
561
|
-
this.showFilters = !this.showFilters;
|
|
562
|
-
}
|
|
563
|
-
toggleFilterPanel() {
|
|
564
|
-
this.showFilters = !this.showFilters;
|
|
565
|
-
}
|
|
566
|
-
setViewMode(mode) {
|
|
567
|
-
this.viewMode = mode;
|
|
568
|
-
this.expandedPromptId = null;
|
|
569
|
-
}
|
|
570
|
-
togglePromptExpansion(promptId) {
|
|
571
|
-
this.expandedPromptId = this.expandedPromptId === promptId ? null : promptId;
|
|
572
|
-
}
|
|
573
|
-
applyFilters() {
|
|
574
|
-
this.filteredPrompts = this.prompts.filter(prompt => {
|
|
575
|
-
// Search filter
|
|
576
|
-
if (this.searchTerm) {
|
|
577
|
-
const searchLower = this.searchTerm.toLowerCase();
|
|
578
|
-
const matchesSearch = prompt.Name?.toLowerCase().includes(searchLower) ||
|
|
579
|
-
prompt.Description?.toLowerCase().includes(searchLower) ||
|
|
580
|
-
prompt.CategoryName?.toLowerCase().includes(searchLower) ||
|
|
581
|
-
prompt.TypeName?.toLowerCase().includes(searchLower);
|
|
582
|
-
if (!matchesSearch)
|
|
583
|
-
return false;
|
|
584
|
-
}
|
|
585
|
-
// Category filter
|
|
586
|
-
if (this.selectedCategory !== 'all' && prompt.CategoryID !== this.selectedCategory) {
|
|
587
|
-
return false;
|
|
588
|
-
}
|
|
589
|
-
// Type filter
|
|
590
|
-
if (this.selectedType !== 'all' && prompt.TypeID !== this.selectedType) {
|
|
591
|
-
return false;
|
|
592
|
-
}
|
|
593
|
-
// Status filter
|
|
594
|
-
if (this.selectedStatus !== 'all') {
|
|
595
|
-
const isActive = prompt.Status === 'Active';
|
|
596
|
-
if (this.selectedStatus === 'active' && !isActive)
|
|
597
|
-
return false;
|
|
598
|
-
if (this.selectedStatus === 'inactive' && isActive)
|
|
599
|
-
return false;
|
|
600
|
-
}
|
|
601
|
-
return true;
|
|
602
|
-
});
|
|
603
|
-
}
|
|
604
|
-
onCategoryChange(categoryId) {
|
|
605
|
-
this.selectedCategory = categoryId;
|
|
606
|
-
this.applyFilters();
|
|
607
|
-
}
|
|
608
|
-
onTypeChange(typeId) {
|
|
609
|
-
this.selectedType = typeId;
|
|
610
|
-
this.applyFilters();
|
|
611
|
-
}
|
|
612
|
-
onStatusChange(status) {
|
|
613
|
-
this.selectedStatus = status;
|
|
614
|
-
this.applyFilters();
|
|
615
|
-
}
|
|
616
|
-
openPrompt(promptId) {
|
|
617
|
-
const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: promptId }]);
|
|
618
|
-
this.navigationService.OpenEntityRecord('AI Prompts', compositeKey);
|
|
619
|
-
}
|
|
620
|
-
testPrompt(promptId, event) {
|
|
621
|
-
if (event) {
|
|
622
|
-
event.stopPropagation();
|
|
623
|
-
}
|
|
624
|
-
// Use the test harness service for window management features
|
|
625
|
-
this.testHarnessService.openForPrompt(promptId);
|
|
626
|
-
}
|
|
627
|
-
closeTestHarness() {
|
|
628
|
-
// No longer needed - window manages its own closure
|
|
629
|
-
this.selectedPromptForTest = null;
|
|
630
|
-
}
|
|
631
|
-
createNewPrompt() {
|
|
632
|
-
// Use the standard MemberJunction pattern to open a new AI Prompt form
|
|
633
|
-
// Empty CompositeKey indicates a new record
|
|
634
|
-
this.navigationService.OpenEntityRecord('AI Prompts', new CompositeKey([]));
|
|
635
|
-
}
|
|
636
|
-
getPromptIcon(prompt) {
|
|
637
|
-
if (prompt.TypeName?.toLowerCase().includes('system')) {
|
|
638
|
-
return 'fa-solid fa-cogs';
|
|
639
|
-
}
|
|
640
|
-
else if (prompt.TypeName?.toLowerCase().includes('user')) {
|
|
641
|
-
return 'fa-solid fa-user';
|
|
642
|
-
}
|
|
643
|
-
else if (prompt.TypeName?.toLowerCase().includes('chat')) {
|
|
644
|
-
return 'fa-solid fa-comments';
|
|
645
|
-
}
|
|
646
|
-
return 'fa-solid fa-comment-dots';
|
|
647
|
-
}
|
|
648
|
-
getStatusClass(status) {
|
|
649
|
-
return status === 'Active' ? 'active' : 'inactive';
|
|
650
|
-
}
|
|
651
|
-
get hasActiveFilters() {
|
|
652
|
-
return this.searchTerm !== '' ||
|
|
653
|
-
this.selectedCategory !== 'all' ||
|
|
654
|
-
this.selectedType !== 'all' ||
|
|
655
|
-
this.selectedStatus !== 'all';
|
|
656
|
-
}
|
|
657
|
-
get filteredPromptsAsEntities() {
|
|
658
|
-
// The prompts are already AIPromptEntityExtended instances with extra properties
|
|
659
|
-
return this.filteredPrompts;
|
|
660
|
-
}
|
|
661
|
-
clearFilters() {
|
|
662
|
-
this.searchTerm = '';
|
|
663
|
-
this.selectedCategory = 'all';
|
|
664
|
-
this.selectedType = 'all';
|
|
665
|
-
this.selectedStatus = 'all';
|
|
666
|
-
this.searchSubject.next('');
|
|
667
|
-
this.applyFilters();
|
|
668
|
-
}
|
|
669
|
-
// BaseResourceComponent abstract method implementations
|
|
670
|
-
async GetResourceDisplayName(data) {
|
|
671
|
-
return 'Prompts';
|
|
672
|
-
}
|
|
673
|
-
async GetResourceIconClass(data) {
|
|
674
|
-
return 'fa-solid fa-comment-dots';
|
|
675
|
-
}
|
|
676
|
-
static ɵfac = function PromptManagementV2Component_Factory(t) { return new (t || PromptManagementV2Component)(i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i2.AITestHarnessDialogService), i0.ɵɵdirectiveInject(i1.NavigationService)); };
|
|
677
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PromptManagementV2Component, selectors: [["app-prompt-management-v2"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 76, vars: 22, consts: [[1, "prompt-management-container"], [1, "dashboard-header"], [1, "header-info"], [1, "dashboard-title"], [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"], [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", "Create New Prompt", 1, "control-btn", "primary"], [1, "main-content"], ["orientation", "horizontal", 1, "main-splitter"], [3, "size", "collapsible", "resizable", "scrollable", "hidden"], [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"], [3, "resizable", "scrollable"], [1, "prompts-content"], [1, "loading-container"], ["type", "button", "title", "Create New Prompt", 1, "control-btn", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], ["size", "large", 3, "text"], [1, "empty-state"], ["type", "button", 1, "empty-state-btn"], ["type", "button", 1, "empty-state-btn", 3, "click"], [1, "prompts-grid"], [1, "prompts-list"], [1, "prompt-card", 3, "expanded"], [1, "prompt-card"], [1, "card-header", 3, "click"], [1, "prompt-info"], [1, "prompt-icon"], [1, "prompt-details"], [1, "prompt-name"], [1, "prompt-meta"], [1, "meta-item"], [1, "meta-item", 3, "class"], [1, "fa-solid", "fa-chevron-down", "expand-icon"], [1, "card-body"], [1, "prompt-description"], [1, "prompt-description", "text-muted"], [1, "expanded-content"], [1, "card-actions"], ["type", "button", "title", "Open Prompt", 1, "action-btn"], ["type", "button", "title", "Run Prompt", 1, "action-btn", "action-btn-primary"], [1, "fa-solid", "fa-circle", 2, "font-size", "8px"], [1, "prompt-stats"], [1, "stat-item"], [1, "stat-label"], [1, "stat-value"], [1, "fa-solid", "fa-check", 2, "color", "#28a745"], [1, "fa-solid", "fa-times", 2, "color", "#dc3545"], ["type", "button", "title", "Open Prompt", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-external-link-alt"], ["type", "button", "title", "Run Prompt", 1, "action-btn", "action-btn-primary", 3, "click"], [1, "fa-solid", "fa-play"], [1, "prompts-table"], [1, "prompt-name-cell"], [1, "prompt-icon-small"], [1, "prompt-description-small"], [1, "status-badge"], [1, "fa-solid", "fa-check-circle", 2, "color", "#28a745"], [1, "fa-solid", "fa-times-circle", 2, "color", "#6c757d"], [1, "table-actions"], ["type", "button", "title", "Open Prompt", 1, "action-btn-small"], ["type", "button", "title", "Run Prompt", 1, "action-btn-small", "primary"], ["type", "button", "title", "Open Prompt", 1, "action-btn-small", 3, "click"], ["type", "button", "title", "Run Prompt", 1, "action-btn-small", "primary", 3, "click"]], template: function PromptManagementV2Component_Template(rf, ctx) { if (rf & 1) {
|
|
678
|
-
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h2", 3);
|
|
679
|
-
i0.ɵɵelement(4, "i", 4);
|
|
680
|
-
i0.ɵɵtext(5, " AI Prompts ");
|
|
681
|
-
i0.ɵɵelementEnd();
|
|
682
|
-
i0.ɵɵelementStart(6, "button", 5);
|
|
683
|
-
i0.ɵɵlistener("click", function PromptManagementV2Component_Template_button_click_6_listener() { return ctx.toggleFilters(); });
|
|
684
|
-
i0.ɵɵelement(7, "i", 6);
|
|
685
|
-
i0.ɵɵtemplate(8, PromptManagementV2Component_Conditional_8_Template, 1, 0)(9, PromptManagementV2Component_Conditional_9_Template, 1, 0);
|
|
686
|
-
i0.ɵɵelementEnd();
|
|
687
|
-
i0.ɵɵelementStart(10, "span", 7);
|
|
688
|
-
i0.ɵɵtext(11);
|
|
689
|
-
i0.ɵɵelementEnd()();
|
|
690
|
-
i0.ɵɵelementStart(12, "div", 8)(13, "div", 9)(14, "button", 10);
|
|
691
|
-
i0.ɵɵlistener("click", function PromptManagementV2Component_Template_button_click_14_listener() { return ctx.setViewMode("grid"); });
|
|
692
|
-
i0.ɵɵelement(15, "i", 11);
|
|
693
|
-
i0.ɵɵelementEnd();
|
|
694
|
-
i0.ɵɵelementStart(16, "button", 12);
|
|
695
|
-
i0.ɵɵlistener("click", function PromptManagementV2Component_Template_button_click_16_listener() { return ctx.setViewMode("list"); });
|
|
696
|
-
i0.ɵɵelement(17, "i", 13);
|
|
697
|
-
i0.ɵɵelementEnd()();
|
|
698
|
-
i0.ɵɵtemplate(18, PromptManagementV2Component_Conditional_18_Template, 3, 0, "button", 14);
|
|
699
|
-
i0.ɵɵelementEnd()();
|
|
700
|
-
i0.ɵɵelementStart(19, "div", 15)(20, "kendo-splitter", 16)(21, "kendo-splitter-pane", 17)(22, "div", 18)(23, "div", 19)(24, "h3");
|
|
701
|
-
i0.ɵɵtext(25, "Prompt Filters");
|
|
702
|
-
i0.ɵɵelementEnd();
|
|
703
|
-
i0.ɵɵelementStart(26, "div", 20)(27, "span", 21);
|
|
704
|
-
i0.ɵɵtext(28);
|
|
705
|
-
i0.ɵɵelementEnd();
|
|
706
|
-
i0.ɵɵelementStart(29, "span", 22);
|
|
707
|
-
i0.ɵɵtext(30);
|
|
708
|
-
i0.ɵɵelementEnd()();
|
|
709
|
-
i0.ɵɵelementStart(31, "button", 23);
|
|
710
|
-
i0.ɵɵlistener("click", function PromptManagementV2Component_Template_button_click_31_listener() { return ctx.toggleFilterPanel(); });
|
|
711
|
-
i0.ɵɵelement(32, "i", 24);
|
|
712
|
-
i0.ɵɵelementEnd()();
|
|
713
|
-
i0.ɵɵelementStart(33, "div", 25)(34, "div", 26)(35, "label", 27);
|
|
714
|
-
i0.ɵɵelement(36, "i", 28);
|
|
715
|
-
i0.ɵɵtext(37, " Name ");
|
|
716
|
-
i0.ɵɵelementEnd();
|
|
717
|
-
i0.ɵɵelementStart(38, "input", 29);
|
|
718
|
-
i0.ɵɵlistener("input", function PromptManagementV2Component_Template_input_input_38_listener($event) { return ctx.onSearchChange($event.target.value); });
|
|
719
|
-
i0.ɵɵelementEnd()();
|
|
720
|
-
i0.ɵɵelementStart(39, "div", 26)(40, "label", 27);
|
|
721
|
-
i0.ɵɵelement(41, "i", 30);
|
|
722
|
-
i0.ɵɵtext(42, " Category ");
|
|
723
|
-
i0.ɵɵelementEnd();
|
|
724
|
-
i0.ɵɵelementStart(43, "select", 31);
|
|
725
|
-
i0.ɵɵlistener("change", function PromptManagementV2Component_Template_select_change_43_listener($event) { return ctx.onCategoryChange($event.target.value); });
|
|
726
|
-
i0.ɵɵelementStart(44, "option", 32);
|
|
727
|
-
i0.ɵɵtext(45, "All Categories");
|
|
728
|
-
i0.ɵɵelementEnd();
|
|
729
|
-
i0.ɵɵrepeaterCreate(46, PromptManagementV2Component_For_47_Template, 2, 2, "option", 33, _forTrack0);
|
|
730
|
-
i0.ɵɵelementEnd()();
|
|
731
|
-
i0.ɵɵelementStart(48, "div", 26)(49, "label", 27);
|
|
732
|
-
i0.ɵɵelement(50, "i", 34);
|
|
733
|
-
i0.ɵɵtext(51, " Type ");
|
|
734
|
-
i0.ɵɵelementEnd();
|
|
735
|
-
i0.ɵɵelementStart(52, "select", 31);
|
|
736
|
-
i0.ɵɵlistener("change", function PromptManagementV2Component_Template_select_change_52_listener($event) { return ctx.onTypeChange($event.target.value); });
|
|
737
|
-
i0.ɵɵelementStart(53, "option", 32);
|
|
738
|
-
i0.ɵɵtext(54, "All Types");
|
|
739
|
-
i0.ɵɵelementEnd();
|
|
740
|
-
i0.ɵɵrepeaterCreate(55, PromptManagementV2Component_For_56_Template, 2, 2, "option", 33, _forTrack0);
|
|
741
|
-
i0.ɵɵelementEnd()();
|
|
742
|
-
i0.ɵɵelementStart(57, "div", 26)(58, "label", 27);
|
|
743
|
-
i0.ɵɵelement(59, "i", 35);
|
|
744
|
-
i0.ɵɵtext(60, " Status ");
|
|
745
|
-
i0.ɵɵelementEnd();
|
|
746
|
-
i0.ɵɵelementStart(61, "select", 31);
|
|
747
|
-
i0.ɵɵlistener("change", function PromptManagementV2Component_Template_select_change_61_listener($event) { return ctx.onStatusChange($event.target.value); });
|
|
748
|
-
i0.ɵɵelementStart(62, "option", 32);
|
|
749
|
-
i0.ɵɵtext(63, "All Statuses");
|
|
750
|
-
i0.ɵɵelementEnd();
|
|
751
|
-
i0.ɵɵelementStart(64, "option", 36);
|
|
752
|
-
i0.ɵɵtext(65, "Active");
|
|
753
|
-
i0.ɵɵelementEnd();
|
|
754
|
-
i0.ɵɵelementStart(66, "option", 37);
|
|
755
|
-
i0.ɵɵtext(67, "Inactive");
|
|
756
|
-
i0.ɵɵelementEnd()()();
|
|
757
|
-
i0.ɵɵelementStart(68, "div", 38)(69, "button", 39);
|
|
758
|
-
i0.ɵɵlistener("click", function PromptManagementV2Component_Template_button_click_69_listener() { return ctx.clearFilters(); });
|
|
759
|
-
i0.ɵɵelement(70, "i", 40);
|
|
760
|
-
i0.ɵɵtext(71, " Reset Filters ");
|
|
761
|
-
i0.ɵɵelementEnd()()()()();
|
|
762
|
-
i0.ɵɵelementStart(72, "kendo-splitter-pane", 41)(73, "div", 42);
|
|
763
|
-
i0.ɵɵtemplate(74, PromptManagementV2Component_Conditional_74_Template, 2, 1, "div", 43)(75, PromptManagementV2Component_Conditional_75_Template, 2, 1);
|
|
764
|
-
i0.ɵɵelementEnd()()()()();
|
|
765
|
-
} if (rf & 2) {
|
|
766
|
-
i0.ɵɵadvance(8);
|
|
767
|
-
i0.ɵɵconditional(ctx.showFilters ? 8 : 9);
|
|
768
|
-
i0.ɵɵadvance(3);
|
|
769
|
-
i0.ɵɵtextInterpolate1("", ctx.filteredPrompts.length, " prompts");
|
|
770
|
-
i0.ɵɵadvance(3);
|
|
771
|
-
i0.ɵɵclassProp("active", ctx.viewMode === "grid");
|
|
772
|
-
i0.ɵɵadvance(2);
|
|
773
|
-
i0.ɵɵclassProp("active", ctx.viewMode === "list");
|
|
774
|
-
i0.ɵɵadvance(2);
|
|
775
|
-
i0.ɵɵconditional(ctx.UserCanCreatePrompts ? 18 : -1);
|
|
776
|
-
i0.ɵɵadvance(3);
|
|
777
|
-
i0.ɵɵproperty("size", ctx.showFilters ? "320px" : "0px")("collapsible", false)("resizable", ctx.showFilters)("scrollable", false)("hidden", !ctx.showFilters);
|
|
778
|
-
i0.ɵɵadvance(7);
|
|
779
|
-
i0.ɵɵtextInterpolate(ctx.filteredPrompts.length);
|
|
780
|
-
i0.ɵɵadvance(2);
|
|
781
|
-
i0.ɵɵtextInterpolate1("of ", ctx.prompts.length, "");
|
|
782
|
-
i0.ɵɵadvance(8);
|
|
783
|
-
i0.ɵɵproperty("value", ctx.searchTerm);
|
|
784
|
-
i0.ɵɵadvance(5);
|
|
785
|
-
i0.ɵɵproperty("value", ctx.selectedCategory);
|
|
786
|
-
i0.ɵɵadvance(3);
|
|
787
|
-
i0.ɵɵrepeater(ctx.categories);
|
|
788
|
-
i0.ɵɵadvance(6);
|
|
789
|
-
i0.ɵɵproperty("value", ctx.selectedType);
|
|
790
|
-
i0.ɵɵadvance(3);
|
|
791
|
-
i0.ɵɵrepeater(ctx.types);
|
|
792
|
-
i0.ɵɵadvance(6);
|
|
793
|
-
i0.ɵɵproperty("value", ctx.selectedStatus);
|
|
794
|
-
i0.ɵɵadvance(11);
|
|
795
|
-
i0.ɵɵproperty("resizable", true)("scrollable", true);
|
|
796
|
-
i0.ɵɵadvance(2);
|
|
797
|
-
i0.ɵɵconditional(ctx.isLoading ? 74 : -1);
|
|
798
|
-
i0.ɵɵadvance();
|
|
799
|
-
i0.ɵɵconditional(!ctx.isLoading ? 75 : -1);
|
|
800
|
-
} }, dependencies: [i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i4.SplitterComponent, i4.SplitterPaneComponent, i5.LoadingComponent], styles: ["\n\n.prompt-management-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #f5f7fa;\n}\n\n\n\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\n\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.control-btn[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #dee2e6;\n padding: 8px 16px;\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: #f8f9fa;\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: #1485a3;\n border-color: #1485a3;\n}\n\n\n\n.main-content[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n.main-splitter[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\n\n\n\n.filter-panel[_ngcontent-%COMP%] {\n height: 100%;\n background: white;\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.filter-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n}\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] {\n display: flex;\n align-items: baseline;\n gap: 4px;\n font-size: 12px;\n}\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-value[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #17a2b8;\n}\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-label[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: #6c757d;\n border-radius: 4px;\n transition: all 0.2s;\n}\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%]:hover {\n background: #f0f0f0;\n color: #333;\n}\n\n.filter-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n.filter-group[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n font-size: 12px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #17a2b8;\n}\n\n.filter-input[_ngcontent-%COMP%], \n.filter-select[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n}\n.filter-input[_ngcontent-%COMP%]:focus, \n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #17a2b8;\n}\n.filter-input[_ngcontent-%COMP%]::placeholder, \n.filter-select[_ngcontent-%COMP%]::placeholder {\n color: #adb5bd;\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.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 16px;\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n color: #6c757d;\n font-size: 14px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: all 0.2s;\n}\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #ced4da;\n color: #495057;\n}\n\n\n\n.prompts-content[_ngcontent-%COMP%] {\n height: 100%;\n overflow-y: auto;\n padding: 24px;\n background: #f5f7fa;\n}\n\n\n\n.prompts-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\n.prompt-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n transform: translateY(-2px);\n}\n\n.prompt-card.expanded[_ngcontent-%COMP%] {\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);\n}\n\n.card-header[_ngcontent-%COMP%] {\n padding: 20px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n cursor: pointer;\n user-select: none;\n border-bottom: 1px solid #f0f4f8;\n}\n\n.prompt-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n flex: 1;\n}\n\n.prompt-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: #17a2b8;\n}\n\n.prompt-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: white;\n font-size: 20px;\n}\n\n.prompt-details[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.prompt-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n margin-bottom: 6px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.prompt-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.meta-item[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6c757d;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.meta-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.meta-item.status-active[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.meta-item.status-pending[_ngcontent-%COMP%] {\n color: #ffc107;\n}\n\n.meta-item.status-inactive[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #6c757d;\n transition: transform 0.3s ease;\n}\n\n.expand-icon.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.card-body[_ngcontent-%COMP%] {\n padding: 0 20px 20px 20px;\n}\n\n.prompt-description[_ngcontent-%COMP%] {\n margin: 16px 0 0 0;\n font-size: 14px;\n line-height: 1.6;\n color: #6c757d;\n}\n\n.prompt-description.text-muted[_ngcontent-%COMP%] {\n font-style: italic;\n color: #adb5bd;\n}\n\n\n\n.expanded-content[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #f0f4f8;\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.prompt-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 16px;\n}\n\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #495057;\n font-weight: 500;\n}\n\n\n\n.card-actions[_ngcontent-%COMP%] {\n padding: 16px 20px;\n background: #f8f9fa;\n border-top: 1px solid #e0e6ed;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #dee2e6;\n padding: 6px 16px;\n border-radius: 6px;\n font-size: 13px;\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: 6px;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #ced4da;\n}\n\n.action-btn-primary[_ngcontent-%COMP%] {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.action-btn-primary[_ngcontent-%COMP%]:hover {\n background: #1485a3;\n border-color: #1485a3;\n}\n\n\n\n.prompts-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.prompts-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.prompts-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border-bottom: 2px solid #e0e6ed;\n}\n\n.prompts-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\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.prompts-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 1px solid #f0f4f8;\n}\n\n.prompts-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n}\n\n.prompts-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 16px;\n font-size: 14px;\n color: #495057;\n}\n\n.prompt-name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.prompt-icon-small[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: #17a2b8;\n}\n\n.prompt-icon-small[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: white;\n font-size: 16px;\n}\n\n.prompt-description-small[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6c757d;\n margin-top: 2px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 4px 12px;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.status-badge.status-active[_ngcontent-%COMP%] {\n background: #d4edda;\n color: #155724;\n}\n\n.status-badge.status-pending[_ngcontent-%COMP%] {\n background: #fff3cd;\n color: #856404;\n}\n\n.status-badge.status-inactive[_ngcontent-%COMP%] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.status-badge.status-unknown[_ngcontent-%COMP%] {\n background: #f8f9fa;\n color: #6c757d;\n}\n\n.table-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.action-btn-small[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #dee2e6;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.action-btn-small[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #ced4da;\n}\n\n.action-btn-small.primary[_ngcontent-%COMP%] {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.action-btn-small.primary[_ngcontent-%COMP%]:hover {\n background: #1485a3;\n border-color: #1485a3;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 80px 20px;\n color: #6c757d;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 64px;\n color: #dee2e6;\n margin-bottom: 24px;\n display: block;\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n color: #495057;\n font-weight: 600;\n margin-bottom: 12px;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 15px;\n line-height: 1.6;\n max-width: 400px;\n margin: 0 auto 24px;\n}\n\n.empty-state-btn[_ngcontent-%COMP%] {\n background: #17a2b8;\n color: white;\n border: none;\n padding: 10px 24px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.empty-state-btn[_ngcontent-%COMP%]:hover {\n background: #1485a3;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);\n}\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 400px;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n display: inline-block;\n margin-bottom: 16px;\n}\n\n.spinner-ring[_ngcontent-%COMP%] {\n display: inline-block;\n width: 40px;\n height: 40px;\n margin: 3px;\n border-radius: 50%;\n border: 3px solid #17a2b8;\n border-color: #17a2b8 transparent #17a2b8 transparent;\n animation: _ngcontent-%COMP%_spinner-ring 1.2s linear infinite;\n}\n\n@keyframes _ngcontent-%COMP%_spinner-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n.loading-text[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 14px;\n}\n\n\n\n@media (max-width: 768px) {\n .dashboard-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n }\n .header-info[_ngcontent-%COMP%] {\n justify-content: space-between;\n }\n .header-controls[_ngcontent-%COMP%] {\n justify-content: space-between;\n }\n .prompts-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .prompt-stats[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}"] });
|
|
801
|
-
};
|
|
802
|
-
PromptManagementV2Component = __decorate([
|
|
803
|
-
RegisterClass(BaseResourceComponent, 'AIPromptsResource')
|
|
804
|
-
], PromptManagementV2Component);
|
|
805
|
-
export { PromptManagementV2Component };
|
|
806
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PromptManagementV2Component, [{
|
|
807
|
-
type: Component,
|
|
808
|
-
args: [{ selector: 'app-prompt-management-v2', template: "<div class=\"prompt-management-container\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <h2 class=\"dashboard-title\">\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\">\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 </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 <!-- Main Content with Splitter -->\n <div class=\"main-content\">\n <kendo-splitter\n class=\"main-splitter\"\n orientation=\"horizontal\">\n\n <!-- Filter Panel (Left) -->\n <kendo-splitter-pane\n [size]=\"showFilters ? '320px' : '0px'\"\n [collapsible]=\"false\"\n [resizable]=\"showFilters\"\n [scrollable]=\"false\"\n [hidden]=\"!showFilters\">\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 <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <i class=\"fa-solid fa-search\"></i>\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 <i class=\"fa-solid fa-folder\"></i>\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 <i class=\"fa-solid fa-tag\"></i>\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 <i class=\"fa-solid fa-toggle-on\"></i>\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 <i class=\"fa-solid fa-undo\"></i>\n Reset Filters\n </button>\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n\n <!-- Prompts List Panel -->\n <kendo-splitter-pane\n [resizable]=\"true\"\n [scrollable]=\"true\">\n <div class=\"prompts-content\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"currentLoadingMessage\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Prompts Display -->\n @if (!isLoading) {\n @if (filteredPrompts.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-message\"></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\n type=\"button\"\n class=\"empty-state-btn\"\n (click)=\"createNewPrompt()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n } @else {\n <!-- Grid View -->\n @if (viewMode === 'grid') {\n <div class=\"prompts-grid\">\n @for (prompt of filteredPrompts; track prompt.ID) {\n <div class=\"prompt-card\" [class.expanded]=\"expandedPromptId === prompt.ID\">\n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"togglePromptExpansion(prompt.ID)\">\n <div class=\"prompt-info\">\n <div class=\"prompt-icon\">\n <i [class]=\"getPromptIcon(prompt)\"></i>\n </div>\n <div class=\"prompt-details\">\n <h4 class=\"prompt-name\">{{ prompt.Name }}</h4>\n <div class=\"prompt-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ prompt.CategoryName }}\n </span>\n @if (prompt.Status) {\n <span class=\"meta-item\" [class]=\"'status-' + prompt.Status.toLowerCase()\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n {{ prompt.Status }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <i class=\"fa-solid fa-chevron-down expand-icon\"\n [class.rotated]=\"expandedPromptId === prompt.ID\"></i>\n </div>\n\n <!-- Card Body -->\n <div class=\"card-body\">\n @if (prompt.Description) {\n <p class=\"prompt-description\">{{ prompt.Description }}</p>\n } @else {\n <p class=\"prompt-description text-muted\">No description provided</p>\n }\n\n <!-- Expandable Content -->\n @if (expandedPromptId === prompt.ID) {\n <div class=\"expanded-content\">\n <div class=\"prompt-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Type</span>\n <span class=\"stat-value\">{{ prompt.TypeName }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Template</span>\n <span class=\"stat-value\">\n @if (prompt.TemplateEntity) {\n <i class=\"fa-solid fa-check\" style=\"color: #28a745;\"></i> Yes\n } @else {\n <i class=\"fa-solid fa-times\" style=\"color: #dc3545;\"></i> No\n }\n </span>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Card Actions -->\n <div class=\"card-actions\">\n @if (UserCanReadPrompts) {\n <button\n type=\"button\"\n class=\"action-btn\"\n (click)=\"openPrompt(prompt.ID); $event.stopPropagation()\"\n title=\"Open Prompt\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open\n </button>\n }\n\n @if (prompt.Status === 'Active' && UserCanReadPrompts) {\n <button\n type=\"button\"\n class=\"action-btn action-btn-primary\"\n (click)=\"testPrompt(prompt.ID, $event)\"\n title=\"Run Prompt\">\n <i class=\"fa-solid fa-play\"></i>\n Run\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- List View -->\n @if (viewMode === 'list') {\n <div class=\"prompts-list\">\n <table class=\"prompts-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=\"prompt-name-cell\">\n <div class=\"prompt-icon-small\">\n <i [class]=\"getPromptIcon(prompt)\"></i>\n </div>\n <div>\n <div class=\"prompt-name\">{{ prompt.Name }}</div>\n @if (prompt.Description) {\n <div class=\"prompt-description-small\">{{ prompt.Description }}</div>\n }\n </div>\n </div>\n </td>\n <td>{{ prompt.CategoryName }}</td>\n <td>{{ prompt.TypeName }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"'status-' + (prompt.Status || 'unknown').toLowerCase()\">\n {{ prompt.Status || 'Unknown' }}\n </span>\n </td>\n <td>\n @if (prompt.TemplateEntity) {\n <i class=\"fa-solid fa-check-circle\" style=\"color: #28a745;\"></i>\n } @else {\n <i class=\"fa-solid fa-times-circle\" style=\"color: #6c757d;\"></i>\n }\n </td>\n <td>\n <div class=\"table-actions\">\n @if (UserCanReadPrompts) {\n <button\n type=\"button\"\n class=\"action-btn-small\"\n (click)=\"openPrompt(prompt.ID)\"\n title=\"Open Prompt\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n }\n @if (prompt.Status === 'Active' && UserCanReadPrompts) {\n <button\n type=\"button\"\n class=\"action-btn-small primary\"\n (click)=\"testPrompt(prompt.ID, $event)\"\n title=\"Run Prompt\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n</div>\n", styles: ["/* Prompt Management Component - Modern Design */\n.prompt-management-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #f5f7fa;\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-btn {\n background: white;\n border: 1px solid #dee2e6;\n padding: 8px 16px;\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: #f8f9fa;\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: #1485a3;\n border-color: #1485a3;\n}\n\n/* Main Content */\n.main-content {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n.main-splitter {\n flex: 1;\n min-height: 0;\n}\n\n/* Filter Panel */\n.filter-panel {\n height: 100%;\n background: white;\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.filter-panel-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n}\n.filter-panel-header .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n font-size: 12px;\n}\n.filter-panel-header .filter-summary-inline .summary-value {\n font-weight: 600;\n color: #17a2b8;\n}\n.filter-panel-header .filter-summary-inline .summary-label {\n color: #6c757d;\n}\n.filter-panel-header .close-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: #6c757d;\n border-radius: 4px;\n transition: all 0.2s;\n}\n.filter-panel-header .close-btn:hover {\n background: #f0f0f0;\n color: #333;\n}\n\n.filter-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n.filter-group {\n margin-bottom: 20px;\n}\n.filter-group .filter-label {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n font-size: 12px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n.filter-group .filter-label i {\n font-size: 12px;\n color: #17a2b8;\n}\n\n.filter-input,\n.filter-select {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n}\n.filter-input:focus,\n.filter-select:focus {\n outline: none;\n border-color: #17a2b8;\n}\n.filter-input::placeholder,\n.filter-select::placeholder {\n color: #adb5bd;\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.filter-actions .reset-btn {\n width: 100%;\n padding: 10px 16px;\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n color: #6c757d;\n font-size: 14px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: all 0.2s;\n}\n.filter-actions .reset-btn:hover {\n background: #e9ecef;\n border-color: #ced4da;\n color: #495057;\n}\n\n/* Prompts Content */\n.prompts-content {\n height: 100%;\n overflow-y: auto;\n padding: 24px;\n background: #f5f7fa;\n}\n\n/* Grid View */\n.prompts-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\n.prompt-card:hover {\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n transform: translateY(-2px);\n}\n\n.prompt-card.expanded {\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);\n}\n\n.card-header {\n padding: 20px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n cursor: pointer;\n user-select: none;\n border-bottom: 1px solid #f0f4f8;\n}\n\n.prompt-info {\n display: flex;\n gap: 16px;\n flex: 1;\n}\n\n.prompt-icon {\n width: 48px;\n height: 48px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: #17a2b8;\n}\n\n.prompt-icon i {\n color: white;\n font-size: 20px;\n}\n\n.prompt-details {\n flex: 1;\n min-width: 0;\n}\n\n.prompt-name {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n margin-bottom: 6px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.prompt-meta {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.meta-item {\n font-size: 13px;\n color: #6c757d;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.meta-item i {\n font-size: 12px;\n}\n\n.meta-item.status-active {\n color: #28a745;\n}\n\n.meta-item.status-pending {\n color: #ffc107;\n}\n\n.meta-item.status-inactive {\n color: #6c757d;\n}\n\n.expand-icon {\n font-size: 14px;\n color: #6c757d;\n transition: transform 0.3s ease;\n}\n\n.expand-icon.rotated {\n transform: rotate(180deg);\n}\n\n.card-body {\n padding: 0 20px 20px 20px;\n}\n\n.prompt-description {\n margin: 16px 0 0 0;\n font-size: 14px;\n line-height: 1.6;\n color: #6c757d;\n}\n\n.prompt-description.text-muted {\n font-style: italic;\n color: #adb5bd;\n}\n\n/* Expanded Content */\n.expanded-content {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #f0f4f8;\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.prompt-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 16px;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat-label {\n font-size: 12px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat-value {\n font-size: 14px;\n color: #495057;\n font-weight: 500;\n}\n\n/* Card Actions */\n.card-actions {\n padding: 16px 20px;\n background: #f8f9fa;\n border-top: 1px solid #e0e6ed;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.action-btn {\n background: white;\n border: 1px solid #dee2e6;\n padding: 6px 16px;\n border-radius: 6px;\n font-size: 13px;\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: 6px;\n}\n\n.action-btn:hover {\n background: #f8f9fa;\n border-color: #ced4da;\n}\n\n.action-btn-primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.action-btn-primary:hover {\n background: #1485a3;\n border-color: #1485a3;\n}\n\n/* List View */\n.prompts-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.prompts-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.prompts-table thead {\n background: #f8f9fa;\n border-bottom: 2px solid #e0e6ed;\n}\n\n.prompts-table 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.prompts-table tbody tr {\n border-bottom: 1px solid #f0f4f8;\n}\n\n.prompts-table tbody tr:hover {\n background: #f8f9fa;\n}\n\n.prompts-table td {\n padding: 16px;\n font-size: 14px;\n color: #495057;\n}\n\n.prompt-name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.prompt-icon-small {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: #17a2b8;\n}\n\n.prompt-icon-small i {\n color: white;\n font-size: 16px;\n}\n\n.prompt-description-small {\n font-size: 13px;\n color: #6c757d;\n margin-top: 2px;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n padding: 4px 12px;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.status-badge.status-active {\n background: #d4edda;\n color: #155724;\n}\n\n.status-badge.status-pending {\n background: #fff3cd;\n color: #856404;\n}\n\n.status-badge.status-inactive {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.status-badge.status-unknown {\n background: #f8f9fa;\n color: #6c757d;\n}\n\n.table-actions {\n display: flex;\n gap: 8px;\n}\n\n.action-btn-small {\n background: white;\n border: 1px solid #dee2e6;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.action-btn-small:hover {\n background: #f8f9fa;\n border-color: #ced4da;\n}\n\n.action-btn-small.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.action-btn-small.primary:hover {\n background: #1485a3;\n border-color: #1485a3;\n}\n\n/* Empty State */\n.empty-state {\n text-align: center;\n padding: 80px 20px;\n color: #6c757d;\n}\n\n.empty-state i {\n font-size: 64px;\n color: #dee2e6;\n margin-bottom: 24px;\n display: block;\n}\n\n.empty-state h3 {\n color: #495057;\n font-weight: 600;\n margin-bottom: 12px;\n}\n\n.empty-state p {\n font-size: 15px;\n line-height: 1.6;\n max-width: 400px;\n margin: 0 auto 24px;\n}\n\n.empty-state-btn {\n background: #17a2b8;\n color: white;\n border: none;\n padding: 10px 24px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.empty-state-btn:hover {\n background: #1485a3;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);\n}\n\n/* Loading State */\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 400px;\n}\n\n.loading-content {\n text-align: center;\n}\n\n.loading-spinner {\n display: inline-block;\n margin-bottom: 16px;\n}\n\n.spinner-ring {\n display: inline-block;\n width: 40px;\n height: 40px;\n margin: 3px;\n border-radius: 50%;\n border: 3px solid #17a2b8;\n border-color: #17a2b8 transparent #17a2b8 transparent;\n animation: spinner-ring 1.2s linear infinite;\n}\n\n@keyframes spinner-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n.loading-text {\n color: #6c757d;\n font-size: 14px;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .dashboard-header {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n }\n .header-info {\n justify-content: space-between;\n }\n .header-controls {\n justify-content: space-between;\n }\n .prompts-grid {\n grid-template-columns: 1fr;\n }\n .prompt-stats {\n grid-template-columns: 1fr;\n }\n}\n"] }]
|
|
809
|
-
}], () => [{ type: i1.SharedService }, { type: i2.AITestHarnessDialogService }, { type: i1.NavigationService }], null); })();
|
|
810
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PromptManagementV2Component, { className: "PromptManagementV2Component", filePath: "src/AI/components/prompts/prompt-management-v2.component.ts", lineNumber: 36 }); })();
|
|
811
|
-
//# sourceMappingURL=prompt-management-v2.component.js.map
|