@memberjunction/ng-dashboards 2.42.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.
Files changed (117) hide show
  1. package/dist/AI/ai-dashboard.component.d.ts +54 -0
  2. package/dist/AI/ai-dashboard.component.d.ts.map +1 -0
  3. package/dist/AI/ai-dashboard.component.js +248 -0
  4. package/dist/AI/ai-dashboard.component.js.map +1 -0
  5. package/dist/AI/components/agents/agent-configuration.component.d.ts +41 -0
  6. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -0
  7. package/dist/AI/components/agents/agent-configuration.component.js +325 -0
  8. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -0
  9. package/dist/AI/components/agents/agent-editor.component.d.ts +77 -0
  10. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -0
  11. package/dist/AI/components/agents/agent-editor.component.js +869 -0
  12. package/dist/AI/components/agents/agent-editor.component.js.map +1 -0
  13. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +33 -0
  14. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -0
  15. package/dist/AI/components/agents/agent-filter-panel.component.js +144 -0
  16. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -0
  17. package/dist/AI/components/execution-monitoring.component.d.ts +13 -0
  18. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -0
  19. package/dist/AI/components/execution-monitoring.component.js +30 -0
  20. package/dist/AI/components/execution-monitoring.component.js.map +1 -0
  21. package/dist/AI/components/models/model-management.component.d.ts +73 -0
  22. package/dist/AI/components/models/model-management.component.d.ts.map +1 -0
  23. package/dist/AI/components/models/model-management.component.js +669 -0
  24. package/dist/AI/components/models/model-management.component.js.map +1 -0
  25. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +49 -0
  26. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +1 -0
  27. package/dist/AI/components/prompts/prompt-filter-panel.component.js +186 -0
  28. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -0
  29. package/dist/AI/components/prompts/prompt-management.component.d.ts +113 -0
  30. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -0
  31. package/dist/AI/components/prompts/prompt-management.component.js +1316 -0
  32. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -0
  33. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +33 -0
  34. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +1 -0
  35. package/dist/AI/components/system/system-config-filter-panel.component.js +146 -0
  36. package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -0
  37. package/dist/AI/components/system/system-configuration.component.d.ts +37 -0
  38. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -0
  39. package/dist/AI/components/system/system-configuration.component.js +311 -0
  40. package/dist/AI/components/system/system-configuration.component.js.map +1 -0
  41. package/dist/Actions/actions-management-dashboard.component.d.ts +50 -0
  42. package/dist/Actions/actions-management-dashboard.component.d.ts.map +1 -0
  43. package/dist/Actions/actions-management-dashboard.component.js +282 -0
  44. package/dist/Actions/actions-management-dashboard.component.js.map +1 -0
  45. package/dist/Actions/components/actions-list-view.component.d.ts +52 -0
  46. package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -0
  47. package/dist/Actions/components/actions-list-view.component.js +366 -0
  48. package/dist/Actions/components/actions-list-view.component.js.map +1 -0
  49. package/dist/Actions/components/actions-overview.component.d.ts +71 -0
  50. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -0
  51. package/dist/Actions/components/actions-overview.component.js +605 -0
  52. package/dist/Actions/components/actions-overview.component.js.map +1 -0
  53. package/dist/Actions/components/categories-list-view.component.d.ts +11 -0
  54. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -0
  55. package/dist/Actions/components/categories-list-view.component.js +35 -0
  56. package/dist/Actions/components/categories-list-view.component.js.map +1 -0
  57. package/dist/Actions/components/code-management.component.d.ts +11 -0
  58. package/dist/Actions/components/code-management.component.d.ts.map +1 -0
  59. package/dist/Actions/components/code-management.component.js +35 -0
  60. package/dist/Actions/components/code-management.component.js.map +1 -0
  61. package/dist/Actions/components/entity-integration.component.d.ts +11 -0
  62. package/dist/Actions/components/entity-integration.component.d.ts.map +1 -0
  63. package/dist/Actions/components/entity-integration.component.js +35 -0
  64. package/dist/Actions/components/entity-integration.component.js.map +1 -0
  65. package/dist/Actions/components/execution-monitoring.component.d.ts +83 -0
  66. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -0
  67. package/dist/Actions/components/execution-monitoring.component.js +629 -0
  68. package/dist/Actions/components/execution-monitoring.component.js.map +1 -0
  69. package/dist/Actions/components/executions-list-view.component.d.ts +11 -0
  70. package/dist/Actions/components/executions-list-view.component.d.ts.map +1 -0
  71. package/dist/Actions/components/executions-list-view.component.js +35 -0
  72. package/dist/Actions/components/executions-list-view.component.js.map +1 -0
  73. package/dist/Actions/components/scheduled-actions.component.d.ts +11 -0
  74. package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -0
  75. package/dist/Actions/components/scheduled-actions.component.js +35 -0
  76. package/dist/Actions/components/scheduled-actions.component.js.map +1 -0
  77. package/dist/Actions/components/security-permissions.component.d.ts +11 -0
  78. package/dist/Actions/components/security-permissions.component.d.ts.map +1 -0
  79. package/dist/Actions/components/security-permissions.component.js +35 -0
  80. package/dist/Actions/components/security-permissions.component.js.map +1 -0
  81. package/dist/Actions/index.d.ts +11 -0
  82. package/dist/Actions/index.d.ts.map +1 -0
  83. package/dist/Actions/index.js +11 -0
  84. package/dist/Actions/index.js.map +1 -0
  85. package/dist/EntityAdmin/components/entity-details.component.d.ts +50 -0
  86. package/dist/EntityAdmin/components/entity-details.component.d.ts.map +1 -0
  87. package/dist/EntityAdmin/components/entity-details.component.js +684 -0
  88. package/dist/EntityAdmin/components/entity-details.component.js.map +1 -0
  89. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts +31 -0
  90. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts.map +1 -0
  91. package/dist/EntityAdmin/components/entity-filter-panel.component.js +162 -0
  92. package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +1 -0
  93. package/dist/EntityAdmin/components/erd-composite.component.d.ts +73 -0
  94. package/dist/EntityAdmin/components/erd-composite.component.d.ts.map +1 -0
  95. package/dist/EntityAdmin/components/erd-composite.component.js +288 -0
  96. package/dist/EntityAdmin/components/erd-composite.component.js.map +1 -0
  97. package/dist/EntityAdmin/components/erd-diagram.component.d.ts +47 -0
  98. package/dist/EntityAdmin/components/erd-diagram.component.d.ts.map +1 -0
  99. package/dist/EntityAdmin/components/erd-diagram.component.js +618 -0
  100. package/dist/EntityAdmin/components/erd-diagram.component.js.map +1 -0
  101. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +50 -0
  102. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -0
  103. package/dist/EntityAdmin/entity-admin-dashboard.component.js +190 -0
  104. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -0
  105. package/dist/generic/base-dashboard.d.ts +65 -0
  106. package/dist/generic/base-dashboard.d.ts.map +1 -0
  107. package/dist/generic/base-dashboard.js +86 -0
  108. package/dist/generic/base-dashboard.js.map +1 -0
  109. package/dist/module.d.ts +43 -0
  110. package/dist/module.d.ts.map +1 -0
  111. package/dist/module.js +141 -0
  112. package/dist/module.js.map +1 -0
  113. package/dist/public-api.d.ts +6 -0
  114. package/dist/public-api.d.ts.map +1 -0
  115. package/dist/public-api.js +18 -0
  116. package/dist/public-api.js.map +1 -0
  117. package/package.json +46 -0
