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