@memberjunction/ng-dashboards 2.121.0 → 2.122.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 (203) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +23 -11
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +122 -95
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +88 -90
  6. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  7. package/dist/AI/components/agents/agent-filter-panel.component.js +2 -2
  8. package/dist/AI/components/execution-monitoring.component.d.ts +23 -10
  9. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  10. package/dist/AI/components/execution-monitoring.component.js +143 -124
  11. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  12. package/dist/AI/components/models/model-management-v2.component.d.ts +17 -13
  13. package/dist/AI/components/models/model-management-v2.component.d.ts.map +1 -1
  14. package/dist/AI/components/models/model-management-v2.component.js +248 -266
  15. package/dist/AI/components/models/model-management-v2.component.js.map +1 -1
  16. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +76 -78
  17. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  18. package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
  19. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +17 -15
  20. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +1 -1
  21. package/dist/AI/components/prompts/prompt-management-v2.component.js +372 -397
  22. package/dist/AI/components/prompts/prompt-management-v2.component.js.map +1 -1
  23. package/dist/AI/components/prompts/prompt-version-control.component.js +100 -102
  24. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  25. package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
  26. package/dist/AI/components/system/system-configuration.component.d.ts +17 -10
  27. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  28. package/dist/AI/components/system/system-configuration.component.js +82 -61
  29. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  30. package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -1
  31. package/dist/AI/components/widgets/kpi-card.component.js +11 -7
  32. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  33. package/dist/AI/index.d.ts +4 -0
  34. package/dist/AI/index.d.ts.map +1 -1
  35. package/dist/AI/index.js +6 -1
  36. package/dist/AI/index.js.map +1 -1
  37. package/dist/Actions/components/actions-list-view.component.js +9 -9
  38. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  39. package/dist/Actions/components/actions-overview.component.d.ts +16 -13
  40. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  41. package/dist/Actions/components/actions-overview.component.js +62 -48
  42. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  43. package/dist/Actions/components/categories-list-view.component.js +9 -9
  44. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  45. package/dist/Actions/components/code-management.component.d.ts +17 -7
  46. package/dist/Actions/components/code-management.component.d.ts.map +1 -1
  47. package/dist/Actions/components/code-management.component.js +45 -12
  48. package/dist/Actions/components/code-management.component.js.map +1 -1
  49. package/dist/Actions/components/entity-integration.component.d.ts +17 -7
  50. package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
  51. package/dist/Actions/components/entity-integration.component.js +45 -12
  52. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  53. package/dist/Actions/components/execution-monitoring.component.d.ts +16 -10
  54. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  55. package/dist/Actions/components/execution-monitoring.component.js +56 -30
  56. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  57. package/dist/Actions/components/scheduled-actions.component.d.ts +17 -7
  58. package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
  59. package/dist/Actions/components/scheduled-actions.component.js +45 -12
  60. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  61. package/dist/Actions/components/security-permissions.component.d.ts +17 -7
  62. package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
  63. package/dist/Actions/components/security-permissions.component.js +45 -12
  64. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  65. package/dist/Actions/index.d.ts +6 -1
  66. package/dist/Actions/index.d.ts.map +1 -1
  67. package/dist/Actions/index.js +9 -1
  68. package/dist/Actions/index.js.map +1 -1
  69. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +1 -1
  70. package/dist/ComponentStudio/component-studio-dashboard.component.js +8 -8
  71. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  72. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +52 -57
  73. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  74. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +8 -9
  75. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  76. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +107 -0
  77. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -0
  78. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +553 -0
  79. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -0
  80. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts +179 -0
  81. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +1 -0
  82. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +814 -0
  83. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +1 -0
  84. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +151 -0
  85. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -0
  86. package/dist/DataExplorer/components/view-selector/view-selector.component.js +480 -0
  87. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -0
  88. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +439 -0
  89. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -0
  90. package/dist/DataExplorer/data-explorer-dashboard.component.js +2129 -0
  91. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -0
  92. package/dist/DataExplorer/index.d.ts +5 -0
  93. package/dist/DataExplorer/index.d.ts.map +1 -0
  94. package/dist/DataExplorer/index.js +10 -0
  95. package/dist/DataExplorer/index.js.map +1 -0
  96. package/dist/DataExplorer/models/explorer-state.interface.d.ts +183 -0
  97. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -0
  98. package/dist/DataExplorer/models/explorer-state.interface.js +31 -0
  99. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -0
  100. package/dist/DataExplorer/services/explorer-state.service.d.ts +232 -0
  101. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -0
  102. package/dist/DataExplorer/services/explorer-state.service.js +912 -0
  103. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -0
  104. package/dist/EntityAdmin/components/entity-details.component.d.ts.map +1 -1
  105. package/dist/EntityAdmin/components/entity-details.component.js +11 -13
  106. package/dist/EntityAdmin/components/entity-details.component.js.map +1 -1
  107. package/dist/EntityAdmin/components/entity-filter-panel.component.js +2 -2
  108. package/dist/EntityAdmin/components/erd-composite.component.js +2 -2
  109. package/dist/EntityAdmin/components/erd-diagram.component.js +2 -2
  110. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +1 -1
  111. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  112. package/dist/EntityAdmin/entity-admin-dashboard.component.js +14 -15
  113. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  114. package/dist/Home/home-dashboard.component.d.ts +122 -0
  115. package/dist/Home/home-dashboard.component.d.ts.map +1 -0
  116. package/dist/Home/home-dashboard.component.js +698 -0
  117. package/dist/Home/home-dashboard.component.js.map +1 -0
  118. package/dist/Scheduling/components/index.d.ts +11 -0
  119. package/dist/Scheduling/components/index.d.ts.map +1 -0
  120. package/dist/Scheduling/components/index.js +13 -0
  121. package/dist/Scheduling/components/index.js.map +1 -0
  122. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts +20 -0
  123. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts.map +1 -0
  124. package/dist/Scheduling/components/scheduling-health-resource.component.js +55 -0
  125. package/dist/Scheduling/components/scheduling-health-resource.component.js.map +1 -0
  126. package/dist/Scheduling/components/scheduling-health.component.js +7 -8
  127. package/dist/Scheduling/components/scheduling-health.component.js.map +1 -1
  128. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts +20 -0
  129. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts.map +1 -0
  130. package/dist/Scheduling/components/scheduling-history-resource.component.js +55 -0
  131. package/dist/Scheduling/components/scheduling-history-resource.component.js.map +1 -0
  132. package/dist/Scheduling/components/scheduling-history.component.js +7 -8
  133. package/dist/Scheduling/components/scheduling-history.component.js.map +1 -1
  134. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +20 -0
  135. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -0
  136. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +55 -0
  137. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -0
  138. package/dist/Scheduling/components/scheduling-jobs.component.js +7 -8
  139. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  140. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts +20 -0
  141. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts.map +1 -0
  142. package/dist/Scheduling/components/scheduling-monitor-resource.component.js +55 -0
  143. package/dist/Scheduling/components/scheduling-monitor-resource.component.js.map +1 -0
  144. package/dist/Scheduling/components/scheduling-monitoring.component.js +7 -8
  145. package/dist/Scheduling/components/scheduling-monitoring.component.js.map +1 -1
  146. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts +20 -0
  147. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts.map +1 -0
  148. package/dist/Scheduling/components/scheduling-types-resource.component.js +55 -0
  149. package/dist/Scheduling/components/scheduling-types-resource.component.js.map +1 -0
  150. package/dist/Scheduling/components/scheduling-types.component.js +7 -8
  151. package/dist/Scheduling/components/scheduling-types.component.js.map +1 -1
  152. package/dist/Scheduling/scheduling-dashboard.component.d.ts +1 -1
  153. package/dist/Scheduling/scheduling-dashboard.component.js +3 -3
  154. package/dist/Testing/components/index.d.ts +11 -0
  155. package/dist/Testing/components/index.d.ts.map +1 -0
  156. package/dist/Testing/components/index.js +13 -0
  157. package/dist/Testing/components/index.js.map +1 -0
  158. package/dist/Testing/components/testing-analytics-resource.component.d.ts +20 -0
  159. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -0
  160. package/dist/Testing/components/testing-analytics-resource.component.js +55 -0
  161. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -0
  162. package/dist/Testing/components/testing-execution-resource.component.d.ts +20 -0
  163. package/dist/Testing/components/testing-execution-resource.component.d.ts.map +1 -0
  164. package/dist/Testing/components/testing-execution-resource.component.js +55 -0
  165. package/dist/Testing/components/testing-execution-resource.component.js.map +1 -0
  166. package/dist/Testing/components/testing-execution.component.js +3 -3
  167. package/dist/Testing/components/testing-execution.component.js.map +1 -1
  168. package/dist/Testing/components/testing-feedback-resource.component.d.ts +20 -0
  169. package/dist/Testing/components/testing-feedback-resource.component.d.ts.map +1 -0
  170. package/dist/Testing/components/testing-feedback-resource.component.js +55 -0
  171. package/dist/Testing/components/testing-feedback-resource.component.js.map +1 -0
  172. package/dist/Testing/components/testing-overview-resource.component.d.ts +20 -0
  173. package/dist/Testing/components/testing-overview-resource.component.d.ts.map +1 -0
  174. package/dist/Testing/components/testing-overview-resource.component.js +55 -0
  175. package/dist/Testing/components/testing-overview-resource.component.js.map +1 -0
  176. package/dist/Testing/components/testing-version-resource.component.d.ts +20 -0
  177. package/dist/Testing/components/testing-version-resource.component.d.ts.map +1 -0
  178. package/dist/Testing/components/testing-version-resource.component.js +55 -0
  179. package/dist/Testing/components/testing-version-resource.component.js.map +1 -0
  180. package/dist/Testing/testing-dashboard.component.d.ts +1 -1
  181. package/dist/Testing/testing-dashboard.component.js +23 -25
  182. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  183. package/dist/module.d.ts +83 -66
  184. package/dist/module.d.ts.map +1 -1
  185. package/dist/module.js +137 -19
  186. package/dist/module.js.map +1 -1
  187. package/dist/public-api.d.ts +6 -4
  188. package/dist/public-api.d.ts.map +1 -1
  189. package/dist/public-api.js +41 -13
  190. package/dist/public-api.js.map +1 -1
  191. package/package.json +17 -14
  192. package/dist/AI/ai-dashboard.component.d.ts +0 -62
  193. package/dist/AI/ai-dashboard.component.d.ts.map +0 -1
  194. package/dist/AI/ai-dashboard.component.js +0 -338
  195. package/dist/AI/ai-dashboard.component.js.map +0 -1
  196. package/dist/Actions/actions-management-dashboard.component.d.ts +0 -52
  197. package/dist/Actions/actions-management-dashboard.component.d.ts.map +0 -1
  198. package/dist/Actions/actions-management-dashboard.component.js +0 -308
  199. package/dist/Actions/actions-management-dashboard.component.js.map +0 -1
  200. package/dist/generic/base-dashboard.d.ts +0 -65
  201. package/dist/generic/base-dashboard.d.ts.map +0 -1
  202. package/dist/generic/base-dashboard.js +0 -74
  203. package/dist/generic/base-dashboard.js.map +0 -1
@@ -1,24 +1,30 @@
1
- import { Component, Output, EventEmitter, Input } from '@angular/core';
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Component } from '@angular/core';
2
8
  import { Subject, BehaviorSubject } from 'rxjs';
3
9
  import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
4
- import { Metadata, RunView } from '@memberjunction/core';
10
+ import { Metadata, RunView, CompositeKey } from '@memberjunction/core';
11
+ import { BaseResourceComponent } from '@memberjunction/ng-shared';
12
+ import { RegisterClass } from '@memberjunction/global';
5
13
  import * as i0 from "@angular/core";
6
14
  import * as i1 from "@memberjunction/ng-shared";
7
15
  import * as i2 from "@angular/forms";
8
16
  import * as i3 from "@progress/kendo-angular-layout";
17
+ import * as i4 from "@memberjunction/ng-shared-generic";
9
18
  const _forTrack0 = ($index, $item) => $item.value;
10
19
  const _forTrack1 = ($index, $item) => $item.ID;
11
20
  function ModelManagementV2Component_Conditional_1_Template(rf, ctx) { if (rf & 1) {
12
- i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3);
13
- i0.ɵɵelement(3, "div", 4)(4, "div", 4)(5, "div", 4);
21
+ i0.ɵɵelementStart(0, "div", 1);
22
+ i0.ɵɵelement(1, "mj-loading", 2);
14
23
  i0.ɵɵelementEnd();
15
- i0.ɵɵelementStart(6, "div", 5);
16
- i0.ɵɵtext(7);
17
- i0.ɵɵelementEnd()()();
18
24
  } if (rf & 2) {
19
25
  const ctx_r0 = i0.ɵɵnextContext();
20
- i0.ɵɵadvance(7);
21
- i0.ɵɵtextInterpolate(ctx_r0.currentLoadingMessage);
26
+ i0.ɵɵadvance();
27
+ i0.ɵɵproperty("text", ctx_r0.currentLoadingMessage);
22
28
  } }
23
29
  function ModelManagementV2Component_Conditional_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
24
30
  i0.ɵɵtext(0, " Hide Filters ");
@@ -27,7 +33,7 @@ function ModelManagementV2Component_Conditional_2_Conditional_8_Template(rf, ctx
27
33
  i0.ɵɵtext(0, " Show Filters ");
28
34
  } }
29
35
  function ModelManagementV2Component_Conditional_2_Conditional_21_For_24_Template(rf, ctx) { if (rf & 1) {
30
- i0.ɵɵelementStart(0, "option", 39);
36
+ i0.ɵɵelementStart(0, "option", 36);
31
37
  i0.ɵɵtext(1);
32
38
  i0.ɵɵelementEnd();
33
39
  } if (rf & 2) {
@@ -37,7 +43,7 @@ function ModelManagementV2Component_Conditional_2_Conditional_21_For_24_Template
37
43
  i0.ɵɵtextInterpolate(option_r4.label);
38
44
  } }
39
45
  function ModelManagementV2Component_Conditional_2_Conditional_21_For_33_Template(rf, ctx) { if (rf & 1) {
40
- i0.ɵɵelementStart(0, "option", 39);
46
+ i0.ɵɵelementStart(0, "option", 36);
41
47
  i0.ɵɵtext(1);
42
48
  i0.ɵɵelementEnd();
43
49
  } if (rf & 2) {
@@ -47,7 +53,7 @@ function ModelManagementV2Component_Conditional_2_Conditional_21_For_33_Template
47
53
  i0.ɵɵtextInterpolate(vendor_r5.Name);
48
54
  } }
49
55
  function ModelManagementV2Component_Conditional_2_Conditional_21_For_42_Template(rf, ctx) { if (rf & 1) {
50
- i0.ɵɵelementStart(0, "option", 39);
56
+ i0.ɵɵelementStart(0, "option", 36);
51
57
  i0.ɵɵtext(1);
52
58
  i0.ɵɵelementEnd();
53
59
  } if (rf & 2) {
@@ -58,89 +64,89 @@ function ModelManagementV2Component_Conditional_2_Conditional_21_For_42_Template
58
64
  } }
59
65
  function ModelManagementV2Component_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
60
66
  const _r3 = i0.ɵɵgetCurrentView();
61
- i0.ɵɵelementStart(0, "kendo-splitter-pane", 22)(1, "div", 25)(2, "div", 26)(3, "h3");
67
+ i0.ɵɵelementStart(0, "kendo-splitter-pane", 19)(1, "div", 22)(2, "div", 23)(3, "h3");
62
68
  i0.ɵɵtext(4, "Model Filters");
63
69
  i0.ɵɵelementEnd();
64
- i0.ɵɵelementStart(5, "div", 27)(6, "span", 28);
70
+ i0.ɵɵelementStart(5, "div", 24)(6, "span", 25);
65
71
  i0.ɵɵtext(7);
