@memberjunction/ng-dashboards 5.23.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 +717 -8
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +7166 -1889
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +50 -4
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +759 -491
- 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 +62 -7
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +825 -359
- 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 +470 -437
- 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 +2 -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 +3 -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 +2 -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 +3 -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 +3 -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 +3 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +412 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4267 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +39 -4
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +187 -13
- 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 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +329 -224
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +76 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +602 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/index.d.ts +2 -1
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +2 -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/__tests__/analytics-resource.test.d.ts +2 -0
- package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
- package/dist/__tests__/analytics-resource.test.js +181 -0
- package/dist/__tests__/analytics-resource.test.js.map +1 -0
- package/dist/__tests__/scheduling.test.d.ts +2 -0
- package/dist/__tests__/scheduling.test.d.ts.map +1 -0
- package/dist/__tests__/scheduling.test.js +205 -0
- package/dist/__tests__/scheduling.test.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +22 -18
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +29 -10
- 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 +2 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -1
- package/dist/public-api.js.map +1 -1
- package/dist/shared/entity-field-display.d.ts +44 -0
- package/dist/shared/entity-field-display.d.ts.map +1 -0
- package/dist/shared/entity-field-display.js +118 -0
- package/dist/shared/entity-field-display.js.map +1 -0
- package/package.json +47 -46
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +0 -85
- 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 -461
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +0 -1
|
@@ -12,42 +12,44 @@ 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';
|
|
19
19
|
import { KnowledgeHubMetadataEngine } from '@memberjunction/core-entities';
|
|
20
20
|
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
21
|
-
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
21
|
+
import { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';
|
|
22
22
|
import { GraphQLAIClient } from '@memberjunction/graphql-dataprovider';
|
|
23
23
|
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
24
24
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
25
|
+
import { CronToHumanReadable } from '../autotagging/autotagging-pipeline-resource.component';
|
|
25
26
|
import * as i0 from "@angular/core";
|
|
26
27
|
import * as i1 from "@angular/forms";
|
|
27
28
|
import * as i2 from "@memberjunction/ng-code-editor";
|
|
28
29
|
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
29
30
|
import * as i4 from "../widgets/kpi-card.component";
|
|
30
31
|
import * as i5 from "@angular/common";
|
|
32
|
+
const _c0 = ["entitySearchInput"];
|
|
31
33
|
const _forTrack0 = ($index, $item) => $item.title;
|
|
32
34
|
const _forTrack1 = ($index, $item) => $item.EntityDocumentID;
|
|
33
35
|
const _forTrack2 = ($index, $item) => $item.ID;
|
|
34
36
|
const _forTrack3 = ($index, $item) => $item.SchemaName;
|
|
35
37
|
const _forTrack4 = ($index, $item) => $item.name;
|
|
36
38
|
function VectorManagementResourceComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
37
|
-
i0.ɵɵelementStart(0, "div",
|
|
38
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
39
|
+
i0.ɵɵelementStart(0, "div", 1);
|
|
40
|
+
i0.ɵɵelement(1, "mj-loading", 2);
|
|
39
41
|
i0.ɵɵelementEnd();
|
|
40
42
|
} }
|
|
41
43
|
function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
42
44
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
43
|
-
i0.ɵɵelementStart(0, "div",
|
|
45
|
+
i0.ɵɵelementStart(0, "div", 4)(1, "button", 40);
|
|
44
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"); });
|
|
45
|
-
i0.ɵɵelement(2, "i",
|
|
47
|
+
i0.ɵɵelement(2, "i", 41);
|
|
46
48
|
i0.ɵɵtext(3, " Index View ");
|
|
47
49
|
i0.ɵɵelementEnd();
|
|
48
|
-
i0.ɵɵelementStart(4, "button",
|
|
50
|
+
i0.ɵɵelementStart(4, "button", 40);
|
|
49
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"); });
|
|
50
|
-
i0.ɵɵelement(5, "i",
|
|
52
|
+
i0.ɵɵelement(5, "i", 42);
|
|
51
53
|
i0.ɵɵtext(6, " Operations ");
|
|
52
54
|
i0.ɵɵelementEnd()();
|
|
53
55
|
} if (rf & 2) {
|
|
@@ -58,14 +60,14 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template(
|
|
|
58
60
|
i0.ɵɵclassProp("view-mode-btn-active", ctx_r2.ViewMode === "operations");
|
|
59
61
|
} }
|
|
60
62
|
function VectorManagementResourceComponent_Conditional_1_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
61
|
-
i0.ɵɵelement(0, "app-kpi-card",
|
|
63
|
+
i0.ɵɵelement(0, "app-kpi-card", 6);
|
|
62
64
|
} if (rf & 2) {
|
|
63
65
|
const card_r4 = ctx.$implicit;
|
|
64
66
|
i0.ɵɵproperty("data", card_r4);
|
|
65
67
|
} }
|
|
66
68
|
function VectorManagementResourceComponent_Conditional_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
67
|
-
i0.ɵɵelementStart(0, "div",
|
|
68
|
-
i0.ɵɵelement(1, "i",
|
|
69
|
+
i0.ɵɵelementStart(0, "div", 18);
|
|
70
|
+
i0.ɵɵelement(1, "i", 43);
|
|
69
71
|
i0.ɵɵelementStart(2, "p");
|
|
70
72
|
i0.ɵɵtext(3, "No entity documents configured for vectorization.");
|
|
71
73
|
i0.ɵɵelementEnd()();
|
|
@@ -83,7 +85,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_C
|
|
|
83
85
|
i0.ɵɵtextInterpolate1(" ", row_r6.Status, " ");
|
|
84
86
|
} }
|
|
85
87
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
86
|
-
i0.ɵɵelement(0, "i",
|
|
88
|
+
i0.ɵɵelement(0, "i", 58);
|
|
87
89
|
i0.ɵɵtext(1);
|
|
88
90
|
} if (rf & 2) {
|
|
89
91
|
const row_r6 = i0.ɵɵnextContext().$implicit;
|
|
@@ -91,35 +93,39 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_C
|
|
|
91
93
|
i0.ɵɵtextInterpolate1(" ", row_r6.PercentComplete > 0 ? row_r6.PercentComplete + "%" : "Sync", " ");
|
|
92
94
|
} }
|
|
93
95
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
94
|
-
i0.ɵɵelement(0, "i",
|
|
96
|
+
i0.ɵɵelement(0, "i", 59);
|
|
95
97
|
i0.ɵɵtext(1, " Sync ");
|
|
96
98
|
} }
|
|
97
99
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
98
100
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
99
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
101
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 47);
|
|
100
102
|
i0.ɵɵtext(2);
|
|
101
103
|
i0.ɵɵelementEnd();
|
|
102
|
-
i0.ɵɵelementStart(3, "td",
|
|
104
|
+
i0.ɵɵelementStart(3, "td", 48);
|
|
103
105
|
i0.ɵɵtext(4);
|
|
104
106
|
i0.ɵɵelementEnd();
|
|
105
|
-
i0.ɵɵelementStart(5, "td",
|
|
107
|
+
i0.ɵɵelementStart(5, "td", 49);
|
|
106
108
|
i0.ɵɵtext(6);
|
|
107
109
|
i0.ɵɵpipe(7, "number");
|
|
108
110
|
i0.ɵɵelementEnd();
|
|
109
|
-
i0.ɵɵelementStart(8, "td",
|
|
111
|
+
i0.ɵɵelementStart(8, "td", 50);
|
|
110
112
|
i0.ɵɵtext(9);
|
|
111
113
|
i0.ɵɵelementEnd();
|
|
112
|
-
i0.ɵɵelementStart(10, "td")(11, "span",
|
|
114
|
+
i0.ɵɵelementStart(10, "td")(11, "span", 51);
|
|
113
115
|
i0.ɵɵelement(12, "i");
|
|
114
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);
|
|
115
117
|
i0.ɵɵelementEnd()();
|
|
116
|
-
i0.ɵɵelementStart(15, "td",
|
|
118
|
+
i0.ɵɵelementStart(15, "td", 52)(16, "button", 53);
|
|
117
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)); });
|
|
118
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);
|
|
119
121
|
i0.ɵɵelementEnd();
|
|
120
|
-
i0.ɵɵelementStart(19, "button",
|
|
121
|
-
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_19_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.
|
|
122
|
-
i0.ɵɵelement(20, "i",
|
|
122
|
+
i0.ɵɵelementStart(19, "button", 54);
|
|
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)); });
|
|
124
|
+
i0.ɵɵelement(20, "i", 55);
|
|
125
|
+
i0.ɵɵelementEnd();
|
|
126
|
+
i0.ɵɵelementStart(21, "button", 56);
|
|
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)); });
|
|
128
|
+
i0.ɵɵelement(22, "i", 57);
|
|
123
129
|
i0.ɵɵelementEnd()()();
|
|
124
130
|
} if (rf & 2) {
|
|
125
131
|
const row_r6 = ctx.$implicit;
|
|
@@ -144,13 +150,13 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_T
|
|
|
144
150
|
i0.ɵɵconditional(ctx_r2.SyncingIds.has(row_r6.EntityDocumentID) ? 17 : 18);
|
|
145
151
|
} }
|
|
146
152
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
147
|
-
i0.ɵɵelementStart(0, "div",
|
|
153
|
+
i0.ɵɵelementStart(0, "div", 19)(1, "table", 44)(2, "thead")(3, "tr")(4, "th");
|
|
148
154
|
i0.ɵɵtext(5, "Entity");
|
|
149
155
|
i0.ɵɵelementEnd();
|
|
150
156
|
i0.ɵɵelementStart(6, "th");
|
|
151
157
|
i0.ɵɵtext(7, "Document");
|
|
152
158
|
i0.ɵɵelementEnd();
|
|
153
|
-
i0.ɵɵelementStart(8, "th",
|
|
159
|
+
i0.ɵɵelementStart(8, "th", 45);
|
|
154
160
|
i0.ɵɵtext(9, "Vectors");
|
|
155
161
|
i0.ɵɵelementEnd();
|
|
156
162
|
i0.ɵɵelementStart(10, "th");
|
|
@@ -159,11 +165,11 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template
|
|
|
159
165
|
i0.ɵɵelementStart(12, "th");
|
|
160
166
|
i0.ɵɵtext(13, "Status");
|
|
161
167
|
i0.ɵɵelementEnd();
|
|
162
|
-
i0.ɵɵelementStart(14, "th",
|
|
168
|
+
i0.ɵɵelementStart(14, "th", 46);
|
|
163
169
|
i0.ɵɵtext(15, "Actions");
|
|
164
170
|
i0.ɵɵelementEnd()()();
|
|
165
171
|
i0.ɵɵelementStart(16, "tbody");
|
|
166
|
-
i0.ɵɵrepeaterCreate(17, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template,
|
|
172
|
+
i0.ɵɵrepeaterCreate(17, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template, 23, 13, "tr", null, _forTrack1);
|
|
167
173
|
i0.ɵɵelementEnd()()();
|
|
168
174
|
} if (rf & 2) {
|
|
169
175
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -171,10 +177,10 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template
|
|
|
171
177
|
i0.ɵɵrepeater(ctx_r2.SyncRows);
|
|
172
178
|
} }
|
|
173
179
|
function VectorManagementResourceComponent_Conditional_1_Conditional_42_Template(rf, ctx) { if (rf & 1) {
|
|
174
|
-
i0.ɵɵelementStart(0, "div",
|
|
180
|
+
i0.ɵɵelementStart(0, "div", 30)(1, "span", 31);
|
|
175
181
|
i0.ɵɵtext(2, "Dimensions");
|
|
176
182
|
i0.ɵɵelementEnd();
|
|
177
|
-
i0.ɵɵelementStart(3, "span",
|
|
183
|
+
i0.ɵɵelementStart(3, "span", 32);
|
|
178
184
|
i0.ɵɵtext(4);
|
|
179
185
|
i0.ɵɵpipe(5, "number");
|
|
180
186
|
i0.ɵɵelementEnd()();
|
|
@@ -183,44 +189,73 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_42_Template
|
|
|
183
189
|
i0.ɵɵadvance(4);
|
|
184
190
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 1, ctx_r2.EmbeddingModel.Dimensions));
|
|
185
191
|
} }
|
|
186
|
-
function
|
|
187
|
-
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);
|
|
188
202
|
i0.ɵɵtext(1);
|
|
189
203
|
i0.ɵɵelementEnd();
|
|
190
204
|
} if (rf & 2) {
|
|
191
|
-
const
|
|
192
|
-
i0.ɵɵproperty("value", model_r8.ID);
|
|
205
|
+
const field_r8 = ctx.$implicit;
|
|
193
206
|
i0.ɵɵadvance();
|
|
194
|
-
i0.ɵɵtextInterpolate(
|
|
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);
|
|
195
220
|
} }
|
|
196
|
-
function
|
|
197
|
-
i0.ɵɵelementStart(0, "option",
|
|
221
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_34_Template(rf, ctx) { if (rf & 1) {
|
|
222
|
+
i0.ɵɵelementStart(0, "option", 77);
|
|
198
223
|
i0.ɵɵtext(1);
|
|
199
224
|
i0.ɵɵelementEnd();
|
|
200
225
|
} if (rf & 2) {
|
|
201
|
-
const
|
|
202
|
-
i0.ɵɵproperty("value",
|
|
226
|
+
const model_r9 = ctx.$implicit;
|
|
227
|
+
i0.ɵɵproperty("value", model_r9.ID);
|
|
203
228
|
i0.ɵɵadvance();
|
|
204
|
-
i0.ɵɵtextInterpolate(
|
|
229
|
+
i0.ɵɵtextInterpolate(model_r9.Name);
|
|
205
230
|
} }
|
|
206
|
-
function
|
|
207
|
-
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);
|
|
208
233
|
i0.ɵɵtext(1);
|
|
209
234
|
i0.ɵɵelementEnd();
|
|
210
235
|
} if (rf & 2) {
|
|
211
|
-
const
|
|
212
|
-
i0.ɵɵproperty("value",
|
|
236
|
+
const db_r10 = ctx.$implicit;
|
|
237
|
+
i0.ɵɵproperty("value", db_r10.ID);
|
|
213
238
|
i0.ɵɵadvance();
|
|
214
|
-
i0.ɵɵtextInterpolate(
|
|
239
|
+
i0.ɵɵtextInterpolate(db_r10.Name);
|
|
215
240
|
} }
|
|
216
|
-
function
|
|
217
|
-
|
|
218
|
-
i0.ɵɵ
|
|
219
|
-
i0.ɵɵ
|
|
220
|
-
|
|
241
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
242
|
+
i0.ɵɵelementStart(0, "option", 77);
|
|
243
|
+
i0.ɵɵtext(1);
|
|
244
|
+
i0.ɵɵelementEnd();
|
|
245
|
+
} if (rf & 2) {
|
|
246
|
+
const idx_r12 = ctx.$implicit;
|
|
247
|
+
i0.ɵɵproperty("value", idx_r12.ID);
|
|
248
|
+
i0.ɵɵadvance();
|
|
249
|
+
i0.ɵɵtextInterpolate(idx_r12.Name);
|
|
250
|
+
} }
|
|
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);
|
|
221
256
|
i0.ɵɵtext(2, "Auto (create/find matching index)");
|
|
222
257
|
i0.ɵɵelementEnd();
|
|
223
|
-
i0.ɵɵrepeaterCreate(3,
|
|
258
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_For_4_Template, 2, 2, "option", 77, _forTrack2);
|
|
224
259
|
i0.ɵɵelementEnd();
|
|
225
260
|
} if (rf & 2) {
|
|
226
261
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -228,94 +263,113 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditio
|
|
|
228
263
|
i0.ɵɵadvance(3);
|
|
229
264
|
i0.ɵɵrepeater(ctx_r2.EditFilteredIndexes);
|
|
230
265
|
} }
|
|
231
|
-
function
|
|
232
|
-
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);
|
|
233
268
|
i0.ɵɵtext(1, " No indexes for this database \u2014 one will be created automatically on sync ");
|
|
234
269
|
i0.ɵɵelementEnd();
|
|
235
270
|
} }
|
|
236
|
-
function
|
|
237
|
-
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);
|
|
238
273
|
} }
|
|
239
|
-
function
|
|
240
|
-
const
|
|
241
|
-
i0.ɵɵelementStart(0, "button",
|
|
242
|
-
i0.ɵɵlistener("click", function
|
|
243
|
-
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);
|
|
244
279
|
i0.ɵɵtext(2, " Save Changes ");
|
|
245
280
|
i0.ɵɵelementEnd();
|
|
246
|
-
i0.ɵɵelementStart(3, "button",
|
|
247
|
-
i0.ɵɵlistener("click", function
|
|
248
|
-
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);
|
|
249
284
|
i0.ɵɵtext(5, " Delete ");
|
|
250
285
|
i0.ɵɵelementEnd();
|
|
251
|
-
i0.ɵɵelementStart(6, "button",
|
|
252
|
-
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()); });
|
|
253
288
|
i0.ɵɵtext(7, " Cancel ");
|
|
254
289
|
i0.ɵɵelementEnd();
|
|
255
290
|
} }
|
|
256
291
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template(rf, ctx) { if (rf & 1) {
|
|
257
292
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
258
|
-
i0.ɵɵelementStart(0, "div",
|
|
293
|
+
i0.ɵɵelementStart(0, "div", 60);
|
|
259
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()); });
|
|
260
|
-
i0.ɵɵelementStart(1, "div",
|
|
295
|
+
i0.ɵɵelementStart(1, "div", 61);
|
|
261
296
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r7); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
262
|
-
i0.ɵɵelementStart(2, "div",
|
|
263
|
-
i0.ɵɵelement(4, "i",
|
|
297
|
+
i0.ɵɵelementStart(2, "div", 62)(3, "h3", 63);
|
|
298
|
+
i0.ɵɵelement(4, "i", 57);
|
|
264
299
|
i0.ɵɵtext(5, " Edit Entity Document ");
|
|
265
300
|
i0.ɵɵelementEnd();
|
|
266
|
-
i0.ɵɵelementStart(6, "button",
|
|
301
|
+
i0.ɵɵelementStart(6, "button", 64);
|
|
267
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()); });
|
|
268
|
-
i0.ɵɵelement(7, "i",
|
|
303
|
+
i0.ɵɵelement(7, "i", 65);
|
|
269
304
|
i0.ɵɵelementEnd()();
|
|
270
|
-
i0.ɵɵelementStart(8, "div",
|
|
305
|
+
i0.ɵɵelementStart(8, "div", 66)(9, "div", 67)(10, "div", 68)(11, "label", 69);
|
|
271
306
|
i0.ɵɵtext(12, "Entity");
|
|
272
307
|
i0.ɵɵelementEnd();
|
|
273
|
-
i0.ɵɵelementStart(13, "span",
|
|
308
|
+
i0.ɵɵelementStart(13, "span", 70);
|
|
274
309
|
i0.ɵɵtext(14);
|
|
275
310
|
i0.ɵɵelementEnd()();
|
|
276
|
-
i0.ɵɵelementStart(15, "div",
|
|
277
|
-
i0.ɵɵtext(
|
|
311
|
+
i0.ɵɵelementStart(15, "div", 68)(16, "div", 71)(17, "label", 69);
|
|
312
|
+
i0.ɵɵtext(18, "Template");
|
|
278
313
|
i0.ɵɵelementEnd();
|
|
279
|
-
i0.ɵɵelementStart(
|
|
280
|
-
i0.ɵɵ
|
|
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);
|
|
281
317
|
i0.ɵɵelementEnd()();
|
|
282
|
-
i0.ɵɵelementStart(
|
|
283
|
-
i0.ɵɵ
|
|
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");
|
|
284
324
|
i0.ɵɵelementEnd();
|
|
285
|
-
i0.ɵɵelementStart(
|
|
286
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
287
|
-
i0.ɵɵrepeaterCreate(23, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_Template, 2, 2, "option", 70, _forTrack2);
|
|
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); });
|
|
288
327
|
i0.ɵɵelementEnd()();
|
|
289
|
-
i0.ɵɵelementStart(
|
|
290
|
-
i0.ɵɵtext(
|
|
328
|
+
i0.ɵɵelementStart(29, "div", 68)(30, "label", 69);
|
|
329
|
+
i0.ɵɵtext(31, "Embedding Model");
|
|
291
330
|
i0.ɵɵelementEnd();
|
|
292
|
-
i0.ɵɵelementStart(
|
|
293
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
294
|
-
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);
|
|
295
334
|
i0.ɵɵelementEnd()();
|
|
296
|
-
i0.ɵɵelementStart(
|
|
297
|
-
i0.ɵɵtext(
|
|
335
|
+
i0.ɵɵelementStart(35, "div", 68)(36, "label", 69);
|
|
336
|
+
i0.ɵɵtext(37, "Vector Database");
|
|
298
337
|
i0.ɵɵelementEnd();
|
|
299
|
-
i0.ɵɵ
|
|
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);
|
|
341
|
+
i0.ɵɵelementEnd()();
|
|
342
|
+
i0.ɵɵelementStart(41, "div", 68)(42, "label", 69);
|
|
343
|
+
i0.ɵɵtext(43, "Vector Index");
|
|
344
|
+
i0.ɵɵelementEnd();
|
|
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);
|
|
300
346
|
i0.ɵɵelementEnd();
|
|
301
|
-
i0.ɵɵelementStart(
|
|
302
|
-
i0.ɵɵtext(
|
|
347
|
+
i0.ɵɵelementStart(46, "div", 68)(47, "label", 69);
|
|
348
|
+
i0.ɵɵtext(48, "Status");
|
|
303
349
|
i0.ɵɵelementEnd();
|
|
304
|
-
i0.ɵɵelementStart(
|
|
305
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
306
|
-
i0.ɵɵelementStart(
|
|
307
|
-
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");
|
|
308
354
|
i0.ɵɵelementEnd();
|
|
309
|
-
i0.ɵɵelementStart(
|
|
310
|
-
i0.ɵɵtext(
|
|
355
|
+
i0.ɵɵelementStart(52, "option", 81);
|
|
356
|
+
i0.ɵɵtext(53, "Inactive");
|
|
311
357
|
i0.ɵɵelementEnd()()();
|
|
312
|
-
i0.ɵɵelementStart(
|
|
313
|
-
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);
|
|
314
360
|
i0.ɵɵelementEnd()()()()();
|
|
315
361
|
} if (rf & 2) {
|
|
316
362
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
317
363
|
i0.ɵɵadvance(14);
|
|
318
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);
|
|
319
373
|
i0.ɵɵadvance(4);
|
|
320
374
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.EditDocName);
|
|
321
375
|
i0.ɵɵadvance(4);
|
|
@@ -327,15 +381,113 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template
|
|
|
327
381
|
i0.ɵɵadvance();
|
|
328
382
|
i0.ɵɵrepeater(ctx_r2.vectorDatabases);
|
|
329
383
|
i0.ɵɵadvance(5);
|
|
330
|
-
i0.ɵɵconditional(ctx_r2.EditFilteredIndexes.length > 0 ?
|
|
384
|
+
i0.ɵɵconditional(ctx_r2.EditFilteredIndexes.length > 0 ? 44 : 45);
|
|
331
385
|
i0.ɵɵadvance(5);
|
|
332
386
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.EditDocStatus);
|
|
333
387
|
i0.ɵɵadvance(6);
|
|
334
|
-
i0.ɵɵconditional(ctx_r2.IsEditSaving || ctx_r2.IsEditDeleting ?
|
|
388
|
+
i0.ɵɵconditional(ctx_r2.IsEditSaving || ctx_r2.IsEditDeleting ? 55 : 56);
|
|
389
|
+
} }
|
|
390
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
391
|
+
i0.ɵɵelement(0, "mj-loading", 83);
|
|
392
|
+
} }
|
|
393
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
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);
|
|
398
|
+
i0.ɵɵtext(2, " Create Schedule ");
|
|
399
|
+
i0.ɵɵelementEnd();
|
|
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()); });
|
|
402
|
+
i0.ɵɵtext(4, " Cancel ");
|
|
403
|
+
i0.ɵɵelementEnd();
|
|
335
404
|
} }
|
|
336
|
-
function
|
|
337
|
-
i0.ɵɵ
|
|
338
|
-
i0.ɵɵelementStart(
|
|
405
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template(rf, ctx) { if (rf & 1) {
|
|
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);
|
|
413
|
+
i0.ɵɵtext(5, " Schedule Vector Sync ");
|
|
414
|
+
i0.ɵɵelementEnd();
|
|
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);
|
|
418
|
+
i0.ɵɵelementEnd()();
|
|
419
|
+
i0.ɵɵelementStart(8, "div", 66)(9, "div", 67)(10, "div", 68)(11, "label", 69);
|
|
420
|
+
i0.ɵɵtext(12, "Entity Document");
|
|
421
|
+
i0.ɵɵelementEnd();
|
|
422
|
+
i0.ɵɵelementStart(13, "span", 70);
|
|
423
|
+
i0.ɵɵtext(14);
|
|
424
|
+
i0.ɵɵelementEnd()();
|
|
425
|
+
i0.ɵɵelementStart(15, "div", 68)(16, "label", 69);
|
|
426
|
+
i0.ɵɵtext(17, "Action");
|
|
427
|
+
i0.ɵɵelementEnd();
|
|
428
|
+
i0.ɵɵelementStart(18, "span", 70);
|
|
429
|
+
i0.ɵɵtext(19, "__VectorizeEntity");
|
|
430
|
+
i0.ɵɵelementEnd()();
|
|
431
|
+
i0.ɵɵelementStart(20, "div", 68)(21, "label", 69);
|
|
432
|
+
i0.ɵɵtext(22, "Cron Expression");
|
|
433
|
+
i0.ɵɵelementEnd();
|
|
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); });
|
|
436
|
+
i0.ɵɵelementEnd();
|
|
437
|
+
i0.ɵɵelementStart(24, "div", 94);
|
|
438
|
+
i0.ɵɵelement(25, "i", 95);
|
|
439
|
+
i0.ɵɵtext(26);
|
|
440
|
+
i0.ɵɵelementEnd()();
|
|
441
|
+
i0.ɵɵelementStart(27, "div", 96)(28, "label", 69);
|
|
442
|
+
i0.ɵɵtext(29, "Enabled");
|
|
443
|
+
i0.ɵɵelementEnd();
|
|
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); });
|
|
446
|
+
i0.ɵɵelementEnd()();
|
|
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);
|
|
449
|
+
i0.ɵɵelementEnd()()()()();
|
|
450
|
+
} if (rf & 2) {
|
|
451
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
452
|
+
i0.ɵɵadvance(14);
|
|
453
|
+
i0.ɵɵtextInterpolate(ctx_r2.ScheduleSyncDocName);
|
|
454
|
+
i0.ɵɵadvance(9);
|
|
455
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ScheduleSyncCron);
|
|
456
|
+
i0.ɵɵadvance(3);
|
|
457
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.GetScheduleCronPreview(ctx_r2.ScheduleSyncCron), " ");
|
|
458
|
+
i0.ɵɵadvance(4);
|
|
459
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ScheduleSyncEnabled);
|
|
460
|
+
i0.ɵɵadvance(2);
|
|
461
|
+
i0.ɵɵconditional(ctx_r2.ScheduleSyncSaving ? 32 : 33);
|
|
462
|
+
} }
|
|
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);
|
|
339
491
|
i0.ɵɵtext(2);
|
|
340
492
|
i0.ɵɵelementEnd();
|
|
341
493
|
} if (rf & 2) {
|
|
@@ -343,42 +495,42 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
343
495
|
i0.ɵɵadvance(2);
|
|
344
496
|
i0.ɵɵtextInterpolate(ctx_r2.SuggestEntityName);
|
|
345
497
|
} }
|
|
346
|
-
function
|
|
347
|
-
i0.ɵɵelement(0, "i",
|
|
348
|
-
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);
|
|
349
501
|
i0.ɵɵtext(2, "Search and select an entity...");
|
|
350
502
|
i0.ɵɵelementEnd();
|
|
351
503
|
} }
|
|
352
|
-
function
|
|
353
|
-
const
|
|
354
|
-
i0.ɵɵelementStart(0, "button",
|
|
355
|
-
i0.ɵɵlistener("click", function
|
|
356
|
-
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);
|
|
357
509
|
i0.ɵɵtext(2);
|
|
358
510
|
i0.ɵɵelementEnd();
|
|
359
511
|
} if (rf & 2) {
|
|
360
|
-
const
|
|
512
|
+
const entity_r21 = ctx.$implicit;
|
|
361
513
|
const ctx_r2 = i0.ɵɵnextContext(6);
|
|
362
|
-
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);
|
|
363
515
|
i0.ɵɵadvance(2);
|
|
364
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
516
|
+
i0.ɵɵtextInterpolate1(" ", entity_r21.Name, " ");
|
|
365
517
|
} }
|
|
366
|
-
function
|
|
367
|
-
i0.ɵɵelementStart(0, "div",
|
|
368
|
-
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);
|
|
369
521
|
i0.ɵɵtext(3);
|
|
370
522
|
i0.ɵɵelementEnd();
|
|
371
|
-
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);
|
|
372
524
|
i0.ɵɵelementEnd();
|
|
373
525
|
} if (rf & 2) {
|
|
374
|
-
const
|
|
526
|
+
const group_r22 = ctx.$implicit;
|
|
375
527
|
i0.ɵɵadvance(3);
|
|
376
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
528
|
+
i0.ɵɵtextInterpolate1(" ", group_r22.SchemaName, " ");
|
|
377
529
|
i0.ɵɵadvance();
|
|
378
|
-
i0.ɵɵrepeater(
|
|
530
|
+
i0.ɵɵrepeater(group_r22.Entities);
|
|
379
531
|
} }
|
|
380
|
-
function
|
|
381
|
-
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);
|
|
382
534
|
i0.ɵɵtext(1);
|
|
383
535
|
i0.ɵɵelementEnd();
|
|
384
536
|
} if (rf & 2) {
|
|
@@ -386,38 +538,40 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
386
538
|
i0.ɵɵadvance();
|
|
387
539
|
i0.ɵɵtextInterpolate1(" No entities matching \"", ctx_r2.EntitySearchText, "\" ");
|
|
388
540
|
} }
|
|
389
|
-
function
|
|
390
|
-
const
|
|
391
|
-
i0.ɵɵelementStart(0, "div",
|
|
392
|
-
i0.ɵɵ
|
|
393
|
-
i0.ɵɵelementStart(
|
|
394
|
-
i0.ɵɵ
|
|
395
|
-
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)); });
|
|
396
550
|
i0.ɵɵelementEnd()();
|
|
397
|
-
i0.ɵɵelementStart(
|
|
398
|
-
i0.ɵɵrepeaterCreate(
|
|
399
|
-
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);
|
|
400
554
|
i0.ɵɵelementEnd()();
|
|
401
555
|
} if (rf & 2) {
|
|
402
556
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
403
557
|
i0.ɵɵadvance(3);
|
|
404
558
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.EntitySearchText);
|
|
405
|
-
i0.ɵɵadvance(
|
|
559
|
+
i0.ɵɵadvance(3);
|
|
406
560
|
i0.ɵɵrepeater(ctx_r2.FilteredEntityGroups);
|
|
407
561
|
i0.ɵɵadvance(2);
|
|
408
|
-
i0.ɵɵconditional(ctx_r2.FilteredEntityGroups.length === 0 ?
|
|
562
|
+
i0.ɵɵconditional(ctx_r2.FilteredEntityGroups.length === 0 ? 8 : -1);
|
|
409
563
|
} }
|
|
410
|
-
function
|
|
411
|
-
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);
|
|
412
566
|
i0.ɵɵtext(1, " Generating with AI... ");
|
|
413
567
|
} }
|
|
414
|
-
function
|
|
415
|
-
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);
|
|
416
570
|
i0.ɵɵtext(1, " Generate Template ");
|
|
417
571
|
} }
|
|
418
|
-
function
|
|
419
|
-
i0.ɵɵelementStart(0, "div",
|
|
420
|
-
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);
|
|
421
575
|
i0.ɵɵtext(2);
|
|
422
576
|
i0.ɵɵelementEnd();
|
|
423
577
|
} if (rf & 2) {
|
|
@@ -425,41 +579,41 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
425
579
|
i0.ɵɵadvance(2);
|
|
426
580
|
i0.ɵɵtextInterpolate1(" ", ctx_r2.SuggestionError, " ");
|
|
427
581
|
} }
|
|
428
|
-
function
|
|
429
|
-
const
|
|
430
|
-
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);
|
|
431
585
|
i0.ɵɵtext(3, "Entity");
|
|
432
586
|
i0.ɵɵelementEnd();
|
|
433
|
-
i0.ɵɵelementStart(4, "div",
|
|
434
|
-
i0.ɵɵlistener("click", function
|
|
435
|
-
i0.ɵɵconditionalCreate(6,
|
|
436
|
-
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);
|
|
437
591
|
i0.ɵɵelementEnd();
|
|
438
|
-
i0.ɵɵconditionalCreate(9,
|
|
592
|
+
i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template, 9, 2, "div", 111);
|
|
439
593
|
i0.ɵɵelementEnd()();
|
|
440
|
-
i0.ɵɵelementStart(10, "div",
|
|
594
|
+
i0.ɵɵelementStart(10, "div", 68)(11, "label", 69);
|
|
441
595
|
i0.ɵɵtext(12, "Use Case");
|
|
442
596
|
i0.ɵɵelementEnd();
|
|
443
|
-
i0.ɵɵelementStart(13, "div",
|
|
444
|
-
i0.ɵɵlistener("click", function
|
|
445
|
-
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);
|
|
446
600
|
i0.ɵɵtext(16, " Duplicate Detection ");
|
|
447
601
|
i0.ɵɵelementEnd();
|
|
448
|
-
i0.ɵɵelementStart(17, "button",
|
|
449
|
-
i0.ɵɵlistener("click", function
|
|
450
|
-
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);
|
|
451
605
|
i0.ɵɵtext(19, " Search ");
|
|
452
606
|
i0.ɵɵelementEnd();
|
|
453
|
-
i0.ɵɵelementStart(20, "button",
|
|
454
|
-
i0.ɵɵlistener("click", function
|
|
455
|
-
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);
|
|
456
610
|
i0.ɵɵtext(22, " Classification ");
|
|
457
611
|
i0.ɵɵelementEnd()()();
|
|
458
|
-
i0.ɵɵelementStart(23, "button",
|
|
459
|
-
i0.ɵɵlistener("click", function
|
|
460
|
-
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);
|
|
461
615
|
i0.ɵɵelementEnd();
|
|
462
|
-
i0.ɵɵconditionalCreate(26,
|
|
616
|
+
i0.ɵɵconditionalCreate(26, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_26_Template, 3, 1, "div", 118);
|
|
463
617
|
i0.ɵɵelementEnd();
|
|
464
618
|
} if (rf & 2) {
|
|
465
619
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -480,78 +634,78 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
480
634
|
i0.ɵɵadvance(2);
|
|
481
635
|
i0.ɵɵconditional(ctx_r2.SuggestionError ? 26 : -1);
|
|
482
636
|
} }
|
|
483
|
-
function
|
|
484
|
-
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);
|
|
485
639
|
i0.ɵɵtext(1);
|
|
486
640
|
i0.ɵɵelementEnd();
|
|
487
641
|
} if (rf & 2) {
|
|
488
|
-
const
|
|
642
|
+
const field_r24 = ctx.$implicit;
|
|
489
643
|
i0.ɵɵadvance();
|
|
490
|
-
i0.ɵɵtextInterpolate(
|
|
644
|
+
i0.ɵɵtextInterpolate(field_r24);
|
|
491
645
|
} }
|
|
492
|
-
function
|
|
493
|
-
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);
|
|
494
648
|
i0.ɵɵtext(2);
|
|
495
649
|
i0.ɵɵelementEnd();
|
|
496
|
-
i0.ɵɵelementStart(3, "span",
|
|
650
|
+
i0.ɵɵelementStart(3, "span", 146);
|
|
497
651
|
i0.ɵɵtext(4);
|
|
498
652
|
i0.ɵɵelementEnd()();
|
|
499
653
|
} if (rf & 2) {
|
|
500
|
-
const
|
|
654
|
+
const rel_r25 = ctx.$implicit;
|
|
501
655
|
i0.ɵɵadvance(2);
|
|
502
|
-
i0.ɵɵtextInterpolate(
|
|
656
|
+
i0.ɵɵtextInterpolate(rel_r25.name);
|
|
503
657
|
i0.ɵɵadvance(2);
|
|
504
|
-
i0.ɵɵtextInterpolate(
|
|
658
|
+
i0.ɵɵtextInterpolate(rel_r25.fields.join(", "));
|
|
505
659
|
} }
|
|
506
|
-
function
|
|
507
|
-
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);
|
|
508
662
|
i0.ɵɵtext(2, "Related Entities");
|
|
509
663
|
i0.ɵɵelementEnd();
|
|
510
|
-
i0.ɵɵrepeaterCreate(3,
|
|
664
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_For_4_Template, 5, 2, "div", 144, _forTrack4);
|
|
511
665
|
i0.ɵɵelementEnd();
|
|
512
666
|
} if (rf & 2) {
|
|
513
667
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
514
668
|
i0.ɵɵadvance(3);
|
|
515
669
|
i0.ɵɵrepeater(ctx_r2.SuggestionResult.selectedRelationships);
|
|
516
670
|
} }
|
|
517
|
-
function
|
|
518
|
-
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);
|
|
519
673
|
i0.ɵɵtext(1);
|
|
520
674
|
i0.ɵɵelementEnd();
|
|
521
675
|
} if (rf & 2) {
|
|
522
|
-
const
|
|
523
|
-
i0.ɵɵproperty("value",
|
|
676
|
+
const model_r26 = ctx.$implicit;
|
|
677
|
+
i0.ɵɵproperty("value", model_r26.ID);
|
|
524
678
|
i0.ɵɵadvance();
|
|
525
|
-
i0.ɵɵtextInterpolate(
|
|
679
|
+
i0.ɵɵtextInterpolate(model_r26.Name);
|
|
526
680
|
} }
|
|
527
|
-
function
|
|
528
|
-
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);
|
|
529
683
|
i0.ɵɵtext(1);
|
|
530
684
|
i0.ɵɵelementEnd();
|
|
531
685
|
} if (rf & 2) {
|
|
532
|
-
const
|
|
533
|
-
i0.ɵɵproperty("value",
|
|
686
|
+
const db_r27 = ctx.$implicit;
|
|
687
|
+
i0.ɵɵproperty("value", db_r27.ID);
|
|
534
688
|
i0.ɵɵadvance();
|
|
535
|
-
i0.ɵɵtextInterpolate(
|
|
689
|
+
i0.ɵɵtextInterpolate(db_r27.Name);
|
|
536
690
|
} }
|
|
537
|
-
function
|
|
538
|
-
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);
|
|
539
693
|
i0.ɵɵtext(1);
|
|
540
694
|
i0.ɵɵelementEnd();
|
|
541
695
|
} if (rf & 2) {
|
|
542
|
-
const
|
|
543
|
-
i0.ɵɵproperty("value",
|
|
696
|
+
const idx_r29 = ctx.$implicit;
|
|
697
|
+
i0.ɵɵproperty("value", idx_r29.ID);
|
|
544
698
|
i0.ɵɵadvance();
|
|
545
|
-
i0.ɵɵtextInterpolate(
|
|
699
|
+
i0.ɵɵtextInterpolate(idx_r29.Name);
|
|
546
700
|
} }
|
|
547
|
-
function
|
|
548
|
-
const
|
|
549
|
-
i0.ɵɵelementStart(0, "select",
|
|
550
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
551
|
-
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);
|
|
552
706
|
i0.ɵɵtext(2, "Auto (create/find matching index)");
|
|
553
707
|
i0.ɵɵelementEnd();
|
|
554
|
-
i0.ɵɵrepeaterCreate(3,
|
|
708
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_For_4_Template, 2, 2, "option", 77, _forTrack2);
|
|
555
709
|
i0.ɵɵelementEnd();
|
|
556
710
|
} if (rf & 2) {
|
|
557
711
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
@@ -559,93 +713,93 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
559
713
|
i0.ɵɵadvance(3);
|
|
560
714
|
i0.ɵɵrepeater(ctx_r2.FilteredIndexesForSelectedDB);
|
|
561
715
|
} }
|
|
562
|
-
function
|
|
563
|
-
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);
|
|
564
718
|
i0.ɵɵtext(1, " No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync ");
|
|
565
719
|
i0.ɵɵelementEnd();
|
|
566
720
|
} }
|
|
567
|
-
function
|
|
568
|
-
i0.ɵɵelementStart(0, "div",
|
|
569
|
-
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);
|
|
570
724
|
i0.ɵɵelementEnd();
|
|
571
725
|
} }
|
|
572
|
-
function
|
|
573
|
-
const
|
|
574
|
-
i0.ɵɵelementStart(0, "button",
|
|
575
|
-
i0.ɵɵlistener("click", function
|
|
576
|
-
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);
|
|
577
731
|
i0.ɵɵtext(2, " Save as Entity Document ");
|
|
578
732
|
i0.ɵɵelementEnd();
|
|
579
|
-
i0.ɵɵelementStart(3, "button",
|
|
580
|
-
i0.ɵɵlistener("click", function
|
|
581
|
-
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);
|
|
582
736
|
i0.ɵɵtext(5, " Try Again ");
|
|
583
737
|
i0.ɵɵelementEnd();
|
|
584
|
-
i0.ɵɵelementStart(6, "button",
|
|
585
|
-
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()); });
|
|
586
740
|
i0.ɵɵtext(7, " Close ");
|
|
587
741
|
i0.ɵɵelementEnd();
|
|
588
742
|
} }
|
|
589
|
-
function
|
|
590
|
-
const
|
|
591
|
-
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);
|
|
592
746
|
i0.ɵɵtext(3, "Suggested Template");
|
|
593
747
|
i0.ɵɵelementEnd();
|
|
594
|
-
i0.ɵɵelementStart(4, "div",
|
|
595
|
-
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)); });
|
|
596
750
|
i0.ɵɵelementEnd()()();
|
|
597
|
-
i0.ɵɵelementStart(6, "div",
|
|
751
|
+
i0.ɵɵelementStart(6, "div", 134)(7, "h4", 135);
|
|
598
752
|
i0.ɵɵtext(8, "Selected Fields");
|
|
599
753
|
i0.ɵɵelementEnd();
|
|
600
|
-
i0.ɵɵelementStart(9, "div",
|
|
601
|
-
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);
|
|
602
756
|
i0.ɵɵelementEnd()();
|
|
603
|
-
i0.ɵɵconditionalCreate(12,
|
|
604
|
-
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);
|
|
605
759
|
i0.ɵɵtext(16, "Potential Match");
|
|
606
760
|
i0.ɵɵelementEnd();
|
|
607
|
-
i0.ɵɵelementStart(17, "span",
|
|
761
|
+
i0.ɵɵelementStart(17, "span", 139);
|
|
608
762
|
i0.ɵɵtext(18);
|
|
609
763
|
i0.ɵɵelementEnd()();
|
|
610
|
-
i0.ɵɵelementStart(19, "div",
|
|
764
|
+
i0.ɵɵelementStart(19, "div", 137)(20, "span", 138);
|
|
611
765
|
i0.ɵɵtext(21, "Absolute Match");
|
|
612
766
|
i0.ɵɵelementEnd();
|
|
613
|
-
i0.ɵɵelementStart(22, "span",
|
|
767
|
+
i0.ɵɵelementStart(22, "span", 139);
|
|
614
768
|
i0.ɵɵtext(23);
|
|
615
769
|
i0.ɵɵelementEnd()()();
|
|
616
|
-
i0.ɵɵelementStart(24, "div",
|
|
770
|
+
i0.ɵɵelementStart(24, "div", 134)(25, "h4", 135);
|
|
617
771
|
i0.ɵɵtext(26, "Reasoning");
|
|
618
772
|
i0.ɵɵelementEnd();
|
|
619
|
-
i0.ɵɵelementStart(27, "p",
|
|
773
|
+
i0.ɵɵelementStart(27, "p", 140);
|
|
620
774
|
i0.ɵɵtext(28);
|
|
621
775
|
i0.ɵɵelementEnd()();
|
|
622
|
-
i0.ɵɵelementStart(29, "div",
|
|
776
|
+
i0.ɵɵelementStart(29, "div", 134)(30, "div", 68)(31, "label", 69);
|
|
623
777
|
i0.ɵɵtext(32, "Document Name");
|
|
624
778
|
i0.ɵɵelementEnd();
|
|
625
|
-
i0.ɵɵelementStart(33, "input",
|
|
626
|
-
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); });
|
|
627
781
|
i0.ɵɵelementEnd()();
|
|
628
|
-
i0.ɵɵelementStart(34, "div",
|
|
782
|
+
i0.ɵɵelementStart(34, "div", 141)(35, "label", 69);
|
|
629
783
|
i0.ɵɵtext(36, "Embedding Model");
|
|
630
784
|
i0.ɵɵelementEnd();
|
|
631
|
-
i0.ɵɵelementStart(37, "select",
|
|
632
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
633
|
-
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);
|
|
634
788
|
i0.ɵɵelementEnd()();
|
|
635
|
-
i0.ɵɵelementStart(40, "div",
|
|
789
|
+
i0.ɵɵelementStart(40, "div", 141)(41, "label", 69);
|
|
636
790
|
i0.ɵɵtext(42, "Vector Database");
|
|
637
791
|
i0.ɵɵelementEnd();
|
|
638
|
-
i0.ɵɵelementStart(43, "select",
|
|
639
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
640
|
-
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);
|
|
641
795
|
i0.ɵɵelementEnd()();
|
|
642
|
-
i0.ɵɵelementStart(46, "div",
|
|
796
|
+
i0.ɵɵelementStart(46, "div", 141)(47, "label", 69);
|
|
643
797
|
i0.ɵɵtext(48, "Vector Index");
|
|
644
798
|
i0.ɵɵelementEnd();
|
|
645
|
-
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);
|
|
646
800
|
i0.ɵɵelementEnd()();
|
|
647
|
-
i0.ɵɵelementStart(51, "div",
|
|
648
|
-
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);
|
|
649
803
|
i0.ɵɵelementEnd()();
|
|
650
804
|
} if (rf & 2) {
|
|
651
805
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -676,22 +830,22 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
676
830
|
i0.ɵɵadvance(3);
|
|
677
831
|
i0.ɵɵconditional(ctx_r2.IsSavingDocument ? 52 : 53);
|
|
678
832
|
} }
|
|
679
|
-
function
|
|
680
|
-
const
|
|
681
|
-
i0.ɵɵelementStart(0, "div",
|
|
682
|
-
i0.ɵɵlistener("click", function
|
|
683
|
-
i0.ɵɵelementStart(1, "div",
|
|
684
|
-
i0.ɵɵlistener("click", function
|
|
685
|
-
i0.ɵɵelementStart(2, "div",
|
|
686
|
-
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);
|
|
687
841
|
i0.ɵɵtext(5, " AI Document Suggestion ");
|
|
688
842
|
i0.ɵɵelementEnd();
|
|
689
|
-
i0.ɵɵelementStart(6, "button",
|
|
690
|
-
i0.ɵɵlistener("click", function
|
|
691
|
-
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);
|
|
692
846
|
i0.ɵɵelementEnd()();
|
|
693
|
-
i0.ɵɵelementStart(8, "div",
|
|
694
|
-
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);
|
|
695
849
|
i0.ɵɵelementEnd()()();
|
|
696
850
|
} if (rf & 2) {
|
|
697
851
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -702,68 +856,70 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template
|
|
|
702
856
|
} }
|
|
703
857
|
function VectorManagementResourceComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
704
858
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
705
|
-
i0.ɵɵelementStart(0, "div",
|
|
706
|
-
i0.ɵɵconditionalCreate(1, VectorManagementResourceComponent_Conditional_1_Conditional_1_Template, 7, 4, "div",
|
|
707
|
-
i0.ɵɵelementStart(2, "div",
|
|
708
|
-
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);
|
|
709
863
|
i0.ɵɵelementEnd();
|
|
710
|
-
i0.ɵɵelementStart(5, "div",
|
|
711
|
-
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);
|
|
712
866
|
i0.ɵɵtext(10, " Entity Sync Status ");
|
|
713
867
|
i0.ɵɵelementEnd();
|
|
714
|
-
i0.ɵɵelementStart(11, "div",
|
|
868
|
+
i0.ɵɵelementStart(11, "div", 12)(12, "button", 13);
|
|
715
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()); });
|
|
716
|
-
i0.ɵɵelement(13, "i",
|
|
717
|
-
i0.ɵɵelementStart(14, "span",
|
|
870
|
+
i0.ɵɵelement(13, "i", 14);
|
|
871
|
+
i0.ɵɵelementStart(14, "span", 15);
|
|
718
872
|
i0.ɵɵtext(15, "Suggest Document");
|
|
719
873
|
i0.ɵɵelementEnd()();
|
|
720
|
-
i0.ɵɵelementStart(16, "button",
|
|
874
|
+
i0.ɵɵelementStart(16, "button", 16);
|
|
721
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()); });
|
|
722
|
-
i0.ɵɵelement(17, "i",
|
|
876
|
+
i0.ɵɵelement(17, "i", 17);
|
|
723
877
|
i0.ɵɵtext(18, " Refresh ");
|
|
724
878
|
i0.ɵɵelementEnd()()();
|
|
725
|
-
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);
|
|
726
880
|
i0.ɵɵelementEnd();
|
|
727
|
-
i0.ɵɵelementStart(21, "div",
|
|
728
|
-
i0.ɵɵelement(24, "i",
|
|
881
|
+
i0.ɵɵelementStart(21, "div", 20)(22, "div", 21)(23, "h4", 22);
|
|
882
|
+
i0.ɵɵelement(24, "i", 23);
|
|
729
883
|
i0.ɵɵtext(25, " Vector DB Health ");
|
|
730
884
|
i0.ɵɵelementEnd();
|
|
731
|
-
i0.ɵɵelementStart(26, "div",
|
|
732
|
-
i0.ɵɵelement(27, "span",
|
|
733
|
-
i0.ɵɵelementStart(28, "span",
|
|
885
|
+
i0.ɵɵelementStart(26, "div", 24);
|
|
886
|
+
i0.ɵɵelement(27, "span", 25);
|
|
887
|
+
i0.ɵɵelementStart(28, "span", 26);
|
|
734
888
|
i0.ɵɵtext(29);
|
|
735
889
|
i0.ɵɵelementEnd()();
|
|
736
|
-
i0.ɵɵelementStart(30, "div",
|
|
890
|
+
i0.ɵɵelementStart(30, "div", 27);
|
|
737
891
|
i0.ɵɵtext(31);
|
|
738
892
|
i0.ɵɵelementEnd()();
|
|
739
|
-
i0.ɵɵelementStart(32, "div",
|
|
740
|
-
i0.ɵɵelement(34, "i",
|
|
893
|
+
i0.ɵɵelementStart(32, "div", 21)(33, "h4", 22);
|
|
894
|
+
i0.ɵɵelement(34, "i", 28);
|
|
741
895
|
i0.ɵɵtext(35, " Embedding Model ");
|
|
742
896
|
i0.ɵɵelementEnd();
|
|
743
|
-
i0.ɵɵelementStart(36, "div",
|
|
897
|
+
i0.ɵɵelementStart(36, "div", 29)(37, "div", 30)(38, "span", 31);
|
|
744
898
|
i0.ɵɵtext(39, "Model");
|
|
745
899
|
i0.ɵɵelementEnd();
|
|
746
|
-
i0.ɵɵelementStart(40, "span",
|
|
900
|
+
i0.ɵɵelementStart(40, "span", 32);
|
|
747
901
|
i0.ɵɵtext(41);
|
|
748
902
|
i0.ɵɵelementEnd()();
|
|
749
|
-
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);
|
|
750
904
|
i0.ɵɵelementEnd()();
|
|
751
|
-
i0.ɵɵelementStart(43, "div",
|
|
752
|
-
i0.ɵɵelement(45, "i",
|
|
905
|
+
i0.ɵɵelementStart(43, "div", 21)(44, "h4", 22);
|
|
906
|
+
i0.ɵɵelement(45, "i", 33);
|
|
753
907
|
i0.ɵɵtext(46, " Vectorization Coverage ");
|
|
754
908
|
i0.ɵɵelementEnd();
|
|
755
|
-
i0.ɵɵelementStart(47, "div",
|
|
756
|
-
i0.ɵɵelement(49, "div",
|
|
909
|
+
i0.ɵɵelementStart(47, "div", 34)(48, "div", 35);
|
|
910
|
+
i0.ɵɵelement(49, "div", 36);
|
|
757
911
|
i0.ɵɵelementEnd();
|
|
758
|
-
i0.ɵɵelementStart(50, "div",
|
|
912
|
+
i0.ɵɵelementStart(50, "div", 37);
|
|
759
913
|
i0.ɵɵtext(51);
|
|
760
914
|
i0.ɵɵelementEnd()();
|
|
761
|
-
i0.ɵɵelementStart(52, "div",
|
|
915
|
+
i0.ɵɵelementStart(52, "div", 38);
|
|
762
916
|
i0.ɵɵtext(53);
|
|
763
917
|
i0.ɵɵpipe(54, "number");
|
|
764
918
|
i0.ɵɵelementEnd()()()()();
|
|
765
|
-
i0.ɵɵconditionalCreate(55, VectorManagementResourceComponent_Conditional_1_Conditional_55_Template,
|
|
766
|
-
i0.ɵɵconditionalCreate(56, VectorManagementResourceComponent_Conditional_1_Conditional_56_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);
|
|
767
923
|
} if (rf & 2) {
|
|
768
924
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
769
925
|
i0.ɵɵadvance();
|
|
@@ -787,14 +943,19 @@ function VectorManagementResourceComponent_Conditional_1_Template(rf, ctx) { if
|
|
|
787
943
|
i0.ɵɵadvance(2);
|
|
788
944
|
i0.ɵɵtextInterpolate1("", ctx_r2.StorageLabel, " of records vectorized");
|
|
789
945
|
i0.ɵɵadvance(2);
|
|
790
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54,
|
|
946
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54, 16, ctx_r2.TotalVectors), " vectors stored ");
|
|
791
947
|
i0.ɵɵadvance(2);
|
|
792
948
|
i0.ɵɵconditional(ctx_r2.ShowEditPanel ? 55 : -1);
|
|
793
949
|
i0.ɵɵadvance();
|
|
794
|
-
i0.ɵɵconditional(ctx_r2.
|
|
950
|
+
i0.ɵɵconditional(ctx_r2.ShowScheduleSyncDialog ? 56 : -1);
|
|
951
|
+
i0.ɵɵadvance();
|
|
952
|
+
i0.ɵɵconditional(ctx_r2.ShowNoIndexWarning ? 57 : -1);
|
|
953
|
+
i0.ɵɵadvance();
|
|
954
|
+
i0.ɵɵconditional(ctx_r2.ShowSuggestDialog ? 58 : -1);
|
|
795
955
|
} }
|
|
796
956
|
let VectorManagementResourceComponent = class VectorManagementResourceComponent extends BaseResourceComponent {
|
|
797
957
|
cdr = inject(ChangeDetectorRef);
|
|
958
|
+
navigationService = inject(NavigationService);
|
|
798
959
|
destroy$ = new Subject();
|
|
799
960
|
/** View mode: 'index' = Option A (shared index as hero, entity docs as children),
|
|
800
961
|
* 'operations' = Option C (operations monitoring with real-time sync status) */
|
|
@@ -830,8 +991,21 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
830
991
|
EditDocAIModelID = '';
|
|
831
992
|
EditDocVectorIndexID = '';
|
|
832
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;
|
|
833
1007
|
/** Open the edit panel for an entity document */
|
|
834
|
-
OpenEditPanel(entityDocumentId) {
|
|
1008
|
+
async OpenEditPanel(entityDocumentId) {
|
|
835
1009
|
const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));
|
|
836
1010
|
if (!doc)
|
|
837
1011
|
return;
|
|
@@ -842,8 +1016,35 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
842
1016
|
this.EditDocAIModelID = doc.AIModelID;
|
|
843
1017
|
this.EditDocVectorIndexID = doc.VectorIndexID || '';
|
|
844
1018
|
this.EditDocStatus = doc.Status;
|
|
1019
|
+
this.EditDocTemplate = '';
|
|
1020
|
+
this.IsEditRegenerating = false;
|
|
845
1021
|
this.ShowEditPanel = true;
|
|
846
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
|
+
}
|
|
847
1048
|
}
|
|
848
1049
|
CloseEditPanel() {
|
|
849
1050
|
this.ShowEditPanel = false;
|
|
@@ -865,6 +1066,8 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
865
1066
|
doc.Status = this.EditDocStatus;
|
|
866
1067
|
const saved = await doc.Save();
|
|
867
1068
|
if (saved) {
|
|
1069
|
+
// Also save updated template text if changed
|
|
1070
|
+
await this.saveEditDocTemplate(doc.TemplateID);
|
|
868
1071
|
MJNotificationService.Instance.CreateSimpleNotification('Entity document updated', 'success', 2500);
|
|
869
1072
|
this.ShowEditPanel = false;
|
|
870
1073
|
await this.LoadData();
|
|
@@ -883,6 +1086,55 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
883
1086
|
this.cdr.detectChanges();
|
|
884
1087
|
}
|
|
885
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
|
+
}
|
|
886
1138
|
async DeleteEntityDocument() {
|
|
887
1139
|
this.IsEditDeleting = true;
|
|
888
1140
|
this.cdr.detectChanges();
|
|
@@ -911,6 +1163,119 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
911
1163
|
this.cdr.detectChanges();
|
|
912
1164
|
}
|
|
913
1165
|
}
|
|
1166
|
+
// --- Schedule Sync Dialog ---
|
|
1167
|
+
ShowScheduleSyncDialog = false;
|
|
1168
|
+
ScheduleSyncSaving = false;
|
|
1169
|
+
ScheduleSyncDocID = '';
|
|
1170
|
+
ScheduleSyncDocName = '';
|
|
1171
|
+
ScheduleSyncCron = '0 2 * * *';
|
|
1172
|
+
ScheduleSyncEnabled = true;
|
|
1173
|
+
/** Opens the schedule sync dialog for a specific entity document */
|
|
1174
|
+
OpenScheduleSyncDialog(entityDocumentId) {
|
|
1175
|
+
const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));
|
|
1176
|
+
if (!doc)
|
|
1177
|
+
return;
|
|
1178
|
+
this.ScheduleSyncDocID = doc.ID;
|
|
1179
|
+
this.ScheduleSyncDocName = doc.Entity || doc.Name;
|
|
1180
|
+
this.ScheduleSyncCron = '0 2 * * *';
|
|
1181
|
+
this.ScheduleSyncEnabled = true;
|
|
1182
|
+
this.ShowScheduleSyncDialog = true;
|
|
1183
|
+
this.cdr.detectChanges();
|
|
1184
|
+
}
|
|
1185
|
+
/** Closes the schedule sync dialog */
|
|
1186
|
+
CloseScheduleSyncDialog() {
|
|
1187
|
+
this.ShowScheduleSyncDialog = false;
|
|
1188
|
+
this.ScheduleSyncDocID = '';
|
|
1189
|
+
this.cdr.detectChanges();
|
|
1190
|
+
}
|
|
1191
|
+
/** Returns a human-readable description of a cron expression */
|
|
1192
|
+
GetScheduleCronPreview(cron) {
|
|
1193
|
+
return CronToHumanReadable(cron);
|
|
1194
|
+
}
|
|
1195
|
+
/** Saves a new ScheduledAction for vectorizing the selected entity document */
|
|
1196
|
+
async SaveScheduleSync() {
|
|
1197
|
+
if (this.ScheduleSyncSaving || !this.ScheduleSyncDocID)
|
|
1198
|
+
return;
|
|
1199
|
+
this.ScheduleSyncSaving = true;
|
|
1200
|
+
this.cdr.detectChanges();
|
|
1201
|
+
try {
|
|
1202
|
+
const actionID = await this.findVectorizeActionID();
|
|
1203
|
+
if (!actionID) {
|
|
1204
|
+
MJNotificationService.Instance.CreateSimpleNotification('Could not find the "__VectorizeEntity" action. Please check action configuration.', 'error', 5000);
|
|
1205
|
+
return;
|
|
1206
|
+
}
|
|
1207
|
+
const md = new Metadata();
|
|
1208
|
+
// Create ScheduledAction
|
|
1209
|
+
const scheduledAction = await md.GetEntityObject('MJ: Scheduled Actions');
|
|
1210
|
+
scheduledAction.NewRecord();
|
|
1211
|
+
scheduledAction.Name = `Vectorize: ${this.ScheduleSyncDocName}`;
|
|
1212
|
+
scheduledAction.Description = `Automated vectorization for entity document "${this.ScheduleSyncDocName}"`;
|
|
1213
|
+
scheduledAction.ActionID = actionID;
|
|
1214
|
+
scheduledAction.Type = 'Custom';
|
|
1215
|
+
scheduledAction.CronExpression = this.ScheduleSyncCron;
|
|
1216
|
+
scheduledAction.CustomCronExpression = this.ScheduleSyncCron;
|
|
1217
|
+
scheduledAction.Status = this.ScheduleSyncEnabled ? 'Active' : 'Disabled';
|
|
1218
|
+
scheduledAction.Timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
1219
|
+
const saved = await scheduledAction.Save();
|
|
1220
|
+
if (!saved) {
|
|
1221
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Failed to create schedule: ${scheduledAction.LatestResult?.Message ?? 'Unknown error'}`, 'error', 5000);
|
|
1222
|
+
return;
|
|
1223
|
+
}
|
|
1224
|
+
// Create param linking the entityDocumentID
|
|
1225
|
+
await this.createVectorizeScheduleParam(scheduledAction.ID, actionID, this.ScheduleSyncDocID);
|
|
1226
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Schedule created: ${CronToHumanReadable(this.ScheduleSyncCron)}`, 'success', 3000);
|
|
1227
|
+
this.CloseScheduleSyncDialog();
|
|
1228
|
+
}
|
|
1229
|
+
catch (error) {
|
|
1230
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
1231
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);
|
|
1232
|
+
}
|
|
1233
|
+
finally {
|
|
1234
|
+
this.ScheduleSyncSaving = false;
|
|
1235
|
+
this.cdr.detectChanges();
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
/** Find the __VectorizeEntity action ID */
|
|
1239
|
+
async findVectorizeActionID() {
|
|
1240
|
+
const rv = new RunView();
|
|
1241
|
+
const result = await rv.RunView({
|
|
1242
|
+
EntityName: 'Actions',
|
|
1243
|
+
ExtraFilter: `Name = '__VectorizeEntity'`,
|
|
1244
|
+
Fields: ['ID'],
|
|
1245
|
+
ResultType: 'simple',
|
|
1246
|
+
MaxRows: 1,
|
|
1247
|
+
});
|
|
1248
|
+
if (result.Success && result.Results.length > 0) {
|
|
1249
|
+
return result.Results[0].ID;
|
|
1250
|
+
}
|
|
1251
|
+
return null;
|
|
1252
|
+
}
|
|
1253
|
+
/** Create a ScheduledActionParam linking the entity document ID */
|
|
1254
|
+
async createVectorizeScheduleParam(scheduledActionID, actionID, entityDocumentID) {
|
|
1255
|
+
const rv = new RunView();
|
|
1256
|
+
const paramResult = await rv.RunView({
|
|
1257
|
+
EntityName: 'Action Params',
|
|
1258
|
+
ExtraFilter: `ActionID = '${actionID}' AND Name = 'entityDocumentID'`,
|
|
1259
|
+
Fields: ['ID', 'Name'],
|
|
1260
|
+
ResultType: 'simple',
|
|
1261
|
+
MaxRows: 1,
|
|
1262
|
+
});
|
|
1263
|
+
if (!paramResult.Success || paramResult.Results.length === 0) {
|
|
1264
|
+
console.warn('[VectorManagement] Could not find entityDocumentID action param');
|
|
1265
|
+
return;
|
|
1266
|
+
}
|
|
1267
|
+
const md = new Metadata();
|
|
1268
|
+
const param = await md.GetEntityObject('MJ: Scheduled Action Params');
|
|
1269
|
+
param.NewRecord();
|
|
1270
|
+
param.ScheduledActionID = scheduledActionID;
|
|
1271
|
+
param.ActionParamID = paramResult.Results[0].ID;
|
|
1272
|
+
param.ValueType = 'Static';
|
|
1273
|
+
param.Value = entityDocumentID;
|
|
1274
|
+
const saved = await param.Save();
|
|
1275
|
+
if (!saved) {
|
|
1276
|
+
console.warn('[VectorManagement] Failed to save schedule param:', param.LatestResult?.Message);
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
914
1279
|
// --- Suggest Document Dialog ---
|
|
915
1280
|
ShowSuggestDialog = false;
|
|
916
1281
|
IsSuggesting = false;
|
|
@@ -958,20 +1323,29 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
958
1323
|
EntitySearchText = '';
|
|
959
1324
|
/** Whether the entity picker dropdown is open */
|
|
960
1325
|
ShowEntityPicker = false;
|
|
1326
|
+
SelectedEntityIndex = -1;
|
|
1327
|
+
/** Reference to the entity search input for programmatic focus */
|
|
1328
|
+
entitySearchInput;
|
|
961
1329
|
// --- Raw entity data (private) ---
|
|
962
1330
|
entityDocuments = [];
|
|
963
1331
|
vectorDatabases = [];
|
|
964
1332
|
vectorIndexes = [];
|
|
965
|
-
recordDocuments = [];
|
|
966
1333
|
aiModels = [];
|
|
1334
|
+
/** Lightweight aggregate stats per EntityDocumentID — avoids loading all record documents */
|
|
1335
|
+
erdStats = new Map();
|
|
967
1336
|
// ================================================================
|
|
968
1337
|
// Lifecycle
|
|
969
1338
|
// ================================================================
|
|
970
1339
|
async ngAfterViewInit() {
|
|
971
1340
|
await this.LoadData();
|
|
1341
|
+
this.navigationService.SetAgentContext(this, {
|
|
1342
|
+
TotalVectors: this.TotalVectors,
|
|
1343
|
+
KPICount: this.KPICards.length,
|
|
1344
|
+
});
|
|
972
1345
|
this.NotifyLoadComplete();
|
|
973
1346
|
}
|
|
974
1347
|
ngOnDestroy() {
|
|
1348
|
+
super.ngOnDestroy();
|
|
975
1349
|
this.destroy$.next();
|
|
976
1350
|
this.destroy$.complete();
|
|
977
1351
|
}
|
|
@@ -1075,9 +1449,11 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1075
1449
|
if (idleTimer)
|
|
1076
1450
|
clearTimeout(idleTimer);
|
|
1077
1451
|
rxSub?.unsubscribe();
|
|
1078
|
-
// Use
|
|
1079
|
-
//
|
|
1080
|
-
Promise.resolve
|
|
1452
|
+
// Use setTimeout to defer state changes to the next macrotask,
|
|
1453
|
+
// avoiding ExpressionChangedAfterItHasBeenCheckedError.
|
|
1454
|
+
// (Promise.resolve microtasks run between Angular's check passes
|
|
1455
|
+
// and still trigger NG0100.)
|
|
1456
|
+
setTimeout(async () => {
|
|
1081
1457
|
this.removeSyncingId(entityDocumentId);
|
|
1082
1458
|
if (success) {
|
|
1083
1459
|
MJNotificationService.Instance.CreateSimpleNotification(`Vectorization complete for ${entityName}`, 'success', 3000);
|
|
@@ -1086,8 +1462,8 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1086
1462
|
else {
|
|
1087
1463
|
this.updateRowStatus(entityDocumentId, 'Error');
|
|
1088
1464
|
MJNotificationService.Instance.CreateSimpleNotification(`Vectorization failed for ${entityName}`, 'error', 5000);
|
|
1089
|
-
this.cdr.detectChanges();
|
|
1090
1465
|
}
|
|
1466
|
+
this.cdr.detectChanges();
|
|
1091
1467
|
});
|
|
1092
1468
|
};
|
|
1093
1469
|
// Reset idle timer on every event. When no events arrive for 5s,
|
|
@@ -1148,8 +1524,13 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1148
1524
|
this.SyncingIds = next;
|
|
1149
1525
|
}
|
|
1150
1526
|
}
|
|
1151
|
-
/** Opens the AI suggestion dialog */
|
|
1527
|
+
/** Opens the AI suggestion dialog, or shows a warning if no vector indexes exist */
|
|
1152
1528
|
OpenSuggestDialog() {
|
|
1529
|
+
if (this.vectorIndexes.length === 0 && this.vectorDatabases.length === 0) {
|
|
1530
|
+
this.ShowNoIndexWarning = true;
|
|
1531
|
+
this.cdr.detectChanges();
|
|
1532
|
+
return;
|
|
1533
|
+
}
|
|
1153
1534
|
this.SuggestionResult = null;
|
|
1154
1535
|
this.SuggestEntityName = '';
|
|
1155
1536
|
this.SuggestUseCase = 'duplicate detection';
|
|
@@ -1161,6 +1542,18 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1161
1542
|
this.ShowSuggestDialog = true;
|
|
1162
1543
|
this.cdr.detectChanges();
|
|
1163
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
|
+
}
|
|
1164
1557
|
/** Select an entity from the grouped picker */
|
|
1165
1558
|
SelectEntity(entityName) {
|
|
1166
1559
|
this.SuggestEntityName = entityName;
|
|
@@ -1181,16 +1574,77 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1181
1574
|
}))
|
|
1182
1575
|
.filter(group => group.Entities.length > 0);
|
|
1183
1576
|
}
|
|
1577
|
+
// Reset selection to first item when filter changes
|
|
1578
|
+
this.SelectedEntityIndex = this.FlatFilteredEntities.length > 0 ? 0 : -1;
|
|
1184
1579
|
this.cdr.detectChanges();
|
|
1185
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
|
+
}
|
|
1186
1631
|
/** Toggle entity picker visibility */
|
|
1187
1632
|
ToggleEntityPicker() {
|
|
1188
1633
|
this.ShowEntityPicker = !this.ShowEntityPicker;
|
|
1189
1634
|
if (this.ShowEntityPicker) {
|
|
1190
1635
|
this.FilteredEntityGroups = this.EntityGroups;
|
|
1191
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();
|
|
1192
1647
|
}
|
|
1193
|
-
this.cdr.detectChanges();
|
|
1194
1648
|
}
|
|
1195
1649
|
/** Handle template edits from code editor */
|
|
1196
1650
|
OnTemplateChange(newValue) {
|
|
@@ -1334,42 +1788,55 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1334
1788
|
// Private helpers
|
|
1335
1789
|
// ================================================================
|
|
1336
1790
|
async fetchAllData() {
|
|
1337
|
-
// Use
|
|
1791
|
+
// Use cached engine data — BaseEngine's entity-event auto-refresh handles
|
|
1792
|
+
// updates from saves/deletes on the entities it tracks.
|
|
1338
1793
|
const engine = KnowledgeHubMetadataEngine.Instance;
|
|
1339
1794
|
await engine.Config(false);
|
|
1340
1795
|
this.entityDocuments = engine.EntityDocuments;
|
|
1341
|
-
this.vectorDatabases =
|
|
1796
|
+
this.vectorDatabases = AIEngineBase.Instance.VectorDatabases;
|
|
1342
1797
|
this.vectorIndexes = engine.VectorIndexes;
|
|
1343
|
-
//
|
|
1344
|
-
//
|
|
1345
|
-
//
|
|
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.
|
|
1346
1802
|
const rv = new RunView();
|
|
1347
|
-
const
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
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
|
+
});
|
|
1358
1827
|
}
|
|
1359
|
-
]);
|
|
1360
|
-
if (erdResult.Success) {
|
|
1361
|
-
this.recordDocuments = erdResult.Results;
|
|
1362
1828
|
}
|
|
1829
|
+
const modelsResult = allResults[allResults.length - 1];
|
|
1363
1830
|
if (modelsResult.Success) {
|
|
1364
1831
|
this.aiModels = modelsResult.Results;
|
|
1365
1832
|
}
|
|
1366
1833
|
}
|
|
1367
1834
|
buildSyncRows() {
|
|
1368
1835
|
this.SyncRows = this.entityDocuments.map(doc => {
|
|
1369
|
-
const
|
|
1370
|
-
const vectorCount =
|
|
1371
|
-
const lastSynced =
|
|
1372
|
-
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);
|
|
1373
1840
|
// Preserve progress info from any active sync
|
|
1374
1841
|
const existingRow = this.SyncRows.find(r => UUIDsEqual(r.EntityDocumentID, doc.ID));
|
|
1375
1842
|
return {
|
|
@@ -1384,44 +1851,32 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1384
1851
|
};
|
|
1385
1852
|
});
|
|
1386
1853
|
}
|
|
1387
|
-
|
|
1388
|
-
if (records.length === 0)
|
|
1389
|
-
return null;
|
|
1390
|
-
const dates = records
|
|
1391
|
-
.map(r => new Date(r.__mj_UpdatedAt))
|
|
1392
|
-
.filter(d => !isNaN(d.getTime()));
|
|
1393
|
-
if (dates.length === 0)
|
|
1394
|
-
return null;
|
|
1395
|
-
return new Date(Math.max(...dates.map(d => d.getTime())));
|
|
1396
|
-
}
|
|
1397
|
-
computeSyncStatus(doc, vectorCount, totalRecords) {
|
|
1854
|
+
computeSyncStatus(doc, vectorCount) {
|
|
1398
1855
|
if (this.SyncingIds.has(doc.ID)) {
|
|
1399
1856
|
return 'Syncing';
|
|
1400
1857
|
}
|
|
1401
1858
|
if (doc.Status === 'Inactive') {
|
|
1402
1859
|
return 'Pending';
|
|
1403
1860
|
}
|
|
1404
|
-
if (totalRecords === 0) {
|
|
1405
|
-
return 'Pending';
|
|
1406
|
-
}
|
|
1407
|
-
// If there are any vectors, consider it synced — partial syncs
|
|
1408
|
-
// still represent a successful state since the pipeline ran
|
|
1409
1861
|
if (vectorCount > 0) {
|
|
1410
1862
|
return 'Synced';
|
|
1411
1863
|
}
|
|
1412
|
-
return '
|
|
1864
|
+
return 'Pending';
|
|
1413
1865
|
}
|
|
1414
1866
|
buildKPICards() {
|
|
1415
|
-
|
|
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;
|
|
1416
1876
|
const entitiesSynced = new Set(this.entityDocuments
|
|
1417
1877
|
.filter(d => d.Status === 'Active')
|
|
1418
1878
|
.map(d => d.EntityID)).size;
|
|
1419
|
-
const
|
|
1420
|
-
.map(r => new Date(r.__mj_UpdatedAt))
|
|
1421
|
-
.filter(d => !isNaN(d.getTime()));
|
|
1422
|
-
const lastSyncDate = allDates.length > 0
|
|
1423
|
-
? new Date(Math.max(...allDates.map(d => d.getTime())))
|
|
1424
|
-
: null;
|
|
1879
|
+
const lastSyncDate = latestSync;
|
|
1425
1880
|
this.KPICards = [
|
|
1426
1881
|
{
|
|
1427
1882
|
title: 'Total Vectors',
|
|
@@ -1466,7 +1921,7 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1466
1921
|
const db = this.vectorDatabases[0];
|
|
1467
1922
|
this.VectorDBName = db.Name;
|
|
1468
1923
|
// Determine health based on whether we have records with vectors
|
|
1469
|
-
const hasVectors = this.
|
|
1924
|
+
const hasVectors = this.TotalVectors > 0;
|
|
1470
1925
|
this.VectorDBStatus = hasVectors ? 'Healthy' : 'Degraded';
|
|
1471
1926
|
}
|
|
1472
1927
|
else {
|
|
@@ -1488,10 +1943,9 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1488
1943
|
}
|
|
1489
1944
|
}
|
|
1490
1945
|
buildStorageUsage() {
|
|
1491
|
-
//
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
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;
|
|
1495
1949
|
}
|
|
1496
1950
|
/** Check if vector DB and embedding model are configured, populate selection lists */
|
|
1497
1951
|
checkPrerequisites() {
|
|
@@ -1656,15 +2110,19 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1656
2110
|
const rv = new RunView();
|
|
1657
2111
|
const result = await rv.RunView({
|
|
1658
2112
|
EntityName: 'MJ: Entity Record Documents',
|
|
1659
|
-
ExtraFilter: `EntityDocumentID='${entityDocumentId}'`,
|
|
1660
|
-
|
|
2113
|
+
ExtraFilter: `EntityDocumentID='${entityDocumentId}' AND VectorID IS NOT NULL`,
|
|
2114
|
+
Fields: ['__mj_UpdatedAt'],
|
|
2115
|
+
OrderBy: '__mj_UpdatedAt DESC',
|
|
2116
|
+
ResultType: 'simple',
|
|
2117
|
+
MaxRows: 1
|
|
1661
2118
|
});
|
|
1662
2119
|
if (result.Success) {
|
|
1663
|
-
|
|
1664
|
-
row.
|
|
1665
|
-
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;
|
|
1666
2122
|
row.Status = row.VectorCount > 0 ? 'Synced' : 'Pending';
|
|
1667
2123
|
row.PercentComplete = 100;
|
|
2124
|
+
this.erdStats.set(entityDocumentId, { vectorCount: row.VectorCount, lastSynced: row.LastSynced });
|
|
2125
|
+
this.buildKPICards();
|
|
1668
2126
|
this.cdr.detectChanges();
|
|
1669
2127
|
}
|
|
1670
2128
|
}
|
|
@@ -1744,11 +2202,16 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1744
2202
|
};
|
|
1745
2203
|
}
|
|
1746
2204
|
static ɵfac = /*@__PURE__*/ (() => { let ɵVectorManagementResourceComponent_BaseFactory; return function VectorManagementResourceComponent_Factory(__ngFactoryType__) { return (ɵVectorManagementResourceComponent_BaseFactory || (ɵVectorManagementResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(VectorManagementResourceComponent)))(__ngFactoryType__ || VectorManagementResourceComponent); }; })();
|
|
1747
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VectorManagementResourceComponent, selectors: [["app-vector-management-resource"]],
|
|
1748
|
-
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);
|
|
1749
2212
|
} if (rf & 2) {
|
|
1750
2213
|
i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
|
|
1751
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.CodeEditorComponent, i3.LoadingComponent, i4.KPICardComponent, i5.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n.vector-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.vector-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n\n\n.kpi-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.sync-table-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.sync-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.text-right[_ngcontent-%COMP%] {\n text-align: right;\n}\n\n.text-center[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.entity-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.document-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.vector-count[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n\n\n\n.actions-cell[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.edit-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.edit-delete-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n\n\n.sync-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n\n\n.health-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n\n.gauge-container[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.gauge-bar[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n.suggest-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n\n.slide-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.suggest-dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn[_ngcontent-%COMP%] {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.suggest-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n.use-case-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n\n.entity-picker[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty[_ngcontent-%COMP%] {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n\n\n\n.template-editor-wrapper[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper[_ngcontent-%COMP%] .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.suggest-result[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.result-heading[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action[_ngcontent-%COMP%] {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.suggest-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n.suggest-try-again-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n.save-spinner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n\n\n\n\n\n@media (max-width: 768px) {\n .panel-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel[_ngcontent-%COMP%] {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .suggest-btn[_ngcontent-%COMP%] .suggest-btn-text[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
|
|
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}"] });
|
|
1752
2215
|
};
|
|
1753
2216
|
VectorManagementResourceComponent = __decorate([
|
|
1754
2217
|
RegisterClass(BaseResourceComponent, 'VectorManagementResource')
|
|
@@ -1756,11 +2219,14 @@ VectorManagementResourceComponent = __decorate([
|
|
|
1756
2219
|
export { VectorManagementResourceComponent };
|
|
1757
2220
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VectorManagementResourceComponent, [{
|
|
1758
2221
|
type: Component,
|
|
1759
|
-
args: [{ standalone: false, selector: 'app-vector-management-resource', template: "@if (IsLoading) {\n <div class=\"vector-loading\">\n <mj-loading text=\"Loading vector management data...\"></mj-loading>\n </div>\n} @else {\n <div class=\"vector-dashboard\">\n <!-- View Mode Toggle -->\n @if (!EmbeddedMode) {\n <div class=\"view-mode-toggle\">\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'index'\" (click)=\"ViewMode = 'index'\">\n <i class=\"fa-solid fa-cubes\"></i> Index View\n </button>\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'operations'\" (click)=\"ViewMode = 'operations'\">\n <i class=\"fa-solid fa-gauge-high\"></i> Operations\n </button>\n </div>\n }\n\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n @for (card of KPICards; track card.title) {\n <app-kpi-card [data]=\"card\"></app-kpi-card>\n }\n </div>\n\n <!-- Main Content Area: Table + Sidebar -->\n <div class=\"content-area\">\n <!-- Entity Sync Table -->\n <div class=\"sync-table-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-table-list\"></i>\n Entity Sync Status\n </h3>\n <div class=\"panel-actions\">\n <button class=\"suggest-btn\" (click)=\"OpenSuggestDialog()\" title=\"Use AI to suggest an Entity Document template\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span class=\"suggest-btn-text\">Suggest Document</span>\n </button>\n <button class=\"refresh-btn\" (click)=\"LoadData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n @if (SyncRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No entity documents configured for vectorization.</p>\n </div>\n } @else {\n <div class=\"table-wrapper\">\n <table class=\"sync-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Document</th>\n <th class=\"text-right\">Vectors</th>\n <th>Last Synced</th>\n <th>Status</th>\n <th class=\"text-center\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of SyncRows; track row.EntityDocumentID) {\n <tr>\n <td class=\"entity-name\">{{ row.EntityName }}</td>\n <td class=\"document-name\">{{ row.DocumentName }}</td>\n <td class=\"text-right vector-count\">{{ row.VectorCount | number }}</td>\n <td class=\"last-synced\">{{ FormatDate(row.LastSynced) }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"GetStatusClass(row.Status)\">\n <i [class]=\"GetStatusIcon(row.Status)\"></i>\n @if (row.Status === 'Syncing' && row.PercentComplete > 0) {\n {{ row.PercentComplete }}%\n } @else {\n {{ row.Status }}\n }\n </span>\n </td>\n <td class=\"text-center actions-cell\">\n <button\n class=\"sync-btn\"\n [disabled]=\"SyncingIds.has(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (SyncingIds.has(row.EntityDocumentID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ row.PercentComplete > 0 ? row.PercentComplete + '%' : 'Sync' }}\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Sync\n }\n </button>\n <button\n class=\"edit-btn\"\n (click)=\"OpenEditPanel(row.EntityDocumentID)\"\n title=\"Edit entity document\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- Sidebar Panels -->\n <div class=\"sidebar\">\n <!-- Vector DB Health -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-heart-pulse\"></i>\n Vector DB Health\n </h4>\n <div class=\"health-row\">\n <span class=\"health-dot\" [class]=\"DBHealthClass\"></span>\n <span class=\"health-label\">{{ VectorDBName }}</span>\n </div>\n <div class=\"health-status\">{{ VectorDBStatus }}</div>\n </div>\n\n <!-- Embedding Model Info -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Embedding Model\n </h4>\n <div class=\"model-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">{{ EmbeddingModel.Name }}</span>\n </div>\n @if (EmbeddingModel.Dimensions != null) {\n <div class=\"info-row\">\n <span class=\"info-label\">Dimensions</span>\n <span class=\"info-value\">{{ EmbeddingModel.Dimensions | number }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Storage Usage -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n Vectorization Coverage\n </h4>\n <div class=\"gauge-container\">\n <div class=\"gauge-bar\">\n <div class=\"gauge-fill\" [style.width.%]=\"StorageUsagePercent\"></div>\n </div>\n <div class=\"gauge-label\">{{ StorageLabel }} of records vectorized</div>\n </div>\n <div class=\"storage-detail\">\n {{ TotalVectors | number }} vectors stored\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Edit Entity Document Slide-in Panel -->\n @if (ShowEditPanel) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseEditPanel()\">\n <div class=\"slide-panel open\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit Entity Document\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <span class=\"edit-readonly-value\">{{ EditDocEntityName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"EditDocName\" />\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocAIModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (EditFilteredIndexes.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of EditFilteredIndexes; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes for this database \u2014 one will be created automatically on sync\n </span>\n }\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Status</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocStatus\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (IsEditSaving || IsEditDeleting) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveEditedDocument()\">\n <i class=\"fa-solid fa-save\"></i> Save Changes\n </button>\n <button class=\"edit-delete-btn\" (click)=\"DeleteEntityDocument()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Suggest Document Slide-in Panel -->\n @if (ShowSuggestDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseSuggestDialog()\">\n <div class=\"slide-panel\" [class.open]=\"ShowSuggestDialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n AI Document Suggestion\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseSuggestDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n @if (!SuggestionResult) {\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <div class=\"entity-picker\">\n <button class=\"entity-picker-trigger\" (click)=\"ToggleEntityPicker()\">\n @if (SuggestEntityName) {\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"entity-picker-value\">{{ SuggestEntityName }}</span>\n } @else {\n <i class=\"fa-solid fa-search\"></i>\n <span class=\"entity-picker-placeholder\">Search and select an entity...</span>\n }\n <i class=\"fa-solid fa-chevron-down entity-picker-arrow\"></i>\n </button>\n @if (ShowEntityPicker) {\n <div class=\"entity-picker-dropdown\">\n <div class=\"entity-picker-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n class=\"entity-picker-search-input\"\n placeholder=\"Filter entities...\"\n [(ngModel)]=\"EntitySearchText\"\n (input)=\"FilterEntities()\"\n autofocus />\n </div>\n <div class=\"entity-picker-list\">\n @for (group of FilteredEntityGroups; track group.SchemaName) {\n <div class=\"entity-picker-group\">\n <div class=\"entity-picker-group-header\">\n <i class=\"fa-solid fa-database\"></i>\n {{ group.SchemaName }}\n </div>\n @for (entity of group.Entities; track entity.ID) {\n <button class=\"entity-picker-item\"\n [class.entity-picker-item-selected]=\"entity.Name === SuggestEntityName\"\n (click)=\"SelectEntity(entity.Name)\">\n <i class=\"fa-solid fa-table\"></i>\n {{ entity.Name }}\n </button>\n }\n </div>\n }\n @if (FilteredEntityGroups.length === 0) {\n <div class=\"entity-picker-empty\">\n No entities matching \"{{ EntitySearchText }}\"\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Use Case</label>\n <div class=\"use-case-options\">\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'duplicate detection'\"\n (click)=\"SuggestUseCase = 'duplicate detection'\">\n <i class=\"fa-solid fa-clone\"></i>\n Duplicate Detection\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'search'\"\n (click)=\"SuggestUseCase = 'search'\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n Search\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'classification'\"\n (click)=\"SuggestUseCase = 'classification'\">\n <i class=\"fa-solid fa-tags\"></i>\n Classification\n </button>\n </div>\n </div>\n <button class=\"suggest-submit-btn\"\n [disabled]=\"IsSuggesting || !SuggestEntityName\"\n (click)=\"RunSuggestion()\">\n @if (IsSuggesting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating with AI...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Generate Template\n }\n </button>\n @if (SuggestionError) {\n <div class=\"suggestion-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ SuggestionError }}\n </div>\n }\n </div>\n } @else {\n <div class=\"suggest-result\">\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Suggested Template</h4>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditableTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Selected Fields</h4>\n <div class=\"result-tags\">\n @for (field of SuggestionResult.selectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n @if (SuggestionResult.selectedRelationships.length > 0) {\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Related Entities</h4>\n @for (rel of SuggestionResult.selectedRelationships; track rel.name) {\n <div class=\"result-relationship\">\n <span class=\"rel-name\">{{ rel.name }}</span>\n <span class=\"rel-fields\">{{ rel.fields.join(', ') }}</span>\n </div>\n }\n </div>\n }\n <div class=\"result-section result-thresholds\">\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Potential Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.potentialMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Absolute Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.absoluteMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Reasoning</h4>\n <p class=\"result-reasoning\">{{ SuggestionResult.reasoning }}</p>\n </div>\n <div class=\"result-section\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"SaveDocumentName\" />\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedEmbeddingModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (FilteredIndexesForSelectedDB.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of FilteredIndexesForSelectedDB; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync\n </span>\n }\n </div>\n </div>\n <div class=\"result-actions\">\n @if (IsSavingDocument) {\n <div class=\"save-spinner\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveAsEntityDocument()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Entity Document\n </button>\n <button class=\"suggest-submit-btn suggest-try-again-btn\" (click)=\"ClearSuggestion()\">\n <i class=\"fa-solid fa-rotate\"></i> Try Again\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseSuggestDialog()\">\n Close\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n}\n", styles: ["/* ================================================================\n Vector Management Dashboard\n All colors use MJ design tokens from _tokens.scss\n ================================================================ */\n\n/* --- Loading state --- */\n.vector-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n/* --- View Mode Toggle --- */\n.view-mode-toggle {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* --- Dashboard container --- */\n.vector-dashboard {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n/* --- KPI cards row --- */\n.kpi-row {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Main content: table + sidebar --- */\n.content-area {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Sync table panel --- */\n.sync-table-panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Empty state --- */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state i {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n/* --- Table --- */\n.table-wrapper {\n overflow-x: auto;\n}\n\n.sync-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table th {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.text-right {\n text-align: right;\n}\n\n.text-center {\n text-align: center;\n}\n\n.entity-name {\n font-weight: 600;\n}\n\n.document-name {\n color: var(--mj-text-secondary);\n}\n\n.vector-count {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n/* --- Action buttons in table --- */\n\n.actions-cell {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.edit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.edit-delete-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n/* --- Status badges --- */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n/* --- Sync button --- */\n.sync-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ================================================================\n Sidebar\n ================================================================ */\n.sidebar {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title i {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n/* --- Vector DB Health --- */\n.health-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n/* --- Model Info --- */\n.model-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* --- Storage / Coverage Gauge --- */\n.gauge-container {\n margin-bottom: 8px;\n}\n\n.gauge-bar {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* --- Panel actions row --- */\n.panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* --- Suggest Document Button --- */\n.suggest-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* --- Slide-in Panel Overlay --- */\n.slide-panel-overlay {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open {\n transform: translateX(0);\n}\n\n.suggest-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title i {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body {\n padding: 24px;\n}\n\n/* --- Suggest Form --- */\n.suggest-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ---- Use Case Button Group ---- */\n\n.use-case-options {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn i {\n font-size: 12px;\n}\n\n/* ---- Entity Picker (grouped by schema) ---- */\n\n.entity-picker {\n position: relative;\n}\n\n.entity-picker-trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search i {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header i {\n font-size: 10px;\n}\n\n.entity-picker-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item i {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected i {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n/* ---- Template Editor ---- */\n\n.template-editor-wrapper {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper ::ng-deep .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error i {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* --- Suggestion Result --- */\n.suggest-result {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section:last-child {\n border-bottom: none;\n}\n\n.result-heading {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* --- Suggest Input --- */\n.suggest-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* --- Try Again Button (secondary style) --- */\n.suggest-try-again-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* --- Save Spinner --- */\n.save-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n/* ================================================================\n Responsive \u2014 Vector Management\n ================================================================ */\n\n@media (max-width: 768px) {\n .panel-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard {\n padding: 12px;\n }\n\n .suggest-btn .suggest-btn-text {\n display: none;\n }\n}\n"] }]
|
|
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"] }]
|
|
1760
2223
|
}], null, { EmbeddedMode: [{
|
|
1761
2224
|
type: Input
|
|
2225
|
+
}], entitySearchInput: [{
|
|
2226
|
+
type: ViewChild,
|
|
2227
|
+
args: ['entitySearchInput']
|
|
1762
2228
|
}] }); })();
|
|
1763
|
-
(() => { (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 }); })();
|
|
1764
2230
|
export function LoadVectorManagementResource() {
|
|
1765
2231
|
// Prevents tree-shaking
|
|
1766
2232
|
}
|