@memberjunction/ng-dashboards 2.127.0 → 2.129.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +34 -1
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +419 -109
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.d.ts +1 -1
  6. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  7. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +1 -1
  8. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  9. package/dist/AI/components/agents/agent-filter-panel.component.js +3 -3
  10. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  11. package/dist/AI/components/execution-monitoring.component.d.ts +1 -1
  12. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  13. package/dist/AI/components/execution-monitoring.component.js +3 -3
  14. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  15. package/dist/AI/components/models/{model-management-v2.component.d.ts → model-management.component.d.ts} +21 -5
  16. package/dist/AI/components/models/model-management.component.d.ts.map +1 -0
  17. package/dist/AI/components/models/model-management.component.js +1283 -0
  18. package/dist/AI/components/models/model-management.component.js.map +1 -0
  19. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -1
  20. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  21. package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
  22. package/dist/AI/components/prompts/{prompt-management-v2.component.d.ts → prompt-management.component.d.ts} +30 -5
  23. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -0
  24. package/dist/AI/components/prompts/prompt-management.component.js +1079 -0
  25. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -0
  26. package/dist/AI/components/prompts/prompt-version-control.component.d.ts +2 -1
  27. package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
  28. package/dist/AI/components/prompts/prompt-version-control.component.js +1 -1
  29. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  30. package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
  31. package/dist/AI/components/system/system-configuration.component.d.ts +55 -11
  32. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  33. package/dist/AI/components/system/system-configuration.component.js +790 -131
  34. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  35. package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -1
  36. package/dist/AI/components/widgets/kpi-card.component.js +3 -3
  37. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  38. package/dist/AI/index.d.ts +2 -2
  39. package/dist/AI/index.d.ts.map +1 -1
  40. package/dist/AI/index.js +2 -2
  41. package/dist/AI/index.js.map +1 -1
  42. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -6
  43. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  44. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  45. package/dist/Communication/communication-dashboard.component.d.ts +2 -0
  46. package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
  47. package/dist/Communication/communication-dashboard.component.js +5 -2
  48. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  49. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +3 -2
  50. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  51. package/dist/ComponentStudio/component-studio-dashboard.component.js +7 -3
  52. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  53. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts +44 -0
  54. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts.map +1 -0
  55. package/dist/Credentials/components/credential-category-edit-panel.component.js +456 -0
  56. package/dist/Credentials/components/credential-category-edit-panel.component.js.map +1 -0
  57. package/dist/Credentials/components/credential-edit-panel.component.d.ts +70 -0
  58. package/dist/Credentials/components/credential-edit-panel.component.d.ts.map +1 -0
  59. package/dist/Credentials/components/credential-edit-panel.component.js +694 -0
  60. package/dist/Credentials/components/credential-edit-panel.component.js.map +1 -0
  61. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts +56 -0
  62. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts.map +1 -0
  63. package/dist/Credentials/components/credential-type-edit-panel.component.js +563 -0
  64. package/dist/Credentials/components/credential-type-edit-panel.component.js.map +1 -0
  65. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +81 -0
  66. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -0
  67. package/dist/Credentials/components/credentials-audit-resource.component.js +864 -0
  68. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -0
  69. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +61 -0
  70. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -0
  71. package/dist/Credentials/components/credentials-categories-resource.component.js +816 -0
  72. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -0
  73. package/dist/Credentials/components/credentials-list-resource.component.d.ts +83 -0
  74. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -0
  75. package/dist/Credentials/components/credentials-list-resource.component.js +1253 -0
  76. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -0
  77. package/dist/Credentials/components/credentials-overview-resource.component.d.ts +99 -0
  78. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -0
  79. package/dist/Credentials/components/credentials-overview-resource.component.js +936 -0
  80. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -0
  81. package/dist/Credentials/components/credentials-types-resource.component.d.ts +70 -0
  82. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -0
  83. package/dist/Credentials/components/credentials-types-resource.component.js +868 -0
  84. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -0
  85. package/dist/Credentials/credentials-dashboard.component.d.ts +37 -0
  86. package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -0
  87. package/dist/Credentials/credentials-dashboard.component.js +290 -0
  88. package/dist/Credentials/credentials-dashboard.component.js.map +1 -0
  89. package/dist/Credentials/index.d.ts +7 -0
  90. package/dist/Credentials/index.d.ts.map +1 -0
  91. package/dist/Credentials/index.js +9 -0
  92. package/dist/Credentials/index.js.map +1 -0
  93. package/dist/Credentials/pipes/group-by.pipe.d.ts +13 -0
  94. package/dist/Credentials/pipes/group-by.pipe.d.ts.map +1 -0
  95. package/dist/Credentials/pipes/group-by.pipe.js +29 -0
  96. package/dist/Credentials/pipes/group-by.pipe.js.map +1 -0
  97. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +2 -2
  98. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts +3 -3
  99. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +1 -1
  100. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +50 -19
  101. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +1 -1
  102. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +17 -1
  103. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  104. package/dist/DataExplorer/components/view-selector/view-selector.component.js +77 -45
  105. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  106. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +36 -0
  107. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  108. package/dist/DataExplorer/data-explorer-dashboard.component.js +552 -368
  109. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  110. package/dist/DataExplorer/services/explorer-state.service.d.ts +5 -5
  111. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  112. package/dist/DataExplorer/services/explorer-state.service.js +125 -151
  113. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  114. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +15 -19
  115. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  116. package/dist/EntityAdmin/entity-admin-dashboard.component.js +70 -26
  117. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  118. package/dist/Home/home-dashboard.component.d.ts +6 -5
  119. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  120. package/dist/Home/home-dashboard.component.js +174 -166
  121. package/dist/Home/home-dashboard.component.js.map +1 -1
  122. package/dist/Scheduling/scheduling-dashboard.component.d.ts +2 -0
  123. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  124. package/dist/Scheduling/scheduling-dashboard.component.js +5 -2
  125. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  126. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  127. package/dist/Scheduling/services/scheduling-instrumentation.service.js +4 -2
  128. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  129. package/dist/SystemDiagnostics/index.d.ts +2 -0
  130. package/dist/SystemDiagnostics/index.d.ts.map +1 -0
  131. package/dist/SystemDiagnostics/index.js +3 -0
  132. package/dist/SystemDiagnostics/index.js.map +1 -0
  133. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +497 -0
  134. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -0
  135. package/dist/SystemDiagnostics/system-diagnostics.component.js +6063 -0
  136. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -0
  137. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  138. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  139. package/dist/Testing/testing-dashboard.component.js +5 -2
  140. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  141. package/dist/module.d.ts +103 -94
  142. package/dist/module.d.ts.map +1 -1
  143. package/dist/module.js +94 -29
  144. package/dist/module.js.map +1 -1
  145. package/dist/public-api.d.ts +3 -1
  146. package/dist/public-api.d.ts.map +1 -1
  147. package/dist/public-api.js +21 -1
  148. package/dist/public-api.js.map +1 -1
  149. package/package.json +28 -25
  150. package/dist/AI/components/models/model-management-v2.component.d.ts.map +0 -1
  151. package/dist/AI/components/models/model-management-v2.component.js +0 -981
  152. package/dist/AI/components/models/model-management-v2.component.js.map +0 -1
  153. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +0 -1
  154. package/dist/AI/components/prompts/prompt-management-v2.component.js +0 -811
  155. package/dist/AI/components/prompts/prompt-management-v2.component.js.map +0 -1
  156. package/dist/EntityAdmin/components/entity-details.component.d.ts +0 -50
  157. package/dist/EntityAdmin/components/entity-details.component.d.ts.map +0 -1
  158. package/dist/EntityAdmin/components/entity-details.component.js +0 -680
  159. package/dist/EntityAdmin/components/entity-details.component.js.map +0 -1
  160. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts +0 -31
  161. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts.map +0 -1
  162. package/dist/EntityAdmin/components/entity-filter-panel.component.js +0 -160
  163. package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +0 -1
  164. package/dist/EntityAdmin/components/erd-composite.component.d.ts +0 -73
  165. package/dist/EntityAdmin/components/erd-composite.component.d.ts.map +0 -1
  166. package/dist/EntityAdmin/components/erd-composite.component.js +0 -271
  167. package/dist/EntityAdmin/components/erd-composite.component.js.map +0 -1
  168. package/dist/EntityAdmin/components/erd-diagram.component.d.ts +0 -47
  169. package/dist/EntityAdmin/components/erd-diagram.component.d.ts.map +0 -1
  170. package/dist/EntityAdmin/components/erd-diagram.component.js +0 -618
  171. package/dist/EntityAdmin/components/erd-diagram.component.js.map +0 -1