66
72
  i0.ɵɵelementEnd();
67
- i0.ɵɵelementStart(8, "span", 29);
73
+ i0.ɵɵelementStart(8, "span", 26);
68
74
  i0.ɵɵtext(9);
69
75
  i0.ɵɵelementEnd()();
70
- i0.ɵɵelementStart(10, "button", 30);
76
+ i0.ɵɵelementStart(10, "button", 27);
71
77
  i0.ɵɵlistener("click", function ModelManagementV2Component_Conditional_2_Conditional_21_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.toggleFilterPanel()); });
72
- i0.ɵɵelement(11, "span", 31);
78
+ i0.ɵɵelement(11, "span", 28);
73
79
  i0.ɵɵelementEnd()();
74
- i0.ɵɵelementStart(12, "div", 32)(13, "div", 33)(14, "label", 34);
75
- i0.ɵɵelement(15, "span", 35);
80
+ i0.ɵɵelementStart(12, "div", 29)(13, "div", 30)(14, "label", 31);
81
+ i0.ɵɵelement(15, "span", 32);
76
82
  i0.ɵɵtext(16, " Name ");
77
83
  i0.ɵɵelementEnd();
78
- i0.ɵɵelementStart(17, "input", 36);
84
+ i0.ɵɵelementStart(17, "input", 33);
79
85
  i0.ɵɵlistener("input", function ModelManagementV2Component_Conditional_2_Conditional_21_Template_input_input_17_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onSearchChange($event.target.value)); });
80
86
  i0.ɵɵelementEnd()();
81
- i0.ɵɵelementStart(18, "div", 33)(19, "label", 34);
82
- i0.ɵɵelement(20, "span", 37);
87
+ i0.ɵɵelementStart(18, "div", 30)(19, "label", 31);
88
+ i0.ɵɵelement(20, "span", 34);
83
89
  i0.ɵɵtext(21, " Sort By ");
84
90
  i0.ɵɵelementEnd();
85
- i0.ɵɵelementStart(22, "select", 38);
91
+ i0.ɵɵelementStart(22, "select", 35);
86
92
  i0.ɵɵlistener("change", function ModelManagementV2Component_Conditional_2_Conditional_21_Template_select_change_22_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onSortChange($event.target.value)); });
87
- i0.ɵɵrepeaterCreate(23, ModelManagementV2Component_Conditional_2_Conditional_21_For_24_Template, 2, 2, "option", 39, _forTrack0);
93
+ i0.ɵɵrepeaterCreate(23, ModelManagementV2Component_Conditional_2_Conditional_21_For_24_Template, 2, 2, "option", 36, _forTrack0);
88
94
  i0.ɵɵelementEnd()();
89
- i0.ɵɵelementStart(25, "div", 33)(26, "label", 34);
90
- i0.ɵɵelement(27, "span", 40);
95
+ i0.ɵɵelementStart(25, "div", 30)(26, "label", 31);
96
+ i0.ɵɵelement(27, "span", 37);
91
97
  i0.ɵɵtext(28, " Vendor ");
92
98
  i0.ɵɵelementEnd();
93
- i0.ɵɵelementStart(29, "select", 38);
99
+ i0.ɵɵelementStart(29, "select", 35);
94
100
  i0.ɵɵlistener("change", function ModelManagementV2Component_Conditional_2_Conditional_21_Template_select_change_29_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onVendorChange($event.target.value)); });
95
- i0.ɵɵelementStart(30, "option", 41);
101
+ i0.ɵɵelementStart(30, "option", 38);
96
102
  i0.ɵɵtext(31, "All Vendors");
97
103
  i0.ɵɵelementEnd();
98
- i0.ɵɵrepeaterCreate(32, ModelManagementV2Component_Conditional_2_Conditional_21_For_33_Template, 2, 2, "option", 39, _forTrack1);
104
+ i0.ɵɵrepeaterCreate(32, ModelManagementV2Component_Conditional_2_Conditional_21_For_33_Template, 2, 2, "option", 36, _forTrack1);
99
105
  i0.ɵɵelementEnd()();
100
- i0.ɵɵelementStart(34, "div", 33)(35, "label", 34);
101
- i0.ɵɵelement(36, "span", 9);
106
+ i0.ɵɵelementStart(34, "div", 30)(35, "label", 31);
107
+ i0.ɵɵelement(36, "span", 6);
102
108
  i0.ɵɵtext(37, " Type ");
103
109
  i0.ɵɵelementEnd();
104
- i0.ɵɵelementStart(38, "select", 38);
110
+ i0.ɵɵelementStart(38, "select", 35);
105
111
  i0.ɵɵlistener("change", function ModelManagementV2Component_Conditional_2_Conditional_21_Template_select_change_38_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onTypeChange($event.target.value)); });
106
- i0.ɵɵelementStart(39, "option", 41);
112
+ i0.ɵɵelementStart(39, "option", 38);
107
113
  i0.ɵɵtext(40, "All Types");
108
114
  i0.ɵɵelementEnd();
109
- i0.ɵɵrepeaterCreate(41, ModelManagementV2Component_Conditional_2_Conditional_21_For_42_Template, 2, 2, "option", 39, _forTrack1);
115
+ i0.ɵɵrepeaterCreate(41, ModelManagementV2Component_Conditional_2_Conditional_21_For_42_Template, 2, 2, "option", 36, _forTrack1);
110
116
  i0.ɵɵelementEnd()();
111
- i0.ɵɵelementStart(43, "div", 33)(44, "label", 34);
112
- i0.ɵɵelement(45, "span", 42);
117
+ i0.ɵɵelementStart(43, "div", 30)(44, "label", 31);
118
+ i0.ɵɵelement(45, "span", 39);
113
119
  i0.ɵɵtext(46, " Status ");
114
120
  i0.ɵɵelementEnd();
115
- i0.ɵɵelementStart(47, "select", 38);
121
+ i0.ɵɵelementStart(47, "select", 35);
116
122
  i0.ɵɵlistener("change", function ModelManagementV2Component_Conditional_2_Conditional_21_Template_select_change_47_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onStatusChange($event.target.value)); });
117
- i0.ɵɵelementStart(48, "option", 41);
123
+ i0.ɵɵelementStart(48, "option", 38);
118
124
  i0.ɵɵtext(49, "All Statuses");
119
125
  i0.ɵɵelementEnd();
120
- i0.ɵɵelementStart(50, "option", 43);
126
+ i0.ɵɵelementStart(50, "option", 40);
121
127
  i0.ɵɵtext(51, "Active");
122
128
  i0.ɵɵelementEnd();
123
- i0.ɵɵelementStart(52, "option", 44);
129
+ i0.ɵɵelementStart(52, "option", 41);
124
130
  i0.ɵɵtext(53, "Inactive");
125
131
  i0.ɵɵelementEnd()()();
126
- i0.ɵɵelementStart(54, "div", 33)(55, "label", 34);
127
- i0.ɵɵelement(56, "span", 45);
132
+ i0.ɵɵelementStart(54, "div", 30)(55, "label", 31);
133
+ i0.ɵɵelement(56, "span", 42);
128
134
  i0.ɵɵtext(57, " Power Rank ");
129
135
  i0.ɵɵelementEnd();
130
- i0.ɵɵelementStart(58, "div", 46)(59, "input", 47);
136
+ i0.ɵɵelementStart(58, "div", 43)(59, "input", 44);
131
137
  i0.ɵɵtwoWayListener("ngModelChange", function ModelManagementV2Component_Conditional_2_Conditional_21_Template_input_ngModelChange_59_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r0.powerRankRange.min, $event) || (ctx_r0.powerRankRange.min = $event); return i0.ɵɵresetView($event); });
132
138
  i0.ɵɵlistener("change", function ModelManagementV2Component_Conditional_2_Conditional_21_Template_input_change_59_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.validateAndApplyRankFilters("power")); });
133
139
  i0.ɵɵelementEnd();
134
- i0.ɵɵelementStart(60, "span", 48);
140
+ i0.ɵɵelementStart(60, "span", 45);
135
141
  i0.ɵɵtext(61, "-");
136
142
  i0.ɵɵelementEnd();
137
- i0.ɵɵelementStart(62, "input", 49);
143
+ i0.ɵɵelementStart(62, "input", 46);
138
144
  i0.ɵɵtwoWayListener("ngModelChange", function ModelManagementV2Component_Conditional_2_Conditional_21_Template_input_ngModelChange_62_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r0.powerRankRange.max, $event) || (ctx_r0.powerRankRange.max = $event); return i0.ɵɵresetView($event); });
139
145
  i0.ɵɵlistener("change", function ModelManagementV2Component_Conditional_2_Conditional_21_Template_input_change_62_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.validateAndApplyRankFilters("power")); });
140
146
  i0.ɵɵelementEnd()()();
141
- i0.ɵɵelementStart(63, "div", 50)(64, "button", 51);
147
+ i0.ɵɵelementStart(63, "div", 47)(64, "button", 48);
142
148
  i0.ɵɵlistener("click", function ModelManagementV2Component_Conditional_2_Conditional_21_Template_button_click_64_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.clearFilters()); });
143
- i0.ɵɵelement(65, "span", 52);
149
+ i0.ɵɵelement(65, "span", 49);
144
150
  i0.ɵɵtext(66, " Reset Filters ");
145
151
  i0.ɵɵelementEnd()()()()();
146
152
  } if (rf & 2) {
@@ -174,22 +180,22 @@ function ModelManagementV2Component_Conditional_2_Conditional_21_Template(rf, ct
174
180
  } }
175
181
  function ModelManagementV2Component_Conditional_2_Conditional_24_Conditional_6_Template(rf, ctx) { if (rf & 1) {
176
182
  const _r7 = i0.ɵɵgetCurrentView();
177
- i0.ɵɵelementStart(0, "button", 55);
183
+ i0.ɵɵelementStart(0, "button", 52);
178
184
  i0.ɵɵlistener("click", function ModelManagementV2Component_Conditional_2_Conditional_24_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.createNewModel()); });
179
- i0.ɵɵelement(1, "i", 20);
185
+ i0.ɵɵelement(1, "i", 17);
180
186
  i0.ɵɵtext(2, " Create First Model ");
181
187
  i0.ɵɵelementEnd();
182
188
  } }
183
189
  function ModelManagementV2Component_Conditional_2_Conditional_24_Template(rf, ctx) { if (rf & 1) {
184
- i0.ɵɵelementStart(0, "div", 24);
185
- i0.ɵɵelement(1, "i", 53);
190
+ i0.ɵɵelementStart(0, "div", 21);
191
+ i0.ɵɵelement(1, "i", 50);
186
192
  i0.ɵɵelementStart(2, "h3");
187
193
  i0.ɵɵtext(3, "No models found");
188
194
  i0.ɵɵelementEnd();
189
195
  i0.ɵɵelementStart(4, "p");
190
196
  i0.ɵɵtext(5);
191
197
  i0.ɵɵelementEnd();
192
- i0.ɵɵtemplate(6, ModelManagementV2Component_Conditional_2_Conditional_24_Conditional_6_Template, 3, 0, "button", 54);
198
+ i0.ɵɵtemplate(6, ModelManagementV2Component_Conditional_2_Conditional_24_Conditional_6_Template, 3, 0, "button", 51);
193
199
  i0.ɵɵelementEnd();
194
200
  } if (rf & 2) {
195
201
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -198,188 +204,173 @@ function ModelManagementV2Component_Conditional_2_Conditional_24_Template(rf, ct
198
204
  i0.ɵɵadvance();
199
205
  i0.ɵɵconditional(!ctx_r0.hasActiveFilters ? 6 : -1);
200
206
  } }
201
- function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
202
- i0.ɵɵelementStart(0, "span", 64);
203
- i0.ɵɵtext(1);
207
+ function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
208
+ i0.ɵɵelementStart(0, "span", 63);
209
+ i0.ɵɵelement(1, "i", 37);
210
+ i0.ɵɵtext(2);
204
211
  i0.ɵɵelementEnd();
205
212
  } if (rf & 2) {
206
213
  const model_r9 = i0.ɵɵnextContext().$implicit;
207
- i0.ɵɵadvance();
208
- i0.ɵɵtextInterpolate(model_r9.Vendor);
214
+ i0.ɵɵadvance(2);
215
+ i0.ɵɵtextInterpolate1(" ", model_r9.Vendor, " ");
216
+ } }
217
+ function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
218
+ i0.ɵɵelementStart(0, "span", 63);
219
+ i0.ɵɵelement(1, "i", 6);
220
+ i0.ɵɵtext(2);
221
+ i0.ɵɵelementEnd();
222
+ } if (rf & 2) {
223
+ const model_r9 = i0.ɵɵnextContext().$implicit;
224
+ i0.ɵɵadvance(2);
225
+ i0.ɵɵtextInterpolate1(" ", model_r9.AIModelType, " ");
209
226
  } }
210
227
  function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
211
- i0.ɵɵelementStart(0, "span", 66);
212
- i0.ɵɵtext(1, "Active");
228
+ i0.ɵɵelementStart(0, "span", 64);
229
+ i0.ɵɵelement(1, "i", 74);
230
+ i0.ɵɵtext(2, " Active ");
213
231
  i0.ɵɵelementEnd();
214
232
  } }
215
233
  function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
216
- i0.ɵɵelementStart(0, "span", 67);
217
- i0.ɵɵtext(1, "Inactive");
234
+ i0.ɵɵelementStart(0, "span", 65);
235
+ i0.ɵɵelement(1, "i", 74);
236
+ i0.ɵɵtext(2, " Inactive ");
218
237
  i0.ɵɵelementEnd();
219
238
  } }
220
- function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_23_Template(rf, ctx) { if (rf & 1) {
221
- i0.ɵɵelementStart(0, "span", 74);
222
- i0.ɵɵelement(1, "i", 77);
223
- i0.ɵɵtext(2);
239
+ function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_15_Template(rf, ctx) { if (rf & 1) {
240
+ i0.ɵɵelementStart(0, "p", 68);
241
+ i0.ɵɵtext(1);
224
242
  i0.ɵɵelementEnd();
225
243
  } if (rf & 2) {
226
244
  const model_r9 = i0.ɵɵnextContext().$implicit;
227
- const ctx_r0 = i0.ɵɵnextContext(4);
228
- i0.ɵɵadvance(2);
229
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatTokenLimit(model_r9.InputTokenLimit), " ");
245
+ i0.ɵɵadvance();
246
+ i0.ɵɵtextInterpolate(model_r9.Description);
247
+ } }
248
+ function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
249
+ i0.ɵɵelementStart(0, "p", 69);
250
+ i0.ɵɵtext(1, "No description provided");
251
+ i0.ɵɵelementEnd();
230
252
  } }
