@memberjunction/ng-dashboards 5.24.0 → 5.25.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/dist/AI/components/agents/agent-configuration.component.d.ts +15 -33
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +233 -493
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +2 -2
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +7 -7
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +43 -6
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1135 -864
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +4 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts +4 -5
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +14 -15
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +4 -4
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +5 -5
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +4 -4
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +5 -5
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +2 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +1 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +2 -3
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +9 -11
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +44 -8
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +648 -384
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +2 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +2 -0
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +4 -5
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +11 -12
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.d.ts +2 -3
- package/dist/Actions/components/code-management.component.d.ts.map +1 -1
- package/dist/Actions/components/code-management.component.js +4 -6
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.d.ts +2 -3
- package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +4 -6
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +4 -5
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +10 -11
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +13 -12
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +39 -66
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.d.ts +2 -3
- package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +4 -6
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.d.ts +2 -3
- package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +4 -6
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.d.ts +112 -0
- package/dist/ApplicationRoles/application-roles-resource.component.d.ts.map +1 -0
- package/dist/ApplicationRoles/application-roles-resource.component.js +532 -0
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -0
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +1 -0
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +4 -1
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +4 -1
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +4 -1
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +4 -1
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +4 -1
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +2 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +2 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -3
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +10 -11
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +2 -0
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts +4 -4
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +8 -9
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -3
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +11 -12
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +1 -0
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +2 -3
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +9 -10
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +23 -15
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +167 -213
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +68 -32
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +453 -420
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts +10 -3
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +35 -11
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.d.ts +12 -3
- package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.js +5 -1
- package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +4 -4
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +4 -5
- 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 +2 -0
- 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 +1 -0
- 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 +2 -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 +2 -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 +2 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +4 -3
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +4 -3
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +13 -3
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +220 -138
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +4 -3
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +1 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/index.d.ts +0 -1
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +0 -1
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +2 -0
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +2 -0
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +2 -0
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +2 -0
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +7 -28
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +25 -107
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +1 -0
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +10 -23
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +41 -103
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +9 -10
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +2 -0
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +2 -0
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +2 -0
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +2 -0
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +2 -0
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +1 -0
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts +4 -4
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +9 -10
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts +2 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +2 -0
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +4 -4
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +10 -11
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +2 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +2 -0
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +19 -19
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +4 -5
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +19 -18
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +8 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +2 -1
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +7 -3
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +2 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +47 -47
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +0 -166
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +0 -1
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +0 -991
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +0 -1
|
@@ -12,7 +12,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
12
12
|
* an entity sync table, and sidebar panels for DB health, embedding model info,
|
|
13
13
|
* and storage usage.
|
|
14
14
|
*/
|
|
15
|
-
import { Component, ChangeDetectorRef, Input, inject } from '@angular/core';
|
|
15
|
+
import { Component, ChangeDetectorRef, Input, ViewChild, 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';
|
|
@@ -29,26 +29,27 @@ import * as i2 from "@memberjunction/ng-code-editor";
|
|
|
29
29
|
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
30
30
|
import * as i4 from "../widgets/kpi-card.component";
|
|
31
31
|
import * as i5 from "@angular/common";
|
|
32
|
+
const _c0 = ["entitySearchInput"];
|
|
32
33
|
const _forTrack0 = ($index, $item) => $item.title;
|
|
33
34
|
const _forTrack1 = ($index, $item) => $item.EntityDocumentID;
|
|
34
35
|
const _forTrack2 = ($index, $item) => $item.ID;
|
|
35
36
|
const _forTrack3 = ($index, $item) => $item.SchemaName;
|
|
36
37
|
const _forTrack4 = ($index, $item) => $item.name;
|
|
37
38
|
function VectorManagementResourceComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
38
|
-
i0.ɵɵelementStart(0, "div",
|
|
39
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
39
|
+
i0.ɵɵelementStart(0, "div", 1);
|
|
40
|
+
i0.ɵɵelement(1, "mj-loading", 2);
|
|
40
41
|
i0.ɵɵelementEnd();
|
|
41
42
|
} }
|
|
42
43
|
function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
43
44
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
44
|
-
i0.ɵɵelementStart(0, "div",
|
|
45
|
+
i0.ɵɵelementStart(0, "div", 4)(1, "button", 40);
|
|
45
46
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ViewMode = "index"); });
|
|
46
|
-
i0.ɵɵelement(2, "i",
|
|
47
|
+
i0.ɵɵelement(2, "i", 41);
|
|
47
48
|
i0.ɵɵtext(3, " Index View ");
|
|
48
49
|
i0.ɵɵelementEnd();
|
|
49
|
-
i0.ɵɵelementStart(4, "button",
|
|
50
|
+
i0.ɵɵelementStart(4, "button", 40);
|
|
50
51
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ViewMode = "operations"); });
|
|
51
|
-
i0.ɵɵelement(5, "i",
|
|
52
|
+
i0.ɵɵelement(5, "i", 42);
|
|
52
53
|
i0.ɵɵtext(6, " Operations ");
|
|
53
54
|
i0.ɵɵelementEnd()();
|
|
54
55
|
} if (rf & 2) {
|
|
@@ -59,14 +60,14 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template(
|
|
|
59
60
|
i0.ɵɵclassProp("view-mode-btn-active", ctx_r2.ViewMode === "operations");
|
|
60
61
|
} }
|
|
61
62
|
function VectorManagementResourceComponent_Conditional_1_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
62
|
-
i0.ɵɵelement(0, "app-kpi-card",
|
|
63
|
+
i0.ɵɵelement(0, "app-kpi-card", 6);
|
|
63
64
|
} if (rf & 2) {
|
|
64
65
|
const card_r4 = ctx.$implicit;
|
|
65
66
|
i0.ɵɵproperty("data", card_r4);
|
|
66
67
|
} }
|
|
67
68
|
function VectorManagementResourceComponent_Conditional_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
68
|
-
i0.ɵɵelementStart(0, "div",
|
|
69
|
-
i0.ɵɵelement(1, "i",
|
|
69
|
+
i0.ɵɵelementStart(0, "div", 18);
|
|
70
|
+
i0.ɵɵelement(1, "i", 43);
|
|
70
71
|
i0.ɵɵelementStart(2, "p");
|
|
71
72
|
i0.ɵɵtext(3, "No entity documents configured for vectorization.");
|
|
72
73
|
i0.ɵɵelementEnd()();
|
|
@@ -84,7 +85,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_C
|
|
|
84
85
|
i0.ɵɵtextInterpolate1(" ", row_r6.Status, " ");
|
|
85
86
|
} }
|
|
86
87
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
87
|
-
i0.ɵɵelement(0, "i",
|
|
88
|
+
i0.ɵɵelement(0, "i", 58);
|
|
88
89
|
i0.ɵɵtext(1);
|
|
89
90
|
} if (rf & 2) {
|
|
90
91
|
const row_r6 = i0.ɵɵnextContext().$implicit;
|
|
@@ -92,39 +93,39 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_C
|
|
|
92
93
|
i0.ɵɵtextInterpolate1(" ", row_r6.PercentComplete > 0 ? row_r6.PercentComplete + "%" : "Sync", " ");
|
|
93
94
|
} }
|
|
94
95
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
95
|
-
i0.ɵɵelement(0, "i",
|
|
96
|
+
i0.ɵɵelement(0, "i", 59);
|
|
96
97
|
i0.ɵɵtext(1, " Sync ");
|
|
97
98
|
} }
|
|
98
99
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
99
100
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
100
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
101
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 47);
|
|
101
102
|
i0.ɵɵtext(2);
|
|
102
103
|
i0.ɵɵelementEnd();
|
|
103
|
-
i0.ɵɵelementStart(3, "td",
|
|
104
|
+
i0.ɵɵelementStart(3, "td", 48);
|
|
104
105
|
i0.ɵɵtext(4);
|
|
105
106
|
i0.ɵɵelementEnd();
|
|
106
|
-
i0.ɵɵelementStart(5, "td",
|
|
107
|
+
i0.ɵɵelementStart(5, "td", 49);
|
|
107
108
|
i0.ɵɵtext(6);
|
|
108
109
|
i0.ɵɵpipe(7, "number");
|
|
109
110
|
i0.ɵɵelementEnd();
|
|
110
|
-
i0.ɵɵelementStart(8, "td",
|
|
111
|
+
i0.ɵɵelementStart(8, "td", 50);
|
|
111
112
|
i0.ɵɵtext(9);
|
|
112
113
|
i0.ɵɵelementEnd();
|
|
113
|
-
i0.ɵɵelementStart(10, "td")(11, "span",
|
|
114
|
+
i0.ɵɵelementStart(10, "td")(11, "span", 51);
|
|
114
115
|
i0.ɵɵelement(12, "i");
|
|
115
116
|
i0.ɵɵconditionalCreate(13, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_13_Template, 1, 1)(14, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_14_Template, 1, 1);
|
|
116
117
|
i0.ɵɵelementEnd()();
|
|
117
|
-
i0.ɵɵelementStart(15, "td",
|
|
118
|
+
i0.ɵɵelementStart(15, "td", 52)(16, "button", 53);
|
|
118
119
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_16_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SyncEntity(row_r6.EntityDocumentID)); });
|
|
119
120
|
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);
|
|
120
121
|
i0.ɵɵelementEnd();
|
|
121
|
-
i0.ɵɵelementStart(19, "button",
|
|
122
|
+
i0.ɵɵelementStart(19, "button", 54);
|
|
122
123
|
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)); });
|
|
123
|
-
i0.ɵɵelement(20, "i",
|
|
124
|
+
i0.ɵɵelement(20, "i", 55);
|
|
124
125
|
i0.ɵɵelementEnd();
|
|
125
|
-
i0.ɵɵelementStart(21, "button",
|
|
126
|
+
i0.ɵɵelementStart(21, "button", 56);
|
|
126
127
|
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",
|
|
128
|
+
i0.ɵɵelement(22, "i", 57);
|
|
128
129
|
i0.ɵɵelementEnd()()();
|
|
129
130
|
} if (rf & 2) {
|
|
130
131
|
const row_r6 = ctx.$implicit;
|
|
@@ -149,13 +150,13 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_T
|
|
|
149
150
|
i0.ɵɵconditional(ctx_r2.SyncingIds.has(row_r6.EntityDocumentID) ? 17 : 18);
|
|
150
151
|
} }
|
|
151
152
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
152
|
-
i0.ɵɵelementStart(0, "div",
|
|
153
|
+
i0.ɵɵelementStart(0, "div", 19)(1, "table", 44)(2, "thead")(3, "tr")(4, "th");
|
|
153
154
|
i0.ɵɵtext(5, "Entity");
|
|
154
155
|
i0.ɵɵelementEnd();
|
|
155
156
|
i0.ɵɵelementStart(6, "th");
|
|
156
157
|
i0.ɵɵtext(7, "Document");
|
|
157
158
|
i0.ɵɵelementEnd();
|
|
158
|
-
i0.ɵɵelementStart(8, "th",
|
|
159
|
+
i0.ɵɵelementStart(8, "th", 45);
|
|
159
160
|
i0.ɵɵtext(9, "Vectors");
|
|
160
161
|
i0.ɵɵelementEnd();
|
|
161
162
|
i0.ɵɵelementStart(10, "th");
|
|
@@ -164,7 +165,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template
|
|
|
164
165
|
i0.ɵɵelementStart(12, "th");
|
|
165
166
|
i0.ɵɵtext(13, "Status");
|
|
166
167
|
i0.ɵɵelementEnd();
|
|
167
|
-
i0.ɵɵelementStart(14, "th",
|
|
168
|
+
i0.ɵɵelementStart(14, "th", 46);
|
|
168
169
|
i0.ɵɵtext(15, "Actions");
|
|
169
170
|
i0.ɵɵelementEnd()()();
|
|
170
171
|
i0.ɵɵelementStart(16, "tbody");
|
|
@@ -176,10 +177,10 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template
|
|
|
176
177
|
i0.ɵɵrepeater(ctx_r2.SyncRows);
|
|
177
178
|
} }
|
|
178
179
|
function VectorManagementResourceComponent_Conditional_1_Conditional_42_Template(rf, ctx) { if (rf & 1) {
|
|
179
|
-
i0.ɵɵelementStart(0, "div",
|
|
180
|
+
i0.ɵɵelementStart(0, "div", 30)(1, "span", 31);
|
|
180
181
|
i0.ɵɵtext(2, "Dimensions");
|
|
181
182
|
i0.ɵɵelementEnd();
|
|
182
|
-
i0.ɵɵelementStart(3, "span",
|
|
183
|
+
i0.ɵɵelementStart(3, "span", 32);
|
|
183
184
|
i0.ɵɵtext(4);
|
|
184
185
|
i0.ɵɵpipe(5, "number");
|
|
185
186
|
i0.ɵɵelementEnd()();
|
|
@@ -188,44 +189,73 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_42_Template
|
|
|
188
189
|
i0.ɵɵadvance(4);
|
|
189
190
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 1, ctx_r2.EmbeddingModel.Dimensions));
|
|
190
191
|
} }
|
|
191
|
-
function
|
|
192
|
-
i0.ɵɵ
|
|
192
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
193
|
+
i0.ɵɵelement(0, "i", 58);
|
|
194
|
+
i0.ɵɵtext(1, " Regenerating... ");
|
|
195
|
+
} }
|
|
196
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
197
|
+
i0.ɵɵelement(0, "i", 14);
|
|
198
|
+
i0.ɵɵtext(1, " Regenerate with AI ");
|
|
199
|
+
} }
|
|
200
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_24_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
201
|
+
i0.ɵɵelementStart(0, "span", 85);
|
|
202
|
+
i0.ɵɵtext(1);
|
|
203
|
+
i0.ɵɵelementEnd();
|
|
204
|
+
} if (rf & 2) {
|
|
205
|
+
const field_r8 = ctx.$implicit;
|
|
206
|
+
i0.ɵɵadvance();
|
|
207
|
+
i0.ɵɵtextInterpolate(field_r8);
|
|
208
|
+
} }
|
|
209
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
210
|
+
i0.ɵɵelementStart(0, "div", 68)(1, "label", 69);
|
|
211
|
+
i0.ɵɵtext(2, "Selected Fields");
|
|
212
|
+
i0.ɵɵelementEnd();
|
|
213
|
+
i0.ɵɵelementStart(3, "div", 84);
|
|
214
|
+
i0.ɵɵrepeaterCreate(4, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_24_For_5_Template, 2, 1, "span", 85, i0.ɵɵrepeaterTrackByIdentity);
|
|
215
|
+
i0.ɵɵelementEnd()();
|
|
216
|
+
} if (rf & 2) {
|
|
217
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
218
|
+
i0.ɵɵadvance(4);
|
|
219
|
+
i0.ɵɵrepeater(ctx_r2.EditDocSelectedFields);
|
|
220
|
+
} }
|
|
221
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_34_Template(rf, ctx) { if (rf & 1) {
|
|
222
|
+
i0.ɵɵelementStart(0, "option", 77);
|
|
193
223
|
i0.ɵɵtext(1);
|
|
194
224
|
i0.ɵɵelementEnd();
|
|
195
225
|
} if (rf & 2) {
|
|
196
|
-
const
|
|
197
|
-
i0.ɵɵproperty("value",
|
|
226
|
+
const model_r9 = ctx.$implicit;
|
|
227
|
+
i0.ɵɵproperty("value", model_r9.ID);
|
|
198
228
|
i0.ɵɵadvance();
|
|
199
|
-
i0.ɵɵtextInterpolate(
|
|
229
|
+
i0.ɵɵtextInterpolate(model_r9.Name);
|
|
200
230
|
} }
|
|
201
|
-
function
|
|
202
|
-
i0.ɵɵelementStart(0, "option",
|
|
231
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_40_Template(rf, ctx) { if (rf & 1) {
|
|
232
|
+
i0.ɵɵelementStart(0, "option", 77);
|
|
203
233
|
i0.ɵɵtext(1);
|
|
204
234
|
i0.ɵɵelementEnd();
|
|
205
235
|
} if (rf & 2) {
|
|
206
|
-
const
|
|
207
|
-
i0.ɵɵproperty("value",
|
|
236
|
+
const db_r10 = ctx.$implicit;
|
|
237
|
+
i0.ɵɵproperty("value", db_r10.ID);
|
|
208
238
|
i0.ɵɵadvance();
|
|
209
|
-
i0.ɵɵtextInterpolate(
|
|
239
|
+
i0.ɵɵtextInterpolate(db_r10.Name);
|
|
210
240
|
} }
|
|
211
|
-
function
|
|
212
|
-
i0.ɵɵelementStart(0, "option",
|
|
241
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
242
|
+
i0.ɵɵelementStart(0, "option", 77);
|
|
213
243
|
i0.ɵɵtext(1);
|
|
214
244
|
i0.ɵɵelementEnd();
|
|
215
245
|
} if (rf & 2) {
|
|
216
|
-
const
|
|
217
|
-
i0.ɵɵproperty("value",
|
|
246
|
+
const idx_r12 = ctx.$implicit;
|
|
247
|
+
i0.ɵɵproperty("value", idx_r12.ID);
|
|
218
248
|
i0.ɵɵadvance();
|
|
219
|
-
i0.ɵɵtextInterpolate(
|
|
249
|
+
i0.ɵɵtextInterpolate(idx_r12.Name);
|
|
220
250
|
} }
|
|
221
|
-
function
|
|
222
|
-
const
|
|
223
|
-
i0.ɵɵelementStart(0, "select",
|
|
224
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
225
|
-
i0.ɵɵelementStart(1, "option",
|
|
251
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
252
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
253
|
+
i0.ɵɵelementStart(0, "select", 76);
|
|
254
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorIndexID, $event) || (ctx_r2.EditDocVectorIndexID = $event); return i0.ɵɵresetView($event); });
|
|
255
|
+
i0.ɵɵelementStart(1, "option", 86);
|
|
226
256
|
i0.ɵɵtext(2, "Auto (create/find matching index)");
|
|
227
257
|
i0.ɵɵelementEnd();
|
|
228
|
-
i0.ɵɵrepeaterCreate(3,
|
|
258
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_For_4_Template, 2, 2, "option", 77, _forTrack2);
|
|
229
259
|
i0.ɵɵelementEnd();
|
|
230
260
|
} if (rf & 2) {
|
|
231
261
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -233,94 +263,113 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditio
|
|
|
233
263
|
i0.ɵɵadvance(3);
|
|
234
264
|
i0.ɵɵrepeater(ctx_r2.EditFilteredIndexes);
|
|
235
265
|
} }
|
|
236
|
-
function
|
|
237
|
-
i0.ɵɵelementStart(0, "span",
|
|
266
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
267
|
+
i0.ɵɵelementStart(0, "span", 79);
|
|
238
268
|
i0.ɵɵtext(1, " No indexes for this database \u2014 one will be created automatically on sync ");
|
|
239
269
|
i0.ɵɵelementEnd();
|
|
240
270
|
} }
|
|
241
|
-
function
|
|
242
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
271
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_55_Template(rf, ctx) { if (rf & 1) {
|
|
272
|
+
i0.ɵɵelement(0, "mj-loading", 83);
|
|
243
273
|
} }
|
|
244
|
-
function
|
|
245
|
-
const
|
|
246
|
-
i0.ɵɵelementStart(0, "button",
|
|
247
|
-
i0.ɵɵlistener("click", function
|
|
248
|
-
i0.ɵɵelement(1, "i",
|
|
274
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template(rf, ctx) { if (rf & 1) {
|
|
275
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
276
|
+
i0.ɵɵelementStart(0, "button", 87);
|
|
277
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveEditedDocument()); });
|
|
278
|
+
i0.ɵɵelement(1, "i", 88);
|
|
249
279
|
i0.ɵɵtext(2, " Save Changes ");
|
|
250
280
|
i0.ɵɵelementEnd();
|
|
251
|
-
i0.ɵɵelementStart(3, "button",
|
|
252
|
-
i0.ɵɵlistener("click", function
|
|
253
|
-
i0.ɵɵelement(4, "i",
|
|
281
|
+
i0.ɵɵelementStart(3, "button", 89);
|
|
282
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.DeleteEntityDocument()); });
|
|
283
|
+
i0.ɵɵelement(4, "i", 90);
|
|
254
284
|
i0.ɵɵtext(5, " Delete ");
|
|
255
285
|
i0.ɵɵelementEnd();
|
|
256
|
-
i0.ɵɵelementStart(6, "button",
|
|
257
|
-
i0.ɵɵlistener("click", function
|
|
286
|
+
i0.ɵɵelementStart(6, "button", 91);
|
|
287
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
|
|
258
288
|
i0.ɵɵtext(7, " Cancel ");
|
|
259
289
|
i0.ɵɵelementEnd();
|
|
260
290
|
} }
|
|
261
291
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template(rf, ctx) { if (rf & 1) {
|
|
262
292
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
263
|
-
i0.ɵɵelementStart(0, "div",
|
|
293
|
+
i0.ɵɵelementStart(0, "div", 60);
|
|
264
294
|
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()); });
|
|
265
|
-
i0.ɵɵelementStart(1, "div",
|
|
295
|
+
i0.ɵɵelementStart(1, "div", 61);
|
|
266
296
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r7); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
267
|
-
i0.ɵɵelementStart(2, "div",
|
|
268
|
-
i0.ɵɵelement(4, "i",
|
|
297
|
+
i0.ɵɵelementStart(2, "div", 62)(3, "h3", 63);
|
|
298
|
+
i0.ɵɵelement(4, "i", 57);
|
|
269
299
|
i0.ɵɵtext(5, " Edit Entity Document ");
|
|
270
300
|
i0.ɵɵelementEnd();
|
|
271
|
-
i0.ɵɵelementStart(6, "button",
|
|
301
|
+
i0.ɵɵelementStart(6, "button", 64);
|
|
272
302
|
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()); });
|
|
273
|
-
i0.ɵɵelement(7, "i",
|
|
303
|
+
i0.ɵɵelement(7, "i", 65);
|
|
274
304
|
i0.ɵɵelementEnd()();
|
|
275
|
-
i0.ɵɵelementStart(8, "div",
|
|
305
|
+
i0.ɵɵelementStart(8, "div", 66)(9, "div", 67)(10, "div", 68)(11, "label", 69);
|
|
276
306
|
i0.ɵɵtext(12, "Entity");
|
|
277
307
|
i0.ɵɵelementEnd();
|
|
278
|
-
i0.ɵɵelementStart(13, "span",
|
|
308
|
+
i0.ɵɵelementStart(13, "span", 70);
|
|
279
309
|
i0.ɵɵtext(14);
|
|
280
310
|
i0.ɵɵelementEnd()();
|
|
281
|
-
i0.ɵɵelementStart(15, "div",
|
|
282
|
-
i0.ɵɵtext(
|
|
311
|
+
i0.ɵɵelementStart(15, "div", 68)(16, "div", 71)(17, "label", 69);
|
|
312
|
+
i0.ɵɵtext(18, "Template");
|
|
313
|
+
i0.ɵɵelementEnd();
|
|
314
|
+
i0.ɵɵelementStart(19, "button", 72);
|
|
315
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.RegenerateTemplate()); });
|
|
316
|
+
i0.ɵɵconditionalCreate(20, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_20_Template, 2, 0)(21, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_21_Template, 2, 0);
|
|
317
|
+
i0.ɵɵelementEnd()();
|
|
318
|
+
i0.ɵɵelementStart(22, "div", 73)(23, "mj-code-editor", 74);
|
|
319
|
+
i0.ɵɵlistener("change", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_mj_code_editor_change_23_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnEditTemplateChange($event)); });
|
|
320
|
+
i0.ɵɵelementEnd()()();
|
|
321
|
+
i0.ɵɵconditionalCreate(24, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_24_Template, 6, 0, "div", 68);
|
|
322
|
+
i0.ɵɵelementStart(25, "div", 68)(26, "label", 69);
|
|
323
|
+
i0.ɵɵtext(27, "Document Name");
|
|
283
324
|
i0.ɵɵelementEnd();
|
|
284
|
-
i0.ɵɵelementStart(
|
|
285
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
325
|
+
i0.ɵɵelementStart(28, "input", 75);
|
|
326
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_input_ngModelChange_28_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); });
|
|
286
327
|
i0.ɵɵelementEnd()();
|
|
287
|
-
i0.ɵɵelementStart(
|
|
288
|
-
i0.ɵɵtext(
|
|
328
|
+
i0.ɵɵelementStart(29, "div", 68)(30, "label", 69);
|
|
329
|
+
i0.ɵɵtext(31, "Embedding Model");
|
|
289
330
|
i0.ɵɵelementEnd();
|
|
290
|
-
i0.ɵɵelementStart(
|
|
291
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
292
|
-
i0.ɵɵrepeaterCreate(
|
|
331
|
+
i0.ɵɵelementStart(32, "select", 76);
|
|
332
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_32_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); });
|
|
333
|
+
i0.ɵɵrepeaterCreate(33, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_34_Template, 2, 2, "option", 77, _forTrack2);
|
|
293
334
|
i0.ɵɵelementEnd()();
|
|
294
|
-
i0.ɵɵelementStart(
|
|
295
|
-
i0.ɵɵtext(
|
|
335
|
+
i0.ɵɵelementStart(35, "div", 68)(36, "label", 69);
|
|
336
|
+
i0.ɵɵtext(37, "Vector Database");
|
|
296
337
|
i0.ɵɵelementEnd();
|
|
297
|
-
i0.ɵɵelementStart(
|
|
298
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
299
|
-
i0.ɵɵrepeaterCreate(
|
|
338
|
+
i0.ɵɵelementStart(38, "select", 76);
|
|
339
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_38_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); });
|
|
340
|
+
i0.ɵɵrepeaterCreate(39, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_40_Template, 2, 2, "option", 77, _forTrack2);
|
|
300
341
|
i0.ɵɵelementEnd()();
|
|
301
|
-
i0.ɵɵelementStart(
|
|
302
|
-
i0.ɵɵtext(
|
|
342
|
+
i0.ɵɵelementStart(41, "div", 68)(42, "label", 69);
|
|
343
|
+
i0.ɵɵtext(43, "Vector Index");
|
|
303
344
|
i0.ɵɵelementEnd();
|
|
304
|
-
i0.ɵɵconditionalCreate(
|
|
345
|
+
i0.ɵɵconditionalCreate(44, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_Template, 5, 1, "select", 78)(45, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template, 2, 0, "span", 79);
|
|
305
346
|
i0.ɵɵelementEnd();
|
|
306
|
-
i0.ɵɵelementStart(
|
|
307
|
-
i0.ɵɵtext(
|
|
347
|
+
i0.ɵɵelementStart(46, "div", 68)(47, "label", 69);
|
|
348
|
+
i0.ɵɵtext(48, "Status");
|
|
308
349
|
i0.ɵɵelementEnd();
|
|
309
|
-
i0.ɵɵelementStart(
|
|
310
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
311
|
-
i0.ɵɵelementStart(
|
|
312
|
-
i0.ɵɵtext(
|
|
350
|
+
i0.ɵɵelementStart(49, "select", 76);
|
|
351
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_49_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); });
|
|
352
|
+
i0.ɵɵelementStart(50, "option", 80);
|
|
353
|
+
i0.ɵɵtext(51, "Active");
|
|
313
354
|
i0.ɵɵelementEnd();
|
|
314
|
-
i0.ɵɵelementStart(
|
|
315
|
-
i0.ɵɵtext(
|
|
355
|
+
i0.ɵɵelementStart(52, "option", 81);
|
|
356
|
+
i0.ɵɵtext(53, "Inactive");
|
|
316
357
|
i0.ɵɵelementEnd()()();
|
|
317
|
-
i0.ɵɵelementStart(
|
|
318
|
-
i0.ɵɵconditionalCreate(
|
|
358
|
+
i0.ɵɵelementStart(54, "div", 82);
|
|
359
|
+
i0.ɵɵconditionalCreate(55, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_55_Template, 1, 0, "mj-loading", 83)(56, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template, 8, 0);
|
|
319
360
|
i0.ɵɵelementEnd()()()()();
|
|
320
361
|
} if (rf & 2) {
|
|
321
362
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
322
363
|
i0.ɵɵadvance(14);
|
|
323
364
|
i0.ɵɵtextInterpolate(ctx_r2.EditDocEntityName);
|
|
365
|
+
i0.ɵɵadvance(5);
|
|
366
|
+
i0.ɵɵproperty("disabled", ctx_r2.IsEditRegenerating);
|
|
367
|
+
i0.ɵɵadvance();
|
|
368
|
+
i0.ɵɵconditional(ctx_r2.IsEditRegenerating ? 20 : 21);
|
|
369
|
+
i0.ɵɵadvance(3);
|
|
370
|
+
i0.ɵɵproperty("value", ctx_r2.EditDocTemplate)("readonly", false)("lineWrapping", true);
|
|
371
|
+
i0.ɵɵadvance();
|
|
372
|
+
i0.ɵɵconditional(ctx_r2.EditDocSelectedFields.length > 0 ? 24 : -1);
|
|
324
373
|
i0.ɵɵadvance(4);
|
|
325
374
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.EditDocName);
|
|
326
375
|
i0.ɵɵadvance(4);
|
|
@@ -332,71 +381,71 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template
|
|
|
332
381
|
i0.ɵɵadvance();
|
|
333
382
|
i0.ɵɵrepeater(ctx_r2.vectorDatabases);
|
|
334
383
|
i0.ɵɵadvance(5);
|
|
335
|
-
i0.ɵɵconditional(ctx_r2.EditFilteredIndexes.length > 0 ?
|
|
384
|
+
i0.ɵɵconditional(ctx_r2.EditFilteredIndexes.length > 0 ? 44 : 45);
|
|
336
385
|
i0.ɵɵadvance(5);
|
|
337
386
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.EditDocStatus);
|
|
338
387
|
i0.ɵɵadvance(6);
|
|
339
|
-
i0.ɵɵconditional(ctx_r2.IsEditSaving || ctx_r2.IsEditDeleting ?
|
|
388
|
+
i0.ɵɵconditional(ctx_r2.IsEditSaving || ctx_r2.IsEditDeleting ? 55 : 56);
|
|
340
389
|
} }
|
|
341
390
|
function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
342
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
391
|
+
i0.ɵɵelement(0, "mj-loading", 83);
|
|
343
392
|
} }
|
|
344
393
|
function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
345
|
-
const
|
|
346
|
-
i0.ɵɵelementStart(0, "button",
|
|
347
|
-
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
348
|
-
i0.ɵɵelement(1, "i",
|
|
394
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
395
|
+
i0.ɵɵelementStart(0, "button", 87);
|
|
396
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveScheduleSync()); });
|
|
397
|
+
i0.ɵɵelement(1, "i", 98);
|
|
349
398
|
i0.ɵɵtext(2, " Create Schedule ");
|
|
350
399
|
i0.ɵɵelementEnd();
|
|
351
|
-
i0.ɵɵelementStart(3, "button",
|
|
352
|
-
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_3_listener() { i0.ɵɵrestoreView(
|
|
400
|
+
i0.ɵɵelementStart(3, "button", 91);
|
|
401
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
|
|
353
402
|
i0.ɵɵtext(4, " Cancel ");
|
|
354
403
|
i0.ɵɵelementEnd();
|
|
355
404
|
} }
|
|
356
405
|
function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template(rf, ctx) { if (rf & 1) {
|
|
357
|
-
const
|
|
358
|
-
i0.ɵɵelementStart(0, "div",
|
|
359
|
-
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_0_listener() { i0.ɵɵrestoreView(
|
|
360
|
-
i0.ɵɵelementStart(1, "div",
|
|
361
|
-
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(
|
|
362
|
-
i0.ɵɵelementStart(2, "div",
|
|
363
|
-
i0.ɵɵelement(4, "i",
|
|
406
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
407
|
+
i0.ɵɵelementStart(0, "div", 60);
|
|
408
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
|
|
409
|
+
i0.ɵɵelementStart(1, "div", 92);
|
|
410
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r14); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
411
|
+
i0.ɵɵelementStart(2, "div", 62)(3, "h3", 63);
|
|
412
|
+
i0.ɵɵelement(4, "i", 55);
|
|
364
413
|
i0.ɵɵtext(5, " Schedule Vector Sync ");
|
|
365
414
|
i0.ɵɵelementEnd();
|
|
366
|
-
i0.ɵɵelementStart(6, "button",
|
|
367
|
-
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_button_click_6_listener() { i0.ɵɵrestoreView(
|
|
368
|
-
i0.ɵɵelement(7, "i",
|
|
415
|
+
i0.ɵɵelementStart(6, "button", 64);
|
|
416
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
|
|
417
|
+
i0.ɵɵelement(7, "i", 65);
|
|
369
418
|
i0.ɵɵelementEnd()();
|
|
370
|
-
i0.ɵɵelementStart(8, "div",
|
|
419
|
+
i0.ɵɵelementStart(8, "div", 66)(9, "div", 67)(10, "div", 68)(11, "label", 69);
|
|
371
420
|
i0.ɵɵtext(12, "Entity Document");
|
|
372
421
|
i0.ɵɵelementEnd();
|
|
373
|
-
i0.ɵɵelementStart(13, "span",
|
|
422
|
+
i0.ɵɵelementStart(13, "span", 70);
|
|
374
423
|
i0.ɵɵtext(14);
|
|
375
424
|
i0.ɵɵelementEnd()();
|
|
376
|
-
i0.ɵɵelementStart(15, "div",
|
|
425
|
+
i0.ɵɵelementStart(15, "div", 68)(16, "label", 69);
|
|
377
426
|
i0.ɵɵtext(17, "Action");
|
|
378
427
|
i0.ɵɵelementEnd();
|
|
379
|
-
i0.ɵɵelementStart(18, "span",
|
|
428
|
+
i0.ɵɵelementStart(18, "span", 70);
|
|
380
429
|
i0.ɵɵtext(19, "__VectorizeEntity");
|
|
381
430
|
i0.ɵɵelementEnd()();
|
|
382
|
-
i0.ɵɵelementStart(20, "div",
|
|
431
|
+
i0.ɵɵelementStart(20, "div", 68)(21, "label", 69);
|
|
383
432
|
i0.ɵɵtext(22, "Cron Expression");
|
|
384
433
|
i0.ɵɵelementEnd();
|
|
385
|
-
i0.ɵɵelementStart(23, "input",
|
|
386
|
-
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_23_listener($event) { i0.ɵɵrestoreView(
|
|
434
|
+
i0.ɵɵelementStart(23, "input", 93);
|
|
435
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_23_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleSyncCron, $event) || (ctx_r2.ScheduleSyncCron = $event); return i0.ɵɵresetView($event); });
|
|
387
436
|
i0.ɵɵelementEnd();
|
|
388
|
-
i0.ɵɵelementStart(24, "div",
|
|
389
|
-
i0.ɵɵelement(25, "i",
|
|
437
|
+
i0.ɵɵelementStart(24, "div", 94);
|
|
438
|
+
i0.ɵɵelement(25, "i", 95);
|
|
390
439
|
i0.ɵɵtext(26);
|
|
391
440
|
i0.ɵɵelementEnd()();
|
|
392
|
-
i0.ɵɵelementStart(27, "div",
|
|
441
|
+
i0.ɵɵelementStart(27, "div", 96)(28, "label", 69);
|
|
393
442
|
i0.ɵɵtext(29, "Enabled");
|
|
394
443
|
i0.ɵɵelementEnd();
|
|
395
|
-
i0.ɵɵelementStart(30, "input",
|
|
396
|
-
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_30_listener($event) { i0.ɵɵrestoreView(
|
|
444
|
+
i0.ɵɵelementStart(30, "input", 97);
|
|
445
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_30_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleSyncEnabled, $event) || (ctx_r2.ScheduleSyncEnabled = $event); return i0.ɵɵresetView($event); });
|
|
397
446
|
i0.ɵɵelementEnd()();
|
|
398
|
-
i0.ɵɵelementStart(31, "div",
|
|
399
|
-
i0.ɵɵconditionalCreate(32, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template, 1, 0, "mj-loading",
|
|
447
|
+
i0.ɵɵelementStart(31, "div", 82);
|
|
448
|
+
i0.ɵɵconditionalCreate(32, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template, 1, 0, "mj-loading", 83)(33, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template, 5, 0);
|
|
400
449
|
i0.ɵɵelementEnd()()()()();
|
|
401
450
|
} if (rf & 2) {
|
|
402
451
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -411,9 +460,34 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template
|
|
|
411
460
|
i0.ɵɵadvance(2);
|
|
412
461
|
i0.ɵɵconditional(ctx_r2.ScheduleSyncSaving ? 32 : 33);
|
|
413
462
|
} }
|
|
414
|
-
function
|
|
415
|
-
i0.ɵɵ
|
|
416
|
-
i0.ɵɵelementStart(
|
|
463
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template(rf, ctx) { if (rf & 1) {
|
|
464
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
465
|
+
i0.ɵɵelementStart(0, "div", 60);
|
|
466
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseNoIndexWarning()); });
|
|
467
|
+
i0.ɵɵelementStart(1, "div", 99);
|
|
468
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r16); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
469
|
+
i0.ɵɵelementStart(2, "div", 100);
|
|
470
|
+
i0.ɵɵelement(3, "i", 101);
|
|
471
|
+
i0.ɵɵelementEnd();
|
|
472
|
+
i0.ɵɵelementStart(4, "h3", 102);
|
|
473
|
+
i0.ɵɵtext(5, "Vector Index Required");
|
|
474
|
+
i0.ɵɵelementEnd();
|
|
475
|
+
i0.ɵɵelementStart(6, "p", 103);
|
|
476
|
+
i0.ɵɵtext(7, " You need to create at least one vector database and index before creating entity documents. Go to the Configuration section to set up a vector database and create an index. ");
|
|
477
|
+
i0.ɵɵelementEnd();
|
|
478
|
+
i0.ɵɵelementStart(8, "div", 104)(9, "button", 87);
|
|
479
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToConfiguration()); });
|
|
480
|
+
i0.ɵɵelement(10, "i", 105);
|
|
481
|
+
i0.ɵɵtext(11, " Go to Configuration ");
|
|
482
|
+
i0.ɵɵelementEnd();
|
|
483
|
+
i0.ɵɵelementStart(12, "button", 91);
|
|
484
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseNoIndexWarning()); });
|
|
485
|
+
i0.ɵɵtext(13, " Close ");
|
|
486
|
+
i0.ɵɵelementEnd()()()();
|
|
487
|
+
} }
|
|
488
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
489
|
+
i0.ɵɵelement(0, "i", 119);
|
|
490
|
+
i0.ɵɵelementStart(1, "span", 120);
|
|
417
491
|
i0.ɵɵtext(2);
|
|
418
492
|
i0.ɵɵelementEnd();
|
|
419
493
|
} if (rf & 2) {
|
|
@@ -421,42 +495,42 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditio
|
|
|
421
495
|
i0.ɵɵadvance(2);
|
|
422
496
|
i0.ɵɵtextInterpolate(ctx_r2.SuggestEntityName);
|
|
423
497
|
} }
|
|
424
|
-
function
|
|
425
|
-
i0.ɵɵelement(0, "i",
|
|
426
|
-
i0.ɵɵelementStart(1, "span",
|
|
498
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
499
|
+
i0.ɵɵelement(0, "i", 121);
|
|
500
|
+
i0.ɵɵelementStart(1, "span", 122);
|
|
427
501
|
i0.ɵɵtext(2, "Search and select an entity...");
|
|
428
502
|
i0.ɵɵelementEnd();
|
|
429
503
|
} }
|
|
430
|
-
function
|
|
431
|
-
const
|
|
432
|
-
i0.ɵɵelementStart(0, "button",
|
|
433
|
-
i0.ɵɵlistener("click", function
|
|
434
|
-
i0.ɵɵelement(1, "i",
|
|
504
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
505
|
+
const _r20 = i0.ɵɵgetCurrentView();
|
|
506
|
+
i0.ɵɵelementStart(0, "button", 132);
|
|
507
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_For_5_Template_button_click_0_listener() { const entity_r21 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.SelectEntity(entity_r21.Name)); });
|
|
508
|
+
i0.ɵɵelement(1, "i", 119);
|
|
435
509
|
i0.ɵɵtext(2);
|
|
436
510
|
i0.ɵɵelementEnd();
|
|
437
511
|
} if (rf & 2) {
|
|
438
|
-
const
|
|
512
|
+
const entity_r21 = ctx.$implicit;
|
|
439
513
|
const ctx_r2 = i0.ɵɵnextContext(6);
|
|
440
|
-
i0.ɵɵclassProp("entity-picker-item-selected",
|
|
514
|
+
i0.ɵɵclassProp("entity-picker-item-selected", entity_r21.Name === ctx_r2.SuggestEntityName)("entity-picker-item-focused", (ctx_r2.FlatFilteredEntities[ctx_r2.SelectedEntityIndex] == null ? null : ctx_r2.FlatFilteredEntities[ctx_r2.SelectedEntityIndex].ID) === entity_r21.ID);
|
|
441
515
|
i0.ɵɵadvance(2);
|
|
442
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
516
|
+
i0.ɵɵtextInterpolate1(" ", entity_r21.Name, " ");
|
|
443
517
|
} }
|
|
444
|
-
function
|
|
445
|
-
i0.ɵɵelementStart(0, "div",
|
|
446
|
-
i0.ɵɵelement(2, "i",
|
|
518
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
519
|
+
i0.ɵɵelementStart(0, "div", 127)(1, "div", 129);
|
|
520
|
+
i0.ɵɵelement(2, "i", 130);
|
|
447
521
|
i0.ɵɵtext(3);
|
|
448
522
|
i0.ɵɵelementEnd();
|
|
449
|
-
i0.ɵɵrepeaterCreate(4,
|
|
523
|
+
i0.ɵɵrepeaterCreate(4, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_For_5_Template, 3, 5, "button", 131, _forTrack2);
|
|
450
524
|
i0.ɵɵelementEnd();
|
|
451
525
|
} if (rf & 2) {
|
|
452
|
-
const
|
|
526
|
+
const group_r22 = ctx.$implicit;
|
|
453
527
|
i0.ɵɵadvance(3);
|
|
454
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
528
|
+
i0.ɵɵtextInterpolate1(" ", group_r22.SchemaName, " ");
|
|
455
529
|
i0.ɵɵadvance();
|
|
456
|
-
i0.ɵɵrepeater(
|
|
530
|
+
i0.ɵɵrepeater(group_r22.Entities);
|
|
457
531
|
} }
|
|
458
|
-
function
|
|
459
|
-
i0.ɵɵelementStart(0, "div",
|
|
532
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
533
|
+
i0.ɵɵelementStart(0, "div", 128);
|
|
460
534
|
i0.ɵɵtext(1);
|
|
461
535
|
i0.ɵɵelementEnd();
|
|
462
536
|
} if (rf & 2) {
|
|
@@ -464,38 +538,40 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditio
|
|
|
464
538
|
i0.ɵɵadvance();
|
|
465
539
|
i0.ɵɵtextInterpolate1(" No entities matching \"", ctx_r2.EntitySearchText, "\" ");
|
|
466
540
|
} }
|
|
467
|
-
function
|
|
468
|
-
const
|
|
469
|
-
i0.ɵɵelementStart(0, "div",
|
|
470
|
-
i0.ɵɵ
|
|
471
|
-
i0.ɵɵelementStart(
|
|
472
|
-
i0.ɵɵ
|
|
473
|
-
i0.ɵɵ
|
|
541
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
542
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
543
|
+
i0.ɵɵelementStart(0, "div", 123);
|
|
544
|
+
i0.ɵɵlistener("mousedown", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r19); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
545
|
+
i0.ɵɵelementStart(1, "div", 124);
|
|
546
|
+
i0.ɵɵelement(2, "i", 121);
|
|
547
|
+
i0.ɵɵelementStart(3, "input", 125, 0);
|
|
548
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.EntitySearchText, $event) || (ctx_r2.EntitySearchText = $event); return i0.ɵɵresetView($event); });
|
|
549
|
+
i0.ɵɵlistener("input", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template_input_input_3_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.FilterEntities()); })("keydown", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template_input_keydown_3_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.OnEntityPickerKeyDown($event)); });
|
|
474
550
|
i0.ɵɵelementEnd()();
|
|
475
|
-
i0.ɵɵelementStart(
|
|
476
|
-
i0.ɵɵrepeaterCreate(
|
|
477
|
-
i0.ɵɵconditionalCreate(
|
|
551
|
+
i0.ɵɵelementStart(5, "div", 126);
|
|
552
|
+
i0.ɵɵrepeaterCreate(6, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_Template, 6, 1, "div", 127, _forTrack3);
|
|
553
|
+
i0.ɵɵconditionalCreate(8, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Conditional_8_Template, 2, 1, "div", 128);
|
|
478
554
|
i0.ɵɵelementEnd()();
|
|
479
555
|
} if (rf & 2) {
|
|
480
556
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
481
557
|
i0.ɵɵadvance(3);
|
|
482
558
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.EntitySearchText);
|
|
483
|
-
i0.ɵɵadvance(
|
|
559
|
+
i0.ɵɵadvance(3);
|
|
484
560
|
i0.ɵɵrepeater(ctx_r2.FilteredEntityGroups);
|
|
485
561
|
i0.ɵɵadvance(2);
|
|
486
|
-
i0.ɵɵconditional(ctx_r2.FilteredEntityGroups.length === 0 ?
|
|
562
|
+
i0.ɵɵconditional(ctx_r2.FilteredEntityGroups.length === 0 ? 8 : -1);
|
|
487
563
|
} }
|
|
488
|
-
function
|
|
489
|
-
i0.ɵɵelement(0, "i",
|
|
564
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
565
|
+
i0.ɵɵelement(0, "i", 58);
|
|
490
566
|
i0.ɵɵtext(1, " Generating with AI... ");
|
|
491
567
|
} }
|
|
492
|
-
function
|
|
493
|
-
i0.ɵɵelement(0, "i",
|
|
568
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
569
|
+
i0.ɵɵelement(0, "i", 14);
|
|
494
570
|
i0.ɵɵtext(1, " Generate Template ");
|
|
495
571
|
} }
|
|
496
|
-
function
|
|
497
|
-
i0.ɵɵelementStart(0, "div",
|
|
498
|
-
i0.ɵɵelement(1, "i",
|
|
572
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
573
|
+
i0.ɵɵelementStart(0, "div", 118);
|
|
574
|
+
i0.ɵɵelement(1, "i", 133);
|
|
499
575
|
i0.ɵɵtext(2);
|
|
500
576
|
i0.ɵɵelementEnd();
|
|
501
577
|
} if (rf & 2) {
|
|
@@ -503,41 +579,41 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditio
|
|
|
503
579
|
i0.ɵɵadvance(2);
|
|
504
580
|
i0.ɵɵtextInterpolate1(" ", ctx_r2.SuggestionError, " ");
|
|
505
581
|
} }
|
|
506
|
-
function
|
|
507
|
-
const
|
|
508
|
-
i0.ɵɵelementStart(0, "div",
|
|
582
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
583
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
584
|
+
i0.ɵɵelementStart(0, "div", 67)(1, "div", 68)(2, "label", 69);
|
|
509
585
|
i0.ɵɵtext(3, "Entity");
|
|
510
586
|
i0.ɵɵelementEnd();
|
|
511
|
-
i0.ɵɵelementStart(4, "div",
|
|
512
|
-
i0.ɵɵlistener("click", function
|
|
513
|
-
i0.ɵɵconditionalCreate(6,
|
|
514
|
-
i0.ɵɵelement(8, "i",
|
|
587
|
+
i0.ɵɵelementStart(4, "div", 108)(5, "button", 109);
|
|
588
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.ToggleEntityPicker()); });
|
|
589
|
+
i0.ɵɵconditionalCreate(6, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_6_Template, 3, 1)(7, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_7_Template, 3, 0);
|
|
590
|
+
i0.ɵɵelement(8, "i", 110);
|
|
515
591
|
i0.ɵɵelementEnd();
|
|
516
|
-
i0.ɵɵconditionalCreate(9,
|
|
592
|
+
i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template, 9, 2, "div", 111);
|
|
517
593
|
i0.ɵɵelementEnd()();
|
|
518
|
-
i0.ɵɵelementStart(10, "div",
|
|
594
|
+
i0.ɵɵelementStart(10, "div", 68)(11, "label", 69);
|
|
519
595
|
i0.ɵɵtext(12, "Use Case");
|
|
520
596
|
i0.ɵɵelementEnd();
|
|
521
|
-
i0.ɵɵelementStart(13, "div",
|
|
522
|
-
i0.ɵɵlistener("click", function
|
|
523
|
-
i0.ɵɵelement(15, "i",
|
|
597
|
+
i0.ɵɵelementStart(13, "div", 112)(14, "button", 113);
|
|
598
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "duplicate detection"); });
|
|
599
|
+
i0.ɵɵelement(15, "i", 114);
|
|
524
600
|
i0.ɵɵtext(16, " Duplicate Detection ");
|
|
525
601
|
i0.ɵɵelementEnd();
|
|
526
|
-
i0.ɵɵelementStart(17, "button",
|
|
527
|
-
i0.ɵɵlistener("click", function
|
|
528
|
-
i0.ɵɵelement(18, "i",
|
|
602
|
+
i0.ɵɵelementStart(17, "button", 113);
|
|
603
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "search"); });
|
|
604
|
+
i0.ɵɵelement(18, "i", 115);
|
|
529
605
|
i0.ɵɵtext(19, " Search ");
|
|
530
606
|
i0.ɵɵelementEnd();
|
|
531
|
-
i0.ɵɵelementStart(20, "button",
|
|
532
|
-
i0.ɵɵlistener("click", function
|
|
533
|
-
i0.ɵɵelement(21, "i",
|
|
607
|
+
i0.ɵɵelementStart(20, "button", 113);
|
|
608
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "classification"); });
|
|
609
|
+
i0.ɵɵelement(21, "i", 116);
|
|
534
610
|
i0.ɵɵtext(22, " Classification ");
|
|
535
611
|
i0.ɵɵelementEnd()()();
|
|
536
|
-
i0.ɵɵelementStart(23, "button",
|
|
537
|
-
i0.ɵɵlistener("click", function
|
|
538
|
-
i0.ɵɵconditionalCreate(24,
|
|
612
|
+
i0.ɵɵelementStart(23, "button", 117);
|
|
613
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.RunSuggestion()); });
|
|
614
|
+
i0.ɵɵconditionalCreate(24, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_24_Template, 2, 0)(25, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_25_Template, 2, 0);
|
|
539
615
|
i0.ɵɵelementEnd();
|
|
540
|
-
i0.ɵɵconditionalCreate(26,
|
|
616
|
+
i0.ɵɵconditionalCreate(26, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_26_Template, 3, 1, "div", 118);
|
|
541
617
|
i0.ɵɵelementEnd();
|
|
542
618
|
} if (rf & 2) {
|
|
543
619
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -558,78 +634,78 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditio
|
|
|
558
634
|
i0.ɵɵadvance(2);
|
|
559
635
|
i0.ɵɵconditional(ctx_r2.SuggestionError ? 26 : -1);
|
|
560
636
|
} }
|
|
561
|
-
function
|
|
562
|
-
i0.ɵɵelementStart(0, "span",
|
|
637
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
638
|
+
i0.ɵɵelementStart(0, "span", 85);
|
|
563
639
|
i0.ɵɵtext(1);
|
|
564
640
|
i0.ɵɵelementEnd();
|
|
565
641
|
} if (rf & 2) {
|
|
566
|
-
const
|
|
642
|
+
const field_r24 = ctx.$implicit;
|
|
567
643
|
i0.ɵɵadvance();
|
|
568
|
-
i0.ɵɵtextInterpolate(
|
|
644
|
+
i0.ɵɵtextInterpolate(field_r24);
|
|
569
645
|
} }
|
|
570
|
-
function
|
|
571
|
-
i0.ɵɵelementStart(0, "div",
|
|
646
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
647
|
+
i0.ɵɵelementStart(0, "div", 144)(1, "span", 145);
|
|
572
648
|
i0.ɵɵtext(2);
|
|
573
649
|
i0.ɵɵelementEnd();
|
|
574
|
-
i0.ɵɵelementStart(3, "span",
|
|
650
|
+
i0.ɵɵelementStart(3, "span", 146);
|
|
575
651
|
i0.ɵɵtext(4);
|
|
576
652
|
i0.ɵɵelementEnd()();
|
|
577
653
|
} if (rf & 2) {
|
|
578
|
-
const
|
|
654
|
+
const rel_r25 = ctx.$implicit;
|
|
579
655
|
i0.ɵɵadvance(2);
|
|
580
|
-
i0.ɵɵtextInterpolate(
|
|
656
|
+
i0.ɵɵtextInterpolate(rel_r25.name);
|
|
581
657
|
i0.ɵɵadvance(2);
|
|
582
|
-
i0.ɵɵtextInterpolate(
|
|
658
|
+
i0.ɵɵtextInterpolate(rel_r25.fields.join(", "));
|
|
583
659
|
} }
|
|
584
|
-
function
|
|
585
|
-
i0.ɵɵelementStart(0, "div",
|
|
660
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
661
|
+
i0.ɵɵelementStart(0, "div", 134)(1, "h4", 135);
|
|
586
662
|
i0.ɵɵtext(2, "Related Entities");
|
|
587
663
|
i0.ɵɵelementEnd();
|
|
588
|
-
i0.ɵɵrepeaterCreate(3,
|
|
664
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_For_4_Template, 5, 2, "div", 144, _forTrack4);
|
|
589
665
|
i0.ɵɵelementEnd();
|
|
590
666
|
} if (rf & 2) {
|
|
591
667
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
592
668
|
i0.ɵɵadvance(3);
|
|
593
669
|
i0.ɵɵrepeater(ctx_r2.SuggestionResult.selectedRelationships);
|
|
594
670
|
} }
|
|
595
|
-
function
|
|
596
|
-
i0.ɵɵelementStart(0, "option",
|
|
671
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_39_Template(rf, ctx) { if (rf & 1) {
|
|
672
|
+
i0.ɵɵelementStart(0, "option", 77);
|
|
597
673
|
i0.ɵɵtext(1);
|
|
598
674
|
i0.ɵɵelementEnd();
|
|
599
675
|
} if (rf & 2) {
|
|
600
|
-
const
|
|
601
|
-
i0.ɵɵproperty("value",
|
|
676
|
+
const model_r26 = ctx.$implicit;
|
|
677
|
+
i0.ɵɵproperty("value", model_r26.ID);
|
|
602
678
|
i0.ɵɵadvance();
|
|
603
|
-
i0.ɵɵtextInterpolate(
|
|
679
|
+
i0.ɵɵtextInterpolate(model_r26.Name);
|
|
604
680
|
} }
|
|
605
|
-
function
|
|
606
|
-
i0.ɵɵelementStart(0, "option",
|
|
681
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_45_Template(rf, ctx) { if (rf & 1) {
|
|
682
|
+
i0.ɵɵelementStart(0, "option", 77);
|
|
607
683
|
i0.ɵɵtext(1);
|
|
608
684
|
i0.ɵɵelementEnd();
|
|
609
685
|
} if (rf & 2) {
|
|
610
|
-
const
|
|
611
|
-
i0.ɵɵproperty("value",
|
|
686
|
+
const db_r27 = ctx.$implicit;
|
|
687
|
+
i0.ɵɵproperty("value", db_r27.ID);
|
|
612
688
|
i0.ɵɵadvance();
|
|
613
|
-
i0.ɵɵtextInterpolate(
|
|
689
|
+
i0.ɵɵtextInterpolate(db_r27.Name);
|
|
614
690
|
} }
|
|
615
|
-
function
|
|
616
|
-
i0.ɵɵelementStart(0, "option",
|
|
691
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
692
|
+
i0.ɵɵelementStart(0, "option", 77);
|
|
617
693
|
i0.ɵɵtext(1);
|
|
618
694
|
i0.ɵɵelementEnd();
|
|
619
695
|
} if (rf & 2) {
|
|
620
|
-
const
|
|
621
|
-
i0.ɵɵproperty("value",
|
|
696
|
+
const idx_r29 = ctx.$implicit;
|
|
697
|
+
i0.ɵɵproperty("value", idx_r29.ID);
|
|
622
698
|
i0.ɵɵadvance();
|
|
623
|
-
i0.ɵɵtextInterpolate(
|
|
699
|
+
i0.ɵɵtextInterpolate(idx_r29.Name);
|
|
624
700
|
} }
|
|
625
|
-
function
|
|
626
|
-
const
|
|
627
|
-
i0.ɵɵelementStart(0, "select",
|
|
628
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
629
|
-
i0.ɵɵelementStart(1, "option",
|
|
701
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_Template(rf, ctx) { if (rf & 1) {
|
|
702
|
+
const _r28 = i0.ɵɵgetCurrentView();
|
|
703
|
+
i0.ɵɵelementStart(0, "select", 76);
|
|
704
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorIndexID, $event) || (ctx_r2.SelectedVectorIndexID = $event); return i0.ɵɵresetView($event); });
|
|
705
|
+
i0.ɵɵelementStart(1, "option", 86);
|
|
630
706
|
i0.ɵɵtext(2, "Auto (create/find matching index)");
|
|
631
707
|
i0.ɵɵelementEnd();
|
|
632
|
-
i0.ɵɵrepeaterCreate(3,
|
|
708
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_For_4_Template, 2, 2, "option", 77, _forTrack2);
|
|
633
709
|
i0.ɵɵelementEnd();
|
|
634
710
|
} if (rf & 2) {
|
|
635
711
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
@@ -637,93 +713,93 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditio
|
|
|
637
713
|
i0.ɵɵadvance(3);
|
|
638
714
|
i0.ɵɵrepeater(ctx_r2.FilteredIndexesForSelectedDB);
|
|
639
715
|
} }
|
|
640
|
-
function
|
|
641
|
-
i0.ɵɵelementStart(0, "span",
|
|
716
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
717
|
+
i0.ɵɵelementStart(0, "span", 79);
|
|
642
718
|
i0.ɵɵtext(1, " No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync ");
|
|
643
719
|
i0.ɵɵelementEnd();
|
|
644
720
|
} }
|
|
645
|
-
function
|
|
646
|
-
i0.ɵɵelementStart(0, "div",
|
|
647
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
721
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_52_Template(rf, ctx) { if (rf & 1) {
|
|
722
|
+
i0.ɵɵelementStart(0, "div", 143);
|
|
723
|
+
i0.ɵɵelement(1, "mj-loading", 83);
|
|
648
724
|
i0.ɵɵelementEnd();
|
|
649
725
|
} }
|
|
650
|
-
function
|
|
651
|
-
const
|
|
652
|
-
i0.ɵɵelementStart(0, "button",
|
|
653
|
-
i0.ɵɵlistener("click", function
|
|
654
|
-
i0.ɵɵelement(1, "i",
|
|
726
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template(rf, ctx) { if (rf & 1) {
|
|
727
|
+
const _r30 = i0.ɵɵgetCurrentView();
|
|
728
|
+
i0.ɵɵelementStart(0, "button", 87);
|
|
729
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.SaveAsEntityDocument()); });
|
|
730
|
+
i0.ɵɵelement(1, "i", 147);
|
|
655
731
|
i0.ɵɵtext(2, " Save as Entity Document ");
|
|
656
732
|
i0.ɵɵelementEnd();
|
|
657
|
-
i0.ɵɵelementStart(3, "button",
|
|
658
|
-
i0.ɵɵlistener("click", function
|
|
659
|
-
i0.ɵɵelement(4, "i",
|
|
733
|
+
i0.ɵɵelementStart(3, "button", 148);
|
|
734
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.ClearSuggestion()); });
|
|
735
|
+
i0.ɵɵelement(4, "i", 149);
|
|
660
736
|
i0.ɵɵtext(5, " Try Again ");
|
|
661
737
|
i0.ɵɵelementEnd();
|
|
662
|
-
i0.ɵɵelementStart(6, "button",
|
|
663
|
-
i0.ɵɵlistener("click", function
|
|
738
|
+
i0.ɵɵelementStart(6, "button", 91);
|
|
739
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
|
|
664
740
|
i0.ɵɵtext(7, " Close ");
|
|
665
741
|
i0.ɵɵelementEnd();
|
|
666
742
|
} }
|
|
667
|
-
function
|
|
668
|
-
const
|
|
669
|
-
i0.ɵɵelementStart(0, "div",
|
|
743
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
744
|
+
const _r23 = i0.ɵɵgetCurrentView();
|
|
745
|
+
i0.ɵɵelementStart(0, "div", 107)(1, "div", 134)(2, "h4", 135);
|
|
670
746
|
i0.ɵɵtext(3, "Suggested Template");
|
|
671
747
|
i0.ɵɵelementEnd();
|
|
672
|
-
i0.ɵɵelementStart(4, "div",
|
|
673
|
-
i0.ɵɵlistener("change", function
|
|
748
|
+
i0.ɵɵelementStart(4, "div", 73)(5, "mj-code-editor", 74);
|
|
749
|
+
i0.ɵɵlistener("change", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template_mj_code_editor_change_5_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnTemplateChange($event)); });
|
|
674
750
|
i0.ɵɵelementEnd()()();
|
|
675
|
-
i0.ɵɵelementStart(6, "div",
|
|
751
|
+
i0.ɵɵelementStart(6, "div", 134)(7, "h4", 135);
|
|
676
752
|
i0.ɵɵtext(8, "Selected Fields");
|
|
677
753
|
i0.ɵɵelementEnd();
|
|
678
|
-
i0.ɵɵelementStart(9, "div",
|
|
679
|
-
i0.ɵɵrepeaterCreate(10,
|
|
754
|
+
i0.ɵɵelementStart(9, "div", 84);
|
|
755
|
+
i0.ɵɵrepeaterCreate(10, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_11_Template, 2, 1, "span", 85, i0.ɵɵrepeaterTrackByIdentity);
|
|
680
756
|
i0.ɵɵelementEnd()();
|
|
681
|
-
i0.ɵɵconditionalCreate(12,
|
|
682
|
-
i0.ɵɵelementStart(13, "div",
|
|
757
|
+
i0.ɵɵconditionalCreate(12, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_Template, 5, 0, "div", 134);
|
|
758
|
+
i0.ɵɵelementStart(13, "div", 136)(14, "div", 137)(15, "span", 138);
|
|
683
759
|
i0.ɵɵtext(16, "Potential Match");
|
|
684
760
|
i0.ɵɵelementEnd();
|
|
685
|
-
i0.ɵɵelementStart(17, "span",
|
|
761
|
+
i0.ɵɵelementStart(17, "span", 139);
|
|
686
762
|
i0.ɵɵtext(18);
|
|
687
763
|
i0.ɵɵelementEnd()();
|
|
688
|
-
i0.ɵɵelementStart(19, "div",
|
|
764
|
+
i0.ɵɵelementStart(19, "div", 137)(20, "span", 138);
|
|
689
765
|
i0.ɵɵtext(21, "Absolute Match");
|
|
690
766
|
i0.ɵɵelementEnd();
|
|
691
|
-
i0.ɵɵelementStart(22, "span",
|
|
767
|
+
i0.ɵɵelementStart(22, "span", 139);
|
|
692
768
|
i0.ɵɵtext(23);
|
|
693
769
|
i0.ɵɵelementEnd()()();
|
|
694
|
-
i0.ɵɵelementStart(24, "div",
|
|
770
|
+
i0.ɵɵelementStart(24, "div", 134)(25, "h4", 135);
|
|
695
771
|
i0.ɵɵtext(26, "Reasoning");
|
|
696
772
|
i0.ɵɵelementEnd();
|
|
697
|
-
i0.ɵɵelementStart(27, "p",
|
|
773
|
+
i0.ɵɵelementStart(27, "p", 140);
|
|
698
774
|
i0.ɵɵtext(28);
|
|
699
775
|
i0.ɵɵelementEnd()();
|
|
700
|
-
i0.ɵɵelementStart(29, "div",
|
|
776
|
+
i0.ɵɵelementStart(29, "div", 134)(30, "div", 68)(31, "label", 69);
|
|
701
777
|
i0.ɵɵtext(32, "Document Name");
|
|
702
778
|
i0.ɵɵelementEnd();
|
|
703
|
-
i0.ɵɵelementStart(33, "input",
|
|
704
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
779
|
+
i0.ɵɵelementStart(33, "input", 75);
|
|
780
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SaveDocumentName, $event) || (ctx_r2.SaveDocumentName = $event); return i0.ɵɵresetView($event); });
|
|
705
781
|
i0.ɵɵelementEnd()();
|
|
706
|
-
i0.ɵɵelementStart(34, "div",
|
|
782
|
+
i0.ɵɵelementStart(34, "div", 141)(35, "label", 69);
|
|
707
783
|
i0.ɵɵtext(36, "Embedding Model");
|
|
708
784
|
i0.ɵɵelementEnd();
|
|
709
|
-
i0.ɵɵelementStart(37, "select",
|
|
710
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
711
|
-
i0.ɵɵrepeaterCreate(38,
|
|
785
|
+
i0.ɵɵelementStart(37, "select", 76);
|
|
786
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template_select_ngModelChange_37_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedEmbeddingModelID, $event) || (ctx_r2.SelectedEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
|
|
787
|
+
i0.ɵɵrepeaterCreate(38, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_39_Template, 2, 2, "option", 77, _forTrack2);
|
|
712
788
|
i0.ɵɵelementEnd()();
|
|
713
|
-
i0.ɵɵelementStart(40, "div",
|
|
789
|
+
i0.ɵɵelementStart(40, "div", 141)(41, "label", 69);
|
|
714
790
|
i0.ɵɵtext(42, "Vector Database");
|
|
715
791
|
i0.ɵɵelementEnd();
|
|
716
|
-
i0.ɵɵelementStart(43, "select",
|
|
717
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
718
|
-
i0.ɵɵrepeaterCreate(44,
|
|
792
|
+
i0.ɵɵelementStart(43, "select", 76);
|
|
793
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template_select_ngModelChange_43_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorDBID, $event) || (ctx_r2.SelectedVectorDBID = $event); return i0.ɵɵresetView($event); });
|
|
794
|
+
i0.ɵɵrepeaterCreate(44, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_45_Template, 2, 2, "option", 77, _forTrack2);
|
|
719
795
|
i0.ɵɵelementEnd()();
|
|
720
|
-
i0.ɵɵelementStart(46, "div",
|
|
796
|
+
i0.ɵɵelementStart(46, "div", 141)(47, "label", 69);
|
|
721
797
|
i0.ɵɵtext(48, "Vector Index");
|
|
722
798
|
i0.ɵɵelementEnd();
|
|
723
|
-
i0.ɵɵconditionalCreate(49,
|
|
799
|
+
i0.ɵɵconditionalCreate(49, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_Template, 5, 1, "select", 78)(50, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_50_Template, 2, 0, "span", 79);
|
|
724
800
|
i0.ɵɵelementEnd()();
|
|
725
|
-
i0.ɵɵelementStart(51, "div",
|
|
726
|
-
i0.ɵɵconditionalCreate(52,
|
|
801
|
+
i0.ɵɵelementStart(51, "div", 142);
|
|
802
|
+
i0.ɵɵconditionalCreate(52, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_52_Template, 2, 0, "div", 143)(53, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template, 8, 0);
|
|
727
803
|
i0.ɵɵelementEnd()();
|
|
728
804
|
} if (rf & 2) {
|
|
729
805
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -754,22 +830,22 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditio
|
|
|
754
830
|
i0.ɵɵadvance(3);
|
|
755
831
|
i0.ɵɵconditional(ctx_r2.IsSavingDocument ? 52 : 53);
|
|
756
832
|
} }
|
|
757
|
-
function
|
|
758
|
-
const
|
|
759
|
-
i0.ɵɵelementStart(0, "div",
|
|
760
|
-
i0.ɵɵlistener("click", function
|
|
761
|
-
i0.ɵɵelementStart(1, "div",
|
|
762
|
-
i0.ɵɵlistener("click", function
|
|
763
|
-
i0.ɵɵelementStart(2, "div",
|
|
764
|
-
i0.ɵɵelement(4, "i",
|
|
833
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_58_Template(rf, ctx) { if (rf & 1) {
|
|
834
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
835
|
+
i0.ɵɵelementStart(0, "div", 60);
|
|
836
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
|
|
837
|
+
i0.ɵɵelementStart(1, "div", 106);
|
|
838
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r17); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
839
|
+
i0.ɵɵelementStart(2, "div", 62)(3, "h3", 63);
|
|
840
|
+
i0.ɵɵelement(4, "i", 14);
|
|
765
841
|
i0.ɵɵtext(5, " AI Document Suggestion ");
|
|
766
842
|
i0.ɵɵelementEnd();
|
|
767
|
-
i0.ɵɵelementStart(6, "button",
|
|
768
|
-
i0.ɵɵlistener("click", function
|
|
769
|
-
i0.ɵɵelement(7, "i",
|
|
843
|
+
i0.ɵɵelementStart(6, "button", 64);
|
|
844
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
|
|
845
|
+
i0.ɵɵelement(7, "i", 65);
|
|
770
846
|
i0.ɵɵelementEnd()();
|
|
771
|
-
i0.ɵɵelementStart(8, "div",
|
|
772
|
-
i0.ɵɵconditionalCreate(9,
|
|
847
|
+
i0.ɵɵelementStart(8, "div", 66);
|
|
848
|
+
i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template, 27, 11, "div", 67)(10, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template, 54, 12, "div", 107);
|
|
773
849
|
i0.ɵɵelementEnd()()();
|
|
774
850
|
} if (rf & 2) {
|
|
775
851
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -780,69 +856,70 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template
|
|
|
780
856
|
} }
|
|
781
857
|
function VectorManagementResourceComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
782
858
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
783
|
-
i0.ɵɵelementStart(0, "div",
|
|
784
|
-
i0.ɵɵconditionalCreate(1, VectorManagementResourceComponent_Conditional_1_Conditional_1_Template, 7, 4, "div",
|
|
785
|
-
i0.ɵɵelementStart(2, "div",
|
|
786
|
-
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_For_4_Template, 1, 1, "app-kpi-card",
|
|
859
|
+
i0.ɵɵelementStart(0, "div", 3);
|
|
860
|
+
i0.ɵɵconditionalCreate(1, VectorManagementResourceComponent_Conditional_1_Conditional_1_Template, 7, 4, "div", 4);
|
|
861
|
+
i0.ɵɵelementStart(2, "div", 5);
|
|
862
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_For_4_Template, 1, 1, "app-kpi-card", 6, _forTrack0);
|
|
787
863
|
i0.ɵɵelementEnd();
|
|
788
|
-
i0.ɵɵelementStart(5, "div",
|
|
789
|
-
i0.ɵɵelement(9, "i",
|
|
864
|
+
i0.ɵɵelementStart(5, "div", 7)(6, "div", 8)(7, "div", 9)(8, "h3", 10);
|
|
865
|
+
i0.ɵɵelement(9, "i", 11);
|
|
790
866
|
i0.ɵɵtext(10, " Entity Sync Status ");
|
|
791
867
|
i0.ɵɵelementEnd();
|
|
792
|
-
i0.ɵɵelementStart(11, "div",
|
|
868
|
+
i0.ɵɵelementStart(11, "div", 12)(12, "button", 13);
|
|
793
869
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OpenSuggestDialog()); });
|
|
794
|
-
i0.ɵɵelement(13, "i",
|
|
795
|
-
i0.ɵɵelementStart(14, "span",
|
|
870
|
+
i0.ɵɵelement(13, "i", 14);
|
|
871
|
+
i0.ɵɵelementStart(14, "span", 15);
|
|
796
872
|
i0.ɵɵtext(15, "Suggest Document");
|
|
797
873
|
i0.ɵɵelementEnd()();
|
|
798
|
-
i0.ɵɵelementStart(16, "button",
|
|
874
|
+
i0.ɵɵelementStart(16, "button", 16);
|
|
799
875
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.LoadData()); });
|
|
800
|
-
i0.ɵɵelement(17, "i",
|
|
876
|
+
i0.ɵɵelement(17, "i", 17);
|
|
801
877
|
i0.ɵɵtext(18, " Refresh ");
|
|
802
878
|
i0.ɵɵelementEnd()()();
|
|
803
|
-
i0.ɵɵconditionalCreate(19, VectorManagementResourceComponent_Conditional_1_Conditional_19_Template, 4, 0, "div",
|
|
879
|
+
i0.ɵɵconditionalCreate(19, VectorManagementResourceComponent_Conditional_1_Conditional_19_Template, 4, 0, "div", 18)(20, VectorManagementResourceComponent_Conditional_1_Conditional_20_Template, 19, 0, "div", 19);
|
|
804
880
|
i0.ɵɵelementEnd();
|
|
805
|
-
i0.ɵɵelementStart(21, "div",
|
|
806
|
-
i0.ɵɵelement(24, "i",
|
|
881
|
+
i0.ɵɵelementStart(21, "div", 20)(22, "div", 21)(23, "h4", 22);
|
|
882
|
+
i0.ɵɵelement(24, "i", 23);
|
|
807
883
|
i0.ɵɵtext(25, " Vector DB Health ");
|
|
808
884
|
i0.ɵɵelementEnd();
|
|
809
|
-
i0.ɵɵelementStart(26, "div",
|
|
810
|
-
i0.ɵɵelement(27, "span",
|
|
811
|
-
i0.ɵɵelementStart(28, "span",
|
|
885
|
+
i0.ɵɵelementStart(26, "div", 24);
|
|
886
|
+
i0.ɵɵelement(27, "span", 25);
|
|
887
|
+
i0.ɵɵelementStart(28, "span", 26);
|
|
812
888
|
i0.ɵɵtext(29);
|
|
813
889
|
i0.ɵɵelementEnd()();
|
|
814
|
-
i0.ɵɵelementStart(30, "div",
|
|
890
|
+
i0.ɵɵelementStart(30, "div", 27);
|
|
815
891
|
i0.ɵɵtext(31);
|
|
816
892
|
i0.ɵɵelementEnd()();
|
|
817
|
-
i0.ɵɵelementStart(32, "div",
|
|
818
|
-
i0.ɵɵelement(34, "i",
|
|
893
|
+
i0.ɵɵelementStart(32, "div", 21)(33, "h4", 22);
|
|
894
|
+
i0.ɵɵelement(34, "i", 28);
|
|
819
895
|
i0.ɵɵtext(35, " Embedding Model ");
|
|
820
896
|
i0.ɵɵelementEnd();
|
|
821
|
-
i0.ɵɵelementStart(36, "div",
|
|
897
|
+
i0.ɵɵelementStart(36, "div", 29)(37, "div", 30)(38, "span", 31);
|
|
822
898
|
i0.ɵɵtext(39, "Model");
|
|
823
899
|
i0.ɵɵelementEnd();
|
|
824
|
-
i0.ɵɵelementStart(40, "span",
|
|
900
|
+
i0.ɵɵelementStart(40, "span", 32);
|
|
825
901
|
i0.ɵɵtext(41);
|
|
826
902
|
i0.ɵɵelementEnd()();
|
|
827
|
-
i0.ɵɵconditionalCreate(42, VectorManagementResourceComponent_Conditional_1_Conditional_42_Template, 6, 3, "div",
|
|
903
|
+
i0.ɵɵconditionalCreate(42, VectorManagementResourceComponent_Conditional_1_Conditional_42_Template, 6, 3, "div", 30);
|
|
828
904
|
i0.ɵɵelementEnd()();
|
|
829
|
-
i0.ɵɵelementStart(43, "div",
|
|
830
|
-
i0.ɵɵelement(45, "i",
|
|
905
|
+
i0.ɵɵelementStart(43, "div", 21)(44, "h4", 22);
|
|
906
|
+
i0.ɵɵelement(45, "i", 33);
|
|
831
907
|
i0.ɵɵtext(46, " Vectorization Coverage ");
|
|
832
908
|
i0.ɵɵelementEnd();
|
|
833
|
-
i0.ɵɵelementStart(47, "div",
|
|
834
|
-
i0.ɵɵelement(49, "div",
|
|
909
|
+
i0.ɵɵelementStart(47, "div", 34)(48, "div", 35);
|
|
910
|
+
i0.ɵɵelement(49, "div", 36);
|
|
835
911
|
i0.ɵɵelementEnd();
|
|
836
|
-
i0.ɵɵelementStart(50, "div",
|
|
912
|
+
i0.ɵɵelementStart(50, "div", 37);
|
|
837
913
|
i0.ɵɵtext(51);
|
|
838
914
|
i0.ɵɵelementEnd()();
|
|
839
|
-
i0.ɵɵelementStart(52, "div",
|
|
915
|
+
i0.ɵɵelementStart(52, "div", 38);
|
|
840
916
|
i0.ɵɵtext(53);
|
|
841
917
|
i0.ɵɵpipe(54, "number");
|
|
842
918
|
i0.ɵɵelementEnd()()()()();
|
|
843
|
-
i0.ɵɵconditionalCreate(55, VectorManagementResourceComponent_Conditional_1_Conditional_55_Template,
|
|
844
|
-
i0.ɵɵconditionalCreate(56, VectorManagementResourceComponent_Conditional_1_Conditional_56_Template, 34, 5, "div",
|
|
845
|
-
i0.ɵɵconditionalCreate(57, VectorManagementResourceComponent_Conditional_1_Conditional_57_Template,
|
|
919
|
+
i0.ɵɵconditionalCreate(55, VectorManagementResourceComponent_Conditional_1_Conditional_55_Template, 57, 13, "div", 39);
|
|
920
|
+
i0.ɵɵconditionalCreate(56, VectorManagementResourceComponent_Conditional_1_Conditional_56_Template, 34, 5, "div", 39);
|
|
921
|
+
i0.ɵɵconditionalCreate(57, VectorManagementResourceComponent_Conditional_1_Conditional_57_Template, 14, 0, "div", 39);
|
|
922
|
+
i0.ɵɵconditionalCreate(58, VectorManagementResourceComponent_Conditional_1_Conditional_58_Template, 11, 3, "div", 39);
|
|
846
923
|
} if (rf & 2) {
|
|
847
924
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
848
925
|
i0.ɵɵadvance();
|
|
@@ -866,13 +943,15 @@ function VectorManagementResourceComponent_Conditional_1_Template(rf, ctx) { if
|
|
|
866
943
|
i0.ɵɵadvance(2);
|
|
867
944
|
i0.ɵɵtextInterpolate1("", ctx_r2.StorageLabel, " of records vectorized");
|
|
868
945
|
i0.ɵɵadvance(2);
|
|
869
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54,
|
|
946
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54, 16, ctx_r2.TotalVectors), " vectors stored ");
|
|
870
947
|
i0.ɵɵadvance(2);
|
|
871
948
|
i0.ɵɵconditional(ctx_r2.ShowEditPanel ? 55 : -1);
|
|
872
949
|
i0.ɵɵadvance();
|
|
873
950
|
i0.ɵɵconditional(ctx_r2.ShowScheduleSyncDialog ? 56 : -1);
|
|
874
951
|
i0.ɵɵadvance();
|
|
875
|
-
i0.ɵɵconditional(ctx_r2.
|
|
952
|
+
i0.ɵɵconditional(ctx_r2.ShowNoIndexWarning ? 57 : -1);
|
|
953
|
+
i0.ɵɵadvance();
|
|
954
|
+
i0.ɵɵconditional(ctx_r2.ShowSuggestDialog ? 58 : -1);
|
|
876
955
|
} }
|
|
877
956
|
let VectorManagementResourceComponent = class VectorManagementResourceComponent extends BaseResourceComponent {
|
|
878
957
|
cdr = inject(ChangeDetectorRef);
|
|
@@ -912,8 +991,21 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
912
991
|
EditDocAIModelID = '';
|
|
913
992
|
EditDocVectorIndexID = '';
|
|
914
993
|
EditDocStatus = '';
|
|
994
|
+
EditDocTemplate = '';
|
|
995
|
+
IsEditRegenerating = false;
|
|
996
|
+
/** Parse {{ FieldName }} patterns from the edit panel's template */
|
|
997
|
+
get EditDocSelectedFields() {
|
|
998
|
+
if (!this.EditDocTemplate)
|
|
999
|
+
return [];
|
|
1000
|
+
const matches = this.EditDocTemplate.match(/\{\{\s*(\w+(?:\.\w+)*)\s*\}\}/g);
|
|
1001
|
+
if (!matches)
|
|
1002
|
+
return [];
|
|
1003
|
+
return [...new Set(matches.map(m => m.replace(/\{\{\s*/, '').replace(/\s*\}\}/, '')))];
|
|
1004
|
+
}
|
|
1005
|
+
// --- Zero Vector Indexes Warning ---
|
|
1006
|
+
ShowNoIndexWarning = false;
|
|
915
1007
|
/** Open the edit panel for an entity document */
|
|
916
|
-
OpenEditPanel(entityDocumentId) {
|
|
1008
|
+
async OpenEditPanel(entityDocumentId) {
|
|
917
1009
|
const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));
|
|
918
1010
|
if (!doc)
|
|
919
1011
|
return;
|
|
@@ -924,8 +1016,35 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
924
1016
|
this.EditDocAIModelID = doc.AIModelID;
|
|
925
1017
|
this.EditDocVectorIndexID = doc.VectorIndexID || '';
|
|
926
1018
|
this.EditDocStatus = doc.Status;
|
|
1019
|
+
this.EditDocTemplate = '';
|
|
1020
|
+
this.IsEditRegenerating = false;
|
|
927
1021
|
this.ShowEditPanel = true;
|
|
928
1022
|
this.cdr.detectChanges();
|
|
1023
|
+
// Load the template text from Template Contents
|
|
1024
|
+
await this.loadEditDocTemplate(doc.TemplateID);
|
|
1025
|
+
}
|
|
1026
|
+
/** Load the template text for the edit panel from the associated Template Contents record */
|
|
1027
|
+
async loadEditDocTemplate(templateId) {
|
|
1028
|
+
if (!templateId)
|
|
1029
|
+
return;
|
|
1030
|
+
try {
|
|
1031
|
+
const rv = new RunView();
|
|
1032
|
+
const result = await rv.RunView({
|
|
1033
|
+
EntityName: 'MJ: Template Contents',
|
|
1034
|
+
ExtraFilter: `TemplateID='${templateId}'`,
|
|
1035
|
+
Fields: ['TemplateText'],
|
|
1036
|
+
ResultType: 'simple',
|
|
1037
|
+
OrderBy: 'Priority ASC',
|
|
1038
|
+
MaxRows: 1,
|
|
1039
|
+
});
|
|
1040
|
+
if (result.Success && result.Results.length > 0 && result.Results[0].TemplateText) {
|
|
1041
|
+
this.EditDocTemplate = result.Results[0].TemplateText;
|
|
1042
|
+
this.cdr.detectChanges();
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
catch (error) {
|
|
1046
|
+
console.warn('[VectorManagement] Could not load template text:', error);
|
|
1047
|
+
}
|
|
929
1048
|
}
|
|
930
1049
|
CloseEditPanel() {
|
|
931
1050
|
this.ShowEditPanel = false;
|
|
@@ -947,6 +1066,8 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
947
1066
|
doc.Status = this.EditDocStatus;
|
|
948
1067
|
const saved = await doc.Save();
|
|
949
1068
|
if (saved) {
|
|
1069
|
+
// Also save updated template text if changed
|
|
1070
|
+
await this.saveEditDocTemplate(doc.TemplateID);
|
|
950
1071
|
MJNotificationService.Instance.CreateSimpleNotification('Entity document updated', 'success', 2500);
|
|
951
1072
|
this.ShowEditPanel = false;
|
|
952
1073
|
await this.LoadData();
|
|
@@ -965,6 +1086,55 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
965
1086
|
this.cdr.detectChanges();
|
|
966
1087
|
}
|
|
967
1088
|
}
|
|
1089
|
+
/** Save the edited template text back to the Template Contents record */
|
|
1090
|
+
async saveEditDocTemplate(templateId) {
|
|
1091
|
+
if (!templateId || !this.EditDocTemplate)
|
|
1092
|
+
return;
|
|
1093
|
+
try {
|
|
1094
|
+
const rv = new RunView();
|
|
1095
|
+
const result = await rv.RunView({
|
|
1096
|
+
EntityName: 'MJ: Template Contents',
|
|
1097
|
+
ExtraFilter: `TemplateID='${templateId}'`,
|
|
1098
|
+
ResultType: 'entity_object',
|
|
1099
|
+
OrderBy: 'Priority ASC',
|
|
1100
|
+
MaxRows: 1,
|
|
1101
|
+
});
|
|
1102
|
+
if (result.Success && result.Results.length > 0) {
|
|
1103
|
+
const content = result.Results[0];
|
|
1104
|
+
content.TemplateText = this.EditDocTemplate;
|
|
1105
|
+
await content.Save();
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
1108
|
+
catch (error) {
|
|
1109
|
+
console.warn('[VectorManagement] Could not save template text:', error);
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
/** Regenerate the template using AI for the current edit panel entity */
|
|
1113
|
+
async RegenerateTemplate() {
|
|
1114
|
+
if (!this.EditDocEntityName || this.IsEditRegenerating)
|
|
1115
|
+
return;
|
|
1116
|
+
this.IsEditRegenerating = true;
|
|
1117
|
+
this.cdr.detectChanges();
|
|
1118
|
+
try {
|
|
1119
|
+
const result = await this.callSuggestionPrompt(this.EditDocEntityName, 'duplicate detection');
|
|
1120
|
+
if (result) {
|
|
1121
|
+
this.EditDocTemplate = result.template;
|
|
1122
|
+
MJNotificationService.Instance.CreateSimpleNotification('Template regenerated with AI. Review and save to apply.', 'info', 3000);
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
catch (error) {
|
|
1126
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
1127
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Regeneration failed: ${msg}`, 'error', 5000);
|
|
1128
|
+
}
|
|
1129
|
+
finally {
|
|
1130
|
+
this.IsEditRegenerating = false;
|
|
1131
|
+
this.cdr.detectChanges();
|
|
1132
|
+
}
|
|
1133
|
+
}
|
|
1134
|
+
/** Handle template edits from the edit panel's code editor */
|
|
1135
|
+
OnEditTemplateChange(newValue) {
|
|
1136
|
+
this.EditDocTemplate = newValue;
|
|
1137
|
+
}
|
|
968
1138
|
async DeleteEntityDocument() {
|
|
969
1139
|
this.IsEditDeleting = true;
|
|
970
1140
|
this.cdr.detectChanges();
|
|
@@ -1153,12 +1323,16 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1153
1323
|
EntitySearchText = '';
|
|
1154
1324
|
/** Whether the entity picker dropdown is open */
|
|
1155
1325
|
ShowEntityPicker = false;
|
|
1326
|
+
SelectedEntityIndex = -1;
|
|
1327
|
+
/** Reference to the entity search input for programmatic focus */
|
|
1328
|
+
entitySearchInput;
|
|
1156
1329
|
// --- Raw entity data (private) ---
|
|
1157
1330
|
entityDocuments = [];
|
|
1158
1331
|
vectorDatabases = [];
|
|
1159
1332
|
vectorIndexes = [];
|
|
1160
|
-
recordDocuments = [];
|
|
1161
1333
|
aiModels = [];
|
|
1334
|
+
/** Lightweight aggregate stats per EntityDocumentID — avoids loading all record documents */
|
|
1335
|
+
erdStats = new Map();
|
|
1162
1336
|
// ================================================================
|
|
1163
1337
|
// Lifecycle
|
|
1164
1338
|
// ================================================================
|
|
@@ -1171,6 +1345,7 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1171
1345
|
this.NotifyLoadComplete();
|
|
1172
1346
|
}
|
|
1173
1347
|
ngOnDestroy() {
|
|
1348
|
+
super.ngOnDestroy();
|
|
1174
1349
|
this.destroy$.next();
|
|
1175
1350
|
this.destroy$.complete();
|
|
1176
1351
|
}
|
|
@@ -1349,8 +1524,13 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1349
1524
|
this.SyncingIds = next;
|
|
1350
1525
|
}
|
|
1351
1526
|
}
|
|
1352
|
-
/** Opens the AI suggestion dialog */
|
|
1527
|
+
/** Opens the AI suggestion dialog, or shows a warning if no vector indexes exist */
|
|
1353
1528
|
OpenSuggestDialog() {
|
|
1529
|
+
if (this.vectorIndexes.length === 0 && this.vectorDatabases.length === 0) {
|
|
1530
|
+
this.ShowNoIndexWarning = true;
|
|
1531
|
+
this.cdr.detectChanges();
|
|
1532
|
+
return;
|
|
1533
|
+
}
|
|
1354
1534
|
this.SuggestionResult = null;
|
|
1355
1535
|
this.SuggestEntityName = '';
|
|
1356
1536
|
this.SuggestUseCase = 'duplicate detection';
|
|
@@ -1362,6 +1542,18 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1362
1542
|
this.ShowSuggestDialog = true;
|
|
1363
1543
|
this.cdr.detectChanges();
|
|
1364
1544
|
}
|
|
1545
|
+
/** Close the no-index warning dialog */
|
|
1546
|
+
CloseNoIndexWarning() {
|
|
1547
|
+
this.ShowNoIndexWarning = false;
|
|
1548
|
+
this.cdr.detectChanges();
|
|
1549
|
+
}
|
|
1550
|
+
/** Navigate to the Configuration section from the no-index warning */
|
|
1551
|
+
async GoToConfiguration() {
|
|
1552
|
+
this.ShowNoIndexWarning = false;
|
|
1553
|
+
this.cdr.detectChanges();
|
|
1554
|
+
// Attempt to open the Config nav item in the current app
|
|
1555
|
+
await this.navigationService.OpenNavItemByName('Config');
|
|
1556
|
+
}
|
|
1365
1557
|
/** Select an entity from the grouped picker */
|
|
1366
1558
|
SelectEntity(entityName) {
|
|
1367
1559
|
this.SuggestEntityName = entityName;
|
|
@@ -1382,16 +1574,77 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1382
1574
|
}))
|
|
1383
1575
|
.filter(group => group.Entities.length > 0);
|
|
1384
1576
|
}
|
|
1577
|
+
// Reset selection to first item when filter changes
|
|
1578
|
+
this.SelectedEntityIndex = this.FlatFilteredEntities.length > 0 ? 0 : -1;
|
|
1385
1579
|
this.cdr.detectChanges();
|
|
1386
1580
|
}
|
|
1581
|
+
/**
|
|
1582
|
+
* Get a flat list of all entities across groups (for keyboard navigation indexing)
|
|
1583
|
+
*/
|
|
1584
|
+
get FlatFilteredEntities() {
|
|
1585
|
+
return this.FilteredEntityGroups.flatMap(g => g.Entities);
|
|
1586
|
+
}
|
|
1587
|
+
/**
|
|
1588
|
+
* Handle keyboard events in the entity picker search input
|
|
1589
|
+
*/
|
|
1590
|
+
OnEntityPickerKeyDown(event) {
|
|
1591
|
+
const entities = this.FlatFilteredEntities;
|
|
1592
|
+
if (entities.length === 0)
|
|
1593
|
+
return;
|
|
1594
|
+
switch (event.key) {
|
|
1595
|
+
case 'ArrowDown':
|
|
1596
|
+
event.preventDefault();
|
|
1597
|
+
this.SelectedEntityIndex = Math.min(this.SelectedEntityIndex + 1, entities.length - 1);
|
|
1598
|
+
this.scrollSelectedEntityIntoView();
|
|
1599
|
+
this.cdr.detectChanges();
|
|
1600
|
+
break;
|
|
1601
|
+
case 'ArrowUp':
|
|
1602
|
+
event.preventDefault();
|
|
1603
|
+
this.SelectedEntityIndex = Math.max(this.SelectedEntityIndex - 1, 0);
|
|
1604
|
+
this.scrollSelectedEntityIntoView();
|
|
1605
|
+
this.cdr.detectChanges();
|
|
1606
|
+
break;
|
|
1607
|
+
case 'Enter':
|
|
1608
|
+
event.preventDefault();
|
|
1609
|
+
if (this.SelectedEntityIndex >= 0 && this.SelectedEntityIndex < entities.length) {
|
|
1610
|
+
this.SelectEntity(entities[this.SelectedEntityIndex].Name);
|
|
1611
|
+
}
|
|
1612
|
+
break;
|
|
1613
|
+
case 'Escape':
|
|
1614
|
+
event.preventDefault();
|
|
1615
|
+
this.ShowEntityPicker = false;
|
|
1616
|
+
this.cdr.detectChanges();
|
|
1617
|
+
break;
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1620
|
+
/**
|
|
1621
|
+
* Scroll the currently selected entity picker item into view
|
|
1622
|
+
*/
|
|
1623
|
+
scrollSelectedEntityIntoView() {
|
|
1624
|
+
setTimeout(() => {
|
|
1625
|
+
const selected = document.querySelector('.entity-picker-item-focused');
|
|
1626
|
+
if (selected) {
|
|
1627
|
+
selected.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
|
|
1628
|
+
}
|
|
1629
|
+
}, 0);
|
|
1630
|
+
}
|
|
1387
1631
|
/** Toggle entity picker visibility */
|
|
1388
1632
|
ToggleEntityPicker() {
|
|
1389
1633
|
this.ShowEntityPicker = !this.ShowEntityPicker;
|
|
1390
1634
|
if (this.ShowEntityPicker) {
|
|
1391
1635
|
this.FilteredEntityGroups = this.EntityGroups;
|
|
1392
1636
|
this.EntitySearchText = '';
|
|
1637
|
+
this.cdr.detectChanges();
|
|
1638
|
+
// Focus search input after the @if block renders — deferred past the click event
|
|
1639
|
+
setTimeout(() => {
|
|
1640
|
+
if (this.entitySearchInput?.nativeElement) {
|
|
1641
|
+
this.entitySearchInput.nativeElement.focus();
|
|
1642
|
+
}
|
|
1643
|
+
}, 0);
|
|
1644
|
+
}
|
|
1645
|
+
else {
|
|
1646
|
+
this.cdr.detectChanges();
|
|
1393
1647
|
}
|
|
1394
|
-
this.cdr.detectChanges();
|
|
1395
1648
|
}
|
|
1396
1649
|
/** Handle template edits from code editor */
|
|
1397
1650
|
OnTemplateChange(newValue) {
|
|
@@ -1542,36 +1795,48 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1542
1795
|
this.entityDocuments = engine.EntityDocuments;
|
|
1543
1796
|
this.vectorDatabases = AIEngineBase.Instance.VectorDatabases;
|
|
1544
1797
|
this.vectorIndexes = engine.VectorIndexes;
|
|
1545
|
-
//
|
|
1546
|
-
//
|
|
1547
|
-
//
|
|
1798
|
+
// Build per-EntityDocument aggregate stats (vector count + last synced).
|
|
1799
|
+
// Each query fetches only the most recent row (MaxRows: 1) and uses
|
|
1800
|
+
// TotalRowCount for the actual vector count — avoids loading all rows.
|
|
1801
|
+
// AI Models come from a different domain — fetched in the same batch.
|
|
1548
1802
|
const rv = new RunView();
|
|
1549
|
-
const
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1803
|
+
const erdQueries = this.entityDocuments.map(doc => ({
|
|
1804
|
+
EntityName: 'MJ: Entity Record Documents',
|
|
1805
|
+
ExtraFilter: `EntityDocumentID='${doc.ID}' AND VectorID IS NOT NULL`,
|
|
1806
|
+
ResultType: 'simple',
|
|
1807
|
+
Fields: ['__mj_UpdatedAt'],
|
|
1808
|
+
OrderBy: '__mj_UpdatedAt DESC',
|
|
1809
|
+
MaxRows: 1,
|
|
1810
|
+
}));
|
|
1811
|
+
const allQueries = [
|
|
1812
|
+
...erdQueries,
|
|
1813
|
+
{ EntityName: 'MJ: AI Models', ExtraFilter: '', ResultType: 'entity_object' }
|
|
1814
|
+
];
|
|
1815
|
+
const allResults = await rv.RunViews(allQueries);
|
|
1816
|
+
// Map results back to erdStats
|
|
1817
|
+
this.erdStats.clear();
|
|
1818
|
+
for (let i = 0; i < this.entityDocuments.length; i++) {
|
|
1819
|
+
const result = allResults[i];
|
|
1820
|
+
if (result.Success) {
|
|
1821
|
+
const rows = result.Results;
|
|
1822
|
+
const lastDate = rows.length > 0 ? new Date(rows[0].__mj_UpdatedAt) : null;
|
|
1823
|
+
this.erdStats.set(this.entityDocuments[i].ID, {
|
|
1824
|
+
vectorCount: result.TotalRowCount,
|
|
1825
|
+
lastSynced: lastDate,
|
|
1826
|
+
});
|
|
1560
1827
|
}
|
|
1561
|
-
]);
|
|
1562
|
-
if (erdResult.Success) {
|
|
1563
|
-
this.recordDocuments = erdResult.Results;
|
|
1564
1828
|
}
|
|
1829
|
+
const modelsResult = allResults[allResults.length - 1];
|
|
1565
1830
|
if (modelsResult.Success) {
|
|
1566
1831
|
this.aiModels = modelsResult.Results;
|
|
1567
1832
|
}
|
|
1568
1833
|
}
|
|
1569
1834
|
buildSyncRows() {
|
|
1570
1835
|
this.SyncRows = this.entityDocuments.map(doc => {
|
|
1571
|
-
const
|
|
1572
|
-
const vectorCount =
|
|
1573
|
-
const lastSynced =
|
|
1574
|
-
const status = this.computeSyncStatus(doc, vectorCount
|
|
1836
|
+
const stats = this.erdStats.get(doc.ID);
|
|
1837
|
+
const vectorCount = stats?.vectorCount ?? 0;
|
|
1838
|
+
const lastSynced = stats?.lastSynced ?? null;
|
|
1839
|
+
const status = this.computeSyncStatus(doc, vectorCount);
|
|
1575
1840
|
// Preserve progress info from any active sync
|
|
1576
1841
|
const existingRow = this.SyncRows.find(r => UUIDsEqual(r.EntityDocumentID, doc.ID));
|
|
1577
1842
|
return {
|
|
@@ -1586,44 +1851,32 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1586
1851
|
};
|
|
1587
1852
|
});
|
|
1588
1853
|
}
|
|
1589
|
-
|
|
1590
|
-
if (records.length === 0)
|
|
1591
|
-
return null;
|
|
1592
|
-
const dates = records
|
|
1593
|
-
.map(r => new Date(r.__mj_UpdatedAt))
|
|
1594
|
-
.filter(d => !isNaN(d.getTime()));
|
|
1595
|
-
if (dates.length === 0)
|
|
1596
|
-
return null;
|
|
1597
|
-
return new Date(Math.max(...dates.map(d => d.getTime())));
|
|
1598
|
-
}
|
|
1599
|
-
computeSyncStatus(doc, vectorCount, totalRecords) {
|
|
1854
|
+
computeSyncStatus(doc, vectorCount) {
|
|
1600
1855
|
if (this.SyncingIds.has(doc.ID)) {
|
|
1601
1856
|
return 'Syncing';
|
|
1602
1857
|
}
|
|
1603
1858
|
if (doc.Status === 'Inactive') {
|
|
1604
1859
|
return 'Pending';
|
|
1605
1860
|
}
|
|
1606
|
-
if (totalRecords === 0) {
|
|
1607
|
-
return 'Pending';
|
|
1608
|
-
}
|
|
1609
|
-
// If there are any vectors, consider it synced — partial syncs
|
|
1610
|
-
// still represent a successful state since the pipeline ran
|
|
1611
1861
|
if (vectorCount > 0) {
|
|
1612
1862
|
return 'Synced';
|
|
1613
1863
|
}
|
|
1614
|
-
return '
|
|
1864
|
+
return 'Pending';
|
|
1615
1865
|
}
|
|
1616
1866
|
buildKPICards() {
|
|
1617
|
-
|
|
1867
|
+
let totalVectors = 0;
|
|
1868
|
+
let latestSync = null;
|
|
1869
|
+
for (const stats of this.erdStats.values()) {
|
|
1870
|
+
totalVectors += stats.vectorCount;
|
|
1871
|
+
if (stats.lastSynced && (!latestSync || stats.lastSynced > latestSync)) {
|
|
1872
|
+
latestSync = stats.lastSynced;
|
|
1873
|
+
}
|
|
1874
|
+
}
|
|
1875
|
+
this.TotalVectors = totalVectors;
|
|
1618
1876
|
const entitiesSynced = new Set(this.entityDocuments
|
|
1619
1877
|
.filter(d => d.Status === 'Active')
|
|
1620
1878
|
.map(d => d.EntityID)).size;
|
|
1621
|
-
const
|
|
1622
|
-
.map(r => new Date(r.__mj_UpdatedAt))
|
|
1623
|
-
.filter(d => !isNaN(d.getTime()));
|
|
1624
|
-
const lastSyncDate = allDates.length > 0
|
|
1625
|
-
? new Date(Math.max(...allDates.map(d => d.getTime())))
|
|
1626
|
-
: null;
|
|
1879
|
+
const lastSyncDate = latestSync;
|
|
1627
1880
|
this.KPICards = [
|
|
1628
1881
|
{
|
|
1629
1882
|
title: 'Total Vectors',
|
|
@@ -1668,7 +1921,7 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1668
1921
|
const db = this.vectorDatabases[0];
|
|
1669
1922
|
this.VectorDBName = db.Name;
|
|
1670
1923
|
// Determine health based on whether we have records with vectors
|
|
1671
|
-
const hasVectors = this.
|
|
1924
|
+
const hasVectors = this.TotalVectors > 0;
|
|
1672
1925
|
this.VectorDBStatus = hasVectors ? 'Healthy' : 'Degraded';
|
|
1673
1926
|
}
|
|
1674
1927
|
else {
|
|
@@ -1690,10 +1943,9 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1690
1943
|
}
|
|
1691
1944
|
}
|
|
1692
1945
|
buildStorageUsage() {
|
|
1693
|
-
//
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
this.StorageUsagePercent = total > 0 ? Math.round((vectorized / total) * 100) : 0;
|
|
1946
|
+
// All records in erdStats already have vectors (query filters VectorID IS NOT NULL),
|
|
1947
|
+
// so coverage is 100% if any exist.
|
|
1948
|
+
this.StorageUsagePercent = this.TotalVectors > 0 ? 100 : 0;
|
|
1697
1949
|
}
|
|
1698
1950
|
/** Check if vector DB and embedding model are configured, populate selection lists */
|
|
1699
1951
|
checkPrerequisites() {
|
|
@@ -1858,15 +2110,19 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1858
2110
|
const rv = new RunView();
|
|
1859
2111
|
const result = await rv.RunView({
|
|
1860
2112
|
EntityName: 'MJ: Entity Record Documents',
|
|
1861
|
-
ExtraFilter: `EntityDocumentID='${entityDocumentId}'`,
|
|
1862
|
-
|
|
2113
|
+
ExtraFilter: `EntityDocumentID='${entityDocumentId}' AND VectorID IS NOT NULL`,
|
|
2114
|
+
Fields: ['__mj_UpdatedAt'],
|
|
2115
|
+
OrderBy: '__mj_UpdatedAt DESC',
|
|
2116
|
+
ResultType: 'simple',
|
|
2117
|
+
MaxRows: 1
|
|
1863
2118
|
});
|
|
1864
2119
|
if (result.Success) {
|
|
1865
|
-
|
|
1866
|
-
row.
|
|
1867
|
-
row.LastSynced = this.computeLastSynced(docs);
|
|
2120
|
+
row.VectorCount = result.TotalRowCount;
|
|
2121
|
+
row.LastSynced = result.Results.length > 0 ? new Date(result.Results[0].__mj_UpdatedAt) : null;
|
|
1868
2122
|
row.Status = row.VectorCount > 0 ? 'Synced' : 'Pending';
|
|
1869
2123
|
row.PercentComplete = 100;
|
|
2124
|
+
this.erdStats.set(entityDocumentId, { vectorCount: row.VectorCount, lastSynced: row.LastSynced });
|
|
2125
|
+
this.buildKPICards();
|
|
1870
2126
|
this.cdr.detectChanges();
|
|
1871
2127
|
}
|
|
1872
2128
|
}
|
|
@@ -1946,11 +2202,16 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1946
2202
|
};
|
|
1947
2203
|
}
|
|
1948
2204
|
static ɵfac = /*@__PURE__*/ (() => { let ɵVectorManagementResourceComponent_BaseFactory; return function VectorManagementResourceComponent_Factory(__ngFactoryType__) { return (ɵVectorManagementResourceComponent_BaseFactory || (ɵVectorManagementResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(VectorManagementResourceComponent)))(__ngFactoryType__ || VectorManagementResourceComponent); }; })();
|
|
1949
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VectorManagementResourceComponent, selectors: [["app-vector-management-resource"]],
|
|
1950
|
-
i0.ɵɵ
|
|
2205
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VectorManagementResourceComponent, selectors: [["app-vector-management-resource"]], viewQuery: function VectorManagementResourceComponent_Query(rf, ctx) { if (rf & 1) {
|
|
2206
|
+
i0.ɵɵviewQuery(_c0, 5);
|
|
2207
|
+
} if (rf & 2) {
|
|
2208
|
+
let _t;
|
|
2209
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.entitySearchInput = _t.first);
|
|
2210
|
+
} }, inputs: { EmbeddedMode: "EmbeddedMode" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [["entitySearchInput", ""], [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"], [1, "edit-template-header"], ["title", "Regenerate template using AI", 1, "edit-regenerate-btn", 3, "click", "disabled"], [1, "template-editor-wrapper"], ["language", "markdown", 3, "change", "value", "readonly", "lineWrapping"], ["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"], [1, "result-tags"], [1, "result-tag"], ["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, "no-index-warning-dialog", 3, "click"], [1, "no-index-warning-icon"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "no-index-warning-title"], [1, "no-index-warning-message"], [1, "no-index-warning-actions"], [1, "fa-solid", "fa-gear"], [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-dropdown", 3, "mousedown"], [1, "entity-picker-search"], ["type", "text", "placeholder", "Filter entities...", 1, "entity-picker-search-input", 3, "ngModelChange", "input", "keydown", "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", "entity-picker-item-focused"], [1, "entity-picker-item", 3, "click"], [1, "fa-solid", "fa-circle-exclamation"], [1, "result-section"], [1, "result-heading"], [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) {
|
|
2211
|
+
i0.ɵɵconditionalCreate(0, VectorManagementResourceComponent_Conditional_0_Template, 2, 0, "div", 1)(1, VectorManagementResourceComponent_Conditional_1_Template, 59, 18);
|
|
1951
2212
|
} if (rf & 2) {
|
|
1952
2213
|
i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
|
|
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}"] });
|
|
2214
|
+
} }, 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: 100000;\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-item-focused[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover);\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: -2px;\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.edit-template-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.edit-regenerate-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.edit-regenerate-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.edit-regenerate-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.no-index-warning-dialog[_ngcontent-%COMP%] {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px color-mix(in srgb, var(--mj-text-primary) 20%, transparent);\n padding: 32px;\n text-align: center;\n}\n\n.no-index-warning-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n margin: 0 auto 16px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n}\n\n.no-index-warning-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-warning);\n}\n\n.no-index-warning-title[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.no-index-warning-message[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n font-size: 14px;\n line-height: 1.5;\n color: var(--mj-text-secondary);\n}\n\n.no-index-warning-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n justify-content: center;\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}"] });
|
|
1954
2215
|
};
|
|
1955
2216
|
VectorManagementResourceComponent = __decorate([
|
|
1956
2217
|
RegisterClass(BaseResourceComponent, 'VectorManagementResource')
|
|
@@ -1958,11 +2219,14 @@ VectorManagementResourceComponent = __decorate([
|
|
|
1958
2219
|
export { VectorManagementResourceComponent };
|
|
1959
2220
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VectorManagementResourceComponent, [{
|
|
1960
2221
|
type: Component,
|
|
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"] }]
|
|
2222
|
+
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\n <!-- Template Section -->\n <div class=\"suggest-field\">\n <div class=\"edit-template-header\">\n <label class=\"suggest-label\">Template</label>\n <button class=\"edit-regenerate-btn\"\n [disabled]=\"IsEditRegenerating\"\n (click)=\"RegenerateTemplate()\"\n title=\"Regenerate template using AI\">\n @if (IsEditRegenerating) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Regenerating...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Regenerate with AI\n }\n </button>\n </div>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditDocTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnEditTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n\n <!-- Selected Fields (parsed from template) -->\n @if (EditDocSelectedFields.length > 0) {\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Selected Fields</label>\n <div class=\"result-tags\">\n @for (field of EditDocSelectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n }\n\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 <!-- No Vector Index Warning Dialog -->\n @if (ShowNoIndexWarning) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseNoIndexWarning()\">\n <div class=\"no-index-warning-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"no-index-warning-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h3 class=\"no-index-warning-title\">Vector Index Required</h3>\n <p class=\"no-index-warning-message\">\n You need to create at least one vector database and index before creating entity documents.\n Go to the Configuration section to set up a vector database and create an index.\n </p>\n <div class=\"no-index-warning-actions\">\n <button class=\"suggest-submit-btn\" (click)=\"GoToConfiguration()\">\n <i class=\"fa-solid fa-gear\"></i> Go to Configuration\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseNoIndexWarning()\">\n Close\n </button>\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\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"entity-picker-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input #entitySearchInput\n type=\"text\"\n class=\"entity-picker-search-input\"\n placeholder=\"Filter entities...\"\n [(ngModel)]=\"EntitySearchText\"\n (input)=\"FilterEntities()\"\n (keydown)=\"OnEntityPickerKeyDown($event)\" />\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 [class.entity-picker-item-focused]=\"FlatFilteredEntities[SelectedEntityIndex]?.ID === entity.ID\"\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: 100000;\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-item-focused {\n background: var(--mj-bg-surface-hover);\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: -2px;\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/* --- Edit Panel Template Header --- */\n.edit-template-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.edit-regenerate-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.edit-regenerate-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.edit-regenerate-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* --- No Vector Index Warning Dialog --- */\n.no-index-warning-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px color-mix(in srgb, var(--mj-text-primary) 20%, transparent);\n padding: 32px;\n text-align: center;\n}\n\n.no-index-warning-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n margin: 0 auto 16px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n}\n\n.no-index-warning-icon i {\n font-size: 24px;\n color: var(--mj-status-warning);\n}\n\n.no-index-warning-title {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.no-index-warning-message {\n margin: 0 0 24px 0;\n font-size: 14px;\n line-height: 1.5;\n color: var(--mj-text-secondary);\n}\n\n.no-index-warning-actions {\n display: flex;\n gap: 8px;\n justify-content: center;\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"] }]
|
|
1962
2223
|
}], null, { EmbeddedMode: [{
|
|
1963
2224
|
type: Input
|
|
2225
|
+
}], entitySearchInput: [{
|
|
2226
|
+
type: ViewChild,
|
|
2227
|
+
args: ['entitySearchInput']
|
|
1964
2228
|
}] }); })();
|
|
1965
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(VectorManagementResourceComponent, { className: "VectorManagementResourceComponent", filePath: "src/AI/components/vectors/vector-management-resource.component.ts", lineNumber:
|
|
2229
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(VectorManagementResourceComponent, { className: "VectorManagementResourceComponent", filePath: "src/AI/components/vectors/vector-management-resource.component.ts", lineNumber: 71 }); })();
|
|
1966
2230
|
export function LoadVectorManagementResource() {
|
|
1967
2231
|
// Prevents tree-shaking
|
|
1968
2232
|
}
|