@memberjunction/ng-dashboards 5.22.0 → 5.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +364 -362
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +2 -2
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +947 -64
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +7645 -430
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +285 -6
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +2454 -277
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +191 -197
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +9 -8
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +305 -299
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +319 -313
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +20 -2
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +419 -232
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +10 -12
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +13 -19
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +12 -14
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +61 -68
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.js +10 -11
- package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +82 -96
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +130 -134
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +40 -46
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.js +2 -2
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +2 -2
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +127 -132
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/executions-list-view.component.js +2 -2
- package/dist/Actions/components/executions-list-view.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +11 -17
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +5 -11
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-list-item.component.js +8 -10
- package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +112 -133
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-tree-panel.component.js +63 -83
- package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.js +17 -21
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +17 -21
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +2 -2
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +2 -2
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +13 -5
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +168 -145
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +4 -5
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +197 -200
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +5 -7
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +142 -148
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/browser/component-browser.component.js +153 -166
- package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +15 -20
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +16 -21
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js +18 -23
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.js +25 -30
- package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +10 -11
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +24 -35
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.js +15 -17
- package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +7 -6
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +6 -5
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +7 -6
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -9
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -17
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +4 -4
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +1 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +5 -4
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +247 -259
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +1 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +1 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/components/widgets/integration-card.component.js +7 -9
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +6 -10
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +12 -20
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +411 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4266 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +140 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +780 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +8 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +246 -195
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +75 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +601 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +93 -12
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +637 -107
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/index.d.ts +3 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +3 -0
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +9 -7
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +5 -4
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +10 -9
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +141 -132
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-log-detail-panel.component.js +4 -4
- package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +141 -128
- package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +210 -218
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +2 -2
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +6 -9
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +20 -22
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +5 -4
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +6 -5
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +93 -92
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +9 -10
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/__tests__/analytics-resource.test.d.ts +2 -0
- package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
- package/dist/__tests__/analytics-resource.test.js +181 -0
- package/dist/__tests__/analytics-resource.test.js.map +1 -0
- package/dist/__tests__/scheduling.test.d.ts +2 -0
- package/dist/__tests__/scheduling.test.d.ts.map +1 -0
- package/dist/__tests__/scheduling.test.js +205 -0
- package/dist/__tests__/scheduling.test.js.map +1 -0
- package/dist/actions-dashboards.module.d.ts +8 -13
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +6 -27
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +20 -20
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +43 -44
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +4 -8
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +0 -19
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/component-studio-dashboards.module.d.ts +7 -11
- package/dist/component-studio-dashboards.module.d.ts.map +1 -1
- package/dist/component-studio-dashboards.module.js +22 -34
- package/dist/component-studio-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +12 -18
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +15 -31
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +5 -8
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +3 -19
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +7 -13
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +0 -27
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +5 -8
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +3 -19
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +2 -0
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +6 -10
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +3 -23
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/shared/entity-field-display.d.ts +44 -0
- package/dist/shared/entity-field-display.d.ts.map +1 -0
- package/dist/shared/entity-field-display.js +118 -0
- package/dist/shared/entity-field-display.js.map +1 -0
- package/dist/testing-dashboards.module.d.ts +7 -13
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +0 -27
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +48 -55
|
@@ -16,11 +16,13 @@ import { Component, ChangeDetectorRef, Input, inject } from '@angular/core';
|
|
|
16
16
|
import { Subject } from 'rxjs';
|
|
17
17
|
import { takeUntil } from 'rxjs/operators';
|
|
18
18
|
import { Metadata, RunView } from '@memberjunction/core';
|
|
19
|
+
import { KnowledgeHubMetadataEngine } from '@memberjunction/core-entities';
|
|
19
20
|
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
20
|
-
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
21
|
+
import { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';
|
|
21
22
|
import { GraphQLAIClient } from '@memberjunction/graphql-dataprovider';
|
|
22
23
|
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
23
24
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
25
|
+
import { CronToHumanReadable } from '../autotagging/autotagging-pipeline-resource.component';
|
|
24
26
|
import * as i0 from "@angular/core";
|
|
25
27
|
import * as i1 from "@angular/forms";
|
|
26
28
|
import * as i2 from "@memberjunction/ng-code-editor";
|
|
@@ -82,7 +84,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_C
|
|
|
82
84
|
i0.ɵɵtextInterpolate1(" ", row_r6.Status, " ");
|
|
83
85
|
} }
|
|
84
86
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
85
|
-
i0.ɵɵelement(0, "i",
|
|
87
|
+
i0.ɵɵelement(0, "i", 57);
|
|
86
88
|
i0.ɵɵtext(1);
|
|
87
89
|
} if (rf & 2) {
|
|
88
90
|
const row_r6 = i0.ɵɵnextContext().$implicit;
|
|
@@ -90,7 +92,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_C
|
|
|
90
92
|
i0.ɵɵtextInterpolate1(" ", row_r6.PercentComplete > 0 ? row_r6.PercentComplete + "%" : "Sync", " ");
|
|
91
93
|
} }
|
|
92
94
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
93
|
-
i0.ɵɵelement(0, "i",
|
|
95
|
+
i0.ɵɵelement(0, "i", 58);
|
|
94
96
|
i0.ɵɵtext(1, " Sync ");
|
|
95
97
|
} }
|
|
96
98
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -117,8 +119,12 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_T
|
|
|
117
119
|
i0.ɵɵconditionalCreate(17, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_17_Template, 2, 1)(18, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_18_Template, 2, 0);
|
|
118
120
|
i0.ɵɵelementEnd();
|
|
119
121
|
i0.ɵɵelementStart(19, "button", 53);
|
|
120
|
-
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_19_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.
|
|
122
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_19_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OpenScheduleSyncDialog(row_r6.EntityDocumentID)); });
|
|
121
123
|
i0.ɵɵelement(20, "i", 54);
|
|
124
|
+
i0.ɵɵelementEnd();
|
|
125
|
+
i0.ɵɵelementStart(21, "button", 55);
|
|
126
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_21_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OpenEditPanel(row_r6.EntityDocumentID)); });
|
|
127
|
+
i0.ɵɵelement(22, "i", 56);
|
|
122
128
|
i0.ɵɵelementEnd()()();
|
|
123
129
|
} if (rf & 2) {
|
|
124
130
|
const row_r6 = ctx.$implicit;
|
|
@@ -162,7 +168,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template
|
|
|
162
168
|
i0.ɵɵtext(15, "Actions");
|
|
163
169
|
i0.ɵɵelementEnd()()();
|
|
164
170
|
i0.ɵɵelementStart(16, "tbody");
|
|
165
|
-
i0.ɵɵrepeaterCreate(17, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template,
|
|
171
|
+
i0.ɵɵrepeaterCreate(17, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template, 23, 13, "tr", null, _forTrack1);
|
|
166
172
|
i0.ɵɵelementEnd()()();
|
|
167
173
|
} if (rf & 2) {
|
|
168
174
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -183,7 +189,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_42_Template
|
|
|
183
189
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 1, ctx_r2.EmbeddingModel.Dimensions));
|
|
184
190
|
} }
|
|
185
191
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_Template(rf, ctx) { if (rf & 1) {
|
|
186
|
-
i0.ɵɵelementStart(0, "option",
|
|
192
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
187
193
|
i0.ɵɵtext(1);
|
|
188
194
|
i0.ɵɵelementEnd();
|
|
189
195
|
} if (rf & 2) {
|
|
@@ -193,7 +199,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_T
|
|
|
193
199
|
i0.ɵɵtextInterpolate(model_r8.Name);
|
|
194
200
|
} }
|
|
195
201
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_30_Template(rf, ctx) { if (rf & 1) {
|
|
196
|
-
i0.ɵɵelementStart(0, "option",
|
|
202
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
197
203
|
i0.ɵɵtext(1);
|
|
198
204
|
i0.ɵɵelementEnd();
|
|
199
205
|
} if (rf & 2) {
|
|
@@ -203,7 +209,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_30_T
|
|
|
203
209
|
i0.ɵɵtextInterpolate(db_r9.Name);
|
|
204
210
|
} }
|
|
205
211
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
206
|
-
i0.ɵɵelementStart(0, "option",
|
|
212
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
207
213
|
i0.ɵɵtext(1);
|
|
208
214
|
i0.ɵɵelementEnd();
|
|
209
215
|
} if (rf & 2) {
|
|
@@ -214,12 +220,12 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditio
|
|
|
214
220
|
} }
|
|
215
221
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
216
222
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
217
|
-
i0.ɵɵelementStart(0, "select",
|
|
223
|
+
i0.ɵɵelementStart(0, "select", 71);
|
|
218
224
|
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorIndexID, $event) || (ctx_r2.EditDocVectorIndexID = $event); return i0.ɵɵresetView($event); });
|
|
219
|
-
i0.ɵɵelementStart(1, "option",
|
|
225
|
+
i0.ɵɵelementStart(1, "option", 79);
|
|
220
226
|
i0.ɵɵtext(2, "Auto (create/find matching index)");
|
|
221
227
|
i0.ɵɵelementEnd();
|
|
222
|
-
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_For_4_Template, 2, 2, "option",
|
|
228
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_For_4_Template, 2, 2, "option", 72, _forTrack2);
|
|
223
229
|
i0.ɵɵelementEnd();
|
|
224
230
|
} if (rf & 2) {
|
|
225
231
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -228,88 +234,88 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditio
|
|
|
228
234
|
i0.ɵɵrepeater(ctx_r2.EditFilteredIndexes);
|
|
229
235
|
} }
|
|
230
236
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
231
|
-
i0.ɵɵelementStart(0, "span",
|
|
237
|
+
i0.ɵɵelementStart(0, "span", 74);
|
|
232
238
|
i0.ɵɵtext(1, " No indexes for this database \u2014 one will be created automatically on sync ");
|
|
233
239
|
i0.ɵɵelementEnd();
|
|
234
240
|
} }
|
|
235
241
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
236
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
242
|
+
i0.ɵɵelement(0, "mj-loading", 78);
|
|
237
243
|
} }
|
|
238
244
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
239
245
|
const _r12 = i0.ɵɵgetCurrentView();
|
|
240
|
-
i0.ɵɵelementStart(0, "button",
|
|
246
|
+
i0.ɵɵelementStart(0, "button", 80);
|
|
241
247
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveEditedDocument()); });
|
|
242
|
-
i0.ɵɵelement(1, "i",
|
|
248
|
+
i0.ɵɵelement(1, "i", 81);
|
|
243
249
|
i0.ɵɵtext(2, " Save Changes ");
|
|
244
250
|
i0.ɵɵelementEnd();
|
|
245
|
-
i0.ɵɵelementStart(3, "button",
|
|
251
|
+
i0.ɵɵelementStart(3, "button", 82);
|
|
246
252
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.DeleteEntityDocument()); });
|
|
247
|
-
i0.ɵɵelement(4, "i",
|
|
253
|
+
i0.ɵɵelement(4, "i", 83);
|
|
248
254
|
i0.ɵɵtext(5, " Delete ");
|
|
249
255
|
i0.ɵɵelementEnd();
|
|
250
|
-
i0.ɵɵelementStart(6, "button",
|
|
256
|
+
i0.ɵɵelementStart(6, "button", 84);
|
|
251
257
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
|
|
252
258
|
i0.ɵɵtext(7, " Cancel ");
|
|
253
259
|
i0.ɵɵelementEnd();
|
|
254
260
|
} }
|
|
255
261
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template(rf, ctx) { if (rf & 1) {
|
|
256
262
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
257
|
-
i0.ɵɵelementStart(0, "div",
|
|
263
|
+
i0.ɵɵelementStart(0, "div", 59);
|
|
258
264
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
|
|
259
|
-
i0.ɵɵelementStart(1, "div",
|
|
265
|
+
i0.ɵɵelementStart(1, "div", 60);
|
|
260
266
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r7); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
261
|
-
i0.ɵɵelementStart(2, "div",
|
|
262
|
-
i0.ɵɵelement(4, "i",
|
|
267
|
+
i0.ɵɵelementStart(2, "div", 61)(3, "h3", 62);
|
|
268
|
+
i0.ɵɵelement(4, "i", 56);
|
|
263
269
|
i0.ɵɵtext(5, " Edit Entity Document ");
|
|
264
270
|
i0.ɵɵelementEnd();
|
|
265
|
-
i0.ɵɵelementStart(6, "button",
|
|
271
|
+
i0.ɵɵelementStart(6, "button", 63);
|
|
266
272
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
|
|
267
|
-
i0.ɵɵelement(7, "i",
|
|
273
|
+
i0.ɵɵelement(7, "i", 64);
|
|
268
274
|
i0.ɵɵelementEnd()();
|
|
269
|
-
i0.ɵɵelementStart(8, "div",
|
|
275
|
+
i0.ɵɵelementStart(8, "div", 65)(9, "div", 66)(10, "div", 67)(11, "label", 68);
|
|
270
276
|
i0.ɵɵtext(12, "Entity");
|
|
271
277
|
i0.ɵɵelementEnd();
|
|
272
|
-
i0.ɵɵelementStart(13, "span",
|
|
278
|
+
i0.ɵɵelementStart(13, "span", 69);
|
|
273
279
|
i0.ɵɵtext(14);
|
|
274
280
|
i0.ɵɵelementEnd()();
|
|
275
|
-
i0.ɵɵelementStart(15, "div",
|
|
281
|
+
i0.ɵɵelementStart(15, "div", 67)(16, "label", 68);
|
|
276
282
|
i0.ɵɵtext(17, "Document Name");
|
|
277
283
|
i0.ɵɵelementEnd();
|
|
278
|
-
i0.ɵɵelementStart(18, "input",
|
|
284
|
+
i0.ɵɵelementStart(18, "input", 70);
|
|
279
285
|
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_input_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocName, $event) || (ctx_r2.EditDocName = $event); return i0.ɵɵresetView($event); });
|
|
280
286
|
i0.ɵɵelementEnd()();
|
|
281
|
-
i0.ɵɵelementStart(19, "div",
|
|
287
|
+
i0.ɵɵelementStart(19, "div", 67)(20, "label", 68);
|
|
282
288
|
i0.ɵɵtext(21, "Embedding Model");
|
|
283
289
|
i0.ɵɵelementEnd();
|
|
284
|
-
i0.ɵɵelementStart(22, "select",
|
|
290
|
+
i0.ɵɵelementStart(22, "select", 71);
|
|
285
291
|
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocAIModelID, $event) || (ctx_r2.EditDocAIModelID = $event); return i0.ɵɵresetView($event); });
|
|
286
|
-
i0.ɵɵrepeaterCreate(23, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_Template, 2, 2, "option",
|
|
292
|
+
i0.ɵɵrepeaterCreate(23, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_Template, 2, 2, "option", 72, _forTrack2);
|
|
287
293
|
i0.ɵɵelementEnd()();
|
|
288
|
-
i0.ɵɵelementStart(25, "div",
|
|
294
|
+
i0.ɵɵelementStart(25, "div", 67)(26, "label", 68);
|
|
289
295
|
i0.ɵɵtext(27, "Vector Database");
|
|
290
296
|
i0.ɵɵelementEnd();
|
|
291
|
-
i0.ɵɵelementStart(28, "select",
|
|
297
|
+
i0.ɵɵelementStart(28, "select", 71);
|
|
292
298
|
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorDBID, $event) || (ctx_r2.EditDocVectorDBID = $event); return i0.ɵɵresetView($event); });
|
|
293
|
-
i0.ɵɵrepeaterCreate(29, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_30_Template, 2, 2, "option",
|
|
299
|
+
i0.ɵɵrepeaterCreate(29, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_30_Template, 2, 2, "option", 72, _forTrack2);
|
|
294
300
|
i0.ɵɵelementEnd()();
|
|
295
|
-
i0.ɵɵelementStart(31, "div",
|
|
301
|
+
i0.ɵɵelementStart(31, "div", 67)(32, "label", 68);
|
|
296
302
|
i0.ɵɵtext(33, "Vector Index");
|
|
297
303
|
i0.ɵɵelementEnd();
|
|
298
|
-
i0.ɵɵconditionalCreate(34, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template, 5, 1, "select",
|
|
304
|
+
i0.ɵɵconditionalCreate(34, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template, 5, 1, "select", 73)(35, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_35_Template, 2, 0, "span", 74);
|
|
299
305
|
i0.ɵɵelementEnd();
|
|
300
|
-
i0.ɵɵelementStart(36, "div",
|
|
306
|
+
i0.ɵɵelementStart(36, "div", 67)(37, "label", 68);
|
|
301
307
|
i0.ɵɵtext(38, "Status");
|
|
302
308
|
i0.ɵɵelementEnd();
|
|
303
|
-
i0.ɵɵelementStart(39, "select",
|
|
309
|
+
i0.ɵɵelementStart(39, "select", 71);
|
|
304
310
|
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_39_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocStatus, $event) || (ctx_r2.EditDocStatus = $event); return i0.ɵɵresetView($event); });
|
|
305
|
-
i0.ɵɵelementStart(40, "option",
|
|
311
|
+
i0.ɵɵelementStart(40, "option", 75);
|
|
306
312
|
i0.ɵɵtext(41, "Active");
|
|
307
313
|
i0.ɵɵelementEnd();
|
|
308
|
-
i0.ɵɵelementStart(42, "option",
|
|
314
|
+
i0.ɵɵelementStart(42, "option", 76);
|
|
309
315
|
i0.ɵɵtext(43, "Inactive");
|
|
310
316
|
i0.ɵɵelementEnd()()();
|
|
311
|
-
i0.ɵɵelementStart(44, "div",
|
|
312
|
-
i0.ɵɵconditionalCreate(45, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template, 1, 0, "mj-loading",
|
|
317
|
+
i0.ɵɵelementStart(44, "div", 77);
|
|
318
|
+
i0.ɵɵconditionalCreate(45, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template, 1, 0, "mj-loading", 78)(46, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template, 8, 0);
|
|
313
319
|
i0.ɵɵelementEnd()()()()();
|
|
314
320
|
} if (rf & 2) {
|
|
315
321
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -332,9 +338,82 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template
|
|
|
332
338
|
i0.ɵɵadvance(6);
|
|
333
339
|
i0.ɵɵconditional(ctx_r2.IsEditSaving || ctx_r2.IsEditDeleting ? 45 : 46);
|
|
334
340
|
} }
|
|
335
|
-
function
|
|
336
|
-
i0.ɵɵelement(0, "
|
|
337
|
-
|
|
341
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
342
|
+
i0.ɵɵelement(0, "mj-loading", 78);
|
|
343
|
+
} }
|
|
344
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
345
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
346
|
+
i0.ɵɵelementStart(0, "button", 80);
|
|
347
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveScheduleSync()); });
|
|
348
|
+
i0.ɵɵelement(1, "i", 91);
|
|
349
|
+
i0.ɵɵtext(2, " Create Schedule ");
|
|
350
|
+
i0.ɵɵelementEnd();
|
|
351
|
+
i0.ɵɵelementStart(3, "button", 84);
|
|
352
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
|
|
353
|
+
i0.ɵɵtext(4, " Cancel ");
|
|
354
|
+
i0.ɵɵelementEnd();
|
|
355
|
+
} }
|
|
356
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template(rf, ctx) { if (rf & 1) {
|
|
357
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
358
|
+
i0.ɵɵelementStart(0, "div", 59);
|
|
359
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
|
|
360
|
+
i0.ɵɵelementStart(1, "div", 85);
|
|
361
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
362
|
+
i0.ɵɵelementStart(2, "div", 61)(3, "h3", 62);
|
|
363
|
+
i0.ɵɵelement(4, "i", 54);
|
|
364
|
+
i0.ɵɵtext(5, " Schedule Vector Sync ");
|
|
365
|
+
i0.ɵɵelementEnd();
|
|
366
|
+
i0.ɵɵelementStart(6, "button", 63);
|
|
367
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
|
|
368
|
+
i0.ɵɵelement(7, "i", 64);
|
|
369
|
+
i0.ɵɵelementEnd()();
|
|
370
|
+
i0.ɵɵelementStart(8, "div", 65)(9, "div", 66)(10, "div", 67)(11, "label", 68);
|
|
371
|
+
i0.ɵɵtext(12, "Entity Document");
|
|
372
|
+
i0.ɵɵelementEnd();
|
|
373
|
+
i0.ɵɵelementStart(13, "span", 69);
|
|
374
|
+
i0.ɵɵtext(14);
|
|
375
|
+
i0.ɵɵelementEnd()();
|
|
376
|
+
i0.ɵɵelementStart(15, "div", 67)(16, "label", 68);
|
|
377
|
+
i0.ɵɵtext(17, "Action");
|
|
378
|
+
i0.ɵɵelementEnd();
|
|
379
|
+
i0.ɵɵelementStart(18, "span", 69);
|
|
380
|
+
i0.ɵɵtext(19, "__VectorizeEntity");
|
|
381
|
+
i0.ɵɵelementEnd()();
|
|
382
|
+
i0.ɵɵelementStart(20, "div", 67)(21, "label", 68);
|
|
383
|
+
i0.ɵɵtext(22, "Cron Expression");
|
|
384
|
+
i0.ɵɵelementEnd();
|
|
385
|
+
i0.ɵɵelementStart(23, "input", 86);
|
|
386
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_23_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleSyncCron, $event) || (ctx_r2.ScheduleSyncCron = $event); return i0.ɵɵresetView($event); });
|
|
387
|
+
i0.ɵɵelementEnd();
|
|
388
|
+
i0.ɵɵelementStart(24, "div", 87);
|
|
389
|
+
i0.ɵɵelement(25, "i", 88);
|
|
390
|
+
i0.ɵɵtext(26);
|
|
391
|
+
i0.ɵɵelementEnd()();
|
|
392
|
+
i0.ɵɵelementStart(27, "div", 89)(28, "label", 68);
|
|
393
|
+
i0.ɵɵtext(29, "Enabled");
|
|
394
|
+
i0.ɵɵelementEnd();
|
|
395
|
+
i0.ɵɵelementStart(30, "input", 90);
|
|
396
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_30_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleSyncEnabled, $event) || (ctx_r2.ScheduleSyncEnabled = $event); return i0.ɵɵresetView($event); });
|
|
397
|
+
i0.ɵɵelementEnd()();
|
|
398
|
+
i0.ɵɵelementStart(31, "div", 77);
|
|
399
|
+
i0.ɵɵconditionalCreate(32, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template, 1, 0, "mj-loading", 78)(33, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template, 5, 0);
|
|
400
|
+
i0.ɵɵelementEnd()()()()();
|
|
401
|
+
} if (rf & 2) {
|
|
402
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
403
|
+
i0.ɵɵadvance(14);
|
|
404
|
+
i0.ɵɵtextInterpolate(ctx_r2.ScheduleSyncDocName);
|
|
405
|
+
i0.ɵɵadvance(9);
|
|
406
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ScheduleSyncCron);
|
|
407
|
+
i0.ɵɵadvance(3);
|
|
408
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.GetScheduleCronPreview(ctx_r2.ScheduleSyncCron), " ");
|
|
409
|
+
i0.ɵɵadvance(4);
|
|
410
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ScheduleSyncEnabled);
|
|
411
|
+
i0.ɵɵadvance(2);
|
|
412
|
+
i0.ɵɵconditional(ctx_r2.ScheduleSyncSaving ? 32 : 33);
|
|
413
|
+
} }
|
|
414
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
415
|
+
i0.ɵɵelement(0, "i", 105);
|
|
416
|
+
i0.ɵɵelementStart(1, "span", 106);
|
|
338
417
|
i0.ɵɵtext(2);
|
|
339
418
|
i0.ɵɵelementEnd();
|
|
340
419
|
} if (rf & 2) {
|
|
@@ -342,42 +421,42 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
342
421
|
i0.ɵɵadvance(2);
|
|
343
422
|
i0.ɵɵtextInterpolate(ctx_r2.SuggestEntityName);
|
|
344
423
|
} }
|
|
345
|
-
function
|
|
346
|
-
i0.ɵɵelement(0, "i",
|
|
347
|
-
i0.ɵɵelementStart(1, "span",
|
|
424
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
425
|
+
i0.ɵɵelement(0, "i", 107);
|
|
426
|
+
i0.ɵɵelementStart(1, "span", 108);
|
|
348
427
|
i0.ɵɵtext(2, "Search and select an entity...");
|
|
349
428
|
i0.ɵɵelementEnd();
|
|
350
429
|
} }
|
|
351
|
-
function
|
|
352
|
-
const
|
|
353
|
-
i0.ɵɵelementStart(0, "button",
|
|
354
|
-
i0.ɵɵlistener("click", function
|
|
355
|
-
i0.ɵɵelement(1, "i",
|
|
430
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
431
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
432
|
+
i0.ɵɵelementStart(0, "button", 117);
|
|
433
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_For_5_Template_button_click_0_listener() { const entity_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.SelectEntity(entity_r19.Name)); });
|
|
434
|
+
i0.ɵɵelement(1, "i", 105);
|
|
356
435
|
i0.ɵɵtext(2);
|
|
357
436
|
i0.ɵɵelementEnd();
|
|
358
437
|
} if (rf & 2) {
|
|
359
|
-
const
|
|
438
|
+
const entity_r19 = ctx.$implicit;
|
|
360
439
|
const ctx_r2 = i0.ɵɵnextContext(6);
|
|
361
|
-
i0.ɵɵclassProp("entity-picker-item-selected",
|
|
440
|
+
i0.ɵɵclassProp("entity-picker-item-selected", entity_r19.Name === ctx_r2.SuggestEntityName);
|
|
362
441
|
i0.ɵɵadvance(2);
|
|
363
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
442
|
+
i0.ɵɵtextInterpolate1(" ", entity_r19.Name, " ");
|
|
364
443
|
} }
|
|
365
|
-
function
|
|
366
|
-
i0.ɵɵelementStart(0, "div",
|
|
367
|
-
i0.ɵɵelement(2, "i",
|
|
444
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
445
|
+
i0.ɵɵelementStart(0, "div", 112)(1, "div", 114);
|
|
446
|
+
i0.ɵɵelement(2, "i", 115);
|
|
368
447
|
i0.ɵɵtext(3);
|
|
369
448
|
i0.ɵɵelementEnd();
|
|
370
|
-
i0.ɵɵrepeaterCreate(4,
|
|
449
|
+
i0.ɵɵrepeaterCreate(4, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_For_5_Template, 3, 3, "button", 116, _forTrack2);
|
|
371
450
|
i0.ɵɵelementEnd();
|
|
372
451
|
} if (rf & 2) {
|
|
373
|
-
const
|
|
452
|
+
const group_r20 = ctx.$implicit;
|
|
374
453
|
i0.ɵɵadvance(3);
|
|
375
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
454
|
+
i0.ɵɵtextInterpolate1(" ", group_r20.SchemaName, " ");
|
|
376
455
|
i0.ɵɵadvance();
|
|
377
|
-
i0.ɵɵrepeater(
|
|
456
|
+
i0.ɵɵrepeater(group_r20.Entities);
|
|
378
457
|
} }
|
|
379
|
-
function
|
|
380
|
-
i0.ɵɵelementStart(0, "div",
|
|
458
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
459
|
+
i0.ɵɵelementStart(0, "div", 113);
|
|
381
460
|
i0.ɵɵtext(1);
|
|
382
461
|
i0.ɵɵelementEnd();
|
|
383
462
|
} if (rf & 2) {
|
|
@@ -385,17 +464,17 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
385
464
|
i0.ɵɵadvance();
|
|
386
465
|
i0.ɵɵtextInterpolate1(" No entities matching \"", ctx_r2.EntitySearchText, "\" ");
|
|
387
466
|
} }
|
|
388
|
-
function
|
|
389
|
-
const
|
|
390
|
-
i0.ɵɵelementStart(0, "div",
|
|
391
|
-
i0.ɵɵelement(2, "i",
|
|
392
|
-
i0.ɵɵelementStart(3, "input",
|
|
393
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
394
|
-
i0.ɵɵlistener("input", function
|
|
467
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
468
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
469
|
+
i0.ɵɵelementStart(0, "div", 97)(1, "div", 109);
|
|
470
|
+
i0.ɵɵelement(2, "i", 107);
|
|
471
|
+
i0.ɵɵelementStart(3, "input", 110);
|
|
472
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.EntitySearchText, $event) || (ctx_r2.EntitySearchText = $event); return i0.ɵɵresetView($event); });
|
|
473
|
+
i0.ɵɵlistener("input", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Template_input_input_3_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.FilterEntities()); });
|
|
395
474
|
i0.ɵɵelementEnd()();
|
|
396
|
-
i0.ɵɵelementStart(4, "div",
|
|
397
|
-
i0.ɵɵrepeaterCreate(5,
|
|
398
|
-
i0.ɵɵconditionalCreate(7,
|
|
475
|
+
i0.ɵɵelementStart(4, "div", 111);
|
|
476
|
+
i0.ɵɵrepeaterCreate(5, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_Template, 6, 1, "div", 112, _forTrack3);
|
|
477
|
+
i0.ɵɵconditionalCreate(7, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Conditional_7_Template, 2, 1, "div", 113);
|
|
399
478
|
i0.ɵɵelementEnd()();
|
|
400
479
|
} if (rf & 2) {
|
|
401
480
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
@@ -406,17 +485,17 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
406
485
|
i0.ɵɵadvance(2);
|
|
407
486
|
i0.ɵɵconditional(ctx_r2.FilteredEntityGroups.length === 0 ? 7 : -1);
|
|
408
487
|
} }
|
|
409
|
-
function
|
|
410
|
-
i0.ɵɵelement(0, "i",
|
|
488
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
489
|
+
i0.ɵɵelement(0, "i", 57);
|
|
411
490
|
i0.ɵɵtext(1, " Generating with AI... ");
|
|
412
491
|
} }
|
|
413
|
-
function
|
|
492
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
414
493
|
i0.ɵɵelement(0, "i", 13);
|
|
415
494
|
i0.ɵɵtext(1, " Generate Template ");
|
|
416
495
|
} }
|
|
417
|
-
function
|
|
418
|
-
i0.ɵɵelementStart(0, "div",
|
|
419
|
-
i0.ɵɵelement(1, "i",
|
|
496
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
497
|
+
i0.ɵɵelementStart(0, "div", 104);
|
|
498
|
+
i0.ɵɵelement(1, "i", 118);
|
|
420
499
|
i0.ɵɵtext(2);
|
|
421
500
|
i0.ɵɵelementEnd();
|
|
422
501
|
} if (rf & 2) {
|
|
@@ -424,41 +503,41 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
424
503
|
i0.ɵɵadvance(2);
|
|
425
504
|
i0.ɵɵtextInterpolate1(" ", ctx_r2.SuggestionError, " ");
|
|
426
505
|
} }
|
|
427
|
-
function
|
|
428
|
-
const
|
|
429
|
-
i0.ɵɵelementStart(0, "div",
|
|
506
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
507
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
508
|
+
i0.ɵɵelementStart(0, "div", 66)(1, "div", 67)(2, "label", 68);
|
|
430
509
|
i0.ɵɵtext(3, "Entity");
|
|
431
510
|
i0.ɵɵelementEnd();
|
|
432
|
-
i0.ɵɵelementStart(4, "div",
|
|
433
|
-
i0.ɵɵlistener("click", function
|
|
434
|
-
i0.ɵɵconditionalCreate(6,
|
|
435
|
-
i0.ɵɵelement(8, "i",
|
|
511
|
+
i0.ɵɵelementStart(4, "div", 94)(5, "button", 95);
|
|
512
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.ToggleEntityPicker()); });
|
|
513
|
+
i0.ɵɵconditionalCreate(6, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_6_Template, 3, 1)(7, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_7_Template, 3, 0);
|
|
514
|
+
i0.ɵɵelement(8, "i", 96);
|
|
436
515
|
i0.ɵɵelementEnd();
|
|
437
|
-
i0.ɵɵconditionalCreate(9,
|
|
516
|
+
i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Template, 8, 2, "div", 97);
|
|
438
517
|
i0.ɵɵelementEnd()();
|
|
439
|
-
i0.ɵɵelementStart(10, "div",
|
|
518
|
+
i0.ɵɵelementStart(10, "div", 67)(11, "label", 68);
|
|
440
519
|
i0.ɵɵtext(12, "Use Case");
|
|
441
520
|
i0.ɵɵelementEnd();
|
|
442
|
-
i0.ɵɵelementStart(13, "div",
|
|
443
|
-
i0.ɵɵlistener("click", function
|
|
444
|
-
i0.ɵɵelement(15, "i",
|
|
521
|
+
i0.ɵɵelementStart(13, "div", 98)(14, "button", 99);
|
|
522
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "duplicate detection"); });
|
|
523
|
+
i0.ɵɵelement(15, "i", 100);
|
|
445
524
|
i0.ɵɵtext(16, " Duplicate Detection ");
|
|
446
525
|
i0.ɵɵelementEnd();
|
|
447
|
-
i0.ɵɵelementStart(17, "button",
|
|
448
|
-
i0.ɵɵlistener("click", function
|
|
449
|
-
i0.ɵɵelement(18, "i",
|
|
526
|
+
i0.ɵɵelementStart(17, "button", 99);
|
|
527
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "search"); });
|
|
528
|
+
i0.ɵɵelement(18, "i", 101);
|
|
450
529
|
i0.ɵɵtext(19, " Search ");
|
|
451
530
|
i0.ɵɵelementEnd();
|
|
452
|
-
i0.ɵɵelementStart(20, "button",
|
|
453
|
-
i0.ɵɵlistener("click", function
|
|
454
|
-
i0.ɵɵelement(21, "i",
|
|
531
|
+
i0.ɵɵelementStart(20, "button", 99);
|
|
532
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "classification"); });
|
|
533
|
+
i0.ɵɵelement(21, "i", 102);
|
|
455
534
|
i0.ɵɵtext(22, " Classification ");
|
|
456
535
|
i0.ɵɵelementEnd()()();
|
|
457
|
-
i0.ɵɵelementStart(23, "button",
|
|
458
|
-
i0.ɵɵlistener("click", function
|
|
459
|
-
i0.ɵɵconditionalCreate(24,
|
|
536
|
+
i0.ɵɵelementStart(23, "button", 103);
|
|
537
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.RunSuggestion()); });
|
|
538
|
+
i0.ɵɵconditionalCreate(24, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_24_Template, 2, 0)(25, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_25_Template, 2, 0);
|
|
460
539
|
i0.ɵɵelementEnd();
|
|
461
|
-
i0.ɵɵconditionalCreate(26,
|
|
540
|
+
i0.ɵɵconditionalCreate(26, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_26_Template, 3, 1, "div", 104);
|
|
462
541
|
i0.ɵɵelementEnd();
|
|
463
542
|
} if (rf & 2) {
|
|
464
543
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -479,78 +558,78 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
479
558
|
i0.ɵɵadvance(2);
|
|
480
559
|
i0.ɵɵconditional(ctx_r2.SuggestionError ? 26 : -1);
|
|
481
560
|
} }
|
|
482
|
-
function
|
|
483
|
-
i0.ɵɵelementStart(0, "span",
|
|
561
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
562
|
+
i0.ɵɵelementStart(0, "span", 124);
|
|
484
563
|
i0.ɵɵtext(1);
|
|
485
564
|
i0.ɵɵelementEnd();
|
|
486
565
|
} if (rf & 2) {
|
|
487
|
-
const
|
|
566
|
+
const field_r22 = ctx.$implicit;
|
|
488
567
|
i0.ɵɵadvance();
|
|
489
|
-
i0.ɵɵtextInterpolate(
|
|
568
|
+
i0.ɵɵtextInterpolate(field_r22);
|
|
490
569
|
} }
|
|
491
|
-
function
|
|
492
|
-
i0.ɵɵelementStart(0, "div",
|
|
570
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_12_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
571
|
+
i0.ɵɵelementStart(0, "div", 133)(1, "span", 134);
|
|
493
572
|
i0.ɵɵtext(2);
|
|
494
573
|
i0.ɵɵelementEnd();
|
|
495
|
-
i0.ɵɵelementStart(3, "span",
|
|
574
|
+
i0.ɵɵelementStart(3, "span", 135);
|
|
496
575
|
i0.ɵɵtext(4);
|
|
497
576
|
i0.ɵɵelementEnd()();
|
|
498
577
|
} if (rf & 2) {
|
|
499
|
-
const
|
|
578
|
+
const rel_r23 = ctx.$implicit;
|
|
500
579
|
i0.ɵɵadvance(2);
|
|
501
|
-
i0.ɵɵtextInterpolate(
|
|
580
|
+
i0.ɵɵtextInterpolate(rel_r23.name);
|
|
502
581
|
i0.ɵɵadvance(2);
|
|
503
|
-
i0.ɵɵtextInterpolate(
|
|
582
|
+
i0.ɵɵtextInterpolate(rel_r23.fields.join(", "));
|
|
504
583
|
} }
|
|
505
|
-
function
|
|
506
|
-
i0.ɵɵelementStart(0, "div",
|
|
584
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
585
|
+
i0.ɵɵelementStart(0, "div", 119)(1, "h4", 120);
|
|
507
586
|
i0.ɵɵtext(2, "Related Entities");
|
|
508
587
|
i0.ɵɵelementEnd();
|
|
509
|
-
i0.ɵɵrepeaterCreate(3,
|
|
588
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_12_For_4_Template, 5, 2, "div", 133, _forTrack4);
|
|
510
589
|
i0.ɵɵelementEnd();
|
|
511
590
|
} if (rf & 2) {
|
|
512
591
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
513
592
|
i0.ɵɵadvance(3);
|
|
514
593
|
i0.ɵɵrepeater(ctx_r2.SuggestionResult.selectedRelationships);
|
|
515
594
|
} }
|
|
516
|
-
function
|
|
517
|
-
i0.ɵɵelementStart(0, "option",
|
|
595
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_39_Template(rf, ctx) { if (rf & 1) {
|
|
596
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
518
597
|
i0.ɵɵtext(1);
|
|
519
598
|
i0.ɵɵelementEnd();
|
|
520
599
|
} if (rf & 2) {
|
|
521
|
-
const
|
|
522
|
-
i0.ɵɵproperty("value",
|
|
600
|
+
const model_r24 = ctx.$implicit;
|
|
601
|
+
i0.ɵɵproperty("value", model_r24.ID);
|
|
523
602
|
i0.ɵɵadvance();
|
|
524
|
-
i0.ɵɵtextInterpolate(
|
|
603
|
+
i0.ɵɵtextInterpolate(model_r24.Name);
|
|
525
604
|
} }
|
|
526
|
-
function
|
|
527
|
-
i0.ɵɵelementStart(0, "option",
|
|
605
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_45_Template(rf, ctx) { if (rf & 1) {
|
|
606
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
528
607
|
i0.ɵɵtext(1);
|
|
529
608
|
i0.ɵɵelementEnd();
|
|
530
609
|
} if (rf & 2) {
|
|
531
|
-
const
|
|
532
|
-
i0.ɵɵproperty("value",
|
|
610
|
+
const db_r25 = ctx.$implicit;
|
|
611
|
+
i0.ɵɵproperty("value", db_r25.ID);
|
|
533
612
|
i0.ɵɵadvance();
|
|
534
|
-
i0.ɵɵtextInterpolate(
|
|
613
|
+
i0.ɵɵtextInterpolate(db_r25.Name);
|
|
535
614
|
} }
|
|
536
|
-
function
|
|
537
|
-
i0.ɵɵelementStart(0, "option",
|
|
615
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
616
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
538
617
|
i0.ɵɵtext(1);
|
|
539
618
|
i0.ɵɵelementEnd();
|
|
540
619
|
} if (rf & 2) {
|
|
541
|
-
const
|
|
542
|
-
i0.ɵɵproperty("value",
|
|
620
|
+
const idx_r27 = ctx.$implicit;
|
|
621
|
+
i0.ɵɵproperty("value", idx_r27.ID);
|
|
543
622
|
i0.ɵɵadvance();
|
|
544
|
-
i0.ɵɵtextInterpolate(
|
|
623
|
+
i0.ɵɵtextInterpolate(idx_r27.Name);
|
|
545
624
|
} }
|
|
546
|
-
function
|
|
547
|
-
const
|
|
548
|
-
i0.ɵɵelementStart(0, "select",
|
|
549
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
550
|
-
i0.ɵɵelementStart(1, "option",
|
|
625
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_Template(rf, ctx) { if (rf & 1) {
|
|
626
|
+
const _r26 = i0.ɵɵgetCurrentView();
|
|
627
|
+
i0.ɵɵelementStart(0, "select", 71);
|
|
628
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorIndexID, $event) || (ctx_r2.SelectedVectorIndexID = $event); return i0.ɵɵresetView($event); });
|
|
629
|
+
i0.ɵɵelementStart(1, "option", 79);
|
|
551
630
|
i0.ɵɵtext(2, "Auto (create/find matching index)");
|
|
552
631
|
i0.ɵɵelementEnd();
|
|
553
|
-
i0.ɵɵrepeaterCreate(3,
|
|
632
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_For_4_Template, 2, 2, "option", 72, _forTrack2);
|
|
554
633
|
i0.ɵɵelementEnd();
|
|
555
634
|
} if (rf & 2) {
|
|
556
635
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
@@ -558,93 +637,93 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
558
637
|
i0.ɵɵadvance(3);
|
|
559
638
|
i0.ɵɵrepeater(ctx_r2.FilteredIndexesForSelectedDB);
|
|
560
639
|
} }
|
|
561
|
-
function
|
|
562
|
-
i0.ɵɵelementStart(0, "span",
|
|
640
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
641
|
+
i0.ɵɵelementStart(0, "span", 74);
|
|
563
642
|
i0.ɵɵtext(1, " No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync ");
|
|
564
643
|
i0.ɵɵelementEnd();
|
|
565
644
|
} }
|
|
566
|
-
function
|
|
567
|
-
i0.ɵɵelementStart(0, "div",
|
|
568
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
645
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_52_Template(rf, ctx) { if (rf & 1) {
|
|
646
|
+
i0.ɵɵelementStart(0, "div", 132);
|
|
647
|
+
i0.ɵɵelement(1, "mj-loading", 78);
|
|
569
648
|
i0.ɵɵelementEnd();
|
|
570
649
|
} }
|
|
571
|
-
function
|
|
572
|
-
const
|
|
573
|
-
i0.ɵɵelementStart(0, "button",
|
|
574
|
-
i0.ɵɵlistener("click", function
|
|
575
|
-
i0.ɵɵelement(1, "i",
|
|
650
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template(rf, ctx) { if (rf & 1) {
|
|
651
|
+
const _r28 = i0.ɵɵgetCurrentView();
|
|
652
|
+
i0.ɵɵelementStart(0, "button", 80);
|
|
653
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.SaveAsEntityDocument()); });
|
|
654
|
+
i0.ɵɵelement(1, "i", 136);
|
|
576
655
|
i0.ɵɵtext(2, " Save as Entity Document ");
|
|
577
656
|
i0.ɵɵelementEnd();
|
|
578
|
-
i0.ɵɵelementStart(3, "button",
|
|
579
|
-
i0.ɵɵlistener("click", function
|
|
580
|
-
i0.ɵɵelement(4, "i",
|
|
657
|
+
i0.ɵɵelementStart(3, "button", 137);
|
|
658
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.ClearSuggestion()); });
|
|
659
|
+
i0.ɵɵelement(4, "i", 138);
|
|
581
660
|
i0.ɵɵtext(5, " Try Again ");
|
|
582
661
|
i0.ɵɵelementEnd();
|
|
583
|
-
i0.ɵɵelementStart(6, "button",
|
|
584
|
-
i0.ɵɵlistener("click", function
|
|
662
|
+
i0.ɵɵelementStart(6, "button", 84);
|
|
663
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
|
|
585
664
|
i0.ɵɵtext(7, " Close ");
|
|
586
665
|
i0.ɵɵelementEnd();
|
|
587
666
|
} }
|
|
588
|
-
function
|
|
589
|
-
const
|
|
590
|
-
i0.ɵɵelementStart(0, "div",
|
|
667
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
668
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
669
|
+
i0.ɵɵelementStart(0, "div", 93)(1, "div", 119)(2, "h4", 120);
|
|
591
670
|
i0.ɵɵtext(3, "Suggested Template");
|
|
592
671
|
i0.ɵɵelementEnd();
|
|
593
|
-
i0.ɵɵelementStart(4, "div",
|
|
594
|
-
i0.ɵɵlistener("change", function
|
|
672
|
+
i0.ɵɵelementStart(4, "div", 121)(5, "mj-code-editor", 122);
|
|
673
|
+
i0.ɵɵlistener("change", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template_mj_code_editor_change_5_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnTemplateChange($event)); });
|
|
595
674
|
i0.ɵɵelementEnd()()();
|
|
596
|
-
i0.ɵɵelementStart(6, "div",
|
|
675
|
+
i0.ɵɵelementStart(6, "div", 119)(7, "h4", 120);
|
|
597
676
|
i0.ɵɵtext(8, "Selected Fields");
|
|
598
677
|
i0.ɵɵelementEnd();
|
|
599
|
-
i0.ɵɵelementStart(9, "div",
|
|
600
|
-
i0.ɵɵrepeaterCreate(10,
|
|
678
|
+
i0.ɵɵelementStart(9, "div", 123);
|
|
679
|
+
i0.ɵɵrepeaterCreate(10, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_11_Template, 2, 1, "span", 124, i0.ɵɵrepeaterTrackByIdentity);
|
|
601
680
|
i0.ɵɵelementEnd()();
|
|
602
|
-
i0.ɵɵconditionalCreate(12,
|
|
603
|
-
i0.ɵɵelementStart(13, "div",
|
|
681
|
+
i0.ɵɵconditionalCreate(12, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_12_Template, 5, 0, "div", 119);
|
|
682
|
+
i0.ɵɵelementStart(13, "div", 125)(14, "div", 126)(15, "span", 127);
|
|
604
683
|
i0.ɵɵtext(16, "Potential Match");
|
|
605
684
|
i0.ɵɵelementEnd();
|
|
606
|
-
i0.ɵɵelementStart(17, "span",
|
|
685
|
+
i0.ɵɵelementStart(17, "span", 128);
|
|
607
686
|
i0.ɵɵtext(18);
|
|
608
687
|
i0.ɵɵelementEnd()();
|
|
609
|
-
i0.ɵɵelementStart(19, "div",
|
|
688
|
+
i0.ɵɵelementStart(19, "div", 126)(20, "span", 127);
|
|
610
689
|
i0.ɵɵtext(21, "Absolute Match");
|
|
611
690
|
i0.ɵɵelementEnd();
|
|
612
|
-
i0.ɵɵelementStart(22, "span",
|
|
691
|
+
i0.ɵɵelementStart(22, "span", 128);
|
|
613
692
|
i0.ɵɵtext(23);
|
|
614
693
|
i0.ɵɵelementEnd()()();
|
|
615
|
-
i0.ɵɵelementStart(24, "div",
|
|
694
|
+
i0.ɵɵelementStart(24, "div", 119)(25, "h4", 120);
|
|
616
695
|
i0.ɵɵtext(26, "Reasoning");
|
|
617
696
|
i0.ɵɵelementEnd();
|
|
618
|
-
i0.ɵɵelementStart(27, "p",
|
|
697
|
+
i0.ɵɵelementStart(27, "p", 129);
|
|
619
698
|
i0.ɵɵtext(28);
|
|
620
699
|
i0.ɵɵelementEnd()();
|
|
621
|
-
i0.ɵɵelementStart(29, "div",
|
|
700
|
+
i0.ɵɵelementStart(29, "div", 119)(30, "div", 67)(31, "label", 68);
|
|
622
701
|
i0.ɵɵtext(32, "Document Name");
|
|
623
702
|
i0.ɵɵelementEnd();
|
|
624
|
-
i0.ɵɵelementStart(33, "input",
|
|
625
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
703
|
+
i0.ɵɵelementStart(33, "input", 70);
|
|
704
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SaveDocumentName, $event) || (ctx_r2.SaveDocumentName = $event); return i0.ɵɵresetView($event); });
|
|
626
705
|
i0.ɵɵelementEnd()();
|
|
627
|
-
i0.ɵɵelementStart(34, "div",
|
|
706
|
+
i0.ɵɵelementStart(34, "div", 130)(35, "label", 68);
|
|
628
707
|
i0.ɵɵtext(36, "Embedding Model");
|
|
629
708
|
i0.ɵɵelementEnd();
|
|
630
|
-
i0.ɵɵelementStart(37, "select",
|
|
631
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
632
|
-
i0.ɵɵrepeaterCreate(38,
|
|
709
|
+
i0.ɵɵelementStart(37, "select", 71);
|
|
710
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template_select_ngModelChange_37_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedEmbeddingModelID, $event) || (ctx_r2.SelectedEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
|
|
711
|
+
i0.ɵɵrepeaterCreate(38, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_39_Template, 2, 2, "option", 72, _forTrack2);
|
|
633
712
|
i0.ɵɵelementEnd()();
|
|
634
|
-
i0.ɵɵelementStart(40, "div",
|
|
713
|
+
i0.ɵɵelementStart(40, "div", 130)(41, "label", 68);
|
|
635
714
|
i0.ɵɵtext(42, "Vector Database");
|
|
636
715
|
i0.ɵɵelementEnd();
|
|
637
|
-
i0.ɵɵelementStart(43, "select",
|
|
638
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
639
|
-
i0.ɵɵrepeaterCreate(44,
|
|
716
|
+
i0.ɵɵelementStart(43, "select", 71);
|
|
717
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template_select_ngModelChange_43_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorDBID, $event) || (ctx_r2.SelectedVectorDBID = $event); return i0.ɵɵresetView($event); });
|
|
718
|
+
i0.ɵɵrepeaterCreate(44, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_45_Template, 2, 2, "option", 72, _forTrack2);
|
|
640
719
|
i0.ɵɵelementEnd()();
|
|
641
|
-
i0.ɵɵelementStart(46, "div",
|
|
720
|
+
i0.ɵɵelementStart(46, "div", 130)(47, "label", 68);
|
|
642
721
|
i0.ɵɵtext(48, "Vector Index");
|
|
643
722
|
i0.ɵɵelementEnd();
|
|
644
|
-
i0.ɵɵconditionalCreate(49,
|
|
723
|
+
i0.ɵɵconditionalCreate(49, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_Template, 5, 1, "select", 73)(50, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_50_Template, 2, 0, "span", 74);
|
|
645
724
|
i0.ɵɵelementEnd()();
|
|
646
|
-
i0.ɵɵelementStart(51, "div",
|
|
647
|
-
i0.ɵɵconditionalCreate(52,
|
|
725
|
+
i0.ɵɵelementStart(51, "div", 131);
|
|
726
|
+
i0.ɵɵconditionalCreate(52, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_52_Template, 2, 0, "div", 132)(53, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template, 8, 0);
|
|
648
727
|
i0.ɵɵelementEnd()();
|
|
649
728
|
} if (rf & 2) {
|
|
650
729
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -675,22 +754,22 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
675
754
|
i0.ɵɵadvance(3);
|
|
676
755
|
i0.ɵɵconditional(ctx_r2.IsSavingDocument ? 52 : 53);
|
|
677
756
|
} }
|
|
678
|
-
function
|
|
679
|
-
const
|
|
680
|
-
i0.ɵɵelementStart(0, "div",
|
|
681
|
-
i0.ɵɵlistener("click", function
|
|
682
|
-
i0.ɵɵelementStart(1, "div",
|
|
683
|
-
i0.ɵɵlistener("click", function
|
|
684
|
-
i0.ɵɵelementStart(2, "div",
|
|
757
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template(rf, ctx) { if (rf & 1) {
|
|
758
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
759
|
+
i0.ɵɵelementStart(0, "div", 59);
|
|
760
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
|
|
761
|
+
i0.ɵɵelementStart(1, "div", 92);
|
|
762
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r15); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
763
|
+
i0.ɵɵelementStart(2, "div", 61)(3, "h3", 62);
|
|
685
764
|
i0.ɵɵelement(4, "i", 13);
|
|
686
765
|
i0.ɵɵtext(5, " AI Document Suggestion ");
|
|
687
766
|
i0.ɵɵelementEnd();
|
|
688
|
-
i0.ɵɵelementStart(6, "button",
|
|
689
|
-
i0.ɵɵlistener("click", function
|
|
690
|
-
i0.ɵɵelement(7, "i",
|
|
767
|
+
i0.ɵɵelementStart(6, "button", 63);
|
|
768
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
|
|
769
|
+
i0.ɵɵelement(7, "i", 64);
|
|
691
770
|
i0.ɵɵelementEnd()();
|
|
692
|
-
i0.ɵɵelementStart(8, "div",
|
|
693
|
-
i0.ɵɵconditionalCreate(9,
|
|
771
|
+
i0.ɵɵelementStart(8, "div", 65);
|
|
772
|
+
i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template, 27, 11, "div", 66)(10, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template, 54, 12, "div", 93);
|
|
694
773
|
i0.ɵɵelementEnd()()();
|
|
695
774
|
} if (rf & 2) {
|
|
696
775
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -762,7 +841,8 @@ function VectorManagementResourceComponent_Conditional_1_Template(rf, ctx) { if
|
|
|
762
841
|
i0.ɵɵpipe(54, "number");
|
|
763
842
|
i0.ɵɵelementEnd()()()()();
|
|
764
843
|
i0.ɵɵconditionalCreate(55, VectorManagementResourceComponent_Conditional_1_Conditional_55_Template, 47, 7, "div", 38);
|
|
765
|
-
i0.ɵɵconditionalCreate(56, VectorManagementResourceComponent_Conditional_1_Conditional_56_Template,
|
|
844
|
+
i0.ɵɵconditionalCreate(56, VectorManagementResourceComponent_Conditional_1_Conditional_56_Template, 34, 5, "div", 38);
|
|
845
|
+
i0.ɵɵconditionalCreate(57, VectorManagementResourceComponent_Conditional_1_Conditional_57_Template, 11, 3, "div", 38);
|
|
766
846
|
} if (rf & 2) {
|
|
767
847
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
768
848
|
i0.ɵɵadvance();
|
|
@@ -786,14 +866,17 @@ function VectorManagementResourceComponent_Conditional_1_Template(rf, ctx) { if
|
|
|
786
866
|
i0.ɵɵadvance(2);
|
|
787
867
|
i0.ɵɵtextInterpolate1("", ctx_r2.StorageLabel, " of records vectorized");
|
|
788
868
|
i0.ɵɵadvance(2);
|
|
789
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54,
|
|
869
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54, 15, ctx_r2.TotalVectors), " vectors stored ");
|
|
790
870
|
i0.ɵɵadvance(2);
|
|
791
871
|
i0.ɵɵconditional(ctx_r2.ShowEditPanel ? 55 : -1);
|
|
792
872
|
i0.ɵɵadvance();
|
|
793
|
-
i0.ɵɵconditional(ctx_r2.
|
|
873
|
+
i0.ɵɵconditional(ctx_r2.ShowScheduleSyncDialog ? 56 : -1);
|
|
874
|
+
i0.ɵɵadvance();
|
|
875
|
+
i0.ɵɵconditional(ctx_r2.ShowSuggestDialog ? 57 : -1);
|
|
794
876
|
} }
|
|
795
877
|
let VectorManagementResourceComponent = class VectorManagementResourceComponent extends BaseResourceComponent {
|
|
796
878
|
cdr = inject(ChangeDetectorRef);
|
|
879
|
+
navigationService = inject(NavigationService);
|
|
797
880
|
destroy$ = new Subject();
|
|
798
881
|
/** View mode: 'index' = Option A (shared index as hero, entity docs as children),
|
|
799
882
|
* 'operations' = Option C (operations monitoring with real-time sync status) */
|
|
@@ -910,6 +993,119 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
910
993
|
this.cdr.detectChanges();
|
|
911
994
|
}
|
|
912
995
|
}
|
|
996
|
+
// --- Schedule Sync Dialog ---
|
|
997
|
+
ShowScheduleSyncDialog = false;
|
|
998
|
+
ScheduleSyncSaving = false;
|
|
999
|
+
ScheduleSyncDocID = '';
|
|
1000
|
+
ScheduleSyncDocName = '';
|
|
1001
|
+
ScheduleSyncCron = '0 2 * * *';
|
|
1002
|
+
ScheduleSyncEnabled = true;
|
|
1003
|
+
/** Opens the schedule sync dialog for a specific entity document */
|
|
1004
|
+
OpenScheduleSyncDialog(entityDocumentId) {
|
|
1005
|
+
const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));
|
|
1006
|
+
if (!doc)
|
|
1007
|
+
return;
|
|
1008
|
+
this.ScheduleSyncDocID = doc.ID;
|
|
1009
|
+
this.ScheduleSyncDocName = doc.Entity || doc.Name;
|
|
1010
|
+
this.ScheduleSyncCron = '0 2 * * *';
|
|
1011
|
+
this.ScheduleSyncEnabled = true;
|
|
1012
|
+
this.ShowScheduleSyncDialog = true;
|
|
1013
|
+
this.cdr.detectChanges();
|
|
1014
|
+
}
|
|
1015
|
+
/** Closes the schedule sync dialog */
|
|
1016
|
+
CloseScheduleSyncDialog() {
|
|
1017
|
+
this.ShowScheduleSyncDialog = false;
|
|
1018
|
+
this.ScheduleSyncDocID = '';
|
|
1019
|
+
this.cdr.detectChanges();
|
|
1020
|
+
}
|
|
1021
|
+
/** Returns a human-readable description of a cron expression */
|
|
1022
|
+
GetScheduleCronPreview(cron) {
|
|
1023
|
+
return CronToHumanReadable(cron);
|
|
1024
|
+
}
|
|
1025
|
+
/** Saves a new ScheduledAction for vectorizing the selected entity document */
|
|
1026
|
+
async SaveScheduleSync() {
|
|
1027
|
+
if (this.ScheduleSyncSaving || !this.ScheduleSyncDocID)
|
|
1028
|
+
return;
|
|
1029
|
+
this.ScheduleSyncSaving = true;
|
|
1030
|
+
this.cdr.detectChanges();
|
|
1031
|
+
try {
|
|
1032
|
+
const actionID = await this.findVectorizeActionID();
|
|
1033
|
+
if (!actionID) {
|
|
1034
|
+
MJNotificationService.Instance.CreateSimpleNotification('Could not find the "__VectorizeEntity" action. Please check action configuration.', 'error', 5000);
|
|
1035
|
+
return;
|
|
1036
|
+
}
|
|
1037
|
+
const md = new Metadata();
|
|
1038
|
+
// Create ScheduledAction
|
|
1039
|
+
const scheduledAction = await md.GetEntityObject('MJ: Scheduled Actions');
|
|
1040
|
+
scheduledAction.NewRecord();
|
|
1041
|
+
scheduledAction.Name = `Vectorize: ${this.ScheduleSyncDocName}`;
|
|
1042
|
+
scheduledAction.Description = `Automated vectorization for entity document "${this.ScheduleSyncDocName}"`;
|
|
1043
|
+
scheduledAction.ActionID = actionID;
|
|
1044
|
+
scheduledAction.Type = 'Custom';
|
|
1045
|
+
scheduledAction.CronExpression = this.ScheduleSyncCron;
|
|
1046
|
+
scheduledAction.CustomCronExpression = this.ScheduleSyncCron;
|
|
1047
|
+
scheduledAction.Status = this.ScheduleSyncEnabled ? 'Active' : 'Disabled';
|
|
1048
|
+
scheduledAction.Timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
1049
|
+
const saved = await scheduledAction.Save();
|
|
1050
|
+
if (!saved) {
|
|
1051
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Failed to create schedule: ${scheduledAction.LatestResult?.Message ?? 'Unknown error'}`, 'error', 5000);
|
|
1052
|
+
return;
|
|
1053
|
+
}
|
|
1054
|
+
// Create param linking the entityDocumentID
|
|
1055
|
+
await this.createVectorizeScheduleParam(scheduledAction.ID, actionID, this.ScheduleSyncDocID);
|
|
1056
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Schedule created: ${CronToHumanReadable(this.ScheduleSyncCron)}`, 'success', 3000);
|
|
1057
|
+
this.CloseScheduleSyncDialog();
|
|
1058
|
+
}
|
|
1059
|
+
catch (error) {
|
|
1060
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
1061
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);
|
|
1062
|
+
}
|
|
1063
|
+
finally {
|
|
1064
|
+
this.ScheduleSyncSaving = false;
|
|
1065
|
+
this.cdr.detectChanges();
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
/** Find the __VectorizeEntity action ID */
|
|
1069
|
+
async findVectorizeActionID() {
|
|
1070
|
+
const rv = new RunView();
|
|
1071
|
+
const result = await rv.RunView({
|
|
1072
|
+
EntityName: 'Actions',
|
|
1073
|
+
ExtraFilter: `Name = '__VectorizeEntity'`,
|
|
1074
|
+
Fields: ['ID'],
|
|
1075
|
+
ResultType: 'simple',
|
|
1076
|
+
MaxRows: 1,
|
|
1077
|
+
});
|
|
1078
|
+
if (result.Success && result.Results.length > 0) {
|
|
1079
|
+
return result.Results[0].ID;
|
|
1080
|
+
}
|
|
1081
|
+
return null;
|
|
1082
|
+
}
|
|
1083
|
+
/** Create a ScheduledActionParam linking the entity document ID */
|
|
1084
|
+
async createVectorizeScheduleParam(scheduledActionID, actionID, entityDocumentID) {
|
|
1085
|
+
const rv = new RunView();
|
|
1086
|
+
const paramResult = await rv.RunView({
|
|
1087
|
+
EntityName: 'Action Params',
|
|
1088
|
+
ExtraFilter: `ActionID = '${actionID}' AND Name = 'entityDocumentID'`,
|
|
1089
|
+
Fields: ['ID', 'Name'],
|
|
1090
|
+
ResultType: 'simple',
|
|
1091
|
+
MaxRows: 1,
|
|
1092
|
+
});
|
|
1093
|
+
if (!paramResult.Success || paramResult.Results.length === 0) {
|
|
1094
|
+
console.warn('[VectorManagement] Could not find entityDocumentID action param');
|
|
1095
|
+
return;
|
|
1096
|
+
}
|
|
1097
|
+
const md = new Metadata();
|
|
1098
|
+
const param = await md.GetEntityObject('MJ: Scheduled Action Params');
|
|
1099
|
+
param.NewRecord();
|
|
1100
|
+
param.ScheduledActionID = scheduledActionID;
|
|
1101
|
+
param.ActionParamID = paramResult.Results[0].ID;
|
|
1102
|
+
param.ValueType = 'Static';
|
|
1103
|
+
param.Value = entityDocumentID;
|
|
1104
|
+
const saved = await param.Save();
|
|
1105
|
+
if (!saved) {
|
|
1106
|
+
console.warn('[VectorManagement] Failed to save schedule param:', param.LatestResult?.Message);
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
913
1109
|
// --- Suggest Document Dialog ---
|
|
914
1110
|
ShowSuggestDialog = false;
|
|
915
1111
|
IsSuggesting = false;
|
|
@@ -968,6 +1164,10 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
968
1164
|
// ================================================================
|
|
969
1165
|
async ngAfterViewInit() {
|
|
970
1166
|
await this.LoadData();
|
|
1167
|
+
this.navigationService.SetAgentContext(this, {
|
|
1168
|
+
TotalVectors: this.TotalVectors,
|
|
1169
|
+
KPICount: this.KPICards.length,
|
|
1170
|
+
});
|
|
971
1171
|
this.NotifyLoadComplete();
|
|
972
1172
|
}
|
|
973
1173
|
ngOnDestroy() {
|
|
@@ -1074,9 +1274,11 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1074
1274
|
if (idleTimer)
|
|
1075
1275
|
clearTimeout(idleTimer);
|
|
1076
1276
|
rxSub?.unsubscribe();
|
|
1077
|
-
// Use
|
|
1078
|
-
//
|
|
1079
|
-
Promise.resolve
|
|
1277
|
+
// Use setTimeout to defer state changes to the next macrotask,
|
|
1278
|
+
// avoiding ExpressionChangedAfterItHasBeenCheckedError.
|
|
1279
|
+
// (Promise.resolve microtasks run between Angular's check passes
|
|
1280
|
+
// and still trigger NG0100.)
|
|
1281
|
+
setTimeout(async () => {
|
|
1080
1282
|
this.removeSyncingId(entityDocumentId);
|
|
1081
1283
|
if (success) {
|
|
1082
1284
|
MJNotificationService.Instance.CreateSimpleNotification(`Vectorization complete for ${entityName}`, 'success', 3000);
|
|
@@ -1085,8 +1287,8 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1085
1287
|
else {
|
|
1086
1288
|
this.updateRowStatus(entityDocumentId, 'Error');
|
|
1087
1289
|
MJNotificationService.Instance.CreateSimpleNotification(`Vectorization failed for ${entityName}`, 'error', 5000);
|
|
1088
|
-
this.cdr.detectChanges();
|
|
1089
1290
|
}
|
|
1291
|
+
this.cdr.detectChanges();
|
|
1090
1292
|
});
|
|
1091
1293
|
};
|
|
1092
1294
|
// Reset idle timer on every event. When no events arrive for 5s,
|
|
@@ -1333,24 +1535,18 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1333
1535
|
// Private helpers
|
|
1334
1536
|
// ================================================================
|
|
1335
1537
|
async fetchAllData() {
|
|
1538
|
+
// Use cached engine data — BaseEngine's entity-event auto-refresh handles
|
|
1539
|
+
// updates from saves/deletes on the entities it tracks.
|
|
1540
|
+
const engine = KnowledgeHubMetadataEngine.Instance;
|
|
1541
|
+
await engine.Config(false);
|
|
1542
|
+
this.entityDocuments = engine.EntityDocuments;
|
|
1543
|
+
this.vectorDatabases = AIEngineBase.Instance.VectorDatabases;
|
|
1544
|
+
this.vectorIndexes = engine.VectorIndexes;
|
|
1545
|
+
// Entity Record Documents and AI Models are not cached in the engine —
|
|
1546
|
+
// record documents are high-volume instance data, and AI models are loaded
|
|
1547
|
+
// from a different domain. Fetch them via RunView.
|
|
1336
1548
|
const rv = new RunView();
|
|
1337
|
-
const [
|
|
1338
|
-
{
|
|
1339
|
-
EntityName: 'MJ: Entity Documents',
|
|
1340
|
-
ExtraFilter: '',
|
|
1341
|
-
OrderBy: 'Name',
|
|
1342
|
-
ResultType: 'entity_object'
|
|
1343
|
-
},
|
|
1344
|
-
{
|
|
1345
|
-
EntityName: 'MJ: Vector Databases',
|
|
1346
|
-
ExtraFilter: '',
|
|
1347
|
-
ResultType: 'entity_object'
|
|
1348
|
-
},
|
|
1349
|
-
{
|
|
1350
|
-
EntityName: 'MJ: Vector Indexes',
|
|
1351
|
-
ExtraFilter: '',
|
|
1352
|
-
ResultType: 'entity_object'
|
|
1353
|
-
},
|
|
1549
|
+
const [erdResult, modelsResult] = await rv.RunViews([
|
|
1354
1550
|
{
|
|
1355
1551
|
EntityName: 'MJ: Entity Record Documents',
|
|
1356
1552
|
ExtraFilter: '',
|
|
@@ -1363,15 +1559,6 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1363
1559
|
ResultType: 'entity_object'
|
|
1364
1560
|
}
|
|
1365
1561
|
]);
|
|
1366
|
-
if (docsResult.Success) {
|
|
1367
|
-
this.entityDocuments = docsResult.Results;
|
|
1368
|
-
}
|
|
1369
|
-
if (vdbResult.Success) {
|
|
1370
|
-
this.vectorDatabases = vdbResult.Results;
|
|
1371
|
-
}
|
|
1372
|
-
if (viResult.Success) {
|
|
1373
|
-
this.vectorIndexes = viResult.Results;
|
|
1374
|
-
}
|
|
1375
1562
|
if (erdResult.Success) {
|
|
1376
1563
|
this.recordDocuments = erdResult.Results;
|
|
1377
1564
|
}
|
|
@@ -1759,11 +1946,11 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1759
1946
|
};
|
|
1760
1947
|
}
|
|
1761
1948
|
static ɵfac = /*@__PURE__*/ (() => { let ɵVectorManagementResourceComponent_BaseFactory; return function VectorManagementResourceComponent_Factory(__ngFactoryType__) { return (ɵVectorManagementResourceComponent_BaseFactory || (ɵVectorManagementResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(VectorManagementResourceComponent)))(__ngFactoryType__ || VectorManagementResourceComponent); }; })();
|
|
1762
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VectorManagementResourceComponent, selectors: [["app-vector-management-resource"]], inputs: { EmbeddedMode: "EmbeddedMode" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "vector-loading"], ["text", "Loading vector management data..."], [1, "vector-dashboard"], [1, "view-mode-toggle"], [1, "kpi-row"], [3, "data"], [1, "content-area"], [1, "sync-table-panel"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-table-list"], [1, "panel-actions"], ["title", "Use AI to suggest an Entity Document template", 1, "suggest-btn", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "suggest-btn-text"], ["title", "Refresh data", 1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "empty-state"], [1, "table-wrapper"], [1, "sidebar"], [1, "sidebar-card"], [1, "sidebar-title"], [1, "fa-solid", "fa-heart-pulse"], [1, "health-row"], [1, "health-dot"], [1, "health-label"], [1, "health-status"], [1, "fa-solid", "fa-microchip"], [1, "model-info"], [1, "info-row"], [1, "info-label"], [1, "info-value"], [1, "fa-solid", "fa-hard-drive"], [1, "gauge-container"], [1, "gauge-bar"], [1, "gauge-fill"], [1, "gauge-label"], [1, "storage-detail"], [1, "slide-panel-overlay"], [1, "view-mode-btn", 3, "click"], [1, "fa-solid", "fa-cubes"], [1, "fa-solid", "fa-gauge-high"], [1, "fa-solid", "fa-folder-open"], [1, "sync-table"], [1, "text-right"], [1, "text-center"], [1, "entity-name"], [1, "document-name"], [1, "text-right", "vector-count"], [1, "last-synced"], [1, "status-badge"], [1, "text-center", "actions-cell"], ["title", "Sync now", 1, "sync-btn", 3, "click", "disabled"], ["title", "Edit entity document", 1, "edit-btn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "slide-panel-overlay", 3, "click"], [1, "slide-panel", "open", 3, "click"], [1, "suggest-dialog-header"], [1, "suggest-dialog-title"], [1, "suggest-close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "suggest-dialog-body"], [1, "suggest-form"], [1, "suggest-field"], [1, "suggest-label"], [1, "edit-readonly-value"], ["type", "text", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "suggest-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "suggest-select", 3, "ngModel"], [1, "edit-readonly-value", 2, "font-size", "13px", "color", "var(--mj-text-muted)"], ["value", "Active"], ["value", "Inactive"], [1, "result-actions", 2, "margin-top", "1rem"], ["text", "Saving...", "size", "small"], ["value", ""], [1, "suggest-submit-btn", 3, "click"], [1, "fa-solid", "fa-save"], [1, "edit-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "suggest-close-action", 3, "click"], [1, "slide-panel", 3, "click"], [1, "suggest-result"], [1, "entity-picker"], [1, "entity-picker-trigger", 3, "click"], [1, "fa-solid", "fa-chevron-down", "entity-picker-arrow"], [1, "entity-picker-dropdown"], [1, "use-case-options"], [1, "use-case-btn", 3, "click"], [1, "fa-solid", "fa-clone"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-solid", "fa-tags"], [1, "suggest-submit-btn", 3, "click", "disabled"], [1, "suggestion-error"], [1, "fa-solid", "fa-table"], [1, "entity-picker-value"], [1, "fa-solid", "fa-search"], [1, "entity-picker-placeholder"], [1, "entity-picker-search"], ["type", "text", "placeholder", "Filter entities...", "autofocus", "", 1, "entity-picker-search-input", 3, "ngModelChange", "input", "ngModel"], [1, "entity-picker-list"], [1, "entity-picker-group"], [1, "entity-picker-empty"], [1, "entity-picker-group-header"], [1, "fa-solid", "fa-database"], [1, "entity-picker-item", 3, "entity-picker-item-selected"], [1, "entity-picker-item", 3, "click"], [1, "fa-solid", "fa-circle-exclamation"], [1, "result-section"], [1, "result-heading"], [1, "template-editor-wrapper"], ["language", "markdown", 3, "change", "value", "readonly", "lineWrapping"], [1, "result-tags"], [1, "result-tag"], [1, "result-section", "result-thresholds"], [1, "threshold-item"], [1, "threshold-label"], [1, "threshold-value"], [1, "result-reasoning"], [1, "suggest-field", 2, "margin-top", "0.75rem"], [1, "result-actions"], [1, "save-spinner"], [1, "result-relationship"], [1, "rel-name"], [1, "rel-fields"], [1, "fa-solid", "fa-floppy-disk"], [1, "suggest-submit-btn", "suggest-try-again-btn", 3, "click"], [1, "fa-solid", "fa-rotate"]], template: function VectorManagementResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1763
|
-
i0.ɵɵconditionalCreate(0, VectorManagementResourceComponent_Conditional_0_Template, 2, 0, "div", 0)(1, VectorManagementResourceComponent_Conditional_1_Template,
|
|
1949
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VectorManagementResourceComponent, selectors: [["app-vector-management-resource"]], inputs: { EmbeddedMode: "EmbeddedMode" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "vector-loading"], ["text", "Loading vector management data..."], [1, "vector-dashboard"], [1, "view-mode-toggle"], [1, "kpi-row"], [3, "data"], [1, "content-area"], [1, "sync-table-panel"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-table-list"], [1, "panel-actions"], ["title", "Use AI to suggest an Entity Document template", 1, "suggest-btn", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "suggest-btn-text"], ["title", "Refresh data", 1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "empty-state"], [1, "table-wrapper"], [1, "sidebar"], [1, "sidebar-card"], [1, "sidebar-title"], [1, "fa-solid", "fa-heart-pulse"], [1, "health-row"], [1, "health-dot"], [1, "health-label"], [1, "health-status"], [1, "fa-solid", "fa-microchip"], [1, "model-info"], [1, "info-row"], [1, "info-label"], [1, "info-value"], [1, "fa-solid", "fa-hard-drive"], [1, "gauge-container"], [1, "gauge-bar"], [1, "gauge-fill"], [1, "gauge-label"], [1, "storage-detail"], [1, "slide-panel-overlay"], [1, "view-mode-btn", 3, "click"], [1, "fa-solid", "fa-cubes"], [1, "fa-solid", "fa-gauge-high"], [1, "fa-solid", "fa-folder-open"], [1, "sync-table"], [1, "text-right"], [1, "text-center"], [1, "entity-name"], [1, "document-name"], [1, "text-right", "vector-count"], [1, "last-synced"], [1, "status-badge"], [1, "text-center", "actions-cell"], ["title", "Sync now", 1, "sync-btn", 3, "click", "disabled"], ["title", "Schedule recurring sync", 1, "schedule-btn", 3, "click"], [1, "fa-regular", "fa-clock"], ["title", "Edit entity document", 1, "edit-btn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "slide-panel-overlay", 3, "click"], [1, "slide-panel", "open", 3, "click"], [1, "suggest-dialog-header"], [1, "suggest-dialog-title"], [1, "suggest-close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "suggest-dialog-body"], [1, "suggest-form"], [1, "suggest-field"], [1, "suggest-label"], [1, "edit-readonly-value"], ["type", "text", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "suggest-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "suggest-select", 3, "ngModel"], [1, "edit-readonly-value", 2, "font-size", "13px", "color", "var(--mj-text-muted)"], ["value", "Active"], ["value", "Inactive"], [1, "result-actions", 2, "margin-top", "1rem"], ["text", "Saving...", "size", "small"], ["value", ""], [1, "suggest-submit-btn", 3, "click"], [1, "fa-solid", "fa-save"], [1, "edit-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "suggest-close-action", 3, "click"], [1, "schedule-dialog", 3, "click"], ["type", "text", "placeholder", "0 2 * * *", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "schedule-cron-preview"], [1, "fa-solid", "fa-info-circle"], [1, "suggest-field", "schedule-toggle-row"], ["type", "checkbox", 1, "mj-checkbox", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-check"], [1, "slide-panel", 3, "click"], [1, "suggest-result"], [1, "entity-picker"], [1, "entity-picker-trigger", 3, "click"], [1, "fa-solid", "fa-chevron-down", "entity-picker-arrow"], [1, "entity-picker-dropdown"], [1, "use-case-options"], [1, "use-case-btn", 3, "click"], [1, "fa-solid", "fa-clone"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-solid", "fa-tags"], [1, "suggest-submit-btn", 3, "click", "disabled"], [1, "suggestion-error"], [1, "fa-solid", "fa-table"], [1, "entity-picker-value"], [1, "fa-solid", "fa-search"], [1, "entity-picker-placeholder"], [1, "entity-picker-search"], ["type", "text", "placeholder", "Filter entities...", "autofocus", "", 1, "entity-picker-search-input", 3, "ngModelChange", "input", "ngModel"], [1, "entity-picker-list"], [1, "entity-picker-group"], [1, "entity-picker-empty"], [1, "entity-picker-group-header"], [1, "fa-solid", "fa-database"], [1, "entity-picker-item", 3, "entity-picker-item-selected"], [1, "entity-picker-item", 3, "click"], [1, "fa-solid", "fa-circle-exclamation"], [1, "result-section"], [1, "result-heading"], [1, "template-editor-wrapper"], ["language", "markdown", 3, "change", "value", "readonly", "lineWrapping"], [1, "result-tags"], [1, "result-tag"], [1, "result-section", "result-thresholds"], [1, "threshold-item"], [1, "threshold-label"], [1, "threshold-value"], [1, "result-reasoning"], [1, "suggest-field", 2, "margin-top", "0.75rem"], [1, "result-actions"], [1, "save-spinner"], [1, "result-relationship"], [1, "rel-name"], [1, "rel-fields"], [1, "fa-solid", "fa-floppy-disk"], [1, "suggest-submit-btn", "suggest-try-again-btn", 3, "click"], [1, "fa-solid", "fa-rotate"]], template: function VectorManagementResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1950
|
+
i0.ɵɵconditionalCreate(0, VectorManagementResourceComponent_Conditional_0_Template, 2, 0, "div", 0)(1, VectorManagementResourceComponent_Conditional_1_Template, 58, 17);
|
|
1764
1951
|
} if (rf & 2) {
|
|
1765
1952
|
i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
|
|
1766
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.CodeEditorComponent, i3.LoadingComponent, i4.KPICardComponent, i5.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n.vector-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.vector-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n\n\n.kpi-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.sync-table-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.sync-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.text-right[_ngcontent-%COMP%] {\n text-align: right;\n}\n\n.text-center[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.entity-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.document-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.vector-count[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n\n\n\n.actions-cell[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.edit-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.edit-delete-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n\n\n.sync-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n\n\n.health-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n\n.gauge-container[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.gauge-bar[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n.suggest-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n\n.slide-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.suggest-dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn[_ngcontent-%COMP%] {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.suggest-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n.use-case-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n\n.entity-picker[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty[_ngcontent-%COMP%] {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n\n\n\n.template-editor-wrapper[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper[_ngcontent-%COMP%] .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.suggest-result[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.result-heading[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action[_ngcontent-%COMP%] {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.suggest-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n.suggest-try-again-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n.save-spinner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n\n\n\n\n\n@media (max-width: 768px) {\n .panel-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel[_ngcontent-%COMP%] {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .suggest-btn[_ngcontent-%COMP%] .suggest-btn-text[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
|
|
1953
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.CodeEditorComponent, i3.LoadingComponent, i4.KPICardComponent, i5.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n.vector-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.vector-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n\n\n.kpi-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.sync-table-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.sync-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.text-right[_ngcontent-%COMP%] {\n text-align: right;\n}\n\n.text-center[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.entity-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.document-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.vector-count[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n\n\n\n.actions-cell[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.schedule-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.schedule-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.edit-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.schedule-dialog[_ngcontent-%COMP%] {\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n}\n\n.schedule-cron-preview[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 0 0;\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n}\n\n.schedule-toggle-row[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n\n\n.sync-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n\n\n.health-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n\n.gauge-container[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.gauge-bar[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n.suggest-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n\n.slide-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.suggest-dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn[_ngcontent-%COMP%] {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.suggest-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n.use-case-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n\n.entity-picker[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty[_ngcontent-%COMP%] {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n\n\n\n.template-editor-wrapper[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper[_ngcontent-%COMP%] .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.suggest-result[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.result-heading[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action[_ngcontent-%COMP%] {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.suggest-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n.suggest-try-again-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n.save-spinner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n\n\n\n\n\n@media (max-width: 768px) {\n .panel-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel[_ngcontent-%COMP%] {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .suggest-btn[_ngcontent-%COMP%] .suggest-btn-text[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
|
|
1767
1954
|
};
|
|
1768
1955
|
VectorManagementResourceComponent = __decorate([
|
|
1769
1956
|
RegisterClass(BaseResourceComponent, 'VectorManagementResource')
|
|
@@ -1771,11 +1958,11 @@ VectorManagementResourceComponent = __decorate([
|
|
|
1771
1958
|
export { VectorManagementResourceComponent };
|
|
1772
1959
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VectorManagementResourceComponent, [{
|
|
1773
1960
|
type: Component,
|
|
1774
|
-
args: [{ standalone: false, selector: 'app-vector-management-resource', template: "@if (IsLoading) {\n <div class=\"vector-loading\">\n <mj-loading text=\"Loading vector management data...\"></mj-loading>\n </div>\n} @else {\n <div class=\"vector-dashboard\">\n <!-- View Mode Toggle -->\n @if (!EmbeddedMode) {\n <div class=\"view-mode-toggle\">\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'index'\" (click)=\"ViewMode = 'index'\">\n <i class=\"fa-solid fa-cubes\"></i> Index View\n </button>\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'operations'\" (click)=\"ViewMode = 'operations'\">\n <i class=\"fa-solid fa-gauge-high\"></i> Operations\n </button>\n </div>\n }\n\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n @for (card of KPICards; track card.title) {\n <app-kpi-card [data]=\"card\"></app-kpi-card>\n }\n </div>\n\n <!-- Main Content Area: Table + Sidebar -->\n <div class=\"content-area\">\n <!-- Entity Sync Table -->\n <div class=\"sync-table-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-table-list\"></i>\n Entity Sync Status\n </h3>\n <div class=\"panel-actions\">\n <button class=\"suggest-btn\" (click)=\"OpenSuggestDialog()\" title=\"Use AI to suggest an Entity Document template\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span class=\"suggest-btn-text\">Suggest Document</span>\n </button>\n <button class=\"refresh-btn\" (click)=\"LoadData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n @if (SyncRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No entity documents configured for vectorization.</p>\n </div>\n } @else {\n <div class=\"table-wrapper\">\n <table class=\"sync-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Document</th>\n <th class=\"text-right\">Vectors</th>\n <th>Last Synced</th>\n <th>Status</th>\n <th class=\"text-center\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of SyncRows; track row.EntityDocumentID) {\n <tr>\n <td class=\"entity-name\">{{ row.EntityName }}</td>\n <td class=\"document-name\">{{ row.DocumentName }}</td>\n <td class=\"text-right vector-count\">{{ row.VectorCount | number }}</td>\n <td class=\"last-synced\">{{ FormatDate(row.LastSynced) }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"GetStatusClass(row.Status)\">\n <i [class]=\"GetStatusIcon(row.Status)\"></i>\n @if (row.Status === 'Syncing' && row.PercentComplete > 0) {\n {{ row.PercentComplete }}%\n } @else {\n {{ row.Status }}\n }\n </span>\n </td>\n <td class=\"text-center actions-cell\">\n <button\n class=\"sync-btn\"\n [disabled]=\"SyncingIds.has(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (SyncingIds.has(row.EntityDocumentID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ row.PercentComplete > 0 ? row.PercentComplete + '%' : 'Sync' }}\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Sync\n }\n </button>\n <button\n class=\"edit-btn\"\n (click)=\"OpenEditPanel(row.EntityDocumentID)\"\n title=\"Edit entity document\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- Sidebar Panels -->\n <div class=\"sidebar\">\n <!-- Vector DB Health -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-heart-pulse\"></i>\n Vector DB Health\n </h4>\n <div class=\"health-row\">\n <span class=\"health-dot\" [class]=\"DBHealthClass\"></span>\n <span class=\"health-label\">{{ VectorDBName }}</span>\n </div>\n <div class=\"health-status\">{{ VectorDBStatus }}</div>\n </div>\n\n <!-- Embedding Model Info -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Embedding Model\n </h4>\n <div class=\"model-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">{{ EmbeddingModel.Name }}</span>\n </div>\n @if (EmbeddingModel.Dimensions != null) {\n <div class=\"info-row\">\n <span class=\"info-label\">Dimensions</span>\n <span class=\"info-value\">{{ EmbeddingModel.Dimensions | number }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Storage Usage -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n Vectorization Coverage\n </h4>\n <div class=\"gauge-container\">\n <div class=\"gauge-bar\">\n <div class=\"gauge-fill\" [style.width.%]=\"StorageUsagePercent\"></div>\n </div>\n <div class=\"gauge-label\">{{ StorageLabel }} of records vectorized</div>\n </div>\n <div class=\"storage-detail\">\n {{ TotalVectors | number }} vectors stored\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Edit Entity Document Slide-in Panel -->\n @if (ShowEditPanel) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseEditPanel()\">\n <div class=\"slide-panel open\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit Entity Document\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <span class=\"edit-readonly-value\">{{ EditDocEntityName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"EditDocName\" />\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocAIModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (EditFilteredIndexes.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of EditFilteredIndexes; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes for this database \u2014 one will be created automatically on sync\n </span>\n }\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Status</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocStatus\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (IsEditSaving || IsEditDeleting) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveEditedDocument()\">\n <i class=\"fa-solid fa-save\"></i> Save Changes\n </button>\n <button class=\"edit-delete-btn\" (click)=\"DeleteEntityDocument()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Suggest Document Slide-in Panel -->\n @if (ShowSuggestDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseSuggestDialog()\">\n <div class=\"slide-panel\" [class.open]=\"ShowSuggestDialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n AI Document Suggestion\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseSuggestDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n @if (!SuggestionResult) {\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <div class=\"entity-picker\">\n <button class=\"entity-picker-trigger\" (click)=\"ToggleEntityPicker()\">\n @if (SuggestEntityName) {\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"entity-picker-value\">{{ SuggestEntityName }}</span>\n } @else {\n <i class=\"fa-solid fa-search\"></i>\n <span class=\"entity-picker-placeholder\">Search and select an entity...</span>\n }\n <i class=\"fa-solid fa-chevron-down entity-picker-arrow\"></i>\n </button>\n @if (ShowEntityPicker) {\n <div class=\"entity-picker-dropdown\">\n <div class=\"entity-picker-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n class=\"entity-picker-search-input\"\n placeholder=\"Filter entities...\"\n [(ngModel)]=\"EntitySearchText\"\n (input)=\"FilterEntities()\"\n autofocus />\n </div>\n <div class=\"entity-picker-list\">\n @for (group of FilteredEntityGroups; track group.SchemaName) {\n <div class=\"entity-picker-group\">\n <div class=\"entity-picker-group-header\">\n <i class=\"fa-solid fa-database\"></i>\n {{ group.SchemaName }}\n </div>\n @for (entity of group.Entities; track entity.ID) {\n <button class=\"entity-picker-item\"\n [class.entity-picker-item-selected]=\"entity.Name === SuggestEntityName\"\n (click)=\"SelectEntity(entity.Name)\">\n <i class=\"fa-solid fa-table\"></i>\n {{ entity.Name }}\n </button>\n }\n </div>\n }\n @if (FilteredEntityGroups.length === 0) {\n <div class=\"entity-picker-empty\">\n No entities matching \"{{ EntitySearchText }}\"\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Use Case</label>\n <div class=\"use-case-options\">\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'duplicate detection'\"\n (click)=\"SuggestUseCase = 'duplicate detection'\">\n <i class=\"fa-solid fa-clone\"></i>\n Duplicate Detection\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'search'\"\n (click)=\"SuggestUseCase = 'search'\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n Search\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'classification'\"\n (click)=\"SuggestUseCase = 'classification'\">\n <i class=\"fa-solid fa-tags\"></i>\n Classification\n </button>\n </div>\n </div>\n <button class=\"suggest-submit-btn\"\n [disabled]=\"IsSuggesting || !SuggestEntityName\"\n (click)=\"RunSuggestion()\">\n @if (IsSuggesting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating with AI...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Generate Template\n }\n </button>\n @if (SuggestionError) {\n <div class=\"suggestion-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ SuggestionError }}\n </div>\n }\n </div>\n } @else {\n <div class=\"suggest-result\">\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Suggested Template</h4>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditableTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Selected Fields</h4>\n <div class=\"result-tags\">\n @for (field of SuggestionResult.selectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n @if (SuggestionResult.selectedRelationships.length > 0) {\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Related Entities</h4>\n @for (rel of SuggestionResult.selectedRelationships; track rel.name) {\n <div class=\"result-relationship\">\n <span class=\"rel-name\">{{ rel.name }}</span>\n <span class=\"rel-fields\">{{ rel.fields.join(', ') }}</span>\n </div>\n }\n </div>\n }\n <div class=\"result-section result-thresholds\">\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Potential Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.potentialMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Absolute Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.absoluteMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Reasoning</h4>\n <p class=\"result-reasoning\">{{ SuggestionResult.reasoning }}</p>\n </div>\n <div class=\"result-section\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"SaveDocumentName\" />\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedEmbeddingModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (FilteredIndexesForSelectedDB.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of FilteredIndexesForSelectedDB; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync\n </span>\n }\n </div>\n </div>\n <div class=\"result-actions\">\n @if (IsSavingDocument) {\n <div class=\"save-spinner\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveAsEntityDocument()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Entity Document\n </button>\n <button class=\"suggest-submit-btn suggest-try-again-btn\" (click)=\"ClearSuggestion()\">\n <i class=\"fa-solid fa-rotate\"></i> Try Again\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseSuggestDialog()\">\n Close\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n}\n", styles: ["/* ================================================================\n Vector Management Dashboard\n All colors use MJ design tokens from _tokens.scss\n ================================================================ */\n\n/* --- Loading state --- */\n.vector-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n/* --- View Mode Toggle --- */\n.view-mode-toggle {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* --- Dashboard container --- */\n.vector-dashboard {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n/* --- KPI cards row --- */\n.kpi-row {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Main content: table + sidebar --- */\n.content-area {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Sync table panel --- */\n.sync-table-panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Empty state --- */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state i {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n/* --- Table --- */\n.table-wrapper {\n overflow-x: auto;\n}\n\n.sync-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table th {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.text-right {\n text-align: right;\n}\n\n.text-center {\n text-align: center;\n}\n\n.entity-name {\n font-weight: 600;\n}\n\n.document-name {\n color: var(--mj-text-secondary);\n}\n\n.vector-count {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n/* --- Action buttons in table --- */\n\n.actions-cell {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.edit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.edit-delete-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n/* --- Status badges --- */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n/* --- Sync button --- */\n.sync-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ================================================================\n Sidebar\n ================================================================ */\n.sidebar {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title i {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n/* --- Vector DB Health --- */\n.health-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n/* --- Model Info --- */\n.model-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* --- Storage / Coverage Gauge --- */\n.gauge-container {\n margin-bottom: 8px;\n}\n\n.gauge-bar {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* --- Panel actions row --- */\n.panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* --- Suggest Document Button --- */\n.suggest-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* --- Slide-in Panel Overlay --- */\n.slide-panel-overlay {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open {\n transform: translateX(0);\n}\n\n.suggest-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title i {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body {\n padding: 24px;\n}\n\n/* --- Suggest Form --- */\n.suggest-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ---- Use Case Button Group ---- */\n\n.use-case-options {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn i {\n font-size: 12px;\n}\n\n/* ---- Entity Picker (grouped by schema) ---- */\n\n.entity-picker {\n position: relative;\n}\n\n.entity-picker-trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search i {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header i {\n font-size: 10px;\n}\n\n.entity-picker-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item i {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected i {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n/* ---- Template Editor ---- */\n\n.template-editor-wrapper {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper ::ng-deep .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error i {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* --- Suggestion Result --- */\n.suggest-result {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section:last-child {\n border-bottom: none;\n}\n\n.result-heading {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* --- Suggest Input --- */\n.suggest-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* --- Try Again Button (secondary style) --- */\n.suggest-try-again-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* --- Save Spinner --- */\n.save-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n/* ================================================================\n Responsive \u2014 Vector Management\n ================================================================ */\n\n@media (max-width: 768px) {\n .panel-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard {\n padding: 12px;\n }\n\n .suggest-btn .suggest-btn-text {\n display: none;\n }\n}\n"] }]
|
|
1961
|
+
args: [{ standalone: false, selector: 'app-vector-management-resource', template: "@if (IsLoading) {\n <div class=\"vector-loading\">\n <mj-loading text=\"Loading vector management data...\"></mj-loading>\n </div>\n} @else {\n <div class=\"vector-dashboard\">\n <!-- View Mode Toggle -->\n @if (!EmbeddedMode) {\n <div class=\"view-mode-toggle\">\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'index'\" (click)=\"ViewMode = 'index'\">\n <i class=\"fa-solid fa-cubes\"></i> Index View\n </button>\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'operations'\" (click)=\"ViewMode = 'operations'\">\n <i class=\"fa-solid fa-gauge-high\"></i> Operations\n </button>\n </div>\n }\n\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n @for (card of KPICards; track card.title) {\n <app-kpi-card [data]=\"card\"></app-kpi-card>\n }\n </div>\n\n <!-- Main Content Area: Table + Sidebar -->\n <div class=\"content-area\">\n <!-- Entity Sync Table -->\n <div class=\"sync-table-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-table-list\"></i>\n Entity Sync Status\n </h3>\n <div class=\"panel-actions\">\n <button class=\"suggest-btn\" (click)=\"OpenSuggestDialog()\" title=\"Use AI to suggest an Entity Document template\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span class=\"suggest-btn-text\">Suggest Document</span>\n </button>\n <button class=\"refresh-btn\" (click)=\"LoadData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n @if (SyncRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No entity documents configured for vectorization.</p>\n </div>\n } @else {\n <div class=\"table-wrapper\">\n <table class=\"sync-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Document</th>\n <th class=\"text-right\">Vectors</th>\n <th>Last Synced</th>\n <th>Status</th>\n <th class=\"text-center\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of SyncRows; track row.EntityDocumentID) {\n <tr>\n <td class=\"entity-name\">{{ row.EntityName }}</td>\n <td class=\"document-name\">{{ row.DocumentName }}</td>\n <td class=\"text-right vector-count\">{{ row.VectorCount | number }}</td>\n <td class=\"last-synced\">{{ FormatDate(row.LastSynced) }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"GetStatusClass(row.Status)\">\n <i [class]=\"GetStatusIcon(row.Status)\"></i>\n @if (row.Status === 'Syncing' && row.PercentComplete > 0) {\n {{ row.PercentComplete }}%\n } @else {\n {{ row.Status }}\n }\n </span>\n </td>\n <td class=\"text-center actions-cell\">\n <button\n class=\"sync-btn\"\n [disabled]=\"SyncingIds.has(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (SyncingIds.has(row.EntityDocumentID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ row.PercentComplete > 0 ? row.PercentComplete + '%' : 'Sync' }}\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Sync\n }\n </button>\n <button\n class=\"schedule-btn\"\n (click)=\"OpenScheduleSyncDialog(row.EntityDocumentID)\"\n title=\"Schedule recurring sync\">\n <i class=\"fa-regular fa-clock\"></i>\n </button>\n <button\n class=\"edit-btn\"\n (click)=\"OpenEditPanel(row.EntityDocumentID)\"\n title=\"Edit entity document\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- Sidebar Panels -->\n <div class=\"sidebar\">\n <!-- Vector DB Health -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-heart-pulse\"></i>\n Vector DB Health\n </h4>\n <div class=\"health-row\">\n <span class=\"health-dot\" [class]=\"DBHealthClass\"></span>\n <span class=\"health-label\">{{ VectorDBName }}</span>\n </div>\n <div class=\"health-status\">{{ VectorDBStatus }}</div>\n </div>\n\n <!-- Embedding Model Info -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Embedding Model\n </h4>\n <div class=\"model-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">{{ EmbeddingModel.Name }}</span>\n </div>\n @if (EmbeddingModel.Dimensions != null) {\n <div class=\"info-row\">\n <span class=\"info-label\">Dimensions</span>\n <span class=\"info-value\">{{ EmbeddingModel.Dimensions | number }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Storage Usage -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n Vectorization Coverage\n </h4>\n <div class=\"gauge-container\">\n <div class=\"gauge-bar\">\n <div class=\"gauge-fill\" [style.width.%]=\"StorageUsagePercent\"></div>\n </div>\n <div class=\"gauge-label\">{{ StorageLabel }} of records vectorized</div>\n </div>\n <div class=\"storage-detail\">\n {{ TotalVectors | number }} vectors stored\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Edit Entity Document Slide-in Panel -->\n @if (ShowEditPanel) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseEditPanel()\">\n <div class=\"slide-panel open\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit Entity Document\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <span class=\"edit-readonly-value\">{{ EditDocEntityName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"EditDocName\" />\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocAIModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (EditFilteredIndexes.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of EditFilteredIndexes; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes for this database \u2014 one will be created automatically on sync\n </span>\n }\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Status</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocStatus\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (IsEditSaving || IsEditDeleting) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveEditedDocument()\">\n <i class=\"fa-solid fa-save\"></i> Save Changes\n </button>\n <button class=\"edit-delete-btn\" (click)=\"DeleteEntityDocument()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Schedule Sync Dialog -->\n @if (ShowScheduleSyncDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseScheduleSyncDialog()\">\n <div class=\"schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Schedule Vector Sync\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseScheduleSyncDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity Document</label>\n <span class=\"edit-readonly-value\">{{ ScheduleSyncDocName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Action</label>\n <span class=\"edit-readonly-value\">__VectorizeEntity</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Cron Expression</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"ScheduleSyncCron\" placeholder=\"0 2 * * *\" />\n <div class=\"schedule-cron-preview\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ GetScheduleCronPreview(ScheduleSyncCron) }}\n </div>\n </div>\n <div class=\"suggest-field schedule-toggle-row\">\n <label class=\"suggest-label\">Enabled</label>\n <input type=\"checkbox\" class=\"mj-checkbox\" [(ngModel)]=\"ScheduleSyncEnabled\" />\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (ScheduleSyncSaving) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveScheduleSync()\">\n <i class=\"fa-solid fa-check\"></i> Create Schedule\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseScheduleSyncDialog()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Suggest Document Slide-in Panel -->\n @if (ShowSuggestDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseSuggestDialog()\">\n <div class=\"slide-panel\" [class.open]=\"ShowSuggestDialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n AI Document Suggestion\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseSuggestDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n @if (!SuggestionResult) {\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <div class=\"entity-picker\">\n <button class=\"entity-picker-trigger\" (click)=\"ToggleEntityPicker()\">\n @if (SuggestEntityName) {\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"entity-picker-value\">{{ SuggestEntityName }}</span>\n } @else {\n <i class=\"fa-solid fa-search\"></i>\n <span class=\"entity-picker-placeholder\">Search and select an entity...</span>\n }\n <i class=\"fa-solid fa-chevron-down entity-picker-arrow\"></i>\n </button>\n @if (ShowEntityPicker) {\n <div class=\"entity-picker-dropdown\">\n <div class=\"entity-picker-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n class=\"entity-picker-search-input\"\n placeholder=\"Filter entities...\"\n [(ngModel)]=\"EntitySearchText\"\n (input)=\"FilterEntities()\"\n autofocus />\n </div>\n <div class=\"entity-picker-list\">\n @for (group of FilteredEntityGroups; track group.SchemaName) {\n <div class=\"entity-picker-group\">\n <div class=\"entity-picker-group-header\">\n <i class=\"fa-solid fa-database\"></i>\n {{ group.SchemaName }}\n </div>\n @for (entity of group.Entities; track entity.ID) {\n <button class=\"entity-picker-item\"\n [class.entity-picker-item-selected]=\"entity.Name === SuggestEntityName\"\n (click)=\"SelectEntity(entity.Name)\">\n <i class=\"fa-solid fa-table\"></i>\n {{ entity.Name }}\n </button>\n }\n </div>\n }\n @if (FilteredEntityGroups.length === 0) {\n <div class=\"entity-picker-empty\">\n No entities matching \"{{ EntitySearchText }}\"\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Use Case</label>\n <div class=\"use-case-options\">\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'duplicate detection'\"\n (click)=\"SuggestUseCase = 'duplicate detection'\">\n <i class=\"fa-solid fa-clone\"></i>\n Duplicate Detection\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'search'\"\n (click)=\"SuggestUseCase = 'search'\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n Search\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'classification'\"\n (click)=\"SuggestUseCase = 'classification'\">\n <i class=\"fa-solid fa-tags\"></i>\n Classification\n </button>\n </div>\n </div>\n <button class=\"suggest-submit-btn\"\n [disabled]=\"IsSuggesting || !SuggestEntityName\"\n (click)=\"RunSuggestion()\">\n @if (IsSuggesting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating with AI...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Generate Template\n }\n </button>\n @if (SuggestionError) {\n <div class=\"suggestion-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ SuggestionError }}\n </div>\n }\n </div>\n } @else {\n <div class=\"suggest-result\">\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Suggested Template</h4>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditableTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Selected Fields</h4>\n <div class=\"result-tags\">\n @for (field of SuggestionResult.selectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n @if (SuggestionResult.selectedRelationships.length > 0) {\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Related Entities</h4>\n @for (rel of SuggestionResult.selectedRelationships; track rel.name) {\n <div class=\"result-relationship\">\n <span class=\"rel-name\">{{ rel.name }}</span>\n <span class=\"rel-fields\">{{ rel.fields.join(', ') }}</span>\n </div>\n }\n </div>\n }\n <div class=\"result-section result-thresholds\">\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Potential Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.potentialMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Absolute Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.absoluteMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Reasoning</h4>\n <p class=\"result-reasoning\">{{ SuggestionResult.reasoning }}</p>\n </div>\n <div class=\"result-section\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"SaveDocumentName\" />\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedEmbeddingModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (FilteredIndexesForSelectedDB.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of FilteredIndexesForSelectedDB; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync\n </span>\n }\n </div>\n </div>\n <div class=\"result-actions\">\n @if (IsSavingDocument) {\n <div class=\"save-spinner\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveAsEntityDocument()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Entity Document\n </button>\n <button class=\"suggest-submit-btn suggest-try-again-btn\" (click)=\"ClearSuggestion()\">\n <i class=\"fa-solid fa-rotate\"></i> Try Again\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseSuggestDialog()\">\n Close\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n}\n", styles: ["/* ================================================================\n Vector Management Dashboard\n All colors use MJ design tokens from _tokens.scss\n ================================================================ */\n\n/* --- Loading state --- */\n.vector-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n/* --- View Mode Toggle --- */\n.view-mode-toggle {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* --- Dashboard container --- */\n.vector-dashboard {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n/* --- KPI cards row --- */\n.kpi-row {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Main content: table + sidebar --- */\n.content-area {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Sync table panel --- */\n.sync-table-panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Empty state --- */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state i {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n/* --- Table --- */\n.table-wrapper {\n overflow-x: auto;\n}\n\n.sync-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table th {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.text-right {\n text-align: right;\n}\n\n.text-center {\n text-align: center;\n}\n\n.entity-name {\n font-weight: 600;\n}\n\n.document-name {\n color: var(--mj-text-secondary);\n}\n\n.vector-count {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n/* --- Action buttons in table --- */\n\n.actions-cell {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.schedule-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.schedule-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.edit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Schedule Dialog --- */\n.schedule-dialog {\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n}\n\n.schedule-cron-preview {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 0 0;\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n}\n\n.schedule-toggle-row {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n}\n\n.edit-delete-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n/* --- Status badges --- */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n/* --- Sync button --- */\n.sync-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ================================================================\n Sidebar\n ================================================================ */\n.sidebar {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title i {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n/* --- Vector DB Health --- */\n.health-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n/* --- Model Info --- */\n.model-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* --- Storage / Coverage Gauge --- */\n.gauge-container {\n margin-bottom: 8px;\n}\n\n.gauge-bar {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* --- Panel actions row --- */\n.panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* --- Suggest Document Button --- */\n.suggest-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* --- Slide-in Panel Overlay --- */\n.slide-panel-overlay {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open {\n transform: translateX(0);\n}\n\n.suggest-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title i {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body {\n padding: 24px;\n}\n\n/* --- Suggest Form --- */\n.suggest-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ---- Use Case Button Group ---- */\n\n.use-case-options {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn i {\n font-size: 12px;\n}\n\n/* ---- Entity Picker (grouped by schema) ---- */\n\n.entity-picker {\n position: relative;\n}\n\n.entity-picker-trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search i {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header i {\n font-size: 10px;\n}\n\n.entity-picker-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item i {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected i {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n/* ---- Template Editor ---- */\n\n.template-editor-wrapper {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper ::ng-deep .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error i {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* --- Suggestion Result --- */\n.suggest-result {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section:last-child {\n border-bottom: none;\n}\n\n.result-heading {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* --- Suggest Input --- */\n.suggest-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* --- Try Again Button (secondary style) --- */\n.suggest-try-again-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* --- Save Spinner --- */\n.save-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n/* ================================================================\n Responsive \u2014 Vector Management\n ================================================================ */\n\n@media (max-width: 768px) {\n .panel-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard {\n padding: 12px;\n }\n\n .suggest-btn .suggest-btn-text {\n display: none;\n }\n}\n"] }]
|
|
1775
1962
|
}], null, { EmbeddedMode: [{
|
|
1776
1963
|
type: Input
|
|
1777
1964
|
}] }); })();
|
|
1778
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(VectorManagementResourceComponent, { className: "VectorManagementResourceComponent", filePath: "src/AI/components/vectors/vector-management-resource.component.ts", lineNumber:
|
|
1965
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(VectorManagementResourceComponent, { className: "VectorManagementResourceComponent", filePath: "src/AI/components/vectors/vector-management-resource.component.ts", lineNumber: 72 }); })();
|
|
1779
1966
|
export function LoadVectorManagementResource() {
|
|
1780
1967
|
// Prevents tree-shaking
|
|
1781
1968
|
}
|