231
- function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_25_Conditional_1_Template(rf, ctx) { if (rf & 1) {
232
- i0.ɵɵelementStart(0, "div", 78)(1, "h5");
233
- i0.ɵɵtext(2, "Description");
253
+ function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_17_Template(rf, ctx) { if (rf & 1) {
254
+ i0.ɵɵelementStart(0, "div", 76)(1, "span", 77);
255
+ i0.ɵɵtext(2, "Token Limit");
234
256
  i0.ɵɵelementEnd();
235
- i0.ɵɵelementStart(3, "p");
257
+ i0.ɵɵelementStart(3, "span", 78);
236
258
  i0.ɵɵtext(4);
237
259
  i0.ɵɵelementEnd()();
238
260
  } if (rf & 2) {
239
261
  const model_r9 = i0.ɵɵnextContext(2).$implicit;
262
+ const ctx_r0 = i0.ɵɵnextContext(4);
240
263
  i0.ɵɵadvance(4);
241
- i0.ɵɵtextInterpolate(model_r9.Description);
264
+ i0.ɵɵtextInterpolate(ctx_r0.formatTokenLimit(model_r9.InputTokenLimit));
242
265
  } }
243
- function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_25_Template(rf, ctx) { if (rf & 1) {
244
- const _r10 = i0.ɵɵgetCurrentView();
245
- i0.ɵɵelementStart(0, "div", 76);
246
- i0.ɵɵtemplate(1, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_25_Conditional_1_Template, 5, 1, "div", 78);
247
- i0.ɵɵelementStart(2, "div", 79)(3, "h5");
248
- i0.ɵɵtext(4, "Performance Rankings");
266
+ function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_18_Template(rf, ctx) { if (rf & 1) {
267
+ i0.ɵɵelementStart(0, "div", 76)(1, "span", 77);
268
+ i0.ɵɵtext(2, "API Name");
249
269
  i0.ɵɵelementEnd();
250
- i0.ɵɵelementStart(5, "div", 80)(6, "div", 81)(7, "span", 82);
251
- i0.ɵɵelement(8, "i", 45);
252
- i0.ɵɵtext(9, " Power ");
253
- i0.ɵɵelementEnd();
254
- i0.ɵɵelementStart(10, "span", 83);
255
- i0.ɵɵtext(11);
270
+ i0.ɵɵelementStart(3, "span", 78);
271
+ i0.ɵɵtext(4);
256
272
  i0.ɵɵelementEnd()();
257
- i0.ɵɵelementStart(12, "div", 81)(13, "span", 82);
258
- i0.ɵɵelement(14, "i", 71);
259
- i0.ɵɵtext(15, " Speed ");
273
+ } if (rf & 2) {
274
+ const model_r9 = i0.ɵɵnextContext(2).$implicit;
275
+ i0.ɵɵadvance(4);
276
+ i0.ɵɵtextInterpolate(model_r9.APIName);
277
+ } }
278
+ function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_19_Template(rf, ctx) { if (rf & 1) {
279
+ i0.ɵɵelementStart(0, "div", 76)(1, "span", 77);
280
+ i0.ɵɵtext(2, "Driver");
260
281
  i0.ɵɵelementEnd();
261
- i0.ɵɵelementStart(16, "span", 83);
262
- i0.ɵɵtext(17);
282
+ i0.ɵɵelementStart(3, "span", 78);
283
+ i0.ɵɵtext(4);
263
284
  i0.ɵɵelementEnd()();
264
- i0.ɵɵelementStart(18, "div", 81)(19, "span", 82);
265
- i0.ɵɵelement(20, "i", 73);
266
- i0.ɵɵtext(21, " Cost ");
267
- i0.ɵɵelementEnd();
268
- i0.ɵɵelementStart(22, "span", 83);
269
- i0.ɵɵtext(23);
270
- i0.ɵɵelementEnd()()()();
271
- i0.ɵɵelementStart(24, "div", 84)(25, "div", 85)(26, "span", 86);
272
- i0.ɵɵtext(27, "Status");
285
+ } if (rf & 2) {
286
+ const model_r9 = i0.ɵɵnextContext(2).$implicit;
287
+ i0.ɵɵadvance(4);
288
+ i0.ɵɵtextInterpolate(model_r9.DriverClass);
289
+ } }
290
+ function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
291
+ i0.ɵɵelementStart(0, "div", 70)(1, "div", 75)(2, "div", 76)(3, "span", 77);
292
+ i0.ɵɵtext(4, "Power Rank");
273
293
  i0.ɵɵelementEnd();
274
- i0.ɵɵelementStart(28, "span", 87);
275
- i0.ɵɵtext(29);
294
+ i0.ɵɵelementStart(5, "span", 78);
295
+ i0.ɵɵtext(6);
276
296
  i0.ɵɵelementEnd()();
277
- i0.ɵɵelementStart(30, "div", 85)(31, "span", 86);
278
- i0.ɵɵtext(32, "API Name");
297
+ i0.ɵɵelementStart(7, "div", 76)(8, "span", 77);
298
+ i0.ɵɵtext(9, "Speed Rank");
279
299
  i0.ɵɵelementEnd();
280
- i0.ɵɵelementStart(33, "span", 87);
281
- i0.ɵɵtext(34);
300
+ i0.ɵɵelementStart(10, "span", 78);
301
+ i0.ɵɵtext(11);
282
302
  i0.ɵɵelementEnd()();
283
- i0.ɵɵelementStart(35, "div", 85)(36, "span", 86);
284
- i0.ɵɵtext(37, "Driver");
303
+ i0.ɵɵelementStart(12, "div", 76)(13, "span", 77);
304
+ i0.ɵɵtext(14, "Cost Rank");
285
305
  i0.ɵɵelementEnd();
286
- i0.ɵɵelementStart(38, "span", 87);
287
- i0.ɵɵtext(39);
288
- i0.ɵɵelementEnd()()();
289
- i0.ɵɵelementStart(40, "div", 88)(41, "button", 89);
290
- i0.ɵɵlistener("click", function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_25_Template_button_click_41_listener($event) { i0.ɵɵrestoreView(_r10); const model_r9 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(4); ctx_r0.openModel(model_r9.ID); return i0.ɵɵresetView($event.stopPropagation()); });
291
- i0.ɵɵelement(42, "i", 90);
292
- i0.ɵɵtext(43, " Edit ");
293
- i0.ɵɵelementEnd()()();
306
+ i0.ɵɵelementStart(15, "span", 78);
307
+ i0.ɵɵtext(16);
308
+ i0.ɵɵelementEnd()();
309
+ i0.ɵɵtemplate(17, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_17_Template, 5, 1, "div", 76)(18, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_18_Template, 5, 1, "div", 76)(19, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_19_Template, 5, 1, "div", 76);
310
+ i0.ɵɵelementEnd()();
294
311
  } if (rf & 2) {
295
312
  const model_r9 = i0.ɵɵnextContext().$implicit;
296
313
  const ctx_r0 = i0.ɵɵnextContext(4);
297
- i0.ɵɵadvance();
298
- i0.ɵɵconditional(model_r9.Description ? 1 : -1);
299
- i0.ɵɵadvance(9);
300
- i0.ɵɵclassMap(ctx_r0.getRankClass(model_r9.PowerRank, "power"));
301
- i0.ɵɵadvance();
302
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r9.PowerRank, "power"), " ");
303
- i0.ɵɵadvance(5);
304
- i0.ɵɵclassMap(ctx_r0.getRankClass(model_r9.SpeedRank, "speed"));
305
- i0.ɵɵadvance();
306
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r9.SpeedRank, "speed"), " ");
307
- i0.ɵɵadvance(5);
308
- i0.ɵɵclassMap(ctx_r0.getRankClass(model_r9.CostRank, "cost"));
309
- i0.ɵɵadvance();
310
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r9.CostRank, "cost"), " ");
311
314
  i0.ɵɵadvance(6);
312
- i0.ɵɵtextInterpolate(model_r9.IsActive ? "Active" : "Inactive");
315
+ i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r9.PowerRank, "power"));
313
316
  i0.ɵɵadvance(5);
314
- i0.ɵɵtextInterpolate(model_r9.APIName || "N/A");
317
+ i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r9.SpeedRank, "speed"));
315
318
  i0.ɵɵadvance(5);
316
- i0.ɵɵtextInterpolate(model_r9.DriverClass || "N/A");
319
+ i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r9.CostRank, "cost"));
320
+ i0.ɵɵadvance();
321
+ i0.ɵɵconditional(model_r9.InputTokenLimit ? 17 : -1);
322
+ i0.ɵɵadvance();
323
+ i0.ɵɵconditional(model_r9.APIName ? 18 : -1);
324
+ i0.ɵɵadvance();
325
+ i0.ɵɵconditional(model_r9.DriverClass ? 19 : -1);
317
326
  } }
318
327
  function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Template(rf, ctx) { if (rf & 1) {
319
328
  const _r8 = i0.ɵɵgetCurrentView();
320
- i0.ɵɵelementStart(0, "div", 59)(1, "div", 60);
329
+ i0.ɵɵelementStart(0, "div", 56)(1, "div", 57);
321
330
  i0.ɵɵlistener("click", function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Template_div_click_1_listener() { const model_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.toggleModelExpansion(model_r9.ID)); });
322
- i0.ɵɵelementStart(2, "div", 61);
323
- i0.ɵɵelement(3, "i");
331
+ i0.ɵɵelementStart(2, "div", 58)(3, "div", 59);
332
+ i0.ɵɵelement(4, "i");
324
333
  i0.ɵɵelementEnd();
325
- i0.ɵɵelementStart(4, "div", 62)(5, "h4");
326
- i0.ɵɵtext(6);
327
- i0.ɵɵelementEnd();
328
- i0.ɵɵelementStart(7, "div", 63);
329
- i0.ɵɵtemplate(8, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_8_Template, 2, 1, "span", 64);
330
- i0.ɵɵelementStart(9, "span", 65);
331
- i0.ɵɵtext(10);
332
- i0.ɵɵelementEnd();
333
- i0.ɵɵtemplate(11, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_11_Template, 2, 0, "span", 66)(12, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_12_Template, 2, 0, "span", 67);
334
- i0.ɵɵelementEnd();
335
- i0.ɵɵelementStart(13, "div", 68)(14, "span", 69);
336
- i0.ɵɵelement(15, "i", 45);
337
- i0.ɵɵtext(16);
338
- i0.ɵɵelementEnd();
339
- i0.ɵɵelementStart(17, "span", 70);
340
- i0.ɵɵelement(18, "i", 71);
341
- i0.ɵɵtext(19);
342
- i0.ɵɵelementEnd();
343
- i0.ɵɵelementStart(20, "span", 72);
344
- i0.ɵɵelement(21, "i", 73);
345
- i0.ɵɵtext(22);
334
+ i0.ɵɵelementStart(5, "div", 60)(6, "h4", 61);
335
+ i0.ɵɵtext(7);
346
336
  i0.ɵɵelementEnd();
347
- i0.ɵɵtemplate(23, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_23_Template, 3, 1, "span", 74);
348
- i0.ɵɵelementEnd()();
349
- i0.ɵɵelement(24, "i", 75);
337
+ i0.ɵɵelementStart(8, "div", 62);
338
+ i0.ɵɵtemplate(9, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Template, 3, 1, "span", 63)(10, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_10_Template, 3, 1, "span", 63)(11, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_11_Template, 3, 0, "span", 64)(12, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_12_Template, 3, 0, "span", 65);
339
+ i0.ɵɵelementEnd()()();
340
+ i0.ɵɵelement(13, "i", 66);
350
341
  i0.ɵɵelementEnd();
351
- i0.ɵɵtemplate(25, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_25_Template, 44, 13, "div", 76);
342
+ i0.ɵɵelementStart(14, "div", 67);
343
+ i0.ɵɵtemplate(15, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_15_Template, 2, 1, "p", 68)(16, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_16_Template, 2, 0, "p", 69)(17, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Template, 20, 6, "div", 70);
352
344
  i0.ɵɵelementEnd();
345
+ i0.ɵɵelementStart(18, "div", 71)(19, "button", 72);
346
+ i0.ɵɵlistener("click", function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Template_button_click_19_listener($event) { const model_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); ctx_r0.openModel(model_r9.ID); return i0.ɵɵresetView($event.stopPropagation()); });
347
+ i0.ɵɵelement(20, "i", 73);
348
+ i0.ɵɵtext(21, " Open ");
349
+ i0.ɵɵelementEnd()()();
353
350
  } if (rf & 2) {
354
351
  const model_r9 = ctx.$implicit;
355
352
  const ctx_r0 = i0.ɵɵnextContext(4);
356
353
  i0.ɵɵclassProp("expanded", ctx_r0.expandedModelId === model_r9.ID);
357
- i0.ɵɵadvance(3);
354
+ i0.ɵɵadvance(4);
358
355
  i0.ɵɵclassMap(ctx_r0.getModelIcon(model_r9));
359
356
  i0.ɵɵadvance(3);
360
357
  i0.ɵɵtextInterpolate(model_r9.Name || "Unnamed Model");
361
358
  i0.ɵɵadvance(2);
362
- i0.ɵɵconditional(model_r9.Vendor ? 8 : -1);
363
- i0.ɵɵadvance(2);
364
- i0.ɵɵtextInterpolate(model_r9.AIModelType);
365
- i0.ɵɵadvance();
366
- i0.ɵɵconditional(model_r9.IsActive ? 11 : 12);
367
- i0.ɵɵadvance(5);
368
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r9.PowerRank, "power"), " ");
369
- i0.ɵɵadvance(3);
370
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r9.SpeedRank, "speed"), " ");
371
- i0.ɵɵadvance(3);
372
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r9.CostRank, "cost"), " ");
359
+ i0.ɵɵconditional(model_r9.Vendor ? 9 : -1);
373
360
  i0.ɵɵadvance();
374
- i0.ɵɵconditional(model_r9.InputTokenLimit ? 23 : -1);
361
+ i0.ɵɵconditional(model_r9.AIModelType ? 10 : -1);
375
362
  i0.ɵɵadvance();
363
+ i0.ɵɵconditional(model_r9.IsActive ? 11 : 12);
364
+ i0.ɵɵadvance(2);
376
365
  i0.ɵɵclassProp("rotated", ctx_r0.expandedModelId === model_r9.ID);
377
- i0.ɵɵadvance();
378
- i0.ɵɵconditional(ctx_r0.expandedModelId === model_r9.ID ? 25 : -1);
366
+ i0.ɵɵadvance(2);
367
+ i0.ɵɵconditional(model_r9.Description ? 15 : 16);
368
+ i0.ɵɵadvance(2);
369
+ i0.ɵɵconditional(ctx_r0.expandedModelId === model_r9.ID ? 17 : -1);
379
370
  } }
380
371
  function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_Template(rf, ctx) { if (rf & 1) {
381
- i0.ɵɵelementStart(0, "div", 56);
382
- i0.ɵɵrepeaterCreate(1, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Template, 26, 15, "div", 58, _forTrack1);
372
+ i0.ɵɵelementStart(0, "div", 53);
373
+ i0.ɵɵrepeaterCreate(1, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_For_2_Template, 22, 12, "div", 55, _forTrack1);
383
374
  i0.ɵɵelementEnd();
384
375
  } if (rf & 2) {
385
376
  const ctx_r0 = i0.ɵɵnextContext(3);
@@ -387,8 +378,8 @@ function ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_Template
387
378
  i0.ɵɵrepeater(ctx_r0.filteredModels);
388
379
  } }
389
380
  function ModelManagementV2Component_Conditional_2_Conditional_25_Case_1_For_22_Template(rf, ctx) { if (rf & 1) {
390
- const _r11 = i0.ɵɵgetCurrentView();
391
- i0.ɵɵelementStart(0, "tr")(1, "td")(2, "div", 92);
381
+ const _r10 = i0.ɵɵgetCurrentView();
382
+ i0.ɵɵelementStart(0, "tr")(1, "td")(2, "div", 80);
392
383
  i0.ɵɵelement(3, "i");
393
384
  i0.ɵɵtext(4);
394
385
  i0.ɵɵelementEnd()();
@@ -398,52 +389,52 @@ function ModelManagementV2Component_Conditional_2_Conditional_25_Case_1_For_22_T
398
389
  i0.ɵɵelementStart(7, "td");
399
390
  i0.ɵɵtext(8);
400
391
  i0.ɵɵelementEnd();
401
- i0.ɵɵelementStart(9, "td")(10, "span", 93);
392
+ i0.ɵɵelementStart(9, "td")(10, "span", 81);
402
393
  i0.ɵɵtext(11);
403
394
  i0.ɵɵelementEnd()();
404
- i0.ɵɵelementStart(12, "td")(13, "span", 93);
395
+ i0.ɵɵelementStart(12, "td")(13, "span", 81);
405
396
  i0.ɵɵtext(14);
406
397
  i0.ɵɵelementEnd()();
407
- i0.ɵɵelementStart(15, "td")(16, "span", 93);
398
+ i0.ɵɵelementStart(15, "td")(16, "span", 81);
408
399
  i0.ɵɵtext(17);
409
400
  i0.ɵɵelementEnd()();
410
- i0.ɵɵelementStart(18, "td")(19, "span", 94);
401
+ i0.ɵɵelementStart(18, "td")(19, "span", 82);
411
402
  i0.ɵɵtext(20);
412
403
  i0.ɵɵelementEnd()();
413
- i0.ɵɵelementStart(21, "td")(22, "button", 95);
414
- i0.ɵɵlistener("click", function ModelManagementV2Component_Conditional_2_Conditional_25_Case_1_For_22_Template_button_click_22_listener() { const model_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.openModel(model_r12.ID)); });
415
- i0.ɵɵelement(23, "i", 90);
404
+ i0.ɵɵelementStart(21, "td")(22, "button", 83);
405
+ i0.ɵɵlistener("click", function ModelManagementV2Component_Conditional_2_Conditional_25_Case_1_For_22_Template_button_click_22_listener() { const model_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.openModel(model_r11.ID)); });
406
+ i0.ɵɵelement(23, "i", 84);
416
407
  i0.ɵɵelementEnd()()();
