@memberjunction/ng-dashboards 2.127.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/components/view-config-panel/view-config-panel.component.d.ts +3 -3
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +50 -19
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +17 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +77 -45
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +36 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +552 -368
- 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 -94
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +94 -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
|
@@ -0,0 +1,1079 @@
|
|
|
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, CompositeKey } from '@memberjunction/core';
|
|
11
|
+
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
12
|
+
import { TemplateEngineBase } from '@memberjunction/templates-base-types';
|
|
13
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
14
|
+
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
15
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "@memberjunction/ng-shared";
|
|
18
|
+
import * as i2 from "@memberjunction/ng-ai-test-harness";
|
|
19
|
+
import * as i3 from "@angular/forms";
|
|
20
|
+
import * as i4 from "@progress/kendo-angular-layout";
|
|
21
|
+
import * as i5 from "@memberjunction/ng-shared-generic";
|
|
22
|
+
import * as i6 from "@angular/common";
|
|
23
|
+
const _forTrack0 = ($index, $item) => $item.ID;
|
|
24
|
+
function PromptManagementComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
25
|
+
i0.ɵɵtext(0, " Hide Filters ");
|
|
26
|
+
} }
|
|
27
|
+
function PromptManagementComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
+
i0.ɵɵtext(0, " Show Filters ");
|
|
29
|
+
} }
|
|
30
|
+
function PromptManagementComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
31
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
32
|
+
i0.ɵɵelementStart(0, "button", 46);
|
|
33
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Conditional_18_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createNewPrompt()); });
|
|
34
|
+
i0.ɵɵelement(1, "i", 47);
|
|
35
|
+
i0.ɵɵtext(2, " New Prompt ");
|
|
36
|
+
i0.ɵɵelementEnd();
|
|
37
|
+
} }
|
|
38
|
+
function PromptManagementComponent_For_47_Template(rf, ctx) { if (rf & 1) {
|
|
39
|
+
i0.ɵɵelementStart(0, "option", 33);
|
|
40
|
+
i0.ɵɵtext(1);
|
|
41
|
+
i0.ɵɵelementEnd();
|
|
42
|
+
} if (rf & 2) {
|
|
43
|
+
const category_r3 = ctx.$implicit;
|
|
44
|
+
i0.ɵɵproperty("value", category_r3.ID);
|
|
45
|
+
i0.ɵɵadvance();
|
|
46
|
+
i0.ɵɵtextInterpolate(category_r3.Name);
|
|
47
|
+
} }
|
|
48
|
+
function PromptManagementComponent_For_56_Template(rf, ctx) { if (rf & 1) {
|
|
49
|
+
i0.ɵɵelementStart(0, "option", 33);
|
|
50
|
+
i0.ɵɵtext(1);
|
|
51
|
+
i0.ɵɵelementEnd();
|
|
52
|
+
} if (rf & 2) {
|
|
53
|
+
const type_r4 = ctx.$implicit;
|
|
54
|
+
i0.ɵɵproperty("value", type_r4.ID);
|
|
55
|
+
i0.ɵɵadvance();
|
|
56
|
+
i0.ɵɵtextInterpolate(type_r4.Name);
|
|
57
|
+
} }
|
|
58
|
+
function PromptManagementComponent_Conditional_74_Template(rf, ctx) { if (rf & 1) {
|
|
59
|
+
i0.ɵɵelementStart(0, "div", 43);
|
|
60
|
+
i0.ɵɵelement(1, "mj-loading", 48);
|
|
61
|
+
i0.ɵɵelementEnd();
|
|
62
|
+
} if (rf & 2) {
|
|
63
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
64
|
+
i0.ɵɵadvance();
|
|
65
|
+
i0.ɵɵproperty("text", ctx_r1.currentLoadingMessage);
|
|
66
|
+
} }
|
|
67
|
+
function PromptManagementComponent_Conditional_75_Conditional_0_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
68
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
69
|
+
i0.ɵɵelementStart(0, "button", 51);
|
|
70
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_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()); });
|
|
71
|
+
i0.ɵɵelement(1, "i", 47);
|
|
72
|
+
i0.ɵɵtext(2, " Create New Prompt ");
|
|
73
|
+
i0.ɵɵelementEnd();
|
|
74
|
+
} }
|
|
75
|
+
function PromptManagementComponent_Conditional_75_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
76
|
+
i0.ɵɵelementStart(0, "div", 49);
|
|
77
|
+
i0.ɵɵelement(1, "i", 4);
|
|
78
|
+
i0.ɵɵelementStart(2, "h3");
|
|
79
|
+
i0.ɵɵtext(3, "No prompts found");
|
|
80
|
+
i0.ɵɵelementEnd();
|
|
81
|
+
i0.ɵɵelementStart(4, "p");
|
|
82
|
+
i0.ɵɵtext(5);
|
|
83
|
+
i0.ɵɵelementEnd();
|
|
84
|
+
i0.ɵɵtemplate(6, PromptManagementComponent_Conditional_75_Conditional_0_Conditional_6_Template, 3, 0, "button", 50);
|
|
85
|
+
i0.ɵɵelementEnd();
|
|
86
|
+
} if (rf & 2) {
|
|
87
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
88
|
+
i0.ɵɵadvance(5);
|
|
89
|
+
i0.ɵɵtextInterpolate(ctx_r1.hasActiveFilters ? "Try adjusting your filters" : "Create your first AI prompt to get started");
|
|
90
|
+
i0.ɵɵadvance();
|
|
91
|
+
i0.ɵɵconditional(!ctx_r1.hasActiveFilters && ctx_r1.UserCanCreatePrompts ? 6 : -1);
|
|
92
|
+
} }
|
|
93
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
94
|
+
i0.ɵɵelementStart(0, "span", 62);
|
|
95
|
+
i0.ɵɵelement(1, "i", 72);
|
|
96
|
+
i0.ɵɵtext(2);
|
|
97
|
+
i0.ɵɵelementEnd();
|
|
98
|
+
} if (rf & 2) {
|
|
99
|
+
const prompt_r7 = i0.ɵɵnextContext().$implicit;
|
|
100
|
+
i0.ɵɵclassMap("status-" + prompt_r7.Status.toLowerCase());
|
|
101
|
+
i0.ɵɵadvance(2);
|
|
102
|
+
i0.ɵɵtextInterpolate1(" ", prompt_r7.Status, " ");
|
|
103
|
+
} }
|
|
104
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
105
|
+
i0.ɵɵelementStart(0, "p", 66);
|
|
106
|
+
i0.ɵɵtext(1);
|
|
107
|
+
i0.ɵɵelementEnd();
|
|
108
|
+
} if (rf & 2) {
|
|
109
|
+
const prompt_r7 = i0.ɵɵnextContext().$implicit;
|
|
110
|
+
i0.ɵɵadvance();
|
|
111
|
+
i0.ɵɵtextInterpolate(prompt_r7.Description);
|
|
112
|
+
} }
|
|
113
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
114
|
+
i0.ɵɵelementStart(0, "p", 67);
|
|
115
|
+
i0.ɵɵtext(1, "No description provided");
|
|
116
|
+
i0.ɵɵelementEnd();
|
|
117
|
+
} }
|
|
118
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_17_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
119
|
+
i0.ɵɵelement(0, "i", 77);
|
|
120
|
+
i0.ɵɵtext(1, " Yes ");
|
|
121
|
+
} }
|
|
122
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_17_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
123
|
+
i0.ɵɵelement(0, "i", 78);
|
|
124
|
+
i0.ɵɵtext(1, " No ");
|
|
125
|
+
} }
|
|
126
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
127
|
+
i0.ɵɵelementStart(0, "div", 68)(1, "div", 73)(2, "div", 74)(3, "span", 75);
|
|
128
|
+
i0.ɵɵtext(4, "Type");
|
|
129
|
+
i0.ɵɵelementEnd();
|
|
130
|
+
i0.ɵɵelementStart(5, "span", 76);
|
|
131
|
+
i0.ɵɵtext(6);
|
|
132
|
+
i0.ɵɵelementEnd()();
|
|
133
|
+
i0.ɵɵelementStart(7, "div", 74)(8, "span", 75);
|
|
134
|
+
i0.ɵɵtext(9, "Template");
|
|
135
|
+
i0.ɵɵelementEnd();
|
|
136
|
+
i0.ɵɵelementStart(10, "span", 76);
|
|
137
|
+
i0.ɵɵtemplate(11, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_17_Conditional_11_Template, 2, 0)(12, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_17_Conditional_12_Template, 2, 0);
|
|
138
|
+
i0.ɵɵelementEnd()()()();
|
|
139
|
+
} if (rf & 2) {
|
|
140
|
+
const prompt_r7 = i0.ɵɵnextContext().$implicit;
|
|
141
|
+
i0.ɵɵadvance(6);
|
|
142
|
+
i0.ɵɵtextInterpolate(prompt_r7.TypeName);
|
|
143
|
+
i0.ɵɵadvance(5);
|
|
144
|
+
i0.ɵɵconditional(prompt_r7.TemplateEntity ? 11 : 12);
|
|
145
|
+
} }
|
|
146
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
147
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
148
|
+
i0.ɵɵelementStart(0, "button", 79);
|
|
149
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_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); return i0.ɵɵresetView(ctx_r1.showPromptDetails(prompt_r7, $event)); });
|
|
150
|
+
i0.ɵɵelement(1, "i", 80);
|
|
151
|
+
i0.ɵɵtext(2, " Details ");
|
|
152
|
+
i0.ɵɵelementEnd();
|
|
153
|
+
} }
|
|
154
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
155
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
156
|
+
i0.ɵɵelementStart(0, "button", 81);
|
|
157
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_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)); });
|
|
158
|
+
i0.ɵɵelement(1, "i", 82);
|
|
159
|
+
i0.ɵɵtext(2, " Run ");
|
|
160
|
+
i0.ɵɵelementEnd();
|
|
161
|
+
} }
|
|
162
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
163
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
164
|
+
i0.ɵɵelementStart(0, "div", 55)(1, "div", 56);
|
|
165
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_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)); });
|
|
166
|
+
i0.ɵɵelementStart(2, "div", 57)(3, "div", 58);
|
|
167
|
+
i0.ɵɵelement(4, "i");
|
|
168
|
+
i0.ɵɵelementEnd();
|
|
169
|
+
i0.ɵɵelementStart(5, "div", 59)(6, "h4", 60);
|
|
170
|
+
i0.ɵɵtext(7);
|
|
171
|
+
i0.ɵɵelementEnd();
|
|
172
|
+
i0.ɵɵelementStart(8, "div", 61)(9, "span", 62);
|
|
173
|
+
i0.ɵɵelement(10, "i", 30);
|
|
174
|
+
i0.ɵɵtext(11);
|
|
175
|
+
i0.ɵɵelementEnd();
|
|
176
|
+
i0.ɵɵtemplate(12, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_12_Template, 3, 3, "span", 63);
|
|
177
|
+
i0.ɵɵelementEnd()()();
|
|
178
|
+
i0.ɵɵelement(13, "i", 64);
|
|
179
|
+
i0.ɵɵelementEnd();
|
|
180
|
+
i0.ɵɵelementStart(14, "div", 65);
|
|
181
|
+
i0.ɵɵtemplate(15, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_15_Template, 2, 1, "p", 66)(16, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_16_Template, 2, 0, "p", 67)(17, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_17_Template, 13, 2, "div", 68);
|
|
182
|
+
i0.ɵɵelementEnd();
|
|
183
|
+
i0.ɵɵelementStart(18, "div", 69);
|
|
184
|
+
i0.ɵɵtemplate(19, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_19_Template, 3, 0, "button", 70)(20, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Conditional_20_Template, 3, 0, "button", 71);
|
|
185
|
+
i0.ɵɵelementEnd()();
|
|
186
|
+
} if (rf & 2) {
|
|
187
|
+
const prompt_r7 = ctx.$implicit;
|
|
188
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
189
|
+
i0.ɵɵclassProp("expanded", ctx_r1.expandedPromptId === prompt_r7.ID);
|
|
190
|
+
i0.ɵɵadvance(4);
|
|
191
|
+
i0.ɵɵclassMap(ctx_r1.getPromptIcon(prompt_r7));
|
|
192
|
+
i0.ɵɵadvance(3);
|
|
193
|
+
i0.ɵɵtextInterpolate(prompt_r7.Name);
|
|
194
|
+
i0.ɵɵadvance(4);
|
|
195
|
+
i0.ɵɵtextInterpolate1(" ", prompt_r7.CategoryName, " ");
|
|
196
|
+
i0.ɵɵadvance();
|
|
197
|
+
i0.ɵɵconditional(prompt_r7.Status ? 12 : -1);
|
|
198
|
+
i0.ɵɵadvance();
|
|
199
|
+
i0.ɵɵclassProp("rotated", ctx_r1.expandedPromptId === prompt_r7.ID);
|
|
200
|
+
i0.ɵɵadvance(2);
|
|
201
|
+
i0.ɵɵconditional(prompt_r7.Description ? 15 : 16);
|
|
202
|
+
i0.ɵɵadvance(2);
|
|
203
|
+
i0.ɵɵconditional(ctx_r1.expandedPromptId === prompt_r7.ID ? 17 : -1);
|
|
204
|
+
i0.ɵɵadvance(2);
|
|
205
|
+
i0.ɵɵconditional(ctx_r1.UserCanReadPrompts ? 19 : -1);
|
|
206
|
+
i0.ɵɵadvance();
|
|
207
|
+
i0.ɵɵconditional(prompt_r7.Status === "Active" && ctx_r1.UserCanReadPrompts ? 20 : -1);
|
|
208
|
+
} }
|
|
209
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
210
|
+
i0.ɵɵelementStart(0, "div", 52);
|
|
211
|
+
i0.ɵɵrepeaterCreate(1, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_For_2_Template, 21, 13, "div", 54, _forTrack0);
|
|
212
|
+
i0.ɵɵelementEnd();
|
|
213
|
+
} if (rf & 2) {
|
|
214
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
215
|
+
i0.ɵɵadvance();
|
|
216
|
+
i0.ɵɵrepeater(ctx_r1.filteredPrompts);
|
|
217
|
+
} }
|
|
218
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
219
|
+
i0.ɵɵelementStart(0, "div", 89);
|
|
220
|
+
i0.ɵɵtext(1);
|
|
221
|
+
i0.ɵɵelementEnd();
|
|
222
|
+
} if (rf & 2) {
|
|
223
|
+
const prompt_r11 = i0.ɵɵnextContext().$implicit;
|
|
224
|
+
i0.ɵɵadvance();
|
|
225
|
+
i0.ɵɵtextInterpolate(prompt_r11.Description);
|
|
226
|
+
} }
|
|
227
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
228
|
+
i0.ɵɵelement(0, "i", 91);
|
|
229
|
+
} }
|
|
230
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
231
|
+
i0.ɵɵelement(0, "i", 92);
|
|
232
|
+
} }
|
|
233
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
234
|
+
const _r12 = i0.ɵɵgetCurrentView();
|
|
235
|
+
i0.ɵɵelementStart(0, "button", 96);
|
|
236
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Conditional_21_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r12); const prompt_r11 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.showPromptDetails(prompt_r11)); });
|
|
237
|
+
i0.ɵɵelement(1, "i", 80);
|
|
238
|
+
i0.ɵɵelementEnd();
|
|
239
|
+
} }
|
|
240
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
241
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
242
|
+
i0.ɵɵelementStart(0, "button", 97);
|
|
243
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Conditional_22_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r13); const prompt_r11 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.testPrompt(prompt_r11.ID, $event)); });
|
|
244
|
+
i0.ɵɵelement(1, "i", 82);
|
|
245
|
+
i0.ɵɵelementEnd();
|
|
246
|
+
} }
|
|
247
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Template(rf, ctx) { if (rf & 1) {
|
|
248
|
+
i0.ɵɵelementStart(0, "tr")(1, "td")(2, "div", 87)(3, "div", 88);
|
|
249
|
+
i0.ɵɵelement(4, "i");
|
|
250
|
+
i0.ɵɵelementEnd();
|
|
251
|
+
i0.ɵɵelementStart(5, "div")(6, "div", 60);
|
|
252
|
+
i0.ɵɵtext(7);
|
|
253
|
+
i0.ɵɵelementEnd();
|
|
254
|
+
i0.ɵɵtemplate(8, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Conditional_8_Template, 2, 1, "div", 89);
|
|
255
|
+
i0.ɵɵelementEnd()()();
|
|
256
|
+
i0.ɵɵelementStart(9, "td");
|
|
257
|
+
i0.ɵɵtext(10);
|
|
258
|
+
i0.ɵɵelementEnd();
|
|
259
|
+
i0.ɵɵelementStart(11, "td");
|
|
260
|
+
i0.ɵɵtext(12);
|
|
261
|
+
i0.ɵɵelementEnd();
|
|
262
|
+
i0.ɵɵelementStart(13, "td")(14, "span", 90);
|
|
263
|
+
i0.ɵɵtext(15);
|
|
264
|
+
i0.ɵɵelementEnd()();
|
|
265
|
+
i0.ɵɵelementStart(16, "td");
|
|
266
|
+
i0.ɵɵtemplate(17, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Conditional_17_Template, 1, 0, "i", 91)(18, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Conditional_18_Template, 1, 0, "i", 92);
|
|
267
|
+
i0.ɵɵelementEnd();
|
|
268
|
+
i0.ɵɵelementStart(19, "td")(20, "div", 93);
|
|
269
|
+
i0.ɵɵtemplate(21, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Conditional_21_Template, 2, 0, "button", 94)(22, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Conditional_22_Template, 2, 0, "button", 95);
|
|
270
|
+
i0.ɵɵelementEnd()()();
|
|
271
|
+
} if (rf & 2) {
|
|
272
|
+
const prompt_r11 = ctx.$implicit;
|
|
273
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
274
|
+
i0.ɵɵadvance(4);
|
|
275
|
+
i0.ɵɵclassMap(ctx_r1.getPromptIcon(prompt_r11));
|
|
276
|
+
i0.ɵɵadvance(3);
|
|
277
|
+
i0.ɵɵtextInterpolate(prompt_r11.Name);
|
|
278
|
+
i0.ɵɵadvance();
|
|
279
|
+
i0.ɵɵconditional(prompt_r11.Description ? 8 : -1);
|
|
280
|
+
i0.ɵɵadvance(2);
|
|
281
|
+
i0.ɵɵtextInterpolate(prompt_r11.CategoryName);
|
|
282
|
+
i0.ɵɵadvance(2);
|
|
283
|
+
i0.ɵɵtextInterpolate(prompt_r11.TypeName);
|
|
284
|
+
i0.ɵɵadvance(2);
|
|
285
|
+
i0.ɵɵclassMap("status-" + (prompt_r11.Status || "unknown").toLowerCase());
|
|
286
|
+
i0.ɵɵadvance();
|
|
287
|
+
i0.ɵɵtextInterpolate1(" ", prompt_r11.Status || "Unknown", " ");
|
|
288
|
+
i0.ɵɵadvance(2);
|
|
289
|
+
i0.ɵɵconditional(prompt_r11.TemplateEntity ? 17 : 18);
|
|
290
|
+
i0.ɵɵadvance(4);
|
|
291
|
+
i0.ɵɵconditional(ctx_r1.UserCanReadPrompts ? 21 : -1);
|
|
292
|
+
i0.ɵɵadvance();
|
|
293
|
+
i0.ɵɵconditional(prompt_r11.Status === "Active" && ctx_r1.UserCanReadPrompts ? 22 : -1);
|
|
294
|
+
} }
|
|
295
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
296
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
297
|
+
i0.ɵɵelementStart(0, "div", 53)(1, "table", 83)(2, "thead")(3, "tr")(4, "th", 84);
|
|
298
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_Template_th_click_4_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.sortBy("Name")); });
|
|
299
|
+
i0.ɵɵelementStart(5, "span", 85);
|
|
300
|
+
i0.ɵɵtext(6, " Name ");
|
|
301
|
+
i0.ɵɵelement(7, "i", 86);
|
|
302
|
+
i0.ɵɵelementEnd()();
|
|
303
|
+
i0.ɵɵelementStart(8, "th", 84);
|
|
304
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_Template_th_click_8_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.sortBy("Category")); });
|
|
305
|
+
i0.ɵɵelementStart(9, "span", 85);
|
|
306
|
+
i0.ɵɵtext(10, " Category ");
|
|
307
|
+
i0.ɵɵelement(11, "i", 86);
|
|
308
|
+
i0.ɵɵelementEnd()();
|
|
309
|
+
i0.ɵɵelementStart(12, "th", 84);
|
|
310
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_Template_th_click_12_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.sortBy("Type")); });
|
|
311
|
+
i0.ɵɵelementStart(13, "span", 85);
|
|
312
|
+
i0.ɵɵtext(14, " Type ");
|
|
313
|
+
i0.ɵɵelement(15, "i", 86);
|
|
314
|
+
i0.ɵɵelementEnd()();
|
|
315
|
+
i0.ɵɵelementStart(16, "th", 84);
|
|
316
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_Template_th_click_16_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.sortBy("Status")); });
|
|
317
|
+
i0.ɵɵelementStart(17, "span", 85);
|
|
318
|
+
i0.ɵɵtext(18, " Status ");
|
|
319
|
+
i0.ɵɵelement(19, "i", 86);
|
|
320
|
+
i0.ɵɵelementEnd()();
|
|
321
|
+
i0.ɵɵelementStart(20, "th");
|
|
322
|
+
i0.ɵɵtext(21, "Template");
|
|
323
|
+
i0.ɵɵelementEnd();
|
|
324
|
+
i0.ɵɵelementStart(22, "th");
|
|
325
|
+
i0.ɵɵtext(23, "Actions");
|
|
326
|
+
i0.ɵɵelementEnd()()();
|
|
327
|
+
i0.ɵɵelementStart(24, "tbody");
|
|
328
|
+
i0.ɵɵrepeaterCreate(25, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_For_26_Template, 23, 12, "tr", null, _forTrack0);
|
|
329
|
+
i0.ɵɵelementEnd()()();
|
|
330
|
+
} if (rf & 2) {
|
|
331
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
332
|
+
i0.ɵɵadvance(4);
|
|
333
|
+
i0.ɵɵclassProp("sorted", ctx_r1.sortColumn === "Name")("desc", ctx_r1.sortColumn === "Name" && ctx_r1.sortDirection === "desc");
|
|
334
|
+
i0.ɵɵadvance(4);
|
|
335
|
+
i0.ɵɵclassProp("sorted", ctx_r1.sortColumn === "Category")("desc", ctx_r1.sortColumn === "Category" && ctx_r1.sortDirection === "desc");
|
|
336
|
+
i0.ɵɵadvance(4);
|
|
337
|
+
i0.ɵɵclassProp("sorted", ctx_r1.sortColumn === "Type")("desc", ctx_r1.sortColumn === "Type" && ctx_r1.sortDirection === "desc");
|
|
338
|
+
i0.ɵɵadvance(4);
|
|
339
|
+
i0.ɵɵclassProp("sorted", ctx_r1.sortColumn === "Status")("desc", ctx_r1.sortColumn === "Status" && ctx_r1.sortDirection === "desc");
|
|
340
|
+
i0.ɵɵadvance(9);
|
|
341
|
+
i0.ɵɵrepeater(ctx_r1.filteredPrompts);
|
|
342
|
+
} }
|
|
343
|
+
function PromptManagementComponent_Conditional_75_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
344
|
+
i0.ɵɵtemplate(0, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_0_Template, 3, 0, "div", 52)(1, PromptManagementComponent_Conditional_75_Conditional_1_Conditional_1_Template, 27, 16, "div", 53);
|
|
345
|
+
} if (rf & 2) {
|
|
346
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
347
|
+
i0.ɵɵconditional(ctx_r1.viewMode === "grid" ? 0 : -1);
|
|
348
|
+
i0.ɵɵadvance();
|
|
349
|
+
i0.ɵɵconditional(ctx_r1.viewMode === "list" ? 1 : -1);
|
|
350
|
+
} }
|
|
351
|
+
function PromptManagementComponent_Conditional_75_Template(rf, ctx) { if (rf & 1) {
|
|
352
|
+
i0.ɵɵtemplate(0, PromptManagementComponent_Conditional_75_Conditional_0_Template, 7, 2, "div", 49)(1, PromptManagementComponent_Conditional_75_Conditional_1_Template, 2, 2);
|
|
353
|
+
} if (rf & 2) {
|
|
354
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
355
|
+
i0.ɵɵconditional(ctx_r1.filteredPrompts.length === 0 ? 0 : 1);
|
|
356
|
+
} }
|
|
357
|
+
function PromptManagementComponent_Conditional_76_Template(rf, ctx) { if (rf & 1) {
|
|
358
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
359
|
+
i0.ɵɵelementStart(0, "div", 98);
|
|
360
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Conditional_76_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeDetailPanel()); });
|
|
361
|
+
i0.ɵɵelementEnd();
|
|
362
|
+
} }
|
|
363
|
+
function PromptManagementComponent_Conditional_78_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
364
|
+
i0.ɵɵelementStart(0, "span", 108);
|
|
365
|
+
i0.ɵɵelement(1, "i", 120);
|
|
366
|
+
i0.ɵɵtext(2, " Has Template ");
|
|
367
|
+
i0.ɵɵelementEnd();
|
|
368
|
+
} }
|
|
369
|
+
function PromptManagementComponent_Conditional_78_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
370
|
+
i0.ɵɵelementStart(0, "div", 106)(1, "h4", 109);
|
|
371
|
+
i0.ɵɵelement(2, "i", 121);
|
|
372
|
+
i0.ɵɵtext(3, " Description ");
|
|
373
|
+
i0.ɵɵelementEnd();
|
|
374
|
+
i0.ɵɵelementStart(4, "p", 122);
|
|
375
|
+
i0.ɵɵtext(5);
|
|
376
|
+
i0.ɵɵelementEnd()();
|
|
377
|
+
} if (rf & 2) {
|
|
378
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
379
|
+
i0.ɵɵadvance(5);
|
|
380
|
+
i0.ɵɵtextInterpolate(ctx_r1.selectedPrompt.Description);
|
|
381
|
+
} }
|
|
382
|
+
function PromptManagementComponent_Conditional_78_Conditional_49_Template(rf, ctx) { if (rf & 1) {
|
|
383
|
+
i0.ɵɵelementStart(0, "div", 112)(1, "span", 113);
|
|
384
|
+
i0.ɵɵtext(2, "Min Power Rank");
|
|
385
|
+
i0.ɵɵelementEnd();
|
|
386
|
+
i0.ɵɵelementStart(3, "span", 114);
|
|
387
|
+
i0.ɵɵtext(4);
|
|
388
|
+
i0.ɵɵelementEnd()();
|
|
389
|
+
} if (rf & 2) {
|
|
390
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
391
|
+
i0.ɵɵadvance(4);
|
|
392
|
+
i0.ɵɵtextInterpolate(ctx_r1.selectedPrompt.MinPowerRank);
|
|
393
|
+
} }
|
|
394
|
+
function PromptManagementComponent_Conditional_78_Conditional_68_Template(rf, ctx) { if (rf & 1) {
|
|
395
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
396
|
+
i0.ɵɵelementStart(0, "button", 123);
|
|
397
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Conditional_78_Conditional_68_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.testPrompt(ctx_r1.selectedPrompt.ID)); });
|
|
398
|
+
i0.ɵɵelement(1, "i", 82);
|
|
399
|
+
i0.ɵɵtext(2, " Run Prompt ");
|
|
400
|
+
i0.ɵɵelementEnd();
|
|
401
|
+
} }
|
|
402
|
+
function PromptManagementComponent_Conditional_78_Template(rf, ctx) { if (rf & 1) {
|
|
403
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
404
|
+
i0.ɵɵelementStart(0, "div", 99)(1, "div", 100)(2, "div", 101);
|
|
405
|
+
i0.ɵɵelement(3, "i");
|
|
406
|
+
i0.ɵɵelementEnd();
|
|
407
|
+
i0.ɵɵelementStart(4, "div", 102)(5, "h3");
|
|
408
|
+
i0.ɵɵtext(6);
|
|
409
|
+
i0.ɵɵelementEnd();
|
|
410
|
+
i0.ɵɵelementStart(7, "span", 103);
|
|
411
|
+
i0.ɵɵtext(8);
|
|
412
|
+
i0.ɵɵelementEnd()()();
|
|
413
|
+
i0.ɵɵelementStart(9, "button", 104);
|
|
414
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Conditional_78_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeDetailPanel()); });
|
|
415
|
+
i0.ɵɵelement(10, "i", 24);
|
|
416
|
+
i0.ɵɵelementEnd()();
|
|
417
|
+
i0.ɵɵelementStart(11, "div", 105)(12, "div", 106)(13, "div", 107)(14, "span", 90);
|
|
418
|
+
i0.ɵɵelement(15, "i", 72);
|
|
419
|
+
i0.ɵɵtext(16);
|
|
420
|
+
i0.ɵɵelementEnd();
|
|
421
|
+
i0.ɵɵtemplate(17, PromptManagementComponent_Conditional_78_Conditional_17_Template, 3, 0, "span", 108);
|
|
422
|
+
i0.ɵɵelementEnd()();
|
|
423
|
+
i0.ɵɵtemplate(18, PromptManagementComponent_Conditional_78_Conditional_18_Template, 6, 1, "div", 106);
|
|
424
|
+
i0.ɵɵelementStart(19, "div", 106)(20, "h4", 109);
|
|
425
|
+
i0.ɵɵelement(21, "i", 110);
|
|
426
|
+
i0.ɵɵtext(22, " Configuration ");
|
|
427
|
+
i0.ɵɵelementEnd();
|
|
428
|
+
i0.ɵɵelementStart(23, "div", 111)(24, "div", 112)(25, "span", 113);
|
|
429
|
+
i0.ɵɵtext(26, "Category");
|
|
430
|
+
i0.ɵɵelementEnd();
|
|
431
|
+
i0.ɵɵelementStart(27, "span", 114);
|
|
432
|
+
i0.ɵɵtext(28);
|
|
433
|
+
i0.ɵɵelementEnd()();
|
|
434
|
+
i0.ɵɵelementStart(29, "div", 112)(30, "span", 113);
|
|
435
|
+
i0.ɵɵtext(31, "Type");
|
|
436
|
+
i0.ɵɵelementEnd();
|
|
437
|
+
i0.ɵɵelementStart(32, "span", 114);
|
|
438
|
+
i0.ɵɵtext(33);
|
|
439
|
+
i0.ɵɵelementEnd()();
|
|
440
|
+
i0.ɵɵelementStart(34, "div", 112)(35, "span", 113);
|
|
441
|
+
i0.ɵɵtext(36, "Response Format");
|
|
442
|
+
i0.ɵɵelementEnd();
|
|
443
|
+
i0.ɵɵelementStart(37, "span", 114);
|
|
444
|
+
i0.ɵɵtext(38);
|
|
445
|
+
i0.ɵɵelementEnd()();
|
|
446
|
+
i0.ɵɵelementStart(39, "div", 112)(40, "span", 113);
|
|
447
|
+
i0.ɵɵtext(41, "Selection Strategy");
|
|
448
|
+
i0.ɵɵelementEnd();
|
|
449
|
+
i0.ɵɵelementStart(42, "span", 114);
|
|
450
|
+
i0.ɵɵtext(43);
|
|
451
|
+
i0.ɵɵelementEnd()();
|
|
452
|
+
i0.ɵɵelementStart(44, "div", 112)(45, "span", 113);
|
|
453
|
+
i0.ɵɵtext(46, "Power Preference");
|
|
454
|
+
i0.ɵɵelementEnd();
|
|
455
|
+
i0.ɵɵelementStart(47, "span", 114);
|
|
456
|
+
i0.ɵɵtext(48);
|
|
457
|
+
i0.ɵɵelementEnd()();
|
|
458
|
+
i0.ɵɵtemplate(49, PromptManagementComponent_Conditional_78_Conditional_49_Template, 5, 1, "div", 112);
|
|
459
|
+
i0.ɵɵelementEnd()();
|
|
460
|
+
i0.ɵɵelementStart(50, "div", 106)(51, "h4", 109);
|
|
461
|
+
i0.ɵɵelement(52, "i", 115);
|
|
462
|
+
i0.ɵɵtext(53, " Timestamps ");
|
|
463
|
+
i0.ɵɵelementEnd();
|
|
464
|
+
i0.ɵɵelementStart(54, "div", 111)(55, "div", 112)(56, "span", 113);
|
|
465
|
+
i0.ɵɵtext(57, "Created");
|
|
466
|
+
i0.ɵɵelementEnd();
|
|
467
|
+
i0.ɵɵelementStart(58, "span", 114);
|
|
468
|
+
i0.ɵɵtext(59);
|
|
469
|
+
i0.ɵɵpipe(60, "date");
|
|
470
|
+
i0.ɵɵelementEnd()();
|
|
471
|
+
i0.ɵɵelementStart(61, "div", 112)(62, "span", 113);
|
|
472
|
+
i0.ɵɵtext(63, "Updated");
|
|
473
|
+
i0.ɵɵelementEnd();
|
|
474
|
+
i0.ɵɵelementStart(64, "span", 114);
|
|
475
|
+
i0.ɵɵtext(65);
|
|
476
|
+
i0.ɵɵpipe(66, "date");
|
|
477
|
+
i0.ɵɵelementEnd()()()()();
|
|
478
|
+
i0.ɵɵelementStart(67, "div", 116);
|
|
479
|
+
i0.ɵɵtemplate(68, PromptManagementComponent_Conditional_78_Conditional_68_Template, 3, 0, "button", 117);
|
|
480
|
+
i0.ɵɵelementStart(69, "button", 118);
|
|
481
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Conditional_78_Template_button_click_69_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openPromptFromPanel()); });
|
|
482
|
+
i0.ɵɵelement(70, "i", 119);
|
|
483
|
+
i0.ɵɵtext(71, " Open Full Record ");
|
|
484
|
+
i0.ɵɵelementEnd()();
|
|
485
|
+
} if (rf & 2) {
|
|
486
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
487
|
+
i0.ɵɵadvance(3);
|
|
488
|
+
i0.ɵɵclassMap(ctx_r1.getPromptIcon(ctx_r1.selectedPrompt));
|
|
489
|
+
i0.ɵɵadvance(3);
|
|
490
|
+
i0.ɵɵtextInterpolate(ctx_r1.selectedPrompt.Name);
|
|
491
|
+
i0.ɵɵadvance(2);
|
|
492
|
+
i0.ɵɵtextInterpolate(ctx_r1.selectedPrompt.TypeName || "Prompt");
|
|
493
|
+
i0.ɵɵadvance(6);
|
|
494
|
+
i0.ɵɵclassMap("status-" + (ctx_r1.selectedPrompt.Status || "unknown").toLowerCase());
|
|
495
|
+
i0.ɵɵadvance(2);
|
|
496
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.selectedPrompt.Status || "Unknown", " ");
|
|
497
|
+
i0.ɵɵadvance();
|
|
498
|
+
i0.ɵɵconditional(ctx_r1.selectedPrompt.TemplateEntity ? 17 : -1);
|
|
499
|
+
i0.ɵɵadvance();
|
|
500
|
+
i0.ɵɵconditional(ctx_r1.selectedPrompt.Description ? 18 : -1);
|
|
501
|
+
i0.ɵɵadvance(10);
|
|
502
|
+
i0.ɵɵtextInterpolate(ctx_r1.selectedPrompt.CategoryName || "Uncategorized");
|
|
503
|
+
i0.ɵɵadvance(5);
|
|
504
|
+
i0.ɵɵtextInterpolate(ctx_r1.selectedPrompt.TypeName || "Unknown");
|
|
505
|
+
i0.ɵɵadvance(5);
|
|
506
|
+
i0.ɵɵtextInterpolate(ctx_r1.selectedPrompt.ResponseFormat);
|
|
507
|
+
i0.ɵɵadvance(5);
|
|
508
|
+
i0.ɵɵtextInterpolate(ctx_r1.selectedPrompt.SelectionStrategy);
|
|
509
|
+
i0.ɵɵadvance(5);
|
|
510
|
+
i0.ɵɵtextInterpolate(ctx_r1.selectedPrompt.PowerPreference);
|
|
511
|
+
i0.ɵɵadvance();
|
|
512
|
+
i0.ɵɵconditional(ctx_r1.selectedPrompt.MinPowerRank ? 49 : -1);
|
|
513
|
+
i0.ɵɵadvance(10);
|
|
514
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(60, 18, ctx_r1.selectedPrompt.__mj_CreatedAt, "medium"));
|
|
515
|
+
i0.ɵɵadvance(6);
|
|
516
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(66, 21, ctx_r1.selectedPrompt.__mj_UpdatedAt, "medium"));
|
|
517
|
+
i0.ɵɵadvance(3);
|
|
518
|
+
i0.ɵɵconditional(ctx_r1.selectedPrompt.Status === "Active" ? 68 : -1);
|
|
519
|
+
} }
|
|
520
|
+
/**
|
|
521
|
+
* Tree-shaking prevention function - ensures component is included in builds
|
|
522
|
+
*/
|
|
523
|
+
export function LoadAIPromptsResource() {
|
|
524
|
+
// Force inclusion in production builds
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* AI Prompts Resource - displays AI prompt management
|
|
528
|
+
* Extends BaseResourceComponent to work with the resource type system
|
|
529
|
+
*/
|
|
530
|
+
let PromptManagementComponent = class PromptManagementComponent extends BaseResourceComponent {
|
|
531
|
+
sharedService;
|
|
532
|
+
testHarnessService;
|
|
533
|
+
navigationService;
|
|
534
|
+
// View state
|
|
535
|
+
viewMode = 'grid';
|
|
536
|
+
isLoading = true;
|
|
537
|
+
showFilters = true;
|
|
538
|
+
expandedPromptId = null;
|
|
539
|
+
// Data
|
|
540
|
+
prompts = [];
|
|
541
|
+
filteredPrompts = [];
|
|
542
|
+
categories = [];
|
|
543
|
+
types = [];
|
|
544
|
+
// Filtering
|
|
545
|
+
searchTerm = '';
|
|
546
|
+
searchSubject = new BehaviorSubject('');
|
|
547
|
+
selectedCategory = 'all';
|
|
548
|
+
selectedType = 'all';
|
|
549
|
+
selectedStatus = 'all';
|
|
550
|
+
// Detail panel
|
|
551
|
+
selectedPrompt = null;
|
|
552
|
+
detailPanelVisible = false;
|
|
553
|
+
// Sorting
|
|
554
|
+
sortColumn = 'Name';
|
|
555
|
+
sortDirection = 'asc';
|
|
556
|
+
// Loading messages
|
|
557
|
+
loadingMessages = [
|
|
558
|
+
'Loading AI prompts...',
|
|
559
|
+
'Fetching templates...',
|
|
560
|
+
'Organizing categories...',
|
|
561
|
+
'Almost there...'
|
|
562
|
+
];
|
|
563
|
+
currentLoadingMessage = this.loadingMessages[0];
|
|
564
|
+
loadingMessageIndex = 0;
|
|
565
|
+
loadingMessageInterval;
|
|
566
|
+
destroy$ = new Subject();
|
|
567
|
+
selectedPromptForTest = null;
|
|
568
|
+
// === Permission Checks ===
|
|
569
|
+
/** Cache for permission checks to avoid repeated calculations */
|
|
570
|
+
_permissionCache = new Map();
|
|
571
|
+
_metadata = new Metadata();
|
|
572
|
+
/** Check if user can create AI Prompts */
|
|
573
|
+
get UserCanCreatePrompts() {
|
|
574
|
+
return this.checkEntityPermission('AI Prompts', 'Create');
|
|
575
|
+
}
|
|
576
|
+
/** Check if user can read AI Prompts */
|
|
577
|
+
get UserCanReadPrompts() {
|
|
578
|
+
return this.checkEntityPermission('AI Prompts', 'Read');
|
|
579
|
+
}
|
|
580
|
+
/** Check if user can update AI Prompts */
|
|
581
|
+
get UserCanUpdatePrompts() {
|
|
582
|
+
return this.checkEntityPermission('AI Prompts', 'Update');
|
|
583
|
+
}
|
|
584
|
+
/** Check if user can delete AI Prompts */
|
|
585
|
+
get UserCanDeletePrompts() {
|
|
586
|
+
return this.checkEntityPermission('AI Prompts', 'Delete');
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Helper method to check entity permissions with caching
|
|
590
|
+
* @param entityName - The name of the entity to check permissions for
|
|
591
|
+
* @param permissionType - The type of permission to check (Create, Read, Update, Delete)
|
|
592
|
+
* @returns boolean indicating if user has the permission
|
|
593
|
+
*/
|
|
594
|
+
checkEntityPermission(entityName, permissionType) {
|
|
595
|
+
const cacheKey = `${entityName}_${permissionType}`;
|
|
596
|
+
if (this._permissionCache.has(cacheKey)) {
|
|
597
|
+
return this._permissionCache.get(cacheKey);
|
|
598
|
+
}
|
|
599
|
+
try {
|
|
600
|
+
const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);
|
|
601
|
+
if (!entityInfo) {
|
|
602
|
+
console.warn(`Entity '${entityName}' not found for permission check`);
|
|
603
|
+
this._permissionCache.set(cacheKey, false);
|
|
604
|
+
return false;
|
|
605
|
+
}
|
|
606
|
+
const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);
|
|
607
|
+
let hasPermission = false;
|
|
608
|
+
switch (permissionType) {
|
|
609
|
+
case 'Create':
|
|
610
|
+
hasPermission = userPermissions.CanCreate;
|
|
611
|
+
break;
|
|
612
|
+
case 'Read':
|
|
613
|
+
hasPermission = userPermissions.CanRead;
|
|
614
|
+
break;
|
|
615
|
+
case 'Update':
|
|
616
|
+
hasPermission = userPermissions.CanUpdate;
|
|
617
|
+
break;
|
|
618
|
+
case 'Delete':
|
|
619
|
+
hasPermission = userPermissions.CanDelete;
|
|
620
|
+
break;
|
|
621
|
+
}
|
|
622
|
+
this._permissionCache.set(cacheKey, hasPermission);
|
|
623
|
+
return hasPermission;
|
|
624
|
+
}
|
|
625
|
+
catch (error) {
|
|
626
|
+
console.error(`Error checking ${permissionType} permission for ${entityName}:`, error);
|
|
627
|
+
this._permissionCache.set(cacheKey, false);
|
|
628
|
+
return false;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* Clears the permission cache. Call this when user context changes or permissions are updated.
|
|
633
|
+
*/
|
|
634
|
+
clearPermissionCache() {
|
|
635
|
+
this._permissionCache.clear();
|
|
636
|
+
}
|
|
637
|
+
constructor(sharedService, testHarnessService, navigationService) {
|
|
638
|
+
super();
|
|
639
|
+
this.sharedService = sharedService;
|
|
640
|
+
this.testHarnessService = testHarnessService;
|
|
641
|
+
this.navigationService = navigationService;
|
|
642
|
+
}
|
|
643
|
+
ngOnInit() {
|
|
644
|
+
this.setupSearchListener();
|
|
645
|
+
this.startLoadingMessages();
|
|
646
|
+
this.loadInitialData();
|
|
647
|
+
if (this.Data?.Configuration) {
|
|
648
|
+
this.applyInitialState(this.Data.Configuration);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
ngOnDestroy() {
|
|
652
|
+
this.destroy$.next();
|
|
653
|
+
this.destroy$.complete();
|
|
654
|
+
if (this.loadingMessageInterval) {
|
|
655
|
+
clearInterval(this.loadingMessageInterval);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
setupSearchListener() {
|
|
659
|
+
this.searchSubject.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(searchTerm => {
|
|
660
|
+
this.searchTerm = searchTerm;
|
|
661
|
+
this.applyFilters();
|
|
662
|
+
});
|
|
663
|
+
}
|
|
664
|
+
startLoadingMessages() {
|
|
665
|
+
this.loadingMessageInterval = setInterval(() => {
|
|
666
|
+
this.loadingMessageIndex = (this.loadingMessageIndex + 1) % this.loadingMessages.length;
|
|
667
|
+
this.currentLoadingMessage = this.loadingMessages[this.loadingMessageIndex];
|
|
668
|
+
}, 2000);
|
|
669
|
+
}
|
|
670
|
+
async loadInitialData() {
|
|
671
|
+
try {
|
|
672
|
+
// Configure both engines in parallel (no-op if already loaded)
|
|
673
|
+
await Promise.all([
|
|
674
|
+
AIEngineBase.Instance.Config(false),
|
|
675
|
+
TemplateEngineBase.Instance.Config(false)
|
|
676
|
+
]);
|
|
677
|
+
// Get cached data from AIEngineBase
|
|
678
|
+
const prompts = AIEngineBase.Instance.Prompts;
|
|
679
|
+
this.categories = AIEngineBase.Instance.PromptCategories;
|
|
680
|
+
this.types = AIEngineBase.Instance.PromptTypes;
|
|
681
|
+
// Get cached data from TemplateEngineBase
|
|
682
|
+
const templates = TemplateEngineBase.Instance.Templates;
|
|
683
|
+
const templateContents = TemplateEngineBase.Instance.TemplateContents;
|
|
684
|
+
// Create lookup maps
|
|
685
|
+
const templateMap = new Map(templates.map(t => [t.ID, t]));
|
|
686
|
+
const templateContentMap = new Map();
|
|
687
|
+
templateContents.forEach(tc => {
|
|
688
|
+
const contents = templateContentMap.get(tc.TemplateID) || [];
|
|
689
|
+
contents.push(tc);
|
|
690
|
+
templateContentMap.set(tc.TemplateID, contents);
|
|
691
|
+
});
|
|
692
|
+
const categoryMap = new Map(this.categories.map(c => [c.ID, c.Name]));
|
|
693
|
+
const typeMap = new Map(this.types.map(t => [t.ID, t.Name]));
|
|
694
|
+
// Combine the data - keep the actual entity objects
|
|
695
|
+
this.prompts = prompts.map(prompt => {
|
|
696
|
+
const template = templateMap.get(prompt.ID);
|
|
697
|
+
// Add the extra properties directly to the entity
|
|
698
|
+
prompt.TemplateEntity = template;
|
|
699
|
+
prompt.TemplateContents = template ? (templateContentMap.get(template.ID) || []) : [];
|
|
700
|
+
prompt.CategoryName = prompt.CategoryID ? categoryMap.get(prompt.CategoryID) || 'Unknown' : 'Uncategorized';
|
|
701
|
+
prompt.TypeName = prompt.TypeID ? typeMap.get(prompt.TypeID) || 'Unknown' : 'Untyped';
|
|
702
|
+
return prompt;
|
|
703
|
+
});
|
|
704
|
+
this.filteredPrompts = [...this.prompts];
|
|
705
|
+
this.applyFilters();
|
|
706
|
+
}
|
|
707
|
+
catch (error) {
|
|
708
|
+
console.error('Error loading prompt data:', error);
|
|
709
|
+
MJNotificationService.Instance.CreateSimpleNotification('Error loading prompts', 'error', 3000);
|
|
710
|
+
}
|
|
711
|
+
finally {
|
|
712
|
+
this.isLoading = false;
|
|
713
|
+
if (this.loadingMessageInterval) {
|
|
714
|
+
clearInterval(this.loadingMessageInterval);
|
|
715
|
+
}
|
|
716
|
+
this.NotifyLoadComplete();
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
applyInitialState(state) {
|
|
720
|
+
if (state.viewMode)
|
|
721
|
+
this.viewMode = state.viewMode;
|
|
722
|
+
if (state.showFilters !== undefined)
|
|
723
|
+
this.showFilters = state.showFilters;
|
|
724
|
+
if (state.searchTerm)
|
|
725
|
+
this.searchTerm = state.searchTerm;
|
|
726
|
+
if (state.selectedCategory)
|
|
727
|
+
this.selectedCategory = state.selectedCategory;
|
|
728
|
+
if (state.selectedType)
|
|
729
|
+
this.selectedType = state.selectedType;
|
|
730
|
+
if (state.selectedStatus)
|
|
731
|
+
this.selectedStatus = state.selectedStatus;
|
|
732
|
+
}
|
|
733
|
+
onSearchChange(value) {
|
|
734
|
+
this.searchSubject.next(value);
|
|
735
|
+
}
|
|
736
|
+
toggleFilters() {
|
|
737
|
+
this.showFilters = !this.showFilters;
|
|
738
|
+
}
|
|
739
|
+
toggleFilterPanel() {
|
|
740
|
+
this.showFilters = !this.showFilters;
|
|
741
|
+
}
|
|
742
|
+
setViewMode(mode) {
|
|
743
|
+
this.viewMode = mode;
|
|
744
|
+
this.expandedPromptId = null;
|
|
745
|
+
}
|
|
746
|
+
togglePromptExpansion(promptId) {
|
|
747
|
+
this.expandedPromptId = this.expandedPromptId === promptId ? null : promptId;
|
|
748
|
+
}
|
|
749
|
+
applyFilters() {
|
|
750
|
+
this.filteredPrompts = this.prompts.filter(prompt => {
|
|
751
|
+
// Search filter
|
|
752
|
+
if (this.searchTerm) {
|
|
753
|
+
const searchLower = this.searchTerm.toLowerCase();
|
|
754
|
+
const matchesSearch = prompt.Name?.toLowerCase().includes(searchLower) ||
|
|
755
|
+
prompt.Description?.toLowerCase().includes(searchLower) ||
|
|
756
|
+
prompt.CategoryName?.toLowerCase().includes(searchLower) ||
|
|
757
|
+
prompt.TypeName?.toLowerCase().includes(searchLower);
|
|
758
|
+
if (!matchesSearch)
|
|
759
|
+
return false;
|
|
760
|
+
}
|
|
761
|
+
// Category filter
|
|
762
|
+
if (this.selectedCategory !== 'all' && prompt.CategoryID !== this.selectedCategory) {
|
|
763
|
+
return false;
|
|
764
|
+
}
|
|
765
|
+
// Type filter
|
|
766
|
+
if (this.selectedType !== 'all' && prompt.TypeID !== this.selectedType) {
|
|
767
|
+
return false;
|
|
768
|
+
}
|
|
769
|
+
// Status filter
|
|
770
|
+
if (this.selectedStatus !== 'all') {
|
|
771
|
+
const isActive = prompt.Status === 'Active';
|
|
772
|
+
if (this.selectedStatus === 'active' && !isActive)
|
|
773
|
+
return false;
|
|
774
|
+
if (this.selectedStatus === 'inactive' && isActive)
|
|
775
|
+
return false;
|
|
776
|
+
}
|
|
777
|
+
return true;
|
|
778
|
+
});
|
|
779
|
+
// Apply sorting
|
|
780
|
+
this.filteredPrompts = this.applySorting(this.filteredPrompts);
|
|
781
|
+
}
|
|
782
|
+
/**
|
|
783
|
+
* Sort the prompts by the specified column
|
|
784
|
+
*/
|
|
785
|
+
sortBy(column) {
|
|
786
|
+
if (this.sortColumn === column) {
|
|
787
|
+
// Toggle direction if same column
|
|
788
|
+
this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';
|
|
789
|
+
}
|
|
790
|
+
else {
|
|
791
|
+
// New column, default to ascending
|
|
792
|
+
this.sortColumn = column;
|
|
793
|
+
this.sortDirection = 'asc';
|
|
794
|
+
}
|
|
795
|
+
this.applyFilters();
|
|
796
|
+
}
|
|
797
|
+
/**
|
|
798
|
+
* Apply sorting to the filtered list
|
|
799
|
+
*/
|
|
800
|
+
applySorting(prompts) {
|
|
801
|
+
return prompts.sort((a, b) => {
|
|
802
|
+
let valueA;
|
|
803
|
+
let valueB;
|
|
804
|
+
switch (this.sortColumn) {
|
|
805
|
+
case 'Name':
|
|
806
|
+
valueA = a.Name;
|
|
807
|
+
valueB = b.Name;
|
|
808
|
+
break;
|
|
809
|
+
case 'Category':
|
|
810
|
+
valueA = a.CategoryName;
|
|
811
|
+
valueB = b.CategoryName;
|
|
812
|
+
break;
|
|
813
|
+
case 'Type':
|
|
814
|
+
valueA = a.TypeName;
|
|
815
|
+
valueB = b.TypeName;
|
|
816
|
+
break;
|
|
817
|
+
case 'Status':
|
|
818
|
+
valueA = a.Status;
|
|
819
|
+
valueB = b.Status;
|
|
820
|
+
break;
|
|
821
|
+
default:
|
|
822
|
+
valueA = a.Name;
|
|
823
|
+
valueB = b.Name;
|
|
824
|
+
}
|
|
825
|
+
// Handle null/undefined values
|
|
826
|
+
const strA = (valueA ?? '').toString().toLowerCase();
|
|
827
|
+
const strB = (valueB ?? '').toString().toLowerCase();
|
|
828
|
+
let comparison = strA.localeCompare(strB);
|
|
829
|
+
return this.sortDirection === 'desc' ? -comparison : comparison;
|
|
830
|
+
});
|
|
831
|
+
}
|
|
832
|
+
onCategoryChange(categoryId) {
|
|
833
|
+
this.selectedCategory = categoryId;
|
|
834
|
+
this.applyFilters();
|
|
835
|
+
}
|
|
836
|
+
onTypeChange(typeId) {
|
|
837
|
+
this.selectedType = typeId;
|
|
838
|
+
this.applyFilters();
|
|
839
|
+
}
|
|
840
|
+
onStatusChange(status) {
|
|
841
|
+
this.selectedStatus = status;
|
|
842
|
+
this.applyFilters();
|
|
843
|
+
}
|
|
844
|
+
openPrompt(promptId) {
|
|
845
|
+
const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: promptId }]);
|
|
846
|
+
this.navigationService.OpenEntityRecord('AI Prompts', compositeKey);
|
|
847
|
+
}
|
|
848
|
+
/**
|
|
849
|
+
* Show the detail panel for a prompt
|
|
850
|
+
*/
|
|
851
|
+
showPromptDetails(prompt, event) {
|
|
852
|
+
if (event) {
|
|
853
|
+
event.stopPropagation();
|
|
854
|
+
}
|
|
855
|
+
this.selectedPrompt = prompt;
|
|
856
|
+
this.detailPanelVisible = true;
|
|
857
|
+
}
|
|
858
|
+
/**
|
|
859
|
+
* Close the detail panel
|
|
860
|
+
*/
|
|
861
|
+
closeDetailPanel() {
|
|
862
|
+
this.detailPanelVisible = false;
|
|
863
|
+
// Delay clearing selectedPrompt for smoother animation
|
|
864
|
+
setTimeout(() => {
|
|
865
|
+
if (!this.detailPanelVisible) {
|
|
866
|
+
this.selectedPrompt = null;
|
|
867
|
+
}
|
|
868
|
+
}, 300);
|
|
869
|
+
}
|
|
870
|
+
/**
|
|
871
|
+
* Open the full entity record from the detail panel
|
|
872
|
+
*/
|
|
873
|
+
openPromptFromPanel() {
|
|
874
|
+
if (this.selectedPrompt) {
|
|
875
|
+
this.openPrompt(this.selectedPrompt.ID);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
testPrompt(promptId, event) {
|
|
879
|
+
if (event) {
|
|
880
|
+
event.stopPropagation();
|
|
881
|
+
}
|
|
882
|
+
// Use the test harness service for window management features
|
|
883
|
+
this.testHarnessService.openForPrompt(promptId);
|
|
884
|
+
}
|
|
885
|
+
closeTestHarness() {
|
|
886
|
+
// No longer needed - window manages its own closure
|
|
887
|
+
this.selectedPromptForTest = null;
|
|
888
|
+
}
|
|
889
|
+
createNewPrompt() {
|
|
890
|
+
// Use the standard MemberJunction pattern to open a new AI Prompt form
|
|
891
|
+
// Empty CompositeKey indicates a new record
|
|
892
|
+
this.navigationService.OpenEntityRecord('AI Prompts', new CompositeKey([]));
|
|
893
|
+
}
|
|
894
|
+
getPromptIcon(prompt) {
|
|
895
|
+
if (prompt.TypeName?.toLowerCase().includes('system')) {
|
|
896
|
+
return 'fa-solid fa-cogs';
|
|
897
|
+
}
|
|
898
|
+
else if (prompt.TypeName?.toLowerCase().includes('user')) {
|
|
899
|
+
return 'fa-solid fa-user';
|
|
900
|
+
}
|
|
901
|
+
else if (prompt.TypeName?.toLowerCase().includes('chat')) {
|
|
902
|
+
return 'fa-solid fa-comments';
|
|
903
|
+
}
|
|
904
|
+
return 'fa-solid fa-comment-dots';
|
|
905
|
+
}
|
|
906
|
+
getStatusClass(status) {
|
|
907
|
+
return status === 'Active' ? 'active' : 'inactive';
|
|
908
|
+
}
|
|
909
|
+
get hasActiveFilters() {
|
|
910
|
+
return this.searchTerm !== '' ||
|
|
911
|
+
this.selectedCategory !== 'all' ||
|
|
912
|
+
this.selectedType !== 'all' ||
|
|
913
|
+
this.selectedStatus !== 'all';
|
|
914
|
+
}
|
|
915
|
+
get filteredPromptsAsEntities() {
|
|
916
|
+
// The prompts are already AIPromptEntityExtended instances with extra properties
|
|
917
|
+
return this.filteredPrompts;
|
|
918
|
+
}
|
|
919
|
+
clearFilters() {
|
|
920
|
+
this.searchTerm = '';
|
|
921
|
+
this.selectedCategory = 'all';
|
|
922
|
+
this.selectedType = 'all';
|
|
923
|
+
this.selectedStatus = 'all';
|
|
924
|
+
this.searchSubject.next('');
|
|
925
|
+
this.applyFilters();
|
|
926
|
+
}
|
|
927
|
+
// BaseResourceComponent abstract method implementations
|
|
928
|
+
async GetResourceDisplayName(data) {
|
|
929
|
+
return 'Prompts';
|
|
930
|
+
}
|
|
931
|
+
async GetResourceIconClass(data) {
|
|
932
|
+
return 'fa-solid fa-comment-dots';
|
|
933
|
+
}
|
|
934
|
+
static ɵfac = function PromptManagementComponent_Factory(t) { return new (t || PromptManagementComponent)(i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i2.AITestHarnessDialogService), i0.ɵɵdirectiveInject(i1.NavigationService)); };
|
|
935
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PromptManagementComponent, selectors: [["app-prompt-management"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 79, vars: 26, 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"], [1, "detail-panel-overlay"], [1, "detail-panel"], ["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", "View Details", 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", "View Details", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-eye"], ["type", "button", "title", "Run Prompt", 1, "action-btn", "action-btn-primary", 3, "click"], [1, "fa-solid", "fa-play"], [1, "prompts-table"], [3, "click"], [1, "sort-header"], [1, "fa-solid", "fa-chevron-up", "sort-icon"], [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", "View Details", 1, "action-btn-small"], ["type", "button", "title", "Run Prompt", 1, "action-btn-small", "primary"], ["type", "button", "title", "View Details", 1, "action-btn-small", 3, "click"], ["type", "button", "title", "Run Prompt", 1, "action-btn-small", "primary", 3, "click"], [1, "detail-panel-overlay", 3, "click"], [1, "detail-panel-header"], [1, "detail-panel-title"], [1, "detail-icon"], [1, "detail-title-info"], [1, "detail-subtitle"], [1, "detail-panel-close", 3, "click"], [1, "detail-panel-content"], [1, "detail-section"], [1, "detail-badges"], [1, "feature-badge"], [1, "detail-section-title"], [1, "fa-solid", "fa-cog"], [1, "detail-grid"], [1, "detail-item"], [1, "detail-label"], [1, "detail-value"], [1, "fa-solid", "fa-clock"], [1, "detail-panel-actions"], ["type", "button", 1, "detail-action-btn", "secondary"], ["type", "button", 1, "detail-action-btn", "primary", 3, "click"], [1, "fa-solid", "fa-external-link-alt"], [1, "fa-solid", "fa-file-code"], [1, "fa-solid", "fa-align-left"], [1, "detail-description"], ["type", "button", 1, "detail-action-btn", "secondary", 3, "click"]], template: function PromptManagementComponent_Template(rf, ctx) { if (rf & 1) {
|
|
936
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h2", 3);
|
|
937
|
+
i0.ɵɵelement(4, "i", 4);
|
|
938
|
+
i0.ɵɵtext(5, " AI Prompts ");
|
|
939
|
+
i0.ɵɵelementEnd();
|
|
940
|
+
i0.ɵɵelementStart(6, "button", 5);
|
|
941
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Template_button_click_6_listener() { return ctx.toggleFilters(); });
|
|
942
|
+
i0.ɵɵelement(7, "i", 6);
|
|
943
|
+
i0.ɵɵtemplate(8, PromptManagementComponent_Conditional_8_Template, 1, 0)(9, PromptManagementComponent_Conditional_9_Template, 1, 0);
|
|
944
|
+
i0.ɵɵelementEnd();
|
|
945
|
+
i0.ɵɵelementStart(10, "span", 7);
|
|
946
|
+
i0.ɵɵtext(11);
|
|
947
|
+
i0.ɵɵelementEnd()();
|
|
948
|
+
i0.ɵɵelementStart(12, "div", 8)(13, "div", 9)(14, "button", 10);
|
|
949
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Template_button_click_14_listener() { return ctx.setViewMode("grid"); });
|
|
950
|
+
i0.ɵɵelement(15, "i", 11);
|
|
951
|
+
i0.ɵɵelementEnd();
|
|
952
|
+
i0.ɵɵelementStart(16, "button", 12);
|
|
953
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Template_button_click_16_listener() { return ctx.setViewMode("list"); });
|
|
954
|
+
i0.ɵɵelement(17, "i", 13);
|
|
955
|
+
i0.ɵɵelementEnd()();
|
|
956
|
+
i0.ɵɵtemplate(18, PromptManagementComponent_Conditional_18_Template, 3, 0, "button", 14);
|
|
957
|
+
i0.ɵɵelementEnd()();
|
|
958
|
+
i0.ɵɵelementStart(19, "div", 15)(20, "kendo-splitter", 16)(21, "kendo-splitter-pane", 17)(22, "div", 18)(23, "div", 19)(24, "h3");
|
|
959
|
+
i0.ɵɵtext(25, "Prompt Filters");
|
|
960
|
+
i0.ɵɵelementEnd();
|
|
961
|
+
i0.ɵɵelementStart(26, "div", 20)(27, "span", 21);
|
|
962
|
+
i0.ɵɵtext(28);
|
|
963
|
+
i0.ɵɵelementEnd();
|
|
964
|
+
i0.ɵɵelementStart(29, "span", 22);
|
|
965
|
+
i0.ɵɵtext(30);
|
|
966
|
+
i0.ɵɵelementEnd()();
|
|
967
|
+
i0.ɵɵelementStart(31, "button", 23);
|
|
968
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Template_button_click_31_listener() { return ctx.toggleFilterPanel(); });
|
|
969
|
+
i0.ɵɵelement(32, "i", 24);
|
|
970
|
+
i0.ɵɵelementEnd()();
|
|
971
|
+
i0.ɵɵelementStart(33, "div", 25)(34, "div", 26)(35, "label", 27);
|
|
972
|
+
i0.ɵɵelement(36, "i", 28);
|
|
973
|
+
i0.ɵɵtext(37, " Name ");
|
|
974
|
+
i0.ɵɵelementEnd();
|
|
975
|
+
i0.ɵɵelementStart(38, "input", 29);
|
|
976
|
+
i0.ɵɵlistener("input", function PromptManagementComponent_Template_input_input_38_listener($event) { return ctx.onSearchChange($event.target.value); });
|
|
977
|
+
i0.ɵɵelementEnd()();
|
|
978
|
+
i0.ɵɵelementStart(39, "div", 26)(40, "label", 27);
|
|
979
|
+
i0.ɵɵelement(41, "i", 30);
|
|
980
|
+
i0.ɵɵtext(42, " Category ");
|
|
981
|
+
i0.ɵɵelementEnd();
|
|
982
|
+
i0.ɵɵelementStart(43, "select", 31);
|
|
983
|
+
i0.ɵɵlistener("change", function PromptManagementComponent_Template_select_change_43_listener($event) { return ctx.onCategoryChange($event.target.value); });
|
|
984
|
+
i0.ɵɵelementStart(44, "option", 32);
|
|
985
|
+
i0.ɵɵtext(45, "All Categories");
|
|
986
|
+
i0.ɵɵelementEnd();
|
|
987
|
+
i0.ɵɵrepeaterCreate(46, PromptManagementComponent_For_47_Template, 2, 2, "option", 33, _forTrack0);
|
|
988
|
+
i0.ɵɵelementEnd()();
|
|
989
|
+
i0.ɵɵelementStart(48, "div", 26)(49, "label", 27);
|
|
990
|
+
i0.ɵɵelement(50, "i", 34);
|
|
991
|
+
i0.ɵɵtext(51, " Type ");
|
|
992
|
+
i0.ɵɵelementEnd();
|
|
993
|
+
i0.ɵɵelementStart(52, "select", 31);
|
|
994
|
+
i0.ɵɵlistener("change", function PromptManagementComponent_Template_select_change_52_listener($event) { return ctx.onTypeChange($event.target.value); });
|
|
995
|
+
i0.ɵɵelementStart(53, "option", 32);
|
|
996
|
+
i0.ɵɵtext(54, "All Types");
|
|
997
|
+
i0.ɵɵelementEnd();
|
|
998
|
+
i0.ɵɵrepeaterCreate(55, PromptManagementComponent_For_56_Template, 2, 2, "option", 33, _forTrack0);
|
|
999
|
+
i0.ɵɵelementEnd()();
|
|
1000
|
+
i0.ɵɵelementStart(57, "div", 26)(58, "label", 27);
|
|
1001
|
+
i0.ɵɵelement(59, "i", 35);
|
|
1002
|
+
i0.ɵɵtext(60, " Status ");
|
|
1003
|
+
i0.ɵɵelementEnd();
|
|
1004
|
+
i0.ɵɵelementStart(61, "select", 31);
|
|
1005
|
+
i0.ɵɵlistener("change", function PromptManagementComponent_Template_select_change_61_listener($event) { return ctx.onStatusChange($event.target.value); });
|
|
1006
|
+
i0.ɵɵelementStart(62, "option", 32);
|
|
1007
|
+
i0.ɵɵtext(63, "All Statuses");
|
|
1008
|
+
i0.ɵɵelementEnd();
|
|
1009
|
+
i0.ɵɵelementStart(64, "option", 36);
|
|
1010
|
+
i0.ɵɵtext(65, "Active");
|
|
1011
|
+
i0.ɵɵelementEnd();
|
|
1012
|
+
i0.ɵɵelementStart(66, "option", 37);
|
|
1013
|
+
i0.ɵɵtext(67, "Inactive");
|
|
1014
|
+
i0.ɵɵelementEnd()()();
|
|
1015
|
+
i0.ɵɵelementStart(68, "div", 38)(69, "button", 39);
|
|
1016
|
+
i0.ɵɵlistener("click", function PromptManagementComponent_Template_button_click_69_listener() { return ctx.clearFilters(); });
|
|
1017
|
+
i0.ɵɵelement(70, "i", 40);
|
|
1018
|
+
i0.ɵɵtext(71, " Reset Filters ");
|
|
1019
|
+
i0.ɵɵelementEnd()()()()();
|
|
1020
|
+
i0.ɵɵelementStart(72, "kendo-splitter-pane", 41)(73, "div", 42);
|
|
1021
|
+
i0.ɵɵtemplate(74, PromptManagementComponent_Conditional_74_Template, 2, 1, "div", 43)(75, PromptManagementComponent_Conditional_75_Template, 2, 1);
|
|
1022
|
+
i0.ɵɵelementEnd()()()();
|
|
1023
|
+
i0.ɵɵtemplate(76, PromptManagementComponent_Conditional_76_Template, 1, 0, "div", 44);
|
|
1024
|
+
i0.ɵɵelementStart(77, "div", 45);
|
|
1025
|
+
i0.ɵɵtemplate(78, PromptManagementComponent_Conditional_78_Template, 72, 24);
|
|
1026
|
+
i0.ɵɵelementEnd()();
|
|
1027
|
+
} if (rf & 2) {
|
|
1028
|
+
i0.ɵɵadvance(8);
|
|
1029
|
+
i0.ɵɵconditional(ctx.showFilters ? 8 : 9);
|
|
1030
|
+
i0.ɵɵadvance(3);
|
|
1031
|
+
i0.ɵɵtextInterpolate1("", ctx.filteredPrompts.length, " prompts");
|
|
1032
|
+
i0.ɵɵadvance(3);
|
|
1033
|
+
i0.ɵɵclassProp("active", ctx.viewMode === "grid");
|
|
1034
|
+
i0.ɵɵadvance(2);
|
|
1035
|
+
i0.ɵɵclassProp("active", ctx.viewMode === "list");
|
|
1036
|
+
i0.ɵɵadvance(2);
|
|
1037
|
+
i0.ɵɵconditional(ctx.UserCanCreatePrompts ? 18 : -1);
|
|
1038
|
+
i0.ɵɵadvance(3);
|
|
1039
|
+
i0.ɵɵproperty("size", ctx.showFilters ? "320px" : "0px")("collapsible", false)("resizable", ctx.showFilters)("scrollable", false)("hidden", !ctx.showFilters);
|
|
1040
|
+
i0.ɵɵadvance(7);
|
|
1041
|
+
i0.ɵɵtextInterpolate(ctx.filteredPrompts.length);
|
|
1042
|
+
i0.ɵɵadvance(2);
|
|
1043
|
+
i0.ɵɵtextInterpolate1("of ", ctx.prompts.length, "");
|
|
1044
|
+
i0.ɵɵadvance(8);
|
|
1045
|
+
i0.ɵɵproperty("value", ctx.searchTerm);
|
|
1046
|
+
i0.ɵɵadvance(5);
|
|
1047
|
+
i0.ɵɵproperty("value", ctx.selectedCategory);
|
|
1048
|
+
i0.ɵɵadvance(3);
|
|
1049
|
+
i0.ɵɵrepeater(ctx.categories);
|
|
1050
|
+
i0.ɵɵadvance(6);
|
|
1051
|
+
i0.ɵɵproperty("value", ctx.selectedType);
|
|
1052
|
+
i0.ɵɵadvance(3);
|
|
1053
|
+
i0.ɵɵrepeater(ctx.types);
|
|
1054
|
+
i0.ɵɵadvance(6);
|
|
1055
|
+
i0.ɵɵproperty("value", ctx.selectedStatus);
|
|
1056
|
+
i0.ɵɵadvance(11);
|
|
1057
|
+
i0.ɵɵproperty("resizable", true)("scrollable", true);
|
|
1058
|
+
i0.ɵɵadvance(2);
|
|
1059
|
+
i0.ɵɵconditional(ctx.isLoading ? 74 : -1);
|
|
1060
|
+
i0.ɵɵadvance();
|
|
1061
|
+
i0.ɵɵconditional(!ctx.isLoading ? 75 : -1);
|
|
1062
|
+
i0.ɵɵadvance();
|
|
1063
|
+
i0.ɵɵconditional(ctx.detailPanelVisible ? 76 : -1);
|
|
1064
|
+
i0.ɵɵadvance();
|
|
1065
|
+
i0.ɵɵclassProp("visible", ctx.detailPanelVisible);
|
|
1066
|
+
i0.ɵɵadvance();
|
|
1067
|
+
i0.ɵɵconditional(ctx.selectedPrompt ? 78 : -1);
|
|
1068
|
+
} }, dependencies: [i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i4.SplitterComponent, i4.SplitterPaneComponent, i5.LoadingComponent, i6.DatePipe], styles: ["\n\n\n\n\n\n\n\n.prompt-management-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 50%, #e8f0fe 100%);\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 8px rgba(0, 0, 0, 0.06);\n position: relative;\n z-index: 10;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 20px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: #1e293b;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6366f1;\n font-size: 22px;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n padding: 8px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: #475569;\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: #f1f5f9;\n border-color: #cbd5e1;\n color: #1e293b;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6366f1;\n}\n\n.item-count[_ngcontent-%COMP%] {\n color: #64748b;\n font-size: 13px;\n font-weight: 500;\n background: #f1f5f9;\n padding: 6px 12px;\n border-radius: 16px;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f1f5f9;\n border-radius: 8px;\n padding: 3px;\n border: 1px solid #e2e8f0;\n}\n\n.view-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 8px 12px;\n border-radius: 6px;\n color: #64748b;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 14px;\n}\n\n.view-btn[_ngcontent-%COMP%]:hover {\n color: #1e293b;\n background: rgba(99, 102, 241, 0.08);\n}\n\n.view-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #6366f1;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.control-btn[_ngcontent-%COMP%] {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n padding: 8px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n color: #475569;\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: #f1f5f9;\n border-color: #cbd5e1;\n color: #1e293b;\n}\n\n.control-btn.primary[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border-color: transparent;\n color: white;\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.25);\n}\n\n.control-btn.primary[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.35);\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\nkendo-splitter[_ngcontent-%COMP%] {\n background: transparent;\n}\n\n[_nghost-%COMP%] .k-splitter {\n border: none;\n background: transparent;\n}\n\n[_nghost-%COMP%] .k-splitbar {\n background: #e5e7eb;\n width: 6px;\n}\n\n[_nghost-%COMP%] .k-splitbar:hover {\n background: #c7d2fe;\n}\n\n[_nghost-%COMP%] .k-pane {\n overflow: hidden;\n}\n\n\n\n.filter-panel[_ngcontent-%COMP%] {\n height: 100%;\n background: white;\n border-right: 1px solid #e5e7eb;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n\n\n.filter-panel-header[_ngcontent-%COMP%] {\n padding: 20px;\n border-bottom: 1px solid #f1f5f9;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: linear-gradient(135deg, #fafbfc 0%, #f8fafc 100%);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: #1e293b;\n flex: 1;\n letter-spacing: -0.02em;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 16px;\n font-size: 13px;\n padding: 6px 12px;\n background: linear-gradient(135deg, #ede9fe 0%, #ddd6fe 100%);\n border-radius: 20px;\n border: 1px solid #c4b5fd;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-value[_ngcontent-%COMP%] {\n font-weight: 700;\n color: #6366f1;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-label[_ngcontent-%COMP%] {\n color: #7c3aed;\n font-weight: 500;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: #94a3b8;\n border-radius: 8px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%]:hover {\n background: #f1f5f9;\n color: #475569;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n\n.filter-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 20px;\n}\n\n\n\n.filter-group[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n font-size: 12px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.75px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6366f1;\n width: 16px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%], \n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n font-size: 14px;\n background: white;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: #334155;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%]:focus, \n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%]::placeholder {\n color: #94a3b8;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n\n\n.filter-input[_ngcontent-%COMP%], \n.filter-select[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n font-size: 14px;\n background: white;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: #334155;\n}\n\n.filter-input[_ngcontent-%COMP%]:focus, \n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);\n}\n\n.filter-input[_ngcontent-%COMP%]::placeholder {\n color: #94a3b8;\n}\n\n.filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n\n\n.filter-actions[_ngcontent-%COMP%] {\n margin-top: 28px;\n padding-top: 20px;\n border-top: 1px solid #f1f5f9;\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n color: #64748b;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);\n border-color: #cbd5e1;\n color: #475569;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: #f8fafc;\n border-radius: 3px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: #cbd5e1;\n border-radius: 3px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: #94a3b8;\n}\n\n\n\n.prompts-content[_ngcontent-%COMP%] {\n height: 100%;\n overflow-y: auto;\n padding: 28px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 50%, #e8f0fe 100%);\n}\n\n\n\n.prompts-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));\n gap: 24px;\n}\n\n.prompt-card[_ngcontent-%COMP%] {\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);\n border: 1px solid #e2e8f0;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n position: relative;\n}\n\n.prompt-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n background: linear-gradient(90deg, #6366f1 0%, #8b5cf6 50%, #a78bfa 100%);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.prompt-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 20px 40px -15px rgba(99, 102, 241, 0.25);\n transform: translateY(-4px);\n border-color: #c7d2fe;\n}\n\n.prompt-card[_ngcontent-%COMP%]:hover::before {\n opacity: 1;\n}\n\n.prompt-card.expanded[_ngcontent-%COMP%] {\n box-shadow: 0 25px 50px -12px rgba(99, 102, 241, 0.3);\n border-color: #a5b4fc;\n}\n\n.prompt-card.expanded[_ngcontent-%COMP%]::before {\n opacity: 1;\n}\n\n.card-header[_ngcontent-%COMP%] {\n padding: 24px;\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 #f1f5f9;\n transition: background-color 0.2s;\n}\n\n.card-header[_ngcontent-%COMP%]:hover {\n background-color: #fafbfc;\n}\n\n.prompt-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 18px;\n flex: 1;\n}\n\n.prompt-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.prompt-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: white;\n font-size: 24px;\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: 18px;\n font-weight: 700;\n color: #1e293b;\n margin-bottom: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.prompt-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 14px;\n flex-wrap: wrap;\n}\n\n.meta-item[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #64748b;\n display: flex;\n align-items: center;\n gap: 6px;\n background: #f1f5f9;\n padding: 4px 10px;\n border-radius: 6px;\n}\n\n.meta-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #6366f1;\n}\n\n.meta-item.status-active[_ngcontent-%COMP%] {\n color: #059669;\n background: #d1fae5;\n}\n\n.meta-item.status-active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #059669;\n}\n\n.meta-item.status-pending[_ngcontent-%COMP%] {\n color: #d97706;\n background: #fef3c7;\n}\n\n.meta-item.status-pending[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #d97706;\n}\n\n.meta-item.status-inactive[_ngcontent-%COMP%] {\n color: #64748b;\n background: #e2e8f0;\n}\n\n.meta-item.status-inactive[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #64748b;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #94a3b8;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n padding: 8px;\n border-radius: 8px;\n}\n\n.expand-icon[_ngcontent-%COMP%]:hover {\n color: #6366f1;\n background: #f1f5f9;\n}\n\n.expand-icon.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n color: #6366f1;\n}\n\n.card-body[_ngcontent-%COMP%] {\n padding: 0 24px 24px 24px;\n}\n\n.prompt-description[_ngcontent-%COMP%] {\n margin: 18px 0 0 0;\n font-size: 14px;\n line-height: 1.7;\n color: #64748b;\n}\n\n.prompt-description.text-muted[_ngcontent-%COMP%] {\n font-style: italic;\n color: #94a3b8;\n}\n\n\n\n.expanded-content[_ngcontent-%COMP%] {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid #e2e8f0;\n animation: _ngcontent-%COMP%_slideDown 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-12px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.prompt-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 18px;\n}\n\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-radius: 12px;\n border: 1px solid #e2e8f0;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 15px;\n color: #1e293b;\n font-weight: 600;\n}\n\n\n\n.card-actions[_ngcontent-%COMP%] {\n padding: 18px 24px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-top: 1px solid #e2e8f0;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n background: white;\n border: 2px solid #e2e8f0;\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 600;\n color: #475569;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover {\n background: #f8fafc;\n border-color: #6366f1;\n color: #6366f1;\n transform: translateY(-1px);\n}\n\n.action-btn-primary[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border-color: transparent;\n color: white;\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.action-btn-primary[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px rgba(99, 102, 241, 0.4);\n}\n\n\n\n.prompts-list[_ngcontent-%COMP%] {\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n border: 1px solid #e2e8f0;\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: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-bottom: 2px solid #e2e8f0;\n}\n\n.prompts-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 16px 20px;\n text-align: left;\n font-size: 12px;\n font-weight: 700;\n color: #475569;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n cursor: pointer;\n user-select: none;\n transition: all 0.2s ease;\n}\n\n.prompts-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:hover {\n background: #e2e8f0;\n color: #6366f1;\n}\n\n.prompts-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:last-child {\n cursor: default;\n}\n\n.prompts-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:last-child:hover {\n background: transparent;\n color: #475569;\n}\n\n.prompts-table[_ngcontent-%COMP%] th.sorted[_ngcontent-%COMP%] {\n color: #6366f1;\n background: linear-gradient(135deg, #eef2ff 0%, #e0e7ff 100%);\n}\n\n.prompts-table[_ngcontent-%COMP%] th.sorted.desc[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.prompts-table[_ngcontent-%COMP%] .sort-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.prompts-table[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0;\n transition: all 0.2s ease;\n}\n\n.prompts-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:hover .sort-icon[_ngcontent-%COMP%] {\n opacity: 0.5;\n}\n\n.prompts-table[_ngcontent-%COMP%] th.sorted[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n opacity: 1;\n color: #6366f1;\n}\n\n.prompts-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 1px solid #f1f5f9;\n transition: background-color 0.2s;\n}\n\n.prompts-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.prompts-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #fafbfc 0%, #f8fafc 100%);\n}\n\n.prompts-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 18px 20px;\n font-size: 14px;\n color: #475569;\n}\n\n.prompt-name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n}\n\n.prompt-icon-small[_ngcontent-%COMP%] {\n width: 42px;\n height: 42px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.25);\n}\n\n.prompt-icon-small[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: white;\n font-size: 18px;\n}\n\n.prompt-name-cell[_ngcontent-%COMP%] .prompt-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #1e293b;\n margin-bottom: 0;\n white-space: normal;\n}\n\n.prompt-description-small[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #64748b;\n margin-top: 4px;\n line-height: 1.4;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 8px;\n}\n\n.status-badge.status-active[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n color: #047857;\n}\n\n.status-badge.status-pending[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n color: #b45309;\n}\n\n.status-badge.status-inactive[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #e2e8f0 0%, #cbd5e1 100%);\n color: #475569;\n}\n\n.status-badge.status-unknown[_ngcontent-%COMP%] {\n background: #f1f5f9;\n color: #64748b;\n}\n\n.table-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n}\n\n.action-btn-small[_ngcontent-%COMP%] {\n background: white;\n border: 2px solid #e2e8f0;\n padding: 8px 12px;\n border-radius: 8px;\n font-size: 13px;\n color: #475569;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.action-btn-small[_ngcontent-%COMP%]:hover {\n background: #f8fafc;\n border-color: #6366f1;\n color: #6366f1;\n}\n\n.action-btn-small.primary[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border-color: transparent;\n color: white;\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.25);\n}\n\n.action-btn-small.primary[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.35);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 100px 32px;\n color: #64748b;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 80px;\n background: linear-gradient(135deg, #c7d2fe 0%, #ddd6fe 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n margin-bottom: 28px;\n display: block;\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n color: #1e293b;\n font-size: 24px;\n font-weight: 700;\n margin: 0 0 12px 0;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 16px;\n line-height: 1.6;\n max-width: 420px;\n margin: 0 auto 32px;\n color: #64748b;\n}\n\n.empty-state-btn[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n color: white;\n border: none;\n padding: 14px 28px;\n border-radius: 12px;\n font-size: 15px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: inline-flex;\n align-items: center;\n gap: 10px;\n box-shadow: 0 4px 15px rgba(99, 102, 241, 0.3);\n}\n\n.empty-state-btn[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 25px rgba(99, 102, 241, 0.4);\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\n\n@media (max-width: 768px) {\n .dashboard-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n padding: 16px 20px;\n }\n\n .header-info[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n justify-content: center;\n }\n\n .header-controls[_ngcontent-%COMP%] {\n justify-content: center;\n }\n\n .prompts-content[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .prompts-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .prompt-stats[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .card-header[_ngcontent-%COMP%] {\n padding: 18px;\n }\n\n .card-body[_ngcontent-%COMP%] {\n padding: 0 18px 18px 18px;\n }\n\n .card-actions[_ngcontent-%COMP%] {\n padding: 14px 18px;\n flex-wrap: wrap;\n }\n}\n\n\n\n\n\n\n.detail-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(15, 23, 42, 0.4);\n backdrop-filter: blur(4px);\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.25s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.detail-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: -480px;\n width: 480px;\n height: 100vh;\n background: white;\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transition: right 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.detail-panel.visible[_ngcontent-%COMP%] {\n right: 0;\n}\n\n\n\n.detail-panel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 24px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-bottom: 1px solid #e2e8f0;\n flex-shrink: 0;\n}\n\n.detail-panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.detail-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.detail-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: white;\n font-size: 24px;\n}\n\n.detail-title-info[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 4px 0;\n font-size: 20px;\n font-weight: 700;\n color: #1e293b;\n}\n\n.detail-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #64748b;\n font-weight: 500;\n}\n\n.detail-panel-close[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #e2e8f0;\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #64748b;\n}\n\n.detail-panel-close[_ngcontent-%COMP%]:hover {\n background: #f8fafc;\n border-color: #cbd5e1;\n color: #1e293b;\n}\n\n\n\n.detail-panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n}\n\n.detail-section[_ngcontent-%COMP%] {\n margin-bottom: 28px;\n}\n\n.detail-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.detail-badges[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.feature-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n background: linear-gradient(135deg, #eef2ff 0%, #e0e7ff 100%);\n color: #4f46e5;\n}\n\n.feature-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.detail-section-title[_ngcontent-%COMP%] {\n margin: 0 0 16px 0;\n font-size: 12px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6366f1;\n font-size: 14px;\n}\n\n.detail-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n line-height: 1.7;\n color: #475569;\n}\n\n.detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 14px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-radius: 12px;\n border: 1px solid #e2e8f0;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #1e293b;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n.detail-panel-actions[_ngcontent-%COMP%] {\n padding: 20px 24px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-top: 1px solid #e2e8f0;\n display: flex;\n gap: 12px;\n flex-shrink: 0;\n}\n\n.detail-action-btn[_ngcontent-%COMP%] {\n flex: 1;\n padding: 14px 20px;\n border-radius: 12px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.detail-action-btn.secondary[_ngcontent-%COMP%] {\n background: white;\n border: 2px solid #e2e8f0;\n color: #475569;\n}\n\n.detail-action-btn.secondary[_ngcontent-%COMP%]:hover {\n border-color: #6366f1;\n color: #6366f1;\n background: #fafbff;\n}\n\n.detail-action-btn.primary[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border: 2px solid transparent;\n color: white;\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.detail-action-btn.primary[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n transform: translateY(-1px);\n box-shadow: 0 6px 16px rgba(99, 102, 241, 0.4);\n}\n\n\n\n@media (max-width: 520px) {\n .detail-panel[_ngcontent-%COMP%] {\n width: 100%;\n right: -100%;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}"] });
|
|
1069
|
+
};
|
|
1070
|
+
PromptManagementComponent = __decorate([
|
|
1071
|
+
RegisterClass(BaseResourceComponent, 'AIPromptsResource')
|
|
1072
|
+
], PromptManagementComponent);
|
|
1073
|
+
export { PromptManagementComponent };
|
|
1074
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PromptManagementComponent, [{
|
|
1075
|
+
type: Component,
|
|
1076
|
+
args: [{ selector: 'app-prompt-management', 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)=\"showPromptDetails(prompt, $event)\"\n title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n Details\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 (click)=\"sortBy('Name')\"\n [class.sorted]=\"sortColumn === 'Name'\"\n [class.desc]=\"sortColumn === 'Name' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Name\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"sortBy('Category')\"\n [class.sorted]=\"sortColumn === 'Category'\"\n [class.desc]=\"sortColumn === 'Category' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Category\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"sortBy('Type')\"\n [class.sorted]=\"sortColumn === 'Type'\"\n [class.desc]=\"sortColumn === 'Type' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Type\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"sortBy('Status')\"\n [class.sorted]=\"sortColumn === 'Status'\"\n [class.desc]=\"sortColumn === 'Status' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Status\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </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)=\"showPromptDetails(prompt)\"\n title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></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\n <!-- Detail Panel Overlay -->\n @if (detailPanelVisible) {\n <div class=\"detail-panel-overlay\" (click)=\"closeDetailPanel()\"></div>\n }\n\n <!-- Detail Panel -->\n <div class=\"detail-panel\" [class.visible]=\"detailPanelVisible\">\n @if (selectedPrompt) {\n <!-- Panel Header -->\n <div class=\"detail-panel-header\">\n <div class=\"detail-panel-title\">\n <div class=\"detail-icon\">\n <i [class]=\"getPromptIcon(selectedPrompt)\"></i>\n </div>\n <div class=\"detail-title-info\">\n <h3>{{ selectedPrompt.Name }}</h3>\n <span class=\"detail-subtitle\">{{ selectedPrompt.TypeName || 'Prompt' }}</span>\n </div>\n </div>\n <button class=\"detail-panel-close\" (click)=\"closeDetailPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Panel Content -->\n <div class=\"detail-panel-content\">\n <!-- Status Section -->\n <div class=\"detail-section\">\n <div class=\"detail-badges\">\n <span class=\"status-badge\" [class]=\"'status-' + (selectedPrompt.Status || 'unknown').toLowerCase()\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n {{ selectedPrompt.Status || 'Unknown' }}\n </span>\n @if (selectedPrompt.TemplateEntity) {\n <span class=\"feature-badge\">\n <i class=\"fa-solid fa-file-code\"></i>\n Has Template\n </span>\n }\n </div>\n </div>\n\n <!-- Description -->\n @if (selectedPrompt.Description) {\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-align-left\"></i>\n Description\n </h4>\n <p class=\"detail-description\">{{ selectedPrompt.Description }}</p>\n </div>\n }\n\n <!-- Configuration Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-cog\"></i>\n Configuration\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Category</span>\n <span class=\"detail-value\">{{ selectedPrompt.CategoryName || 'Uncategorized' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Type</span>\n <span class=\"detail-value\">{{ selectedPrompt.TypeName || 'Unknown' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Response Format</span>\n <span class=\"detail-value\">{{ selectedPrompt.ResponseFormat }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Selection Strategy</span>\n <span class=\"detail-value\">{{ selectedPrompt.SelectionStrategy }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Power Preference</span>\n <span class=\"detail-value\">{{ selectedPrompt.PowerPreference }}</span>\n </div>\n @if (selectedPrompt.MinPowerRank) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Min Power Rank</span>\n <span class=\"detail-value\">{{ selectedPrompt.MinPowerRank }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Timestamps -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timestamps\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Created</span>\n <span class=\"detail-value\">{{ selectedPrompt.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Updated</span>\n <span class=\"detail-value\">{{ selectedPrompt.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Panel Actions -->\n <div class=\"detail-panel-actions\">\n @if (selectedPrompt.Status === 'Active') {\n <button\n type=\"button\"\n class=\"detail-action-btn secondary\"\n (click)=\"testPrompt(selectedPrompt.ID)\">\n <i class=\"fa-solid fa-play\"></i>\n Run Prompt\n </button>\n }\n <button\n type=\"button\"\n class=\"detail-action-btn primary\"\n (click)=\"openPromptFromPanel()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open Full Record\n </button>\n </div>\n }\n </div>\n</div>\n", styles: ["/* ============================================\n AI Prompts Dashboard - World-Class Design\n Modern gradient-based interface with indigo/purple theme\n ============================================ */\n\n/* Container */\n.prompt-management-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 50%, #e8f0fe 100%);\n}\n\n/* Dashboard Header - Clean White Style */\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 8px rgba(0, 0, 0, 0.06);\n position: relative;\n z-index: 10;\n}\n\n.header-info {\n display: flex;\n align-items: center;\n gap: 20px;\n}\n\n.dashboard-title {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: #1e293b;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.dashboard-title i {\n color: #6366f1;\n font-size: 22px;\n}\n\n.filter-toggle-btn {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n padding: 8px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: #475569;\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: #f1f5f9;\n border-color: #cbd5e1;\n color: #1e293b;\n}\n\n.filter-toggle-btn i {\n font-size: 13px;\n color: #6366f1;\n}\n\n.item-count {\n color: #64748b;\n font-size: 13px;\n font-weight: 500;\n background: #f1f5f9;\n padding: 6px 12px;\n border-radius: 16px;\n}\n\n.header-controls {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n/* View Toggle */\n.view-toggle {\n display: flex;\n background: #f1f5f9;\n border-radius: 8px;\n padding: 3px;\n border: 1px solid #e2e8f0;\n}\n\n.view-btn {\n background: transparent;\n border: none;\n padding: 8px 12px;\n border-radius: 6px;\n color: #64748b;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 14px;\n}\n\n.view-btn:hover {\n color: #1e293b;\n background: rgba(99, 102, 241, 0.08);\n}\n\n.view-btn.active {\n background: white;\n color: #6366f1;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.control-btn {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n padding: 8px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n color: #475569;\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: #f1f5f9;\n border-color: #cbd5e1;\n color: #1e293b;\n}\n\n.control-btn.primary {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border-color: transparent;\n color: white;\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.25);\n}\n\n.control-btn.primary:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.35);\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/* Splitter Styling */\nkendo-splitter {\n background: transparent;\n}\n\n:host ::ng-deep .k-splitter {\n border: none;\n background: transparent;\n}\n\n:host ::ng-deep .k-splitbar {\n background: #e5e7eb;\n width: 6px;\n}\n\n:host ::ng-deep .k-splitbar:hover {\n background: #c7d2fe;\n}\n\n:host ::ng-deep .k-pane {\n overflow: hidden;\n}\n\n/* Filter Panel */\n.filter-panel {\n height: 100%;\n background: white;\n border-right: 1px solid #e5e7eb;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* Header */\n.filter-panel-header {\n padding: 20px;\n border-bottom: 1px solid #f1f5f9;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: linear-gradient(135deg, #fafbfc 0%, #f8fafc 100%);\n}\n\n.filter-panel-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: #1e293b;\n flex: 1;\n letter-spacing: -0.02em;\n}\n\n.filter-panel-header .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 16px;\n font-size: 13px;\n padding: 6px 12px;\n background: linear-gradient(135deg, #ede9fe 0%, #ddd6fe 100%);\n border-radius: 20px;\n border: 1px solid #c4b5fd;\n}\n\n.filter-panel-header .filter-summary-inline .summary-value {\n font-weight: 700;\n color: #6366f1;\n}\n\n.filter-panel-header .filter-summary-inline .summary-label {\n color: #7c3aed;\n font-weight: 500;\n}\n\n.filter-panel-header .close-btn {\n background: transparent;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: #94a3b8;\n border-radius: 8px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.filter-panel-header .close-btn:hover {\n background: #f1f5f9;\n color: #475569;\n}\n\n.filter-panel-header .close-btn .fa-solid {\n font-size: 14px;\n}\n\n/* Content Area */\n.filter-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 20px;\n}\n\n/* Filter Groups */\n.filter-group {\n margin-bottom: 24px;\n}\n\n.filter-group .filter-label {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n font-size: 12px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.75px;\n}\n\n.filter-group .filter-label .fa-solid {\n font-size: 13px;\n color: #6366f1;\n width: 16px;\n}\n\n.filter-group .filter-input,\n.filter-group .filter-select {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n font-size: 14px;\n background: white;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: #334155;\n}\n\n.filter-group .filter-input:focus,\n.filter-group .filter-select:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);\n}\n\n.filter-group .filter-input::placeholder {\n color: #94a3b8;\n}\n\n.filter-group .filter-select {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n/* Legacy support for non-scoped selectors */\n.filter-input,\n.filter-select {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n font-size: 14px;\n background: white;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: #334155;\n}\n\n.filter-input:focus,\n.filter-select:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);\n}\n\n.filter-input::placeholder {\n color: #94a3b8;\n}\n\n.filter-select {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n/* Filter Actions */\n.filter-actions {\n margin-top: 28px;\n padding-top: 20px;\n border-top: 1px solid #f1f5f9;\n}\n\n.filter-actions .reset-btn {\n width: 100%;\n padding: 12px 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n color: #64748b;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n}\n\n.filter-actions .reset-btn:hover {\n background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);\n border-color: #cbd5e1;\n color: #475569;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.filter-actions .reset-btn .fa-solid {\n font-size: 13px;\n}\n\n/* Scrollbar Styling */\n.filter-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.filter-content::-webkit-scrollbar-track {\n background: #f8fafc;\n border-radius: 3px;\n}\n\n.filter-content::-webkit-scrollbar-thumb {\n background: #cbd5e1;\n border-radius: 3px;\n}\n\n.filter-content::-webkit-scrollbar-thumb:hover {\n background: #94a3b8;\n}\n\n/* Prompts Content */\n.prompts-content {\n height: 100%;\n overflow-y: auto;\n padding: 28px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 50%, #e8f0fe 100%);\n}\n\n/* Grid View */\n.prompts-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));\n gap: 24px;\n}\n\n.prompt-card {\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);\n border: 1px solid #e2e8f0;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n position: relative;\n}\n\n.prompt-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n background: linear-gradient(90deg, #6366f1 0%, #8b5cf6 50%, #a78bfa 100%);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.prompt-card:hover {\n box-shadow: 0 20px 40px -15px rgba(99, 102, 241, 0.25);\n transform: translateY(-4px);\n border-color: #c7d2fe;\n}\n\n.prompt-card:hover::before {\n opacity: 1;\n}\n\n.prompt-card.expanded {\n box-shadow: 0 25px 50px -12px rgba(99, 102, 241, 0.3);\n border-color: #a5b4fc;\n}\n\n.prompt-card.expanded::before {\n opacity: 1;\n}\n\n.card-header {\n padding: 24px;\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 #f1f5f9;\n transition: background-color 0.2s;\n}\n\n.card-header:hover {\n background-color: #fafbfc;\n}\n\n.prompt-info {\n display: flex;\n gap: 18px;\n flex: 1;\n}\n\n.prompt-icon {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.prompt-icon i {\n color: white;\n font-size: 24px;\n}\n\n.prompt-details {\n flex: 1;\n min-width: 0;\n}\n\n.prompt-name {\n margin: 0;\n font-size: 18px;\n font-weight: 700;\n color: #1e293b;\n margin-bottom: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.prompt-meta {\n display: flex;\n gap: 14px;\n flex-wrap: wrap;\n}\n\n.meta-item {\n font-size: 13px;\n color: #64748b;\n display: flex;\n align-items: center;\n gap: 6px;\n background: #f1f5f9;\n padding: 4px 10px;\n border-radius: 6px;\n}\n\n.meta-item i {\n font-size: 11px;\n color: #6366f1;\n}\n\n.meta-item.status-active {\n color: #059669;\n background: #d1fae5;\n}\n\n.meta-item.status-active i {\n color: #059669;\n}\n\n.meta-item.status-pending {\n color: #d97706;\n background: #fef3c7;\n}\n\n.meta-item.status-pending i {\n color: #d97706;\n}\n\n.meta-item.status-inactive {\n color: #64748b;\n background: #e2e8f0;\n}\n\n.meta-item.status-inactive i {\n color: #64748b;\n}\n\n.expand-icon {\n font-size: 16px;\n color: #94a3b8;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n padding: 8px;\n border-radius: 8px;\n}\n\n.expand-icon:hover {\n color: #6366f1;\n background: #f1f5f9;\n}\n\n.expand-icon.rotated {\n transform: rotate(180deg);\n color: #6366f1;\n}\n\n.card-body {\n padding: 0 24px 24px 24px;\n}\n\n.prompt-description {\n margin: 18px 0 0 0;\n font-size: 14px;\n line-height: 1.7;\n color: #64748b;\n}\n\n.prompt-description.text-muted {\n font-style: italic;\n color: #94a3b8;\n}\n\n/* Expanded Content */\n.expanded-content {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid #e2e8f0;\n animation: slideDown 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-12px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.prompt-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 18px;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-radius: 12px;\n border: 1px solid #e2e8f0;\n}\n\n.stat-label {\n font-size: 11px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat-value {\n font-size: 15px;\n color: #1e293b;\n font-weight: 600;\n}\n\n/* Card Actions */\n.card-actions {\n padding: 18px 24px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-top: 1px solid #e2e8f0;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.action-btn {\n background: white;\n border: 2px solid #e2e8f0;\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 600;\n color: #475569;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.action-btn:hover {\n background: #f8fafc;\n border-color: #6366f1;\n color: #6366f1;\n transform: translateY(-1px);\n}\n\n.action-btn-primary {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border-color: transparent;\n color: white;\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.action-btn-primary:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px rgba(99, 102, 241, 0.4);\n}\n\n/* List View */\n.prompts-list {\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n border: 1px solid #e2e8f0;\n overflow: hidden;\n}\n\n.prompts-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.prompts-table thead {\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-bottom: 2px solid #e2e8f0;\n}\n\n.prompts-table th {\n padding: 16px 20px;\n text-align: left;\n font-size: 12px;\n font-weight: 700;\n color: #475569;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n cursor: pointer;\n user-select: none;\n transition: all 0.2s ease;\n}\n\n.prompts-table th:hover {\n background: #e2e8f0;\n color: #6366f1;\n}\n\n.prompts-table th:last-child {\n cursor: default;\n}\n\n.prompts-table th:last-child:hover {\n background: transparent;\n color: #475569;\n}\n\n.prompts-table th.sorted {\n color: #6366f1;\n background: linear-gradient(135deg, #eef2ff 0%, #e0e7ff 100%);\n}\n\n.prompts-table th.sorted.desc .sort-icon {\n transform: rotate(180deg);\n}\n\n.prompts-table .sort-header {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.prompts-table .sort-icon {\n font-size: 10px;\n opacity: 0;\n transition: all 0.2s ease;\n}\n\n.prompts-table th:hover .sort-icon {\n opacity: 0.5;\n}\n\n.prompts-table th.sorted .sort-icon {\n opacity: 1;\n color: #6366f1;\n}\n\n.prompts-table tbody tr {\n border-bottom: 1px solid #f1f5f9;\n transition: background-color 0.2s;\n}\n\n.prompts-table tbody tr:last-child {\n border-bottom: none;\n}\n\n.prompts-table tbody tr:hover {\n background: linear-gradient(135deg, #fafbfc 0%, #f8fafc 100%);\n}\n\n.prompts-table td {\n padding: 18px 20px;\n font-size: 14px;\n color: #475569;\n}\n\n.prompt-name-cell {\n display: flex;\n align-items: center;\n gap: 14px;\n}\n\n.prompt-icon-small {\n width: 42px;\n height: 42px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.25);\n}\n\n.prompt-icon-small i {\n color: white;\n font-size: 18px;\n}\n\n.prompt-name-cell .prompt-name {\n font-weight: 600;\n color: #1e293b;\n margin-bottom: 0;\n white-space: normal;\n}\n\n.prompt-description-small {\n font-size: 13px;\n color: #64748b;\n margin-top: 4px;\n line-height: 1.4;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.status-badge i {\n font-size: 8px;\n}\n\n.status-badge.status-active {\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n color: #047857;\n}\n\n.status-badge.status-pending {\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n color: #b45309;\n}\n\n.status-badge.status-inactive {\n background: linear-gradient(135deg, #e2e8f0 0%, #cbd5e1 100%);\n color: #475569;\n}\n\n.status-badge.status-unknown {\n background: #f1f5f9;\n color: #64748b;\n}\n\n.table-actions {\n display: flex;\n gap: 10px;\n}\n\n.action-btn-small {\n background: white;\n border: 2px solid #e2e8f0;\n padding: 8px 12px;\n border-radius: 8px;\n font-size: 13px;\n color: #475569;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.action-btn-small:hover {\n background: #f8fafc;\n border-color: #6366f1;\n color: #6366f1;\n}\n\n.action-btn-small.primary {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border-color: transparent;\n color: white;\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.25);\n}\n\n.action-btn-small.primary:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.35);\n}\n\n/* Empty State */\n.empty-state {\n text-align: center;\n padding: 100px 32px;\n color: #64748b;\n}\n\n.empty-state i {\n font-size: 80px;\n background: linear-gradient(135deg, #c7d2fe 0%, #ddd6fe 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n margin-bottom: 28px;\n display: block;\n}\n\n.empty-state h3 {\n color: #1e293b;\n font-size: 24px;\n font-weight: 700;\n margin: 0 0 12px 0;\n}\n\n.empty-state p {\n font-size: 16px;\n line-height: 1.6;\n max-width: 420px;\n margin: 0 auto 32px;\n color: #64748b;\n}\n\n.empty-state-btn {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n color: white;\n border: none;\n padding: 14px 28px;\n border-radius: 12px;\n font-size: 15px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: inline-flex;\n align-items: center;\n gap: 10px;\n box-shadow: 0 4px 15px rgba(99, 102, 241, 0.3);\n}\n\n.empty-state-btn:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 25px rgba(99, 102, 241, 0.4);\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/* Responsive Design */\n@media (max-width: 768px) {\n .dashboard-header {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n padding: 16px 20px;\n }\n\n .header-info {\n flex-wrap: wrap;\n justify-content: center;\n }\n\n .header-controls {\n justify-content: center;\n }\n\n .prompts-content {\n padding: 16px;\n }\n\n .prompts-grid {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .prompt-stats {\n grid-template-columns: 1fr;\n }\n\n .card-header {\n padding: 18px;\n }\n\n .card-body {\n padding: 0 18px 18px 18px;\n }\n\n .card-actions {\n padding: 14px 18px;\n flex-wrap: wrap;\n }\n}\n\n/* =============================================\n Detail Panel - Slide-in Overlay\n ============================================= */\n\n.detail-panel-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(15, 23, 42, 0.4);\n backdrop-filter: blur(4px);\n z-index: 1000;\n animation: fadeIn 0.25s ease-out;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.detail-panel {\n position: fixed;\n top: 0;\n right: -480px;\n width: 480px;\n height: 100vh;\n background: white;\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transition: right 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.detail-panel.visible {\n right: 0;\n}\n\n/* Detail Panel Header */\n.detail-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 24px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-bottom: 1px solid #e2e8f0;\n flex-shrink: 0;\n}\n\n.detail-panel-title {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.detail-icon {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.detail-icon i {\n color: white;\n font-size: 24px;\n}\n\n.detail-title-info h3 {\n margin: 0 0 4px 0;\n font-size: 20px;\n font-weight: 700;\n color: #1e293b;\n}\n\n.detail-subtitle {\n font-size: 13px;\n color: #64748b;\n font-weight: 500;\n}\n\n.detail-panel-close {\n background: white;\n border: 1px solid #e2e8f0;\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #64748b;\n}\n\n.detail-panel-close:hover {\n background: #f8fafc;\n border-color: #cbd5e1;\n color: #1e293b;\n}\n\n/* Detail Panel Content */\n.detail-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n}\n\n.detail-section {\n margin-bottom: 28px;\n}\n\n.detail-section:last-child {\n margin-bottom: 0;\n}\n\n.detail-badges {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.feature-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n background: linear-gradient(135deg, #eef2ff 0%, #e0e7ff 100%);\n color: #4f46e5;\n}\n\n.feature-badge i {\n font-size: 11px;\n}\n\n.detail-section-title {\n margin: 0 0 16px 0;\n font-size: 12px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-section-title i {\n color: #6366f1;\n font-size: 14px;\n}\n\n.detail-description {\n margin: 0;\n font-size: 14px;\n line-height: 1.7;\n color: #475569;\n}\n\n.detail-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 14px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-radius: 12px;\n border: 1px solid #e2e8f0;\n}\n\n.detail-label {\n font-size: 11px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.detail-value {\n font-size: 14px;\n color: #1e293b;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-value i {\n font-size: 13px;\n}\n\n/* Detail Panel Actions */\n.detail-panel-actions {\n padding: 20px 24px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-top: 1px solid #e2e8f0;\n display: flex;\n gap: 12px;\n flex-shrink: 0;\n}\n\n.detail-action-btn {\n flex: 1;\n padding: 14px 20px;\n border-radius: 12px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.detail-action-btn.secondary {\n background: white;\n border: 2px solid #e2e8f0;\n color: #475569;\n}\n\n.detail-action-btn.secondary:hover {\n border-color: #6366f1;\n color: #6366f1;\n background: #fafbff;\n}\n\n.detail-action-btn.primary {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border: 2px solid transparent;\n color: white;\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.detail-action-btn.primary:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n transform: translateY(-1px);\n box-shadow: 0 6px 16px rgba(99, 102, 241, 0.4);\n}\n\n/* Detail Panel Responsive */\n@media (max-width: 520px) {\n .detail-panel {\n width: 100%;\n right: -100%;\n }\n\n .detail-grid {\n grid-template-columns: 1fr;\n }\n}\n"] }]
|
|
1077
|
+
}], () => [{ type: i1.SharedService }, { type: i2.AITestHarnessDialogService }, { type: i1.NavigationService }], null); })();
|
|
1078
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PromptManagementComponent, { className: "PromptManagementComponent", filePath: "src/AI/components/prompts/prompt-management.component.ts", lineNumber: 39 }); })();
|
|
1079
|
+
//# sourceMappingURL=prompt-management.component.js.map
|