@@ -0,0 +1,1283 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Component } from '@angular/core';
8
+ import { Subject, BehaviorSubject } from 'rxjs';
9
+ import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
10
+ import { Metadata, CompositeKey } from '@memberjunction/core';
11
+ import { AIEngineBase } from '@memberjunction/ai-engine-base';
12
+ import { BaseResourceComponent } from '@memberjunction/ng-shared';
13
+ import { RegisterClass } from '@memberjunction/global';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@memberjunction/ng-shared";
16
+ import * as i2 from "@angular/forms";
17
+ import * as i3 from "@progress/kendo-angular-layout";
18
+ import * as i4 from "@memberjunction/ng-shared-generic";
19
+ import * as i5 from "@angular/common";
20
+ const _forTrack0 = ($index, $item) => $item.value;
21
+ const _forTrack1 = ($index, $item) => $item.ID;
22
+ function ModelManagementComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
23
+ i0.ɵɵelementStart(0, "div", 1);
24
+ i0.ɵɵelement(1, "mj-loading", 2);
25
+ i0.ɵɵelementEnd();
26
+ } if (rf & 2) {
27
+ const ctx_r0 = i0.ɵɵnextContext();
28
+ i0.ɵɵadvance();
29
+ i0.ɵɵproperty("text", ctx_r0.currentLoadingMessage);
30
+ } }
31
+ function ModelManagementComponent_Conditional_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
32
+ i0.ɵɵtext(0, " Hide Filters ");
33
+ } }
34
+ function ModelManagementComponent_Conditional_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵtext(0, " Show Filters ");
36
+ } }
37
+ function ModelManagementComponent_Conditional_2_Conditional_21_For_24_Template(rf, ctx) { if (rf & 1) {
38
+ i0.ɵɵelementStart(0, "option", 38);
39
+ i0.ɵɵtext(1);
40
+ i0.ɵɵelementEnd();
41
+ } if (rf & 2) {
42
+ const option_r4 = ctx.$implicit;
43
+ i0.ɵɵproperty("value", option_r4.value);
44
+ i0.ɵɵadvance();
45
+ i0.ɵɵtextInterpolate(option_r4.label);
46
+ } }
47
+ function ModelManagementComponent_Conditional_2_Conditional_21_For_33_Template(rf, ctx) { if (rf & 1) {
48
+ i0.ɵɵelementStart(0, "option", 38);
49
+ i0.ɵɵtext(1);
50
+ i0.ɵɵelementEnd();
51
+ } if (rf & 2) {
52
+ const vendor_r5 = ctx.$implicit;
53
+ i0.ɵɵproperty("value", vendor_r5.ID);
54
+ i0.ɵɵadvance();
55
+ i0.ɵɵtextInterpolate(vendor_r5.Name);
56
+ } }
57
+ function ModelManagementComponent_Conditional_2_Conditional_21_For_42_Template(rf, ctx) { if (rf & 1) {
58
+ i0.ɵɵelementStart(0, "option", 38);
59
+ i0.ɵɵtext(1);
60
+ i0.ɵɵelementEnd();
61
+ } if (rf & 2) {
62
+ const type_r6 = ctx.$implicit;
63
+ i0.ɵɵproperty("value", type_r6.ID);
64
+ i0.ɵɵadvance();
65
+ i0.ɵɵtextInterpolate(type_r6.Name);
66
+ } }
67
+ function ModelManagementComponent_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
68
+ const _r3 = i0.ɵɵgetCurrentView();
69
+ i0.ɵɵelementStart(0, "kendo-splitter-pane", 19)(1, "div", 24)(2, "div", 25)(3, "h3");
70
+ i0.ɵɵtext(4, "Model Filters");
71
+ i0.ɵɵelementEnd();
72
+ i0.ɵɵelementStart(5, "div", 26)(6, "span", 27);
73
+ i0.ɵɵtext(7);
74
+ i0.ɵɵelementEnd();
75
+ i0.ɵɵelementStart(8, "span", 28);
76
+ i0.ɵɵtext(9);
77
+ i0.ɵɵelementEnd()();
78
+ i0.ɵɵelementStart(10, "button", 29);
79
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_21_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.toggleFilterPanel()); });
80
+ i0.ɵɵelement(11, "span", 30);
81
+ i0.ɵɵelementEnd()();
82
+ i0.ɵɵelementStart(12, "div", 31)(13, "div", 32)(14, "label", 33);
83
+ i0.ɵɵelement(15, "span", 34);
84
+ i0.ɵɵtext(16, " Name ");
85
+ i0.ɵɵelementEnd();
86
+ i0.ɵɵelementStart(17, "input", 35);
87
+ i0.ɵɵlistener("input", function ModelManagementComponent_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)); });
88
+ i0.ɵɵelementEnd()();
89
+ i0.ɵɵelementStart(18, "div", 32)(19, "label", 33);
90
+ i0.ɵɵelement(20, "span", 36);
91
+ i0.ɵɵtext(21, " Sort By ");
92
+ i0.ɵɵelementEnd();
93
+ i0.ɵɵelementStart(22, "select", 37);
94
+ i0.ɵɵlistener("change", function ModelManagementComponent_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)); });
95
+ i0.ɵɵrepeaterCreate(23, ModelManagementComponent_Conditional_2_Conditional_21_For_24_Template, 2, 2, "option", 38, _forTrack0);
96
+ i0.ɵɵelementEnd()();
97
+ i0.ɵɵelementStart(25, "div", 32)(26, "label", 33);
98
+ i0.ɵɵelement(27, "span", 39);
99
+ i0.ɵɵtext(28, " Vendor ");
100
+ i0.ɵɵelementEnd();
101
+ i0.ɵɵelementStart(29, "select", 37);
102
+ i0.ɵɵlistener("change", function ModelManagementComponent_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)); });
103
+ i0.ɵɵelementStart(30, "option", 40);
104
+ i0.ɵɵtext(31, "All Vendors");
105
+ i0.ɵɵelementEnd();
106
+ i0.ɵɵrepeaterCreate(32, ModelManagementComponent_Conditional_2_Conditional_21_For_33_Template, 2, 2, "option", 38, _forTrack1);
107
+ i0.ɵɵelementEnd()();
108
+ i0.ɵɵelementStart(34, "div", 32)(35, "label", 33);
109
+ i0.ɵɵelement(36, "span", 6);
110
+ i0.ɵɵtext(37, " Type ");
111
+ i0.ɵɵelementEnd();
112
+ i0.ɵɵelementStart(38, "select", 37);
113
+ i0.ɵɵlistener("change", function ModelManagementComponent_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)); });
114
+ i0.ɵɵelementStart(39, "option", 40);
115
+ i0.ɵɵtext(40, "All Types");
116
+ i0.ɵɵelementEnd();
117
+ i0.ɵɵrepeaterCreate(41, ModelManagementComponent_Conditional_2_Conditional_21_For_42_Template, 2, 2, "option", 38, _forTrack1);
118
+ i0.ɵɵelementEnd()();
119
+ i0.ɵɵelementStart(43, "div", 32)(44, "label", 33);
120
+ i0.ɵɵelement(45, "span", 41);
121
+ i0.ɵɵtext(46, " Status ");
122
+ i0.ɵɵelementEnd();
123
+ i0.ɵɵelementStart(47, "select", 37);
124
+ i0.ɵɵlistener("change", function ModelManagementComponent_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)); });
125
+ i0.ɵɵelementStart(48, "option", 40);
126
+ i0.ɵɵtext(49, "All Statuses");
127
+ i0.ɵɵelementEnd();
128
+ i0.ɵɵelementStart(50, "option", 42);
129
+ i0.ɵɵtext(51, "Active");
130
+ i0.ɵɵelementEnd();
131
+ i0.ɵɵelementStart(52, "option", 43);
132
+ i0.ɵɵtext(53, "Inactive");
133
+ i0.ɵɵelementEnd()()();
134
+ i0.ɵɵelementStart(54, "div", 32)(55, "label", 33);
135
+ i0.ɵɵelement(56, "span", 44);
136
+ i0.ɵɵtext(57, " Power Rank ");
137
+ i0.ɵɵelementEnd();
138
+ i0.ɵɵelementStart(58, "div", 45)(59, "input", 46);
139
+ i0.ɵɵtwoWayListener("ngModelChange", function ModelManagementComponent_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); });
140
+ i0.ɵɵlistener("change", function ModelManagementComponent_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")); });
141
+ i0.ɵɵelementEnd();
142
+ i0.ɵɵelementStart(60, "span", 47);
143
+ i0.ɵɵtext(61, "-");
144
+ i0.ɵɵelementEnd();
145
+ i0.ɵɵelementStart(62, "input", 48);
146
+ i0.ɵɵtwoWayListener("ngModelChange", function ModelManagementComponent_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); });
147
+ i0.ɵɵlistener("change", function ModelManagementComponent_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")); });
148
+ i0.ɵɵelementEnd()()();
149
+ i0.ɵɵelementStart(63, "div", 49)(64, "button", 50);
150
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_21_Template_button_click_64_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.clearFilters()); });
151
+ i0.ɵɵelement(65, "span", 51);
152
+ i0.ɵɵtext(66, " Reset Filters ");
153
+ i0.ɵɵelementEnd()()()()();
154
+ } if (rf & 2) {
155
+ const ctx_r0 = i0.ɵɵnextContext(2);
156
+ i0.ɵɵadvance(7);
157
+ i0.ɵɵtextInterpolate(ctx_r0.filteredModels.length);
158
+ i0.ɵɵadvance(2);
159
+ i0.ɵɵtextInterpolate1("of ", ctx_r0.models.length, "");
160
+ i0.ɵɵadvance(8);
161
+ i0.ɵɵproperty("value", ctx_r0.searchTerm);
162
+ i0.ɵɵadvance(5);
163
+ i0.ɵɵproperty("value", ctx_r0.sortBy);
164
+ i0.ɵɵadvance();
165
+ i0.ɵɵrepeater(ctx_r0.sortOptions);
166
+ i0.ɵɵadvance(6);
167
+ i0.ɵɵproperty("value", ctx_r0.selectedVendor);
168
+ i0.ɵɵadvance(3);
169
+ i0.ɵɵrepeater(ctx_r0.vendors);
170
+ i0.ɵɵadvance(6);
171
+ i0.ɵɵproperty("value", ctx_r0.selectedType);
172
+ i0.ɵɵadvance(3);
173
+ i0.ɵɵrepeater(ctx_r0.modelTypes);
174
+ i0.ɵɵadvance(6);
175
+ i0.ɵɵproperty("value", ctx_r0.selectedStatus);
176
+ i0.ɵɵadvance(12);
177
+ i0.ɵɵproperty("max", ctx_r0.maxPowerRank);
178
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r0.powerRankRange.min);
179
+ i0.ɵɵadvance(3);
180
+ i0.ɵɵproperty("max", ctx_r0.maxPowerRank);
181
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r0.powerRankRange.max);
182
+ } }
183
+ function ModelManagementComponent_Conditional_2_Conditional_24_Conditional_6_Template(rf, ctx) { if (rf & 1) {
184
+ const _r7 = i0.ɵɵgetCurrentView();
185
+ i0.ɵɵelementStart(0, "button", 54);
186
+ i0.ɵɵlistener("click", function ModelManagementComponent_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()); });
187
+ i0.ɵɵelement(1, "i", 17);
188
+ i0.ɵɵtext(2, " Create First Model ");
189
+ i0.ɵɵelementEnd();
190
+ } }
191
+ function ModelManagementComponent_Conditional_2_Conditional_24_Template(rf, ctx) { if (rf & 1) {
192
+ i0.ɵɵelementStart(0, "div", 21);
193
+ i0.ɵɵelement(1, "i", 52);
194
+ i0.ɵɵelementStart(2, "h3");
195
+ i0.ɵɵtext(3, "No models found");
196
+ i0.ɵɵelementEnd();
197
+ i0.ɵɵelementStart(4, "p");
198
+ i0.ɵɵtext(5);
199
+ i0.ɵɵelementEnd();
200
+ i0.ɵɵtemplate(6, ModelManagementComponent_Conditional_2_Conditional_24_Conditional_6_Template, 3, 0, "button", 53);
201
+ i0.ɵɵelementEnd();
202
+ } if (rf & 2) {
203
+ const ctx_r0 = i0.ɵɵnextContext(2);
204
+ i0.ɵɵadvance(5);
205
+ i0.ɵɵtextInterpolate(ctx_r0.hasActiveFilters ? "Try adjusting your filters" : "Create your first AI model to get started");
206
+ i0.ɵɵadvance();
207
+ i0.ɵɵconditional(!ctx_r0.hasActiveFilters ? 6 : -1);
208
+ } }
209
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
210
+ i0.ɵɵelementStart(0, "span", 65);
211
+ i0.ɵɵelement(1, "i", 39);
212
+ i0.ɵɵtext(2);
213
+ i0.ɵɵelementEnd();
214
+ } if (rf & 2) {
215
+ const model_r9 = i0.ɵɵnextContext().$implicit;
216
+ i0.ɵɵadvance(2);
217
+ i0.ɵɵtextInterpolate1(" ", model_r9.Vendor, " ");
218
+ } }
219
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
220
+ i0.ɵɵelementStart(0, "span", 65);
221
+ i0.ɵɵelement(1, "i", 6);
222
+ i0.ɵɵtext(2);
223
+ i0.ɵɵelementEnd();
224
+ } if (rf & 2) {
225
+ const model_r9 = i0.ɵɵnextContext().$implicit;
226
+ i0.ɵɵadvance(2);
227
+ i0.ɵɵtextInterpolate1(" ", model_r9.AIModelType, " ");
228
+ } }
229
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
230
+ i0.ɵɵelementStart(0, "span", 66);
231
+ i0.ɵɵelement(1, "i", 76);
232
+ i0.ɵɵtext(2, " Active ");
233
+ i0.ɵɵelementEnd();
234
+ } }
235
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
236
+ i0.ɵɵelementStart(0, "span", 67);
237
+ i0.ɵɵelement(1, "i", 76);
238
+ i0.ɵɵtext(2, " Inactive ");
239
+ i0.ɵɵelementEnd();
240
+ } }
241
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_15_Template(rf, ctx) { if (rf & 1) {
242
+ i0.ɵɵelementStart(0, "p", 70);
243
+ i0.ɵɵtext(1);
244
+ i0.ɵɵelementEnd();
245
+ } if (rf & 2) {
246
+ const model_r9 = i0.ɵɵnextContext().$implicit;
247
+ i0.ɵɵadvance();
248
+ i0.ɵɵtextInterpolate(model_r9.Description);
249
+ } }
250
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
251
+ i0.ɵɵelementStart(0, "p", 71);
252
+ i0.ɵɵtext(1, "No description provided");
253
+ i0.ɵɵelementEnd();
254
+ } }
255
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_17_Template(rf, ctx) { if (rf & 1) {
256
+ i0.ɵɵelementStart(0, "div", 78)(1, "span", 79);
257
+ i0.ɵɵtext(2, "Token Limit");
258
+ i0.ɵɵelementEnd();
259
+ i0.ɵɵelementStart(3, "span", 80);
260
+ i0.ɵɵtext(4);
261
+ i0.ɵɵelementEnd()();
262
+ } if (rf & 2) {
263
+ const model_r9 = i0.ɵɵnextContext(2).$implicit;
264
+ const ctx_r0 = i0.ɵɵnextContext(4);
265
+ i0.ɵɵadvance(4);
266
+ i0.ɵɵtextInterpolate(ctx_r0.formatTokenLimit(model_r9.InputTokenLimit));
267
+ } }
268
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_18_Template(rf, ctx) { if (rf & 1) {
269
+ i0.ɵɵelementStart(0, "div", 78)(1, "span", 79);
270
+ i0.ɵɵtext(2, "API Name");
271
+ i0.ɵɵelementEnd();
272
+ i0.ɵɵelementStart(3, "span", 80);
273
+ i0.ɵɵtext(4);
274
+ i0.ɵɵelementEnd()();
275
+ } if (rf & 2) {
276
+ const model_r9 = i0.ɵɵnextContext(2).$implicit;
277
+ i0.ɵɵadvance(4);
278
+ i0.ɵɵtextInterpolate(model_r9.APIName);
279
+ } }
280
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_19_Template(rf, ctx) { if (rf & 1) {
281
+ i0.ɵɵelementStart(0, "div", 78)(1, "span", 79);
282
+ i0.ɵɵtext(2, "Driver");
283
+ i0.ɵɵelementEnd();
284
+ i0.ɵɵelementStart(3, "span", 80);
285
+ i0.ɵɵtext(4);
286
+ i0.ɵɵelementEnd()();
287
+ } if (rf & 2) {
288
+ const model_r9 = i0.ɵɵnextContext(2).$implicit;
289
+ i0.ɵɵadvance(4);
290
+ i0.ɵɵtextInterpolate(model_r9.DriverClass);
291
+ } }
292
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
293
+ i0.ɵɵelementStart(0, "div", 72)(1, "div", 77)(2, "div", 78)(3, "span", 79);
294
+ i0.ɵɵtext(4, "Power Rank");
295
+ i0.ɵɵelementEnd();
296
+ i0.ɵɵelementStart(5, "span", 80);
297
+ i0.ɵɵtext(6);
298
+ i0.ɵɵelementEnd()();
299
+ i0.ɵɵelementStart(7, "div", 78)(8, "span", 79);
300
+ i0.ɵɵtext(9, "Speed Rank");
301
+ i0.ɵɵelementEnd();
302
+ i0.ɵɵelementStart(10, "span", 80);
303
+ i0.ɵɵtext(11);
304
+ i0.ɵɵelementEnd()();
305
+ i0.ɵɵelementStart(12, "div", 78)(13, "span", 79);
306
+ i0.ɵɵtext(14, "Cost Rank");
307
+ i0.ɵɵelementEnd();
308
+ i0.ɵɵelementStart(15, "span", 80);
309
+ i0.ɵɵtext(16);
310
+ i0.ɵɵelementEnd()();
311
+ i0.ɵɵtemplate(17, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_17_Template, 5, 1, "div", 78)(18, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_18_Template, 5, 1, "div", 78)(19, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_19_Template, 5, 1, "div", 78);
312
+ i0.ɵɵelementEnd()();
313
+ } if (rf & 2) {
314
+ const model_r9 = i0.ɵɵnextContext().$implicit;
315
+ const ctx_r0 = i0.ɵɵnextContext(4);
316
+ i0.ɵɵadvance(6);
317
+ i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r9.PowerRank, "power"));
318
+ i0.ɵɵadvance(5);
319
+ i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r9.SpeedRank, "speed"));
320
+ i0.ɵɵadvance(5);
321
+ i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r9.CostRank, "cost"));
322
+ i0.ɵɵadvance();
323
+ i0.ɵɵconditional(model_r9.InputTokenLimit ? 17 : -1);
324
+ i0.ɵɵadvance();
325
+ i0.ɵɵconditional(model_r9.APIName ? 18 : -1);
326
+ i0.ɵɵadvance();
327
+ i0.ɵɵconditional(model_r9.DriverClass ? 19 : -1);
328
+ } }
329
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Template(rf, ctx) { if (rf & 1) {
330
+ const _r8 = i0.ɵɵgetCurrentView();
331
+ i0.ɵɵelementStart(0, "div", 58)(1, "div", 59);
332
+ i0.ɵɵlistener("click", function ModelManagementComponent_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)); });
333
+ i0.ɵɵelementStart(2, "div", 60)(3, "div", 61);
334
+ i0.ɵɵelement(4, "i");
335
+ i0.ɵɵelementEnd();
336
+ i0.ɵɵelementStart(5, "div", 62)(6, "h4", 63);
337
+ i0.ɵɵtext(7);
338
+ i0.ɵɵelementEnd();
339
+ i0.ɵɵelementStart(8, "div", 64);
340
+ i0.ɵɵtemplate(9, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Template, 3, 1, "span", 65)(10, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_10_Template, 3, 1, "span", 65)(11, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_11_Template, 3, 0, "span", 66)(12, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_12_Template, 3, 0, "span", 67);
341
+ i0.ɵɵelementEnd()()();
342
+ i0.ɵɵelement(13, "i", 68);
343
+ i0.ɵɵelementEnd();
344
+ i0.ɵɵelementStart(14, "div", 69);
345
+ i0.ɵɵtemplate(15, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_15_Template, 2, 1, "p", 70)(16, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_16_Template, 2, 0, "p", 71)(17, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Template, 20, 6, "div", 72);
346
+ i0.ɵɵelementEnd();
347
+ i0.ɵɵelementStart(18, "div", 73)(19, "button", 74);
348
+ i0.ɵɵlistener("click", function ModelManagementComponent_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); return i0.ɵɵresetView(ctx_r0.showModelDetails(model_r9, $event)); });
349
+ i0.ɵɵelement(20, "i", 75);
350
+ i0.ɵɵtext(21, " Details ");
351
+ i0.ɵɵelementEnd()()();
352
+ } if (rf & 2) {
353
+ const model_r9 = ctx.$implicit;
354
+ const ctx_r0 = i0.ɵɵnextContext(4);
355
+ i0.ɵɵclassProp("expanded", ctx_r0.expandedModelId === model_r9.ID);
356
+ i0.ɵɵadvance(4);
357
+ i0.ɵɵclassMap(ctx_r0.getModelIcon(model_r9));
358
+ i0.ɵɵadvance(3);
359
+ i0.ɵɵtextInterpolate(model_r9.Name || "Unnamed Model");
360
+ i0.ɵɵadvance(2);
361
+ i0.ɵɵconditional(model_r9.Vendor ? 9 : -1);
362
+ i0.ɵɵadvance();
363
+ i0.ɵɵconditional(model_r9.AIModelType ? 10 : -1);
364
+ i0.ɵɵadvance();
365
+ i0.ɵɵconditional(model_r9.IsActive ? 11 : 12);
366
+ i0.ɵɵadvance(2);
367
+ i0.ɵɵclassProp("rotated", ctx_r0.expandedModelId === model_r9.ID);
368
+ i0.ɵɵadvance(2);
369
+ i0.ɵɵconditional(model_r9.Description ? 15 : 16);
370
+ i0.ɵɵadvance(2);
371
+ i0.ɵɵconditional(ctx_r0.expandedModelId === model_r9.ID ? 17 : -1);
372
+ } }
373
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_Template(rf, ctx) { if (rf & 1) {
374
+ i0.ɵɵelementStart(0, "div", 55);
375
+ i0.ɵɵrepeaterCreate(1, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Template, 22, 12, "div", 57, _forTrack1);
376
+ i0.ɵɵelementEnd();
377
+ } if (rf & 2) {
378
+ const ctx_r0 = i0.ɵɵnextContext(3);
379
+ i0.ɵɵadvance();
380
+ i0.ɵɵrepeater(ctx_r0.filteredModels);
381
+ } }
382
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_For_34_Template(rf, ctx) { if (rf & 1) {
383
+ const _r11 = i0.ɵɵgetCurrentView();
384
+ i0.ɵɵelementStart(0, "tr")(1, "td")(2, "div", 85);
385
+ i0.ɵɵelement(3, "i");
386
+ i0.ɵɵtext(4);
387
+ i0.ɵɵelementEnd()();
388
+ i0.ɵɵelementStart(5, "td");
389
+ i0.ɵɵtext(6);
390
+ i0.ɵɵelementEnd();
391
+ i0.ɵɵelementStart(7, "td");
392
+ i0.ɵɵtext(8);
393
+ i0.ɵɵelementEnd();
394
+ i0.ɵɵelementStart(9, "td")(10, "span", 86);
395
+ i0.ɵɵtext(11);
396
+ i0.ɵɵelementEnd()();
397
+ i0.ɵɵelementStart(12, "td")(13, "span", 86);
398
+ i0.ɵɵtext(14);
399
+ i0.ɵɵelementEnd()();
400
+ i0.ɵɵelementStart(15, "td")(16, "span", 86);
401
+ i0.ɵɵtext(17);
402
+ i0.ɵɵelementEnd()();
403
+ i0.ɵɵelementStart(18, "td")(19, "span", 87);
404
+ i0.ɵɵtext(20);
405
+ i0.ɵɵelementEnd()();
406
+ i0.ɵɵelementStart(21, "td")(22, "button", 88);
407
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_For_34_Template_button_click_22_listener() { const model_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.showModelDetails(model_r12)); });
408
+ i0.ɵɵelement(23, "i", 75);
409
+ i0.ɵɵelementEnd()()();
410
+ } if (rf & 2) {
411
+ const model_r12 = ctx.$implicit;
412
+ const ctx_r0 = i0.ɵɵnextContext(4);
413
+ i0.ɵɵadvance(3);
414
+ i0.ɵɵclassMap(ctx_r0.getModelIcon(model_r12));
415
+ i0.ɵɵadvance();
416
+ i0.ɵɵtextInterpolate1(" ", model_r12.Name || "Unnamed Model", " ");
417
+ i0.ɵɵadvance(2);
418
+ i0.ɵɵtextInterpolate(model_r12.Vendor || "-");
419
+ i0.ɵɵadvance(2);
420
+ i0.ɵɵtextInterpolate(model_r12.AIModelType);
421
+ i0.ɵɵadvance(2);
422
+ i0.ɵɵclassMap(ctx_r0.getRankClass(model_r12.PowerRank, "power"));
423
+ i0.ɵɵadvance();
424
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r12.PowerRank, "power"), " ");
425
+ i0.ɵɵadvance(2);
426
+ i0.ɵɵclassMap(ctx_r0.getRankClass(model_r12.SpeedRank, "speed"));
427
+ i0.ɵɵadvance();
428
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r12.SpeedRank, "speed"), " ");
429
+ i0.ɵɵadvance(2);
430
+ i0.ɵɵclassMap(ctx_r0.getRankClass(model_r12.CostRank, "cost"));
431
+ i0.ɵɵadvance();
432
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r12.CostRank, "cost"), " ");
433
+ i0.ɵɵadvance(2);
434
+ i0.ɵɵclassProp("active", model_r12.IsActive)("inactive", !model_r12.IsActive);
435
+ i0.ɵɵadvance();
436
+ i0.ɵɵtextInterpolate1(" ", model_r12.IsActive ? "Active" : "Inactive", " ");
437
+ } }
438
+ function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template(rf, ctx) { if (rf & 1) {
439
+ const _r10 = i0.ɵɵgetCurrentView();
440
+ i0.ɵɵelementStart(0, "div", 56)(1, "table", 81)(2, "thead")(3, "tr")(4, "th", 82);
441
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template_th_click_4_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("name")); });
442
+ i0.ɵɵelementStart(5, "span", 83);
443
+ i0.ɵɵtext(6, " Name ");
444
+ i0.ɵɵelement(7, "i", 84);
445
+ i0.ɵɵelementEnd()();
446
+ i0.ɵɵelementStart(8, "th", 82);
447
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template_th_click_8_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("vendor")); });
448
+ i0.ɵɵelementStart(9, "span", 83);
449
+ i0.ɵɵtext(10, " Vendor ");
450
+ i0.ɵɵelement(11, "i", 84);
451
+ i0.ɵɵelementEnd()();
452
+ i0.ɵɵelementStart(12, "th", 82);
453
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template_th_click_12_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("type")); });
454
+ i0.ɵɵelementStart(13, "span", 83);
455
+ i0.ɵɵtext(14, " Type ");
456
+ i0.ɵɵelement(15, "i", 84);
457
+ i0.ɵɵelementEnd()();
458
+ i0.ɵɵelementStart(16, "th", 82);
459
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template_th_click_16_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("powerRank")); });
460
+ i0.ɵɵelementStart(17, "span", 83);
461
+ i0.ɵɵtext(18, " Power ");
462
+ i0.ɵɵelement(19, "i", 84);
463
+ i0.ɵɵelementEnd()();
464
+ i0.ɵɵelementStart(20, "th", 82);
465
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template_th_click_20_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("speedRank")); });
466
+ i0.ɵɵelementStart(21, "span", 83);
467
+ i0.ɵɵtext(22, " Speed ");
468
+ i0.ɵɵelement(23, "i", 84);
469
+ i0.ɵɵelementEnd()();
470
+ i0.ɵɵelementStart(24, "th", 82);
471
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template_th_click_24_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("costRank")); });
472
+ i0.ɵɵelementStart(25, "span", 83);
473
+ i0.ɵɵtext(26, " Cost ");
474
+ i0.ɵɵelement(27, "i", 84);
475
+ i0.ɵɵelementEnd()();
476
+ i0.ɵɵelementStart(28, "th");
477
+ i0.ɵɵtext(29, "Status");
478
+ i0.ɵɵelementEnd();
479
+ i0.ɵɵelementStart(30, "th");
480
+ i0.ɵɵtext(31, "Actions");
481
+ i0.ɵɵelementEnd()()();
482
+ i0.ɵɵelementStart(32, "tbody");
483
+ i0.ɵɵrepeaterCreate(33, ModelManagementComponent_Conditional_2_Conditional_25_Case_1_For_34_Template, 24, 19, "tr", null, _forTrack1);
484
+ i0.ɵɵelementEnd()()();
485
+ } if (rf & 2) {
486
+ const ctx_r0 = i0.ɵɵnextContext(3);
487
+ i0.ɵɵadvance(4);
488
+ i0.ɵɵclassProp("sorted", ctx_r0.sortBy === "name")("desc", ctx_r0.sortBy === "name" && ctx_r0.sortDirection === "desc");
489
+ i0.ɵɵadvance(4);
490
+ i0.ɵɵclassProp("sorted", ctx_r0.sortBy === "vendor")("desc", ctx_r0.sortBy === "vendor" && ctx_r0.sortDirection === "desc");
491
+ i0.ɵɵadvance(4);
492
+ i0.ɵɵclassProp("sorted", ctx_r0.sortBy === "type")("desc", ctx_r0.sortBy === "type" && ctx_r0.sortDirection === "desc");
493
+ i0.ɵɵadvance(4);
494
+ i0.ɵɵclassProp("sorted", ctx_r0.sortBy === "powerRank")("desc", ctx_r0.sortBy === "powerRank" && ctx_r0.sortDirection === "desc");
495
+ i0.ɵɵadvance(4);
496
+ i0.ɵɵclassProp("sorted", ctx_r0.sortBy === "speedRank")("desc", ctx_r0.sortBy === "speedRank" && ctx_r0.sortDirection === "desc");
497
+ i0.ɵɵadvance(4);
498
+ i0.ɵɵclassProp("sorted", ctx_r0.sortBy === "costRank")("desc", ctx_r0.sortBy === "costRank" && ctx_r0.sortDirection === "desc");
499
+ i0.ɵɵadvance(9);
500
+ i0.ɵɵrepeater(ctx_r0.filteredModels);
501
+ } }
502
+ function ModelManagementComponent_Conditional_2_Conditional_25_Template(rf, ctx) { if (rf & 1) {
503
+ i0.ɵɵtemplate(0, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_Template, 3, 0, "div", 55)(1, ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template, 35, 24, "div", 56);
504
+ } if (rf & 2) {
505
+ let tmp_2_0;
506
+ const ctx_r0 = i0.ɵɵnextContext(2);
507
+ i0.ɵɵconditional((tmp_2_0 = ctx_r0.viewMode) === "grid" ? 0 : tmp_2_0 === "list" ? 1 : -1);
508
+ } }
509
+ function ModelManagementComponent_Conditional_2_Conditional_26_Template(rf, ctx) { if (rf & 1) {
510
+ const _r13 = i0.ɵɵgetCurrentView();
511
+ i0.ɵɵelementStart(0, "div", 89);
512
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_26_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.closeDetailPanel()); });
513
+ i0.ɵɵelementEnd();
514
+ } }
515
+ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_14_Template(rf, ctx) { if (rf & 1) {
516
+ i0.ɵɵelementStart(0, "span", 99);
517
+ i0.ɵɵelement(1, "i", 76);
518
+ i0.ɵɵtext(2, " Active ");
519
+ i0.ɵɵelementEnd();
520
+ } }
521
+ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_15_Template(rf, ctx) { if (rf & 1) {
522
+ i0.ɵɵelementStart(0, "span", 100);
523
+ i0.ɵɵelement(1, "i", 76);
524
+ i0.ɵɵtext(2, " Inactive ");
525
+ i0.ɵɵelementEnd();
526
+ } }
527
+ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_16_Template(rf, ctx) { if (rf & 1) {
528
+ i0.ɵɵelementStart(0, "span", 101);
529
+ i0.ɵɵelement(1, "i", 6);
530
+ i0.ɵɵtext(2);
531
+ i0.ɵɵelementEnd();
532
+ } if (rf & 2) {
533
+ const ctx_r0 = i0.ɵɵnextContext(3);
534
+ i0.ɵɵadvance(2);
535
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.selectedModel.AIModelType, " ");
536
+ } }
537
+ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_17_Template(rf, ctx) { if (rf & 1) {
538
+ i0.ɵɵelementStart(0, "div", 97)(1, "h4", 102);
539
+ i0.ɵɵelement(2, "i", 114);
540
+ i0.ɵɵtext(3, " Description ");
541
+ i0.ɵɵelementEnd();
542
+ i0.ɵɵelementStart(4, "p", 115);
543
+ i0.ɵɵtext(5);
544
+ i0.ɵɵelementEnd()();
545
+ } if (rf & 2) {
546
+ const ctx_r0 = i0.ɵɵnextContext(3);
547
+ i0.ɵɵadvance(5);
548
+ i0.ɵɵtextInterpolate(ctx_r0.selectedModel.Description);
549
+ } }
550
+ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_53_Template(rf, ctx) { if (rf & 1) {
551
+ i0.ɵɵelementStart(0, "div", 105)(1, "span", 106);
552
+ i0.ɵɵtext(2, "API Name");
553
+ i0.ɵɵelementEnd();
554
+ i0.ɵɵelementStart(3, "span", 109);
555
+ i0.ɵɵtext(4);
556
+ i0.ɵɵelementEnd()();
557
+ } if (rf & 2) {
558
+ const ctx_r0 = i0.ɵɵnextContext(3);
559
+ i0.ɵɵadvance(4);
560
+ i0.ɵɵtextInterpolate(ctx_r0.selectedModel.APIName);
561
+ } }
562
+ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_54_Template(rf, ctx) { if (rf & 1) {
563
+ i0.ɵɵelementStart(0, "div", 105)(1, "span", 106);
564
+ i0.ɵɵtext(2, "Input Token Limit");
565
+ i0.ɵɵelementEnd();
566
+ i0.ɵɵelementStart(3, "span", 109);
567
+ i0.ɵɵtext(4);
568
+ i0.ɵɵelementEnd()();
569
+ } if (rf & 2) {
570
+ const ctx_r0 = i0.ɵɵnextContext(3);
571
+ i0.ɵɵadvance(4);
572
+ i0.ɵɵtextInterpolate(ctx_r0.formatTokenLimit(ctx_r0.selectedModel.InputTokenLimit));
573
+ } }
574
+ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_55_Template(rf, ctx) { if (rf & 1) {
575
+ i0.ɵɵelementStart(0, "div", 105)(1, "span", 106);
576
+ i0.ɵɵtext(2, "Response Formats");
577
+ i0.ɵɵelementEnd();
578
+ i0.ɵɵelementStart(3, "span", 109);
579
+ i0.ɵɵtext(4);
580
+ i0.ɵɵelementEnd()();
581
+ } if (rf & 2) {
582
+ const ctx_r0 = i0.ɵɵnextContext(3);
583
+ i0.ɵɵadvance(4);
584
+ i0.ɵɵtextInterpolate(ctx_r0.selectedModel.SupportedResponseFormats);
585
+ } }
586
+ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_56_Template(rf, ctx) { if (rf & 1) {
587
+ i0.ɵɵelementStart(0, "div", 105)(1, "span", 106);
588
+ i0.ɵɵtext(2, "Supports Effort Level");
589
+ i0.ɵɵelementEnd();
590
+ i0.ɵɵelementStart(3, "span", 109);
591
+ i0.ɵɵtext(4, "Yes");
592
+ i0.ɵɵelementEnd()();
593
+ } }
594
+ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_57_Template(rf, ctx) { if (rf & 1) {
595
+ i0.ɵɵelementStart(0, "div", 105)(1, "span", 106);
596
+ i0.ɵɵtext(2, "Driver Class");
597
+ i0.ɵɵelementEnd();
598
+ i0.ɵɵelementStart(3, "span", 109);
599
+ i0.ɵɵtext(4);
600
+ i0.ɵɵelementEnd()();
601
+ } if (rf & 2) {
602
+ const ctx_r0 = i0.ɵɵnextContext(3);
603
+ i0.ɵɵadvance(4);
604
+ i0.ɵɵtextInterpolate(ctx_r0.selectedModel.DriverClass);
605
+ } }
606
+ function ModelManagementComponent_Conditional_2_Conditional_28_Template(rf, ctx) { if (rf & 1) {
607
+ const _r14 = i0.ɵɵgetCurrentView();
608
+ i0.ɵɵelementStart(0, "div", 90)(1, "div", 91)(2, "div", 92);
609
+ i0.ɵɵelement(3, "i");
610
+ i0.ɵɵelementEnd();
611
+ i0.ɵɵelementStart(4, "div", 93)(5, "h3");
612
+ i0.ɵɵtext(6);
613
+ i0.ɵɵelementEnd();
614
+ i0.ɵɵelementStart(7, "span", 94);
615
+ i0.ɵɵtext(8);
616
+ i0.ɵɵelementEnd()()();
617
+ i0.ɵɵelementStart(9, "button", 95);
618
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_28_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r14); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.closeDetailPanel()); });
619
+ i0.ɵɵelement(10, "i", 30);
620
+ i0.ɵɵelementEnd()();
621
+ i0.ɵɵelementStart(11, "div", 96)(12, "div", 97)(13, "div", 98);
622
+ i0.ɵɵtemplate(14, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_14_Template, 3, 0, "span", 99)(15, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_15_Template, 3, 0, "span", 100)(16, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_16_Template, 3, 1, "span", 101);
623
+ i0.ɵɵelementEnd()();
624
+ i0.ɵɵtemplate(17, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_17_Template, 6, 1, "div", 97);
625
+ i0.ɵɵelementStart(18, "div", 97)(19, "h4", 102);
626
+ i0.ɵɵelement(20, "i", 103);
627
+ i0.ɵɵtext(21, " Rankings ");
628
+ i0.ɵɵelementEnd();
629
+ i0.ɵɵelementStart(22, "div", 104)(23, "div", 105)(24, "span", 106);
630
+ i0.ɵɵtext(25, "Power Rank");
631
+ i0.ɵɵelementEnd();
632
+ i0.ɵɵelementStart(26, "span", 107);
633
+ i0.ɵɵtext(27);
634
+ i0.ɵɵelementEnd()();
635
+ i0.ɵɵelementStart(28, "div", 105)(29, "span", 106);
636
+ i0.ɵɵtext(30, "Speed Rank");
637
+ i0.ɵɵelementEnd();
638
+ i0.ɵɵelementStart(31, "span", 107);
639
+ i0.ɵɵtext(32);
640
+ i0.ɵɵelementEnd()();
641
+ i0.ɵɵelementStart(33, "div", 105)(34, "span", 106);
642
+ i0.ɵɵtext(35, "Cost Rank");
643
+ i0.ɵɵelementEnd();
644
+ i0.ɵɵelementStart(36, "span", 107);
645
+ i0.ɵɵtext(37);
646
+ i0.ɵɵelementEnd()()()();
647
+ i0.ɵɵelementStart(38, "div", 97)(39, "h4", 102);
648
+ i0.ɵɵelement(40, "i", 108);
649
+ i0.ɵɵtext(41, " Configuration ");
650
+ i0.ɵɵelementEnd();
651
+ i0.ɵɵelementStart(42, "div", 104)(43, "div", 105)(44, "span", 106);
652
+ i0.ɵɵtext(45, "Vendor");
653
+ i0.ɵɵelementEnd();
654
+ i0.ɵɵelementStart(46, "span", 109);
655
+ i0.ɵɵtext(47);
656
+ i0.ɵɵelementEnd()();
657
+ i0.ɵɵelementStart(48, "div", 105)(49, "span", 106);
658
+ i0.ɵɵtext(50, "Model Type");
659
+ i0.ɵɵelementEnd();
660
+ i0.ɵɵelementStart(51, "span", 109);
661
+ i0.ɵɵtext(52);
662
+ i0.ɵɵelementEnd()();
663
+ i0.ɵɵtemplate(53, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_53_Template, 5, 1, "div", 105)(54, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_54_Template, 5, 1, "div", 105)(55, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_55_Template, 5, 1, "div", 105)(56, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_56_Template, 5, 0, "div", 105)(57, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_57_Template, 5, 1, "div", 105);
664
+ i0.ɵɵelementEnd()();
665
+ i0.ɵɵelementStart(58, "div", 97)(59, "h4", 102);
666
+ i0.ɵɵelement(60, "i", 110);
667
+ i0.ɵɵtext(61, " Timestamps ");
668
+ i0.ɵɵelementEnd();
669
+ i0.ɵɵelementStart(62, "div", 104)(63, "div", 105)(64, "span", 106);
670
+ i0.ɵɵtext(65, "Created");
671
+ i0.ɵɵelementEnd();
672
+ i0.ɵɵelementStart(66, "span", 109);
673
+ i0.ɵɵtext(67);
674
+ i0.ɵɵpipe(68, "date");
675
+ i0.ɵɵelementEnd()();
676
+ i0.ɵɵelementStart(69, "div", 105)(70, "span", 106);
677
+ i0.ɵɵtext(71, "Updated");
678
+ i0.ɵɵelementEnd();
679
+ i0.ɵɵelementStart(72, "span", 109);
680
+ i0.ɵɵtext(73);
681
+ i0.ɵɵpipe(74, "date");
682
+ i0.ɵɵelementEnd()()()()();
683
+ i0.ɵɵelementStart(75, "div", 111)(76, "button", 112);
684
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_28_Template_button_click_76_listener() { i0.ɵɵrestoreView(_r14); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openModelFromPanel()); });
685
+ i0.ɵɵelement(77, "i", 113);
686
+ i0.ɵɵtext(78, " Open Full Record ");
687
+ i0.ɵɵelementEnd()();
688
+ } if (rf & 2) {
689
+ const ctx_r0 = i0.ɵɵnextContext(2);
690
+ i0.ɵɵadvance(3);
691
+ i0.ɵɵclassMap(ctx_r0.getModelIcon(ctx_r0.selectedModel));
692
+ i0.ɵɵadvance(3);
693
+ i0.ɵɵtextInterpolate(ctx_r0.selectedModel.Name);
694
+ i0.ɵɵadvance(2);
695
+ i0.ɵɵtextInterpolate(ctx_r0.selectedModel.Vendor || "AI Model");
696
+ i0.ɵɵadvance(6);
697
+ i0.ɵɵconditional(ctx_r0.selectedModel.IsActive ? 14 : 15);
698
+ i0.ɵɵadvance(2);
699
+ i0.ɵɵconditional(ctx_r0.selectedModel.AIModelType ? 16 : -1);
700
+ i0.ɵɵadvance();
701
+ i0.ɵɵconditional(ctx_r0.selectedModel.Description ? 17 : -1);
702
+ i0.ɵɵadvance(9);
703
+ i0.ɵɵclassMap(ctx_r0.getRankClass(ctx_r0.selectedModel.PowerRank, "power"));
704
+ i0.ɵɵadvance();
705
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(ctx_r0.selectedModel.PowerRank, "power"), " ");
706
+ i0.ɵɵadvance(4);
707
+ i0.ɵɵclassMap(ctx_r0.getRankClass(ctx_r0.selectedModel.SpeedRank, "speed"));
708
+ i0.ɵɵadvance();
709
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(ctx_r0.selectedModel.SpeedRank, "speed"), " ");
710
+ i0.ɵɵadvance(4);
711
+ i0.ɵɵclassMap(ctx_r0.getRankClass(ctx_r0.selectedModel.CostRank, "cost"));
712
+ i0.ɵɵadvance();
713
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(ctx_r0.selectedModel.CostRank, "cost"), " ");
714
+ i0.ɵɵadvance(10);
715
+ i0.ɵɵtextInterpolate(ctx_r0.selectedModel.Vendor || "Unknown");
716
+ i0.ɵɵadvance(5);
717
+ i0.ɵɵtextInterpolate(ctx_r0.selectedModel.AIModelType || "Unknown");
718
+ i0.ɵɵadvance();
719
+ i0.ɵɵconditional(ctx_r0.selectedModel.APIName ? 53 : -1);
720
+ i0.ɵɵadvance();
721
+ i0.ɵɵconditional(ctx_r0.selectedModel.InputTokenLimit ? 54 : -1);
722
+ i0.ɵɵadvance();
723
+ i0.ɵɵconditional(ctx_r0.selectedModel.SupportedResponseFormats ? 55 : -1);
724
+ i0.ɵɵadvance();
725
+ i0.ɵɵconditional(ctx_r0.selectedModel.SupportsEffortLevel ? 56 : -1);
726
+ i0.ɵɵadvance();
727
+ i0.ɵɵconditional(ctx_r0.selectedModel.DriverClass ? 57 : -1);
728
+ i0.ɵɵadvance(10);
729
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(68, 25, ctx_r0.selectedModel.__mj_CreatedAt, "medium"));
730
+ i0.ɵɵadvance(6);
731
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(74, 28, ctx_r0.selectedModel.__mj_UpdatedAt, "medium"));
732
+ } }
733
+ function ModelManagementComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
734
+ const _r2 = i0.ɵɵgetCurrentView();
735
+ i0.ɵɵelementStart(0, "div", 3)(1, "div", 4)(2, "h2", 5);
736
+ i0.ɵɵelement(3, "i", 6);
737
+ i0.ɵɵtext(4, " AI Models ");
738
+ i0.ɵɵelementEnd();
739
+ i0.ɵɵelementStart(5, "button", 7);
740
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleFilters()); });
741
+ i0.ɵɵelement(6, "i", 8);
742
+ i0.ɵɵtemplate(7, ModelManagementComponent_Conditional_2_Conditional_7_Template, 1, 0)(8, ModelManagementComponent_Conditional_2_Conditional_8_Template, 1, 0);
743
+ i0.ɵɵelementEnd();
744
+ i0.ɵɵelementStart(9, "span", 9);
745
+ i0.ɵɵtext(10);
746
+ i0.ɵɵelementEnd()();
747
+ i0.ɵɵelementStart(11, "div", 10)(12, "div", 11)(13, "button", 12);
748
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setViewMode("grid")); });
749
+ i0.ɵɵelement(14, "i", 13);
750
+ i0.ɵɵelementEnd();
751
+ i0.ɵɵelementStart(15, "button", 14);
752
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setViewMode("list")); });
753
+ i0.ɵɵelement(16, "i", 15);
754
+ i0.ɵɵelementEnd()();
755
+ i0.ɵɵelementStart(17, "button", 16);
756
+ i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.createNewModel()); });
757
+ i0.ɵɵelement(18, "i", 17);
758
+ i0.ɵɵtext(19, " New Model ");
759
+ i0.ɵɵelementEnd()()();
760
+ i0.ɵɵelementStart(20, "kendo-splitter", 18);
761
+ i0.ɵɵtemplate(21, ModelManagementComponent_Conditional_2_Conditional_21_Template, 67, 11, "kendo-splitter-pane", 19);
762
+ i0.ɵɵelementStart(22, "kendo-splitter-pane")(23, "div", 20);
763
+ i0.ɵɵtemplate(24, ModelManagementComponent_Conditional_2_Conditional_24_Template, 7, 2, "div", 21)(25, ModelManagementComponent_Conditional_2_Conditional_25_Template, 2, 1);
764
+ i0.ɵɵelementEnd()()();
765
+ i0.ɵɵtemplate(26, ModelManagementComponent_Conditional_2_Conditional_26_Template, 1, 0, "div", 22);
766
+ i0.ɵɵelementStart(27, "div", 23);
767
+ i0.ɵɵtemplate(28, ModelManagementComponent_Conditional_2_Conditional_28_Template, 79, 31);
768
+ i0.ɵɵelementEnd();
769
+ } if (rf & 2) {
770
+ const ctx_r0 = i0.ɵɵnextContext();
771
+ i0.ɵɵadvance(7);
772
+ i0.ɵɵconditional(ctx_r0.showFilters ? 7 : 8);
773
+ i0.ɵɵadvance(3);
774
+ i0.ɵɵtextInterpolate1("", ctx_r0.filteredModels.length, " models");
775
+ i0.ɵɵadvance(3);
776
+ i0.ɵɵclassProp("active", ctx_r0.viewMode === "grid");
777
+ i0.ɵɵadvance(2);
778
+ i0.ɵɵclassProp("active", ctx_r0.viewMode === "list");
779
+ i0.ɵɵadvance(6);
780
+ i0.ɵɵconditional(ctx_r0.showFilters ? 21 : -1);
781
+ i0.ɵɵadvance(3);
782
+ i0.ɵɵconditional(ctx_r0.filteredModels.length === 0 ? 24 : 25);
783
+ i0.ɵɵadvance(2);
784
+ i0.ɵɵconditional(ctx_r0.detailPanelVisible ? 26 : -1);
785
+ i0.ɵɵadvance();
786
+ i0.ɵɵclassProp("visible", ctx_r0.detailPanelVisible);
787
+ i0.ɵɵadvance();
788
+ i0.ɵɵconditional(ctx_r0.selectedModel ? 28 : -1);
789
+ } }
790
+ /**
791
+ * Tree-shaking prevention function - ensures component is included in builds
792
+ */
793
+ export function LoadAIModelsResource() {
794
+ // Force inclusion in production builds
795
+ }
796
+ /**
797
+ * AI Models Resource - displays AI model management
798
+ * Extends BaseResourceComponent to work with the resource type system
799
+ */
800
+ let ModelManagementComponent = class ModelManagementComponent extends BaseResourceComponent {
801
+ sharedService;
802
+ navigationService;
803
+ // View state
804
+ viewMode = 'grid';
805
+ isLoading = true;
806
+ showFilters = true;
807
+ expandedModelId = null;
808
+ // Data - Keep as AIModelEntityExtended to preserve getters
809
+ models = [];
810
+ filteredModels = [];
811
+ vendors = [];
812
+ modelTypes = [];
813
+ // Filtering
814
+ searchTerm = '';
815
+ searchSubject = new BehaviorSubject('');
816
+ selectedVendor = 'all';
817
+ selectedType = 'all';
818
+ selectedStatus = 'all';
819
+ powerRankRange = { min: 0, max: 10 };
820
+ speedRankRange = { min: 0, max: 10 };
821
+ costRankRange = { min: 0, max: 10 };
822
+ // Detail panel
823
+ selectedModel = null;
824
+ detailPanelVisible = false;
825
+ // Sorting
826
+ sortBy = 'name';
827
+ sortDirection = 'asc';
828
+ sortOptions = [
829
+ { value: 'name', label: 'Name' },
830
+ { value: 'vendor', label: 'Vendor' },
831
+ { value: 'type', label: 'Type' },
832
+ { value: 'powerRank', label: 'Power Rank' },
833
+ { value: 'speedRank', label: 'Speed Rank' },
834
+ { value: 'costRank', label: 'Cost Rank' },
835
+ { value: 'created', label: 'Created Date' },
836
+ { value: 'updated', label: 'Updated Date' }
837
+ ];
838
+ // Max rank values calculated from all models
839
+ maxPowerRank = 10;
840
+ maxSpeedRank = 10;
841
+ maxCostRank = 10;
842
+ // Loading messages
843
+ loadingMessages = [
844
+ 'Loading AI models...',
845
+ 'Fetching vendor information...',
846
+ 'Calculating rankings...',
847
+ 'Almost ready...'
848
+ ];
849
+ currentLoadingMessage = this.loadingMessages[0];
850
+ loadingMessageIndex = 0;
851
+ loadingMessageInterval;
852
+ destroy$ = new Subject();
853
+ constructor(sharedService, navigationService) {
854
+ super();
855
+ this.sharedService = sharedService;
856
+ this.navigationService = navigationService;
857
+ }
858
+ ngOnInit() {
859
+ this.setupSearchListener();
860
+ this.startLoadingMessages();
861
+ this.loadInitialData();
862
+ if (this.Data?.Configuration) {
863
+ this.applyInitialState(this.Data.Configuration);
864
+ }
865
+ }
866
+ ngOnDestroy() {
867
+ this.destroy$.next();
868
+ this.destroy$.complete();
869
+ if (this.loadingMessageInterval) {
870
+ clearInterval(this.loadingMessageInterval);
871
+ }
872
+ }
873
+ setupSearchListener() {
874
+ this.searchSubject.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(searchTerm => {
875
+ this.searchTerm = searchTerm;
876
+ this.applyFilters();
877
+ });
878
+ }
879
+ startLoadingMessages() {
880
+ this.loadingMessageInterval = setInterval(() => {
881
+ this.loadingMessageIndex = (this.loadingMessageIndex + 1) % this.loadingMessages.length;
882
+ this.currentLoadingMessage = this.loadingMessages[this.loadingMessageIndex];
883
+ }, 2000);
884
+ }
885
+ async loadInitialData() {
886
+ try {
887
+ // Ensure AIEngineBase is configured (no-op if already loaded)
888
+ await AIEngineBase.Instance.Config(false);
889
+ // Get cached data from AIEngineBase
890
+ const models = AIEngineBase.Instance.Models;
891
+ this.vendors = AIEngineBase.Instance.Vendors;
892
+ this.modelTypes = AIEngineBase.Instance.ModelTypes;
893
+ // Log summary data
894
+ // Create lookup maps
895
+ const vendorMap = new Map(this.vendors.map(v => [v.ID, v.Name]));
896
+ const typeMap = new Map(this.modelTypes.map(t => [t.ID, t.Name]));
897
+ // Transform models to display format
898
+ this.models = models.map((model) => {
899
+ // Find vendor ID by matching vendor name
900
+ let vendorId;
901
+ if (model.Vendor) {
902
+ const vendor = this.vendors.find(v => v.Name === model.Vendor);
903
+ vendorId = vendor?.ID;
904
+ }
905
+ // Don't spread the model - it loses getter properties!
906
+ // Instead, augment the model with display properties
907
+ const modelWithDisplay = model;
908
+ modelWithDisplay.VendorID = vendorId;
909
+ modelWithDisplay.VendorName = model.Vendor || 'No Vendor';
910
+ modelWithDisplay.ModelTypeName = model.AIModelTypeID ? typeMap.get(model.AIModelTypeID) || 'Unknown' : 'No Type';
911
+ return model;
912
+ });
913
+ // Calculate max values for each rank type from ALL models
914
+ this.maxPowerRank = Math.max(...this.models.map(m => m.PowerRank || 0), 10);
915
+ this.maxSpeedRank = Math.max(...this.models.map(m => m.SpeedRank || 0), 10);
916
+ this.maxCostRank = Math.max(...this.models.map(m => m.CostRank || 0), 10);
917
+ // Update filter ranges based on actual max values
918
+ this.powerRankRange = { min: 0, max: this.maxPowerRank };
919
+ this.speedRankRange = { min: 0, max: this.maxSpeedRank };
920
+ this.costRankRange = { min: 0, max: this.maxCostRank };
921
+ this.filteredModels = [...this.models];
922
+ this.sortModels();
923
+ this.applyFilters();
924
+ }
925
+ catch (error) {
926
+ console.error('Error loading model data:', error);
927
+ this.sharedService.CreateSimpleNotification('Error loading models', 'error', 3000);
928
+ }
929
+ finally {
930
+ this.isLoading = false;
931
+ if (this.loadingMessageInterval) {
932
+ clearInterval(this.loadingMessageInterval);
933
+ }
934
+ this.NotifyLoadComplete();
935
+ }
936
+ }
937
+ formatRank(rank, rankType) {
938
+ if (rank === null)
939
+ return 'N/A';
940
+ // Determine which max value to use
941
+ let maxValue = 10;
942
+ if (rankType === 'power') {
943
+ maxValue = this.maxPowerRank;
944
+ }
945
+ else if (rankType === 'speed') {
946
+ maxValue = this.maxSpeedRank;
947
+ }
948
+ else if (rankType === 'cost') {
949
+ maxValue = this.maxCostRank;
950
+ }
951
+ return `${rank}/${maxValue}`;
952
+ }
953
+ applyInitialState(state) {
954
+ if (state.viewMode)
955
+ this.viewMode = state.viewMode;
956
+ if (state.showFilters !== undefined)
957
+ this.showFilters = state.showFilters;
958
+ if (state.searchTerm)
959
+ this.searchTerm = state.searchTerm;
960
+ if (state.selectedVendor)
961
+ this.selectedVendor = state.selectedVendor;
962
+ if (state.selectedType)
963
+ this.selectedType = state.selectedType;
964
+ if (state.selectedStatus)
965
+ this.selectedStatus = state.selectedStatus;
966
+ if (state.sortBy)
967
+ this.sortBy = state.sortBy;
968
+ if (state.powerRankRange)
969
+ this.powerRankRange = state.powerRankRange;
970
+ if (state.speedRankRange)
971
+ this.speedRankRange = state.speedRankRange;
972
+ if (state.costRankRange)
973
+ this.costRankRange = state.costRankRange;
974
+ }
975
+ onSearchChange(value) {
976
+ this.searchSubject.next(value);
977
+ }
978
+ toggleFilters() {
979
+ this.showFilters = !this.showFilters;
980
+ }
981
+ toggleFilterPanel() {
982
+ this.showFilters = !this.showFilters;
983
+ }
984
+ setViewMode(mode) {
985
+ this.viewMode = mode;
986
+ this.expandedModelId = null;
987
+ }
988
+ toggleModelExpansion(modelId) {
989
+ this.expandedModelId = this.expandedModelId === modelId ? null : modelId;
990
+ }
991
+ applyFilters() {
992
+ this.filteredModels = this.models.filter(m => {
993
+ const model = m;
994
+ // Search filter
995
+ if (this.searchTerm) {
996
+ const searchLower = this.searchTerm.toLowerCase();
997
+ const matchesSearch = model.Name?.toLowerCase().includes(searchLower) ||
998
+ model.Description?.toLowerCase().includes(searchLower) ||
999
+ model.VendorName?.toLowerCase().includes(searchLower) ||
1000
+ model.ModelTypeName?.toLowerCase().includes(searchLower);
1001
+ if (!matchesSearch)
1002
+ return false;
1003
+ }
1004
+ // Vendor filter
1005
+ if (this.selectedVendor !== 'all' && model.VendorID !== this.selectedVendor) {
1006
+ return false;
1007
+ }
1008
+ // Type filter
1009
+ if (this.selectedType !== 'all' && model.AIModelTypeID !== this.selectedType) {
1010
+ return false;
1011
+ }
1012
+ // Status filter
1013
+ if (this.selectedStatus !== 'all') {
1014
+ const isActive = model.IsActive === true;
1015
+ if (this.selectedStatus === 'active' && !isActive)
1016
+ return false;
1017
+ if (this.selectedStatus === 'inactive' && isActive)
1018
+ return false;
1019
+ }
1020
+ // Rank filters
1021
+ if (model.PowerRank !== null && (model.PowerRank < this.powerRankRange.min || model.PowerRank > this.powerRankRange.max)) {
1022
+ return false;
1023
+ }
1024
+ if (model.SpeedRank !== null && (model.SpeedRank < this.speedRankRange.min || model.SpeedRank > this.speedRankRange.max)) {
1025
+ return false;
1026
+ }
1027
+ if (model.CostRank !== null && (model.CostRank < this.costRankRange.min || model.CostRank > this.costRankRange.max)) {
1028
+ return false;
1029
+ }
1030
+ return true;
1031
+ });
1032
+ this.sortModels();
1033
+ }
1034
+ sortModels() {
1035
+ this.filteredModels.sort((a, b) => {
1036
+ const modelA = a;
1037
+ const modelB = b;
1038
+ let comparison = 0;
1039
+ switch (this.sortBy) {
1040
+ case 'name':
1041
+ comparison = (modelA.Name || '').localeCompare(modelB.Name || '');
1042
+ break;
1043
+ case 'vendor':
1044
+ comparison = (modelA.VendorName || '').localeCompare(modelB.VendorName || '');
1045
+ break;
1046
+ case 'type':
1047
+ comparison = (modelA.ModelTypeName || '').localeCompare(modelB.ModelTypeName || '');
1048
+ break;
1049
+ case 'powerRank':
1050
+ comparison = (modelA.PowerRank || 0) - (modelB.PowerRank || 0);
1051
+ break;
1052
+ case 'speedRank':
1053
+ comparison = (modelA.SpeedRank || 0) - (modelB.SpeedRank || 0);
1054
+ break;
1055
+ case 'costRank':
1056
+ comparison = (modelA.CostRank || 0) - (modelB.CostRank || 0);
1057
+ break;
1058
+ case 'created':
1059
+ comparison = new Date(modelA.__mj_CreatedAt).getTime() - new Date(modelB.__mj_CreatedAt).getTime();
1060
+ break;
1061
+ case 'updated':
1062
+ comparison = new Date(modelA.__mj_UpdatedAt).getTime() - new Date(modelB.__mj_UpdatedAt).getTime();
1063
+ break;
1064
+ default:
1065
+ comparison = 0;
1066
+ }
1067
+ return this.sortDirection === 'desc' ? -comparison : comparison;
1068
+ });
1069
+ }
1070
+ onVendorChange(vendorId) {
1071
+ this.selectedVendor = vendorId;
1072
+ this.applyFilters();
1073
+ }
1074
+ onTypeChange(typeId) {
1075
+ this.selectedType = typeId;
1076
+ this.applyFilters();
1077
+ }
1078
+ onStatusChange(status) {
1079
+ this.selectedStatus = status;
1080
+ this.applyFilters();
1081
+ }
1082
+ onSortChange(sortBy) {
1083
+ if (this.sortBy === sortBy) {
1084
+ // Toggle direction if same column
1085
+ this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';
1086
+ }
1087
+ else {
1088
+ // New column, default to ascending
1089
+ this.sortBy = sortBy;
1090
+ this.sortDirection = 'asc';
1091
+ }
1092
+ this.sortModels();
1093
+ }
1094
+ async toggleModelStatus(model, event) {
1095
+ event.stopPropagation();
1096
+ try {
1097
+ model.IsActive = !model.IsActive;
1098
+ if (await model.Save()) {
1099
+ this.sharedService.CreateSimpleNotification(`Model ${model.IsActive ? 'activated' : 'deactivated'} successfully`, 'success', 3000);
1100
+ }
1101
+ else {
1102
+ // Revert on failure
1103
+ model.IsActive = !model.IsActive;
1104
+ throw new Error('Failed to save model status');
1105
+ }
1106
+ }
1107
+ catch (error) {
1108
+ console.error('Error toggling model status:', error);
1109
+ this.sharedService.CreateSimpleNotification('Error updating model status', 'error', 3000);
1110
+ }
1111
+ }
1112
+ openModel(modelId) {
1113
+ const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: modelId }]);
1114
+ this.navigationService.OpenEntityRecord('AI Models', compositeKey);
1115
+ }
1116
+ /**
1117
+ * Show the detail panel for a model
1118
+ */
1119
+ showModelDetails(model, event) {
1120
+ if (event) {
1121
+ event.stopPropagation();
1122
+ }
1123
+ this.selectedModel = model;
1124
+ this.detailPanelVisible = true;
1125
+ }
1126
+ /**
1127
+ * Close the detail panel
1128
+ */
1129
+ closeDetailPanel() {
1130
+ this.detailPanelVisible = false;
1131
+ // Delay clearing selectedModel for smoother animation
1132
+ setTimeout(() => {
1133
+ if (!this.detailPanelVisible) {
1134
+ this.selectedModel = null;
1135
+ }
1136
+ }, 300);
1137
+ }
1138
+ /**
1139
+ * Open the full entity record from the detail panel
1140
+ */
1141
+ openModelFromPanel() {
1142
+ if (this.selectedModel) {
1143
+ this.openModel(this.selectedModel.ID);
1144
+ }
1145
+ }
1146
+ async createNewModel() {
1147
+ try {
1148
+ const md = new Metadata();
1149
+ const newModel = await md.GetEntityObject('AI Models');
1150
+ if (newModel) {
1151
+ newModel.Name = 'New AI Model';
1152
+ newModel.IsActive = true;
1153
+ if (await newModel.Save()) {
1154
+ const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: newModel.ID }]);
1155
+ this.navigationService.OpenEntityRecord('AI Models', compositeKey);
1156
+ // Reload the data
1157
+ await this.loadInitialData();
1158
+ }
1159
+ }
1160
+ }
1161
+ catch (error) {
1162
+ console.error('Error creating new model:', error);
1163
+ this.sharedService.CreateSimpleNotification('Error creating model', 'error', 3000);
1164
+ }
1165
+ }
1166
+ getModelIcon(model) {
1167
+ const typeName = model.ModelTypeName?.toLowerCase();
1168
+ if (typeName?.includes('chat') || typeName?.includes('conversation')) {
1169
+ return 'fa-solid fa-comments';
1170
+ }
1171
+ else if (typeName?.includes('image') || typeName?.includes('vision')) {
1172
+ return 'fa-solid fa-image';
1173
+ }
1174
+ else if (typeName?.includes('audio') || typeName?.includes('speech')) {
1175
+ return 'fa-solid fa-microphone';
1176
+ }
1177
+ else if (typeName?.includes('embed')) {
1178
+ return 'fa-solid fa-vector-square';
1179
+ }
1180
+ return 'fa-solid fa-microchip';
1181
+ }
1182
+ getRankClass(rank, rankType) {
1183
+ if (rank === null || rank === 0)
1184
+ return 'rank-none';
1185
+ // Determine which max value to use
1186
+ let maxValue = 10;
1187
+ if (rankType === 'power') {
1188
+ maxValue = this.maxPowerRank;
1189
+ }
1190
+ else if (rankType === 'speed') {
1191
+ maxValue = this.maxSpeedRank;
1192
+ }
1193
+ else if (rankType === 'cost') {
1194
+ maxValue = this.maxCostRank;
1195
+ }
1196
+ // Calculate percentage of max
1197
+ const percentage = (rank / maxValue) * 100;
1198
+ if (percentage >= 70)
1199
+ return 'rank-high';
1200
+ if (percentage >= 40)
1201
+ return 'rank-medium';
1202
+ return 'rank-low';
1203
+ }
1204
+ get hasActiveFilters() {
1205
+ return this.searchTerm !== '' ||
1206
+ this.selectedVendor !== 'all' ||
1207
+ this.selectedType !== 'all' ||
1208
+ this.selectedStatus !== 'all' ||
1209
+ this.powerRankRange.min > 0 ||
1210
+ this.powerRankRange.max < this.maxPowerRank ||
1211
+ this.speedRankRange.min > 0 ||
1212
+ this.speedRankRange.max < this.maxSpeedRank ||
1213
+ this.costRankRange.min > 0 ||
1214
+ this.costRankRange.max < this.maxCostRank;
1215
+ }
1216
+ clearFilters() {
1217
+ this.searchTerm = '';
1218
+ this.selectedVendor = 'all';
1219
+ this.selectedType = 'all';
1220
+ this.selectedStatus = 'all';
1221
+ this.powerRankRange = { min: 0, max: this.maxPowerRank };
1222
+ this.speedRankRange = { min: 0, max: this.maxSpeedRank };
1223
+ this.costRankRange = { min: 0, max: this.maxCostRank };
1224
+ this.searchSubject.next('');
1225
+ this.applyFilters();
1226
+ }
1227
+ formatTokenLimit(limit) {
1228
+ if (limit >= 1000000) {
1229
+ return Math.floor(limit / 1000000) + 'M';
1230
+ }
1231
+ else if (limit >= 1000) {
1232
+ return Math.floor(limit / 1000) + 'K';
1233
+ }
1234
+ return limit.toString();
1235
+ }
1236
+ validateAndApplyRankFilters(rankType) {
1237
+ // Get the appropriate range and max value based on type
1238
+ let range = rankType === 'power' ? this.powerRankRange :
1239
+ rankType === 'speed' ? this.speedRankRange :
1240
+ this.costRankRange;
1241
+ let maxValue = rankType === 'power' ? this.maxPowerRank :
1242
+ rankType === 'speed' ? this.maxSpeedRank :
1243
+ this.maxCostRank;
1244
+ // Ensure min is not greater than max
1245
+ if (range.min > range.max) {
1246
+ // Swap the values
1247
+ const temp = range.min;
1248
+ range.min = range.max;
1249
+ range.max = temp;
1250
+ }
1251
+ // Ensure values are within bounds
1252
+ range.min = Math.max(0, Math.min(maxValue, range.min));
1253
+ range.max = Math.max(0, Math.min(maxValue, range.max));
1254
+ // Apply the filters
1255
+ this.applyFilters();
1256
+ }
1257
+ // BaseResourceComponent abstract method implementations
1258
+ async GetResourceDisplayName(data) {
1259
+ return 'Models';
1260
+ }
1261
+ async GetResourceIconClass(data) {
1262
+ return 'fa-solid fa-microchip';
1263
+ }
1264
+ static ɵfac = function ModelManagementComponent_Factory(t) { return new (t || ModelManagementComponent)(i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i1.NavigationService)); };
1265
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ModelManagementComponent, selectors: [["app-model-management"]], 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, "detail-panel-overlay"], [1, "detail-panel"], [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", "View Details", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-eye"], [1, "fa-solid", "fa-circle", 2, "font-size", "8px"], [1, "model-stats"], [1, "stat-item"], [1, "stat-label"], [1, "stat-value"], [1, "data-table"], [3, "click"], [1, "sort-header"], [1, "fa-solid", "fa-chevron-up", "sort-icon"], [1, "name-cell"], [1, "rank-badge"], [1, "status-badge"], ["title", "View Details", 1, "action-button", "small", 3, "click"], [1, "detail-panel-overlay", 3, "click"], [1, "detail-panel-header"], [1, "detail-panel-title"], [1, "detail-icon"], [1, "detail-title-info"], [1, "detail-subtitle"], [1, "detail-panel-close", 3, "click"], [1, "detail-panel-content"], [1, "detail-section"], [1, "detail-badges"], [1, "status-badge", "status-active"], [1, "status-badge", "status-inactive"], [1, "feature-badge"], [1, "detail-section-title"], [1, "fa-solid", "fa-chart-bar"], [1, "detail-grid"], [1, "detail-item"], [1, "detail-label"], [1, "detail-value", "rank-badge"], [1, "fa-solid", "fa-cog"], [1, "detail-value"], [1, "fa-solid", "fa-clock"], [1, "detail-panel-actions"], ["type", "button", 1, "detail-action-btn", "primary", 3, "click"], [1, "fa-solid", "fa-external-link-alt"], [1, "fa-solid", "fa-align-left"], [1, "detail-description"]], template: function ModelManagementComponent_Template(rf, ctx) { if (rf & 1) {
1266
+ i0.ɵɵelementStart(0, "div", 0);
1267
+ i0.ɵɵtemplate(1, ModelManagementComponent_Conditional_1_Template, 2, 1, "div", 1)(2, ModelManagementComponent_Conditional_2_Template, 29, 12);
1268
+ i0.ɵɵelementEnd();
1269
+ } if (rf & 2) {
1270
+ i0.ɵɵadvance();
1271
+ i0.ɵɵconditional(ctx.isLoading ? 1 : 2);
1272
+ } }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.NumberValueAccessor, i2.NgControlStatus, i2.MinValidator, i2.MaxValidator, i2.NgModel, i3.SplitterComponent, i3.SplitterPaneComponent, i4.LoadingComponent, i5.DatePipe], styles: ["\n\n\n\n\n\n\n\n.model-management-v2[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: linear-gradient(135deg, #f5f7fa 0%, #e4e8ed 100%);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n}\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background: linear-gradient(135deg, #f5f7fa 0%, #e4e8ed 100%);\n}\n\n\n\n.dashboard-header[_ngcontent-%COMP%] {\n background: white;\n padding: 16px 24px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n z-index: 10;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 20px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: #1e293b;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6366f1;\n font-size: 22px;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);\n border: 1px solid #dee2e6;\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #e9ecef 0%, #dee2e6 100%);\n border-color: #ced4da;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6366f1;\n font-size: 14px;\n}\n\n.item-count[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n padding: 6px 12px;\n background: #f8f9fa;\n border-radius: 20px;\n border: 1px solid #e9ecef;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f8f9fa;\n border-radius: 8px;\n padding: 3px;\n border: 1px solid #dee2e6;\n}\n\n.view-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 8px 14px;\n border-radius: 6px;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 15px;\n}\n\n.view-btn[_ngcontent-%COMP%]:hover {\n color: #495057;\n}\n\n.view-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #6366f1;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n}\n\n.control-btn[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #dee2e6;\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\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 transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.control-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.control-btn.primary[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n border-color: #4f46e5;\n color: white;\n}\n\n.control-btn.primary[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #4338ca 100%);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.35);\n}\n\n\n\nkendo-splitter[_ngcontent-%COMP%] {\n flex: 1;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 50%, #e8f0fe 100%);\n margin-top: 0;\n}\n\n[_nghost-%COMP%] .k-splitter {\n border: none;\n background: transparent;\n}\n\n[_nghost-%COMP%] .k-splitbar {\n background: #e2e8f0;\n width: 6px;\n}\n\n[_nghost-%COMP%] .k-splitbar:hover {\n background: #c7d2fe;\n}\n\n[_nghost-%COMP%] .k-pane {\n overflow: hidden;\n}\n\n\n\n.filter-panel[_ngcontent-%COMP%] {\n height: 100%;\n background: white;\n border-right: 1px solid #e5e7eb;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n\n\n.filter-panel-header[_ngcontent-%COMP%] {\n padding: 20px;\n border-bottom: 1px solid #f1f5f9;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: linear-gradient(135deg, #fafbfc 0%, #f8fafc 100%);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: #1e293b;\n flex: 1;\n letter-spacing: -0.02em;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 16px;\n font-size: 13px;\n padding: 6px 12px;\n background: linear-gradient(135deg, #ede9fe 0%, #ddd6fe 100%);\n border-radius: 20px;\n border: 1px solid #c4b5fd;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-value[_ngcontent-%COMP%] {\n font-weight: 700;\n color: #6366f1;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-label[_ngcontent-%COMP%] {\n color: #7c3aed;\n font-weight: 500;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: #94a3b8;\n border-radius: 8px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%]:hover {\n background: #f1f5f9;\n color: #475569;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n\n.filter-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 20px;\n}\n\n\n\n.filter-group[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n font-size: 12px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.75px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6366f1;\n width: 16px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%], \n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n font-size: 14px;\n background: white;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: #334155;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%]:focus, \n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%]::placeholder {\n color: #94a3b8;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n\n\n.filter-input[_ngcontent-%COMP%], \n.filter-select[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n font-size: 14px;\n background: white;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: #334155;\n}\n\n.filter-input[_ngcontent-%COMP%]:focus, \n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);\n}\n\n.filter-input[_ngcontent-%COMP%]::placeholder {\n color: #94a3b8;\n}\n\n.filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n\n\n.rank-filter-inputs[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n align-items: center;\n margin-top: 8px;\n}\n\n.rank-input[_ngcontent-%COMP%] {\n width: 70px;\n padding: 10px 12px;\n border: 2px solid #e2e8f0;\n border-radius: 8px;\n font-size: 14px;\n text-align: center;\n background: white;\n transition: all 0.3s;\n box-sizing: border-box;\n -moz-appearance: textfield;\n}\n\n.rank-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.1);\n}\n\n.rank-input[_ngcontent-%COMP%]::placeholder {\n color: #94a3b8;\n font-size: 12px;\n}\n\n.rank-input[_ngcontent-%COMP%]::-webkit-inner-spin-button, \n.rank-input[_ngcontent-%COMP%]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.rank-separator[_ngcontent-%COMP%] {\n color: #64748b;\n font-size: 13px;\n font-weight: 600;\n}\n\n\n\n.filter-actions[_ngcontent-%COMP%] {\n margin-top: 28px;\n padding-top: 20px;\n border-top: 1px solid #f1f5f9;\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n color: #64748b;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);\n border-color: #cbd5e1;\n color: #475569;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: #f8fafc;\n border-radius: 3px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: #cbd5e1;\n border-radius: 3px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: #94a3b8;\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n height: 100%;\n padding: 28px;\n overflow-y: auto;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 50%, #e8f0fe 100%);\n}\n\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: #64748b;\n padding: 60px 32px;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 80px;\n background: linear-gradient(135deg, #c7d2fe 0%, #ddd6fe 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n margin-bottom: 28px;\n opacity: 1;\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 700;\n color: #1e293b;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 32px 0;\n font-size: 16px;\n line-height: 1.6;\n max-width: 420px;\n}\n\n\n\n.model-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));\n gap: 24px;\n}\n\n.model-card[_ngcontent-%COMP%] {\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);\n border: 1px solid #e2e8f0;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n position: relative;\n}\n\n.model-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n background: linear-gradient(90deg, #6366f1 0%, #8b5cf6 50%, #a78bfa 100%);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.model-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 20px 40px -15px rgba(99, 102, 241, 0.25);\n transform: translateY(-4px);\n border-color: #c7d2fe;\n}\n\n.model-card[_ngcontent-%COMP%]:hover::before {\n opacity: 1;\n}\n\n.model-card.expanded[_ngcontent-%COMP%] {\n box-shadow: 0 25px 50px -12px rgba(99, 102, 241, 0.3);\n border-color: #a5b4fc;\n}\n\n.model-card.expanded[_ngcontent-%COMP%]::before {\n opacity: 1;\n}\n\n.card-header[_ngcontent-%COMP%] {\n padding: 24px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n cursor: pointer;\n user-select: none;\n border-bottom: 1px solid #f1f5f9;\n transition: background-color 0.2s;\n}\n\n.card-header[_ngcontent-%COMP%]:hover {\n background-color: #fafbfc;\n}\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 18px;\n flex: 1;\n}\n\n.model-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.model-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: white;\n font-size: 24px;\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: 18px;\n font-weight: 700;\n color: #1e293b;\n margin-bottom: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.model-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 14px;\n flex-wrap: wrap;\n}\n\n.meta-item[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #64748b;\n display: flex;\n align-items: center;\n gap: 6px;\n background: #f1f5f9;\n padding: 4px 10px;\n border-radius: 6px;\n}\n\n.meta-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #6366f1;\n}\n\n.meta-item.status-active[_ngcontent-%COMP%] {\n color: #059669;\n background: #d1fae5;\n}\n\n.meta-item.status-active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #059669;\n}\n\n.meta-item.status-inactive[_ngcontent-%COMP%] {\n color: #64748b;\n background: #e2e8f0;\n}\n\n.meta-item.status-inactive[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #64748b;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #94a3b8;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n padding: 8px;\n border-radius: 8px;\n}\n\n.expand-icon[_ngcontent-%COMP%]:hover {\n color: #6366f1;\n background: #f1f5f9;\n}\n\n.expand-icon.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n color: #6366f1;\n}\n\n.card-body[_ngcontent-%COMP%] {\n padding: 0 24px 24px 24px;\n}\n\n.model-description[_ngcontent-%COMP%] {\n margin: 18px 0 0 0;\n font-size: 14px;\n line-height: 1.7;\n color: #64748b;\n}\n\n.model-description.text-muted[_ngcontent-%COMP%] {\n font-style: italic;\n color: #94a3b8;\n}\n\n\n\n.expanded-content[_ngcontent-%COMP%] {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid #e2e8f0;\n animation: _ngcontent-%COMP%_slideDown 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-12px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.model-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 18px;\n}\n\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-radius: 12px;\n border: 1px solid #e2e8f0;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 15px;\n color: #1e293b;\n font-weight: 600;\n}\n\n\n\n.card-actions[_ngcontent-%COMP%] {\n padding: 18px 24px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-top: 1px solid #e2e8f0;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n background: white;\n border: 2px solid #e2e8f0;\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 600;\n color: #475569;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover {\n background: #f8fafc;\n border-color: #6366f1;\n color: #6366f1;\n transform: translateY(-1px);\n}\n\n.action-btn-primary[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border-color: transparent;\n color: white;\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.action-btn-primary[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px rgba(99, 102, 241, 0.4);\n}\n\n\n\n.model-list[_ngcontent-%COMP%] {\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n border: 1px solid #e2e8f0;\n overflow: hidden;\n}\n\n.data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 2px solid #e2e8f0;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 16px 20px;\n text-align: left;\n font-size: 12px;\n font-weight: 700;\n color: #475569;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n cursor: pointer;\n user-select: none;\n transition: all 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:hover {\n background: #e2e8f0;\n color: #6366f1;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:last-child, \n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:nth-last-child(2) {\n cursor: default;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:last-child:hover, \n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:nth-last-child(2):hover {\n background: transparent;\n color: #475569;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th.sorted[_ngcontent-%COMP%] {\n color: #6366f1;\n background: linear-gradient(135deg, #eef2ff 0%, #e0e7ff 100%);\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th.sorted.desc[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.data-table[_ngcontent-%COMP%] .sort-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.data-table[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0;\n transition: all 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:hover .sort-icon[_ngcontent-%COMP%] {\n opacity: 0.5;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th.sorted[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n opacity: 1;\n color: #6366f1;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 1px solid #f1f5f9;\n transition: background-color 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #fafbfc 0%, #f8fafc 100%);\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 18px 20px;\n font-size: 14px;\n color: #475569;\n}\n\n.name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n color: #1e293b;\n}\n\n.name-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6366f1;\n font-size: 18px;\n}\n\n\n\n.rank-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 6px 12px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.rank-badge.rank-high[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n color: #047857;\n}\n\n.rank-badge.rank-medium[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n color: #b45309;\n}\n\n.rank-badge.rank-low[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%);\n color: #b91c1c;\n}\n\n.rank-badge.rank-none[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #e2e8f0 0%, #cbd5e1 100%);\n color: #475569;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.status-badge.active[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n color: #047857;\n}\n\n.status-badge.inactive[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%);\n color: #b91c1c;\n}\n\n\n\n@media (max-width: 768px) {\n .dashboard-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n padding: 16px 20px;\n }\n\n .header-info[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n justify-content: center;\n }\n\n .header-controls[_ngcontent-%COMP%] {\n justify-content: center;\n }\n\n .content-area[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .model-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .model-stats[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .card-header[_ngcontent-%COMP%] {\n padding: 18px;\n }\n\n .card-body[_ngcontent-%COMP%] {\n padding: 0 18px 18px 18px;\n }\n\n .card-actions[_ngcontent-%COMP%] {\n padding: 14px 18px;\n flex-wrap: wrap;\n }\n}\n\n\n\n\n\n\n\n\n.detail-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(15, 23, 42, 0.5);\n backdrop-filter: blur(4px);\n z-index: 1000;\n opacity: 0;\n animation: _ngcontent-%COMP%_fadeIn 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n to {\n opacity: 1;\n }\n}\n\n\n\n.detail-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: -480px;\n width: 480px;\n max-width: 90vw;\n height: 100vh;\n background: white;\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transition: right 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.detail-panel.visible[_ngcontent-%COMP%] {\n right: 0;\n}\n\n\n\n.detail-panel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 24px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-bottom: 1px solid #e2e8f0;\n flex-shrink: 0;\n}\n\n.detail-panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.detail-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.detail-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: white;\n font-size: 24px;\n}\n\n.detail-title-info[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 4px 0;\n font-size: 20px;\n font-weight: 700;\n color: #1e293b;\n}\n\n.detail-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #64748b;\n font-weight: 500;\n}\n\n.detail-panel-close[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #e2e8f0;\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #64748b;\n}\n\n.detail-panel-close[_ngcontent-%COMP%]:hover {\n background: #f8fafc;\n border-color: #cbd5e1;\n color: #1e293b;\n}\n\n\n\n.detail-panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n}\n\n\n\n.detail-section[_ngcontent-%COMP%] {\n margin-bottom: 28px;\n}\n\n.detail-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.detail-badges[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.status-badge.status-active[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n color: #047857;\n}\n\n.status-badge.status-inactive[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%);\n color: #b91c1c;\n}\n\n.feature-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n background: linear-gradient(135deg, #eef2ff 0%, #e0e7ff 100%);\n color: #4f46e5;\n}\n\n.feature-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.detail-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n line-height: 1.7;\n color: #475569;\n}\n\n.detail-section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 700;\n color: #475569;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6366f1;\n font-size: 14px;\n}\n\n\n\n.detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n}\n\n.detail-grid.single-column[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 14px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-radius: 12px;\n border: 1px solid #e2e8f0;\n}\n\n.detail-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #1e293b;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.detail-value.muted[_ngcontent-%COMP%] {\n color: #94a3b8;\n font-style: italic;\n}\n\n\n\n.detail-section[_ngcontent-%COMP%] .status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n}\n\n.detail-section[_ngcontent-%COMP%] .status-badge.active[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n color: #047857;\n}\n\n.detail-section[_ngcontent-%COMP%] .status-badge.inactive[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%);\n color: #b91c1c;\n}\n\n\n\n.detail-panel-actions[_ngcontent-%COMP%] {\n padding: 20px 24px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-top: 1px solid #e2e8f0;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n flex-shrink: 0;\n}\n\n.detail-action-btn[_ngcontent-%COMP%] {\n padding: 12px 24px;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-action-btn.primary[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border: none;\n color: white;\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.detail-action-btn.primary[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px rgba(99, 102, 241, 0.4);\n}\n\n.detail-action-btn.secondary[_ngcontent-%COMP%] {\n background: white;\n border: 2px solid #e2e8f0;\n color: #475569;\n}\n\n.detail-action-btn.secondary[_ngcontent-%COMP%]:hover {\n background: #f8fafc;\n border-color: #6366f1;\n color: #6366f1;\n}\n\n\n\n@media (max-width: 520px) {\n .detail-panel[_ngcontent-%COMP%] {\n width: 100%;\n right: -100%;\n }\n\n .detail-panel.visible[_ngcontent-%COMP%] {\n right: 0;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}"] });
1273
+ };
1274
+ ModelManagementComponent = __decorate([
1275
+ RegisterClass(BaseResourceComponent, 'AIModelsResource')
1276
+ ], ModelManagementComponent);
1277
+ export { ModelManagementComponent };
1278
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ModelManagementComponent, [{
1279
+ type: Component,
1280
+ args: [{ selector: 'app-model-management', 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)=\"showModelDetails(model, $event)\"\n title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n Details\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 (click)=\"onSortChange('name')\"\n [class.sorted]=\"sortBy === 'name'\"\n [class.desc]=\"sortBy === 'name' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Name\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('vendor')\"\n [class.sorted]=\"sortBy === 'vendor'\"\n [class.desc]=\"sortBy === 'vendor' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Vendor\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('type')\"\n [class.sorted]=\"sortBy === 'type'\"\n [class.desc]=\"sortBy === 'type' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Type\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('powerRank')\"\n [class.sorted]=\"sortBy === 'powerRank'\"\n [class.desc]=\"sortBy === 'powerRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Power\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('speedRank')\"\n [class.sorted]=\"sortBy === 'speedRank'\"\n [class.desc]=\"sortBy === 'speedRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Speed\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('costRank')\"\n [class.sorted]=\"sortBy === 'costRank'\"\n [class.desc]=\"sortBy === 'costRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Cost\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </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)=\"showModelDetails(model)\" title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></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 <!-- Detail Panel Overlay -->\n @if (detailPanelVisible) {\n <div class=\"detail-panel-overlay\" (click)=\"closeDetailPanel()\"></div>\n }\n\n <!-- Detail Panel -->\n <div class=\"detail-panel\" [class.visible]=\"detailPanelVisible\">\n @if (selectedModel) {\n <!-- Panel Header -->\n <div class=\"detail-panel-header\">\n <div class=\"detail-panel-title\">\n <div class=\"detail-icon\">\n <i [class]=\"getModelIcon(selectedModel)\"></i>\n </div>\n <div class=\"detail-title-info\">\n <h3>{{ selectedModel.Name }}</h3>\n <span class=\"detail-subtitle\">{{ selectedModel.Vendor || 'AI Model' }}</span>\n </div>\n </div>\n <button class=\"detail-panel-close\" (click)=\"closeDetailPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Panel Content -->\n <div class=\"detail-panel-content\">\n <!-- Status Section -->\n <div class=\"detail-section\">\n <div class=\"detail-badges\">\n @if (selectedModel.IsActive) {\n <span class=\"status-badge status-active\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Active\n </span>\n } @else {\n <span class=\"status-badge status-inactive\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Inactive\n </span>\n }\n @if (selectedModel.AIModelType) {\n <span class=\"feature-badge\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ selectedModel.AIModelType }}\n </span>\n }\n </div>\n </div>\n\n <!-- Description -->\n @if (selectedModel.Description) {\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-align-left\"></i>\n Description\n </h4>\n <p class=\"detail-description\">{{ selectedModel.Description }}</p>\n </div>\n }\n\n <!-- Ranking Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n Rankings\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Power Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.PowerRank, 'power')\">\n {{ formatRank(selectedModel.PowerRank, 'power') }}\n </span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Speed Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.SpeedRank, 'speed')\">\n {{ formatRank(selectedModel.SpeedRank, 'speed') }}\n </span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Cost Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.CostRank, 'cost')\">\n {{ formatRank(selectedModel.CostRank, 'cost') }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Configuration Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-cog\"></i>\n Configuration\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Vendor</span>\n <span class=\"detail-value\">{{ selectedModel.Vendor || 'Unknown' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Model Type</span>\n <span class=\"detail-value\">{{ selectedModel.AIModelType || 'Unknown' }}</span>\n </div>\n @if (selectedModel.APIName) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">API Name</span>\n <span class=\"detail-value\">{{ selectedModel.APIName }}</span>\n </div>\n }\n @if (selectedModel.InputTokenLimit) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Input Token Limit</span>\n <span class=\"detail-value\">{{ formatTokenLimit(selectedModel.InputTokenLimit) }}</span>\n </div>\n }\n @if (selectedModel.SupportedResponseFormats) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Response Formats</span>\n <span class=\"detail-value\">{{ selectedModel.SupportedResponseFormats }}</span>\n </div>\n }\n @if (selectedModel.SupportsEffortLevel) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Supports Effort Level</span>\n <span class=\"detail-value\">Yes</span>\n </div>\n }\n @if (selectedModel.DriverClass) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Driver Class</span>\n <span class=\"detail-value\">{{ selectedModel.DriverClass }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Timestamps -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timestamps\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Created</span>\n <span class=\"detail-value\">{{ selectedModel.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Updated</span>\n <span class=\"detail-value\">{{ selectedModel.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Panel Actions -->\n <div class=\"detail-panel-actions\">\n <button\n type=\"button\"\n class=\"detail-action-btn primary\"\n (click)=\"openModelFromPanel()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open Full Record\n </button>\n </div>\n }\n </div>\n }\n</div>", styles: ["/* ============================================\n AI Models Dashboard - World-Class Design\n Clean white header with indigo/purple accents\n ============================================ */\n\n/* Container */\n.model-management-v2 {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: linear-gradient(135deg, #f5f7fa 0%, #e4e8ed 100%);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n}\n\n/* Loading State */\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background: linear-gradient(135deg, #f5f7fa 0%, #e4e8ed 100%);\n}\n\n/* Dashboard Header - Clean White Style */\n.dashboard-header {\n background: white;\n padding: 16px 24px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n z-index: 10;\n}\n\n.header-info {\n display: flex;\n align-items: center;\n gap: 20px;\n}\n\n.dashboard-title {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: #1e293b;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.dashboard-title i {\n color: #6366f1;\n font-size: 22px;\n}\n\n.filter-toggle-btn {\n background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);\n border: 1px solid #dee2e6;\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.filter-toggle-btn:hover {\n background: linear-gradient(135deg, #e9ecef 0%, #dee2e6 100%);\n border-color: #ced4da;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.filter-toggle-btn i {\n color: #6366f1;\n font-size: 14px;\n}\n\n.item-count {\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n padding: 6px 12px;\n background: #f8f9fa;\n border-radius: 20px;\n border: 1px solid #e9ecef;\n}\n\n.header-controls {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n/* View Toggle */\n.view-toggle {\n display: flex;\n background: #f8f9fa;\n border-radius: 8px;\n padding: 3px;\n border: 1px solid #dee2e6;\n}\n\n.view-btn {\n background: transparent;\n border: none;\n padding: 8px 14px;\n border-radius: 6px;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 15px;\n}\n\n.view-btn:hover {\n color: #495057;\n}\n\n.view-btn.active {\n background: white;\n color: #6366f1;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n}\n\n.control-btn {\n background: white;\n border: 1px solid #dee2e6;\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn:hover {\n background: #f8f9fa;\n border-color: #ced4da;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.control-btn i {\n font-size: 14px;\n}\n\n.control-btn.primary {\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n border-color: #4f46e5;\n color: white;\n}\n\n.control-btn.primary:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #4338ca 100%);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.35);\n}\n\n/* Splitter */\nkendo-splitter {\n flex: 1;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 50%, #e8f0fe 100%);\n margin-top: 0;\n}\n\n:host ::ng-deep .k-splitter {\n border: none;\n background: transparent;\n}\n\n:host ::ng-deep .k-splitbar {\n background: #e2e8f0;\n width: 6px;\n}\n\n:host ::ng-deep .k-splitbar:hover {\n background: #c7d2fe;\n}\n\n:host ::ng-deep .k-pane {\n overflow: hidden;\n}\n\n/* Filter Panel */\n.filter-panel {\n height: 100%;\n background: white;\n border-right: 1px solid #e5e7eb;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* Header */\n.filter-panel-header {\n padding: 20px;\n border-bottom: 1px solid #f1f5f9;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: linear-gradient(135deg, #fafbfc 0%, #f8fafc 100%);\n}\n\n.filter-panel-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: #1e293b;\n flex: 1;\n letter-spacing: -0.02em;\n}\n\n.filter-panel-header .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 16px;\n font-size: 13px;\n padding: 6px 12px;\n background: linear-gradient(135deg, #ede9fe 0%, #ddd6fe 100%);\n border-radius: 20px;\n border: 1px solid #c4b5fd;\n}\n\n.filter-panel-header .filter-summary-inline .summary-value {\n font-weight: 700;\n color: #6366f1;\n}\n\n.filter-panel-header .filter-summary-inline .summary-label {\n color: #7c3aed;\n font-weight: 500;\n}\n\n.filter-panel-header .close-btn {\n background: transparent;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: #94a3b8;\n border-radius: 8px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.filter-panel-header .close-btn:hover {\n background: #f1f5f9;\n color: #475569;\n}\n\n.filter-panel-header .close-btn .fa-solid {\n font-size: 14px;\n}\n\n/* Content Area */\n.filter-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 20px;\n}\n\n/* Filter Groups */\n.filter-group {\n margin-bottom: 24px;\n}\n\n.filter-group .filter-label {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n font-size: 12px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.75px;\n}\n\n.filter-group .filter-label .fa-solid {\n font-size: 13px;\n color: #6366f1;\n width: 16px;\n}\n\n.filter-group .filter-input,\n.filter-group .filter-select {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n font-size: 14px;\n background: white;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: #334155;\n}\n\n.filter-group .filter-input:focus,\n.filter-group .filter-select:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);\n}\n\n.filter-group .filter-input::placeholder {\n color: #94a3b8;\n}\n\n.filter-group .filter-select {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n/* Legacy support for non-scoped selectors */\n.filter-input,\n.filter-select {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n font-size: 14px;\n background: white;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: #334155;\n}\n\n.filter-input:focus,\n.filter-select:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);\n}\n\n.filter-input::placeholder {\n color: #94a3b8;\n}\n\n.filter-select {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n/* Rank Filter */\n.rank-filter-inputs {\n display: flex;\n gap: 10px;\n align-items: center;\n margin-top: 8px;\n}\n\n.rank-input {\n width: 70px;\n padding: 10px 12px;\n border: 2px solid #e2e8f0;\n border-radius: 8px;\n font-size: 14px;\n text-align: center;\n background: white;\n transition: all 0.3s;\n box-sizing: border-box;\n -moz-appearance: textfield;\n}\n\n.rank-input:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.1);\n}\n\n.rank-input::placeholder {\n color: #94a3b8;\n font-size: 12px;\n}\n\n.rank-input::-webkit-inner-spin-button,\n.rank-input::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.rank-separator {\n color: #64748b;\n font-size: 13px;\n font-weight: 600;\n}\n\n/* Filter Actions */\n.filter-actions {\n margin-top: 28px;\n padding-top: 20px;\n border-top: 1px solid #f1f5f9;\n}\n\n.filter-actions .reset-btn {\n width: 100%;\n padding: 12px 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n color: #64748b;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n}\n\n.filter-actions .reset-btn:hover {\n background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);\n border-color: #cbd5e1;\n color: #475569;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.filter-actions .reset-btn .fa-solid {\n font-size: 13px;\n}\n\n/* Scrollbar Styling */\n.filter-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.filter-content::-webkit-scrollbar-track {\n background: #f8fafc;\n border-radius: 3px;\n}\n\n.filter-content::-webkit-scrollbar-thumb {\n background: #cbd5e1;\n border-radius: 3px;\n}\n\n.filter-content::-webkit-scrollbar-thumb:hover {\n background: #94a3b8;\n}\n\n/* Content Area */\n.content-area {\n height: 100%;\n padding: 28px;\n overflow-y: auto;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 50%, #e8f0fe 100%);\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: #64748b;\n padding: 60px 32px;\n}\n\n.empty-state i {\n font-size: 80px;\n background: linear-gradient(135deg, #c7d2fe 0%, #ddd6fe 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n margin-bottom: 28px;\n opacity: 1;\n}\n\n.empty-state h3 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 700;\n color: #1e293b;\n}\n\n.empty-state p {\n margin: 0 0 32px 0;\n font-size: 16px;\n line-height: 1.6;\n max-width: 420px;\n}\n\n/* Grid View */\n.model-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));\n gap: 24px;\n}\n\n.model-card {\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);\n border: 1px solid #e2e8f0;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n position: relative;\n}\n\n.model-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n background: linear-gradient(90deg, #6366f1 0%, #8b5cf6 50%, #a78bfa 100%);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.model-card:hover {\n box-shadow: 0 20px 40px -15px rgba(99, 102, 241, 0.25);\n transform: translateY(-4px);\n border-color: #c7d2fe;\n}\n\n.model-card:hover::before {\n opacity: 1;\n}\n\n.model-card.expanded {\n box-shadow: 0 25px 50px -12px rgba(99, 102, 241, 0.3);\n border-color: #a5b4fc;\n}\n\n.model-card.expanded::before {\n opacity: 1;\n}\n\n.card-header {\n padding: 24px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n cursor: pointer;\n user-select: none;\n border-bottom: 1px solid #f1f5f9;\n transition: background-color 0.2s;\n}\n\n.card-header:hover {\n background-color: #fafbfc;\n}\n\n.model-info {\n display: flex;\n gap: 18px;\n flex: 1;\n}\n\n.model-icon {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.model-icon i {\n color: white;\n font-size: 24px;\n}\n\n.model-details {\n flex: 1;\n min-width: 0;\n}\n\n.model-name {\n margin: 0;\n font-size: 18px;\n font-weight: 700;\n color: #1e293b;\n margin-bottom: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.model-meta {\n display: flex;\n gap: 14px;\n flex-wrap: wrap;\n}\n\n.meta-item {\n font-size: 13px;\n color: #64748b;\n display: flex;\n align-items: center;\n gap: 6px;\n background: #f1f5f9;\n padding: 4px 10px;\n border-radius: 6px;\n}\n\n.meta-item i {\n font-size: 11px;\n color: #6366f1;\n}\n\n.meta-item.status-active {\n color: #059669;\n background: #d1fae5;\n}\n\n.meta-item.status-active i {\n color: #059669;\n}\n\n.meta-item.status-inactive {\n color: #64748b;\n background: #e2e8f0;\n}\n\n.meta-item.status-inactive i {\n color: #64748b;\n}\n\n.expand-icon {\n font-size: 16px;\n color: #94a3b8;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n padding: 8px;\n border-radius: 8px;\n}\n\n.expand-icon:hover {\n color: #6366f1;\n background: #f1f5f9;\n}\n\n.expand-icon.rotated {\n transform: rotate(180deg);\n color: #6366f1;\n}\n\n.card-body {\n padding: 0 24px 24px 24px;\n}\n\n.model-description {\n margin: 18px 0 0 0;\n font-size: 14px;\n line-height: 1.7;\n color: #64748b;\n}\n\n.model-description.text-muted {\n font-style: italic;\n color: #94a3b8;\n}\n\n/* Expanded Content */\n.expanded-content {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid #e2e8f0;\n animation: slideDown 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-12px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.model-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 18px;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-radius: 12px;\n border: 1px solid #e2e8f0;\n}\n\n.stat-label {\n font-size: 11px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat-value {\n font-size: 15px;\n color: #1e293b;\n font-weight: 600;\n}\n\n/* Card Actions */\n.card-actions {\n padding: 18px 24px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-top: 1px solid #e2e8f0;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.action-btn {\n background: white;\n border: 2px solid #e2e8f0;\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 600;\n color: #475569;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.action-btn:hover {\n background: #f8fafc;\n border-color: #6366f1;\n color: #6366f1;\n transform: translateY(-1px);\n}\n\n.action-btn-primary {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border-color: transparent;\n color: white;\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.action-btn-primary:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px rgba(99, 102, 241, 0.4);\n}\n\n/* List View */\n.model-list {\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n border: 1px solid #e2e8f0;\n overflow: hidden;\n}\n\n.data-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table thead {\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n}\n\n.data-table thead tr {\n border-bottom: 2px solid #e2e8f0;\n}\n\n.data-table thead th {\n padding: 16px 20px;\n text-align: left;\n font-size: 12px;\n font-weight: 700;\n color: #475569;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n cursor: pointer;\n user-select: none;\n transition: all 0.2s ease;\n}\n\n.data-table thead th:hover {\n background: #e2e8f0;\n color: #6366f1;\n}\n\n.data-table thead th:last-child,\n.data-table thead th:nth-last-child(2) {\n cursor: default;\n}\n\n.data-table thead th:last-child:hover,\n.data-table thead th:nth-last-child(2):hover {\n background: transparent;\n color: #475569;\n}\n\n.data-table thead th.sorted {\n color: #6366f1;\n background: linear-gradient(135deg, #eef2ff 0%, #e0e7ff 100%);\n}\n\n.data-table thead th.sorted.desc .sort-icon {\n transform: rotate(180deg);\n}\n\n.data-table .sort-header {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.data-table .sort-icon {\n font-size: 10px;\n opacity: 0;\n transition: all 0.2s ease;\n}\n\n.data-table thead th:hover .sort-icon {\n opacity: 0.5;\n}\n\n.data-table thead th.sorted .sort-icon {\n opacity: 1;\n color: #6366f1;\n}\n\n.data-table tbody tr {\n border-bottom: 1px solid #f1f5f9;\n transition: background-color 0.2s ease;\n}\n\n.data-table tbody tr:last-child {\n border-bottom: none;\n}\n\n.data-table tbody tr:hover {\n background: linear-gradient(135deg, #fafbfc 0%, #f8fafc 100%);\n}\n\n.data-table tbody td {\n padding: 18px 20px;\n font-size: 14px;\n color: #475569;\n}\n\n.name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n color: #1e293b;\n}\n\n.name-cell i {\n color: #6366f1;\n font-size: 18px;\n}\n\n/* Rank Badge */\n.rank-badge {\n display: inline-flex;\n align-items: center;\n padding: 6px 12px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.rank-badge.rank-high {\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n color: #047857;\n}\n\n.rank-badge.rank-medium {\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n color: #b45309;\n}\n\n.rank-badge.rank-low {\n background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%);\n color: #b91c1c;\n}\n\n.rank-badge.rank-none {\n background: linear-gradient(135deg, #e2e8f0 0%, #cbd5e1 100%);\n color: #475569;\n}\n\n/* Status Badge */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.status-badge.active {\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n color: #047857;\n}\n\n.status-badge.inactive {\n background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%);\n color: #b91c1c;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .dashboard-header {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n padding: 16px 20px;\n }\n\n .header-info {\n flex-wrap: wrap;\n justify-content: center;\n }\n\n .header-controls {\n justify-content: center;\n }\n\n .content-area {\n padding: 16px;\n }\n\n .model-grid {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .model-stats {\n grid-template-columns: 1fr;\n }\n\n .card-header {\n padding: 18px;\n }\n\n .card-body {\n padding: 0 18px 18px 18px;\n }\n\n .card-actions {\n padding: 14px 18px;\n flex-wrap: wrap;\n }\n}\n\n/* ============================================\n Detail Panel - Slide-in Panel\n ============================================ */\n\n/* Detail Panel Overlay */\n.detail-panel-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(15, 23, 42, 0.5);\n backdrop-filter: blur(4px);\n z-index: 1000;\n opacity: 0;\n animation: fadeIn 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;\n}\n\n@keyframes fadeIn {\n to {\n opacity: 1;\n }\n}\n\n/* Detail Panel */\n.detail-panel {\n position: fixed;\n top: 0;\n right: -480px;\n width: 480px;\n max-width: 90vw;\n height: 100vh;\n background: white;\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transition: right 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.detail-panel.visible {\n right: 0;\n}\n\n/* Detail Panel Header */\n.detail-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 24px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-bottom: 1px solid #e2e8f0;\n flex-shrink: 0;\n}\n\n.detail-panel-title {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.detail-icon {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.detail-icon i {\n color: white;\n font-size: 24px;\n}\n\n.detail-title-info h3 {\n margin: 0 0 4px 0;\n font-size: 20px;\n font-weight: 700;\n color: #1e293b;\n}\n\n.detail-subtitle {\n font-size: 13px;\n color: #64748b;\n font-weight: 500;\n}\n\n.detail-panel-close {\n background: white;\n border: 1px solid #e2e8f0;\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #64748b;\n}\n\n.detail-panel-close:hover {\n background: #f8fafc;\n border-color: #cbd5e1;\n color: #1e293b;\n}\n\n/* Detail Panel Content */\n.detail-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n}\n\n/* Detail Section */\n.detail-section {\n margin-bottom: 28px;\n}\n\n.detail-section:last-child {\n margin-bottom: 0;\n}\n\n.detail-badges {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.status-badge.status-active {\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n color: #047857;\n}\n\n.status-badge.status-inactive {\n background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%);\n color: #b91c1c;\n}\n\n.feature-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n background: linear-gradient(135deg, #eef2ff 0%, #e0e7ff 100%);\n color: #4f46e5;\n}\n\n.feature-badge i {\n font-size: 11px;\n}\n\n.detail-description {\n margin: 0;\n font-size: 14px;\n line-height: 1.7;\n color: #475569;\n}\n\n.detail-section-title {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 700;\n color: #475569;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-section-title i {\n color: #6366f1;\n font-size: 14px;\n}\n\n/* Detail Grid */\n.detail-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n}\n\n.detail-grid.single-column {\n grid-template-columns: 1fr;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 14px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-radius: 12px;\n border: 1px solid #e2e8f0;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-label {\n font-size: 11px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.detail-value {\n font-size: 14px;\n color: #1e293b;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-value i {\n font-size: 13px;\n}\n\n.detail-value.muted {\n color: #94a3b8;\n font-style: italic;\n}\n\n/* Status Badges in Detail Panel */\n.detail-section .status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n}\n\n.detail-section .status-badge.active {\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n color: #047857;\n}\n\n.detail-section .status-badge.inactive {\n background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%);\n color: #b91c1c;\n}\n\n/* Detail Panel Actions */\n.detail-panel-actions {\n padding: 20px 24px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border-top: 1px solid #e2e8f0;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n flex-shrink: 0;\n}\n\n.detail-action-btn {\n padding: 12px 24px;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-action-btn.primary {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border: none;\n color: white;\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);\n}\n\n.detail-action-btn.primary:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px rgba(99, 102, 241, 0.4);\n}\n\n.detail-action-btn.secondary {\n background: white;\n border: 2px solid #e2e8f0;\n color: #475569;\n}\n\n.detail-action-btn.secondary:hover {\n background: #f8fafc;\n border-color: #6366f1;\n color: #6366f1;\n}\n\n/* Responsive adjustments for detail panel */\n@media (max-width: 520px) {\n .detail-panel {\n width: 100%;\n right: -100%;\n }\n\n .detail-panel.visible {\n right: 0;\n }\n\n .detail-grid {\n grid-template-columns: 1fr;\n }\n}\n"] }]
1281
+ }], () => [{ type: i1.SharedService }, { type: i1.NavigationService }], null); })();
1282
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ModelManagementComponent, { className: "ModelManagementComponent", filePath: "src/AI/components/models/model-management.component.ts", lineNumber: 37 }); })();
1283
+ //# sourceMappingURL=model-management.component.js.map