417
408
  } if (rf & 2) {
418
- const model_r12 = ctx.$implicit;
409
+ const model_r11 = ctx.$implicit;
419
410
  const ctx_r0 = i0.ɵɵnextContext(4);
420
411
  i0.ɵɵadvance(3);
421
- i0.ɵɵclassMap(ctx_r0.getModelIcon(model_r12));
412
+ i0.ɵɵclassMap(ctx_r0.getModelIcon(model_r11));
422
413
  i0.ɵɵadvance();
423
- i0.ɵɵtextInterpolate1(" ", model_r12.Name || "Unnamed Model", " ");
414
+ i0.ɵɵtextInterpolate1(" ", model_r11.Name || "Unnamed Model", " ");
424
415
  i0.ɵɵadvance(2);
425
- i0.ɵɵtextInterpolate(model_r12.Vendor || "-");
416
+ i0.ɵɵtextInterpolate(model_r11.Vendor || "-");
426
417
  i0.ɵɵadvance(2);
427
- i0.ɵɵtextInterpolate(model_r12.AIModelType);
418
+ i0.ɵɵtextInterpolate(model_r11.AIModelType);
428
419
  i0.ɵɵadvance(2);
429
- i0.ɵɵclassMap(ctx_r0.getRankClass(model_r12.PowerRank, "power"));
420
+ i0.ɵɵclassMap(ctx_r0.getRankClass(model_r11.PowerRank, "power"));
430
421
  i0.ɵɵadvance();
431
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r12.PowerRank, "power"), " ");
422
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r11.PowerRank, "power"), " ");
432
423
  i0.ɵɵadvance(2);
433
- i0.ɵɵclassMap(ctx_r0.getRankClass(model_r12.SpeedRank, "speed"));
424
+ i0.ɵɵclassMap(ctx_r0.getRankClass(model_r11.SpeedRank, "speed"));
434
425
  i0.ɵɵadvance();
435
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r12.SpeedRank, "speed"), " ");
426
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r11.SpeedRank, "speed"), " ");
436
427
  i0.ɵɵadvance(2);
437
- i0.ɵɵclassMap(ctx_r0.getRankClass(model_r12.CostRank, "cost"));
428
+ i0.ɵɵclassMap(ctx_r0.getRankClass(model_r11.CostRank, "cost"));
438
429
  i0.ɵɵadvance();
439
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r12.CostRank, "cost"), " ");
430
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r11.CostRank, "cost"), " ");
440
431
  i0.ɵɵadvance(2);
441
- i0.ɵɵclassProp("active", model_r12.IsActive)("inactive", !model_r12.IsActive);
432
+ i0.ɵɵclassProp("active", model_r11.IsActive)("inactive", !model_r11.IsActive);
442
433
  i0.ɵɵadvance();
443
- i0.ɵɵtextInterpolate1(" ", model_r12.IsActive ? "Active" : "Inactive", " ");
434
+ i0.ɵɵtextInterpolate1(" ", model_r11.IsActive ? "Active" : "Inactive", " ");
444
435
  } }
445
436
  function ModelManagementV2Component_Conditional_2_Conditional_25_Case_1_Template(rf, ctx) { if (rf & 1) {
446
- i0.ɵɵelementStart(0, "div", 57)(1, "table", 91)(2, "thead")(3, "tr")(4, "th");
437
+ i0.ɵɵelementStart(0, "div", 54)(1, "table", 79)(2, "thead")(3, "tr")(4, "th");
447
438
  i0.ɵɵtext(5, "Name");
448
439
  i0.ɵɵelementEnd();
449
440
  i0.ɵɵelementStart(6, "th");
@@ -476,7 +467,7 @@ function ModelManagementV2Component_Conditional_2_Conditional_25_Case_1_Template
476
467
  i0.ɵɵrepeater(ctx_r0.filteredModels);
477
468
  } }
478
469
  function ModelManagementV2Component_Conditional_2_Conditional_25_Template(rf, ctx) { if (rf & 1) {
479
- i0.ɵɵtemplate(0, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_Template, 3, 0, "div", 56)(1, ModelManagementV2Component_Conditional_2_Conditional_25_Case_1_Template, 23, 0, "div", 57);
470
+ i0.ɵɵtemplate(0, ModelManagementV2Component_Conditional_2_Conditional_25_Case_0_Template, 3, 0, "div", 53)(1, ModelManagementV2Component_Conditional_2_Conditional_25_Case_1_Template, 23, 0, "div", 54);
480
471
  } if (rf & 2) {
481
472
  let tmp_2_0;
482
473
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -484,35 +475,35 @@ function ModelManagementV2Component_Conditional_2_Conditional_25_Template(rf, ct
484
475
  } }
485
476
  function ModelManagementV2Component_Conditional_2_Template(rf, ctx) { if (rf & 1) {
486
477
  const _r2 = i0.ɵɵgetCurrentView();
487
- i0.ɵɵelementStart(0, "div", 6)(1, "div", 7)(2, "h2", 8);
488
- i0.ɵɵelement(3, "i", 9);
478
+ i0.ɵɵelementStart(0, "div", 3)(1, "div", 4)(2, "h2", 5);
479
+ i0.ɵɵelement(3, "i", 6);
489
480
  i0.ɵɵtext(4, " AI Models ");
490
481
  i0.ɵɵelementEnd();
491
- i0.ɵɵelementStart(5, "button", 10);
482
+ i0.ɵɵelementStart(5, "button", 7);
492
483
  i0.ɵɵlistener("click", function ModelManagementV2Component_Conditional_2_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleFilters()); });
493
- i0.ɵɵelement(6, "i", 11);
484
+ i0.ɵɵelement(6, "i", 8);
494
485
  i0.ɵɵtemplate(7, ModelManagementV2Component_Conditional_2_Conditional_7_Template, 1, 0)(8, ModelManagementV2Component_Conditional_2_Conditional_8_Template, 1, 0);
495
486
  i0.ɵɵelementEnd();
496
- i0.ɵɵelementStart(9, "span", 12);
487
+ i0.ɵɵelementStart(9, "span", 9);
497
488
  i0.ɵɵtext(10);
498
489
  i0.ɵɵelementEnd()();
499
- i0.ɵɵelementStart(11, "div", 13)(12, "div", 14)(13, "button", 15);
490
+ i0.ɵɵelementStart(11, "div", 10)(12, "div", 11)(13, "button", 12);
500
491
  i0.ɵɵlistener("click", function ModelManagementV2Component_Conditional_2_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setViewMode("grid")); });
501
- i0.ɵɵelement(14, "i", 16);
492
+ i0.ɵɵelement(14, "i", 13);
502
493
  i0.ɵɵelementEnd();
503
- i0.ɵɵelementStart(15, "button", 17);
494
+ i0.ɵɵelementStart(15, "button", 14);
504
495
  i0.ɵɵlistener("click", function ModelManagementV2Component_Conditional_2_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setViewMode("list")); });
505
- i0.ɵɵelement(16, "i", 18);
496
+ i0.ɵɵelement(16, "i", 15);
506
497
  i0.ɵɵelementEnd()();
507
- i0.ɵɵelementStart(17, "button", 19);
498
+ i0.ɵɵelementStart(17, "button", 16);
508
499
  i0.ɵɵlistener("click", function ModelManagementV2Component_Conditional_2_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.createNewModel()); });
509
- i0.ɵɵelement(18, "i", 20);
500
+ i0.ɵɵelement(18, "i", 17);
510
501
  i0.ɵɵtext(19, " New Model ");
511
502
  i0.ɵɵelementEnd()()();
512
- i0.ɵɵelementStart(20, "kendo-splitter", 21);
513
- i0.ɵɵtemplate(21, ModelManagementV2Component_Conditional_2_Conditional_21_Template, 67, 11, "kendo-splitter-pane", 22);
514
- i0.ɵɵelementStart(22, "kendo-splitter-pane")(23, "div", 23);
515
- i0.ɵɵtemplate(24, ModelManagementV2Component_Conditional_2_Conditional_24_Template, 7, 2, "div", 24)(25, ModelManagementV2Component_Conditional_2_Conditional_25_Template, 2, 1);
503
+ i0.ɵɵelementStart(20, "kendo-splitter", 18);
504
+ i0.ɵɵtemplate(21, ModelManagementV2Component_Conditional_2_Conditional_21_Template, 67, 11, "kendo-splitter-pane", 19);
505
+ i0.ɵɵelementStart(22, "kendo-splitter-pane")(23, "div", 20);
506
+ i0.ɵɵtemplate(24, ModelManagementV2Component_Conditional_2_Conditional_24_Template, 7, 2, "div", 21)(25, ModelManagementV2Component_Conditional_2_Conditional_25_Template, 2, 1);
516
507
  i0.ɵɵelementEnd()()();
