@memberjunction/ng-dashboards 2.50.0 → 2.52.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/ai-dashboard.component.d.ts +4 -0
- package/dist/AI/ai-dashboard.component.d.ts.map +1 -1
- package/dist/AI/ai-dashboard.component.js +71 -23
- package/dist/AI/ai-dashboard.component.js.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.d.ts +18 -8
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +338 -130
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +0 -5
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +16 -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 +124 -14
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.d.ts +2 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.js +56 -2
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts +4 -7
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +339 -368
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management-v2.component.d.ts +92 -0
- package/dist/AI/components/models/model-management-v2.component.d.ts.map +1 -0
- package/dist/AI/components/models/model-management-v2.component.js +1004 -0
- package/dist/AI/components/models/model-management-v2.component.js.map +1 -0
- package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +66 -0
- package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +1 -0
- package/dist/AI/components/prompts/prompt-management-v2.component.js +719 -0
- package/dist/AI/components/prompts/prompt-management-v2.component.js.map +1 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts +7 -6
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +141 -147
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/Actions/actions-management-dashboard.component.js +8 -8
- package/dist/Actions/actions-management-dashboard.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.d.ts +0 -2
- package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +37 -37
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +7 -4
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +147 -90
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts +23 -2
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +283 -17
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +0 -2
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +25 -37
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/module.d.ts +3 -3
- package/dist/module.js +6 -6
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +7 -6
- package/dist/AI/components/models/model-management.component.d.ts +0 -73
- package/dist/AI/components/models/model-management.component.d.ts.map +0 -1
- package/dist/AI/components/models/model-management.component.js +0 -643
- package/dist/AI/components/models/model-management.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +0 -118
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-management.component.js +0 -1351
- package/dist/AI/components/prompts/prompt-management.component.js.map +0 -1
|
@@ -1,643 +0,0 @@
|
|
|
1
|
-
import { Component, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import { RunView, Metadata, LogError, LogStatus } from '@memberjunction/core';
|
|
3
|
-
import { Subject, combineLatest, BehaviorSubject } from 'rxjs';
|
|
4
|
-
import { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/forms";
|
|
7
|
-
import * as i2 from "@progress/kendo-angular-layout";
|
|
8
|
-
import * as i3 from "@memberjunction/ng-container-directives";
|
|
9
|
-
const _forTrack0 = ($index, $item) => $item.ID;
|
|
10
|
-
const _forTrack1 = ($index, $item) => $item.model.ID;
|
|
11
|
-
function ModelManagementComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
12
|
-
i0.ɵɵelementStart(0, "div", 11)(1, "div", 14)(2, "div", 15);
|
|
13
|
-
i0.ɵɵelement(3, "div", 16)(4, "div", 16)(5, "div", 16);
|
|
14
|
-
i0.ɵɵelementEnd();
|
|
15
|
-
i0.ɵɵelementStart(6, "div", 17);
|
|
16
|
-
i0.ɵɵtext(7);
|
|
17
|
-
i0.ɵɵelementEnd()()();
|
|
18
|
-
} if (rf & 2) {
|
|
19
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
20
|
-
i0.ɵɵadvance(7);
|
|
21
|
-
i0.ɵɵtextInterpolate(ctx_r0.loadingMessage);
|
|
22
|
-
} }
|
|
23
|
-
function ModelManagementComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
24
|
-
i0.ɵɵelementStart(0, "div", 12)(1, "p", 18);
|
|
25
|
-
i0.ɵɵtext(2);
|
|
26
|
-
i0.ɵɵelementEnd()();
|
|
27
|
-
} if (rf & 2) {
|
|
28
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
29
|
-
i0.ɵɵadvance(2);
|
|
30
|
-
i0.ɵɵtextInterpolate(ctx_r0.error);
|
|
31
|
-
} }
|
|
32
|
-
function ModelManagementComponent_Conditional_17_For_21_Template(rf, ctx) { if (rf & 1) {
|
|
33
|
-
i0.ɵɵelementStart(0, "option", 30);
|
|
34
|
-
i0.ɵɵtext(1);
|
|
35
|
-
i0.ɵɵelementEnd();
|
|
36
|
-
} if (rf & 2) {
|
|
37
|
-
const vendor_r3 = ctx.$implicit;
|
|
38
|
-
i0.ɵɵproperty("value", vendor_r3.ID);
|
|
39
|
-
i0.ɵɵadvance();
|
|
40
|
-
i0.ɵɵtextInterpolate(vendor_r3.Name);
|
|
41
|
-
} }
|
|
42
|
-
function ModelManagementComponent_Conditional_17_For_29_Template(rf, ctx) { if (rf & 1) {
|
|
43
|
-
i0.ɵɵelementStart(0, "option", 30);
|
|
44
|
-
i0.ɵɵtext(1);
|
|
45
|
-
i0.ɵɵelementEnd();
|
|
46
|
-
} if (rf & 2) {
|
|
47
|
-
const type_r4 = ctx.$implicit;
|
|
48
|
-
i0.ɵɵproperty("value", type_r4.ID);
|
|
49
|
-
i0.ɵɵadvance();
|
|
50
|
-
i0.ɵɵtextInterpolate(type_r4.Name);
|
|
51
|
-
} }
|
|
52
|
-
function ModelManagementComponent_Conditional_17_Conditional_46_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
53
|
-
const _r5 = i0.ɵɵgetCurrentView();
|
|
54
|
-
i0.ɵɵelementStart(0, "p");
|
|
55
|
-
i0.ɵɵtext(1, "No AI models have been configured yet.");
|
|
56
|
-
i0.ɵɵelementEnd();
|
|
57
|
-
i0.ɵɵelementStart(2, "button", 38);
|
|
58
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_17_Conditional_46_Conditional_4_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.createNewModel()); });
|
|
59
|
-
i0.ɵɵelement(3, "span", 8);
|
|
60
|
-
i0.ɵɵtext(4, " Add First Model ");
|
|
61
|
-
i0.ɵɵelementEnd();
|
|
62
|
-
} }
|
|
63
|
-
function ModelManagementComponent_Conditional_17_Conditional_46_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
64
|
-
const _r6 = i0.ɵɵgetCurrentView();
|
|
65
|
-
i0.ɵɵelementStart(0, "p");
|
|
66
|
-
i0.ɵɵtext(1, "No models match your current filters.");
|
|
67
|
-
i0.ɵɵelementEnd();
|
|
68
|
-
i0.ɵɵelementStart(2, "button", 38);
|
|
69
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_17_Conditional_46_Conditional_5_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.clearFilters()); });
|
|
70
|
-
i0.ɵɵtext(3, "Clear Filters");
|
|
71
|
-
i0.ɵɵelementEnd();
|
|
72
|
-
} }
|
|
73
|
-
function ModelManagementComponent_Conditional_17_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
74
|
-
i0.ɵɵelementStart(0, "div", 35);
|
|
75
|
-
i0.ɵɵelement(1, "span", 37);
|
|
76
|
-
i0.ɵɵelementStart(2, "h3");
|
|
77
|
-
i0.ɵɵtext(3, "No Models Found");
|
|
78
|
-
i0.ɵɵelementEnd();
|
|
79
|
-
i0.ɵɵtemplate(4, ModelManagementComponent_Conditional_17_Conditional_46_Conditional_4_Template, 5, 0)(5, ModelManagementComponent_Conditional_17_Conditional_46_Conditional_5_Template, 4, 0);
|
|
80
|
-
i0.ɵɵelementEnd();
|
|
81
|
-
} if (rf & 2) {
|
|
82
|
-
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
83
|
-
i0.ɵɵadvance(4);
|
|
84
|
-
i0.ɵɵconditional(ctx_r0.models.length === 0 ? 4 : 5);
|
|
85
|
-
} }
|
|
86
|
-
function ModelManagementComponent_Conditional_17_Conditional_47_For_2_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
87
|
-
i0.ɵɵelementStart(0, "div", 49);
|
|
88
|
-
i0.ɵɵtext(1);
|
|
89
|
-
i0.ɵɵelementEnd();
|
|
90
|
-
} if (rf & 2) {
|
|
91
|
-
const displayData_r8 = i0.ɵɵnextContext().$implicit;
|
|
92
|
-
i0.ɵɵadvance();
|
|
93
|
-
i0.ɵɵtextInterpolate1(" ", displayData_r8.model.Description, " ");
|
|
94
|
-
} }
|
|
95
|
-
function ModelManagementComponent_Conditional_17_Conditional_47_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
96
|
-
const _r7 = i0.ɵɵgetCurrentView();
|
|
97
|
-
i0.ɵɵelementStart(0, "div", 40);
|
|
98
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_17_Conditional_47_For_2_Template_div_click_0_listener() { const displayData_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onOpenModel(displayData_r8.model)); });
|
|
99
|
-
i0.ɵɵelementStart(1, "div", 41)(2, "div", 42)(3, "h4");
|
|
100
|
-
i0.ɵɵtext(4);
|
|
101
|
-
i0.ɵɵelementEnd();
|
|
102
|
-
i0.ɵɵelementStart(5, "span", 43);
|
|
103
|
-
i0.ɵɵtext(6);
|
|
104
|
-
i0.ɵɵelementEnd()();
|
|
105
|
-
i0.ɵɵelementStart(7, "div", 44);
|
|
106
|
-
i0.ɵɵtext(8);
|
|
107
|
-
i0.ɵɵelementEnd()();
|
|
108
|
-
i0.ɵɵelementStart(9, "div", 45)(10, "div", 46)(11, "span", 47);
|
|
109
|
-
i0.ɵɵtext(12, "Type:");
|
|
110
|
-
i0.ɵɵelementEnd();
|
|
111
|
-
i0.ɵɵelementStart(13, "span", 48);
|
|
112
|
-
i0.ɵɵtext(14);
|
|
113
|
-
i0.ɵɵelementEnd()();
|
|
114
|
-
i0.ɵɵelementStart(15, "div", 46)(16, "span", 47);
|
|
115
|
-
i0.ɵɵtext(17, "Power:");
|
|
116
|
-
i0.ɵɵelementEnd();
|
|
117
|
-
i0.ɵɵelementStart(18, "span", 48);
|
|
118
|
-
i0.ɵɵtext(19);
|
|
119
|
-
i0.ɵɵelementEnd()();
|
|
120
|
-
i0.ɵɵelementStart(20, "div", 46)(21, "span", 47);
|
|
121
|
-
i0.ɵɵtext(22, "Speed:");
|
|
122
|
-
i0.ɵɵelementEnd();
|
|
123
|
-
i0.ɵɵelementStart(23, "span", 48);
|
|
124
|
-
i0.ɵɵtext(24);
|
|
125
|
-
i0.ɵɵelementEnd()();
|
|
126
|
-
i0.ɵɵelementStart(25, "div", 46)(26, "span", 47);
|
|
127
|
-
i0.ɵɵtext(27, "Cost:");
|
|
128
|
-
i0.ɵɵelementEnd();
|
|
129
|
-
i0.ɵɵelementStart(28, "span", 48);
|
|
130
|
-
i0.ɵɵtext(29);
|
|
131
|
-
i0.ɵɵelementEnd()()();
|
|
132
|
-
i0.ɵɵtemplate(30, ModelManagementComponent_Conditional_17_Conditional_47_For_2_Conditional_30_Template, 2, 1, "div", 49);
|
|
133
|
-
i0.ɵɵelementStart(31, "div", 50)(32, "button", 51);
|
|
134
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_17_Conditional_47_For_2_Template_button_click_32_listener($event) { const displayData_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); $event.stopPropagation(); return i0.ɵɵresetView(ctx_r0.toggleModelStatus(displayData_r8.model)); });
|
|
135
|
-
i0.ɵɵelement(33, "span");
|
|
136
|
-
i0.ɵɵelementEnd();
|
|
137
|
-
i0.ɵɵelementStart(34, "button", 52);
|
|
138
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_17_Conditional_47_For_2_Template_button_click_34_listener($event) { const displayData_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); $event.stopPropagation(); return i0.ɵɵresetView(ctx_r0.onOpenModel(displayData_r8.model)); });
|
|
139
|
-
i0.ɵɵelement(35, "span", 53);
|
|
140
|
-
i0.ɵɵelementEnd()()();
|
|
141
|
-
} if (rf & 2) {
|
|
142
|
-
const displayData_r8 = ctx.$implicit;
|
|
143
|
-
i0.ɵɵadvance(4);
|
|
144
|
-
i0.ɵɵtextInterpolate(displayData_r8.model.Name);
|
|
145
|
-
i0.ɵɵadvance(2);
|
|
146
|
-
i0.ɵɵtextInterpolate((displayData_r8.vendor == null ? null : displayData_r8.vendor.Name) || "Unknown Vendor");
|
|
147
|
-
i0.ɵɵadvance();
|
|
148
|
-
i0.ɵɵclassProp("active", displayData_r8.model.IsActive);
|
|
149
|
-
i0.ɵɵadvance();
|
|
150
|
-
i0.ɵɵtextInterpolate1(" ", displayData_r8.statusDisplay, " ");
|
|
151
|
-
i0.ɵɵadvance(6);
|
|
152
|
-
i0.ɵɵtextInterpolate((displayData_r8.modelType == null ? null : displayData_r8.modelType.Name) || "Unknown");
|
|
153
|
-
i0.ɵɵadvance(5);
|
|
154
|
-
i0.ɵɵtextInterpolate(displayData_r8.powerRankDisplay);
|
|
155
|
-
i0.ɵɵadvance(5);
|
|
156
|
-
i0.ɵɵtextInterpolate(displayData_r8.speedRankDisplay);
|
|
157
|
-
i0.ɵɵadvance(5);
|
|
158
|
-
i0.ɵɵtextInterpolate(displayData_r8.costRankDisplay);
|
|
159
|
-
i0.ɵɵadvance();
|
|
160
|
-
i0.ɵɵconditional(displayData_r8.model.Description ? 30 : -1);
|
|
161
|
-
i0.ɵɵadvance(2);
|
|
162
|
-
i0.ɵɵproperty("title", displayData_r8.model.IsActive ? "Deactivate" : "Activate");
|
|
163
|
-
i0.ɵɵadvance();
|
|
164
|
-
i0.ɵɵclassMap(displayData_r8.model.IsActive ? "fa-solid fa-pause" : "fa-solid fa-play");
|
|
165
|
-
} }
|
|
166
|
-
function ModelManagementComponent_Conditional_17_Conditional_47_Template(rf, ctx) { if (rf & 1) {
|
|
167
|
-
i0.ɵɵelementStart(0, "div", 36);
|
|
168
|
-
i0.ɵɵrepeaterCreate(1, ModelManagementComponent_Conditional_17_Conditional_47_For_2_Template, 36, 13, "div", 39, _forTrack1);
|
|
169
|
-
i0.ɵɵelementEnd();
|
|
170
|
-
} if (rf & 2) {
|
|
171
|
-
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
172
|
-
i0.ɵɵadvance();
|
|
173
|
-
i0.ɵɵrepeater(ctx_r0.filteredModels);
|
|
174
|
-
} }
|
|
175
|
-
function ModelManagementComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
176
|
-
const _r2 = i0.ɵɵgetCurrentView();
|
|
177
|
-
i0.ɵɵelementStart(0, "div", 13)(1, "kendo-splitter", 19)(2, "kendo-splitter-pane", 20)(3, "div", 21)(4, "div", 22)(5, "h3");
|
|
178
|
-
i0.ɵɵtext(6, "Filters");
|
|
179
|
-
i0.ɵɵelementEnd();
|
|
180
|
-
i0.ɵɵelementStart(7, "button", 23);
|
|
181
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_17_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleFiltersVisible()); });
|
|
182
|
-
i0.ɵɵelement(8, "span", 24);
|
|
183
|
-
i0.ɵɵelementEnd()();
|
|
184
|
-
i0.ɵɵelementStart(9, "div", 25)(10, "div", 26)(11, "label");
|
|
185
|
-
i0.ɵɵtext(12, "Search");
|
|
186
|
-
i0.ɵɵelementEnd();
|
|
187
|
-
i0.ɵɵelementStart(13, "input", 27);
|
|
188
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ModelManagementComponent_Conditional_17_Template_input_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.filter.searchTerm, $event) || (ctx_r0.filter.searchTerm = $event); return i0.ɵɵresetView($event); });
|
|
189
|
-
i0.ɵɵlistener("ngModelChange", function ModelManagementComponent_Conditional_17_Template_input_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onSearchChange($event)); });
|
|
190
|
-
i0.ɵɵelementEnd()();
|
|
191
|
-
i0.ɵɵelementStart(14, "div", 28)(15, "label");
|
|
192
|
-
i0.ɵɵtext(16, "Vendor");
|
|
193
|
-
i0.ɵɵelementEnd();
|
|
194
|
-
i0.ɵɵelementStart(17, "select", 29);
|
|
195
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ModelManagementComponent_Conditional_17_Template_select_ngModelChange_17_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.filter.vendorId, $event) || (ctx_r0.filter.vendorId = $event); return i0.ɵɵresetView($event); });
|
|
196
|
-
i0.ɵɵlistener("ngModelChange", function ModelManagementComponent_Conditional_17_Template_select_ngModelChange_17_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onFilterChange()); });
|
|
197
|
-
i0.ɵɵelementStart(18, "option", 30);
|
|
198
|
-
i0.ɵɵtext(19, "All Vendors");
|
|
199
|
-
i0.ɵɵelementEnd();
|
|
200
|
-
i0.ɵɵrepeaterCreate(20, ModelManagementComponent_Conditional_17_For_21_Template, 2, 2, "option", 30, _forTrack0);
|
|
201
|
-
i0.ɵɵelementEnd()();
|
|
202
|
-
i0.ɵɵelementStart(22, "div", 28)(23, "label");
|
|
203
|
-
i0.ɵɵtext(24, "Type");
|
|
204
|
-
i0.ɵɵelementEnd();
|
|
205
|
-
i0.ɵɵelementStart(25, "select", 29);
|
|
206
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ModelManagementComponent_Conditional_17_Template_select_ngModelChange_25_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.filter.modelTypeId, $event) || (ctx_r0.filter.modelTypeId = $event); return i0.ɵɵresetView($event); });
|
|
207
|
-
i0.ɵɵlistener("ngModelChange", function ModelManagementComponent_Conditional_17_Template_select_ngModelChange_25_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onFilterChange()); });
|
|
208
|
-
i0.ɵɵelementStart(26, "option", 30);
|
|
209
|
-
i0.ɵɵtext(27, "All Types");
|
|
210
|
-
i0.ɵɵelementEnd();
|
|
211
|
-
i0.ɵɵrepeaterCreate(28, ModelManagementComponent_Conditional_17_For_29_Template, 2, 2, "option", 30, _forTrack0);
|
|
212
|
-
i0.ɵɵelementEnd()();
|
|
213
|
-
i0.ɵɵelementStart(30, "div", 28)(31, "label");
|
|
214
|
-
i0.ɵɵtext(32, "Status");
|
|
215
|
-
i0.ɵɵelementEnd();
|
|
216
|
-
i0.ɵɵelementStart(33, "select", 29);
|
|
217
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ModelManagementComponent_Conditional_17_Template_select_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.filter.isActive, $event) || (ctx_r0.filter.isActive = $event); return i0.ɵɵresetView($event); });
|
|
218
|
-
i0.ɵɵlistener("ngModelChange", function ModelManagementComponent_Conditional_17_Template_select_ngModelChange_33_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onFilterChange()); });
|
|
219
|
-
i0.ɵɵelementStart(34, "option", 30);
|
|
220
|
-
i0.ɵɵtext(35, "All");
|
|
221
|
-
i0.ɵɵelementEnd();
|
|
222
|
-
i0.ɵɵelementStart(36, "option", 30);
|
|
223
|
-
i0.ɵɵtext(37, "Active");
|
|
224
|
-
i0.ɵɵelementEnd();
|
|
225
|
-
i0.ɵɵelementStart(38, "option", 30);
|
|
226
|
-
i0.ɵɵtext(39, "Inactive");
|
|
227
|
-
i0.ɵɵelementEnd()()();
|
|
228
|
-
i0.ɵɵelementStart(40, "div", 31)(41, "button", 32);
|
|
229
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_17_Template_button_click_41_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.clearFilters()); });
|
|
230
|
-
i0.ɵɵelement(42, "span", 24);
|
|
231
|
-
i0.ɵɵtext(43, " Clear All ");
|
|
232
|
-
i0.ɵɵelementEnd()()()()();
|
|
233
|
-
i0.ɵɵelementStart(44, "kendo-splitter-pane", 33)(45, "div", 34);
|
|
234
|
-
i0.ɵɵtemplate(46, ModelManagementComponent_Conditional_17_Conditional_46_Template, 6, 1, "div", 35)(47, ModelManagementComponent_Conditional_17_Conditional_47_Template, 3, 0, "div", 36);
|
|
235
|
-
i0.ɵɵelementEnd()()()();
|
|
236
|
-
} if (rf & 2) {
|
|
237
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
238
|
-
i0.ɵɵadvance(2);
|
|
239
|
-
i0.ɵɵproperty("size", ctx_r0.filtersVisible ? "280px" : "0px")("collapsible", false)("resizable", ctx_r0.filtersVisible)("scrollable", false)("hidden", !ctx_r0.filtersVisible);
|
|
240
|
-
i0.ɵɵadvance(11);
|
|
241
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.filter.searchTerm);
|
|
242
|
-
i0.ɵɵadvance(4);
|
|
243
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.filter.vendorId);
|
|
244
|
-
i0.ɵɵadvance();
|
|
245
|
-
i0.ɵɵproperty("value", null);
|
|
246
|
-
i0.ɵɵadvance(2);
|
|
247
|
-
i0.ɵɵrepeater(ctx_r0.vendors);
|
|
248
|
-
i0.ɵɵadvance(5);
|
|
249
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.filter.modelTypeId);
|
|
250
|
-
i0.ɵɵadvance();
|
|
251
|
-
i0.ɵɵproperty("value", null);
|
|
252
|
-
i0.ɵɵadvance(2);
|
|
253
|
-
i0.ɵɵrepeater(ctx_r0.modelTypes);
|
|
254
|
-
i0.ɵɵadvance(5);
|
|
255
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.filter.isActive);
|
|
256
|
-
i0.ɵɵadvance();
|
|
257
|
-
i0.ɵɵproperty("value", null);
|
|
258
|
-
i0.ɵɵadvance(2);
|
|
259
|
-
i0.ɵɵproperty("value", true);
|
|
260
|
-
i0.ɵɵadvance(2);
|
|
261
|
-
i0.ɵɵproperty("value", false);
|
|
262
|
-
i0.ɵɵadvance(6);
|
|
263
|
-
i0.ɵɵproperty("resizable", true)("scrollable", false);
|
|
264
|
-
i0.ɵɵadvance(2);
|
|
265
|
-
i0.ɵɵconditional(ctx_r0.filteredModels.length === 0 ? 46 : 47);
|
|
266
|
-
} }
|
|
267
|
-
export class ModelManagementComponent {
|
|
268
|
-
openEntityRecord = new EventEmitter();
|
|
269
|
-
// Data properties
|
|
270
|
-
models = [];
|
|
271
|
-
vendors = [];
|
|
272
|
-
modelTypes = [];
|
|
273
|
-
filteredModels = [];
|
|
274
|
-
// UI state
|
|
275
|
-
isLoading = false;
|
|
276
|
-
loadingMessage = 'Loading AI models...';
|
|
277
|
-
error = null;
|
|
278
|
-
filtersVisible = false;
|
|
279
|
-
// Filter state
|
|
280
|
-
filter = {
|
|
281
|
-
searchTerm: '',
|
|
282
|
-
vendorId: null,
|
|
283
|
-
modelTypeId: null,
|
|
284
|
-
powerRankMin: null,
|
|
285
|
-
powerRankMax: null,
|
|
286
|
-
speedRankMin: null,
|
|
287
|
-
speedRankMax: null,
|
|
288
|
-
costRankMin: null,
|
|
289
|
-
costRankMax: null,
|
|
290
|
-
isActive: null
|
|
291
|
-
};
|
|
292
|
-
// Sort options
|
|
293
|
-
sortOptions = [
|
|
294
|
-
{ field: 'Name', direction: 'asc', label: 'Name (A-Z)' },
|
|
295
|
-
{ field: 'Name', direction: 'desc', label: 'Name (Z-A)' },
|
|
296
|
-
{ field: 'PowerRank', direction: 'desc', label: 'Power Rank (High to Low)' },
|
|
297
|
-
{ field: 'PowerRank', direction: 'asc', label: 'Power Rank (Low to High)' },
|
|
298
|
-
{ field: 'SpeedRank', direction: 'desc', label: 'Speed Rank (High to Low)' },
|
|
299
|
-
{ field: 'SpeedRank', direction: 'asc', label: 'Speed Rank (Low to High)' },
|
|
300
|
-
{ field: 'CostRank', direction: 'desc', label: 'Cost Rank (High to Low)' },
|
|
301
|
-
{ field: 'CostRank', direction: 'asc', label: 'Cost Rank (Low to High)' },
|
|
302
|
-
{ field: '__mj_CreatedAt', direction: 'desc', label: 'Recently Added' },
|
|
303
|
-
{ field: '__mj_UpdatedAt', direction: 'desc', label: 'Recently Updated' }
|
|
304
|
-
];
|
|
305
|
-
selectedSort = this.sortOptions[0];
|
|
306
|
-
// Search and filter subjects
|
|
307
|
-
searchSubject = new BehaviorSubject('');
|
|
308
|
-
filterSubject = new BehaviorSubject(this.filter);
|
|
309
|
-
destroy$ = new Subject();
|
|
310
|
-
ngOnInit() {
|
|
311
|
-
this.setupFilterSubscriptions();
|
|
312
|
-
this.loadData();
|
|
313
|
-
}
|
|
314
|
-
ngOnDestroy() {
|
|
315
|
-
this.destroy$.next();
|
|
316
|
-
this.destroy$.complete();
|
|
317
|
-
}
|
|
318
|
-
setupFilterSubscriptions() {
|
|
319
|
-
// Debounced search
|
|
320
|
-
this.searchSubject.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(searchTerm => {
|
|
321
|
-
this.filter.searchTerm = searchTerm;
|
|
322
|
-
this.applyFilters();
|
|
323
|
-
});
|
|
324
|
-
// Combined filter changes
|
|
325
|
-
combineLatest([
|
|
326
|
-
this.filterSubject.pipe(debounceTime(100)),
|
|
327
|
-
this.searchSubject.pipe(debounceTime(300))
|
|
328
|
-
]).pipe(takeUntil(this.destroy$)).subscribe(() => {
|
|
329
|
-
this.applyFilters();
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
async loadData() {
|
|
333
|
-
try {
|
|
334
|
-
this.isLoading = true;
|
|
335
|
-
this.error = null;
|
|
336
|
-
this.loadingMessage = 'Loading AI models...';
|
|
337
|
-
// Load all required data in parallel
|
|
338
|
-
const [modelsResult, vendorsResult, modelTypesResult] = await Promise.all([
|
|
339
|
-
this.loadModels(),
|
|
340
|
-
this.loadVendors(),
|
|
341
|
-
this.loadModelTypes()
|
|
342
|
-
]);
|
|
343
|
-
if (modelsResult && vendorsResult && modelTypesResult) {
|
|
344
|
-
this.applyFilters();
|
|
345
|
-
LogStatus('Model management data loaded successfully');
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
catch (error) {
|
|
349
|
-
this.error = 'Failed to load model data. Please try again.';
|
|
350
|
-
LogError('Error loading model management data: ' + String(error));
|
|
351
|
-
}
|
|
352
|
-
finally {
|
|
353
|
-
this.isLoading = false;
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
async loadModels() {
|
|
357
|
-
try {
|
|
358
|
-
const md = Metadata.Provider;
|
|
359
|
-
if (!md) {
|
|
360
|
-
throw new Error('Metadata provider not available');
|
|
361
|
-
}
|
|
362
|
-
const rv = new RunView();
|
|
363
|
-
const result = await rv.RunView({
|
|
364
|
-
EntityName: 'AI Models',
|
|
365
|
-
ExtraFilter: '', // Load all models, we'll filter in UI
|
|
366
|
-
OrderBy: 'Name',
|
|
367
|
-
UserSearchString: '',
|
|
368
|
-
OverrideExcludeFilter: '',
|
|
369
|
-
SaveViewResults: false
|
|
370
|
-
});
|
|
371
|
-
if (result && result.Success && result.Results) {
|
|
372
|
-
this.models = result.Results;
|
|
373
|
-
return true;
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
throw new Error('Failed to load AI models');
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
catch (error) {
|
|
380
|
-
LogError('Error loading AI models: ' + String(error));
|
|
381
|
-
return false;
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
async loadVendors() {
|
|
385
|
-
try {
|
|
386
|
-
const rv = new RunView();
|
|
387
|
-
const result = await rv.RunView({
|
|
388
|
-
EntityName: 'MJ: AI Vendors',
|
|
389
|
-
ExtraFilter: '',
|
|
390
|
-
OrderBy: 'Name',
|
|
391
|
-
UserSearchString: '',
|
|
392
|
-
OverrideExcludeFilter: '',
|
|
393
|
-
SaveViewResults: false
|
|
394
|
-
});
|
|
395
|
-
if (result && result.Success && result.Results) {
|
|
396
|
-
this.vendors = result.Results;
|
|
397
|
-
return true;
|
|
398
|
-
}
|
|
399
|
-
else {
|
|
400
|
-
throw new Error('Failed to load AI vendors');
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
catch (error) {
|
|
404
|
-
LogError('Error loading AI vendors: ' + String(error));
|
|
405
|
-
return false;
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
async loadModelTypes() {
|
|
409
|
-
try {
|
|
410
|
-
const rv = new RunView();
|
|
411
|
-
const result = await rv.RunView({
|
|
412
|
-
EntityName: 'AI Model Types',
|
|
413
|
-
ExtraFilter: '',
|
|
414
|
-
OrderBy: 'Name',
|
|
415
|
-
UserSearchString: '',
|
|
416
|
-
OverrideExcludeFilter: '',
|
|
417
|
-
SaveViewResults: false
|
|
418
|
-
});
|
|
419
|
-
if (result && result.Success && result.Results) {
|
|
420
|
-
this.modelTypes = result.Results;
|
|
421
|
-
return true;
|
|
422
|
-
}
|
|
423
|
-
else {
|
|
424
|
-
throw new Error('Failed to load AI model types');
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
catch (error) {
|
|
428
|
-
LogError('Error loading AI model types: ' + String(error));
|
|
429
|
-
return false;
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
onSearchChange(searchTerm) {
|
|
433
|
-
this.searchSubject.next(searchTerm);
|
|
434
|
-
}
|
|
435
|
-
onFilterChange() {
|
|
436
|
-
this.filterSubject.next({ ...this.filter });
|
|
437
|
-
}
|
|
438
|
-
onSortChange(sort) {
|
|
439
|
-
this.selectedSort = sort;
|
|
440
|
-
this.applyFilters();
|
|
441
|
-
}
|
|
442
|
-
toggleFiltersVisible() {
|
|
443
|
-
this.filtersVisible = !this.filtersVisible;
|
|
444
|
-
}
|
|
445
|
-
clearFilters() {
|
|
446
|
-
this.filter = {
|
|
447
|
-
searchTerm: '',
|
|
448
|
-
vendorId: null,
|
|
449
|
-
modelTypeId: null,
|
|
450
|
-
powerRankMin: null,
|
|
451
|
-
powerRankMax: null,
|
|
452
|
-
speedRankMin: null,
|
|
453
|
-
speedRankMax: null,
|
|
454
|
-
costRankMin: null,
|
|
455
|
-
costRankMax: null,
|
|
456
|
-
isActive: null
|
|
457
|
-
};
|
|
458
|
-
this.searchSubject.next('');
|
|
459
|
-
this.filterSubject.next(this.filter);
|
|
460
|
-
}
|
|
461
|
-
applyFilters() {
|
|
462
|
-
let filtered = [...this.models];
|
|
463
|
-
// Apply search filter
|
|
464
|
-
if (this.filter.searchTerm) {
|
|
465
|
-
const searchLower = this.filter.searchTerm.toLowerCase();
|
|
466
|
-
filtered = filtered.filter(model => model.Name?.toLowerCase().includes(searchLower) ||
|
|
467
|
-
model.Description?.toLowerCase().includes(searchLower) ||
|
|
468
|
-
this.getVendorName(model)?.toLowerCase().includes(searchLower));
|
|
469
|
-
}
|
|
470
|
-
// Apply vendor filter
|
|
471
|
-
if (this.filter.vendorId) {
|
|
472
|
-
filtered = filtered.filter(model => model.APIName === this.filter.vendorId);
|
|
473
|
-
}
|
|
474
|
-
// Apply model type filter
|
|
475
|
-
if (this.filter.modelTypeId) {
|
|
476
|
-
filtered = filtered.filter(model => model.AIModelTypeID === this.filter.modelTypeId);
|
|
477
|
-
}
|
|
478
|
-
// Apply rank filters
|
|
479
|
-
if (this.filter.powerRankMin !== null) {
|
|
480
|
-
filtered = filtered.filter(model => (model.PowerRank || 0) >= this.filter.powerRankMin);
|
|
481
|
-
}
|
|
482
|
-
if (this.filter.powerRankMax !== null) {
|
|
483
|
-
filtered = filtered.filter(model => (model.PowerRank || 0) <= this.filter.powerRankMax);
|
|
484
|
-
}
|
|
485
|
-
if (this.filter.speedRankMin !== null) {
|
|
486
|
-
filtered = filtered.filter(model => (model.SpeedRank || 0) >= this.filter.speedRankMin);
|
|
487
|
-
}
|
|
488
|
-
if (this.filter.speedRankMax !== null) {
|
|
489
|
-
filtered = filtered.filter(model => (model.SpeedRank || 0) <= this.filter.speedRankMax);
|
|
490
|
-
}
|
|
491
|
-
if (this.filter.costRankMin !== null) {
|
|
492
|
-
filtered = filtered.filter(model => (model.CostRank || 0) >= this.filter.costRankMin);
|
|
493
|
-
}
|
|
494
|
-
if (this.filter.costRankMax !== null) {
|
|
495
|
-
filtered = filtered.filter(model => (model.CostRank || 0) <= this.filter.costRankMax);
|
|
496
|
-
}
|
|
497
|
-
// Apply active filter
|
|
498
|
-
if (this.filter.isActive !== null) {
|
|
499
|
-
filtered = filtered.filter(model => model.IsActive === this.filter.isActive);
|
|
500
|
-
}
|
|
501
|
-
// Apply sorting
|
|
502
|
-
filtered.sort((a, b) => {
|
|
503
|
-
const aValue = a[this.selectedSort.field];
|
|
504
|
-
const bValue = b[this.selectedSort.field];
|
|
505
|
-
if (aValue == null && bValue == null)
|
|
506
|
-
return 0;
|
|
507
|
-
if (aValue == null)
|
|
508
|
-
return 1;
|
|
509
|
-
if (bValue == null)
|
|
510
|
-
return -1;
|
|
511
|
-
let comparison = 0;
|
|
512
|
-
if (typeof aValue === 'string' && typeof bValue === 'string') {
|
|
513
|
-
comparison = aValue.localeCompare(bValue);
|
|
514
|
-
}
|
|
515
|
-
else {
|
|
516
|
-
comparison = aValue < bValue ? -1 : aValue > bValue ? 1 : 0;
|
|
517
|
-
}
|
|
518
|
-
return this.selectedSort.direction === 'desc' ? -comparison : comparison;
|
|
519
|
-
});
|
|
520
|
-
// Transform to display data
|
|
521
|
-
this.filteredModels = filtered.map(model => this.transformToDisplayData(model));
|
|
522
|
-
}
|
|
523
|
-
transformToDisplayData(model) {
|
|
524
|
-
return {
|
|
525
|
-
model,
|
|
526
|
-
vendor: this.getVendor(model),
|
|
527
|
-
modelType: this.getModelType(model),
|
|
528
|
-
powerRankDisplay: this.formatRank(model.PowerRank),
|
|
529
|
-
speedRankDisplay: this.formatRank(model.SpeedRank),
|
|
530
|
-
costRankDisplay: this.formatRank(model.CostRank),
|
|
531
|
-
statusDisplay: model.IsActive ? 'Active' : 'Inactive'
|
|
532
|
-
};
|
|
533
|
-
}
|
|
534
|
-
getVendor(model) {
|
|
535
|
-
return this.vendors.find(v => v.ID === model.APIName) || null;
|
|
536
|
-
}
|
|
537
|
-
getVendorName(model) {
|
|
538
|
-
const vendor = this.getVendor(model);
|
|
539
|
-
return vendor?.Name || null;
|
|
540
|
-
}
|
|
541
|
-
getModelType(model) {
|
|
542
|
-
return this.modelTypes.find(mt => mt.ID === model.AIModelTypeID) || null;
|
|
543
|
-
}
|
|
544
|
-
formatRank(rank) {
|
|
545
|
-
if (rank == null)
|
|
546
|
-
return 'N/A';
|
|
547
|
-
return `${rank}/10`;
|
|
548
|
-
}
|
|
549
|
-
onOpenModel(model) {
|
|
550
|
-
this.openEntityRecord.emit({
|
|
551
|
-
entityName: 'AI Models',
|
|
552
|
-
recordId: model.ID
|
|
553
|
-
});
|
|
554
|
-
}
|
|
555
|
-
async createNewModel() {
|
|
556
|
-
try {
|
|
557
|
-
const md = Metadata.Provider;
|
|
558
|
-
if (!md) {
|
|
559
|
-
throw new Error('Metadata provider not available');
|
|
560
|
-
}
|
|
561
|
-
const newModel = await md.GetEntityObject('AI Models', md.CurrentUser);
|
|
562
|
-
// Pre-populate some defaults
|
|
563
|
-
newModel.IsActive = true;
|
|
564
|
-
newModel.PowerRank = 5;
|
|
565
|
-
newModel.SpeedRank = 5;
|
|
566
|
-
newModel.CostRank = 5;
|
|
567
|
-
this.openEntityRecord.emit({
|
|
568
|
-
entityName: 'AI Models',
|
|
569
|
-
recordId: 'new'
|
|
570
|
-
});
|
|
571
|
-
}
|
|
572
|
-
catch (error) {
|
|
573
|
-
LogError('Error creating new AI model: ' + String(error));
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
async toggleModelStatus(model) {
|
|
577
|
-
try {
|
|
578
|
-
const md = Metadata.Provider;
|
|
579
|
-
if (!md) {
|
|
580
|
-
throw new Error('Metadata provider not available');
|
|
581
|
-
}
|
|
582
|
-
const modelToUpdate = await md.GetEntityObject('AI Models', md.CurrentUser);
|
|
583
|
-
await modelToUpdate.Load(model.ID);
|
|
584
|
-
modelToUpdate.IsActive = !modelToUpdate.IsActive;
|
|
585
|
-
const result = await modelToUpdate.Save();
|
|
586
|
-
if (result) {
|
|
587
|
-
// Update local data
|
|
588
|
-
const index = this.models.findIndex(m => m.ID === model.ID);
|
|
589
|
-
if (index >= 0) {
|
|
590
|
-
this.models[index] = Object.assign({}, this.models[index], { IsActive: modelToUpdate.IsActive });
|
|
591
|
-
this.applyFilters();
|
|
592
|
-
}
|
|
593
|
-
LogStatus(`Model ${modelToUpdate.Name} ${modelToUpdate.IsActive ? 'activated' : 'deactivated'}`);
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
catch (error) {
|
|
597
|
-
LogError('Error updating model status: ' + String(error));
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
static ɵfac = function ModelManagementComponent_Factory(t) { return new (t || ModelManagementComponent)(); };
|
|
601
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ModelManagementComponent, selectors: [["app-model-management"]], outputs: { openEntityRecord: "openEntityRecord" }, decls: 18, vars: 8, consts: [["mjFillContainer", "", 1, "model-management-container", 3, "rightMargin", "bottomMargin"], [1, "dashboard-header"], [1, "header-info"], [1, "model-count"], [1, "header-controls"], ["title", "Toggle Filters", 1, "control-btn", 3, "click"], [1, "fa-solid", "fa-filter"], ["title", "Add New Model", 1, "control-btn", 3, "click"], [1, "fa-solid", "fa-plus"], ["title", "Refresh", 1, "control-btn", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "loading-container"], [1, "error-container"], [1, "dashboard-content"], [1, "loading-content"], [1, "loading-spinner"], [1, "spinner-ring"], [1, "loading-text"], [1, "error-message"], ["orientation", "horizontal", "mjFillContainer", "", 1, "main-splitter"], [3, "size", "collapsible", "resizable", "scrollable", "hidden"], [1, "filter-panel"], [1, "filter-header"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "filter-content"], [1, "search-section"], ["type", "text", "placeholder", "Search models...", 1, "search-input", 3, "ngModelChange", "ngModel"], [1, "filter-group"], [3, "ngModelChange", "ngModel"], [3, "value"], [1, "filter-actions"], [1, "clear-btn", 3, "click"], [3, "resizable", "scrollable"], ["mjFillContainer", "", 1, "models-pane-container"], [1, "empty-state"], [1, "models-list"], [1, "fa-solid", "fa-microchip", "empty-icon"], [1, "control-btn", 3, "click"], [1, "model-item"], [1, "model-item", 3, "click"], [1, "model-header"], [1, "model-title"], [1, "model-vendor"], [1, "model-status"], [1, "model-details"], [1, "detail-item"], [1, "label"], [1, "value"], [1, "model-description"], [1, "model-actions"], [1, "action-btn", 3, "click", "title"], ["title", "Edit Model", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-edit"]], template: function ModelManagementComponent_Template(rf, ctx) { if (rf & 1) {
|
|
602
|
-
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "span", 3);
|
|
603
|
-
i0.ɵɵtext(4);
|
|
604
|
-
i0.ɵɵelementEnd()();
|
|
605
|
-
i0.ɵɵelementStart(5, "div", 4)(6, "button", 5);
|
|
606
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Template_button_click_6_listener() { return ctx.toggleFiltersVisible(); });
|
|
607
|
-
i0.ɵɵelement(7, "span", 6);
|
|
608
|
-
i0.ɵɵtext(8, " Filters ");
|
|
609
|
-
i0.ɵɵelementEnd();
|
|
610
|
-
i0.ɵɵelementStart(9, "button", 7);
|
|
611
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Template_button_click_9_listener() { return ctx.createNewModel(); });
|
|
612
|
-
i0.ɵɵelement(10, "span", 8);
|
|
613
|
-
i0.ɵɵtext(11, " Add Model ");
|
|
614
|
-
i0.ɵɵelementEnd();
|
|
615
|
-
i0.ɵɵelementStart(12, "button", 9);
|
|
616
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Template_button_click_12_listener() { return ctx.loadData(); });
|
|
617
|
-
i0.ɵɵelement(13, "span", 10);
|
|
618
|
-
i0.ɵɵtext(14, " Refresh ");
|
|
619
|
-
i0.ɵɵelementEnd()()();
|
|
620
|
-
i0.ɵɵtemplate(15, ModelManagementComponent_Conditional_15_Template, 8, 1, "div", 11)(16, ModelManagementComponent_Conditional_16_Template, 3, 1, "div", 12)(17, ModelManagementComponent_Conditional_17_Template, 48, 17, "div", 13);
|
|
621
|
-
i0.ɵɵelementEnd();
|
|
622
|
-
} if (rf & 2) {
|
|
623
|
-
i0.ɵɵproperty("rightMargin", 8)("bottomMargin", 8);
|
|
624
|
-
i0.ɵɵadvance(4);
|
|
625
|
-
i0.ɵɵtextInterpolate1("", ctx.filteredModels.length, " AI models");
|
|
626
|
-
i0.ɵɵadvance(2);
|
|
627
|
-
i0.ɵɵclassProp("active", ctx.filtersVisible);
|
|
628
|
-
i0.ɵɵadvance(9);
|
|
629
|
-
i0.ɵɵconditional(ctx.isLoading ? 15 : -1);
|
|
630
|
-
i0.ɵɵadvance();
|
|
631
|
-
i0.ɵɵconditional(ctx.error ? 16 : -1);
|
|
632
|
-
i0.ɵɵadvance();
|
|
633
|
-
i0.ɵɵconditional(!ctx.isLoading && !ctx.error ? 17 : -1);
|
|
634
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.SplitterComponent, i2.SplitterPaneComponent, i3.FillContainer], styles: [".model-management-container[_ngcontent-%COMP%] {\n overflow: hidden;\n padding: 4px;\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.dashboard-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-info {\n flex: 1;\n display: flex;\n align-items: center;\n }\n \n .model-count {\n font-size: 12px;\n color: #2196f3;\n font-weight: 600;\n background: rgba(33, 150, 243, 0.1);\n padding: 4px 8px;\n border-radius: 4px;\n border: 1px solid rgba(33, 150, 243, 0.2);\n }\n \n .header-controls {\n display: flex;\n gap: 8px;\n \n .control-btn {\n padding: 8px 12px;\n border: 1px solid #ccc;\n border-radius: 4px;\n background: white;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n \n &:hover {\n background-color: #f0f0f0;\n border-color: #2196f3;\n }\n \n &.active {\n background-color: #2196f3;\n border-color: #2196f3;\n color: white;\n }\n \n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n \n &:hover {\n background-color: white;\n border-color: #ccc;\n }\n }\n \n .fa-solid {\n font-size: 14px;\n }\n }\n }\n}\n\n.loading-container[_ngcontent-%COMP%], .error-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: #fafafa;\n flex: 1;\n \n p {\n color: #666;\n font-size: 14px;\n }\n}\n\n.error-message[_ngcontent-%COMP%] {\n color: #d32f2f;\n font-weight: 500;\n}\n\n.dashboard-content[_ngcontent-%COMP%] {\n overflow: hidden;\n flex: 1;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n position: relative;\n width: 60px;\n height: 60px;\n}\n\n.spinner-ring[_ngcontent-%COMP%] {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1.5s linear infinite;\n \n &:nth-child(1) {\n border-top-color: #2196f3;\n animation-delay: 0s;\n }\n \n &:nth-child(2) {\n border-top-color: #9c27b0;\n animation-delay: 0.3s;\n transform: scale(0.8);\n }\n \n &:nth-child(3) {\n border-top-color: #ff6b35;\n animation-delay: 0.6s;\n transform: scale(0.6);\n }\n}\n\n.loading-text[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #666;\n font-weight: 500;\n text-align: center;\n}\n\n//[_ngcontent-%COMP%] Filter[_ngcontent-%COMP%] Panel\n.filter-panel[_ngcontent-%COMP%] {\n background: #fafafa;\n border-right: 1px solid #e0e0e0;\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n \n .filter-header {\n padding: 16px;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: white;\n \n h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n \n .close-btn {\n padding: 4px;\n border: none;\n background: none;\n cursor: pointer;\n color: #666;\n border-radius: 2px;\n \n &:hover {\n background: #f0f0f0;\n color: #333;\n }\n }\n }\n \n .filter-content {\n padding: 12px;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n \n .search-section {\n margin-bottom: 16px;\n }\n \n .filter-group {\n margin-bottom: 16px;\n }\n \n label {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: #333;\n margin-bottom: 4px;\n }\n \n .search-input, select {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px;\n border: 1px solid #ccc;\n border-radius: 4px;\n font-size: 12px;\n box-sizing: border-box;\n \n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n }\n \n .filter-actions {\n margin-top: 20px;\n \n .clear-btn {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 12px;\n border: 1px solid #ccc;\n border-radius: 4px;\n background: white;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.2s;\n box-sizing: border-box;\n \n &:hover {\n background-color: #f0f0f0;\n border-color: #999;\n }\n }\n }\n }\n}\n\n//[_ngcontent-%COMP%] Models[_ngcontent-%COMP%] List\n.models-pane-container[_ngcontent-%COMP%] {\n background: white;\n position: relative;\n}\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 40px;\n text-align: center;\n \n .empty-icon {\n font-size: 48px;\n color: #ccc;\n margin-bottom: 16px;\n }\n \n h3 {\n margin: 0 0 8px 0;\n color: #666;\n font-size: 18px;\n }\n \n p {\n margin: 0 0 20px 0;\n color: #999;\n font-size: 14px;\n }\n}\n\n.models-list[_ngcontent-%COMP%] {\n padding: 16px;\n overflow-y: auto;\n height: 100%;\n \n .model-item {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 12px;\n cursor: pointer;\n transition: all 0.2s;\n position: relative;\n \n &:hover {\n border-color: #2196f3;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n \n &:last-child {\n margin-bottom: 0;\n }\n \n .model-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 12px;\n \n .model-title {\n flex: 1;\n \n h4 {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n }\n \n .model-vendor {\n font-size: 12px;\n color: #2196f3;\n font-weight: 500;\n }\n }\n \n .model-status {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n background: #ffc107;\n color: #000;\n text-transform: uppercase;\n \n &.active {\n background: #4caf50;\n color: white;\n }\n }\n }\n \n .model-details {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n margin-bottom: 12px;\n \n .detail-item {\n display: flex;\n align-items: center;\n gap: 4px;\n \n .label {\n font-size: 12px;\n color: #666;\n font-weight: 500;\n }\n \n .value {\n font-size: 12px;\n color: #333;\n font-weight: 600;\n }\n }\n }\n \n .model-description {\n font-size: 12px;\n color: #666;\n line-height: 1.4;\n margin-bottom: 12px;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n \n .model-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n \n .action-btn {\n padding: 6px 8px;\n border: 1px solid #e0e0e0;\n border-radius: 3px;\n background: white;\n cursor: pointer;\n font-size: 12px;\n color: #666;\n transition: all 0.2s;\n \n &:hover {\n background: #f0f0f0;\n border-color: #2196f3;\n color: #2196f3;\n }\n }\n }\n }\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}"] });
|
|
635
|
-
}
|
|
636
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ModelManagementComponent, [{
|
|
637
|
-
type: Component,
|
|
638
|
-
args: [{ selector: 'app-model-management', template: "<div class=\"model-management-container\" mjFillContainer [rightMargin]=\"8\" [bottomMargin]=\"8\">\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <span class=\"model-count\">{{ filteredModels.length }} AI models</span>\n </div>\n <div class=\"header-controls\">\n <button \n class=\"control-btn\" \n (click)=\"toggleFiltersVisible()\" \n [class.active]=\"filtersVisible\"\n title=\"Toggle Filters\">\n <span class=\"fa-solid fa-filter\"></span>\n Filters\n </button>\n <button \n class=\"control-btn\" \n (click)=\"createNewModel()\"\n title=\"Add New Model\">\n <span class=\"fa-solid fa-plus\"></span>\n Add Model\n </button>\n <button \n class=\"control-btn\" \n (click)=\"loadData()\"\n title=\"Refresh\">\n <span class=\"fa-solid fa-refresh\"></span>\n Refresh\n </button>\n </div>\n </div>\n \n @if (isLoading) {\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <div class=\"loading-spinner\">\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n </div>\n <div class=\"loading-text\">{{ loadingMessage }}</div>\n </div>\n </div>\n }\n \n @if (error) {\n <div class=\"error-container\">\n <p class=\"error-message\">{{ error }}</p>\n </div>\n }\n \n @if (!isLoading && !error) {\n <div class=\"dashboard-content\">\n <kendo-splitter \n class=\"main-splitter\"\n orientation=\"horizontal\"\n mjFillContainer>\n \n <!-- Filter Panel (Left) -->\n <kendo-splitter-pane \n [size]=\"filtersVisible ? '280px' : '0px'\"\n [collapsible]=\"false\"\n [resizable]=\"filtersVisible\"\n [scrollable]=\"false\"\n [hidden]=\"!filtersVisible\">\n <div class=\"filter-panel\">\n <div class=\"filter-header\">\n <h3>Filters</h3>\n <button class=\"close-btn\" (click)=\"toggleFiltersVisible()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n \n <div class=\"filter-content\">\n <div class=\"search-section\">\n <label>Search</label>\n <input \n type=\"text\" \n placeholder=\"Search models...\"\n [(ngModel)]=\"filter.searchTerm\"\n (ngModelChange)=\"onSearchChange($event)\"\n class=\"search-input\">\n </div>\n \n <div class=\"filter-group\">\n <label>Vendor</label>\n <select [(ngModel)]=\"filter.vendorId\" (ngModelChange)=\"onFilterChange()\">\n <option [value]=\"null\">All Vendors</option>\n @for (vendor of vendors; track vendor.ID) {\n <option [value]=\"vendor.ID\">{{ vendor.Name }}</option>\n }\n </select>\n </div>\n \n <div class=\"filter-group\">\n <label>Type</label>\n <select [(ngModel)]=\"filter.modelTypeId\" (ngModelChange)=\"onFilterChange()\">\n <option [value]=\"null\">All Types</option>\n @for (type of modelTypes; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n \n <div class=\"filter-group\">\n <label>Status</label>\n <select [(ngModel)]=\"filter.isActive\" (ngModelChange)=\"onFilterChange()\">\n <option [value]=\"null\">All</option>\n <option [value]=\"true\">Active</option>\n <option [value]=\"false\">Inactive</option>\n </select>\n </div>\n \n <div class=\"filter-actions\">\n <button class=\"clear-btn\" (click)=\"clearFilters()\">\n <span class=\"fa-solid fa-times\"></span>\n Clear All\n </button>\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n \n <!-- Models List (Right) -->\n <kendo-splitter-pane \n [resizable]=\"true\"\n [scrollable]=\"false\">\n <div class=\"models-pane-container\" mjFillContainer>\n @if (filteredModels.length === 0) {\n <div class=\"empty-state\">\n <span class=\"fa-solid fa-microchip empty-icon\"></span>\n <h3>No Models Found</h3>\n @if (models.length === 0) {\n <p>No AI models have been configured yet.</p>\n <button class=\"control-btn\" (click)=\"createNewModel()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add First Model\n </button>\n } @else {\n <p>No models match your current filters.</p>\n <button class=\"control-btn\" (click)=\"clearFilters()\">Clear Filters</button>\n }\n </div>\n } @else {\n <div class=\"models-list\">\n @for (displayData of filteredModels; track displayData.model.ID) {\n <div class=\"model-item\" (click)=\"onOpenModel(displayData.model)\">\n <div class=\"model-header\">\n <div class=\"model-title\">\n <h4>{{ displayData.model.Name }}</h4>\n <span class=\"model-vendor\">{{ displayData.vendor?.Name || 'Unknown Vendor' }}</span>\n </div>\n <div class=\"model-status\" [class.active]=\"displayData.model.IsActive\">\n {{ displayData.statusDisplay }}\n </div>\n </div>\n \n <div class=\"model-details\">\n <div class=\"detail-item\">\n <span class=\"label\">Type:</span>\n <span class=\"value\">{{ displayData.modelType?.Name || 'Unknown' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"label\">Power:</span>\n <span class=\"value\">{{ displayData.powerRankDisplay }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"label\">Speed:</span>\n <span class=\"value\">{{ displayData.speedRankDisplay }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"label\">Cost:</span>\n <span class=\"value\">{{ displayData.costRankDisplay }}</span>\n </div>\n </div>\n \n @if (displayData.model.Description) {\n <div class=\"model-description\">\n {{ displayData.model.Description }}\n </div>\n }\n \n <div class=\"model-actions\">\n <button \n class=\"action-btn\"\n (click)=\"$event.stopPropagation(); toggleModelStatus(displayData.model)\"\n [title]=\"displayData.model.IsActive ? 'Deactivate' : 'Activate'\">\n <span [class]=\"displayData.model.IsActive ? 'fa-solid fa-pause' : 'fa-solid fa-play'\"></span>\n </button>\n <button \n class=\"action-btn\"\n (click)=\"$event.stopPropagation(); onOpenModel(displayData.model)\"\n title=\"Edit Model\">\n <span class=\"fa-solid fa-edit\"></span>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n }\n</div>", styles: [".model-management-container {\n overflow: hidden;\n padding: 4px;\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.dashboard-header {\n margin-bottom: 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-info {\n flex: 1;\n display: flex;\n align-items: center;\n }\n \n .model-count {\n font-size: 12px;\n color: #2196f3;\n font-weight: 600;\n background: rgba(33, 150, 243, 0.1);\n padding: 4px 8px;\n border-radius: 4px;\n border: 1px solid rgba(33, 150, 243, 0.2);\n }\n \n .header-controls {\n display: flex;\n gap: 8px;\n \n .control-btn {\n padding: 8px 12px;\n border: 1px solid #ccc;\n border-radius: 4px;\n background: white;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n \n &:hover {\n background-color: #f0f0f0;\n border-color: #2196f3;\n }\n \n &.active {\n background-color: #2196f3;\n border-color: #2196f3;\n color: white;\n }\n \n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n \n &:hover {\n background-color: white;\n border-color: #ccc;\n }\n }\n \n .fa-solid {\n font-size: 14px;\n }\n }\n }\n}\n\n.loading-container, .error-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: #fafafa;\n flex: 1;\n \n p {\n color: #666;\n font-size: 14px;\n }\n}\n\n.error-message {\n color: #d32f2f;\n font-weight: 500;\n}\n\n.dashboard-content {\n overflow: hidden;\n flex: 1;\n}\n\n.loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n}\n\n.loading-spinner {\n position: relative;\n width: 60px;\n height: 60px;\n}\n\n.spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: spin 1.5s linear infinite;\n \n &:nth-child(1) {\n border-top-color: #2196f3;\n animation-delay: 0s;\n }\n \n &:nth-child(2) {\n border-top-color: #9c27b0;\n animation-delay: 0.3s;\n transform: scale(0.8);\n }\n \n &:nth-child(3) {\n border-top-color: #ff6b35;\n animation-delay: 0.6s;\n transform: scale(0.6);\n }\n}\n\n.loading-text {\n font-size: 14px;\n color: #666;\n font-weight: 500;\n text-align: center;\n}\n\n// Filter Panel\n.filter-panel {\n background: #fafafa;\n border-right: 1px solid #e0e0e0;\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n \n .filter-header {\n padding: 16px;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: white;\n \n h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n \n .close-btn {\n padding: 4px;\n border: none;\n background: none;\n cursor: pointer;\n color: #666;\n border-radius: 2px;\n \n &:hover {\n background: #f0f0f0;\n color: #333;\n }\n }\n }\n \n .filter-content {\n padding: 12px;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n \n .search-section {\n margin-bottom: 16px;\n }\n \n .filter-group {\n margin-bottom: 16px;\n }\n \n label {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: #333;\n margin-bottom: 4px;\n }\n \n .search-input, select {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px;\n border: 1px solid #ccc;\n border-radius: 4px;\n font-size: 12px;\n box-sizing: border-box;\n \n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n }\n \n .filter-actions {\n margin-top: 20px;\n \n .clear-btn {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 12px;\n border: 1px solid #ccc;\n border-radius: 4px;\n background: white;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.2s;\n box-sizing: border-box;\n \n &:hover {\n background-color: #f0f0f0;\n border-color: #999;\n }\n }\n }\n }\n}\n\n// Models List\n.models-pane-container {\n background: white;\n position: relative;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 40px;\n text-align: center;\n \n .empty-icon {\n font-size: 48px;\n color: #ccc;\n margin-bottom: 16px;\n }\n \n h3 {\n margin: 0 0 8px 0;\n color: #666;\n font-size: 18px;\n }\n \n p {\n margin: 0 0 20px 0;\n color: #999;\n font-size: 14px;\n }\n}\n\n.models-list {\n padding: 16px;\n overflow-y: auto;\n height: 100%;\n \n .model-item {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 12px;\n cursor: pointer;\n transition: all 0.2s;\n position: relative;\n \n &:hover {\n border-color: #2196f3;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n \n &:last-child {\n margin-bottom: 0;\n }\n \n .model-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 12px;\n \n .model-title {\n flex: 1;\n \n h4 {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n }\n \n .model-vendor {\n font-size: 12px;\n color: #2196f3;\n font-weight: 500;\n }\n }\n \n .model-status {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n background: #ffc107;\n color: #000;\n text-transform: uppercase;\n \n &.active {\n background: #4caf50;\n color: white;\n }\n }\n }\n \n .model-details {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n margin-bottom: 12px;\n \n .detail-item {\n display: flex;\n align-items: center;\n gap: 4px;\n \n .label {\n font-size: 12px;\n color: #666;\n font-weight: 500;\n }\n \n .value {\n font-size: 12px;\n color: #333;\n font-weight: 600;\n }\n }\n }\n \n .model-description {\n font-size: 12px;\n color: #666;\n line-height: 1.4;\n margin-bottom: 12px;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n \n .model-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n \n .action-btn {\n padding: 6px 8px;\n border: 1px solid #e0e0e0;\n border-radius: 3px;\n background: white;\n cursor: pointer;\n font-size: 12px;\n color: #666;\n transition: all 0.2s;\n \n &:hover {\n background: #f0f0f0;\n border-color: #2196f3;\n color: #2196f3;\n }\n }\n }\n }\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}"] }]
|
|
639
|
-
}], null, { openEntityRecord: [{
|
|
640
|
-
type: Output
|
|
641
|
-
}] }); })();
|
|
642
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ModelManagementComponent, { className: "ModelManagementComponent", filePath: "src/AI/components/models/model-management.component.ts", lineNumber: 41 }); })();
|
|
643
|
-
//# sourceMappingURL=model-management.component.js.map
|