@@ -0,0 +1,669 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { Component, Output, EventEmitter } from '@angular/core';
11
+ import { RunView, Metadata, LogError, LogStatus } from '@memberjunction/core';
12
+ import { Subject, combineLatest, BehaviorSubject } from 'rxjs';
13
+ import { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@angular/forms";
16
+ import * as i2 from "@progress/kendo-angular-layout";
17
+ import * as i3 from "@memberjunction/ng-container-directives";
18
+ const _forTrack0 = ($index, $item) => $item.ID;
19
+ const _forTrack1 = ($index, $item) => $item.model.ID;
20
+ function ModelManagementComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelementStart(0, "div", 11)(1, "div", 14)(2, "div", 15);
22
+ i0.ɵɵelement(3, "div", 16)(4, "div", 16)(5, "div", 16);
23
+ i0.ɵɵelementEnd();
24
+ i0.ɵɵelementStart(6, "div", 17);
25
+ i0.ɵɵtext(7);
26
+ i0.ɵɵelementEnd()()();
27
+ } if (rf & 2) {
28
+ const ctx_r0 = i0.ɵɵnextContext();
29
+ i0.ɵɵadvance(7);
30
+ i0.ɵɵtextInterpolate(ctx_r0.loadingMessage);
31
+ } }
32
+ function ModelManagementComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelementStart(0, "div", 12)(1, "p", 18);
34
+ i0.ɵɵtext(2);
35
+ i0.ɵɵelementEnd()();
36
+ } if (rf & 2) {
37
+ const ctx_r0 = i0.ɵɵnextContext();
38
+ i0.ɵɵadvance(2);
39
+ i0.ɵɵtextInterpolate(ctx_r0.error);
40
+ } }
41
+ function ModelManagementComponent_Conditional_17_For_21_Template(rf, ctx) { if (rf & 1) {
42
+ i0.ɵɵelementStart(0, "option", 30);
43
+ i0.ɵɵtext(1);
44
+ i0.ɵɵelementEnd();
45
+ } if (rf & 2) {
46
+ const vendor_r3 = ctx.$implicit;
47
+ i0.ɵɵproperty("value", vendor_r3.ID);
48
+ i0.ɵɵadvance();
49
+ i0.ɵɵtextInterpolate(vendor_r3.Name);
50
+ } }
51
+ function ModelManagementComponent_Conditional_17_For_29_Template(rf, ctx) { if (rf & 1) {
52
+ i0.ɵɵelementStart(0, "option", 30);
53
+ i0.ɵɵtext(1);
54
+ i0.ɵɵelementEnd();
55
+ } if (rf & 2) {
56
+ const type_r4 = ctx.$implicit;
57
+ i0.ɵɵproperty("value", type_r4.ID);
58
+ i0.ɵɵadvance();
59
+ i0.ɵɵtextInterpolate(type_r4.Name);
60
+ } }
61
+ function ModelManagementComponent_Conditional_17_Conditional_46_Conditional_4_Template(rf, ctx) { if (rf & 1) {
62
+ const _r5 = i0.ɵɵgetCurrentView();
63
+ i0.ɵɵelementStart(0, "p");
64
+ i0.ɵɵtext(1, "No AI models have been configured yet.");
65
+ i0.ɵɵelementEnd();
66
+ i0.ɵɵelementStart(2, "button", 38);
67
+ 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()); });
68
+ i0.ɵɵelement(3, "span", 8);
69
+ i0.ɵɵtext(4, " Add First Model ");
70
+ i0.ɵɵelementEnd();
71
+ } }
72
+ function ModelManagementComponent_Conditional_17_Conditional_46_Conditional_5_Template(rf, ctx) { if (rf & 1) {
73
+ const _r6 = i0.ɵɵgetCurrentView();
74
+ i0.ɵɵelementStart(0, "p");
75
+ i0.ɵɵtext(1, "No models match your current filters.");
76
+ i0.ɵɵelementEnd();
77
+ i0.ɵɵelementStart(2, "button", 38);
78
+ 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()); });
79
+ i0.ɵɵtext(3, "Clear Filters");
80
+ i0.ɵɵelementEnd();
81
+ } }
82
+ function ModelManagementComponent_Conditional_17_Conditional_46_Template(rf, ctx) { if (rf & 1) {
83
+ i0.ɵɵelementStart(0, "div", 35);
84
+ i0.ɵɵelement(1, "span", 37);
85
+ i0.ɵɵelementStart(2, "h3");
86
+ i0.ɵɵtext(3, "No Models Found");
87
+ i0.ɵɵelementEnd();
88
+ i0.ɵɵtemplate(4, ModelManagementComponent_Conditional_17_Conditional_46_Conditional_4_Template, 5, 0)(5, ModelManagementComponent_Conditional_17_Conditional_46_Conditional_5_Template, 4, 0);
89
+ i0.ɵɵelementEnd();
90
+ } if (rf & 2) {
91
+ const ctx_r0 = i0.ɵɵnextContext(2);
92
+ i0.ɵɵadvance(4);
93
+ i0.ɵɵconditional(ctx_r0.models.length === 0 ? 4 : 5);
94
+ } }
95
+ function ModelManagementComponent_Conditional_17_Conditional_47_For_2_Conditional_30_Template(rf, ctx) { if (rf & 1) {
96
+ i0.ɵɵelementStart(0, "div", 49);
97
+ i0.ɵɵtext(1);
98
+ i0.ɵɵelementEnd();
99
+ } if (rf & 2) {
100
+ const displayData_r8 = i0.ɵɵnextContext().$implicit;
101
+ i0.ɵɵadvance();
102
+ i0.ɵɵtextInterpolate1(" ", displayData_r8.model.Description, " ");
103
+ } }
104
+ function ModelManagementComponent_Conditional_17_Conditional_47_For_2_Template(rf, ctx) { if (rf & 1) {
105
+ const _r7 = i0.ɵɵgetCurrentView();
106
+ i0.ɵɵelementStart(0, "div", 40);
107
+ 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)); });
108
+ i0.ɵɵelementStart(1, "div", 41)(2, "div", 42)(3, "h4");
109
+ i0.ɵɵtext(4);
110
+ i0.ɵɵelementEnd();
111
+ i0.ɵɵelementStart(5, "span", 43);
112
+ i0.ɵɵtext(6);
113
+ i0.ɵɵelementEnd()();
114
+ i0.ɵɵelementStart(7, "div", 44);
115
+ i0.ɵɵtext(8);
116
+ i0.ɵɵelementEnd()();
117
+ i0.ɵɵelementStart(9, "div", 45)(10, "div", 46)(11, "span", 47);
118
+ i0.ɵɵtext(12, "Type:");
119
+ i0.ɵɵelementEnd();
120
+ i0.ɵɵelementStart(13, "span", 48);
121
+ i0.ɵɵtext(14);
122
+ i0.ɵɵelementEnd()();
123
+ i0.ɵɵelementStart(15, "div", 46)(16, "span", 47);
124
+ i0.ɵɵtext(17, "Power:");
125
+ i0.ɵɵelementEnd();
126
+ i0.ɵɵelementStart(18, "span", 48);
127
+ i0.ɵɵtext(19);
128
+ i0.ɵɵelementEnd()();
129
+ i0.ɵɵelementStart(20, "div", 46)(21, "span", 47);
130
+ i0.ɵɵtext(22, "Speed:");
131
+ i0.ɵɵelementEnd();
132
+ i0.ɵɵelementStart(23, "span", 48);
133
+ i0.ɵɵtext(24);
134
+ i0.ɵɵelementEnd()();
135
+ i0.ɵɵelementStart(25, "div", 46)(26, "span", 47);
136
+ i0.ɵɵtext(27, "Cost:");
137
+ i0.ɵɵelementEnd();
138
+ i0.ɵɵelementStart(28, "span", 48);
139
+ i0.ɵɵtext(29);
140
+ i0.ɵɵelementEnd()()();
141
+ i0.ɵɵtemplate(30, ModelManagementComponent_Conditional_17_Conditional_47_For_2_Conditional_30_Template, 2, 1, "div", 49);
142
+ i0.ɵɵelementStart(31, "div", 50)(32, "button", 51);
143
+ 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)); });
144
+ i0.ɵɵelement(33, "span");
145
+ i0.ɵɵelementEnd();
146
+ i0.ɵɵelementStart(34, "button", 52);
147
+ 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)); });
148
+ i0.ɵɵelement(35, "span", 53);
149
+ i0.ɵɵelementEnd()()();
150
+ } if (rf & 2) {
151
+ const displayData_r8 = ctx.$implicit;
152
+ i0.ɵɵadvance(4);
153
+ i0.ɵɵtextInterpolate(displayData_r8.model.Name);
154
+ i0.ɵɵadvance(2);
155
+ i0.ɵɵtextInterpolate((displayData_r8.vendor == null ? null : displayData_r8.vendor.Name) || "Unknown Vendor");
156
+ i0.ɵɵadvance();
157
+ i0.ɵɵclassProp("active", displayData_r8.model.IsActive);
158
+ i0.ɵɵadvance();
159
+ i0.ɵɵtextInterpolate1(" ", displayData_r8.statusDisplay, " ");
160
+ i0.ɵɵadvance(6);
161
+ i0.ɵɵtextInterpolate((displayData_r8.modelType == null ? null : displayData_r8.modelType.Name) || "Unknown");
162
+ i0.ɵɵadvance(5);
163
+ i0.ɵɵtextInterpolate(displayData_r8.powerRankDisplay);
164
+ i0.ɵɵadvance(5);
165
+ i0.ɵɵtextInterpolate(displayData_r8.speedRankDisplay);
166
+ i0.ɵɵadvance(5);
167
+ i0.ɵɵtextInterpolate(displayData_r8.costRankDisplay);
168
+ i0.ɵɵadvance();
169
+ i0.ɵɵconditional(displayData_r8.model.Description ? 30 : -1);
170
+ i0.ɵɵadvance(2);
171
+ i0.ɵɵproperty("title", displayData_r8.model.IsActive ? "Deactivate" : "Activate");
172
+ i0.ɵɵadvance();
173
+ i0.ɵɵclassMap(displayData_r8.model.IsActive ? "fa-solid fa-pause" : "fa-solid fa-play");
174
+ } }
175
+ function ModelManagementComponent_Conditional_17_Conditional_47_Template(rf, ctx) { if (rf & 1) {
176
+ i0.ɵɵelementStart(0, "div", 36);
177
+ i0.ɵɵrepeaterCreate(1, ModelManagementComponent_Conditional_17_Conditional_47_For_2_Template, 36, 13, "div", 39, _forTrack1);
178
+ i0.ɵɵelementEnd();
179
+ } if (rf & 2) {
180
+ const ctx_r0 = i0.ɵɵnextContext(2);
181
+ i0.ɵɵadvance();
182
+ i0.ɵɵrepeater(ctx_r0.filteredModels);
183
+ } }
184
+ function ModelManagementComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
185
+ const _r2 = i0.ɵɵgetCurrentView();
186
+ i0.ɵɵelementStart(0, "div", 13)(1, "kendo-splitter", 19)(2, "kendo-splitter-pane", 20)(3, "div", 21)(4, "div", 22)(5, "h3");
187
+ i0.ɵɵtext(6, "Filters");
188
+ i0.ɵɵelementEnd();
189
+ i0.ɵɵelementStart(7, "button", 23);
190
+ 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()); });
191
+ i0.ɵɵelement(8, "span", 24);
192
+ i0.ɵɵelementEnd()();
193
+ i0.ɵɵelementStart(9, "div", 25)(10, "div", 26)(11, "label");
194
+ i0.ɵɵtext(12, "Search");
195
+ i0.ɵɵelementEnd();
196
+ i0.ɵɵelementStart(13, "input", 27);
197
+ 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); });
198
+ 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)); });
199
+ i0.ɵɵelementEnd()();
200
+ i0.ɵɵelementStart(14, "div", 28)(15, "label");
201
+ i0.ɵɵtext(16, "Vendor");
202
+ i0.ɵɵelementEnd();
203
+ i0.ɵɵelementStart(17, "select", 29);
204
+ 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); });
205
+ 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()); });
206
+ i0.ɵɵelementStart(18, "option", 30);
207
+ i0.ɵɵtext(19, "All Vendors");
208
+ i0.ɵɵelementEnd();
209
+ i0.ɵɵrepeaterCreate(20, ModelManagementComponent_Conditional_17_For_21_Template, 2, 2, "option", 30, _forTrack0);
210
+ i0.ɵɵelementEnd()();
211
+ i0.ɵɵelementStart(22, "div", 28)(23, "label");
212
+ i0.ɵɵtext(24, "Type");
213
+ i0.ɵɵelementEnd();
214
+ i0.ɵɵelementStart(25, "select", 29);
215
+ 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); });
216
+ 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()); });
217
+ i0.ɵɵelementStart(26, "option", 30);
218
+ i0.ɵɵtext(27, "All Types");
219
+ i0.ɵɵelementEnd();
220
+ i0.ɵɵrepeaterCreate(28, ModelManagementComponent_Conditional_17_For_29_Template, 2, 2, "option", 30, _forTrack0);
221
+ i0.ɵɵelementEnd()();
222
+ i0.ɵɵelementStart(30, "div", 28)(31, "label");
223
+ i0.ɵɵtext(32, "Status");
224
+ i0.ɵɵelementEnd();
225
+ i0.ɵɵelementStart(33, "select", 29);
226
+ 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); });
227
+ 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()); });
228
+ i0.ɵɵelementStart(34, "option", 30);
229
+ i0.ɵɵtext(35, "All");
230
+ i0.ɵɵelementEnd();
231
+ i0.ɵɵelementStart(36, "option", 30);
232
+ i0.ɵɵtext(37, "Active");
233
+ i0.ɵɵelementEnd();
234
+ i0.ɵɵelementStart(38, "option", 30);
235
+ i0.ɵɵtext(39, "Inactive");
236
+ i0.ɵɵelementEnd()()();
237
+ i0.ɵɵelementStart(40, "div", 31)(41, "button", 32);
238
+ 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()); });
239
+ i0.ɵɵelement(42, "span", 24);
240
+ i0.ɵɵtext(43, " Clear All ");
241
+ i0.ɵɵelementEnd()()()()();
242
+ i0.ɵɵelementStart(44, "kendo-splitter-pane", 33)(45, "div", 34);
243
+ i0.ɵɵtemplate(46, ModelManagementComponent_Conditional_17_Conditional_46_Template, 6, 1, "div", 35)(47, ModelManagementComponent_Conditional_17_Conditional_47_Template, 3, 0, "div", 36);
244
+ i0.ɵɵelementEnd()()()();
245
+ } if (rf & 2) {
246
+ const ctx_r0 = i0.ɵɵnextContext();
247
+ i0.ɵɵadvance(2);
248
+ i0.ɵɵproperty("size", ctx_r0.filtersVisible ? "280px" : "0px")("collapsible", false)("resizable", ctx_r0.filtersVisible)("scrollable", false)("hidden", !ctx_r0.filtersVisible);
249
+ i0.ɵɵadvance(11);
250
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r0.filter.searchTerm);
251
+ i0.ɵɵadvance(4);
252
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r0.filter.vendorId);
253
+ i0.ɵɵadvance();
254
+ i0.ɵɵproperty("value", null);
255
+ i0.ɵɵadvance(2);
256
+ i0.ɵɵrepeater(ctx_r0.vendors);
257
+ i0.ɵɵadvance(5);
258
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r0.filter.modelTypeId);
259
+ i0.ɵɵadvance();
260
+ i0.ɵɵproperty("value", null);
261
+ i0.ɵɵadvance(2);
262
+ i0.ɵɵrepeater(ctx_r0.modelTypes);
263
+ i0.ɵɵadvance(5);
264
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r0.filter.isActive);
265
+ i0.ɵɵadvance();
266
+ i0.ɵɵproperty("value", null);
267
+ i0.ɵɵadvance(2);
268
+ i0.ɵɵproperty("value", true);
269
+ i0.ɵɵadvance(2);
270
+ i0.ɵɵproperty("value", false);
271
+ i0.ɵɵadvance(6);
272
+ i0.ɵɵproperty("resizable", true)("scrollable", false);
273
+ i0.ɵɵadvance(2);
274
+ i0.ɵɵconditional(ctx_r0.filteredModels.length === 0 ? 46 : 47);
275
+ } }
276
+ export class ModelManagementComponent {
277
+ constructor() {
278
+ this.openEntityRecord = new EventEmitter();
279
+ // Data properties
280
+ this.models = [];
281
+ this.vendors = [];
282
+ this.modelTypes = [];
283
+ this.filteredModels = [];
284
+ // UI state
285
+ this.isLoading = false;
286
+ this.loadingMessage = 'Loading AI models...';
287
+ this.error = null;
288
+ this.filtersVisible = false;
289
+ // Filter state
290
+ this.filter = {
291
+ searchTerm: '',
292
+ vendorId: null,
293
+ modelTypeId: null,
294
+ powerRankMin: null,
295
+ powerRankMax: null,
296
+ speedRankMin: null,
297
+ speedRankMax: null,
298
+ costRankMin: null,
299
+ costRankMax: null,
300
+ isActive: null
301
+ };
302
+ // Sort options
303
+ this.sortOptions = [
304
+ { field: 'Name', direction: 'asc', label: 'Name (A-Z)' },
305
+ { field: 'Name', direction: 'desc', label: 'Name (Z-A)' },
306
+ { field: 'PowerRank', direction: 'desc', label: 'Power Rank (High to Low)' },
307
+ { field: 'PowerRank', direction: 'asc', label: 'Power Rank (Low to High)' },
308
+ { field: 'SpeedRank', direction: 'desc', label: 'Speed Rank (High to Low)' },
309
+ { field: 'SpeedRank', direction: 'asc', label: 'Speed Rank (Low to High)' },
310
+ { field: 'CostRank', direction: 'desc', label: 'Cost Rank (High to Low)' },
311
+ { field: 'CostRank', direction: 'asc', label: 'Cost Rank (Low to High)' },
312
+ { field: '__mj_CreatedAt', direction: 'desc', label: 'Recently Added' },
313
+ { field: '__mj_UpdatedAt', direction: 'desc', label: 'Recently Updated' }
314
+ ];
315
+ this.selectedSort = this.sortOptions[0];
316
+ // Search and filter subjects
317
+ this.searchSubject = new BehaviorSubject('');
318
+ this.filterSubject = new BehaviorSubject(this.filter);
319
+ this.destroy$ = new Subject();
320
+ }
321
+ ngOnInit() {
322
+ this.setupFilterSubscriptions();
323
+ this.loadData();
324
+ }
325
+ ngOnDestroy() {
326
+ this.destroy$.next();
327
+ this.destroy$.complete();
328
+ }
329
+ setupFilterSubscriptions() {
330
+ // Debounced search
331
+ this.searchSubject.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(searchTerm => {
332
+ this.filter.searchTerm = searchTerm;
333
+ this.applyFilters();
334
+ });
335
+ // Combined filter changes
336
+ combineLatest([
337
+ this.filterSubject.pipe(debounceTime(100)),
338
+ this.searchSubject.pipe(debounceTime(300))
339
+ ]).pipe(takeUntil(this.destroy$)).subscribe(() => {
340
+ this.applyFilters();
341
+ });
342
+ }
343
+ loadData() {
344
+ return __awaiter(this, void 0, void 0, function* () {
345
+ try {
346
+ this.isLoading = true;
347
+ this.error = null;
348
+ this.loadingMessage = 'Loading AI models...';
349
+ // Load all required data in parallel
350
+ const [modelsResult, vendorsResult, modelTypesResult] = yield Promise.all([
351
+ this.loadModels(),
352
+ this.loadVendors(),
353
+ this.loadModelTypes()
354
+ ]);
355
+ if (modelsResult && vendorsResult && modelTypesResult) {
356
+ this.applyFilters();
357
+ LogStatus('Model management data loaded successfully');
358
+ }
359
+ }
360
+ catch (error) {
361
+ this.error = 'Failed to load model data. Please try again.';
362
+ LogError('Error loading model management data: ' + String(error));
363
+ }
364
+ finally {
365
+ this.isLoading = false;
366
+ }
367
+ });
368
+ }
369
+ loadModels() {
370
+ return __awaiter(this, void 0, void 0, function* () {
371
+ try {
372
+ const md = Metadata.Provider;
373
+ if (!md) {
374
+ throw new Error('Metadata provider not available');
375
+ }
376
+ const rv = new RunView();
377
+ const result = yield rv.RunView({
378
+ EntityName: 'AI Models',
379
+ ExtraFilter: '', // Load all models, we'll filter in UI
380
+ OrderBy: 'Name',
381
+ UserSearchString: '',
382
+ OverrideExcludeFilter: '',
383
+ SaveViewResults: false
384
+ });
385
+ if (result && result.Success && result.Results) {
386
+ this.models = result.Results;
387
+ return true;
388
+ }
389
+ else {
390
+ throw new Error('Failed to load AI models');
391
+ }
392
+ }
393
+ catch (error) {
394
+ LogError('Error loading AI models: ' + String(error));
395
+ return false;
396
+ }
397
+ });
398
+ }
399
+ loadVendors() {
400
+ return __awaiter(this, void 0, void 0, function* () {
401
+ try {
402
+ const rv = new RunView();
403
+ const result = yield rv.RunView({
404
+ EntityName: 'MJ: AI Vendors',
405
+ ExtraFilter: '',
406
+ OrderBy: 'Name',
407
+ UserSearchString: '',
408
+ OverrideExcludeFilter: '',
409
+ SaveViewResults: false
410
+ });
411
+ if (result && result.Success && result.Results) {
412
+ this.vendors = result.Results;
413
+ return true;
414
+ }
415
+ else {
416
+ throw new Error('Failed to load AI vendors');
417
+ }
418
+ }
419
+ catch (error) {
420
+ LogError('Error loading AI vendors: ' + String(error));
421
+ return false;
422
+ }
423
+ });
424
+ }
425
+ loadModelTypes() {
426
+ return __awaiter(this, void 0, void 0, function* () {
427
+ try {
428
+ const rv = new RunView();
429
+ const result = yield rv.RunView({
430
+ EntityName: 'AI Model Types',
431
+ ExtraFilter: '',
432
+ OrderBy: 'Name',
433
+ UserSearchString: '',
434
+ OverrideExcludeFilter: '',
435
+ SaveViewResults: false
436
+ });
437
+ if (result && result.Success && result.Results) {
438
+ this.modelTypes = result.Results;
439
+ return true;
440
+ }
441
+ else {
442
+ throw new Error('Failed to load AI model types');
443
+ }
444
+ }
445
+ catch (error) {
446
+ LogError('Error loading AI model types: ' + String(error));
447
+ return false;
448
+ }
449
+ });
450
+ }
451
+ onSearchChange(searchTerm) {
452
+ this.searchSubject.next(searchTerm);
453
+ }
454
+ onFilterChange() {
455
+ this.filterSubject.next(Object.assign({}, this.filter));
456
+ }
457
+ onSortChange(sort) {
458
+ this.selectedSort = sort;
459
+ this.applyFilters();
460
+ }
461
+ toggleFiltersVisible() {
462
+ this.filtersVisible = !this.filtersVisible;
463
+ }
464
+ clearFilters() {
465
+ this.filter = {
466
+ searchTerm: '',
467
+ vendorId: null,
468
+ modelTypeId: null,
469
+ powerRankMin: null,
470
+ powerRankMax: null,
471
+ speedRankMin: null,
472
+ speedRankMax: null,
473
+ costRankMin: null,
474
+ costRankMax: null,
475
+ isActive: null
476
+ };
477
+ this.searchSubject.next('');
478
+ this.filterSubject.next(this.filter);
479
+ }
480
+ applyFilters() {
481
+ let filtered = [...this.models];
482
+ // Apply search filter
483
+ if (this.filter.searchTerm) {
484
+ const searchLower = this.filter.searchTerm.toLowerCase();
485
+ filtered = filtered.filter(model => {
486
+ var _a, _b, _c;
487
+ return ((_a = model.Name) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(searchLower)) ||
488
+ ((_b = model.Description) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(searchLower)) ||
489
+ ((_c = this.getVendorName(model)) === null || _c === void 0 ? void 0 : _c.toLowerCase().includes(searchLower));
490
+ });
491
+ }
492
+ // Apply vendor filter
493
+ if (this.filter.vendorId) {
494
+ filtered = filtered.filter(model => model.APIName === this.filter.vendorId);
495
+ }
496
+ // Apply model type filter
497
+ if (this.filter.modelTypeId) {
498
+ filtered = filtered.filter(model => model.AIModelTypeID === this.filter.modelTypeId);
499
+ }
500
+ // Apply rank filters
501
+ if (this.filter.powerRankMin !== null) {
502
+ filtered = filtered.filter(model => (model.PowerRank || 0) >= this.filter.powerRankMin);
503
+ }
504
+ if (this.filter.powerRankMax !== null) {
505
+ filtered = filtered.filter(model => (model.PowerRank || 0) <= this.filter.powerRankMax);
506
+ }
507
+ if (this.filter.speedRankMin !== null) {
508
+ filtered = filtered.filter(model => (model.SpeedRank || 0) >= this.filter.speedRankMin);
509
+ }
510
+ if (this.filter.speedRankMax !== null) {
511
+ filtered = filtered.filter(model => (model.SpeedRank || 0) <= this.filter.speedRankMax);
512
+ }
513
+ if (this.filter.costRankMin !== null) {
514
+ filtered = filtered.filter(model => (model.CostRank || 0) >= this.filter.costRankMin);
515
+ }
516
+ if (this.filter.costRankMax !== null) {
517
+ filtered = filtered.filter(model => (model.CostRank || 0) <= this.filter.costRankMax);
518
+ }
519
+ // Apply active filter
520
+ if (this.filter.isActive !== null) {
521
+ filtered = filtered.filter(model => model.IsActive === this.filter.isActive);
522
+ }
523
+ // Apply sorting
524
+ filtered.sort((a, b) => {
525
+ const aValue = a[this.selectedSort.field];
526
+ const bValue = b[this.selectedSort.field];
527
+ if (aValue == null && bValue == null)
528
+ return 0;
529
+ if (aValue == null)
530
+ return 1;
531
+ if (bValue == null)
532
+ return -1;
533
+ let comparison = 0;
534
+ if (typeof aValue === 'string' && typeof bValue === 'string') {
535
+ comparison = aValue.localeCompare(bValue);
536
+ }
537
+ else {
538
+ comparison = aValue < bValue ? -1 : aValue > bValue ? 1 : 0;
539
+ }
540
+ return this.selectedSort.direction === 'desc' ? -comparison : comparison;
541
+ });
542
+ // Transform to display data
543
+ this.filteredModels = filtered.map(model => this.transformToDisplayData(model));
544
+ }
545
+ transformToDisplayData(model) {
546
+ return {
547
+ model,
548
+ vendor: this.getVendor(model),
549
+ modelType: this.getModelType(model),
550
+ powerRankDisplay: this.formatRank(model.PowerRank),
551
+ speedRankDisplay: this.formatRank(model.SpeedRank),
552
+ costRankDisplay: this.formatRank(model.CostRank),
553
+ statusDisplay: model.IsActive ? 'Active' : 'Inactive'
554
+ };
555
+ }
556
+ getVendor(model) {
557
+ return this.vendors.find(v => v.ID === model.APIName) || null;
558
+ }
559
+ getVendorName(model) {
560
+ const vendor = this.getVendor(model);
561
+ return (vendor === null || vendor === void 0 ? void 0 : vendor.Name) || null;
562
+ }
563
+ getModelType(model) {
564
+ return this.modelTypes.find(mt => mt.ID === model.AIModelTypeID) || null;
565
+ }
566
+ formatRank(rank) {
567
+ if (rank == null)
568
+ return 'N/A';
569
+ return `${rank}/10`;
570
+ }
571
+ onOpenModel(model) {
572
+ this.openEntityRecord.emit({
573
+ entityName: 'AI Models',
574
+ recordId: model.ID
575
+ });
576
+ }
577
+ createNewModel() {
578
+ return __awaiter(this, void 0, void 0, function* () {
579
+ try {
580
+ const md = Metadata.Provider;
581
+ if (!md) {
582
+ throw new Error('Metadata provider not available');
583
+ }
584
+ const newModel = yield md.GetEntityObject('AI Models', md.CurrentUser);
585
+ // Pre-populate some defaults
586
+ newModel.IsActive = true;
587
+ newModel.PowerRank = 5;
588
+ newModel.SpeedRank = 5;
589
+ newModel.CostRank = 5;
590
+ this.openEntityRecord.emit({
591
+ entityName: 'AI Models',
592
+ recordId: 'new'
593
+ });
594
+ }
595
+ catch (error) {
596
+ LogError('Error creating new AI model: ' + String(error));
597
+ }
598
+ });
599
+ }
600
+ toggleModelStatus(model) {
601
+ return __awaiter(this, void 0, void 0, function* () {
602
+ try {
603
+ const md = Metadata.Provider;
604
+ if (!md) {
605
+ throw new Error('Metadata provider not available');
606
+ }
607
+ const modelToUpdate = yield md.GetEntityObject('AI Models', md.CurrentUser);
608
+ yield modelToUpdate.Load(model.ID);
609
+ modelToUpdate.IsActive = !modelToUpdate.IsActive;
610
+ const result = yield modelToUpdate.Save();
611
+ if (result) {
612
+ // Update local data
613
+ const index = this.models.findIndex(m => m.ID === model.ID);
614
+ if (index >= 0) {
615
+ this.models[index] = Object.assign({}, this.models[index], { IsActive: modelToUpdate.IsActive });
616
+ this.applyFilters();
617
+ }
618
+ LogStatus(`Model ${modelToUpdate.Name} ${modelToUpdate.IsActive ? 'activated' : 'deactivated'}`);
619
+ }
620
+ }
621
+ catch (error) {
622
+ LogError('Error updating model status: ' + String(error));
623
+ }
624
+ });
625
+ }
626
+ }
627
+ ModelManagementComponent.ɵfac = function ModelManagementComponent_Factory(t) { return new (t || ModelManagementComponent)(); };
628
+ ModelManagementComponent.ɵ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) {
629
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "span", 3);
630
+ i0.ɵɵtext(4);
631
+ i0.ɵɵelementEnd()();
632
+ i0.ɵɵelementStart(5, "div", 4)(6, "button", 5);
633
+ i0.ɵɵlistener("click", function ModelManagementComponent_Template_button_click_6_listener() { return ctx.toggleFiltersVisible(); });
634
+ i0.ɵɵelement(7, "span", 6);
635
+ i0.ɵɵtext(8, " Filters ");
636
+ i0.ɵɵelementEnd();
637
+ i0.ɵɵelementStart(9, "button", 7);
638
+ i0.ɵɵlistener("click", function ModelManagementComponent_Template_button_click_9_listener() { return ctx.createNewModel(); });
639
+ i0.ɵɵelement(10, "span", 8);
640
+ i0.ɵɵtext(11, " Add Model ");
641
+ i0.ɵɵelementEnd();
642
+ i0.ɵɵelementStart(12, "button", 9);
643
+ i0.ɵɵlistener("click", function ModelManagementComponent_Template_button_click_12_listener() { return ctx.loadData(); });
644
+ i0.ɵɵelement(13, "span", 10);
645
+ i0.ɵɵtext(14, " Refresh ");
646
+ i0.ɵɵelementEnd()()();
647
+ 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);
648
+ i0.ɵɵelementEnd();
649
+ } if (rf & 2) {
650
+ i0.ɵɵproperty("rightMargin", 8)("bottomMargin", 8);
651
+ i0.ɵɵadvance(4);
652
+ i0.ɵɵtextInterpolate1("", ctx.filteredModels.length, " AI models");
653
+ i0.ɵɵadvance(2);
654
+ i0.ɵɵclassProp("active", ctx.filtersVisible);
655
+ i0.ɵɵadvance(9);
656
+ i0.ɵɵconditional(ctx.isLoading ? 15 : -1);
657
+ i0.ɵɵadvance();
658
+ i0.ɵɵconditional(ctx.error ? 16 : -1);
659
+ i0.ɵɵadvance();
660
+ i0.ɵɵconditional(!ctx.isLoading && !ctx.error ? 17 : -1);
661
+ } }, 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}"] });
662
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ModelManagementComponent, [{
663
+ type: Component,
664
+ 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}"] }]
665
+ }], null, { openEntityRecord: [{
666
+ type: Output
667
+ }] }); })();
668
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ModelManagementComponent, { className: "ModelManagementComponent", filePath: "src/AI/components/models/model-management.component.ts", lineNumber: 41 }); })();
669
+ //# sourceMappingURL=model-management.component.js.map