517
508
  } if (rf & 2) {
518
509
  const ctx_r0 = i0.ɵɵnextContext();
@@ -529,11 +520,19 @@ function ModelManagementV2Component_Conditional_2_Template(rf, ctx) { if (rf & 1
529
520
  i0.ɵɵadvance(3);
530
521
  i0.ɵɵconditional(ctx_r0.filteredModels.length === 0 ? 24 : 25);
531
522
  } }
532
- export class ModelManagementV2Component {
523
+ /**
524
+ * Tree-shaking prevention function - ensures component is included in builds
525
+ */
526
+ export function LoadAIModelsResource() {
527
+ // Force inclusion in production builds
528
+ }
529
+ /**
530
+ * AI Models Resource - displays AI model management
531
+ * Extends BaseResourceComponent to work with the resource type system
532
+ */
533
+ let ModelManagementV2Component = class ModelManagementV2Component extends BaseResourceComponent {
533
534
  sharedService;
534
- openEntityRecord = new EventEmitter();
535
- stateChange = new EventEmitter();
536
- initialState = null;
535
+ navigationService;
537
536
  // View state
538
537
  viewMode = 'grid';
539
538
  isLoading = true;
@@ -580,15 +579,17 @@ export class ModelManagementV2Component {
580
579
  loadingMessageIndex = 0;
581
580
  loadingMessageInterval;
582
581
  destroy$ = new Subject();
583
- constructor(sharedService) {
582
+ constructor(sharedService, navigationService) {
583
+ super();
584
584
  this.sharedService = sharedService;
585
+ this.navigationService = navigationService;
585
586
  }
586
587
  ngOnInit() {
587
588
  this.setupSearchListener();
588
589
  this.startLoadingMessages();
589
590
  this.loadInitialData();
590
- if (this.initialState) {
591
- this.applyInitialState(this.initialState);
591
+ if (this.Data?.Configuration) {
592
+ this.applyInitialState(this.Data.Configuration);
592
593
  }
593
594
  }
594
595
  ngOnDestroy() {
@@ -666,7 +667,6 @@ export class ModelManagementV2Component {
666
667
  this.filteredModels = [...this.models];
667
668
  this.sortModels();
668
669
  this.applyFilters();
669
- this.emitStateChange();
670
670
  }
671
671
  catch (error) {
672
672
  console.error('Error loading model data:', error);
@@ -677,6 +677,7 @@ export class ModelManagementV2Component {
677
677
  if (this.loadingMessageInterval) {
678
678
  clearInterval(this.loadingMessageInterval);
679
679
  }
680
+ this.NotifyLoadComplete();
680
681
  }
681
682
  }
682
683
  formatRank(rank, rankType) {
@@ -722,16 +723,13 @@ export class ModelManagementV2Component {
722
723
  }
723
724
  toggleFilters() {
724
725
  this.showFilters = !this.showFilters;
725
- this.emitStateChange();
726
726
  }
727
727
  toggleFilterPanel() {
728
728
  this.showFilters = !this.showFilters;
729
- this.emitStateChange();
730
729
  }
731
730
  setViewMode(mode) {
732
731
  this.viewMode = mode;
733
732
  this.expandedModelId = null;
734
- this.emitStateChange();
735
733
  }
736
734
  toggleModelExpansion(modelId) {
737
735
  this.expandedModelId = this.expandedModelId === modelId ? null : modelId;
@@ -778,7 +776,6 @@ export class ModelManagementV2Component {
778
776
  return true;
779
777
  });
780
778
  this.sortModels();
781
- this.emitStateChange();
782
779
  }
783
780
  sortModels() {
784
781
  this.filteredModels.sort((a, b) => {
@@ -821,7 +818,6 @@ export class ModelManagementV2Component {
821
818
  onSortChange(sortBy) {
822
819
  this.sortBy = sortBy;
823
820
  this.sortModels();
824
- this.emitStateChange();
825
821
  }
826
822
  async toggleModelStatus(model, event) {
827
823
  event.stopPropagation();
@@ -842,10 +838,8 @@ export class ModelManagementV2Component {
842
838
  }
843
839
  }
844
840
  openModel(modelId) {
845
- this.openEntityRecord.emit({
846
- entityName: 'AI Models',
847
- recordId: modelId
848
- });
841
+ const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: modelId }]);
842
+ this.navigationService.OpenEntityRecord('AI Models', compositeKey);
849
843
  }
850
844
  async createNewModel() {
851
845
  try {
@@ -855,10 +849,8 @@ export class ModelManagementV2Component {
855
849
  newModel.Name = 'New AI Model';
856
850
  newModel.IsActive = true;
857
851
  if (await newModel.Save()) {
858
- this.openEntityRecord.emit({
859
- entityName: 'AI Models',
860
- recordId: newModel.ID
861
- });
852
+ const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: newModel.ID }]);
853
+ this.navigationService.OpenEntityRecord('AI Models', compositeKey);
862
854
  // Reload the data
863
855
  await this.loadInitialData();
864
856
  }
@@ -907,21 +899,6 @@ export class ModelManagementV2Component {
907
899
  return 'rank-medium';
908
900
  return 'rank-low';
909
901
  }
910
- emitStateChange() {
911
- this.stateChange.emit({
912
- viewMode: this.viewMode,
913
- showFilters: this.showFilters,
914
- searchTerm: this.searchTerm,
915
- selectedVendor: this.selectedVendor,
916
- selectedType: this.selectedType,
917
- selectedStatus: this.selectedStatus,
918
- sortBy: this.sortBy,
919
- powerRankRange: this.powerRankRange,
920
- speedRankRange: this.speedRankRange,
921
- costRankRange: this.costRankRange,
922
- modelCount: this.filteredModels.length
923
- });
924
- }
925
902
  get hasActiveFilters() {
926
903
  return this.searchTerm !== '' ||
927
904
  this.selectedVendor !== 'all' ||
@@ -975,25 +952,30 @@ export class ModelManagementV2Component {
975
952
  // Apply the filters
976
953
  this.applyFilters();
977
954
  }
978
- static ɵfac = function ModelManagementV2Component_Factory(t) { return new (t || ModelManagementV2Component)(i0.ɵɵdirectiveInject(i1.SharedService)); };
979
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ModelManagementV2Component, selectors: [["app-model-management-v2"]], inputs: { initialState: "initialState" }, outputs: { openEntityRecord: "openEntityRecord", stateChange: "stateChange" }, decls: 3, vars: 1, consts: [[1, "model-management-v2"], [1, "loading-container"], [1, "loading-content"], [1, "loading-spinner"], [1, "spinner-ring"], [1, "loading-text"], [1, "dashboard-header", 2, "display", "flex !important", "justify-content", "space-between !important", "align-items", "center !important", "padding", "16px 24px !important", "background", "white !important"], [1, "header-info", 2, "display", "flex !important", "align-items", "center !important", "gap", "16px !important", "flex", "1 !important"], [1, "dashboard-title", 2, "margin", "0 !important", "display", "flex !important", "align-items", "center !important", "gap", "8px !important"], [1, "fa-solid", "fa-microchip"], ["type", "button", "title", "Toggle Filters", 1, "filter-toggle-btn", 3, "click"], [1, "fa-solid", "fa-filter"], [1, "item-count"], [1, "header-controls", 2, "display", "flex !important", "align-items", "center !important", "gap", "16px !important"], [1, "view-toggle"], ["type", "button", "title", "Grid View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-grip"], ["type", "button", "title", "List View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-list"], ["type", "button", "title", "Create New Model", 1, "control-btn", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], ["orientation", "horizontal"], ["size", "320", "min", "250", "max", "400"], [1, "content-area"], [1, "empty-state"], [1, "filter-panel"], [1, "filter-panel-header"], [1, "filter-summary-inline"], [1, "summary-value"], [1, "summary-label"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "filter-content"], [1, "filter-group"], [1, "filter-label"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search models...", 1, "filter-input", 3, "input", "value"], [1, "fa-solid", "fa-sort"], [1, "filter-select", 3, "change", "value"], [3, "value"], [1, "fa-solid", "fa-building"], ["value", "all"], [1, "fa-solid", "fa-toggle-on"], ["value", "active"], ["value", "inactive"], [1, "fa-solid", "fa-bolt"], [1, "rank-filter-inputs"], ["type", "number", "min", "0", "placeholder", "Min", 1, "rank-input", 3, "ngModelChange", "change", "max", "ngModel"], [1, "rank-separator"], ["type", "number", "min", "0", "placeholder", "Max", 1, "rank-input", 3, "ngModelChange", "change", "max", "ngModel"], [1, "filter-actions"], ["title", "Reset all filters", 1, "reset-btn", 3, "click"], [1, "fa-solid", "fa-undo"], [1, "fa-solid", "fa-microchip", "fa-4x"], [1, "primary-action"], [1, "primary-action", 3, "click"], [1, "model-grid"], [1, "model-list"], [1, "model-card", 3, "expanded"], [1, "model-card"], [1, "card-header", 3, "click"], [1, "card-icon"], [1, "card-info"], [1, "card-meta"], [1, "vendor"], [1, "type"], [1, "status", "active"], [1, "status", "inactive"], [1, "card-stats"], ["title", "Power Rank", 1, "stat-item"], ["title", "Speed Rank", 1, "stat-item"], [1, "fa-solid", "fa-gauge-high"], ["title", "Cost Rank", 1, "stat-item"], [1, "fa-solid", "fa-dollar-sign"], ["title", "Token Limit", 1, "stat-item"], [1, "fa-solid", "fa-chevron-down", "expand-icon"], [1, "card-content"], [1, "fa-solid", "fa-coins"], [1, "description-section"], [1, "ranks-section"], [1, "ranks-grid"], [1, "rank-item"], [1, "rank-label"], [1, "rank-value"], [1, "stats-grid"], [1, "stat"], [1, "stat-label"], [1, "stat-value"], [1, "card-footer"], [1, "action-button", 3, "click"], [1, "fa-solid", "fa-edit"], [1, "data-table"], [1, "name-cell"], [1, "rank-badge"], [1, "status-badge"], [1, "action-button", "small", 3, "click"]], template: function ModelManagementV2Component_Template(rf, ctx) { if (rf & 1) {
955
+ // BaseResourceComponent abstract method implementations
956
+ async GetResourceDisplayName(data) {
957
+ return 'Models';
958
+ }
959
+ async GetResourceIconClass(data) {
960
+ return 'fa-solid fa-microchip';
961
+ }
962
+ static ɵfac = function ModelManagementV2Component_Factory(t) { return new (t || ModelManagementV2Component)(i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i1.NavigationService)); };
963
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ModelManagementV2Component, selectors: [["app-model-management-v2"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [[1, "model-management-v2"], [1, "loading-container"], ["size", "large", 3, "text"], [1, "dashboard-header"], [1, "header-info"], [1, "dashboard-title"], [1, "fa-solid", "fa-microchip"], ["type", "button", "title", "Toggle Filters", 1, "filter-toggle-btn", 3, "click"], [1, "fa-solid", "fa-filter"], [1, "item-count"], [1, "header-controls"], [1, "view-toggle"], ["type", "button", "title", "Grid View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-grip"], ["type", "button", "title", "List View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-list"], ["type", "button", "title", "Create New Model", 1, "control-btn", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], ["orientation", "horizontal"], ["size", "320", "min", "250", "max", "400"], [1, "content-area"], [1, "empty-state"], [1, "filter-panel"], [1, "filter-panel-header"], [1, "filter-summary-inline"], [1, "summary-value"], [1, "summary-label"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "filter-content"], [1, "filter-group"], [1, "filter-label"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search models...", 1, "filter-input", 3, "input", "value"], [1, "fa-solid", "fa-sort"], [1, "filter-select", 3, "change", "value"], [3, "value"], [1, "fa-solid", "fa-building"], ["value", "all"], [1, "fa-solid", "fa-toggle-on"], ["value", "active"], ["value", "inactive"], [1, "fa-solid", "fa-bolt"], [1, "rank-filter-inputs"], ["type", "number", "min", "0", "placeholder", "Min", 1, "rank-input", 3, "ngModelChange", "change", "max", "ngModel"], [1, "rank-separator"], ["type", "number", "min", "0", "placeholder", "Max", 1, "rank-input", 3, "ngModelChange", "change", "max", "ngModel"], [1, "filter-actions"], ["title", "Reset all filters", 1, "reset-btn", 3, "click"], [1, "fa-solid", "fa-undo"], [1, "fa-solid", "fa-microchip", "fa-4x"], [1, "primary-action"], [1, "primary-action", 3, "click"], [1, "model-grid"], [1, "model-list"], [1, "model-card", 3, "expanded"], [1, "model-card"], [1, "card-header", 3, "click"], [1, "model-info"], [1, "model-icon"], [1, "model-details"], [1, "model-name"], [1, "model-meta"], [1, "meta-item"], [1, "meta-item", "status-active"], [1, "meta-item", "status-inactive"], [1, "fa-solid", "fa-chevron-down", "expand-icon"], [1, "card-body"], [1, "model-description"], [1, "model-description", "text-muted"], [1, "expanded-content"], [1, "card-actions"], ["type", "button", "title", "Open Model", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-external-link-alt"], [1, "fa-solid", "fa-circle", 2, "font-size", "8px"], [1, "model-stats"], [1, "stat-item"], [1, "stat-label"], [1, "stat-value"], [1, "data-table"], [1, "name-cell"], [1, "rank-badge"], [1, "status-badge"], [1, "action-button", "small", 3, "click"], [1, "fa-solid", "fa-edit"]], template: function ModelManagementV2Component_Template(rf, ctx) { if (rf & 1) {
980
964
  i0.ɵɵelementStart(0, "div", 0);
981
- i0.ɵɵtemplate(1, ModelManagementV2Component_Conditional_1_Template, 8, 1, "div", 1)(2, ModelManagementV2Component_Conditional_2_Template, 26, 8);
965
+ i0.ɵɵtemplate(1, ModelManagementV2Component_Conditional_1_Template, 2, 1, "div", 1)(2, ModelManagementV2Component_Conditional_2_Template, 26, 8);
982
966
  i0.ɵɵelementEnd();
983
967
  } if (rf & 2) {
984
968
  i0.ɵɵadvance();
985
969
  i0.ɵɵconditional(ctx.isLoading ? 1 : 2);
986
- } }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.NumberValueAccessor, i2.NgControlStatus, i2.MinValidator, i2.MaxValidator, i2.NgModel, i3.SplitterComponent, i3.SplitterPaneComponent], styles: [".model-management-v2[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: #f5f7fa;\n}\n\n//[_ngcontent-%COMP%] Loading[_ngcontent-%COMP%] state\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background-color: #f5f7fa;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n position: relative;\n width: 80px;\n height: 80px;\n margin: 0 auto 20px;\n}\n\n.spinner-ring[_ngcontent-%COMP%] {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-top-color: #17a2b8;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1.5s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;\n \n &:nth-child(2) {\n animation-delay: 0.15s;\n width: 70%;\n height: 70%;\n top: 15%;\n left: 15%;\n border-top-color: #28a745;\n }\n \n &:nth-child(3) {\n animation-delay: 0.3s;\n width: 40%;\n height: 40%;\n top: 30%;\n left: 30%;\n border-top-color: #ffc107;\n }\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 16px;\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 1; }\n}\n\n//[_ngcontent-%COMP%] Dashboard[_ngcontent-%COMP%] Header\n.dashboard-header[_ngcontent-%COMP%] {\n background: white;\n padding: 16px 24px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #17a2b8;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.item-count[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n//[_ngcontent-%COMP%] View[_ngcontent-%COMP%] Toggle\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f8f9fa;\n border-radius: 6px;\n padding: 2px;\n border: 1px solid #dee2e6;\n}\n\n.view-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 16px;\n}\n\n.view-btn[_ngcontent-%COMP%]:hover {\n color: #495057;\n}\n\n.view-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #17a2b8;\n box-shadow: 0 1px 2px rgba(0,0,0,0.08);\n}\n\n//[_ngcontent-%COMP%] Control[_ngcontent-%COMP%] Buttons\n.control-btn[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.control-btn.primary[_ngcontent-%COMP%] {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.control-btn.primary[_ngcontent-%COMP%]:hover {\n background: #138496;\n border-color: #117a8b;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);\n}\n\n//[_ngcontent-%COMP%] Splitter[_ngcontent-%COMP%] content\nkendo-splitter[_ngcontent-%COMP%] {\n flex: 1;\n background-color: #f5f7fa;\n margin-top: 8px;\n}\n\n//[_ngcontent-%COMP%] Filter[_ngcontent-%COMP%] panel\n.filter-panel[_ngcontent-%COMP%] {\n height: 100%;\n background: white;\n border-right: 1px solid #e0e0e0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n \n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 500;\n color: #333;\n flex: 1;\n }\n \n .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 12px;\n font-size: 12px;\n \n .summary-value {\n font-weight: 600;\n color: #2196f3;\n }\n \n .summary-label {\n color: #666;\n }\n }\n \n .close-btn {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: #666;\n border-radius: 3px;\n transition: all 0.2s;\n \n &:hover {\n background: #f0f0f0;\n color: #333;\n }\n \n .fa-solid {\n font-size: 12px;\n }\n }\n}\n\n.filter-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 12px;\n}\n\n.filter-group[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n \n .filter-label {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #555;\n \n .fa-solid {\n font-size: 11px;\n color: #2196f3;\n width: 12px;\n }\n }\n}\n\n.filter-input[_ngcontent-%COMP%], .filter-select[_ngcontent-%COMP%] {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 10px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n \n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n \n &::placeholder {\n color: #999;\n }\n}\n\n.filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.rank-filter-inputs[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n align-items: center;\n margin-top: 6px;\n}\n\n.rank-input[_ngcontent-%COMP%] {\n width: 60px;\n padding: 6px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n text-align: center;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n \n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n \n &::placeholder {\n color: #999;\n font-size: 11px;\n }\n \n // Hide spinner buttons for cleaner look\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n \n -moz-appearance: textfield;\n}\n\n.rank-separator[_ngcontent-%COMP%] {\n color: #999;\n font-size: 12px;\n font-weight: 500;\n}\n\n.filter-actions[_ngcontent-%COMP%] {\n margin-top: 24px;\n padding-top: 16px;\n border-top: 1px solid #f0f0f0;\n \n .reset-btn {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 12px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n color: #666;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.2s;\n box-sizing: border-box;\n \n &:hover {\n background: #e9ecef;\n border-color: #ccc;\n color: #333;\n }\n \n .fa-solid {\n font-size: 11px;\n }\n }\n}\n\n//[_ngcontent-%COMP%] Content[_ngcontent-%COMP%] area\n.content-area[_ngcontent-%COMP%] {\n height: 100%;\n padding: 24px;\n overflow-y: auto;\n background: #f5f7fa;\n}\n\n//[_ngcontent-%COMP%] Empty[_ngcontent-%COMP%] state\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: #6c757d;\n \n i {\n margin-bottom: 24px;\n opacity: 0.3;\n }\n \n h3 {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 16px;\n }\n}\n\n//[_ngcontent-%COMP%] Grid[_ngcontent-%COMP%] view\n.model-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));\n}\n\n.model-card[_ngcontent-%COMP%] {\n margin: 20px; // instead of gap in grid, for some reason that didn't work\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n transition: all 0.3s ease;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);\n .expand-icon {\n transform: rotate(180deg);\n }\n }\n}\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 20px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n \n &:hover {\n background-color: #f8f9fa;\n }\n}\n\n.card-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n background-color: #e3f2fd;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 16px;\n flex-shrink: 0;\n \n i {\n font-size: 24px;\n color: #17a2b8;\n }\n}\n\n.card-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n \n h4 {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.card-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n font-size: 13px;\n color: #6c757d;\n margin-bottom: 8px;\n \n .vendor, .type, .status {\n display: flex;\n align-items: center;\n gap: 4px;\n \n &::before {\n content: '\u2022';\n color: #dee2e6;\n }\n \n &:first-child::before {\n display: none;\n }\n }\n \n .status {\n font-weight: 500;\n \n &.active {\n color: #28a745;\n }\n \n &.inactive {\n color: #dc3545;\n }\n }\n}\n\n.card-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: #495057;\n \n .stat-item {\n display: flex;\n align-items: center;\n gap: 4px;\n \n i {\n font-size: 11px;\n color: #6c757d;\n }\n }\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n color: #adb5bd;\n transition: transform 0.3s ease;\n margin-left: 12px;\n}\n\n.card-content[_ngcontent-%COMP%] {\n padding: 0 20px 20px;\n animation: slideDown 0.3s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.description-section[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n \n h5 {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n color: #495057;\n line-height: 1.6;\n }\n}\n\n.ranks-section[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n \n h5 {\n margin: 0 0 12px 0;\n font-size: 13px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n}\n\n.ranks-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.rank-item[_ngcontent-%COMP%] {\n background-color: #f8f9fa;\n border-radius: 8px;\n padding: 12px;\n text-align: center;\n \n .rank-label {\n display: block;\n font-size: 12px;\n color: #6c757d;\n margin-bottom: 4px;\n \n i {\n margin-right: 4px;\n }\n }\n \n .rank-value {\n display: block;\n font-size: 18px;\n font-weight: 600;\n \n &.rank-high {\n color: #28a745;\n }\n \n &.rank-medium {\n color: #ffc107;\n }\n \n &.rank-low {\n color: #dc3545;\n }\n \n &.rank-none {\n color: #6c757d;\n }\n }\n}\n\n.stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.stat[_ngcontent-%COMP%] {\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n \n .stat-label {\n display: block;\n font-size: 12px;\n color: #6c757d;\n margin-bottom: 4px;\n }\n \n .stat-value {\n font-size: 14px;\n font-weight: 500;\n color: #2c3e50;\n display: flex;\n align-items: center;\n justify-content: center;\n \n // Special case for toggle switches - ensure they don't expand\n .toggle-switch {\n display: inline-block !important;\n vertical-align: middle;\n }\n }\n}\n\n//[_ngcontent-%COMP%] Toggle[_ngcontent-%COMP%] switch\n.toggle-switch[_ngcontent-%COMP%] {\n position: relative;\n display: inline-block !important;\n width: 44px !important;\n height: 24px !important;\n flex-shrink: 0;\n \n &.small {\n width: 36px !important;\n height: 20px !important;\n }\n \n input {\n opacity: 0;\n width: 0;\n height: 0;\n \n &:checked + .toggle-slider {\n background-color: #28a745;\n \n &::before {\n transform: translateX(20px);\n }\n }\n }\n}\n\n.toggle-slider[_ngcontent-%COMP%] {\n position: absolute;\n cursor: pointer;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: #ccc;\n transition: .3s;\n border-radius: 24px;\n \n &::before {\n position: absolute;\n content: \"\";\n height: 18px;\n width: 18px;\n left: 3px;\n bottom: 3px;\n background-color: white;\n transition: .3s;\n border-radius: 50%;\n }\n \n .small & {\n &::before {\n height: 14px;\n width: 14px;\n }\n }\n}\n\n.card-footer[_ngcontent-%COMP%] {\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n display: flex;\n gap: 8px;\n}\n\n.action-button[_ngcontent-%COMP%] {\n padding: 6px 12px;\n background-color: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n color: #495057;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n \n &:hover {\n background-color: #e9ecef;\n border-color: #adb5bd;\n color: #212529;\n }\n \n &.small {\n padding: 4px 8px;\n font-size: 12px;\n }\n \n i {\n margin-right: 4px;\n }\n}\n\n//[_ngcontent-%COMP%] List[_ngcontent-%COMP%] view\n.model-list[_ngcontent-%COMP%] {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n overflow: hidden;\n}\n\n.data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n \n thead {\n background-color: #f8f9fa;\n \n tr {\n border-bottom: 2px solid #dee2e6;\n }\n \n th {\n padding: 12px 16px;\n text-align: left;\n font-size: 13px;\n font-weight: 600;\n color: #495057;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n }\n \n tbody {\n tr {\n border-bottom: 1px solid #e9ecef;\n transition: background-color 0.2s ease;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:last-child {\n border-bottom: none;\n }\n }\n \n td {\n padding: 16px;\n font-size: 14px;\n color: #495057;\n }\n }\n}\n\n.name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n color: #2c3e50;\n \n i {\n color: #17a2b8;\n }\n}\n\n.rank-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n background-color: #f8f9fa;\n \n &.rank-high {\n background-color: #d4edda;\n color: #155724;\n }\n \n &.rank-medium {\n background-color: #fff3cd;\n color: #856404;\n }\n \n &.rank-low {\n background-color: #f8d7da;\n color: #721c24;\n }\n \n &.rank-none {\n background-color: #e9ecef;\n color: #6c757d;\n }\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n \n &.active {\n background-color: #d4edda;\n color: #155724;\n }\n \n &.inactive {\n background-color: #f8d7da;\n color: #721c24;\n }\n}\n\n//[_ngcontent-%COMP%] Responsive\n@media[_ngcontent-%COMP%] (max-width[_ngcontent-%COMP%]: 768px)[_ngcontent-%COMP%] {\n .model-header {\n flex-wrap: wrap;\n gap: 16px;\n }\n \n .header-right {\n width: 100%;\n justify-content: space-between;\n }\n \n .model-grid {\n grid-template-columns: 1fr;\n }\n \n .stats-grid,\n .ranks-grid {\n grid-template-columns: 1fr;\n }\n}"] });
987
- }
970
+ } }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.NumberValueAccessor, i2.NgControlStatus, i2.MinValidator, i2.MaxValidator, i2.NgModel, i3.SplitterComponent, i3.SplitterPaneComponent, i4.LoadingComponent], styles: [".model-management-v2[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: #f5f7fa;\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background-color: #f5f7fa;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n display: inline-block;\n margin-bottom: 16px;\n}\n\n.spinner-ring[_ngcontent-%COMP%] {\n display: inline-block;\n width: 40px;\n height: 40px;\n margin: 3px;\n border-radius: 50%;\n border: 3px solid #17a2b8;\n border-color: #17a2b8 transparent #17a2b8 transparent;\n animation: _ngcontent-%COMP%_spinner-ring 1.2s linear infinite;\n}\n\n@keyframes _ngcontent-%COMP%_spinner-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n.loading-text[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 14px;\n}\n\n.dashboard-header[_ngcontent-%COMP%] {\n background: white;\n padding: 16px 24px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #17a2b8;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.item-count[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f8f9fa;\n border-radius: 6px;\n padding: 2px;\n border: 1px solid #dee2e6;\n}\n\n.view-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 16px;\n}\n\n.view-btn[_ngcontent-%COMP%]:hover {\n color: #495057;\n}\n\n.view-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #17a2b8;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n.control-btn[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #dee2e6;\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #ced4da;\n}\n\n.control-btn.primary[_ngcontent-%COMP%] {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.control-btn.primary[_ngcontent-%COMP%]:hover {\n background: #1485a3;\n border-color: #1485a3;\n}\n\nkendo-splitter[_ngcontent-%COMP%] {\n flex: 1;\n background-color: #f5f7fa;\n margin-top: 8px;\n}\n\n.filter-panel[_ngcontent-%COMP%] {\n height: 100%;\n background: white;\n border-right: 1px solid #e0e0e0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n}\n.filter-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n flex: 1;\n}\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 12px;\n font-size: 12px;\n}\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-value[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #17a2b8;\n}\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-label[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: #6c757d;\n border-radius: 4px;\n transition: all 0.2s;\n}\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%]:hover {\n background: #f0f0f0;\n color: #333;\n}\n\n.filter-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n.filter-group[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n font-size: 12px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #17a2b8;\n}\n\n.filter-input[_ngcontent-%COMP%], \n.filter-select[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n}\n.filter-input[_ngcontent-%COMP%]:focus, \n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #17a2b8;\n}\n.filter-input[_ngcontent-%COMP%]::placeholder, \n.filter-select[_ngcontent-%COMP%]::placeholder {\n color: #adb5bd;\n}\n\n.filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.rank-filter-inputs[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n align-items: center;\n margin-top: 6px;\n}\n\n.rank-input[_ngcontent-%COMP%] {\n width: 60px;\n padding: 6px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n text-align: center;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n -moz-appearance: textfield;\n}\n.rank-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #17a2b8;\n}\n.rank-input[_ngcontent-%COMP%]::placeholder {\n color: #999;\n font-size: 11px;\n}\n.rank-input[_ngcontent-%COMP%]::-webkit-inner-spin-button, .rank-input[_ngcontent-%COMP%]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.rank-separator[_ngcontent-%COMP%] {\n color: #999;\n font-size: 12px;\n font-weight: 500;\n}\n\n.filter-actions[_ngcontent-%COMP%] {\n margin-top: 24px;\n padding-top: 16px;\n border-top: 1px solid #f0f0f0;\n}\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 16px;\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n color: #6c757d;\n font-size: 14px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: all 0.2s;\n}\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #ced4da;\n color: #495057;\n}\n\n.content-area[_ngcontent-%COMP%] {\n height: 100%;\n padding: 24px;\n overflow-y: auto;\n background: #f5f7fa;\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 text-align: center;\n color: #6c757d;\n}\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n opacity: 0.3;\n}\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: #495057;\n}\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n font-size: 16px;\n}\n\n.model-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));\n gap: 20px;\n}\n\n.model-card[_ngcontent-%COMP%] {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n transition: all 0.3s ease;\n overflow: hidden;\n}\n\n.model-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n transform: translateY(-2px);\n}\n\n.model-card.expanded[_ngcontent-%COMP%] {\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);\n}\n\n.card-header[_ngcontent-%COMP%] {\n padding: 20px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n cursor: pointer;\n user-select: none;\n border-bottom: 1px solid #f0f4f8;\n}\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n flex: 1;\n}\n\n.model-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: #17a2b8;\n}\n\n.model-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: white;\n font-size: 20px;\n}\n\n.model-details[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.model-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n margin-bottom: 6px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.model-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.meta-item[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6c757d;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.meta-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.meta-item.status-active[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.meta-item.status-inactive[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #6c757d;\n transition: transform 0.3s ease;\n}\n\n.expand-icon.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.card-body[_ngcontent-%COMP%] {\n padding: 0 20px 20px 20px;\n}\n\n.model-description[_ngcontent-%COMP%] {\n margin: 16px 0 0 0;\n font-size: 14px;\n line-height: 1.6;\n color: #6c757d;\n}\n\n.model-description.text-muted[_ngcontent-%COMP%] {\n font-style: italic;\n color: #adb5bd;\n}\n\n\n\n.expanded-content[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #f0f4f8;\n animation: _ngcontent-%COMP%_slideDown 0.3s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n.model-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 16px;\n}\n\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #495057;\n font-weight: 500;\n}\n\n\n\n.card-actions[_ngcontent-%COMP%] {\n padding: 16px 20px;\n background: #f8f9fa;\n border-top: 1px solid #e0e6ed;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #dee2e6;\n padding: 6px 16px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #ced4da;\n}\n\n.action-btn-primary[_ngcontent-%COMP%] {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.action-btn-primary[_ngcontent-%COMP%]:hover {\n background: #1485a3;\n border-color: #1485a3;\n}\n\n.model-list[_ngcontent-%COMP%] {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n overflow: hidden;\n}\n\n.data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background-color: #f8f9fa;\n}\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 2px solid #dee2e6;\n}\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 12px 16px;\n text-align: left;\n font-size: 13px;\n font-weight: 600;\n color: #495057;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 1px solid #e9ecef;\n transition: background-color 0.2s ease;\n}\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: #f8f9fa;\n}\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 16px;\n font-size: 14px;\n color: #495057;\n}\n\n.name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n color: #2c3e50;\n}\n.name-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #17a2b8;\n}\n\n.rank-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n background-color: #f8f9fa;\n}\n.rank-badge.rank-high[_ngcontent-%COMP%] {\n background-color: #d4edda;\n color: #155724;\n}\n.rank-badge.rank-medium[_ngcontent-%COMP%] {\n background-color: #fff3cd;\n color: #856404;\n}\n.rank-badge.rank-low[_ngcontent-%COMP%] {\n background-color: #f8d7da;\n color: #721c24;\n}\n.rank-badge.rank-none[_ngcontent-%COMP%] {\n background-color: #e9ecef;\n color: #6c757d;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n}\n.status-badge.active[_ngcontent-%COMP%] {\n background-color: #d4edda;\n color: #155724;\n}\n.status-badge.inactive[_ngcontent-%COMP%] {\n background-color: #f8d7da;\n color: #721c24;\n}\n\n@media (max-width: 768px) {\n .model-header[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n gap: 16px;\n }\n .header-right[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: space-between;\n }\n .model-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .stats-grid[_ngcontent-%COMP%], \n .ranks-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}"] });
971
+ };
972
+ ModelManagementV2Component = __decorate([
973
+ RegisterClass(BaseResourceComponent, 'AIModelsResource')
974
+ ], ModelManagementV2Component);
975
+ export { ModelManagementV2Component };
988
976
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ModelManagementV2Component, [{
989
977
  type: Component,
990
- args: [{ selector: 'app-model-management-v2', template: "<div class=\"model-management-v2\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <div class=\"loading-spinner\">\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n </div>\n <div class=\"loading-text\">{{ currentLoadingMessage }}</div>\n </div>\n </div>\n } @else {\n <div class=\"dashboard-header\" style=\"display: flex !important; justify-content: space-between !important; align-items: center !important; padding: 16px 24px !important; background: white !important;\">\n <div class=\"header-info\" style=\"display: flex !important; align-items: center !important; gap: 16px !important; flex: 1 !important;\">\n <h2 class=\"dashboard-title\" style=\"margin: 0 !important; display: flex !important; align-items: center !important; gap: 8px !important;\">\n <i class=\"fa-solid fa-microchip\"></i>\n AI Models\n </h2>\n <button \n type=\"button\" \n class=\"filter-toggle-btn\"\n (click)=\"toggleFilters()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (showFilters) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ filteredModels.length }} models</span>\n </div>\n \n <div class=\"header-controls\" style=\"display: flex !important; align-items: center !important; gap: 16px !important;\">\n <div class=\"view-toggle\">\n <button \n type=\"button\" \n class=\"view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button \n type=\"button\" \n class=\"view-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"setViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n \n <button \n type=\"button\" \n class=\"control-btn primary\"\n (click)=\"createNewModel()\"\n title=\"Create New Model\">\n <i class=\"fa-solid fa-plus\"></i>\n New Model\n </button>\n </div>\n </div>\n\n <kendo-splitter orientation=\"horizontal\">\n @if (showFilters) {\n <kendo-splitter-pane size=\"320\" min=\"250\" max=\"400\">\n <div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Model Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredModels.length }}</span>\n <span class=\"summary-label\">of {{ models.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n \n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-search\"></span>\n Name\n </label>\n <input \n type=\"text\"\n class=\"filter-input\"\n placeholder=\"Search models...\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n\n <!-- Sort By Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-sort\"></span>\n Sort By\n </label>\n <select class=\"filter-select\" [value]=\"sortBy\" (change)=\"onSortChange($any($event.target).value)\">\n @for (option of sortOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n </div>\n\n <!-- Vendor Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-building\"></span>\n Vendor\n </label>\n <select class=\"filter-select\" [value]=\"selectedVendor\" (change)=\"onVendorChange($any($event.target).value)\">\n <option value=\"all\">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 <!-- Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-microchip\"></span>\n Type\n </label>\n <select class=\"filter-select\" [value]=\"selectedType\" (change)=\"onTypeChange($any($event.target).value)\">\n <option value=\"all\">All Types</option>\n @for (type of modelTypes; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n Status\n </label>\n <select class=\"filter-select\" [value]=\"selectedStatus\" (change)=\"onStatusChange($any($event.target).value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n </select>\n </div>\n\n <!-- Power Rank Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-bolt\"></span>\n Power Rank\n </label>\n <div class=\"rank-filter-inputs\">\n <input \n type=\"number\" \n min=\"0\" \n [max]=\"maxPowerRank\" \n [(ngModel)]=\"powerRankRange.min\"\n (change)=\"validateAndApplyRankFilters('power')\"\n class=\"rank-input\"\n placeholder=\"Min\"\n />\n <span class=\"rank-separator\">-</span>\n <input \n type=\"number\" \n min=\"0\" \n [max]=\"maxPowerRank\" \n [(ngModel)]=\"powerRankRange.max\"\n (change)=\"validateAndApplyRankFilters('power')\"\n class=\"rank-input\"\n placeholder=\"Max\"\n />\n </div>\n </div>\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"clearFilters()\" title=\"Reset all filters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n }\n\n <kendo-splitter-pane>\n <div class=\"content-area\">\n @if (filteredModels.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-microchip fa-4x\"></i>\n <h3>No models found</h3>\n <p>{{ hasActiveFilters ? 'Try adjusting your filters' : 'Create your first AI model to get started' }}</p>\n @if (!hasActiveFilters) {\n <button class=\"primary-action\" (click)=\"createNewModel()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create First Model\n </button>\n }\n </div>\n } @else {\n @switch (viewMode) {\n @case ('grid') {\n <div class=\"model-grid\">\n @for (model of filteredModels; track model.ID) {\n <div class=\"model-card\" [class.expanded]=\"expandedModelId === model.ID\">\n <div class=\"card-header\" (click)=\"toggleModelExpansion(model.ID)\">\n <div class=\"card-icon\">\n <i [class]=\"getModelIcon(model)\"></i>\n </div>\n <div class=\"card-info\">\n <h4>{{ model.Name || 'Unnamed Model' }}</h4>\n <div class=\"card-meta\">\n @if (model.Vendor) {\n <span class=\"vendor\">{{ model.Vendor }}</span>\n }\n <span class=\"type\">{{ model.AIModelType }}</span>\n @if (model.IsActive) {\n <span class=\"status active\">Active</span>\n } @else {\n <span class=\"status inactive\">Inactive</span>\n }\n </div>\n <div class=\"card-stats\">\n <span class=\"stat-item\" title=\"Power Rank\">\n <i class=\"fa-solid fa-bolt\"></i> {{ formatRank(model.PowerRank, 'power') }}\n </span>\n <span class=\"stat-item\" title=\"Speed Rank\">\n <i class=\"fa-solid fa-gauge-high\"></i> {{ formatRank(model.SpeedRank, 'speed') }}\n </span>\n <span class=\"stat-item\" title=\"Cost Rank\">\n <i class=\"fa-solid fa-dollar-sign\"></i> {{ formatRank(model.CostRank, 'cost') }}\n </span>\n @if (model.InputTokenLimit) {\n <span class=\"stat-item\" title=\"Token Limit\">\n <i class=\"fa-solid fa-coins\"></i> {{ formatTokenLimit(model.InputTokenLimit) }}\n </span>\n }\n </div>\n </div>\n <i class=\"fa-solid fa-chevron-down expand-icon\" [class.rotated]=\"expandedModelId === model.ID\"></i>\n </div>\n\n @if (expandedModelId === model.ID) {\n <div class=\"card-content\">\n @if (model.Description) {\n <div class=\"description-section\">\n <h5>Description</h5>\n <p>{{ model.Description }}</p>\n </div>\n }\n\n <div class=\"ranks-section\">\n <h5>Performance Rankings</h5>\n <div class=\"ranks-grid\">\n <div class=\"rank-item\">\n <span class=\"rank-label\">\n <i class=\"fa-solid fa-bolt\"></i> Power\n </span>\n <span class=\"rank-value\" [class]=\"getRankClass(model.PowerRank, 'power')\">\n {{ formatRank(model.PowerRank, 'power') }}\n </span>\n </div>\n <div class=\"rank-item\">\n <span class=\"rank-label\">\n <i class=\"fa-solid fa-gauge-high\"></i> Speed\n </span>\n <span class=\"rank-value\" [class]=\"getRankClass(model.SpeedRank, 'speed')\">\n {{ formatRank(model.SpeedRank, 'speed') }}\n </span>\n </div>\n <div class=\"rank-item\">\n <span class=\"rank-label\">\n <i class=\"fa-solid fa-dollar-sign\"></i> Cost\n </span>\n <span class=\"rank-value\" [class]=\"getRankClass(model.CostRank, 'cost')\">\n {{ formatRank(model.CostRank, 'cost') }}\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"stats-grid\">\n <div class=\"stat\">\n <span class=\"stat-label\">Status</span>\n <span class=\"stat-value\">{{ model.IsActive ? 'Active' : 'Inactive' }}</span>\n </div>\n <div class=\"stat\">\n <span class=\"stat-label\">API Name</span>\n <span class=\"stat-value\">{{ model.APIName || 'N/A' }}</span>\n </div>\n <div class=\"stat\">\n <span class=\"stat-label\">Driver</span>\n <span class=\"stat-value\">{{ model.DriverClass || 'N/A' }}</span>\n </div>\n </div>\n\n <div class=\"card-footer\">\n <button class=\"action-button\" (click)=\"openModel(model.ID); $event.stopPropagation()\">\n <i class=\"fa-solid fa-edit\"></i>\n Edit\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n \n @case ('list') {\n <div class=\"model-list\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Vendor</th>\n <th>Type</th>\n <th>Power</th>\n <th>Speed</th>\n <th>Cost</th>\n <th>Status</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (model of filteredModels; track model.ID) {\n <tr>\n <td>\n <div class=\"name-cell\">\n <i [class]=\"getModelIcon(model)\"></i>\n {{ model.Name || 'Unnamed Model' }}\n </div>\n </td>\n <td>{{ model.Vendor || '-' }}</td>\n <td>{{ model.AIModelType }}</td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.PowerRank, 'power')\">\n {{ formatRank(model.PowerRank, 'power') }}\n </span>\n </td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.SpeedRank, 'speed')\">\n {{ formatRank(model.SpeedRank, 'speed') }}\n </span>\n </td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.CostRank, 'cost')\">\n {{ formatRank(model.CostRank, 'cost') }}\n </span>\n </td>\n <td>\n <span class=\"status-badge\" [class.active]=\"model.IsActive\" [class.inactive]=\"!model.IsActive\">\n {{ model.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </td>\n <td>\n <button class=\"action-button small\" (click)=\"openModel(model.ID)\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n }\n</div>", styles: [".model-management-v2 {\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: #f5f7fa;\n}\n\n// Loading state\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background-color: #f5f7fa;\n}\n\n.loading-content {\n text-align: center;\n}\n\n.loading-spinner {\n position: relative;\n width: 80px;\n height: 80px;\n margin: 0 auto 20px;\n}\n\n.spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-top-color: #17a2b8;\n border-radius: 50%;\n animation: spin 1.5s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;\n \n &:nth-child(2) {\n animation-delay: 0.15s;\n width: 70%;\n height: 70%;\n top: 15%;\n left: 15%;\n border-top-color: #28a745;\n }\n \n &:nth-child(3) {\n animation-delay: 0.3s;\n width: 40%;\n height: 40%;\n top: 30%;\n left: 30%;\n border-top-color: #ffc107;\n }\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text {\n color: #6c757d;\n font-size: 16px;\n animation: pulse 2s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 1; }\n}\n\n// Dashboard Header\n.dashboard-header {\n background: white;\n padding: 16px 24px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.header-info {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.dashboard-title i {\n color: #17a2b8;\n}\n\n.filter-toggle-btn {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-toggle-btn:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.item-count {\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n}\n\n.header-controls {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n// View Toggle\n.view-toggle {\n display: flex;\n background: #f8f9fa;\n border-radius: 6px;\n padding: 2px;\n border: 1px solid #dee2e6;\n}\n\n.view-btn {\n background: transparent;\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 16px;\n}\n\n.view-btn:hover {\n color: #495057;\n}\n\n.view-btn.active {\n background: white;\n color: #17a2b8;\n box-shadow: 0 1px 2px rgba(0,0,0,0.08);\n}\n\n// Control Buttons\n.control-btn {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.control-btn.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.control-btn.primary:hover {\n background: #138496;\n border-color: #117a8b;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);\n}\n\n// Splitter content\nkendo-splitter {\n flex: 1;\n background-color: #f5f7fa;\n margin-top: 8px;\n}\n\n// Filter panel\n.filter-panel {\n height: 100%;\n background: white;\n border-right: 1px solid #e0e0e0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.filter-panel-header {\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n \n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 500;\n color: #333;\n flex: 1;\n }\n \n .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 12px;\n font-size: 12px;\n \n .summary-value {\n font-weight: 600;\n color: #2196f3;\n }\n \n .summary-label {\n color: #666;\n }\n }\n \n .close-btn {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: #666;\n border-radius: 3px;\n transition: all 0.2s;\n \n &:hover {\n background: #f0f0f0;\n color: #333;\n }\n \n .fa-solid {\n font-size: 12px;\n }\n }\n}\n\n.filter-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 12px;\n}\n\n.filter-group {\n margin-bottom: 20px;\n \n .filter-label {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #555;\n \n .fa-solid {\n font-size: 11px;\n color: #2196f3;\n width: 12px;\n }\n }\n}\n\n.filter-input, .filter-select {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 10px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n \n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n \n &::placeholder {\n color: #999;\n }\n}\n\n.filter-select {\n cursor: pointer;\n}\n\n.rank-filter-inputs {\n display: flex;\n gap: 8px;\n align-items: center;\n margin-top: 6px;\n}\n\n.rank-input {\n width: 60px;\n padding: 6px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n text-align: center;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n \n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n \n &::placeholder {\n color: #999;\n font-size: 11px;\n }\n \n // Hide spinner buttons for cleaner look\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n \n -moz-appearance: textfield;\n}\n\n.rank-separator {\n color: #999;\n font-size: 12px;\n font-weight: 500;\n}\n\n.filter-actions {\n margin-top: 24px;\n padding-top: 16px;\n border-top: 1px solid #f0f0f0;\n \n .reset-btn {\n width: calc(100% - 4px);\n max-width: 100%;\n padding: 8px 12px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n color: #666;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.2s;\n box-sizing: border-box;\n \n &:hover {\n background: #e9ecef;\n border-color: #ccc;\n color: #333;\n }\n \n .fa-solid {\n font-size: 11px;\n }\n }\n}\n\n// Content area\n.content-area {\n height: 100%;\n padding: 24px;\n overflow-y: auto;\n background: #f5f7fa;\n}\n\n// Empty state\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: #6c757d;\n \n i {\n margin-bottom: 24px;\n opacity: 0.3;\n }\n \n h3 {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 16px;\n }\n}\n\n// Grid view\n.model-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));\n}\n\n.model-card {\n margin: 20px; // instead of gap in grid, for some reason that didn't work\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n transition: all 0.3s ease;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);\n .expand-icon {\n transform: rotate(180deg);\n }\n }\n}\n\n.card-header {\n display: flex;\n align-items: center;\n padding: 20px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n \n &:hover {\n background-color: #f8f9fa;\n }\n}\n\n.card-icon {\n width: 48px;\n height: 48px;\n background-color: #e3f2fd;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 16px;\n flex-shrink: 0;\n \n i {\n font-size: 24px;\n color: #17a2b8;\n }\n}\n\n.card-info {\n flex: 1;\n min-width: 0;\n \n h4 {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.card-meta {\n display: flex;\n gap: 12px;\n font-size: 13px;\n color: #6c757d;\n margin-bottom: 8px;\n \n .vendor, .type, .status {\n display: flex;\n align-items: center;\n gap: 4px;\n \n &::before {\n content: '\u2022';\n color: #dee2e6;\n }\n \n &:first-child::before {\n display: none;\n }\n }\n \n .status {\n font-weight: 500;\n \n &.active {\n color: #28a745;\n }\n \n &.inactive {\n color: #dc3545;\n }\n }\n}\n\n.card-stats {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: #495057;\n \n .stat-item {\n display: flex;\n align-items: center;\n gap: 4px;\n \n i {\n font-size: 11px;\n color: #6c757d;\n }\n }\n}\n\n.expand-icon {\n color: #adb5bd;\n transition: transform 0.3s ease;\n margin-left: 12px;\n}\n\n.card-content {\n padding: 0 20px 20px;\n animation: slideDown 0.3s ease;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.description-section {\n margin-bottom: 16px;\n \n h5 {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n color: #495057;\n line-height: 1.6;\n }\n}\n\n.ranks-section {\n margin-bottom: 16px;\n \n h5 {\n margin: 0 0 12px 0;\n font-size: 13px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n}\n\n.ranks-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.rank-item {\n background-color: #f8f9fa;\n border-radius: 8px;\n padding: 12px;\n text-align: center;\n \n .rank-label {\n display: block;\n font-size: 12px;\n color: #6c757d;\n margin-bottom: 4px;\n \n i {\n margin-right: 4px;\n }\n }\n \n .rank-value {\n display: block;\n font-size: 18px;\n font-weight: 600;\n \n &.rank-high {\n color: #28a745;\n }\n \n &.rank-medium {\n color: #ffc107;\n }\n \n &.rank-low {\n color: #dc3545;\n }\n \n &.rank-none {\n color: #6c757d;\n }\n }\n}\n\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.stat {\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n \n .stat-label {\n display: block;\n font-size: 12px;\n color: #6c757d;\n margin-bottom: 4px;\n }\n \n .stat-value {\n font-size: 14px;\n font-weight: 500;\n color: #2c3e50;\n display: flex;\n align-items: center;\n justify-content: center;\n \n // Special case for toggle switches - ensure they don't expand\n .toggle-switch {\n display: inline-block !important;\n vertical-align: middle;\n }\n }\n}\n\n// Toggle switch\n.toggle-switch {\n position: relative;\n display: inline-block !important;\n width: 44px !important;\n height: 24px !important;\n flex-shrink: 0;\n \n &.small {\n width: 36px !important;\n height: 20px !important;\n }\n \n input {\n opacity: 0;\n width: 0;\n height: 0;\n \n &:checked + .toggle-slider {\n background-color: #28a745;\n \n &::before {\n transform: translateX(20px);\n }\n }\n }\n}\n\n.toggle-slider {\n position: absolute;\n cursor: pointer;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: #ccc;\n transition: .3s;\n border-radius: 24px;\n \n &::before {\n position: absolute;\n content: \"\";\n height: 18px;\n width: 18px;\n left: 3px;\n bottom: 3px;\n background-color: white;\n transition: .3s;\n border-radius: 50%;\n }\n \n .small & {\n &::before {\n height: 14px;\n width: 14px;\n }\n }\n}\n\n.card-footer {\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n display: flex;\n gap: 8px;\n}\n\n.action-button {\n padding: 6px 12px;\n background-color: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n color: #495057;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n \n &:hover {\n background-color: #e9ecef;\n border-color: #adb5bd;\n color: #212529;\n }\n \n &.small {\n padding: 4px 8px;\n font-size: 12px;\n }\n \n i {\n margin-right: 4px;\n }\n}\n\n// List view\n.model-list {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n overflow: hidden;\n}\n\n.data-table {\n width: 100%;\n border-collapse: collapse;\n \n thead {\n background-color: #f8f9fa;\n \n tr {\n border-bottom: 2px solid #dee2e6;\n }\n \n th {\n padding: 12px 16px;\n text-align: left;\n font-size: 13px;\n font-weight: 600;\n color: #495057;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n }\n \n tbody {\n tr {\n border-bottom: 1px solid #e9ecef;\n transition: background-color 0.2s ease;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:last-child {\n border-bottom: none;\n }\n }\n \n td {\n padding: 16px;\n font-size: 14px;\n color: #495057;\n }\n }\n}\n\n.name-cell {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n color: #2c3e50;\n \n i {\n color: #17a2b8;\n }\n}\n\n.rank-badge {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n background-color: #f8f9fa;\n \n &.rank-high {\n background-color: #d4edda;\n color: #155724;\n }\n \n &.rank-medium {\n background-color: #fff3cd;\n color: #856404;\n }\n \n &.rank-low {\n background-color: #f8d7da;\n color: #721c24;\n }\n \n &.rank-none {\n background-color: #e9ecef;\n color: #6c757d;\n }\n}\n\n.status-badge {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n \n &.active {\n background-color: #d4edda;\n color: #155724;\n }\n \n &.inactive {\n background-color: #f8d7da;\n color: #721c24;\n }\n}\n\n// Responsive\n@media (max-width: 768px) {\n .model-header {\n flex-wrap: wrap;\n gap: 16px;\n }\n \n .header-right {\n width: 100%;\n justify-content: space-between;\n }\n \n .model-grid {\n grid-template-columns: 1fr;\n }\n \n .stats-grid,\n .ranks-grid {\n grid-template-columns: 1fr;\n }\n}"] }]
991
- }], () => [{ type: i1.SharedService }], { openEntityRecord: [{
992
- type: Output
993
- }], stateChange: [{
994
- type: Output
995
- }], initialState: [{
996
- type: Input
997
- }] }); })();
998
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ModelManagementV2Component, { className: "ModelManagementV2Component", filePath: "src/AI/components/models/model-management-v2.component.ts", lineNumber: 22 }); })();
978
+ args: [{ selector: 'app-model-management-v2', template: "<div class=\"model-management-v2\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"currentLoadingMessage\" size=\"large\"></mj-loading>\n </div>\n } @else {\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <h2 class=\"dashboard-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n AI Models\n </h2>\n <button\n type=\"button\"\n class=\"filter-toggle-btn\"\n (click)=\"toggleFilters()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (showFilters) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ filteredModels.length }} models</span>\n </div>\n\n <div class=\"header-controls\">\n <div class=\"view-toggle\">\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"setViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"control-btn primary\"\n (click)=\"createNewModel()\"\n title=\"Create New Model\">\n <i class=\"fa-solid fa-plus\"></i>\n New Model\n </button>\n </div>\n </div>\n\n <kendo-splitter orientation=\"horizontal\">\n @if (showFilters) {\n <kendo-splitter-pane size=\"320\" min=\"250\" max=\"400\">\n <div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Model Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredModels.length }}</span>\n <span class=\"summary-label\">of {{ models.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n \n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-search\"></span>\n Name\n </label>\n <input \n type=\"text\"\n class=\"filter-input\"\n placeholder=\"Search models...\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n\n <!-- Sort By Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-sort\"></span>\n Sort By\n </label>\n <select class=\"filter-select\" [value]=\"sortBy\" (change)=\"onSortChange($any($event.target).value)\">\n @for (option of sortOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n </div>\n\n <!-- Vendor Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-building\"></span>\n Vendor\n </label>\n <select class=\"filter-select\" [value]=\"selectedVendor\" (change)=\"onVendorChange($any($event.target).value)\">\n <option value=\"all\">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 <!-- Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-microchip\"></span>\n Type\n </label>\n <select class=\"filter-select\" [value]=\"selectedType\" (change)=\"onTypeChange($any($event.target).value)\">\n <option value=\"all\">All Types</option>\n @for (type of modelTypes; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n Status\n </label>\n <select class=\"filter-select\" [value]=\"selectedStatus\" (change)=\"onStatusChange($any($event.target).value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n </select>\n </div>\n\n <!-- Power Rank Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-bolt\"></span>\n Power Rank\n </label>\n <div class=\"rank-filter-inputs\">\n <input \n type=\"number\" \n min=\"0\" \n [max]=\"maxPowerRank\" \n [(ngModel)]=\"powerRankRange.min\"\n (change)=\"validateAndApplyRankFilters('power')\"\n class=\"rank-input\"\n placeholder=\"Min\"\n />\n <span class=\"rank-separator\">-</span>\n <input \n type=\"number\" \n min=\"0\" \n [max]=\"maxPowerRank\" \n [(ngModel)]=\"powerRankRange.max\"\n (change)=\"validateAndApplyRankFilters('power')\"\n class=\"rank-input\"\n placeholder=\"Max\"\n />\n </div>\n </div>\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"clearFilters()\" title=\"Reset all filters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n }\n\n <kendo-splitter-pane>\n <div class=\"content-area\">\n @if (filteredModels.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-microchip fa-4x\"></i>\n <h3>No models found</h3>\n <p>{{ hasActiveFilters ? 'Try adjusting your filters' : 'Create your first AI model to get started' }}</p>\n @if (!hasActiveFilters) {\n <button class=\"primary-action\" (click)=\"createNewModel()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create First Model\n </button>\n }\n </div>\n } @else {\n @switch (viewMode) {\n @case ('grid') {\n <div class=\"model-grid\">\n @for (model of filteredModels; track model.ID) {\n <div class=\"model-card\" [class.expanded]=\"expandedModelId === model.ID\">\n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"toggleModelExpansion(model.ID)\">\n <div class=\"model-info\">\n <div class=\"model-icon\">\n <i [class]=\"getModelIcon(model)\"></i>\n </div>\n <div class=\"model-details\">\n <h4 class=\"model-name\">{{ model.Name || 'Unnamed Model' }}</h4>\n <div class=\"model-meta\">\n @if (model.Vendor) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-building\"></i>\n {{ model.Vendor }}\n </span>\n }\n @if (model.AIModelType) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ model.AIModelType }}\n </span>\n }\n @if (model.IsActive) {\n <span class=\"meta-item status-active\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Active\n </span>\n } @else {\n <span class=\"meta-item status-inactive\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Inactive\n </span>\n }\n </div>\n </div>\n </div>\n\n <i class=\"fa-solid fa-chevron-down expand-icon\"\n [class.rotated]=\"expandedModelId === model.ID\"></i>\n </div>\n\n <!-- Card Body -->\n <div class=\"card-body\">\n @if (model.Description) {\n <p class=\"model-description\">{{ model.Description }}</p>\n } @else {\n <p class=\"model-description text-muted\">No description provided</p>\n }\n\n <!-- Expandable Content -->\n @if (expandedModelId === model.ID) {\n <div class=\"expanded-content\">\n <div class=\"model-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Power Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.PowerRank, 'power') }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Speed Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.SpeedRank, 'speed') }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Cost Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.CostRank, 'cost') }}</span>\n </div>\n @if (model.InputTokenLimit) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">Token Limit</span>\n <span class=\"stat-value\">{{ formatTokenLimit(model.InputTokenLimit) }}</span>\n </div>\n }\n @if (model.APIName) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">API Name</span>\n <span class=\"stat-value\">{{ model.APIName }}</span>\n </div>\n }\n @if (model.DriverClass) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">Driver</span>\n <span class=\"stat-value\">{{ model.DriverClass }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Card Actions -->\n <div class=\"card-actions\">\n <button\n type=\"button\"\n class=\"action-btn\"\n (click)=\"openModel(model.ID); $event.stopPropagation()\"\n title=\"Open Model\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open\n </button>\n </div>\n </div>\n }\n </div>\n }\n \n @case ('list') {\n <div class=\"model-list\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Vendor</th>\n <th>Type</th>\n <th>Power</th>\n <th>Speed</th>\n <th>Cost</th>\n <th>Status</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (model of filteredModels; track model.ID) {\n <tr>\n <td>\n <div class=\"name-cell\">\n <i [class]=\"getModelIcon(model)\"></i>\n {{ model.Name || 'Unnamed Model' }}\n </div>\n </td>\n <td>{{ model.Vendor || '-' }}</td>\n <td>{{ model.AIModelType }}</td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.PowerRank, 'power')\">\n {{ formatRank(model.PowerRank, 'power') }}\n </span>\n </td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.SpeedRank, 'speed')\">\n {{ formatRank(model.SpeedRank, 'speed') }}\n </span>\n </td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.CostRank, 'cost')\">\n {{ formatRank(model.CostRank, 'cost') }}\n </span>\n </td>\n <td>\n <span class=\"status-badge\" [class.active]=\"model.IsActive\" [class.inactive]=\"!model.IsActive\">\n {{ model.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </td>\n <td>\n <button class=\"action-button small\" (click)=\"openModel(model.ID)\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n }\n</div>", styles: [".model-management-v2 {\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: #f5f7fa;\n}\n\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background-color: #f5f7fa;\n}\n\n.loading-content {\n text-align: center;\n}\n\n.loading-spinner {\n display: inline-block;\n margin-bottom: 16px;\n}\n\n.spinner-ring {\n display: inline-block;\n width: 40px;\n height: 40px;\n margin: 3px;\n border-radius: 50%;\n border: 3px solid #17a2b8;\n border-color: #17a2b8 transparent #17a2b8 transparent;\n animation: spinner-ring 1.2s linear infinite;\n}\n\n@keyframes spinner-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n.loading-text {\n color: #6c757d;\n font-size: 14px;\n}\n\n.dashboard-header {\n background: white;\n padding: 16px 24px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n}\n\n.header-info {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.dashboard-title i {\n color: #17a2b8;\n}\n\n.filter-toggle-btn {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-toggle-btn:hover {\n background: #e9ecef;\n border-color: #ced4da;\n}\n\n.item-count {\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n}\n\n.header-controls {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.view-toggle {\n display: flex;\n background: #f8f9fa;\n border-radius: 6px;\n padding: 2px;\n border: 1px solid #dee2e6;\n}\n\n.view-btn {\n background: transparent;\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 16px;\n}\n\n.view-btn:hover {\n color: #495057;\n}\n\n.view-btn.active {\n background: white;\n color: #17a2b8;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n.control-btn {\n background: white;\n border: 1px solid #dee2e6;\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn:hover {\n background: #f8f9fa;\n border-color: #ced4da;\n}\n\n.control-btn.primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.control-btn.primary:hover {\n background: #1485a3;\n border-color: #1485a3;\n}\n\nkendo-splitter {\n flex: 1;\n background-color: #f5f7fa;\n margin-top: 8px;\n}\n\n.filter-panel {\n height: 100%;\n background: white;\n border-right: 1px solid #e0e0e0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.filter-panel-header {\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n}\n.filter-panel-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n flex: 1;\n}\n.filter-panel-header .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 12px;\n font-size: 12px;\n}\n.filter-panel-header .filter-summary-inline .summary-value {\n font-weight: 600;\n color: #17a2b8;\n}\n.filter-panel-header .filter-summary-inline .summary-label {\n color: #6c757d;\n}\n.filter-panel-header .close-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: #6c757d;\n border-radius: 4px;\n transition: all 0.2s;\n}\n.filter-panel-header .close-btn:hover {\n background: #f0f0f0;\n color: #333;\n}\n\n.filter-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n.filter-group {\n margin-bottom: 20px;\n}\n.filter-group .filter-label {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n font-size: 12px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n.filter-group .filter-label i {\n font-size: 12px;\n color: #17a2b8;\n}\n\n.filter-input,\n.filter-select {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n}\n.filter-input:focus,\n.filter-select:focus {\n outline: none;\n border-color: #17a2b8;\n}\n.filter-input::placeholder,\n.filter-select::placeholder {\n color: #adb5bd;\n}\n\n.filter-select {\n cursor: pointer;\n}\n\n.rank-filter-inputs {\n display: flex;\n gap: 8px;\n align-items: center;\n margin-top: 6px;\n}\n\n.rank-input {\n width: 60px;\n padding: 6px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n text-align: center;\n background: white;\n transition: border-color 0.2s;\n box-sizing: border-box;\n -moz-appearance: textfield;\n}\n.rank-input:focus {\n outline: none;\n border-color: #17a2b8;\n}\n.rank-input::placeholder {\n color: #999;\n font-size: 11px;\n}\n.rank-input::-webkit-inner-spin-button, .rank-input::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.rank-separator {\n color: #999;\n font-size: 12px;\n font-weight: 500;\n}\n\n.filter-actions {\n margin-top: 24px;\n padding-top: 16px;\n border-top: 1px solid #f0f0f0;\n}\n.filter-actions .reset-btn {\n width: 100%;\n padding: 10px 16px;\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n color: #6c757d;\n font-size: 14px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: all 0.2s;\n}\n.filter-actions .reset-btn:hover {\n background: #e9ecef;\n border-color: #ced4da;\n color: #495057;\n}\n\n.content-area {\n height: 100%;\n padding: 24px;\n overflow-y: auto;\n background: #f5f7fa;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: #6c757d;\n}\n.empty-state i {\n margin-bottom: 24px;\n opacity: 0.3;\n}\n.empty-state h3 {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: #495057;\n}\n.empty-state p {\n margin: 0 0 24px 0;\n font-size: 16px;\n}\n\n.model-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));\n gap: 20px;\n}\n\n.model-card {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n transition: all 0.3s ease;\n overflow: hidden;\n}\n\n.model-card:hover {\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n transform: translateY(-2px);\n}\n\n.model-card.expanded {\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);\n}\n\n.card-header {\n padding: 20px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n cursor: pointer;\n user-select: none;\n border-bottom: 1px solid #f0f4f8;\n}\n\n.model-info {\n display: flex;\n gap: 16px;\n flex: 1;\n}\n\n.model-icon {\n width: 48px;\n height: 48px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: #17a2b8;\n}\n\n.model-icon i {\n color: white;\n font-size: 20px;\n}\n\n.model-details {\n flex: 1;\n min-width: 0;\n}\n\n.model-name {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n margin-bottom: 6px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.model-meta {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.meta-item {\n font-size: 13px;\n color: #6c757d;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.meta-item i {\n font-size: 12px;\n}\n\n.meta-item.status-active {\n color: #28a745;\n}\n\n.meta-item.status-inactive {\n color: #6c757d;\n}\n\n.expand-icon {\n font-size: 14px;\n color: #6c757d;\n transition: transform 0.3s ease;\n}\n\n.expand-icon.rotated {\n transform: rotate(180deg);\n}\n\n.card-body {\n padding: 0 20px 20px 20px;\n}\n\n.model-description {\n margin: 16px 0 0 0;\n font-size: 14px;\n line-height: 1.6;\n color: #6c757d;\n}\n\n.model-description.text-muted {\n font-style: italic;\n color: #adb5bd;\n}\n\n/* Expanded Content */\n.expanded-content {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #f0f4f8;\n animation: slideDown 0.3s ease;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n.model-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 16px;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat-label {\n font-size: 12px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat-value {\n font-size: 14px;\n color: #495057;\n font-weight: 500;\n}\n\n/* Card Actions */\n.card-actions {\n padding: 16px 20px;\n background: #f8f9fa;\n border-top: 1px solid #e0e6ed;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.action-btn {\n background: white;\n border: 1px solid #dee2e6;\n padding: 6px 16px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-btn:hover {\n background: #f8f9fa;\n border-color: #ced4da;\n}\n\n.action-btn-primary {\n background: #17a2b8;\n border-color: #17a2b8;\n color: white;\n}\n\n.action-btn-primary:hover {\n background: #1485a3;\n border-color: #1485a3;\n}\n\n.model-list {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid #e0e6ed;\n overflow: hidden;\n}\n\n.data-table {\n width: 100%;\n border-collapse: collapse;\n}\n.data-table thead {\n background-color: #f8f9fa;\n}\n.data-table thead tr {\n border-bottom: 2px solid #dee2e6;\n}\n.data-table thead th {\n padding: 12px 16px;\n text-align: left;\n font-size: 13px;\n font-weight: 600;\n color: #495057;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n.data-table tbody tr {\n border-bottom: 1px solid #e9ecef;\n transition: background-color 0.2s ease;\n}\n.data-table tbody tr:hover {\n background-color: #f8f9fa;\n}\n.data-table tbody tr:last-child {\n border-bottom: none;\n}\n.data-table tbody td {\n padding: 16px;\n font-size: 14px;\n color: #495057;\n}\n\n.name-cell {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n color: #2c3e50;\n}\n.name-cell i {\n color: #17a2b8;\n}\n\n.rank-badge {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n background-color: #f8f9fa;\n}\n.rank-badge.rank-high {\n background-color: #d4edda;\n color: #155724;\n}\n.rank-badge.rank-medium {\n background-color: #fff3cd;\n color: #856404;\n}\n.rank-badge.rank-low {\n background-color: #f8d7da;\n color: #721c24;\n}\n.rank-badge.rank-none {\n background-color: #e9ecef;\n color: #6c757d;\n}\n\n.status-badge {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n}\n.status-badge.active {\n background-color: #d4edda;\n color: #155724;\n}\n.status-badge.inactive {\n background-color: #f8d7da;\n color: #721c24;\n}\n\n@media (max-width: 768px) {\n .model-header {\n flex-wrap: wrap;\n gap: 16px;\n }\n .header-right {\n width: 100%;\n justify-content: space-between;\n }\n .model-grid {\n grid-template-columns: 1fr;\n }\n .stats-grid,\n .ranks-grid {\n grid-template-columns: 1fr;\n }\n}\n"] }]
979
+ }], () => [{ type: i1.SharedService }, { type: i1.NavigationService }], null); })();
980
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ModelManagementV2Component, { className: "ModelManagementV2Component", filePath: "src/AI/components/models/model-management-v2.component.ts", lineNumber: 35 }); })();
999
981
  //# sourceMappingURL=model-management-v2.component.js.map