@memberjunction/ng-dashboards 5.34.1 → 5.35.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 +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +399 -292
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +75 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +400 -89
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +990 -992
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +17 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +370 -425
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +317 -357
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +403 -362
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +781 -783
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +6 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +79 -30
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +196 -142
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/index.d.ts +0 -1
- package/dist/Actions/components/explorer/index.d.ts.map +1 -1
- package/dist/Actions/components/explorer/index.js +0 -1
- package/dist/Actions/components/explorer/index.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +32 -40
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +32 -40
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +32 -40
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.js +24 -5
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +80 -99
- 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 +127 -106
- 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 +44 -45
- 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 +60 -58
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +139 -162
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +6 -0
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +521 -485
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +8 -0
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +309 -318
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +866 -847
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +182 -163
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +241 -241
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +1 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +28 -1
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +486 -532
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +152 -160
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -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 +302 -319
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +234 -246
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +1248 -1338
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +1 -1
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +34 -1
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.js +76 -85
- package/dist/Permissions/audit-log-resource.component.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +64 -69
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +63 -74
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +773 -783
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +420 -393
- package/dist/Testing/components/testing-analytics.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 +16 -19
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +587 -608
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +9 -12
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +3 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +310 -274
- package/dist/Testing/components/testing-review.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 +16 -19
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts +3 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +307 -273
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +107 -93
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +185 -188
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +154 -184
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +350 -354
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +163 -169
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/actions-dashboards.module.d.ts +15 -16
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +34 -11
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +45 -48
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +36 -10
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +2 -1
- package/dist/archiving-dashboards.module.d.ts.map +1 -1
- package/dist/archiving-dashboards.module.js +12 -2
- package/dist/archiving-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +2 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +24 -3
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +31 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +1 -1
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +28 -1
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +1 -1
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +28 -1
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -3
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +1 -1
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +31 -1
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +8 -7
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +30 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +52 -52
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
|
@@ -23,701 +23,725 @@ import * as i0 from "@angular/core";
|
|
|
23
23
|
import * as i1 from "@angular/forms";
|
|
24
24
|
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
25
25
|
import * as i3 from "@memberjunction/ng-search";
|
|
26
|
-
import * as i4 from "
|
|
27
|
-
import * as i5 from "
|
|
26
|
+
import * as i4 from "@memberjunction/ng-ui-components";
|
|
27
|
+
import * as i5 from "../scheduling/scheduling-resource.component";
|
|
28
|
+
import * as i6 from "@angular/common";
|
|
28
29
|
const _forTrack0 = ($index, $item) => $item.ID;
|
|
29
30
|
const _forTrack1 = ($index, $item) => $item.EntityName;
|
|
30
31
|
const _forTrack2 = ($index, $item) => $item.ScopeID;
|
|
31
32
|
const _forTrack3 = ($index, $item) => $item.Reranker;
|
|
32
33
|
const _forTrack4 = ($index, $item) => $item.Reason;
|
|
33
|
-
function
|
|
34
|
-
i0.ɵɵ
|
|
35
|
-
i0.ɵɵelement(1, "mj-loading", 2);
|
|
36
|
-
i0.ɵɵelementEnd();
|
|
34
|
+
function KnowledgeConfigResourceComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
35
|
+
i0.ɵɵelement(0, "mj-stat-badge", 2);
|
|
37
36
|
} }
|
|
38
|
-
function
|
|
37
|
+
function KnowledgeConfigResourceComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
39
38
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
40
|
-
i0.ɵɵelementStart(0, "button",
|
|
41
|
-
i0.ɵɵlistener("click", function
|
|
39
|
+
i0.ɵɵelementStart(0, "button", 7);
|
|
40
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ResetConfiguration()); });
|
|
41
|
+
i0.ɵɵelement(1, "i", 8);
|
|
42
|
+
i0.ɵɵtext(2, " Reset ");
|
|
43
|
+
i0.ɵɵelementEnd();
|
|
44
|
+
i0.ɵɵelementStart(3, "button", 9);
|
|
45
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_5_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SaveConfiguration()); });
|
|
46
|
+
i0.ɵɵelement(4, "i", 10);
|
|
47
|
+
i0.ɵɵtext(5);
|
|
48
|
+
i0.ɵɵelementEnd();
|
|
49
|
+
} if (rf & 2) {
|
|
50
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
51
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
52
|
+
i0.ɵɵadvance(3);
|
|
53
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
54
|
+
i0.ɵɵadvance(2);
|
|
55
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.IsSaving ? "Saving\u2026" : "Save", " ");
|
|
56
|
+
} }
|
|
57
|
+
function KnowledgeConfigResourceComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
58
|
+
i0.ɵɵelementStart(0, "div", 5);
|
|
59
|
+
i0.ɵɵelement(1, "mj-loading", 11);
|
|
60
|
+
i0.ɵɵelementEnd();
|
|
61
|
+
} }
|
|
62
|
+
function KnowledgeConfigResourceComponent_Conditional_8_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
63
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
64
|
+
i0.ɵɵelementStart(0, "button", 20);
|
|
65
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_For_7_Template_button_click_0_listener() { const section_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SelectSection(section_r4.ID)); });
|
|
42
66
|
i0.ɵɵelement(1, "i");
|
|
43
67
|
i0.ɵɵelementStart(2, "span");
|
|
44
68
|
i0.ɵɵtext(3);
|
|
45
69
|
i0.ɵɵelementEnd()();
|
|
46
70
|
} if (rf & 2) {
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
i0.ɵɵclassProp("config-nav-item-active",
|
|
71
|
+
const section_r4 = ctx.$implicit;
|
|
72
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
73
|
+
i0.ɵɵclassProp("config-nav-item-active", ctx_r1.ActiveSection === section_r4.ID);
|
|
50
74
|
i0.ɵɵadvance();
|
|
51
|
-
i0.ɵɵclassMap(
|
|
75
|
+
i0.ɵɵclassMap(section_r4.Icon);
|
|
52
76
|
i0.ɵɵadvance(2);
|
|
53
|
-
i0.ɵɵtextInterpolate(
|
|
77
|
+
i0.ɵɵtextInterpolate(section_r4.Label);
|
|
54
78
|
} }
|
|
55
|
-
function
|
|
56
|
-
const
|
|
57
|
-
i0.ɵɵelementStart(0, "div",
|
|
79
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
80
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
81
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "h2", 21);
|
|
58
82
|
i0.ɵɵtext(2, "Pipeline Settings");
|
|
59
83
|
i0.ɵɵelementEnd();
|
|
60
|
-
i0.ɵɵelementStart(3, "p",
|
|
84
|
+
i0.ɵɵelementStart(3, "p", 22);
|
|
61
85
|
i0.ɵɵtext(4, "Configure how the Knowledge Pipeline processes incoming content.");
|
|
62
86
|
i0.ɵɵelementEnd();
|
|
63
|
-
i0.ɵɵelementStart(5, "div",
|
|
87
|
+
i0.ɵɵelementStart(5, "div", 23)(6, "label", 24)(7, "div", 25)(8, "span", 26);
|
|
64
88
|
i0.ɵɵtext(9, "Auto-tag on Ingest");
|
|
65
89
|
i0.ɵɵelementEnd();
|
|
66
|
-
i0.ɵɵelementStart(10, "span",
|
|
90
|
+
i0.ɵɵelementStart(10, "span", 27);
|
|
67
91
|
i0.ɵɵtext(11, "Automatically run autotagging when new content is ingested");
|
|
68
92
|
i0.ɵɵelementEnd()();
|
|
69
|
-
i0.ɵɵelementStart(12, "input",
|
|
70
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
71
|
-
i0.ɵɵlistener("change", function
|
|
93
|
+
i0.ɵɵelementStart(12, "input", 28);
|
|
94
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.AutotagOnIngest, $event) || (ctx_r1.PipelineSettings.AutotagOnIngest = $event); return i0.ɵɵresetView($event); });
|
|
95
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_change_12_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
72
96
|
i0.ɵɵelementEnd()();
|
|
73
|
-
i0.ɵɵelementStart(13, "label",
|
|
97
|
+
i0.ɵɵelementStart(13, "label", 24)(14, "div", 25)(15, "span", 26);
|
|
74
98
|
i0.ɵɵtext(16, "Vectorize on Ingest");
|
|
75
99
|
i0.ɵɵelementEnd();
|
|
76
|
-
i0.ɵɵelementStart(17, "span",
|
|
100
|
+
i0.ɵɵelementStart(17, "span", 27);
|
|
77
101
|
i0.ɵɵtext(18, "Automatically create embeddings for new content");
|
|
78
102
|
i0.ɵɵelementEnd()();
|
|
79
|
-
i0.ɵɵelementStart(19, "input",
|
|
80
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
81
|
-
i0.ɵɵlistener("change", function
|
|
103
|
+
i0.ɵɵelementStart(19, "input", 28);
|
|
104
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.VectorizeOnIngest, $event) || (ctx_r1.PipelineSettings.VectorizeOnIngest = $event); return i0.ɵɵresetView($event); });
|
|
105
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_change_19_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
82
106
|
i0.ɵɵelementEnd()();
|
|
83
|
-
i0.ɵɵelementStart(20, "div",
|
|
107
|
+
i0.ɵɵelementStart(20, "div", 29)(21, "div", 30)(22, "span", 26);
|
|
84
108
|
i0.ɵɵtext(23, "Default Batch Size");
|
|
85
109
|
i0.ɵɵelementEnd();
|
|
86
|
-
i0.ɵɵelementStart(24, "span",
|
|
110
|
+
i0.ɵɵelementStart(24, "span", 27);
|
|
87
111
|
i0.ɵɵtext(25, "Number of items processed per batch");
|
|
88
112
|
i0.ɵɵelementEnd()();
|
|
89
|
-
i0.ɵɵelementStart(26, "input",
|
|
90
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
91
|
-
i0.ɵɵlistener("input", function
|
|
113
|
+
i0.ɵɵelementStart(26, "input", 31);
|
|
114
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_26_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.DefaultBatchSize, $event) || (ctx_r1.PipelineSettings.DefaultBatchSize = $event); return i0.ɵɵresetView($event); });
|
|
115
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_26_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
92
116
|
i0.ɵɵelementEnd()();
|
|
93
|
-
i0.ɵɵelementStart(27, "div",
|
|
117
|
+
i0.ɵɵelementStart(27, "div", 29)(28, "div", 30)(29, "span", 26);
|
|
94
118
|
i0.ɵɵtext(30, "Max Concurrent Jobs");
|
|
95
119
|
i0.ɵɵelementEnd();
|
|
96
|
-
i0.ɵɵelementStart(31, "span",
|
|
120
|
+
i0.ɵɵelementStart(31, "span", 27);
|
|
97
121
|
i0.ɵɵtext(32, "Maximum number of pipeline jobs running at once");
|
|
98
122
|
i0.ɵɵelementEnd()();
|
|
99
|
-
i0.ɵɵelementStart(33, "input",
|
|
100
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
101
|
-
i0.ɵɵlistener("input", function
|
|
123
|
+
i0.ɵɵelementStart(33, "input", 32);
|
|
124
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.MaxConcurrentJobs, $event) || (ctx_r1.PipelineSettings.MaxConcurrentJobs = $event); return i0.ɵɵresetView($event); });
|
|
125
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_33_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
102
126
|
i0.ɵɵelementEnd()()()();
|
|
103
127
|
} if (rf & 2) {
|
|
104
|
-
const
|
|
128
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
105
129
|
i0.ɵɵadvance(12);
|
|
106
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
130
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.AutotagOnIngest);
|
|
107
131
|
i0.ɵɵadvance(7);
|
|
108
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
132
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.VectorizeOnIngest);
|
|
109
133
|
i0.ɵɵadvance(7);
|
|
110
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
134
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.DefaultBatchSize);
|
|
111
135
|
i0.ɵɵadvance(7);
|
|
112
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
136
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.MaxConcurrentJobs);
|
|
113
137
|
} }
|
|
114
|
-
function
|
|
115
|
-
i0.ɵɵelement(0, "i",
|
|
138
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
139
|
+
i0.ɵɵelement(0, "i", 42);
|
|
116
140
|
} }
|
|
117
|
-
function
|
|
118
|
-
i0.ɵɵelementStart(0, "span",
|
|
141
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
142
|
+
i0.ɵɵelementStart(0, "span", 43);
|
|
119
143
|
i0.ɵɵtext(1, "1");
|
|
120
144
|
i0.ɵɵelementEnd();
|
|
121
145
|
} }
|
|
122
|
-
function
|
|
123
|
-
i0.ɵɵelementStart(0, "span",
|
|
146
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
147
|
+
i0.ɵɵelementStart(0, "span", 46);
|
|
124
148
|
i0.ɵɵtext(1);
|
|
125
149
|
i0.ɵɵelementEnd();
|
|
126
150
|
} if (rf & 2) {
|
|
127
|
-
const
|
|
151
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
128
152
|
i0.ɵɵadvance();
|
|
129
|
-
i0.ɵɵtextInterpolate1("",
|
|
153
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.VectorDBProviders.length, " provider(s) registered");
|
|
130
154
|
} }
|
|
131
|
-
function
|
|
132
|
-
i0.ɵɵelementStart(0, "span",
|
|
155
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
156
|
+
i0.ɵɵelementStart(0, "span", 46);
|
|
133
157
|
i0.ɵɵtext(1, "No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.");
|
|
134
158
|
i0.ɵɵelementEnd();
|
|
135
159
|
} }
|
|
136
|
-
function
|
|
137
|
-
i0.ɵɵelementStart(0, "option",
|
|
160
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_For_20_Template(rf, ctx) { if (rf & 1) {
|
|
161
|
+
i0.ɵɵelementStart(0, "option", 62);
|
|
138
162
|
i0.ɵɵtext(1);
|
|
139
163
|
i0.ɵɵelementEnd();
|
|
140
164
|
} if (rf & 2) {
|
|
141
|
-
const
|
|
142
|
-
i0.ɵɵproperty("ngValue",
|
|
165
|
+
const cred_r8 = ctx.$implicit;
|
|
166
|
+
i0.ɵɵproperty("ngValue", cred_r8.ID);
|
|
143
167
|
i0.ɵɵadvance();
|
|
144
|
-
i0.ɵɵtextInterpolate(
|
|
168
|
+
i0.ɵɵtextInterpolate(cred_r8.Name);
|
|
145
169
|
} }
|
|
146
|
-
function
|
|
147
|
-
i0.ɵɵelement(0, "i",
|
|
170
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
171
|
+
i0.ɵɵelement(0, "i", 63);
|
|
148
172
|
} }
|
|
149
|
-
function
|
|
150
|
-
const
|
|
151
|
-
i0.ɵɵelementStart(0, "div",
|
|
152
|
-
i0.ɵɵelement(2, "i",
|
|
173
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
174
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
175
|
+
i0.ɵɵelementStart(0, "div", 50)(1, "div", 51);
|
|
176
|
+
i0.ɵɵelement(2, "i", 52);
|
|
153
177
|
i0.ɵɵelementEnd();
|
|
154
|
-
i0.ɵɵelementStart(3, "div",
|
|
178
|
+
i0.ɵɵelementStart(3, "div", 53)(4, "span", 54);
|
|
155
179
|
i0.ɵɵtext(5);
|
|
156
180
|
i0.ɵɵelementEnd();
|
|
157
|
-
i0.ɵɵelementStart(6, "span",
|
|
181
|
+
i0.ɵɵelementStart(6, "span", 55);
|
|
158
182
|
i0.ɵɵtext(7);
|
|
159
183
|
i0.ɵɵelementEnd()();
|
|
160
|
-
i0.ɵɵelementStart(8, "span",
|
|
161
|
-
i0.ɵɵelement(9, "i",
|
|
184
|
+
i0.ɵɵelementStart(8, "span", 56);
|
|
185
|
+
i0.ɵɵelement(9, "i", 42);
|
|
162
186
|
i0.ɵɵtext(10, " Active ");
|
|
163
187
|
i0.ɵɵelementEnd()();
|
|
164
|
-
i0.ɵɵelementStart(11, "div",
|
|
165
|
-
i0.ɵɵelement(13, "i",
|
|
188
|
+
i0.ɵɵelementStart(11, "div", 57)(12, "label", 58);
|
|
189
|
+
i0.ɵɵelement(13, "i", 59);
|
|
166
190
|
i0.ɵɵtext(14, " API Credential ");
|
|
167
191
|
i0.ɵɵelementEnd();
|
|
168
|
-
i0.ɵɵelementStart(15, "div",
|
|
169
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
170
|
-
i0.ɵɵlistener("change", function
|
|
171
|
-
i0.ɵɵelementStart(17, "option",
|
|
192
|
+
i0.ɵɵelementStart(15, "div", 60)(16, "select", 61);
|
|
193
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_Template_select_ngModelChange_16_listener($event) { const provider_r7 = i0.ɵɵrestoreView(_r6).$implicit; i0.ɵɵtwoWayBindingSet(provider_r7.CredentialID, $event) || (provider_r7.CredentialID = $event); return i0.ɵɵresetView($event); });
|
|
194
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_Template_select_change_16_listener() { const provider_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SaveProviderCredential(provider_r7)); });
|
|
195
|
+
i0.ɵɵelementStart(17, "option", 62);
|
|
172
196
|
i0.ɵɵtext(18, "None (use environment variable)");
|
|
173
197
|
i0.ɵɵelementEnd();
|
|
174
|
-
i0.ɵɵrepeaterCreate(19,
|
|
198
|
+
i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_For_20_Template, 2, 2, "option", 62, _forTrack0);
|
|
175
199
|
i0.ɵɵelementEnd();
|
|
176
|
-
i0.ɵɵconditionalCreate(21,
|
|
200
|
+
i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_Conditional_21_Template, 1, 0, "i", 63);
|
|
177
201
|
i0.ɵɵelementEnd()();
|
|
178
202
|
} if (rf & 2) {
|
|
179
|
-
const
|
|
180
|
-
const
|
|
203
|
+
const provider_r7 = ctx.$implicit;
|
|
204
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
181
205
|
i0.ɵɵadvance(5);
|
|
182
|
-
i0.ɵɵtextInterpolate(
|
|
206
|
+
i0.ɵɵtextInterpolate(provider_r7.Name);
|
|
183
207
|
i0.ɵɵadvance(2);
|
|
184
|
-
i0.ɵɵtextInterpolate(
|
|
208
|
+
i0.ɵɵtextInterpolate(provider_r7.ClassKey);
|
|
185
209
|
i0.ɵɵadvance(9);
|
|
186
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
187
|
-
i0.ɵɵproperty("disabled",
|
|
210
|
+
i0.ɵɵtwoWayProperty("ngModel", provider_r7.CredentialID);
|
|
211
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSavingCredential);
|
|
188
212
|
i0.ɵɵadvance();
|
|
189
213
|
i0.ɵɵproperty("ngValue", null);
|
|
190
214
|
i0.ɵɵadvance(2);
|
|
191
|
-
i0.ɵɵrepeater(
|
|
215
|
+
i0.ɵɵrepeater(ctx_r1.AvailableCredentials);
|
|
192
216
|
i0.ɵɵadvance(2);
|
|
193
|
-
i0.ɵɵconditional(
|
|
217
|
+
i0.ɵɵconditional(ctx_r1.IsSavingCredential ? 21 : -1);
|
|
194
218
|
} }
|
|
195
|
-
function
|
|
196
|
-
i0.ɵɵelementStart(0, "div",
|
|
197
|
-
i0.ɵɵrepeaterCreate(1,
|
|
219
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
220
|
+
i0.ɵɵelementStart(0, "div", 47);
|
|
221
|
+
i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_Template, 22, 6, null, null, _forTrack0);
|
|
198
222
|
i0.ɵɵelementEnd();
|
|
199
223
|
} if (rf & 2) {
|
|
200
|
-
const
|
|
224
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
201
225
|
i0.ɵɵadvance();
|
|
202
|
-
i0.ɵɵrepeater(
|
|
226
|
+
i0.ɵɵrepeater(ctx_r1.VectorDBProviders);
|
|
203
227
|
} }
|
|
204
|
-
function
|
|
205
|
-
i0.ɵɵelement(0, "i",
|
|
228
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
229
|
+
i0.ɵɵelement(0, "i", 42);
|
|
206
230
|
} }
|
|
207
|
-
function
|
|
208
|
-
i0.ɵɵelementStart(0, "span",
|
|
231
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
232
|
+
i0.ɵɵelementStart(0, "span", 43);
|
|
209
233
|
i0.ɵɵtext(1, "2");
|
|
210
234
|
i0.ɵɵelementEnd();
|
|
211
235
|
} }
|
|
212
|
-
function
|
|
213
|
-
i0.ɵɵelementStart(0, "span",
|
|
236
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
237
|
+
i0.ɵɵelementStart(0, "span", 46);
|
|
214
238
|
i0.ɵɵtext(1);
|
|
215
239
|
i0.ɵɵelementEnd();
|
|
216
240
|
} if (rf & 2) {
|
|
217
|
-
const
|
|
241
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
218
242
|
i0.ɵɵadvance();
|
|
219
|
-
i0.ɵɵtextInterpolate1("",
|
|
243
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.EmbeddingModels.length, " model(s) available");
|
|
220
244
|
} }
|
|
221
|
-
function
|
|
222
|
-
i0.ɵɵelementStart(0, "span",
|
|
245
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
246
|
+
i0.ɵɵelementStart(0, "span", 46);
|
|
223
247
|
i0.ɵɵtext(1, "No embedding models found. Configure at least one in the AI app > Models tab.");
|
|
224
248
|
i0.ɵɵelementEnd();
|
|
225
249
|
} }
|
|
226
|
-
function
|
|
227
|
-
i0.ɵɵelementStart(0, "span",
|
|
250
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_34_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
251
|
+
i0.ɵɵelementStart(0, "span", 65);
|
|
228
252
|
i0.ɵɵtext(1);
|
|
229
253
|
i0.ɵɵelementEnd();
|
|
230
254
|
} if (rf & 2) {
|
|
231
|
-
const
|
|
255
|
+
const model_r9 = ctx.$implicit;
|
|
232
256
|
i0.ɵɵadvance();
|
|
233
|
-
i0.ɵɵtextInterpolate(
|
|
257
|
+
i0.ɵɵtextInterpolate(model_r9.Name);
|
|
234
258
|
} }
|
|
235
|
-
function
|
|
236
|
-
i0.ɵɵelementStart(0, "div",
|
|
237
|
-
i0.ɵɵrepeaterCreate(2,
|
|
259
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
260
|
+
i0.ɵɵelementStart(0, "div", 47)(1, "div", 64);
|
|
261
|
+
i0.ɵɵrepeaterCreate(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_34_For_3_Template, 2, 1, "span", 65, _forTrack0);
|
|
238
262
|
i0.ɵɵelementEnd()();
|
|
239
263
|
} if (rf & 2) {
|
|
240
|
-
const
|
|
264
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
241
265
|
i0.ɵɵadvance(2);
|
|
242
|
-
i0.ɵɵrepeater(
|
|
266
|
+
i0.ɵɵrepeater(ctx_r1.EmbeddingModels);
|
|
243
267
|
} }
|
|
244
|
-
function
|
|
245
|
-
i0.ɵɵelement(0, "i",
|
|
268
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
269
|
+
i0.ɵɵelement(0, "i", 42);
|
|
246
270
|
} }
|
|
247
|
-
function
|
|
248
|
-
i0.ɵɵelementStart(0, "span",
|
|
271
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_39_Template(rf, ctx) { if (rf & 1) {
|
|
272
|
+
i0.ɵɵelementStart(0, "span", 43);
|
|
249
273
|
i0.ɵɵtext(1, "3");
|
|
250
274
|
i0.ɵɵelementEnd();
|
|
251
275
|
} }
|
|
252
|
-
function
|
|
253
|
-
i0.ɵɵelementStart(0, "span",
|
|
276
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_43_Template(rf, ctx) { if (rf & 1) {
|
|
277
|
+
i0.ɵɵelementStart(0, "span", 46);
|
|
254
278
|
i0.ɵɵtext(1);
|
|
255
279
|
i0.ɵɵelementEnd();
|
|
256
280
|
} if (rf & 2) {
|
|
257
|
-
const
|
|
281
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
258
282
|
i0.ɵɵadvance();
|
|
259
|
-
i0.ɵɵtextInterpolate1("",
|
|
283
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.VectorIndexes.length, " index(es) configured");
|
|
260
284
|
} }
|
|
261
|
-
function
|
|
262
|
-
i0.ɵɵelementStart(0, "span",
|
|
285
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
286
|
+
i0.ɵɵelementStart(0, "span", 46);
|
|
263
287
|
i0.ɵɵtext(1, "No indexes yet \u2014 create one below.");
|
|
264
288
|
i0.ɵɵelementEnd();
|
|
265
289
|
} }
|
|
266
|
-
function
|
|
267
|
-
i0.ɵɵelementStart(0, "span",
|
|
290
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
291
|
+
i0.ɵɵelementStart(0, "span", 46);
|
|
268
292
|
i0.ɵɵtext(1, "Complete steps 1 and 2 first.");
|
|
269
293
|
i0.ɵɵelementEnd();
|
|
270
294
|
} }
|
|
271
|
-
function
|
|
272
|
-
const
|
|
273
|
-
i0.ɵɵelementStart(0, "button",
|
|
274
|
-
i0.ɵɵlistener("click", function
|
|
275
|
-
i0.ɵɵelement(1, "i",
|
|
295
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
296
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
297
|
+
i0.ɵɵelementStart(0, "button", 66);
|
|
298
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_46_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenCreateIndexForm()); });
|
|
299
|
+
i0.ɵɵelement(1, "i", 67);
|
|
276
300
|
i0.ɵɵtext(2, " Create Index ");
|
|
277
301
|
i0.ɵɵelementEnd();
|
|
278
302
|
} }
|
|
279
|
-
function
|
|
280
|
-
const
|
|
281
|
-
i0.ɵɵelementStart(0, "div",
|
|
282
|
-
i0.ɵɵelement(2, "i",
|
|
303
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_47_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
304
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
305
|
+
i0.ɵɵelementStart(0, "div", 68)(1, "div", 69);
|
|
306
|
+
i0.ɵɵelement(2, "i", 70);
|
|
283
307
|
i0.ɵɵelementEnd();
|
|
284
|
-
i0.ɵɵelementStart(3, "div",
|
|
308
|
+
i0.ɵɵelementStart(3, "div", 71)(4, "span", 72);
|
|
285
309
|
i0.ɵɵtext(5);
|
|
286
310
|
i0.ɵɵelementEnd();
|
|
287
|
-
i0.ɵɵelementStart(6, "span",
|
|
288
|
-
i0.ɵɵelement(7, "i",
|
|
311
|
+
i0.ɵɵelementStart(6, "span", 73);
|
|
312
|
+
i0.ɵɵelement(7, "i", 52);
|
|
289
313
|
i0.ɵɵtext(8);
|
|
290
|
-
i0.ɵɵelement(9, "i",
|
|
314
|
+
i0.ɵɵelement(9, "i", 74);
|
|
291
315
|
i0.ɵɵtext(10);
|
|
292
316
|
i0.ɵɵelementEnd()();
|
|
293
|
-
i0.ɵɵelementStart(11, "div",
|
|
294
|
-
i0.ɵɵelement(13, "i",
|
|
317
|
+
i0.ɵɵelementStart(11, "div", 75)(12, "span", 56);
|
|
318
|
+
i0.ɵɵelement(13, "i", 42);
|
|
295
319
|
i0.ɵɵtext(14, " Active ");
|
|
296
320
|
i0.ɵɵelementEnd();
|
|
297
|
-
i0.ɵɵelementStart(15, "button",
|
|
298
|
-
i0.ɵɵlistener("click", function
|
|
299
|
-
i0.ɵɵelement(16, "i",
|
|
321
|
+
i0.ɵɵelementStart(15, "button", 76);
|
|
322
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_47_For_2_Template_button_click_15_listener() { const idx_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DeleteIndex(idx_r12.ID)); });
|
|
323
|
+
i0.ɵɵelement(16, "i", 77);
|
|
300
324
|
i0.ɵɵelementEnd()()();
|
|
301
325
|
} if (rf & 2) {
|
|
302
|
-
const
|
|
326
|
+
const idx_r12 = ctx.$implicit;
|
|
303
327
|
i0.ɵɵadvance(5);
|
|
304
|
-
i0.ɵɵtextInterpolate(
|
|
328
|
+
i0.ɵɵtextInterpolate(idx_r12.Name);
|
|
305
329
|
i0.ɵɵadvance(3);
|
|
306
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
330
|
+
i0.ɵɵtextInterpolate1(" ", idx_r12.VectorDatabase, " \u00A0\u00B7\u00A0 ");
|
|
307
331
|
i0.ɵɵadvance(2);
|
|
308
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
332
|
+
i0.ɵɵtextInterpolate1(" ", idx_r12.EmbeddingModel, " ");
|
|
309
333
|
} }
|
|
310
|
-
function
|
|
311
|
-
i0.ɵɵelementStart(0, "div",
|
|
312
|
-
i0.ɵɵrepeaterCreate(1,
|
|
334
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_47_Template(rf, ctx) { if (rf & 1) {
|
|
335
|
+
i0.ɵɵelementStart(0, "div", 47);
|
|
336
|
+
i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_47_For_2_Template, 17, 3, "div", 68, _forTrack0);
|
|
313
337
|
i0.ɵɵelementEnd();
|
|
314
338
|
} if (rf & 2) {
|
|
315
|
-
const
|
|
339
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
316
340
|
i0.ɵɵadvance();
|
|
317
|
-
i0.ɵɵrepeater(
|
|
341
|
+
i0.ɵɵrepeater(ctx_r1.VectorIndexes);
|
|
318
342
|
} }
|
|
319
|
-
function
|
|
320
|
-
i0.ɵɵelementStart(0, "option",
|
|
343
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_For_14_Template(rf, ctx) { if (rf & 1) {
|
|
344
|
+
i0.ɵɵelementStart(0, "option", 85);
|
|
321
345
|
i0.ɵɵtext(1);
|
|
322
346
|
i0.ɵɵelementEnd();
|
|
323
347
|
} if (rf & 2) {
|
|
324
|
-
const
|
|
325
|
-
i0.ɵɵproperty("value",
|
|
348
|
+
const db_r14 = ctx.$implicit;
|
|
349
|
+
i0.ɵɵproperty("value", db_r14.ID);
|
|
326
350
|
i0.ɵɵadvance();
|
|
327
|
-
i0.ɵɵtextInterpolate(
|
|
351
|
+
i0.ɵɵtextInterpolate(db_r14.Name);
|
|
328
352
|
} }
|
|
329
|
-
function
|
|
330
|
-
i0.ɵɵelementStart(0, "option",
|
|
353
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_For_20_Template(rf, ctx) { if (rf & 1) {
|
|
354
|
+
i0.ɵɵelementStart(0, "option", 85);
|
|
331
355
|
i0.ɵɵtext(1);
|
|
332
356
|
i0.ɵɵelementEnd();
|
|
333
357
|
} if (rf & 2) {
|
|
334
|
-
const
|
|
335
|
-
i0.ɵɵproperty("value",
|
|
358
|
+
const model_r15 = ctx.$implicit;
|
|
359
|
+
i0.ɵɵproperty("value", model_r15.ID);
|
|
336
360
|
i0.ɵɵadvance();
|
|
337
|
-
i0.ɵɵtextInterpolate(
|
|
361
|
+
i0.ɵɵtextInterpolate(model_r15.Name);
|
|
338
362
|
} }
|
|
339
|
-
function
|
|
340
|
-
i0.ɵɵelement(0, "i",
|
|
363
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
364
|
+
i0.ɵɵelement(0, "i", 89);
|
|
341
365
|
i0.ɵɵtext(1, " Creating... ");
|
|
342
366
|
} }
|
|
343
|
-
function
|
|
344
|
-
i0.ɵɵelement(0, "i",
|
|
367
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
368
|
+
i0.ɵɵelement(0, "i", 67);
|
|
345
369
|
i0.ɵɵtext(1, " Create Index ");
|
|
346
370
|
} }
|
|
347
|
-
function
|
|
348
|
-
const
|
|
349
|
-
i0.ɵɵelementStart(0, "div",
|
|
350
|
-
i0.ɵɵelement(2, "i",
|
|
371
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template(rf, ctx) { if (rf & 1) {
|
|
372
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
373
|
+
i0.ɵɵelementStart(0, "div", 49)(1, "h4", 78);
|
|
374
|
+
i0.ɵɵelement(2, "i", 79);
|
|
351
375
|
i0.ɵɵtext(3, " Create New Vector Index ");
|
|
352
376
|
i0.ɵɵelementEnd();
|
|
353
|
-
i0.ɵɵelementStart(4, "div",
|
|
377
|
+
i0.ɵɵelementStart(4, "div", 80)(5, "div", 81)(6, "label", 82);
|
|
354
378
|
i0.ɵɵtext(7, "Index Name");
|
|
355
379
|
i0.ɵɵelementEnd();
|
|
356
|
-
i0.ɵɵelementStart(8, "input",
|
|
357
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
380
|
+
i0.ɵɵelementStart(8, "input", 83);
|
|
381
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexName, $event) || (ctx_r1.NewIndexName = $event); return i0.ɵɵresetView($event); });
|
|
358
382
|
i0.ɵɵelementEnd()();
|
|
359
|
-
i0.ɵɵelementStart(9, "div",
|
|
383
|
+
i0.ɵɵelementStart(9, "div", 81)(10, "label", 82);
|
|
360
384
|
i0.ɵɵtext(11, "Vector Database");
|
|
361
385
|
i0.ɵɵelementEnd();
|
|
362
|
-
i0.ɵɵelementStart(12, "select",
|
|
363
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
364
|
-
i0.ɵɵrepeaterCreate(13,
|
|
386
|
+
i0.ɵɵelementStart(12, "select", 84);
|
|
387
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template_select_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexVectorDBID, $event) || (ctx_r1.NewIndexVectorDBID = $event); return i0.ɵɵresetView($event); });
|
|
388
|
+
i0.ɵɵrepeaterCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_For_14_Template, 2, 2, "option", 85, _forTrack0);
|
|
365
389
|
i0.ɵɵelementEnd()();
|
|
366
|
-
i0.ɵɵelementStart(15, "div",
|
|
390
|
+
i0.ɵɵelementStart(15, "div", 81)(16, "label", 82);
|
|
367
391
|
i0.ɵɵtext(17, "Embedding Model");
|
|
368
392
|
i0.ɵɵelementEnd();
|
|
369
|
-
i0.ɵɵelementStart(18, "select",
|
|
370
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
371
|
-
i0.ɵɵrepeaterCreate(19,
|
|
393
|
+
i0.ɵɵelementStart(18, "select", 84);
|
|
394
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template_select_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexEmbeddingModelID, $event) || (ctx_r1.NewIndexEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
|
|
395
|
+
i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_For_20_Template, 2, 2, "option", 85, _forTrack0);
|
|
372
396
|
i0.ɵɵelementEnd()()();
|
|
373
|
-
i0.ɵɵelementStart(21, "div",
|
|
374
|
-
i0.ɵɵlistener("click", function
|
|
375
|
-
i0.ɵɵconditionalCreate(23,
|
|
397
|
+
i0.ɵɵelementStart(21, "div", 86)(22, "button", 87);
|
|
398
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CreateIndex()); });
|
|
399
|
+
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Conditional_23_Template, 2, 0)(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Conditional_24_Template, 2, 0);
|
|
376
400
|
i0.ɵɵelementEnd();
|
|
377
|
-
i0.ɵɵelementStart(25, "button",
|
|
378
|
-
i0.ɵɵlistener("click", function
|
|
401
|
+
i0.ɵɵelementStart(25, "button", 88);
|
|
402
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CancelCreateIndex()); });
|
|
379
403
|
i0.ɵɵtext(26, " Cancel ");
|
|
380
404
|
i0.ɵɵelementEnd()()();
|
|
381
405
|
} if (rf & 2) {
|
|
382
|
-
const
|
|
406
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
383
407
|
i0.ɵɵadvance(8);
|
|
384
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
408
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewIndexName);
|
|
385
409
|
i0.ɵɵadvance(4);
|
|
386
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
410
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewIndexVectorDBID);
|
|
387
411
|
i0.ɵɵadvance();
|
|
388
|
-
i0.ɵɵrepeater(
|
|
412
|
+
i0.ɵɵrepeater(ctx_r1.VectorDBProviders);
|
|
389
413
|
i0.ɵɵadvance(5);
|
|
390
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
414
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewIndexEmbeddingModelID);
|
|
391
415
|
i0.ɵɵadvance();
|
|
392
|
-
i0.ɵɵrepeater(
|
|
416
|
+
i0.ɵɵrepeater(ctx_r1.EmbeddingModels);
|
|
393
417
|
i0.ɵɵadvance(3);
|
|
394
|
-
i0.ɵɵproperty("disabled",
|
|
418
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsCreatingIndex);
|
|
395
419
|
i0.ɵɵadvance();
|
|
396
|
-
i0.ɵɵconditional(
|
|
420
|
+
i0.ɵɵconditional(ctx_r1.IsCreatingIndex ? 23 : 24);
|
|
397
421
|
i0.ɵɵadvance(2);
|
|
398
|
-
i0.ɵɵproperty("disabled",
|
|
422
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsCreatingIndex);
|
|
399
423
|
} }
|
|
400
|
-
function
|
|
401
|
-
i0.ɵɵelementStart(0, "div",
|
|
424
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
425
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "h2", 21);
|
|
402
426
|
i0.ɵɵtext(2, "Vector Database");
|
|
403
427
|
i0.ɵɵelementEnd();
|
|
404
|
-
i0.ɵɵelementStart(3, "p",
|
|
428
|
+
i0.ɵɵelementStart(3, "p", 22);
|
|
405
429
|
i0.ɵɵtext(4, "Manage the shared vector index and database connection.");
|
|
406
430
|
i0.ɵɵelementEnd();
|
|
407
|
-
i0.ɵɵelementStart(5, "div",
|
|
431
|
+
i0.ɵɵelementStart(5, "div", 33)(6, "div", 34)(7, "span", 35);
|
|
408
432
|
i0.ɵɵtext(8, "Setup Progress");
|
|
409
433
|
i0.ɵɵelementEnd();
|
|
410
|
-
i0.ɵɵelementStart(9, "span",
|
|
434
|
+
i0.ɵɵelementStart(9, "span", 36);
|
|
411
435
|
i0.ɵɵtext(10);
|
|
412
436
|
i0.ɵɵelementEnd()();
|
|
413
|
-
i0.ɵɵelementStart(11, "div",
|
|
414
|
-
i0.ɵɵelement(12, "div",
|
|
437
|
+
i0.ɵɵelementStart(11, "div", 37);
|
|
438
|
+
i0.ɵɵelement(12, "div", 38);
|
|
415
439
|
i0.ɵɵelementEnd()();
|
|
416
|
-
i0.ɵɵelementStart(13, "div",
|
|
417
|
-
i0.ɵɵconditionalCreate(16,
|
|
440
|
+
i0.ɵɵelementStart(13, "div", 39)(14, "div", 40)(15, "div", 41);
|
|
441
|
+
i0.ɵɵconditionalCreate(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_16_Template, 1, 0, "i", 42)(17, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_17_Template, 2, 0, "span", 43);
|
|
418
442
|
i0.ɵɵelementEnd();
|
|
419
|
-
i0.ɵɵelementStart(18, "div",
|
|
443
|
+
i0.ɵɵelementStart(18, "div", 44)(19, "span", 45);
|
|
420
444
|
i0.ɵɵtext(20, "Vector Database Providers");
|
|
421
445
|
i0.ɵɵelementEnd();
|
|
422
|
-
i0.ɵɵconditionalCreate(21,
|
|
446
|
+
i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_21_Template, 2, 1, "span", 46)(22, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_22_Template, 2, 0, "span", 46);
|
|
423
447
|
i0.ɵɵelementEnd()();
|
|
424
|
-
i0.ɵɵconditionalCreate(23,
|
|
448
|
+
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_Template, 3, 0, "div", 47);
|
|
425
449
|
i0.ɵɵelementEnd();
|
|
426
|
-
i0.ɵɵelementStart(24, "div",
|
|
427
|
-
i0.ɵɵconditionalCreate(27,
|
|
450
|
+
i0.ɵɵelementStart(24, "div", 39)(25, "div", 40)(26, "div", 41);
|
|
451
|
+
i0.ɵɵconditionalCreate(27, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_27_Template, 1, 0, "i", 42)(28, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_28_Template, 2, 0, "span", 43);
|
|
428
452
|
i0.ɵɵelementEnd();
|
|
429
|
-
i0.ɵɵelementStart(29, "div",
|
|
453
|
+
i0.ɵɵelementStart(29, "div", 44)(30, "span", 45);
|
|
430
454
|
i0.ɵɵtext(31, "Embedding Models");
|
|
431
455
|
i0.ɵɵelementEnd();
|
|
432
|
-
i0.ɵɵconditionalCreate(32,
|
|
456
|
+
i0.ɵɵconditionalCreate(32, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_32_Template, 2, 1, "span", 46)(33, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_33_Template, 2, 0, "span", 46);
|
|
433
457
|
i0.ɵɵelementEnd()();
|
|
434
|
-
i0.ɵɵconditionalCreate(34,
|
|
458
|
+
i0.ɵɵconditionalCreate(34, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_34_Template, 4, 0, "div", 47);
|
|
435
459
|
i0.ɵɵelementEnd();
|
|
436
|
-
i0.ɵɵelementStart(35, "div",
|
|
437
|
-
i0.ɵɵconditionalCreate(38,
|
|
460
|
+
i0.ɵɵelementStart(35, "div", 39)(36, "div", 40)(37, "div", 41);
|
|
461
|
+
i0.ɵɵconditionalCreate(38, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_38_Template, 1, 0, "i", 42)(39, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_39_Template, 2, 0, "span", 43);
|
|
438
462
|
i0.ɵɵelementEnd();
|
|
439
|
-
i0.ɵɵelementStart(40, "div",
|
|
463
|
+
i0.ɵɵelementStart(40, "div", 44)(41, "span", 45);
|
|
440
464
|
i0.ɵɵtext(42, "Vector Indexes");
|
|
441
465
|
i0.ɵɵelementEnd();
|
|
442
|
-
i0.ɵɵconditionalCreate(43,
|
|
466
|
+
i0.ɵɵconditionalCreate(43, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_43_Template, 2, 1, "span", 46)(44, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_44_Template, 2, 0, "span", 46)(45, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_45_Template, 2, 0, "span", 46);
|
|
443
467
|
i0.ɵɵelementEnd();
|
|
444
|
-
i0.ɵɵconditionalCreate(46,
|
|
468
|
+
i0.ɵɵconditionalCreate(46, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_46_Template, 3, 0, "button", 48);
|
|
445
469
|
i0.ɵɵelementEnd();
|
|
446
|
-
i0.ɵɵconditionalCreate(47,
|
|
447
|
-
i0.ɵɵconditionalCreate(48,
|
|
470
|
+
i0.ɵɵconditionalCreate(47, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_47_Template, 3, 0, "div", 47);
|
|
471
|
+
i0.ɵɵconditionalCreate(48, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template, 27, 6, "div", 49);
|
|
448
472
|
i0.ɵɵelementEnd()();
|
|
449
473
|
} if (rf & 2) {
|
|
450
|
-
const
|
|
474
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
451
475
|
i0.ɵɵadvance(10);
|
|
452
|
-
i0.ɵɵtextInterpolate1("",
|
|
476
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.SetupStepsCompleted, " of 3 complete");
|
|
453
477
|
i0.ɵɵadvance(2);
|
|
454
|
-
i0.ɵɵstyleProp("width",
|
|
478
|
+
i0.ɵɵstyleProp("width", ctx_r1.SetupStepsCompleted / 3 * 100, "%");
|
|
455
479
|
i0.ɵɵadvance();
|
|
456
|
-
i0.ɵɵclassProp("setup-step-complete",
|
|
480
|
+
i0.ɵɵclassProp("setup-step-complete", ctx_r1.HasVectorDBProvider)("setup-step-pending", !ctx_r1.HasVectorDBProvider);
|
|
457
481
|
i0.ɵɵadvance(3);
|
|
458
|
-
i0.ɵɵconditional(
|
|
482
|
+
i0.ɵɵconditional(ctx_r1.HasVectorDBProvider ? 16 : 17);
|
|
459
483
|
i0.ɵɵadvance(5);
|
|
460
|
-
i0.ɵɵconditional(
|
|
484
|
+
i0.ɵɵconditional(ctx_r1.HasVectorDBProvider ? 21 : 22);
|
|
461
485
|
i0.ɵɵadvance(2);
|
|
462
|
-
i0.ɵɵconditional(
|
|
486
|
+
i0.ɵɵconditional(ctx_r1.HasVectorDBProvider ? 23 : -1);
|
|
463
487
|
i0.ɵɵadvance();
|
|
464
|
-
i0.ɵɵclassProp("setup-step-complete",
|
|
488
|
+
i0.ɵɵclassProp("setup-step-complete", ctx_r1.HasEmbeddingModel)("setup-step-pending", !ctx_r1.HasEmbeddingModel);
|
|
465
489
|
i0.ɵɵadvance(3);
|
|
466
|
-
i0.ɵɵconditional(
|
|
490
|
+
i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 27 : 28);
|
|
467
491
|
i0.ɵɵadvance(5);
|
|
468
|
-
i0.ɵɵconditional(
|
|
492
|
+
i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 32 : 33);
|
|
469
493
|
i0.ɵɵadvance(2);
|
|
470
|
-
i0.ɵɵconditional(
|
|
494
|
+
i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 34 : -1);
|
|
471
495
|
i0.ɵɵadvance();
|
|
472
|
-
i0.ɵɵclassProp("setup-step-complete",
|
|
496
|
+
i0.ɵɵclassProp("setup-step-complete", ctx_r1.HasVectorIndex)("setup-step-pending", !ctx_r1.HasVectorIndex);
|
|
473
497
|
i0.ɵɵadvance(3);
|
|
474
|
-
i0.ɵɵconditional(
|
|
498
|
+
i0.ɵɵconditional(ctx_r1.HasVectorIndex ? 38 : 39);
|
|
475
499
|
i0.ɵɵadvance(5);
|
|
476
|
-
i0.ɵɵconditional(
|
|
500
|
+
i0.ɵɵconditional(ctx_r1.HasVectorIndex ? 43 : ctx_r1.HasVectorDBProvider && ctx_r1.HasEmbeddingModel ? 44 : 45);
|
|
477
501
|
i0.ɵɵadvance(3);
|
|
478
|
-
i0.ɵɵconditional(
|
|
502
|
+
i0.ɵɵconditional(ctx_r1.HasVectorDBProvider && ctx_r1.HasEmbeddingModel && !ctx_r1.ShowCreateIndexForm ? 46 : -1);
|
|
479
503
|
i0.ɵɵadvance();
|
|
480
|
-
i0.ɵɵconditional(
|
|
504
|
+
i0.ɵɵconditional(ctx_r1.HasVectorIndex ? 47 : -1);
|
|
481
505
|
i0.ɵɵadvance();
|
|
482
|
-
i0.ɵɵconditional(
|
|
506
|
+
i0.ɵɵconditional(ctx_r1.ShowCreateIndexForm ? 48 : -1);
|
|
483
507
|
} }
|
|
484
|
-
function
|
|
485
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
508
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
509
|
+
i0.ɵɵelement(0, "mj-loading", 90);
|
|
486
510
|
} }
|
|
487
|
-
function
|
|
488
|
-
i0.ɵɵelementStart(0, "div",
|
|
489
|
-
i0.ɵɵelement(1, "i",
|
|
490
|
-
i0.ɵɵelementStart(2, "h3",
|
|
511
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
512
|
+
i0.ɵɵelementStart(0, "div", 91);
|
|
513
|
+
i0.ɵɵelement(1, "i", 92);
|
|
514
|
+
i0.ɵɵelementStart(2, "h3", 93);
|
|
491
515
|
i0.ɵɵtext(3, "No Searchable Entities Found");
|
|
492
516
|
i0.ɵɵelementEnd();
|
|
493
|
-
i0.ɵɵelementStart(4, "p",
|
|
517
|
+
i0.ɵɵelementStart(4, "p", 94);
|
|
494
518
|
i0.ɵɵtext(5, "No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.");
|
|
495
519
|
i0.ɵɵelementEnd()();
|
|
496
520
|
} }
|
|
497
|
-
function
|
|
498
|
-
i0.ɵɵelementStart(0, "span",
|
|
521
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
522
|
+
i0.ɵɵelementStart(0, "span", 106);
|
|
499
523
|
i0.ɵɵtext(1);
|
|
500
524
|
i0.ɵɵelementEnd();
|
|
501
525
|
} if (rf & 2) {
|
|
502
|
-
const
|
|
526
|
+
const field_r19 = ctx.$implicit;
|
|
503
527
|
i0.ɵɵadvance();
|
|
504
|
-
i0.ɵɵtextInterpolate(
|
|
528
|
+
i0.ɵɵtextInterpolate(field_r19);
|
|
505
529
|
} }
|
|
506
|
-
function
|
|
507
|
-
i0.ɵɵelementStart(0, "span",
|
|
508
|
-
i0.ɵɵelement(1, "i",
|
|
530
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
531
|
+
i0.ɵɵelementStart(0, "span", 110);
|
|
532
|
+
i0.ɵɵelement(1, "i", 111);
|
|
509
533
|
i0.ɵɵtext(2);
|
|
510
534
|
i0.ɵɵelementEnd();
|
|
511
535
|
} if (rf & 2) {
|
|
512
|
-
const
|
|
536
|
+
const entity_r18 = i0.ɵɵnextContext().$implicit;
|
|
513
537
|
i0.ɵɵadvance(2);
|
|
514
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
538
|
+
i0.ɵɵtextInterpolate1(" ", entity_r18.SnippetField, " ");
|
|
515
539
|
} }
|
|
516
|
-
function
|
|
517
|
-
const
|
|
518
|
-
i0.ɵɵelementStart(0, "div",
|
|
519
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
520
|
-
i0.ɵɵlistener("change", function
|
|
540
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
541
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
542
|
+
i0.ɵɵelementStart(0, "div", 101)(1, "div", 102)(2, "input", 28);
|
|
543
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_Template_input_ngModelChange_2_listener($event) { const entity_r18 = i0.ɵɵrestoreView(_r17).$implicit; i0.ɵɵtwoWayBindingSet(entity_r18.Enabled, $event) || (entity_r18.Enabled = $event); return i0.ɵɵresetView($event); });
|
|
544
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_Template_input_change_2_listener() { const entity_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnFTSEntityToggled(entity_r18)); });
|
|
521
545
|
i0.ɵɵelementEnd()();
|
|
522
|
-
i0.ɵɵelementStart(3, "div",
|
|
546
|
+
i0.ɵɵelementStart(3, "div", 103)(4, "span", 104);
|
|
523
547
|
i0.ɵɵtext(5);
|
|
524
548
|
i0.ɵɵelementEnd();
|
|
525
|
-
i0.ɵɵelementStart(6, "div",
|
|
526
|
-
i0.ɵɵrepeaterCreate(7,
|
|
549
|
+
i0.ɵɵelementStart(6, "div", 105);
|
|
550
|
+
i0.ɵɵrepeaterCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_For_8_Template, 2, 1, "span", 106, i0.ɵɵrepeaterTrackByIdentity);
|
|
527
551
|
i0.ɵɵelementEnd()();
|
|
528
|
-
i0.ɵɵelementStart(9, "div",
|
|
529
|
-
i0.ɵɵelement(11, "i",
|
|
552
|
+
i0.ɵɵelementStart(9, "div", 107)(10, "span", 108);
|
|
553
|
+
i0.ɵɵelement(11, "i", 109);
|
|
530
554
|
i0.ɵɵtext(12);
|
|
531
555
|
i0.ɵɵelementEnd();
|
|
532
|
-
i0.ɵɵconditionalCreate(13,
|
|
556
|
+
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_Conditional_13_Template, 3, 1, "span", 110);
|
|
533
557
|
i0.ɵɵelementEnd()();
|
|
534
558
|
} if (rf & 2) {
|
|
535
|
-
const
|
|
536
|
-
i0.ɵɵclassProp("fts-entity-enabled",
|
|
559
|
+
const entity_r18 = ctx.$implicit;
|
|
560
|
+
i0.ɵɵclassProp("fts-entity-enabled", entity_r18.Enabled);
|
|
537
561
|
i0.ɵɵadvance(2);
|
|
538
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
562
|
+
i0.ɵɵtwoWayProperty("ngModel", entity_r18.Enabled);
|
|
539
563
|
i0.ɵɵadvance(3);
|
|
540
|
-
i0.ɵɵtextInterpolate(
|
|
564
|
+
i0.ɵɵtextInterpolate(entity_r18.EntityName);
|
|
541
565
|
i0.ɵɵadvance(2);
|
|
542
|
-
i0.ɵɵrepeater(
|
|
566
|
+
i0.ɵɵrepeater(entity_r18.IndexedFields);
|
|
543
567
|
i0.ɵɵadvance(5);
|
|
544
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
568
|
+
i0.ɵɵtextInterpolate1(" ", entity_r18.TitleField, " ");
|
|
545
569
|
i0.ɵɵadvance();
|
|
546
|
-
i0.ɵɵconditional(
|
|
570
|
+
i0.ɵɵconditional(entity_r18.SnippetField !== entity_r18.TitleField ? 13 : -1);
|
|
547
571
|
} }
|
|
548
|
-
function
|
|
549
|
-
const
|
|
550
|
-
i0.ɵɵelementStart(0, "div",
|
|
572
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
573
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
574
|
+
i0.ɵɵelementStart(0, "div", 95)(1, "div", 96)(2, "span", 97);
|
|
551
575
|
i0.ɵɵtext(3);
|
|
552
576
|
i0.ɵɵelementEnd();
|
|
553
|
-
i0.ɵɵelementStart(4, "input",
|
|
554
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
577
|
+
i0.ɵɵelementStart(4, "input", 98);
|
|
578
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FTSFilterText, $event) || (ctx_r1.FTSFilterText = $event); return i0.ɵɵresetView($event); });
|
|
555
579
|
i0.ɵɵelementEnd()()();
|
|
556
|
-
i0.ɵɵelementStart(5, "div",
|
|
557
|
-
i0.ɵɵrepeaterCreate(6,
|
|
580
|
+
i0.ɵɵelementStart(5, "div", 99);
|
|
581
|
+
i0.ɵɵrepeaterCreate(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_Template, 14, 6, "div", 100, _forTrack1);
|
|
558
582
|
i0.ɵɵelementEnd();
|
|
559
583
|
} if (rf & 2) {
|
|
560
|
-
const
|
|
584
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
561
585
|
i0.ɵɵadvance(3);
|
|
562
|
-
i0.ɵɵtextInterpolate2("",
|
|
586
|
+
i0.ɵɵtextInterpolate2("", ctx_r1.EnabledFTSCount, " of ", ctx_r1.FTSEntities.length, " entities enabled for search");
|
|
563
587
|
i0.ɵɵadvance();
|
|
564
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
588
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.FTSFilterText);
|
|
565
589
|
i0.ɵɵadvance(2);
|
|
566
|
-
i0.ɵɵrepeater(
|
|
590
|
+
i0.ɵɵrepeater(ctx_r1.FilteredFTSEntities);
|
|
567
591
|
} }
|
|
568
|
-
function
|
|
569
|
-
i0.ɵɵelementStart(0, "div",
|
|
592
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
593
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "h2", 21);
|
|
570
594
|
i0.ɵɵtext(2, "Full-Text Search Entities");
|
|
571
595
|
i0.ɵɵelementEnd();
|
|
572
|
-
i0.ɵɵelementStart(3, "p",
|
|
596
|
+
i0.ɵɵelementStart(3, "p", 22);
|
|
573
597
|
i0.ɵɵtext(4, "Configure which entities are included in full-text search. Entities with text fields (Name, Description, etc.) are automatically discovered.");
|
|
574
598
|
i0.ɵɵelementEnd();
|
|
575
|
-
i0.ɵɵconditionalCreate(5,
|
|
599
|
+
i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_5_Template, 1, 0, "mj-loading", 90)(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_6_Template, 6, 0, "div", 91)(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_Template, 8, 3);
|
|
576
600
|
i0.ɵɵelementEnd();
|
|
577
601
|
} if (rf & 2) {
|
|
578
|
-
const
|
|
602
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
579
603
|
i0.ɵɵadvance(5);
|
|
580
|
-
i0.ɵɵconditional(
|
|
604
|
+
i0.ɵɵconditional(ctx_r1.IsLoadingFTSEntities ? 5 : ctx_r1.FTSEntities.length === 0 ? 6 : 7);
|
|
581
605
|
} }
|
|
582
|
-
function
|
|
583
|
-
i0.ɵɵelementStart(0, "span",
|
|
606
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_5_For_17_Template(rf, ctx) { if (rf & 1) {
|
|
607
|
+
i0.ɵɵelementStart(0, "span", 65);
|
|
584
608
|
i0.ɵɵtext(1);
|
|
585
609
|
i0.ɵɵelementEnd();
|
|
586
610
|
} if (rf & 2) {
|
|
587
|
-
const
|
|
611
|
+
const model_r20 = ctx.$implicit;
|
|
588
612
|
i0.ɵɵadvance();
|
|
589
|
-
i0.ɵɵtextInterpolate(
|
|
613
|
+
i0.ɵɵtextInterpolate(model_r20.Name);
|
|
590
614
|
} }
|
|
591
|
-
function
|
|
592
|
-
i0.ɵɵelementStart(0, "div",
|
|
615
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
616
|
+
i0.ɵɵelementStart(0, "div", 23)(1, "div", 29)(2, "div", 30)(3, "span", 26);
|
|
593
617
|
i0.ɵɵtext(4, "Active Model");
|
|
594
618
|
i0.ɵɵelementEnd();
|
|
595
|
-
i0.ɵɵelementStart(5, "span",
|
|
619
|
+
i0.ɵɵelementStart(5, "span", 27);
|
|
596
620
|
i0.ɵɵtext(6, "Currently selected embedding model");
|
|
597
621
|
i0.ɵɵelementEnd()();
|
|
598
|
-
i0.ɵɵelementStart(7, "span",
|
|
622
|
+
i0.ɵɵelementStart(7, "span", 112);
|
|
599
623
|
i0.ɵɵtext(8);
|
|
600
624
|
i0.ɵɵelementEnd()();
|
|
601
|
-
i0.ɵɵelementStart(9, "div",
|
|
625
|
+
i0.ɵɵelementStart(9, "div", 29)(10, "div", 30)(11, "span", 26);
|
|
602
626
|
i0.ɵɵtext(12, "Available Models");
|
|
603
627
|
i0.ɵɵelementEnd();
|
|
604
|
-
i0.ɵɵelementStart(13, "span",
|
|
628
|
+
i0.ɵɵelementStart(13, "span", 27);
|
|
605
629
|
i0.ɵɵtext(14);
|
|
606
630
|
i0.ɵɵelementEnd()();
|
|
607
|
-
i0.ɵɵelementStart(15, "div",
|
|
608
|
-
i0.ɵɵrepeaterCreate(16,
|
|
631
|
+
i0.ɵɵelementStart(15, "div", 64);
|
|
632
|
+
i0.ɵɵrepeaterCreate(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_5_For_17_Template, 2, 1, "span", 65, _forTrack0);
|
|
609
633
|
i0.ɵɵelementEnd()()();
|
|
610
|
-
i0.ɵɵelementStart(18, "p",
|
|
611
|
-
i0.ɵɵelement(19, "i",
|
|
634
|
+
i0.ɵɵelementStart(18, "p", 113);
|
|
635
|
+
i0.ɵɵelement(19, "i", 114);
|
|
612
636
|
i0.ɵɵtext(20, " Manage embedding models in the AI Dashboard > Models tab. ");
|
|
613
637
|
i0.ɵɵelementEnd();
|
|
614
638
|
} if (rf & 2) {
|
|
615
|
-
const
|
|
639
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
616
640
|
i0.ɵɵadvance(8);
|
|
617
|
-
i0.ɵɵtextInterpolate(
|
|
641
|
+
i0.ɵɵtextInterpolate(ctx_r1.EmbeddingModelName);
|
|
618
642
|
i0.ɵɵadvance(6);
|
|
619
|
-
i0.ɵɵtextInterpolate1("",
|
|
643
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.EmbeddingModels.length, " embedding model(s) configured");
|
|
620
644
|
i0.ɵɵadvance(2);
|
|
621
|
-
i0.ɵɵrepeater(
|
|
645
|
+
i0.ɵɵrepeater(ctx_r1.EmbeddingModels);
|
|
622
646
|
} }
|
|
623
|
-
function
|
|
624
|
-
i0.ɵɵelementStart(0, "div",
|
|
625
|
-
i0.ɵɵelement(1, "i",
|
|
626
|
-
i0.ɵɵelementStart(2, "h3",
|
|
647
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
648
|
+
i0.ɵɵelementStart(0, "div", 91);
|
|
649
|
+
i0.ɵɵelement(1, "i", 115);
|
|
650
|
+
i0.ɵɵelementStart(2, "h3", 93);
|
|
627
651
|
i0.ɵɵtext(3, "No Embedding Models Found");
|
|
628
652
|
i0.ɵɵelementEnd();
|
|
629
|
-
i0.ɵɵelementStart(4, "p",
|
|
653
|
+
i0.ɵɵelementStart(4, "p", 94);
|
|
630
654
|
i0.ɵɵtext(5, " Embedding models are required to convert text into vectors for semantic search and duplicate detection. Configure at least one embedding model (e.g., text-embedding-3-small) in the AI Dashboard > Models tab. ");
|
|
631
655
|
i0.ɵɵelementEnd()();
|
|
632
656
|
} }
|
|
633
|
-
function
|
|
634
|
-
i0.ɵɵelementStart(0, "div",
|
|
657
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
658
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "h2", 21);
|
|
635
659
|
i0.ɵɵtext(2, "Embedding Models");
|
|
636
660
|
i0.ɵɵelementEnd();
|
|
637
|
-
i0.ɵɵelementStart(3, "p",
|
|
661
|
+
i0.ɵɵelementStart(3, "p", 22);
|
|
638
662
|
i0.ɵɵtext(4, "AI models used for generating vector embeddings from text.");
|
|
639
663
|
i0.ɵɵelementEnd();
|
|
640
|
-
i0.ɵɵconditionalCreate(5,
|
|
664
|
+
i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_5_Template, 21, 2)(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_6_Template, 6, 0, "div", 91);
|
|
641
665
|
i0.ɵɵelementEnd();
|
|
642
666
|
} if (rf & 2) {
|
|
643
|
-
const
|
|
667
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
644
668
|
i0.ɵɵadvance(5);
|
|
645
|
-
i0.ɵɵconditional(
|
|
669
|
+
i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 5 : 6);
|
|
646
670
|
} }
|
|
647
|
-
function
|
|
648
|
-
const
|
|
649
|
-
i0.ɵɵelementStart(0, "div",
|
|
671
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
672
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
673
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "h2", 21);
|
|
650
674
|
i0.ɵɵtext(2, "Scoring Thresholds");
|
|
651
675
|
i0.ɵɵelementEnd();
|
|
652
|
-
i0.ɵɵelementStart(3, "p",
|
|
676
|
+
i0.ɵɵelementStart(3, "p", 22);
|
|
653
677
|
i0.ɵɵtext(4, "Set the scoring thresholds used by search, duplicate detection, and autotagging.");
|
|
654
678
|
i0.ɵɵelementEnd();
|
|
655
|
-
i0.ɵɵelementStart(5, "div",
|
|
679
|
+
i0.ɵɵelementStart(5, "div", 23)(6, "div", 29)(7, "div", 30)(8, "span", 26);
|
|
656
680
|
i0.ɵɵtext(9, "Duplicate Absolute Match");
|
|
657
681
|
i0.ɵɵelementEnd();
|
|
658
|
-
i0.ɵɵelementStart(10, "span",
|
|
682
|
+
i0.ɵɵelementStart(10, "span", 27);
|
|
659
683
|
i0.ɵɵtext(11);
|
|
660
684
|
i0.ɵɵelementEnd()();
|
|
661
|
-
i0.ɵɵelementStart(12, "input",
|
|
662
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
663
|
-
i0.ɵɵlistener("input", function
|
|
685
|
+
i0.ɵɵelementStart(12, "input", 116);
|
|
686
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.DuplicateAbsolute, $event) || (ctx_r1.ThresholdSettings.DuplicateAbsolute = $event); return i0.ɵɵresetView($event); });
|
|
687
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_input_12_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
664
688
|
i0.ɵɵelementEnd()();
|
|
665
|
-
i0.ɵɵelementStart(13, "div",
|
|
689
|
+
i0.ɵɵelementStart(13, "div", 29)(14, "div", 30)(15, "span", 26);
|
|
666
690
|
i0.ɵɵtext(16, "Duplicate Potential Match");
|
|
667
691
|
i0.ɵɵelementEnd();
|
|
668
|
-
i0.ɵɵelementStart(17, "span",
|
|
692
|
+
i0.ɵɵelementStart(17, "span", 27);
|
|
669
693
|
i0.ɵɵtext(18);
|
|
670
694
|
i0.ɵɵelementEnd()();
|
|
671
|
-
i0.ɵɵelementStart(19, "input",
|
|
672
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
673
|
-
i0.ɵɵlistener("input", function
|
|
695
|
+
i0.ɵɵelementStart(19, "input", 117);
|
|
696
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.DuplicatePotential, $event) || (ctx_r1.ThresholdSettings.DuplicatePotential = $event); return i0.ɵɵresetView($event); });
|
|
697
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_input_19_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
674
698
|
i0.ɵɵelementEnd()();
|
|
675
|
-
i0.ɵɵelementStart(20, "div",
|
|
699
|
+
i0.ɵɵelementStart(20, "div", 29)(21, "div", 30)(22, "span", 26);
|
|
676
700
|
i0.ɵɵtext(23, "Search Relevance");
|
|
677
701
|
i0.ɵɵelementEnd();
|
|
678
|
-
i0.ɵɵelementStart(24, "span",
|
|
702
|
+
i0.ɵɵelementStart(24, "span", 27);
|
|
679
703
|
i0.ɵɵtext(25);
|
|
680
704
|
i0.ɵɵelementEnd()();
|
|
681
|
-
i0.ɵɵelementStart(26, "input",
|
|
682
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
683
|
-
i0.ɵɵlistener("input", function
|
|
705
|
+
i0.ɵɵelementStart(26, "input", 118);
|
|
706
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_ngModelChange_26_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.SearchRelevance, $event) || (ctx_r1.ThresholdSettings.SearchRelevance = $event); return i0.ɵɵresetView($event); });
|
|
707
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_input_26_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
684
708
|
i0.ɵɵelementEnd()();
|
|
685
|
-
i0.ɵɵelementStart(27, "div",
|
|
709
|
+
i0.ɵɵelementStart(27, "div", 29)(28, "div", 30)(29, "span", 26);
|
|
686
710
|
i0.ɵɵtext(30, "Autotag Confidence");
|
|
687
711
|
i0.ɵɵelementEnd();
|
|
688
|
-
i0.ɵɵelementStart(31, "span",
|
|
712
|
+
i0.ɵɵelementStart(31, "span", 27);
|
|
689
713
|
i0.ɵɵtext(32);
|
|
690
714
|
i0.ɵɵelementEnd()();
|
|
691
|
-
i0.ɵɵelementStart(33, "input",
|
|
692
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
693
|
-
i0.ɵɵlistener("input", function
|
|
715
|
+
i0.ɵɵelementStart(33, "input", 117);
|
|
716
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.AutotagConfidence, $event) || (ctx_r1.ThresholdSettings.AutotagConfidence = $event); return i0.ɵɵresetView($event); });
|
|
717
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_input_33_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
694
718
|
i0.ɵɵelementEnd()()()();
|
|
695
719
|
} if (rf & 2) {
|
|
696
|
-
const
|
|
720
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
697
721
|
i0.ɵɵadvance(11);
|
|
698
|
-
i0.ɵɵtextInterpolate1("Score above which duplicates are auto-confirmed (",
|
|
722
|
+
i0.ɵɵtextInterpolate1("Score above which duplicates are auto-confirmed (", ctx_r1.FormatThreshold(ctx_r1.ThresholdSettings.DuplicateAbsolute), ")");
|
|
699
723
|
i0.ɵɵadvance();
|
|
700
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
724
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ThresholdSettings.DuplicateAbsolute);
|
|
701
725
|
i0.ɵɵadvance(6);
|
|
702
|
-
i0.ɵɵtextInterpolate1("Score above which duplicates are flagged for review (",
|
|
726
|
+
i0.ɵɵtextInterpolate1("Score above which duplicates are flagged for review (", ctx_r1.FormatThreshold(ctx_r1.ThresholdSettings.DuplicatePotential), ")");
|
|
703
727
|
i0.ɵɵadvance();
|
|
704
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
728
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ThresholdSettings.DuplicatePotential);
|
|
705
729
|
i0.ɵɵadvance(6);
|
|
706
|
-
i0.ɵɵtextInterpolate1("Minimum score for search results (",
|
|
730
|
+
i0.ɵɵtextInterpolate1("Minimum score for search results (", ctx_r1.FormatThreshold(ctx_r1.ThresholdSettings.SearchRelevance), ")");
|
|
707
731
|
i0.ɵɵadvance();
|
|
708
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
732
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ThresholdSettings.SearchRelevance);
|
|
709
733
|
i0.ɵɵadvance(6);
|
|
710
|
-
i0.ɵɵtextInterpolate1("Minimum confidence for accepting auto-generated tags (",
|
|
734
|
+
i0.ɵɵtextInterpolate1("Minimum confidence for accepting auto-generated tags (", ctx_r1.FormatThreshold(ctx_r1.ThresholdSettings.AutotagConfidence), ")");
|
|
711
735
|
i0.ɵɵadvance();
|
|
712
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
736
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ThresholdSettings.AutotagConfidence);
|
|
713
737
|
} }
|
|
714
|
-
function
|
|
715
|
-
i0.ɵɵelementStart(0, "div",
|
|
738
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
739
|
+
i0.ɵɵelementStart(0, "div", 124);
|
|
716
740
|
i0.ɵɵtext(1, "Loading\u2026");
|
|
717
741
|
i0.ɵɵelementEnd();
|
|
718
742
|
} }
|
|
719
|
-
function
|
|
720
|
-
i0.ɵɵelementStart(0, "div",
|
|
743
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
744
|
+
i0.ɵɵelementStart(0, "div", 125);
|
|
721
745
|
i0.ɵɵtext(1, " No scopes defined yet. Click ");
|
|
722
746
|
i0.ɵɵelementStart(2, "strong");
|
|
723
747
|
i0.ɵɵtext(3, "New");
|
|
@@ -725,174 +749,174 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Condition
|
|
|
725
749
|
i0.ɵɵtext(4, " to create one. ");
|
|
726
750
|
i0.ɵɵelementEnd();
|
|
727
751
|
} }
|
|
728
|
-
function
|
|
729
|
-
i0.ɵɵelementStart(0, "span",
|
|
752
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
753
|
+
i0.ɵɵelementStart(0, "span", 132);
|
|
730
754
|
i0.ɵɵtext(1, "Global");
|
|
731
755
|
i0.ɵɵelementEnd();
|
|
732
756
|
} }
|
|
733
|
-
function
|
|
734
|
-
i0.ɵɵelementStart(0, "span",
|
|
757
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
758
|
+
i0.ɵɵelementStart(0, "span", 132);
|
|
735
759
|
i0.ɵɵtext(1, "Default");
|
|
736
760
|
i0.ɵɵelementEnd();
|
|
737
761
|
} }
|
|
738
|
-
function
|
|
739
|
-
const
|
|
740
|
-
i0.ɵɵelementStart(0, "button",
|
|
741
|
-
i0.ɵɵlistener("click", function
|
|
742
|
-
i0.ɵɵelement(1, "i",
|
|
743
|
-
i0.ɵɵelementStart(2, "span",
|
|
762
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
763
|
+
const _r23 = i0.ɵɵgetCurrentView();
|
|
764
|
+
i0.ɵɵelementStart(0, "button", 129);
|
|
765
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Template_button_click_0_listener() { const s_r24 = i0.ɵɵrestoreView(_r23).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectScope(s_r24.ID)); });
|
|
766
|
+
i0.ɵɵelement(1, "i", 130);
|
|
767
|
+
i0.ɵɵelementStart(2, "span", 131);
|
|
744
768
|
i0.ɵɵtext(3);
|
|
745
769
|
i0.ɵɵelementEnd();
|
|
746
|
-
i0.ɵɵconditionalCreate(4,
|
|
770
|
+
i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Conditional_4_Template, 2, 0, "span", 132)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Conditional_5_Template, 2, 0, "span", 132);
|
|
747
771
|
i0.ɵɵelementEnd();
|
|
748
772
|
} if (rf & 2) {
|
|
749
|
-
const
|
|
750
|
-
const
|
|
751
|
-
i0.ɵɵclassProp("active",
|
|
773
|
+
const s_r24 = ctx.$implicit;
|
|
774
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
775
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeID === s_r24.ID);
|
|
752
776
|
i0.ɵɵadvance();
|
|
753
|
-
i0.ɵɵclassMap(
|
|
777
|
+
i0.ɵɵclassMap(s_r24.Icon || "fa-solid fa-filter");
|
|
754
778
|
i0.ɵɵadvance(2);
|
|
755
|
-
i0.ɵɵtextInterpolate(
|
|
779
|
+
i0.ɵɵtextInterpolate(s_r24.Name);
|
|
756
780
|
i0.ɵɵadvance();
|
|
757
|
-
i0.ɵɵconditional(
|
|
781
|
+
i0.ɵɵconditional(s_r24.IsGlobal ? 4 : s_r24.IsDefault ? 5 : -1);
|
|
758
782
|
} }
|
|
759
|
-
function
|
|
760
|
-
i0.ɵɵrepeaterCreate(0,
|
|
783
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
784
|
+
i0.ɵɵrepeaterCreate(0, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Template, 6, 6, "button", 128, _forTrack0);
|
|
761
785
|
} if (rf & 2) {
|
|
762
|
-
const
|
|
763
|
-
i0.ɵɵrepeater(
|
|
786
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
787
|
+
i0.ɵɵrepeater(ctx_r1.SearchScopes);
|
|
764
788
|
} }
|
|
765
|
-
function
|
|
766
|
-
const
|
|
767
|
-
i0.ɵɵelementStart(0, "button",
|
|
768
|
-
i0.ɵɵlistener("click", function
|
|
769
|
-
i0.ɵɵelement(1, "i",
|
|
789
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
790
|
+
const _r26 = i0.ɵɵgetCurrentView();
|
|
791
|
+
i0.ɵɵelementStart(0, "button", 145);
|
|
792
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OpenActiveScopeFullForm()); });
|
|
793
|
+
i0.ɵɵelement(1, "i", 146);
|
|
770
794
|
i0.ɵɵtext(2, " Open Full Form ");
|
|
771
795
|
i0.ɵɵelementEnd();
|
|
772
796
|
} }
|
|
773
|
-
function
|
|
774
|
-
const
|
|
775
|
-
i0.ɵɵelementStart(0, "button",
|
|
776
|
-
i0.ɵɵlistener("click", function
|
|
777
|
-
i0.ɵɵelement(1, "i",
|
|
797
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
798
|
+
const _r27 = i0.ɵɵgetCurrentView();
|
|
799
|
+
i0.ɵɵelementStart(0, "button", 147);
|
|
800
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_18_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DeleteActiveScope()); });
|
|
801
|
+
i0.ɵɵelement(1, "i", 148);
|
|
778
802
|
i0.ɵɵelementEnd();
|
|
779
803
|
} }
|
|
780
|
-
function
|
|
781
|
-
const
|
|
782
|
-
i0.ɵɵelementStart(0, "div",
|
|
804
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
805
|
+
const _r28 = i0.ɵɵgetCurrentView();
|
|
806
|
+
i0.ɵɵelementStart(0, "div", 140)(1, "label")(2, "span");
|
|
783
807
|
i0.ɵɵtext(3, "Name");
|
|
784
808
|
i0.ɵɵelementEnd();
|
|
785
|
-
i0.ɵɵelementStart(4, "input",
|
|
786
|
-
i0.ɵɵlistener("change", function
|
|
809
|
+
i0.ɵɵelementStart(4, "input", 149);
|
|
810
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_input_change_4_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Name = $event.target.value); });
|
|
787
811
|
i0.ɵɵelementEnd()();
|
|
788
812
|
i0.ɵɵelementStart(5, "label")(6, "span");
|
|
789
813
|
i0.ɵɵtext(7, "Icon (Font Awesome class)");
|
|
790
814
|
i0.ɵɵelementEnd();
|
|
791
|
-
i0.ɵɵelementStart(8, "input",
|
|
792
|
-
i0.ɵɵlistener("change", function
|
|
815
|
+
i0.ɵɵelementStart(8, "input", 149);
|
|
816
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_input_change_8_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Icon = $event.target.value); });
|
|
793
817
|
i0.ɵɵelementEnd()();
|
|
794
|
-
i0.ɵɵelementStart(9, "label",
|
|
818
|
+
i0.ɵɵelementStart(9, "label", 150)(10, "span");
|
|
795
819
|
i0.ɵɵtext(11, "Description");
|
|
796
820
|
i0.ɵɵelementEnd();
|
|
797
|
-
i0.ɵɵelementStart(12, "textarea",
|
|
798
|
-
i0.ɵɵlistener("change", function
|
|
821
|
+
i0.ɵɵelementStart(12, "textarea", 151);
|
|
822
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_textarea_change_12_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Description = $event.target.value); });
|
|
799
823
|
i0.ɵɵelementEnd()();
|
|
800
824
|
i0.ɵɵelementStart(13, "label")(14, "span");
|
|
801
825
|
i0.ɵɵtext(15, "Status");
|
|
802
826
|
i0.ɵɵelementEnd();
|
|
803
|
-
i0.ɵɵelementStart(16, "select",
|
|
804
|
-
i0.ɵɵlistener("change", function
|
|
805
|
-
i0.ɵɵelementStart(17, "option",
|
|
827
|
+
i0.ɵɵelementStart(16, "select", 152);
|
|
828
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_select_change_16_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Status = $event.target.value); });
|
|
829
|
+
i0.ɵɵelementStart(17, "option", 153);
|
|
806
830
|
i0.ɵɵtext(18, "Active");
|
|
807
831
|
i0.ɵɵelementEnd();
|
|
808
|
-
i0.ɵɵelementStart(19, "option",
|
|
832
|
+
i0.ɵɵelementStart(19, "option", 154);
|
|
809
833
|
i0.ɵɵtext(20, "Inactive");
|
|
810
834
|
i0.ɵɵelementEnd()()();
|
|
811
835
|
i0.ɵɵelementStart(21, "label")(22, "span");
|
|
812
836
|
i0.ɵɵtext(23, "Start at");
|
|
813
837
|
i0.ɵɵelementEnd();
|
|
814
|
-
i0.ɵɵelementStart(24, "input",
|
|
815
|
-
i0.ɵɵlistener("change", function
|
|
838
|
+
i0.ɵɵelementStart(24, "input", 155);
|
|
839
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_input_change_24_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SetScopeDate(ctx_r1.ActiveScope, "StartAt", $event.target.value)); });
|
|
816
840
|
i0.ɵɵelementEnd()();
|
|
817
841
|
i0.ɵɵelementStart(25, "label")(26, "span");
|
|
818
842
|
i0.ɵɵtext(27, "End at");
|
|
819
843
|
i0.ɵɵelementEnd();
|
|
820
|
-
i0.ɵɵelementStart(28, "input",
|
|
821
|
-
i0.ɵɵlistener("change", function
|
|
844
|
+
i0.ɵɵelementStart(28, "input", 155);
|
|
845
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_input_change_28_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SetScopeDate(ctx_r1.ActiveScope, "EndAt", $event.target.value)); });
|
|
822
846
|
i0.ɵɵelementEnd()();
|
|
823
|
-
i0.ɵɵelementStart(29, "label",
|
|
824
|
-
i0.ɵɵlistener("change", function
|
|
847
|
+
i0.ɵɵelementStart(29, "label", 156)(30, "input", 157);
|
|
848
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_input_change_30_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.IsDefault = $event.target.checked); });
|
|
825
849
|
i0.ɵɵelementEnd();
|
|
826
850
|
i0.ɵɵelementStart(31, "span");
|
|
827
851
|
i0.ɵɵtext(32, "Default scope \u2014 picked when users/agents don't specify one");
|
|
828
852
|
i0.ɵɵelementEnd()();
|
|
829
|
-
i0.ɵɵelementStart(33, "label",
|
|
830
|
-
i0.ɵɵelement(34, "input",
|
|
853
|
+
i0.ɵɵelementStart(33, "label", 156);
|
|
854
|
+
i0.ɵɵelement(34, "input", 158);
|
|
831
855
|
i0.ɵɵelementStart(35, "span");
|
|
832
856
|
i0.ɵɵtext(36, "Global \u2014 reserved for the built-in Global scope (read-only)");
|
|
833
857
|
i0.ɵɵelementEnd()();
|
|
834
|
-
i0.ɵɵelementStart(37, "label",
|
|
858
|
+
i0.ɵɵelementStart(37, "label", 150)(38, "span");
|
|
835
859
|
i0.ɵɵtext(39, "Scope Config (JSON)");
|
|
836
860
|
i0.ɵɵelementEnd();
|
|
837
|
-
i0.ɵɵelementStart(40, "textarea",
|
|
838
|
-
i0.ɵɵlistener("change", function
|
|
861
|
+
i0.ɵɵelementStart(40, "textarea", 159);
|
|
862
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_textarea_change_40_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.ScopeConfig = $event.target.value); });
|
|
839
863
|
i0.ɵɵelementEnd()();
|
|
840
|
-
i0.ɵɵelementStart(41, "label",
|
|
864
|
+
i0.ɵɵelementStart(41, "label", 150)(42, "span");
|
|
841
865
|
i0.ɵɵtext(43, "Search Context Config (JSON)");
|
|
842
866
|
i0.ɵɵelementEnd();
|
|
843
|
-
i0.ɵɵelementStart(44, "textarea",
|
|
844
|
-
i0.ɵɵlistener("change", function
|
|
867
|
+
i0.ɵɵelementStart(44, "textarea", 159);
|
|
868
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_textarea_change_44_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.SearchContextConfig = $event.target.value); });
|
|
845
869
|
i0.ɵɵelementEnd()()();
|
|
846
870
|
} if (rf & 2) {
|
|
847
|
-
const
|
|
871
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
848
872
|
i0.ɵɵadvance(4);
|
|
849
|
-
i0.ɵɵproperty("value",
|
|
873
|
+
i0.ɵɵproperty("value", ctx_r1.ActiveScope.Name);
|
|
850
874
|
i0.ɵɵadvance(4);
|
|
851
|
-
i0.ɵɵproperty("value",
|
|
875
|
+
i0.ɵɵproperty("value", ctx_r1.ActiveScope.Icon || "");
|
|
852
876
|
i0.ɵɵadvance(4);
|
|
853
|
-
i0.ɵɵproperty("value",
|
|
877
|
+
i0.ɵɵproperty("value", ctx_r1.ActiveScope.Description || "");
|
|
854
878
|
i0.ɵɵadvance(4);
|
|
855
|
-
i0.ɵɵproperty("value",
|
|
879
|
+
i0.ɵɵproperty("value", ctx_r1.ActiveScope.Status);
|
|
856
880
|
i0.ɵɵadvance(8);
|
|
857
|
-
i0.ɵɵproperty("value",
|
|
881
|
+
i0.ɵɵproperty("value", ctx_r1.FormatScopeDate(ctx_r1.ActiveScope.StartAt));
|
|
858
882
|
i0.ɵɵadvance(4);
|
|
859
|
-
i0.ɵɵproperty("value",
|
|
883
|
+
i0.ɵɵproperty("value", ctx_r1.FormatScopeDate(ctx_r1.ActiveScope.EndAt));
|
|
860
884
|
i0.ɵɵadvance(2);
|
|
861
|
-
i0.ɵɵproperty("checked",
|
|
885
|
+
i0.ɵɵproperty("checked", ctx_r1.ActiveScope.IsDefault)("disabled", ctx_r1.ActiveScope.IsGlobal);
|
|
862
886
|
i0.ɵɵadvance(4);
|
|
863
|
-
i0.ɵɵproperty("checked",
|
|
887
|
+
i0.ɵɵproperty("checked", ctx_r1.ActiveScope.IsGlobal);
|
|
864
888
|
i0.ɵɵadvance(6);
|
|
865
|
-
i0.ɵɵproperty("value",
|
|
889
|
+
i0.ɵɵproperty("value", ctx_r1.ActiveScope.ScopeConfig || "");
|
|
866
890
|
i0.ɵɵadvance(4);
|
|
867
|
-
i0.ɵɵproperty("value",
|
|
891
|
+
i0.ɵɵproperty("value", ctx_r1.ActiveScope.SearchContextConfig || "");
|
|
868
892
|
} }
|
|
869
|
-
function
|
|
870
|
-
i0.ɵɵelement(0, "mj-search-scope-child-grid",
|
|
893
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
894
|
+
i0.ɵɵelement(0, "mj-search-scope-child-grid", 141);
|
|
871
895
|
} if (rf & 2) {
|
|
872
|
-
const
|
|
873
|
-
i0.ɵɵproperty("ParentID",
|
|
896
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
897
|
+
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeProviderColumns);
|
|
874
898
|
} }
|
|
875
|
-
function
|
|
876
|
-
i0.ɵɵelement(0, "mj-search-scope-child-grid",
|
|
899
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
900
|
+
i0.ɵɵelement(0, "mj-search-scope-child-grid", 142);
|
|
877
901
|
} if (rf & 2) {
|
|
878
|
-
const
|
|
879
|
-
i0.ɵɵproperty("ParentID",
|
|
902
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
903
|
+
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeExternalIndexColumns);
|
|
880
904
|
} }
|
|
881
|
-
function
|
|
882
|
-
i0.ɵɵelement(0, "mj-search-scope-child-grid",
|
|
905
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
906
|
+
i0.ɵɵelement(0, "mj-search-scope-child-grid", 143);
|
|
883
907
|
} if (rf & 2) {
|
|
884
|
-
const
|
|
885
|
-
i0.ɵɵproperty("ParentID",
|
|
908
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
909
|
+
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeEntityColumns);
|
|
886
910
|
} }
|
|
887
|
-
function
|
|
888
|
-
i0.ɵɵelement(0, "mj-search-scope-child-grid",
|
|
911
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
912
|
+
i0.ɵɵelement(0, "mj-search-scope-child-grid", 144);
|
|
889
913
|
} if (rf & 2) {
|
|
890
|
-
const
|
|
891
|
-
i0.ɵɵproperty("ParentID",
|
|
914
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
915
|
+
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeStorageColumns);
|
|
892
916
|
} }
|
|
893
|
-
function
|
|
894
|
-
i0.ɵɵelementStart(0, "div",
|
|
895
|
-
i0.ɵɵelement(2, "i",
|
|
917
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
918
|
+
i0.ɵɵelementStart(0, "div", 160)(1, "p", 161);
|
|
919
|
+
i0.ɵɵelement(2, "i", 162);
|
|
896
920
|
i0.ɵɵelementStart(3, "strong");
|
|
897
921
|
i0.ɵɵtext(4, "Per-user / per-role grants on this scope.");
|
|
898
922
|
i0.ɵɵelementEnd();
|
|
@@ -926,86 +950,86 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Condition
|
|
|
926
950
|
i0.ɵɵelementEnd();
|
|
927
951
|
i0.ɵɵtext(26, " via the resolver \u2014 see the spec for the full resolution order. ");
|
|
928
952
|
i0.ɵɵelementEnd()();
|
|
929
|
-
i0.ɵɵelement(27, "mj-search-scope-child-grid",
|
|
953
|
+
i0.ɵɵelement(27, "mj-search-scope-child-grid", 163);
|
|
930
954
|
} if (rf & 2) {
|
|
931
|
-
const
|
|
955
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
932
956
|
i0.ɵɵadvance(27);
|
|
933
|
-
i0.ɵɵproperty("ParentID",
|
|
957
|
+
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopePermissionColumns);
|
|
934
958
|
} }
|
|
935
|
-
function
|
|
936
|
-
const
|
|
937
|
-
i0.ɵɵelementStart(0, "div",
|
|
938
|
-
i0.ɵɵlistener("click", function
|
|
959
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
960
|
+
const _r25 = i0.ɵɵgetCurrentView();
|
|
961
|
+
i0.ɵɵelementStart(0, "div", 133)(1, "button", 134);
|
|
962
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("definition")); });
|
|
939
963
|
i0.ɵɵtext(2, "Definition");
|
|
940
964
|
i0.ɵɵelementEnd();
|
|
941
|
-
i0.ɵɵelementStart(3, "button",
|
|
942
|
-
i0.ɵɵlistener("click", function
|
|
965
|
+
i0.ɵɵelementStart(3, "button", 134);
|
|
966
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("providers")); });
|
|
943
967
|
i0.ɵɵtext(4, "Providers");
|
|
944
968
|
i0.ɵɵelementEnd();
|
|
945
|
-
i0.ɵɵelementStart(5, "button",
|
|
946
|
-
i0.ɵɵlistener("click", function
|
|
969
|
+
i0.ɵɵelementStart(5, "button", 134);
|
|
970
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("indexes")); });
|
|
947
971
|
i0.ɵɵtext(6, "External Indexes");
|
|
948
972
|
i0.ɵɵelementEnd();
|
|
949
|
-
i0.ɵɵelementStart(7, "button",
|
|
950
|
-
i0.ɵɵlistener("click", function
|
|
973
|
+
i0.ɵɵelementStart(7, "button", 134);
|
|
974
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("entities")); });
|
|
951
975
|
i0.ɵɵtext(8, "Entities");
|
|
952
976
|
i0.ɵɵelementEnd();
|
|
953
|
-
i0.ɵɵelementStart(9, "button",
|
|
954
|
-
i0.ɵɵlistener("click", function
|
|
977
|
+
i0.ɵɵelementStart(9, "button", 134);
|
|
978
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("storage")); });
|
|
955
979
|
i0.ɵɵtext(10, "Storage");
|
|
956
980
|
i0.ɵɵelementEnd();
|
|
957
|
-
i0.ɵɵelementStart(11, "button",
|
|
958
|
-
i0.ɵɵlistener("click", function
|
|
981
|
+
i0.ɵɵelementStart(11, "button", 134);
|
|
982
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("permissions")); });
|
|
959
983
|
i0.ɵɵtext(12, "Permissions");
|
|
960
984
|
i0.ɵɵelementEnd();
|
|
961
|
-
i0.ɵɵelement(13, "div",
|
|
962
|
-
i0.ɵɵconditionalCreate(14,
|
|
963
|
-
i0.ɵɵelementStart(15, "button",
|
|
964
|
-
i0.ɵɵlistener("click", function
|
|
965
|
-
i0.ɵɵelement(16, "i",
|
|
985
|
+
i0.ɵɵelement(13, "div", 135);
|
|
986
|
+
i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_14_Template, 3, 0, "button", 136);
|
|
987
|
+
i0.ɵɵelementStart(15, "button", 137);
|
|
988
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SaveActiveScope()); });
|
|
989
|
+
i0.ɵɵelement(16, "i", 138);
|
|
966
990
|
i0.ɵɵtext(17, " Save ");
|
|
967
991
|
i0.ɵɵelementEnd();
|
|
968
|
-
i0.ɵɵconditionalCreate(18,
|
|
992
|
+
i0.ɵɵconditionalCreate(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_18_Template, 2, 0, "button", 139);
|
|
969
993
|
i0.ɵɵelementEnd();
|
|
970
|
-
i0.ɵɵconditionalCreate(19,
|
|
971
|
-
i0.ɵɵconditionalCreate(20,
|
|
972
|
-
i0.ɵɵconditionalCreate(21,
|
|
973
|
-
i0.ɵɵconditionalCreate(22,
|
|
974
|
-
i0.ɵɵconditionalCreate(23,
|
|
975
|
-
i0.ɵɵconditionalCreate(24,
|
|
994
|
+
i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template, 45, 11, "div", 140);
|
|
995
|
+
i0.ɵɵconditionalCreate(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_20_Template, 1, 2, "mj-search-scope-child-grid", 141);
|
|
996
|
+
i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_21_Template, 1, 2, "mj-search-scope-child-grid", 142);
|
|
997
|
+
i0.ɵɵconditionalCreate(22, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_22_Template, 1, 2, "mj-search-scope-child-grid", 143);
|
|
998
|
+
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_23_Template, 1, 2, "mj-search-scope-child-grid", 144);
|
|
999
|
+
i0.ɵɵconditionalCreate(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_24_Template, 28, 2);
|
|
976
1000
|
} if (rf & 2) {
|
|
977
|
-
const
|
|
1001
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
978
1002
|
i0.ɵɵadvance();
|
|
979
|
-
i0.ɵɵclassProp("active",
|
|
1003
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeTab === "definition");
|
|
980
1004
|
i0.ɵɵadvance(2);
|
|
981
|
-
i0.ɵɵclassProp("active",
|
|
1005
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeTab === "providers");
|
|
982
1006
|
i0.ɵɵadvance(2);
|
|
983
|
-
i0.ɵɵclassProp("active",
|
|
1007
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeTab === "indexes");
|
|
984
1008
|
i0.ɵɵadvance(2);
|
|
985
|
-
i0.ɵɵclassProp("active",
|
|
1009
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeTab === "entities");
|
|
986
1010
|
i0.ɵɵadvance(2);
|
|
987
|
-
i0.ɵɵclassProp("active",
|
|
1011
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeTab === "storage");
|
|
988
1012
|
i0.ɵɵadvance(2);
|
|
989
|
-
i0.ɵɵclassProp("active",
|
|
1013
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeTab === "permissions");
|
|
990
1014
|
i0.ɵɵadvance(3);
|
|
991
|
-
i0.ɵɵconditional(
|
|
1015
|
+
i0.ɵɵconditional(ctx_r1.ActiveScope.ID ? 14 : -1);
|
|
992
1016
|
i0.ɵɵadvance(4);
|
|
993
|
-
i0.ɵɵconditional(!
|
|
1017
|
+
i0.ɵɵconditional(!ctx_r1.ActiveScope.IsGlobal ? 18 : -1);
|
|
994
1018
|
i0.ɵɵadvance();
|
|
995
|
-
i0.ɵɵconditional(
|
|
1019
|
+
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "definition" ? 19 : -1);
|
|
996
1020
|
i0.ɵɵadvance();
|
|
997
|
-
i0.ɵɵconditional(
|
|
1021
|
+
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "providers" ? 20 : -1);
|
|
998
1022
|
i0.ɵɵadvance();
|
|
999
|
-
i0.ɵɵconditional(
|
|
1023
|
+
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "indexes" ? 21 : -1);
|
|
1000
1024
|
i0.ɵɵadvance();
|
|
1001
|
-
i0.ɵɵconditional(
|
|
1025
|
+
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "entities" ? 22 : -1);
|
|
1002
1026
|
i0.ɵɵadvance();
|
|
1003
|
-
i0.ɵɵconditional(
|
|
1027
|
+
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "storage" ? 23 : -1);
|
|
1004
1028
|
i0.ɵɵadvance();
|
|
1005
|
-
i0.ɵɵconditional(
|
|
1029
|
+
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "permissions" ? 24 : -1);
|
|
1006
1030
|
} }
|
|
1007
|
-
function
|
|
1008
|
-
i0.ɵɵelementStart(0, "div",
|
|
1031
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
1032
|
+
i0.ɵɵelementStart(0, "div", 127);
|
|
1009
1033
|
i0.ɵɵtext(1, " Select a scope on the left, or click ");
|
|
1010
1034
|
i0.ɵɵelementStart(2, "strong");
|
|
1011
1035
|
i0.ɵɵtext(3, "New");
|
|
@@ -1013,54 +1037,54 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Condition
|
|
|
1013
1037
|
i0.ɵɵtext(4, " to create one. ");
|
|
1014
1038
|
i0.ɵɵelementEnd();
|
|
1015
1039
|
} }
|
|
1016
|
-
function
|
|
1017
|
-
const
|
|
1018
|
-
i0.ɵɵelementStart(0, "div",
|
|
1019
|
-
i0.ɵɵelement(2, "i",
|
|
1040
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
1041
|
+
const _r22 = i0.ɵɵgetCurrentView();
|
|
1042
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "h2", 21);
|
|
1043
|
+
i0.ɵɵelement(2, "i", 119);
|
|
1020
1044
|
i0.ɵɵtext(3, " Search Scopes");
|
|
1021
1045
|
i0.ɵɵelementEnd();
|
|
1022
|
-
i0.ɵɵelementStart(4, "p",
|
|
1046
|
+
i0.ɵɵelementStart(4, "p", 22);
|
|
1023
1047
|
i0.ɵɵtext(5, " Define reusable search scopes that filter which providers, entities, external indexes, and storage accounts participate in a scoped search. Scopes can be assigned to AI agents for pre-execution RAG or agent-invoked search. ");
|
|
1024
1048
|
i0.ɵɵelementEnd();
|
|
1025
|
-
i0.ɵɵelementStart(6, "div",
|
|
1049
|
+
i0.ɵɵelementStart(6, "div", 120)(7, "aside", 121)(8, "div", 122)(9, "span");
|
|
1026
1050
|
i0.ɵɵtext(10);
|
|
1027
1051
|
i0.ɵɵelementEnd();
|
|
1028
|
-
i0.ɵɵelementStart(11, "button",
|
|
1029
|
-
i0.ɵɵlistener("click", function
|
|
1030
|
-
i0.ɵɵelement(12, "i",
|
|
1052
|
+
i0.ɵɵelementStart(11, "button", 123);
|
|
1053
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CreateNewScope()); });
|
|
1054
|
+
i0.ɵɵelement(12, "i", 67);
|
|
1031
1055
|
i0.ɵɵtext(13, " New ");
|
|
1032
1056
|
i0.ɵɵelementEnd()();
|
|
1033
|
-
i0.ɵɵconditionalCreate(14,
|
|
1057
|
+
i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_14_Template, 2, 0, "div", 124)(15, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_15_Template, 5, 0, "div", 125)(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_Template, 2, 0);
|
|
1034
1058
|
i0.ɵɵelementEnd();
|
|
1035
|
-
i0.ɵɵelementStart(17, "section",
|
|
1036
|
-
i0.ɵɵconditionalCreate(18,
|
|
1059
|
+
i0.ɵɵelementStart(17, "section", 126);
|
|
1060
|
+
i0.ɵɵconditionalCreate(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template, 25, 20)(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_19_Template, 5, 0, "div", 127);
|
|
1037
1061
|
i0.ɵɵelementEnd()()();
|
|
1038
1062
|
} if (rf & 2) {
|
|
1039
|
-
const
|
|
1063
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1040
1064
|
i0.ɵɵadvance(10);
|
|
1041
|
-
i0.ɵɵtextInterpolate1("Scopes (",
|
|
1065
|
+
i0.ɵɵtextInterpolate1("Scopes (", ctx_r1.SearchScopes.length, ")");
|
|
1042
1066
|
i0.ɵɵadvance(4);
|
|
1043
|
-
i0.ɵɵconditional(
|
|
1067
|
+
i0.ɵɵconditional(ctx_r1.IsLoadingScopes ? 14 : ctx_r1.SearchScopes.length === 0 ? 15 : 16);
|
|
1044
1068
|
i0.ɵɵadvance(4);
|
|
1045
|
-
i0.ɵɵconditional(
|
|
1069
|
+
i0.ɵɵconditional(ctx_r1.ActiveScope ? 18 : 19);
|
|
1046
1070
|
} }
|
|
1047
|
-
function
|
|
1048
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
1071
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
1072
|
+
i0.ɵɵelement(0, "mj-loading", 165);
|
|
1049
1073
|
} }
|
|
1050
|
-
function
|
|
1051
|
-
const
|
|
1052
|
-
i0.ɵɵelementStart(0, "button",
|
|
1053
|
-
i0.ɵɵlistener("click", function
|
|
1054
|
-
i0.ɵɵelement(1, "i",
|
|
1074
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
1075
|
+
const _r29 = i0.ɵɵgetCurrentView();
|
|
1076
|
+
i0.ɵɵelementStart(0, "button", 167);
|
|
1077
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.LoadSearchAnalytics()); });
|
|
1078
|
+
i0.ɵɵelement(1, "i", 168);
|
|
1055
1079
|
i0.ɵɵtext(2, " Load analytics ");
|
|
1056
1080
|
i0.ɵɵelementEnd();
|
|
1057
1081
|
} }
|
|
1058
|
-
function
|
|
1059
|
-
i0.ɵɵelementStart(0, "p",
|
|
1082
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_37_Template(rf, ctx) { if (rf & 1) {
|
|
1083
|
+
i0.ɵɵelementStart(0, "p", 175);
|
|
1060
1084
|
i0.ɵɵtext(1, "No runs in the window.");
|
|
1061
1085
|
i0.ɵɵelementEnd();
|
|
1062
1086
|
} }
|
|
1063
|
-
function
|
|
1087
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_38_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
1064
1088
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
1065
1089
|
i0.ɵɵtext(2);
|
|
1066
1090
|
i0.ɵɵelementEnd();
|
|
@@ -1072,16 +1096,16 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Condition
|
|
|
1072
1096
|
i0.ɵɵtext(7);
|
|
1073
1097
|
i0.ɵɵelementEnd()();
|
|
1074
1098
|
} if (rf & 2) {
|
|
1075
|
-
const
|
|
1099
|
+
const s_r31 = ctx.$implicit;
|
|
1076
1100
|
i0.ɵɵadvance(2);
|
|
1077
|
-
i0.ɵɵtextInterpolate(
|
|
1101
|
+
i0.ɵɵtextInterpolate(s_r31.Name);
|
|
1078
1102
|
i0.ɵɵadvance(2);
|
|
1079
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 3,
|
|
1103
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 3, s_r31.Count));
|
|
1080
1104
|
i0.ɵɵadvance(3);
|
|
1081
|
-
i0.ɵɵtextInterpolate1("",
|
|
1105
|
+
i0.ɵɵtextInterpolate1("", s_r31.AvgLatencyMs, "ms");
|
|
1082
1106
|
} }
|
|
1083
|
-
function
|
|
1084
|
-
i0.ɵɵelementStart(0, "table",
|
|
1107
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
1108
|
+
i0.ɵɵelementStart(0, "table", 176)(1, "thead")(2, "tr")(3, "th");
|
|
1085
1109
|
i0.ɵɵtext(4, "Scope");
|
|
1086
1110
|
i0.ɵɵelementEnd();
|
|
1087
1111
|
i0.ɵɵelementStart(5, "th");
|
|
@@ -1091,19 +1115,19 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Condition
|
|
|
1091
1115
|
i0.ɵɵtext(8, "Avg latency");
|
|
1092
1116
|
i0.ɵɵelementEnd()()();
|
|
1093
1117
|
i0.ɵɵelementStart(9, "tbody");
|
|
1094
|
-
i0.ɵɵrepeaterCreate(10,
|
|
1118
|
+
i0.ɵɵrepeaterCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_38_For_11_Template, 8, 5, "tr", null, _forTrack2);
|
|
1095
1119
|
i0.ɵɵelementEnd()();
|
|
1096
1120
|
} if (rf & 2) {
|
|
1097
|
-
const
|
|
1121
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
1098
1122
|
i0.ɵɵadvance(10);
|
|
1099
|
-
i0.ɵɵrepeater(
|
|
1123
|
+
i0.ɵɵrepeater(ctx_r1.AnalyticsTopScopes);
|
|
1100
1124
|
} }
|
|
1101
|
-
function
|
|
1102
|
-
i0.ɵɵelementStart(0, "p",
|
|
1125
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_41_Template(rf, ctx) { if (rf & 1) {
|
|
1126
|
+
i0.ɵɵelementStart(0, "p", 175);
|
|
1103
1127
|
i0.ɵɵtext(1, "No rerank invocations in the window.");
|
|
1104
1128
|
i0.ɵɵelementEnd();
|
|
1105
1129
|
} }
|
|
1106
|
-
function
|
|
1130
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_42_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
1107
1131
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
1108
1132
|
i0.ɵɵtext(2);
|
|
1109
1133
|
i0.ɵɵelementEnd();
|
|
@@ -1116,16 +1140,16 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Condition
|
|
|
1116
1140
|
i0.ɵɵpipe(8, "number");
|
|
1117
1141
|
i0.ɵɵelementEnd()();
|
|
1118
1142
|
} if (rf & 2) {
|
|
1119
|
-
const
|
|
1143
|
+
const r_r32 = ctx.$implicit;
|
|
1120
1144
|
i0.ɵɵadvance(2);
|
|
1121
|
-
i0.ɵɵtextInterpolate(
|
|
1145
|
+
i0.ɵɵtextInterpolate(r_r32.Reranker);
|
|
1122
1146
|
i0.ɵɵadvance(2);
|
|
1123
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 3,
|
|
1147
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 3, r_r32.Count));
|
|
1124
1148
|
i0.ɵɵadvance(3);
|
|
1125
|
-
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(8, 5,
|
|
1149
|
+
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(8, 5, r_r32.TotalCents, "1.0-2"), "\u00A2");
|
|
1126
1150
|
} }
|
|
1127
|
-
function
|
|
1128
|
-
i0.ɵɵelementStart(0, "table",
|
|
1151
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_42_Template(rf, ctx) { if (rf & 1) {
|
|
1152
|
+
i0.ɵɵelementStart(0, "table", 176)(1, "thead")(2, "tr")(3, "th");
|
|
1129
1153
|
i0.ɵɵtext(4, "Reranker");
|
|
1130
1154
|
i0.ɵɵelementEnd();
|
|
1131
1155
|
i0.ɵɵelementStart(5, "th");
|
|
@@ -1135,19 +1159,19 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Condition
|
|
|
1135
1159
|
i0.ɵɵtext(8, "Total cents");
|
|
1136
1160
|
i0.ɵɵelementEnd()()();
|
|
1137
1161
|
i0.ɵɵelementStart(9, "tbody");
|
|
1138
|
-
i0.ɵɵrepeaterCreate(10,
|
|
1162
|
+
i0.ɵɵrepeaterCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_42_For_11_Template, 9, 8, "tr", null, _forTrack3);
|
|
1139
1163
|
i0.ɵɵelementEnd()();
|
|
1140
1164
|
} if (rf & 2) {
|
|
1141
|
-
const
|
|
1165
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
1142
1166
|
i0.ɵɵadvance(10);
|
|
1143
|
-
i0.ɵɵrepeater(
|
|
1167
|
+
i0.ɵɵrepeater(ctx_r1.AnalyticsRerankerSpend);
|
|
1144
1168
|
} }
|
|
1145
|
-
function
|
|
1146
|
-
i0.ɵɵelementStart(0, "p",
|
|
1169
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
1170
|
+
i0.ɵɵelementStart(0, "p", 175);
|
|
1147
1171
|
i0.ɵɵtext(1, "No failures in the window.");
|
|
1148
1172
|
i0.ɵɵelementEnd();
|
|
1149
1173
|
} }
|
|
1150
|
-
function
|
|
1174
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_46_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
1151
1175
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
1152
1176
|
i0.ɵɵtext(2);
|
|
1153
1177
|
i0.ɵɵelementEnd();
|
|
@@ -1156,197 +1180,197 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Condition
|
|
|
1156
1180
|
i0.ɵɵpipe(5, "number");
|
|
1157
1181
|
i0.ɵɵelementEnd()();
|
|
1158
1182
|
} if (rf & 2) {
|
|
1159
|
-
const
|
|
1183
|
+
const f_r33 = ctx.$implicit;
|
|
1160
1184
|
i0.ɵɵadvance(2);
|
|
1161
|
-
i0.ɵɵtextInterpolate(
|
|
1185
|
+
i0.ɵɵtextInterpolate(f_r33.Reason);
|
|
1162
1186
|
i0.ɵɵadvance(2);
|
|
1163
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 2,
|
|
1187
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 2, f_r33.Count));
|
|
1164
1188
|
} }
|
|
1165
|
-
function
|
|
1166
|
-
i0.ɵɵelementStart(0, "table",
|
|
1189
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
1190
|
+
i0.ɵɵelementStart(0, "table", 176)(1, "thead")(2, "tr")(3, "th");
|
|
1167
1191
|
i0.ɵɵtext(4, "Reason");
|
|
1168
1192
|
i0.ɵɵelementEnd();
|
|
1169
1193
|
i0.ɵɵelementStart(5, "th");
|
|
1170
1194
|
i0.ɵɵtext(6, "Count");
|
|
1171
1195
|
i0.ɵɵelementEnd()()();
|
|
1172
1196
|
i0.ɵɵelementStart(7, "tbody");
|
|
1173
|
-
i0.ɵɵrepeaterCreate(8,
|
|
1197
|
+
i0.ɵɵrepeaterCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_46_For_9_Template, 6, 4, "tr", null, _forTrack4);
|
|
1174
1198
|
i0.ɵɵelementEnd()();
|
|
1175
1199
|
} if (rf & 2) {
|
|
1176
|
-
const
|
|
1200
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
1177
1201
|
i0.ɵɵadvance(8);
|
|
1178
|
-
i0.ɵɵrepeater(
|
|
1202
|
+
i0.ɵɵrepeater(ctx_r1.AnalyticsTopFailures);
|
|
1179
1203
|
} }
|
|
1180
|
-
function
|
|
1181
|
-
const
|
|
1182
|
-
i0.ɵɵelementStart(0, "div",
|
|
1204
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
1205
|
+
const _r30 = i0.ɵɵgetCurrentView();
|
|
1206
|
+
i0.ɵɵelementStart(0, "div", 169)(1, "div", 170)(2, "span", 171);
|
|
1183
1207
|
i0.ɵɵtext(3, "Total runs");
|
|
1184
1208
|
i0.ɵɵelementEnd();
|
|
1185
|
-
i0.ɵɵelementStart(4, "span",
|
|
1209
|
+
i0.ɵɵelementStart(4, "span", 172);
|
|
1186
1210
|
i0.ɵɵtext(5);
|
|
1187
1211
|
i0.ɵɵpipe(6, "number");
|
|
1188
1212
|
i0.ɵɵelementEnd()();
|
|
1189
|
-
i0.ɵɵelementStart(7, "div",
|
|
1213
|
+
i0.ɵɵelementStart(7, "div", 170)(8, "span", 171);
|
|
1190
1214
|
i0.ɵɵtext(9, "Success rate");
|
|
1191
1215
|
i0.ɵɵelementEnd();
|
|
1192
|
-
i0.ɵɵelementStart(10, "span",
|
|
1216
|
+
i0.ɵɵelementStart(10, "span", 172);
|
|
1193
1217
|
i0.ɵɵtext(11);
|
|
1194
1218
|
i0.ɵɵelementEnd()();
|
|
1195
|
-
i0.ɵɵelementStart(12, "div",
|
|
1219
|
+
i0.ɵɵelementStart(12, "div", 170)(13, "span", 171);
|
|
1196
1220
|
i0.ɵɵtext(14, "Hit rate");
|
|
1197
1221
|
i0.ɵɵelementEnd();
|
|
1198
|
-
i0.ɵɵelementStart(15, "span",
|
|
1222
|
+
i0.ɵɵelementStart(15, "span", 172);
|
|
1199
1223
|
i0.ɵɵtext(16);
|
|
1200
1224
|
i0.ɵɵelementEnd();
|
|
1201
|
-
i0.ɵɵelementStart(17, "span",
|
|
1225
|
+
i0.ɵɵelementStart(17, "span", 173);
|
|
1202
1226
|
i0.ɵɵtext(18, "% of successful runs that returned \u22651 result");
|
|
1203
1227
|
i0.ɵɵelementEnd()();
|
|
1204
|
-
i0.ɵɵelementStart(19, "div",
|
|
1228
|
+
i0.ɵɵelementStart(19, "div", 170)(20, "span", 171);
|
|
1205
1229
|
i0.ɵɵtext(21, "Avg latency");
|
|
1206
1230
|
i0.ɵɵelementEnd();
|
|
1207
|
-
i0.ɵɵelementStart(22, "span",
|
|
1231
|
+
i0.ɵɵelementStart(22, "span", 172);
|
|
1208
1232
|
i0.ɵɵtext(23);
|
|
1209
1233
|
i0.ɵɵelementEnd()();
|
|
1210
|
-
i0.ɵɵelementStart(24, "div",
|
|
1234
|
+
i0.ɵɵelementStart(24, "div", 170)(25, "span", 171);
|
|
1211
1235
|
i0.ɵɵtext(26, "P95 latency");
|
|
1212
1236
|
i0.ɵɵelementEnd();
|
|
1213
|
-
i0.ɵɵelementStart(27, "span",
|
|
1237
|
+
i0.ɵɵelementStart(27, "span", 172);
|
|
1214
1238
|
i0.ɵɵtext(28);
|
|
1215
1239
|
i0.ɵɵelementEnd()();
|
|
1216
|
-
i0.ɵɵelementStart(29, "div",
|
|
1240
|
+
i0.ɵɵelementStart(29, "div", 170)(30, "span", 171);
|
|
1217
1241
|
i0.ɵɵtext(31, "Reranker spend");
|
|
1218
1242
|
i0.ɵɵelementEnd();
|
|
1219
|
-
i0.ɵɵelementStart(32, "span",
|
|
1243
|
+
i0.ɵɵelementStart(32, "span", 172);
|
|
1220
1244
|
i0.ɵɵtext(33);
|
|
1221
1245
|
i0.ɵɵpipe(34, "number");
|
|
1222
1246
|
i0.ɵɵelementEnd()()();
|
|
1223
|
-
i0.ɵɵelementStart(35, "h3",
|
|
1247
|
+
i0.ɵɵelementStart(35, "h3", 174);
|
|
1224
1248
|
i0.ɵɵtext(36, "Top scopes by volume");
|
|
1225
1249
|
i0.ɵɵelementEnd();
|
|
1226
|
-
i0.ɵɵconditionalCreate(37,
|
|
1227
|
-
i0.ɵɵelementStart(39, "h3",
|
|
1250
|
+
i0.ɵɵconditionalCreate(37, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_37_Template, 2, 0, "p", 175)(38, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_38_Template, 12, 0, "table", 176);
|
|
1251
|
+
i0.ɵɵelementStart(39, "h3", 174);
|
|
1228
1252
|
i0.ɵɵtext(40, "Reranker spend by driver");
|
|
1229
1253
|
i0.ɵɵelementEnd();
|
|
1230
|
-
i0.ɵɵconditionalCreate(41,
|
|
1231
|
-
i0.ɵɵelementStart(43, "h3",
|
|
1254
|
+
i0.ɵɵconditionalCreate(41, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_41_Template, 2, 0, "p", 175)(42, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_42_Template, 12, 0, "table", 176);
|
|
1255
|
+
i0.ɵɵelementStart(43, "h3", 174);
|
|
1232
1256
|
i0.ɵɵtext(44, "Top failure reasons");
|
|
1233
1257
|
i0.ɵɵelementEnd();
|
|
1234
|
-
i0.ɵɵconditionalCreate(45,
|
|
1235
|
-
i0.ɵɵelementStart(47, "button",
|
|
1236
|
-
i0.ɵɵlistener("click", function
|
|
1237
|
-
i0.ɵɵelement(48, "i",
|
|
1258
|
+
i0.ɵɵconditionalCreate(45, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_45_Template, 2, 0, "p", 175)(46, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_46_Template, 10, 0, "table", 176);
|
|
1259
|
+
i0.ɵɵelementStart(47, "button", 177);
|
|
1260
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Template_button_click_47_listener() { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.LoadSearchAnalytics()); });
|
|
1261
|
+
i0.ɵɵelement(48, "i", 168);
|
|
1238
1262
|
i0.ɵɵtext(49, " Refresh ");
|
|
1239
1263
|
i0.ɵɵelementEnd();
|
|
1240
1264
|
} if (rf & 2) {
|
|
1241
|
-
const
|
|
1265
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1242
1266
|
i0.ɵɵadvance(5);
|
|
1243
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 9,
|
|
1267
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 9, ctx_r1.AnalyticsTotalRuns));
|
|
1244
1268
|
i0.ɵɵadvance(6);
|
|
1245
|
-
i0.ɵɵtextInterpolate1("",
|
|
1269
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.AnalyticsSuccessRate, "%");
|
|
1246
1270
|
i0.ɵɵadvance(5);
|
|
1247
|
-
i0.ɵɵtextInterpolate1("",
|
|
1271
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.AnalyticsHitRate, "%");
|
|
1248
1272
|
i0.ɵɵadvance(7);
|
|
1249
|
-
i0.ɵɵtextInterpolate1("",
|
|
1273
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.AnalyticsAvgLatencyMs, "ms");
|
|
1250
1274
|
i0.ɵɵadvance(5);
|
|
1251
|
-
i0.ɵɵtextInterpolate1("",
|
|
1275
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.AnalyticsP95LatencyMs, "ms");
|
|
1252
1276
|
i0.ɵɵadvance(5);
|
|
1253
|
-
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(34, 11,
|
|
1277
|
+
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(34, 11, ctx_r1.AnalyticsTotalRerankerCostCents, "1.0-2"), "\u00A2");
|
|
1254
1278
|
i0.ɵɵadvance(4);
|
|
1255
|
-
i0.ɵɵconditional(
|
|
1279
|
+
i0.ɵɵconditional(ctx_r1.AnalyticsTopScopes.length === 0 ? 37 : 38);
|
|
1256
1280
|
i0.ɵɵadvance(4);
|
|
1257
|
-
i0.ɵɵconditional(
|
|
1281
|
+
i0.ɵɵconditional(ctx_r1.AnalyticsRerankerSpend.length === 0 ? 41 : 42);
|
|
1258
1282
|
i0.ɵɵadvance(4);
|
|
1259
|
-
i0.ɵɵconditional(
|
|
1283
|
+
i0.ɵɵconditional(ctx_r1.AnalyticsTopFailures.length === 0 ? 45 : 46);
|
|
1260
1284
|
} }
|
|
1261
|
-
function
|
|
1262
|
-
i0.ɵɵelementStart(0, "div",
|
|
1263
|
-
i0.ɵɵelement(2, "i",
|
|
1285
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
1286
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "h2", 21);
|
|
1287
|
+
i0.ɵɵelement(2, "i", 164);
|
|
1264
1288
|
i0.ɵɵtext(3, " Search Analytics");
|
|
1265
1289
|
i0.ɵɵelementEnd();
|
|
1266
|
-
i0.ɵɵelementStart(4, "p",
|
|
1290
|
+
i0.ɵɵelementStart(4, "p", 22);
|
|
1267
1291
|
i0.ɵɵtext(5, "Aggregated metrics over the last 5,000 search invocations from ");
|
|
1268
1292
|
i0.ɵɵelementStart(6, "code");
|
|
1269
1293
|
i0.ɵɵtext(7, "MJ: Search Execution Logs");
|
|
1270
1294
|
i0.ɵɵelementEnd();
|
|
1271
1295
|
i0.ɵɵtext(8, ". Use this to spot slow scopes, high-failure queries, or runaway reranker spend.");
|
|
1272
1296
|
i0.ɵɵelementEnd();
|
|
1273
|
-
i0.ɵɵconditionalCreate(9,
|
|
1297
|
+
i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_9_Template, 1, 0, "mj-loading", 165)(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_10_Template, 3, 0, "button", 166)(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Template, 50, 14);
|
|
1274
1298
|
i0.ɵɵelementEnd();
|
|
1275
1299
|
} if (rf & 2) {
|
|
1276
|
-
const
|
|
1300
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1277
1301
|
i0.ɵɵadvance(9);
|
|
1278
|
-
i0.ɵɵconditional(
|
|
1302
|
+
i0.ɵɵconditional(ctx_r1.AnalyticsLoading ? 9 : !ctx_r1.AnalyticsLoaded ? 10 : 11);
|
|
1279
1303
|
} }
|
|
1280
|
-
function
|
|
1281
|
-
i0.ɵɵelementStart(0, "div",
|
|
1282
|
-
i0.ɵɵelement(1, "i",
|
|
1304
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
1305
|
+
i0.ɵɵelementStart(0, "div", 179);
|
|
1306
|
+
i0.ɵɵelement(1, "i", 89);
|
|
1283
1307
|
i0.ɵɵtext(2, " Loading permission rows... ");
|
|
1284
1308
|
i0.ɵɵelementEnd();
|
|
1285
1309
|
} }
|
|
1286
|
-
function
|
|
1287
|
-
i0.ɵɵelementStart(0, "div",
|
|
1310
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
1311
|
+
i0.ɵɵelementStart(0, "div", 190);
|
|
1288
1312
|
i0.ɵɵtext(1, " No permission rows match your filters. ");
|
|
1289
1313
|
i0.ɵɵelementEnd();
|
|
1290
1314
|
} }
|
|
1291
|
-
function
|
|
1315
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1292
1316
|
i0.ɵɵtext(0);
|
|
1293
|
-
i0.ɵɵelementStart(1, "span",
|
|
1317
|
+
i0.ɵɵelementStart(1, "span", 193);
|
|
1294
1318
|
i0.ɵɵtext(2);
|
|
1295
1319
|
i0.ɵɵelementEnd();
|
|
1296
1320
|
} if (rf & 2) {
|
|
1297
|
-
const
|
|
1298
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
1321
|
+
const row_r35 = i0.ɵɵnextContext().$implicit;
|
|
1322
|
+
i0.ɵɵtextInterpolate1(" ", row_r35.UserName, " ");
|
|
1299
1323
|
i0.ɵɵadvance(2);
|
|
1300
|
-
i0.ɵɵtextInterpolate1("(",
|
|
1324
|
+
i0.ɵɵtextInterpolate1("(", row_r35.UserEmail, ")");
|
|
1301
1325
|
} }
|
|
1302
|
-
function
|
|
1326
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
1303
1327
|
i0.ɵɵtext(0);
|
|
1304
1328
|
} if (rf & 2) {
|
|
1305
|
-
const
|
|
1306
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
1329
|
+
const row_r35 = i0.ɵɵnextContext().$implicit;
|
|
1330
|
+
i0.ɵɵtextInterpolate1(" ", row_r35.RoleName, " ");
|
|
1307
1331
|
} }
|
|
1308
|
-
function
|
|
1309
|
-
i0.ɵɵelementStart(0, "span",
|
|
1332
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
1333
|
+
i0.ɵɵelementStart(0, "span", 192);
|
|
1310
1334
|
i0.ɵɵtext(1, "User");
|
|
1311
1335
|
i0.ɵɵelementEnd();
|
|
1312
1336
|
} }
|
|
1313
|
-
function
|
|
1314
|
-
i0.ɵɵelementStart(0, "span",
|
|
1337
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
1338
|
+
i0.ɵɵelementStart(0, "span", 192);
|
|
1315
1339
|
i0.ɵɵtext(1, "Role");
|
|
1316
1340
|
i0.ɵɵelementEnd();
|
|
1317
1341
|
} }
|
|
1318
|
-
function
|
|
1342
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Template(rf, ctx) { if (rf & 1) {
|
|
1319
1343
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
1320
1344
|
i0.ɵɵtext(2);
|
|
1321
1345
|
i0.ɵɵelementEnd();
|
|
1322
1346
|
i0.ɵɵelementStart(3, "td");
|
|
1323
|
-
i0.ɵɵconditionalCreate(4,
|
|
1347
|
+
i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_4_Template, 3, 2)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_5_Template, 1, 1);
|
|
1324
1348
|
i0.ɵɵelementEnd();
|
|
1325
1349
|
i0.ɵɵelementStart(6, "td");
|
|
1326
|
-
i0.ɵɵconditionalCreate(7,
|
|
1327
|
-
i0.ɵɵconditionalCreate(8,
|
|
1350
|
+
i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_7_Template, 2, 0, "span", 192);
|
|
1351
|
+
i0.ɵɵconditionalCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_8_Template, 2, 0, "span", 192);
|
|
1328
1352
|
i0.ɵɵelementEnd();
|
|
1329
1353
|
i0.ɵɵelementStart(9, "td")(10, "span");
|
|
1330
1354
|
i0.ɵɵpipe(11, "lowercase");
|
|
1331
1355
|
i0.ɵɵtext(12);
|
|
1332
1356
|
i0.ɵɵelementEnd()()();
|
|
1333
1357
|
} if (rf & 2) {
|
|
1334
|
-
const
|
|
1358
|
+
const row_r35 = ctx.$implicit;
|
|
1335
1359
|
i0.ɵɵadvance(2);
|
|
1336
|
-
i0.ɵɵtextInterpolate(
|
|
1360
|
+
i0.ɵɵtextInterpolate(row_r35.SearchScopeName);
|
|
1337
1361
|
i0.ɵɵadvance(2);
|
|
1338
|
-
i0.ɵɵconditional(
|
|
1362
|
+
i0.ɵɵconditional(row_r35.UserID ? 4 : 5);
|
|
1339
1363
|
i0.ɵɵadvance(3);
|
|
1340
|
-
i0.ɵɵconditional(
|
|
1364
|
+
i0.ɵɵconditional(row_r35.UserID ? 7 : -1);
|
|
1341
1365
|
i0.ɵɵadvance();
|
|
1342
|
-
i0.ɵɵconditional(
|
|
1366
|
+
i0.ɵɵconditional(row_r35.RoleID ? 8 : -1);
|
|
1343
1367
|
i0.ɵɵadvance(2);
|
|
1344
|
-
i0.ɵɵclassMap(i0.ɵɵinterpolate1("search-permissions-level search-permissions-level-", i0.ɵɵpipeBind1(11, 8,
|
|
1368
|
+
i0.ɵɵclassMap(i0.ɵɵinterpolate1("search-permissions-level search-permissions-level-", i0.ɵɵpipeBind1(11, 8, row_r35.PermissionLevel)));
|
|
1345
1369
|
i0.ɵɵadvance(2);
|
|
1346
|
-
i0.ɵɵtextInterpolate(
|
|
1370
|
+
i0.ɵɵtextInterpolate(row_r35.PermissionLevel);
|
|
1347
1371
|
} }
|
|
1348
|
-
function
|
|
1349
|
-
i0.ɵɵelementStart(0, "table",
|
|
1372
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
1373
|
+
i0.ɵɵelementStart(0, "table", 191)(1, "thead")(2, "tr")(3, "th");
|
|
1350
1374
|
i0.ɵɵtext(4, "Scope");
|
|
1351
1375
|
i0.ɵɵelementEnd();
|
|
1352
1376
|
i0.ɵɵelementStart(5, "th");
|
|
@@ -1359,168 +1383,171 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_16_Condition
|
|
|
1359
1383
|
i0.ɵɵtext(10, "Permission Level");
|
|
1360
1384
|
i0.ɵɵelementEnd()()();
|
|
1361
1385
|
i0.ɵɵelementStart(11, "tbody");
|
|
1362
|
-
i0.ɵɵrepeaterCreate(12,
|
|
1386
|
+
i0.ɵɵrepeaterCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Template, 13, 10, "tr", null, _forTrack0);
|
|
1363
1387
|
i0.ɵɵelementEnd()();
|
|
1364
1388
|
} if (rf & 2) {
|
|
1365
|
-
const
|
|
1389
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
1366
1390
|
i0.ɵɵadvance(12);
|
|
1367
|
-
i0.ɵɵrepeater(
|
|
1391
|
+
i0.ɵɵrepeater(ctx_r1.FilteredPermissionsRows);
|
|
1368
1392
|
} }
|
|
1369
|
-
function
|
|
1370
|
-
const
|
|
1371
|
-
i0.ɵɵelementStart(0, "div",
|
|
1372
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
1393
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
1394
|
+
const _r34 = i0.ɵɵgetCurrentView();
|
|
1395
|
+
i0.ɵɵelementStart(0, "div", 180)(1, "input", 181);
|
|
1396
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterScope, $event) || (ctx_r1.PermissionsFilterScope = $event); return i0.ɵɵresetView($event); });
|
|
1373
1397
|
i0.ɵɵelementEnd();
|
|
1374
|
-
i0.ɵɵelementStart(2, "input",
|
|
1375
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
1398
|
+
i0.ɵɵelementStart(2, "input", 182);
|
|
1399
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterPrincipal, $event) || (ctx_r1.PermissionsFilterPrincipal = $event); return i0.ɵɵresetView($event); });
|
|
1376
1400
|
i0.ɵɵelementEnd();
|
|
1377
|
-
i0.ɵɵelementStart(3, "select",
|
|
1378
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
1379
|
-
i0.ɵɵelementStart(4, "option",
|
|
1401
|
+
i0.ɵɵelementStart(3, "select", 183);
|
|
1402
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Template_select_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterLevel, $event) || (ctx_r1.PermissionsFilterLevel = $event); return i0.ɵɵresetView($event); });
|
|
1403
|
+
i0.ɵɵelementStart(4, "option", 184);
|
|
1380
1404
|
i0.ɵɵtext(5, "All levels");
|
|
1381
1405
|
i0.ɵɵelementEnd();
|
|
1382
|
-
i0.ɵɵelementStart(6, "option",
|
|
1406
|
+
i0.ɵɵelementStart(6, "option", 185);
|
|
1383
1407
|
i0.ɵɵtext(7, "None");
|
|
1384
1408
|
i0.ɵɵelementEnd();
|
|
1385
|
-
i0.ɵɵelementStart(8, "option",
|
|
1409
|
+
i0.ɵɵelementStart(8, "option", 186);
|
|
1386
1410
|
i0.ɵɵtext(9, "Read");
|
|
1387
1411
|
i0.ɵɵelementEnd();
|
|
1388
|
-
i0.ɵɵelementStart(10, "option",
|
|
1412
|
+
i0.ɵɵelementStart(10, "option", 187);
|
|
1389
1413
|
i0.ɵɵtext(11, "Search");
|
|
1390
1414
|
i0.ɵɵelementEnd();
|
|
1391
|
-
i0.ɵɵelementStart(12, "option",
|
|
1415
|
+
i0.ɵɵelementStart(12, "option", 188);
|
|
1392
1416
|
i0.ɵɵtext(13, "Manage");
|
|
1393
1417
|
i0.ɵɵelementEnd()();
|
|
1394
|
-
i0.ɵɵelementStart(14, "button",
|
|
1395
|
-
i0.ɵɵlistener("click", function
|
|
1396
|
-
i0.ɵɵelement(15, "i",
|
|
1418
|
+
i0.ɵɵelementStart(14, "button", 167);
|
|
1419
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.RefreshPermissionsAudit()); });
|
|
1420
|
+
i0.ɵɵelement(15, "i", 168);
|
|
1397
1421
|
i0.ɵɵtext(16, " Refresh ");
|
|
1398
1422
|
i0.ɵɵelementEnd()();
|
|
1399
|
-
i0.ɵɵelementStart(17, "div",
|
|
1423
|
+
i0.ɵɵelementStart(17, "div", 189);
|
|
1400
1424
|
i0.ɵɵtext(18);
|
|
1401
1425
|
i0.ɵɵelementEnd();
|
|
1402
|
-
i0.ɵɵconditionalCreate(19,
|
|
1426
|
+
i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_19_Template, 2, 0, "div", 190)(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_Template, 14, 0, "table", 191);
|
|
1403
1427
|
} if (rf & 2) {
|
|
1404
|
-
const
|
|
1428
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1405
1429
|
i0.ɵɵadvance();
|
|
1406
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
1430
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PermissionsFilterScope);
|
|
1407
1431
|
i0.ɵɵadvance();
|
|
1408
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
1432
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PermissionsFilterPrincipal);
|
|
1409
1433
|
i0.ɵɵadvance();
|
|
1410
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
1434
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PermissionsFilterLevel);
|
|
1411
1435
|
i0.ɵɵadvance(15);
|
|
1412
|
-
i0.ɵɵtextInterpolate2(" Showing ",
|
|
1436
|
+
i0.ɵɵtextInterpolate2(" Showing ", ctx_r1.FilteredPermissionsRows.length, " of ", ctx_r1.PermissionsRows.length, " rows ");
|
|
1413
1437
|
i0.ɵɵadvance();
|
|
1414
|
-
i0.ɵɵconditional(
|
|
1438
|
+
i0.ɵɵconditional(ctx_r1.FilteredPermissionsRows.length === 0 ? 19 : 20);
|
|
1415
1439
|
} }
|
|
1416
|
-
function
|
|
1417
|
-
i0.ɵɵelementStart(0, "div",
|
|
1418
|
-
i0.ɵɵelement(2, "i",
|
|
1440
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
1441
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "h2", 21);
|
|
1442
|
+
i0.ɵɵelement(2, "i", 178);
|
|
1419
1443
|
i0.ɵɵtext(3, " Permissions");
|
|
1420
1444
|
i0.ɵɵelementEnd();
|
|
1421
|
-
i0.ɵɵelementStart(4, "p",
|
|
1445
|
+
i0.ɵɵelementStart(4, "p", 22);
|
|
1422
1446
|
i0.ɵɵtext(5, " Cross-scope view of every ");
|
|
1423
1447
|
i0.ɵɵelementStart(6, "code");
|
|
1424
1448
|
i0.ɵɵtext(7, "SearchScopePermission");
|
|
1425
1449
|
i0.ɵɵelementEnd();
|
|
1426
1450
|
i0.ɵɵtext(8, " row. Filter by scope, by user/role, or by permission level to answer \"who has access to what\". Read-only \u2014 to add or edit a grant, open the SearchScope's full form and use its Permissions panel. ");
|
|
1427
1451
|
i0.ɵɵelementEnd();
|
|
1428
|
-
i0.ɵɵconditionalCreate(9,
|
|
1429
|
-
i0.ɵɵconditionalCreate(10,
|
|
1452
|
+
i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_9_Template, 3, 0, "div", 179);
|
|
1453
|
+
i0.ɵɵconditionalCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Template, 21, 6);
|
|
1430
1454
|
i0.ɵɵelementEnd();
|
|
1431
1455
|
} if (rf & 2) {
|
|
1432
|
-
const
|
|
1456
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1433
1457
|
i0.ɵɵadvance(9);
|
|
1434
|
-
i0.ɵɵconditional(
|
|
1458
|
+
i0.ɵɵconditional(ctx_r1.PermissionsLoading ? 9 : -1);
|
|
1435
1459
|
i0.ɵɵadvance();
|
|
1436
|
-
i0.ɵɵconditional(
|
|
1460
|
+
i0.ɵɵconditional(ctx_r1.PermissionsLoaded && !ctx_r1.PermissionsLoading ? 10 : -1);
|
|
1437
1461
|
} }
|
|
1438
|
-
function
|
|
1439
|
-
i0.ɵɵelementStart(0, "div",
|
|
1440
|
-
i0.ɵɵelement(2, "i",
|
|
1462
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
1463
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "h2", 21);
|
|
1464
|
+
i0.ɵɵelement(2, "i", 194);
|
|
1441
1465
|
i0.ɵɵtext(3, " Scheduling");
|
|
1442
1466
|
i0.ɵɵelementEnd();
|
|
1443
|
-
i0.ɵɵelementStart(4, "p",
|
|
1467
|
+
i0.ɵɵelementStart(4, "p", 22);
|
|
1444
1468
|
i0.ɵɵtext(5, "Manage automated pipeline schedules for content classification and vector sync. Create schedules here or manage all schedules in the dedicated Scheduling app.");
|
|
1445
1469
|
i0.ɵɵelementEnd();
|
|
1446
|
-
i0.ɵɵelementStart(6, "div",
|
|
1447
|
-
i0.ɵɵelement(7, "app-scheduling-resource");
|
|
1470
|
+
i0.ɵɵelementStart(6, "div", 195);
|
|
1471
|
+
i0.ɵɵelement(7, "app-scheduling-resource", 196);
|
|
1448
1472
|
i0.ɵɵelementEnd()();
|
|
1473
|
+
} if (rf & 2) {
|
|
1474
|
+
i0.ɵɵadvance(7);
|
|
1475
|
+
i0.ɵɵproperty("HideToolbar", true);
|
|
1449
1476
|
} }
|
|
1450
|
-
function
|
|
1451
|
-
i0.ɵɵelement(0, "i",
|
|
1477
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1478
|
+
i0.ɵɵelement(0, "i", 89);
|
|
1452
1479
|
i0.ɵɵtext(1, " Saving... ");
|
|
1453
1480
|
} }
|
|
1454
|
-
function
|
|
1455
|
-
i0.ɵɵelement(0, "i",
|
|
1481
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
1482
|
+
i0.ɵɵelement(0, "i", 138);
|
|
1456
1483
|
i0.ɵɵtext(1, " Save Changes ");
|
|
1457
1484
|
} }
|
|
1458
|
-
function
|
|
1459
|
-
const
|
|
1460
|
-
i0.ɵɵelementStart(0, "div",
|
|
1485
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
1486
|
+
const _r36 = i0.ɵɵgetCurrentView();
|
|
1487
|
+
i0.ɵɵelementStart(0, "div", 19)(1, "span", 197);
|
|
1461
1488
|
i0.ɵɵtext(2, "You have unsaved changes");
|
|
1462
1489
|
i0.ɵɵelementEnd();
|
|
1463
|
-
i0.ɵɵelementStart(3, "button",
|
|
1464
|
-
i0.ɵɵlistener("click", function
|
|
1465
|
-
i0.ɵɵconditionalCreate(4,
|
|
1490
|
+
i0.ɵɵelementStart(3, "button", 198);
|
|
1491
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveConfiguration()); });
|
|
1492
|
+
i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Conditional_4_Template, 2, 0)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Conditional_5_Template, 2, 0);
|
|
1466
1493
|
i0.ɵɵelementEnd();
|
|
1467
|
-
i0.ɵɵelementStart(6, "button",
|
|
1468
|
-
i0.ɵɵlistener("click", function
|
|
1494
|
+
i0.ɵɵelementStart(6, "button", 199);
|
|
1495
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ResetConfiguration()); });
|
|
1469
1496
|
i0.ɵɵtext(7, " Reset ");
|
|
1470
1497
|
i0.ɵɵelementEnd()();
|
|
1471
1498
|
} if (rf & 2) {
|
|
1472
|
-
const
|
|
1499
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1473
1500
|
i0.ɵɵadvance(3);
|
|
1474
|
-
i0.ɵɵproperty("disabled",
|
|
1501
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
1475
1502
|
i0.ɵɵadvance();
|
|
1476
|
-
i0.ɵɵconditional(
|
|
1503
|
+
i0.ɵɵconditional(ctx_r1.IsSaving ? 4 : 5);
|
|
1477
1504
|
i0.ɵɵadvance(2);
|
|
1478
|
-
i0.ɵɵproperty("disabled",
|
|
1505
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
1479
1506
|
} }
|
|
1480
|
-
function
|
|
1481
|
-
i0.ɵɵelementStart(0, "div",
|
|
1482
|
-
i0.ɵɵelement(3, "i",
|
|
1507
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
1508
|
+
i0.ɵɵelementStart(0, "div", 6)(1, "nav", 12)(2, "div", 13);
|
|
1509
|
+
i0.ɵɵelement(3, "i", 14);
|
|
1483
1510
|
i0.ɵɵelementStart(4, "span");
|
|
1484
1511
|
i0.ɵɵtext(5, "Configuration");
|
|
1485
1512
|
i0.ɵɵelementEnd()();
|
|
1486
|
-
i0.ɵɵrepeaterCreate(6,
|
|
1487
|
-
i0.ɵɵelementEnd();
|
|
1488
|
-
i0.ɵɵelementStart(8, "div",
|
|
1489
|
-
i0.ɵɵconditionalCreate(9,
|
|
1490
|
-
i0.ɵɵconditionalCreate(10,
|
|
1491
|
-
i0.ɵɵconditionalCreate(11,
|
|
1492
|
-
i0.ɵɵconditionalCreate(12,
|
|
1493
|
-
i0.ɵɵconditionalCreate(13,
|
|
1494
|
-
i0.ɵɵconditionalCreate(14,
|
|
1495
|
-
i0.ɵɵconditionalCreate(15,
|
|
1496
|
-
i0.ɵɵconditionalCreate(16,
|
|
1497
|
-
i0.ɵɵconditionalCreate(17,
|
|
1498
|
-
i0.ɵɵconditionalCreate(18,
|
|
1513
|
+
i0.ɵɵrepeaterCreate(6, KnowledgeConfigResourceComponent_Conditional_8_For_7_Template, 4, 5, "button", 15, _forTrack0);
|
|
1514
|
+
i0.ɵɵelementEnd();
|
|
1515
|
+
i0.ɵɵelementStart(8, "div", 16);
|
|
1516
|
+
i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template, 34, 4, "div", 17);
|
|
1517
|
+
i0.ɵɵconditionalCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template, 49, 26, "div", 17);
|
|
1518
|
+
i0.ɵɵconditionalCreate(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template, 8, 1, "div", 17);
|
|
1519
|
+
i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template, 7, 1, "div", 17);
|
|
1520
|
+
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template, 34, 8, "div", 17);
|
|
1521
|
+
i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template, 20, 3, "div", 17);
|
|
1522
|
+
i0.ɵɵconditionalCreate(15, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Template, 12, 1, "div", 18);
|
|
1523
|
+
i0.ɵɵconditionalCreate(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Template, 11, 2, "div", 18);
|
|
1524
|
+
i0.ɵɵconditionalCreate(17, KnowledgeConfigResourceComponent_Conditional_8_Conditional_17_Template, 8, 1, "div", 18);
|
|
1525
|
+
i0.ɵɵconditionalCreate(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Template, 8, 3, "div", 19);
|
|
1499
1526
|
i0.ɵɵelementEnd()();
|
|
1500
1527
|
} if (rf & 2) {
|
|
1501
|
-
const
|
|
1528
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
1502
1529
|
i0.ɵɵadvance(6);
|
|
1503
|
-
i0.ɵɵrepeater(
|
|
1530
|
+
i0.ɵɵrepeater(ctx_r1.Sections);
|
|
1504
1531
|
i0.ɵɵadvance(3);
|
|
1505
|
-
i0.ɵɵconditional(
|
|
1532
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "pipeline" ? 9 : -1);
|
|
1506
1533
|
i0.ɵɵadvance();
|
|
1507
|
-
i0.ɵɵconditional(
|
|
1534
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "vectordb" ? 10 : -1);
|
|
1508
1535
|
i0.ɵɵadvance();
|
|
1509
|
-
i0.ɵɵconditional(
|
|
1536
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "fulltext" ? 11 : -1);
|
|
1510
1537
|
i0.ɵɵadvance();
|
|
1511
|
-
i0.ɵɵconditional(
|
|
1538
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "embedding" ? 12 : -1);
|
|
1512
1539
|
i0.ɵɵadvance();
|
|
1513
|
-
i0.ɵɵconditional(
|
|
1540
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "thresholds" ? 13 : -1);
|
|
1514
1541
|
i0.ɵɵadvance();
|
|
1515
|
-
i0.ɵɵconditional(
|
|
1542
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "search-scopes" ? 14 : -1);
|
|
1516
1543
|
i0.ɵɵadvance();
|
|
1517
|
-
i0.ɵɵconditional(
|
|
1544
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "search-analytics" ? 15 : -1);
|
|
1518
1545
|
i0.ɵɵadvance();
|
|
1519
|
-
i0.ɵɵconditional(
|
|
1546
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "search-permissions" ? 16 : -1);
|
|
1520
1547
|
i0.ɵɵadvance();
|
|
1521
|
-
i0.ɵɵconditional(
|
|
1548
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "scheduling" ? 17 : -1);
|
|
1522
1549
|
i0.ɵɵadvance();
|
|
1523
|
-
i0.ɵɵconditional(
|
|
1550
|
+
i0.ɵɵconditional(ctx_r1.HasUnsavedChanges ? 18 : -1);
|
|
1524
1551
|
} }
|
|
1525
1552
|
let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent extends BaseResourceComponent {
|
|
1526
1553
|
cdr = inject(ChangeDetectorRef);
|
|
@@ -2372,11 +2399,26 @@ let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent ex
|
|
|
2372
2399
|
}));
|
|
2373
2400
|
}
|
|
2374
2401
|
static ɵfac = /*@__PURE__*/ (() => { let ɵKnowledgeConfigResourceComponent_BaseFactory; return function KnowledgeConfigResourceComponent_Factory(__ngFactoryType__) { return (ɵKnowledgeConfigResourceComponent_BaseFactory || (ɵKnowledgeConfigResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(KnowledgeConfigResourceComponent)))(__ngFactoryType__ || KnowledgeConfigResourceComponent); }; })();
|
|
2375
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KnowledgeConfigResourceComponent, selectors: [["app-knowledge-config-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
2376
|
-
i0.ɵɵ
|
|
2402
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KnowledgeConfigResourceComponent, selectors: [["app-knowledge-config-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 9, vars: 4, consts: [["Title", "Knowledge Hub Configuration", "Icon", "fa-solid fa-cogs", "Subtitle", "Pipeline, vector store, search, and automation settings"], ["meta", ""], ["Icon", "fa-solid fa-circle-exclamation", "Label", "Unsaved changes", "Variant", "warning"], ["actions", ""], [3, "Flex"], [1, "config-loading"], [1, "config-layout"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Discard unsaved changes", 3, "click", "disabled"], [1, "fa-solid", "fa-arrow-rotate-left"], ["mjButton", "", "variant", "primary", "size", "sm", "title", "Save all settings", 3, "click", "disabled"], [1, "fa-solid", "fa-floppy-disk"], ["text", "Loading configuration...", "size", "medium"], [1, "config-nav"], [1, "config-nav-header"], [1, "fa-solid", "fa-cogs"], [1, "config-nav-item", 3, "config-nav-item-active"], [1, "config-content"], [1, "config-section"], [1, "config-section-content"], [1, "config-save-bar"], [1, "config-nav-item", 3, "click"], [1, "config-section-title"], [1, "config-section-desc"], [1, "config-group"], [1, "config-toggle-row"], [1, "config-toggle-info"], [1, "config-label"], [1, "config-hint"], ["type", "checkbox", 1, "config-checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "config-field-row"], [1, "config-field-info"], ["type", "number", "min", "10", "max", "1000", 1, "config-input", "config-input-number", 3, "ngModelChange", "input", "ngModel"], ["type", "number", "min", "1", "max", "10", 1, "config-input", "config-input-number", 3, "ngModelChange", "input", "ngModel"], [1, "setup-progress"], [1, "setup-progress-header"], [1, "setup-progress-label"], [1, "setup-progress-count"], [1, "setup-progress-bar"], [1, "setup-progress-fill"], [1, "setup-step"], [1, "setup-step-header"], [1, "setup-step-indicator"], [1, "fa-solid", "fa-circle-check"], [1, "setup-step-number"], [1, "setup-step-info"], [1, "setup-step-title"], [1, "setup-step-status"], [1, "setup-step-detail"], [1, "setup-step-action"], [1, "create-index-form"], [1, "provider-card"], [1, "provider-icon"], [1, "fa-solid", "fa-database"], [1, "provider-info"], [1, "provider-name"], [1, "provider-class"], [1, "config-status-badge", "config-status-active"], [1, "provider-credential-row"], [1, "provider-credential-label"], [1, "fa-solid", "fa-key"], [1, "provider-credential-picker"], [1, "provider-credential-select", 3, "ngModelChange", "change", "ngModel", "disabled"], [3, "ngValue"], [1, "fa-solid", "fa-spinner", "fa-spin", "provider-credential-spinner"], [1, "config-tag-list"], [1, "config-tag"], [1, "setup-step-action", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "index-card"], [1, "index-icon"], [1, "fa-solid", "fa-cubes"], [1, "index-info"], [1, "index-name"], [1, "index-meta"], [1, "fa-solid", "fa-microchip"], [1, "index-actions"], ["title", "Delete index", 1, "index-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "create-index-title"], [1, "fa-solid", "fa-plus-circle"], [1, "create-index-fields"], [1, "create-index-field"], [1, "create-index-label"], ["type", "text", "placeholder", "e.g., mj-knowledge-index", 1, "config-input", 3, "ngModelChange", "ngModel"], [1, "config-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "create-index-actions"], [1, "create-index-submit", 3, "click", "disabled"], [1, "create-index-cancel", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["text", "Discovering searchable entities...", "size", "medium"], [1, "config-empty-state"], [1, "fa-solid", "fa-text-width", "config-empty-icon"], [1, "config-empty-title"], [1, "config-empty-text"], [1, "fts-entity-controls"], [1, "fts-summary"], [1, "fts-summary-count"], ["type", "text", "placeholder", "Filter entities...", 1, "config-input", "fts-filter-input", 3, "ngModelChange", "ngModel"], [1, "fts-entity-list"], [1, "fts-entity-card", 3, "fts-entity-enabled"], [1, "fts-entity-card"], [1, "fts-entity-toggle"], [1, "fts-entity-info"], [1, "fts-entity-name"], [1, "fts-entity-fields"], [1, "fts-field-tag"], [1, "fts-entity-meta"], ["title", "Title field", 1, "fts-entity-title-field"], [1, "fa-solid", "fa-heading"], ["title", "Snippet field", 1, "fts-entity-snippet-field"], [1, "fa-solid", "fa-align-left"], [1, "config-value-display"], [1, "config-section-note"], [1, "fa-solid", "fa-info-circle"], [1, "fa-solid", "fa-microchip", "config-empty-icon"], ["type", "range", "min", "0.5", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], ["type", "range", "min", "0.3", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], ["type", "range", "min", "0", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], [1, "fa-solid", "fa-compass-drafting"], [1, "scope-manager"], [1, "scope-manager-list"], [1, "scope-manager-list-header"], ["type", "button", 1, "scope-manager-new-btn", 3, "click"], [1, "scope-manager-loading"], [1, "scope-manager-empty"], [1, "scope-manager-detail"], [1, "scope-manager-empty-detail"], ["type", "button", 1, "scope-manager-list-item", 3, "active"], ["type", "button", 1, "scope-manager-list-item", 3, "click"], ["aria-hidden", "true"], [1, "scope-manager-list-name"], [1, "scope-manager-badge"], [1, "scope-manager-tabs"], ["type", "button", 1, "scope-manager-tab", 3, "click"], [1, "scope-manager-tab-spacer"], ["type", "button", "title", "Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)", 1, "scope-manager-open-btn"], ["type", "button", 1, "scope-manager-save-btn", 3, "click"], [1, "fa-solid", "fa-save"], ["type", "button", "title", "Delete scope", 1, "scope-manager-delete-btn"], [1, "scope-definition-grid"], ["ChildEntityName", "MJ: Search Scope Providers", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add provider", "EmptyMessage", "No providers assigned. Without any providers, this scope searches nothing.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope External Indexes", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add external index", "EmptyMessage", "No external indexes configured for this scope.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope Entities", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add entity", "EmptyMessage", "No entities configured. Scoped entity search will return no rows.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope Storage Accounts", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add storage folder", "EmptyMessage", "No storage accounts linked to this scope.", 3, "ParentID", "Columns"], ["type", "button", "title", "Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)", 1, "scope-manager-open-btn", 3, "click"], [1, "fa-solid", "fa-up-right-from-square"], ["type", "button", "title", "Delete scope", 1, "scope-manager-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash"], ["type", "text", 1, "mj-input", 3, "change", "value"], [1, "scope-definition-full"], ["rows", "2", 1, "mj-textarea", 3, "change", "value"], [1, "mj-input", 3, "change", "value"], ["value", "Active"], ["value", "Inactive"], ["type", "datetime-local", 1, "mj-input", 3, "change", "value"], [1, "scope-definition-toggle"], ["type", "checkbox", 3, "change", "checked", "disabled"], ["type", "checkbox", "disabled", "", 3, "checked"], ["rows", "4", "spellcheck", "false", 1, "mj-textarea", "scope-code-block", 3, "change", "value"], [1, "scope-permissions-help", 2, "margin-bottom", "12px", "padding", "8px 12px", "background", "var(--mj-bg-surface-card)", "border-left", "3px solid var(--mj-brand-primary)", "border-radius", "4px"], [2, "margin", "0", "font-size", "0.95em"], [1, "fa-solid", "fa-shield-halved", 2, "color", "var(--mj-brand-primary)"], ["ChildEntityName", "MJ: Search Scope Permissions", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Grant access", "EmptyMessage", "No explicit grants. Access falls back to agent SearchScopeAccess only.", 3, "ParentID", "Columns"], [1, "fa-solid", "fa-chart-line"], ["text", "Loading analytics\u2026", "size", "medium"], ["type", "button", 1, "mj-input"], ["type", "button", 1, "mj-input", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "search-analytics-kpi-grid"], [1, "search-analytics-kpi"], [1, "search-analytics-kpi-label"], [1, "search-analytics-kpi-value"], [1, "search-analytics-kpi-hint"], [1, "search-analytics-h3"], [1, "search-analytics-empty"], [1, "search-analytics-table"], ["type", "button", 1, "mj-input", "search-analytics-refresh", 3, "click"], [1, "fa-solid", "fa-shield-halved"], [1, "search-permissions-loading"], [1, "search-permissions-filters"], ["type", "text", "placeholder", "Filter by scope name...", 1, "mj-input", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "Filter by user/role (name or email)...", 1, "mj-input", 3, "ngModelChange", "ngModel"], [1, "mj-input", 3, "ngModelChange", "ngModel"], ["value", ""], ["value", "None"], ["value", "Read"], ["value", "Search"], ["value", "Manage"], [1, "search-permissions-summary"], [1, "search-permissions-empty"], [1, "search-permissions-table"], [1, "search-permissions-tag"], [1, "search-permissions-secondary"], [1, "fa-solid", "fa-clock"], [2, "margin-top", "16px"], [3, "HideToolbar"], [1, "config-save-text"], [1, "config-save-btn", 3, "click", "disabled"], [1, "config-reset-btn", 3, "click", "disabled"]], template: function KnowledgeConfigResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
2403
|
+
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1);
|
|
2404
|
+
i0.ɵɵconditionalCreate(3, KnowledgeConfigResourceComponent_Conditional_3_Template, 1, 0, "mj-stat-badge", 2);
|
|
2405
|
+
i0.ɵɵelementEnd();
|
|
2406
|
+
i0.ɵɵelementStart(4, "div", 3);
|
|
2407
|
+
i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_5_Template, 6, 3);
|
|
2408
|
+
i0.ɵɵelementEnd()();
|
|
2409
|
+
i0.ɵɵelementStart(6, "mj-page-body", 4);
|
|
2410
|
+
i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_7_Template, 2, 0, "div", 5)(8, KnowledgeConfigResourceComponent_Conditional_8_Template, 19, 10, "div", 6);
|
|
2411
|
+
i0.ɵɵelementEnd()();
|
|
2377
2412
|
} if (rf & 2) {
|
|
2378
|
-
i0.ɵɵ
|
|
2379
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.RangeValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.LoadingComponent, i3.SearchScopeChildGridComponent, i4.SchedulingResourceComponent, i5.LowerCasePipe, i5.DecimalPipe], styles: ["\n\n\n.config-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 400px;\n}\n\n.config-layout[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n\n\n.config-nav[_ngcontent-%COMP%] {\n width: 240px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n padding: 0.5rem 0;\n}\n\n.config-nav-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n margin-bottom: 0.5rem;\n}\n\n.config-nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n padding: 0.55rem 1rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n text-align: left;\n transition: all 0.15s ease;\n width: 100%;\n}\n\n.config-nav-item[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.config-nav-item-active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n\n\n.config-content[_ngcontent-%COMP%] {\n flex: 1;\n padding: 1.5rem 2rem;\n overflow-y: auto;\n position: relative;\n}\n\n.config-section[_ngcontent-%COMP%] {\n max-width: 700px;\n}\n\n.config-section-title[_ngcontent-%COMP%] {\n font-size: 1.3rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 0.5rem;\n}\n\n.config-section-desc[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n margin-bottom: 1.5rem;\n line-height: 1.5;\n}\n\n\n\n.config-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.config-toggle-row[_ngcontent-%COMP%], \n.config-field-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n transition: background 0.1s ease;\n gap: 1rem;\n}\n\n.config-toggle-row[_ngcontent-%COMP%]:hover, \n.config-field-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.config-toggle-info[_ngcontent-%COMP%], \n.config-field-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n flex: 1;\n}\n\n.config-label[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-hint[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.config-checkbox[_ngcontent-%COMP%] {\n width: 1.1rem;\n height: 1.1rem;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.config-input[_ngcontent-%COMP%] {\n padding: 0.4rem 0.6rem;\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: 0.85rem;\n font-family: inherit;\n}\n\n.config-input-number[_ngcontent-%COMP%] {\n width: 80px;\n text-align: center;\n}\n\n.config-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.config-slider[_ngcontent-%COMP%] {\n width: 200px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.config-value-display[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n padding: 0.3rem 0.6rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: monospace;\n}\n\n\n\n.config-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1.5rem;\n text-align: center;\n gap: 1rem;\n color: var(--mj-text-muted);\n}\n\n.config-placeholder-icon[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n}\n\n\n\n\n.setup-progress[_ngcontent-%COMP%] {\n margin-bottom: 1.5rem;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n}\n\n.setup-progress-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.setup-progress-label[_ngcontent-%COMP%] {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.setup-progress-count[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.setup-progress-bar[_ngcontent-%COMP%] {\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.setup-progress-fill[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n\n\n\n\n.setup-step[_ngcontent-%COMP%] {\n padding: 1rem 1.25rem;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 0.75rem;\n transition: border-color 0.2s;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] {\n border-color: var(--mj-status-success-border);\n background: color-mix(in srgb, var(--mj-status-success) 3%, var(--mj-bg-surface));\n}\n\n.setup-step-pending[_ngcontent-%COMP%] {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.setup-step-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 0.85rem;\n}\n\n.setup-step-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] .setup-step-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: var(--mj-status-success);\n}\n\n.setup-step-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n}\n\n.setup-step-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n}\n\n.setup-step-title[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.setup-step-status[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] .setup-step-status[_ngcontent-%COMP%] {\n color: var(--mj-status-success-text);\n}\n\n\n\n\n.config-group-title[_ngcontent-%COMP%] {\n margin: 0 0 0.75rem 0;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n\n\n\n.config-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: 0.75rem;\n font-weight: 600;\n}\n\n.config-status-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n\n\n\n.setup-step-detail[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n padding-left: 2.85rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.setup-step-action[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.setup-step-action[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n\n.provider-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.provider-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.provider-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.provider-name[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.provider-class[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n\n\n\n.provider-credential-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem 0.75rem;\n margin-top: -0.25rem;\n}\n\n.provider-credential-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.provider-credential-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.provider-credential-picker[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n\n.provider-credential-select[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0.4rem 0.6rem;\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: 0.8rem;\n}\n\n.provider-credential-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.provider-credential-spinner[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n\n\n\n.index-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.index-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-default);\n}\n\n.index-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.index-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.index-name[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.index-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.index-meta[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.65rem;\n}\n\n.index-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n.index-delete-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.index-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n\n\n\n.create-index-form[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n padding: 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-brand-primary);\n border-radius: 10px;\n margin-left: 2.85rem;\n}\n\n.create-index-title[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.create-index-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.create-index-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.create-index-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.create-index-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.config-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: 0.85rem;\n}\n\n.config-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.create-index-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-top: 1rem;\n}\n\n.create-index-submit[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.create-index-submit[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.create-index-submit[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.create-index-cancel[_ngcontent-%COMP%] {\n padding: 8px 18px;\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 font-weight: 500;\n cursor: pointer;\n}\n\n.create-index-cancel[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.config-empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 2rem;\n text-align: center;\n gap: 0.75rem;\n border: 2px dashed var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n}\n\n.config-empty-icon[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n color: var(--mj-text-disabled);\n}\n\n.config-empty-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.config-empty-text[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n max-width: 480px;\n line-height: 1.5;\n}\n\n\n\n.config-tag-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.config-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: 0.78rem;\n font-weight: 500;\n}\n\n\n\n.config-section-note[_ngcontent-%COMP%] {\n margin-top: 1rem;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.config-section-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-info);\n}\n\n\n\n.config-save-bar[_ngcontent-%COMP%] {\n position: sticky;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-top: 2rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.config-save-text[_ngcontent-%COMP%] {\n flex: 1;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n}\n\n.config-save-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.config-save-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.config-save-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.config-reset-btn[_ngcontent-%COMP%] {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.config-reset-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n@media (max-width: 768px) {\n .config-layout[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .config-nav[_ngcontent-%COMP%] {\n width: 100%;\n flex-direction: row;\n overflow-x: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0;\n }\n\n .config-nav-header[_ngcontent-%COMP%] {\n display: none;\n }\n\n .config-nav-item[_ngcontent-%COMP%] {\n white-space: nowrap;\n padding: 0.6rem 1rem;\n }\n\n .config-nav-item-active[_ngcontent-%COMP%] {\n border-left: none;\n border-bottom: 3px solid var(--mj-brand-primary);\n }\n\n .config-content[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n}\n\n\n\n.fts-entity-controls[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.fts-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.fts-summary-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.fts-filter-input[_ngcontent-%COMP%] {\n max-width: 240px;\n}\n\n.fts-entity-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.fts-entity-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s, background 0.15s;\n}\n\n.fts-entity-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.fts-entity-card.fts-entity-enabled[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n}\n\n.fts-entity-toggle[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.fts-entity-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.fts-entity-name[_ngcontent-%COMP%] {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.fts-entity-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.fts-field-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 1px 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.fts-entity-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.fts-entity-title-field[_ngcontent-%COMP%], \n.fts-entity-snippet-field[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.fts-entity-title-field[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.fts-entity-snippet-field[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 4px;\n font-size: 10px;\n}\n\n\n\n\n.scope-manager[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 260px 1fr;\n gap: 16px;\n min-height: 420px;\n}\n\n.scope-manager-list[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-manager-list-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.scope-manager-new-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-link);\n padding: 3px 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.7rem;\n font-weight: 500;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.scope-manager-new-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.scope-manager-loading[_ngcontent-%COMP%], \n.scope-manager-empty[_ngcontent-%COMP%], \n.scope-manager-empty-detail[_ngcontent-%COMP%] {\n padding: 16px;\n color: var(--mj-text-muted);\n text-align: center;\n font-size: 0.85rem;\n}\n\n.scope-manager-empty-detail[_ngcontent-%COMP%] {\n padding: 40px 24px;\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n}\n\n.scope-manager-list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 6px;\n text-align: left;\n transition: background 120ms ease;\n}\n\n.scope-manager-list-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.scope-manager-list-item.active[_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: 500;\n}\n\n.scope-manager-list-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scope-manager-badge[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.scope-manager-detail[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n}\n\n.scope-manager-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.scope-manager-tab[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 6px 12px;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 4px;\n transition: background 120ms ease, color 120ms ease;\n}\n\n.scope-manager-tab[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.scope-manager-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom: 2px solid var(--mj-brand-primary);\n border-radius: 0;\n font-weight: 500;\n}\n\n.scope-manager-tab-spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.scope-manager-save-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-save-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.scope-manager-delete-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-status-error-text);\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.scope-manager-delete-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.scope-manager-open-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-open-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] label[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.scope-definition-full[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.scope-definition-toggle[_ngcontent-%COMP%] {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.scope-definition-toggle[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n accent-color: var(--mj-brand-primary);\n}\n\n.scope-code-block[_ngcontent-%COMP%] {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 8px;\n}\n\n\n\n\n\n.search-analytics-kpi-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.search-analytics-kpi[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.search-analytics-kpi-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.search-analytics-kpi-value[_ngcontent-%COMP%] {\n font-size: 1.6rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-kpi-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n}\n\n.search-analytics-h3[_ngcontent-%COMP%] {\n margin: 22px 0 8px;\n font-size: 1rem;\n color: var(--mj-text-primary);\n}\n\n.search-analytics-empty[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n margin: 4px 0 14px;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.86rem;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.search-analytics-refresh[_ngcontent-%COMP%] {\n margin-top: 16px;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.9rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.82rem;\n}\n\n.search-analytics-refresh[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n\n.search-permissions-loading[_ngcontent-%COMP%] {\n padding: 1.2rem;\n color: var(--mj-text-secondary);\n font-style: italic;\n}\n\n.search-permissions-filters[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr 180px 130px;\n gap: 0.5rem;\n margin-bottom: 0.8rem;\n}\n\n.search-permissions-filters[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n font-size: 0.85rem;\n}\n\n.search-permissions-summary[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n margin-bottom: 0.6rem;\n}\n\n.search-permissions-empty[_ngcontent-%COMP%] {\n padding: 1.2rem;\n color: var(--mj-text-muted);\n text-align: center;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.search-permissions-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 0.5rem 0.7rem;\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n}\n\n.search-permissions-secondary[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-permissions-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.1rem 0.5rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 3px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.search-permissions-level[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.15rem 0.55rem;\n border-radius: 3px;\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.search-permissions-level-none[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.search-permissions-level-read[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info-text);\n}\n\n.search-permissions-level-search[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.search-permissions-level-manage[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}"] });
|
|
2413
|
+
i0.ɵɵadvance(3);
|
|
2414
|
+
i0.ɵɵconditional(ctx.HasUnsavedChanges ? 3 : -1);
|
|
2415
|
+
i0.ɵɵadvance(2);
|
|
2416
|
+
i0.ɵɵconditional(ctx.HasUnsavedChanges ? 5 : -1);
|
|
2417
|
+
i0.ɵɵadvance();
|
|
2418
|
+
i0.ɵɵproperty("Flex", true);
|
|
2419
|
+
i0.ɵɵadvance();
|
|
2420
|
+
i0.ɵɵconditional(ctx.IsLoading ? 7 : 8);
|
|
2421
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.RangeValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.LoadingComponent, i3.SearchScopeChildGridComponent, i4.MJButtonDirective, i4.MJPageHeaderComponent, i4.MJPageLayoutComponent, i4.MJPageBodyComponent, i4.MJStatBadgeComponent, i5.SchedulingResourceComponent, i6.LowerCasePipe, i6.DecimalPipe], styles: ["\n\n\n\n.config-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 400px;\n}\n\n.config-layout[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n\n\n.config-nav[_ngcontent-%COMP%] {\n width: 240px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n padding: 0.5rem 0;\n}\n\n.config-nav-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n margin-bottom: 0.5rem;\n}\n\n.config-nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n padding: 0.55rem 1rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n text-align: left;\n transition: all 0.15s ease;\n width: 100%;\n}\n\n.config-nav-item[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.config-nav-item-active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n\n\n.config-content[_ngcontent-%COMP%] {\n flex: 1;\n padding: 1.5rem 2rem;\n overflow-y: auto;\n position: relative;\n}\n\n.config-section[_ngcontent-%COMP%] {\n max-width: 700px;\n}\n\n.config-section-title[_ngcontent-%COMP%] {\n font-size: 1.3rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 0.5rem;\n}\n\n.config-section-desc[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n margin-bottom: 1.5rem;\n line-height: 1.5;\n}\n\n\n\n.config-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.config-toggle-row[_ngcontent-%COMP%], \n.config-field-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n transition: background 0.1s ease;\n gap: 1rem;\n}\n\n.config-toggle-row[_ngcontent-%COMP%]:hover, \n.config-field-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.config-toggle-info[_ngcontent-%COMP%], \n.config-field-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n flex: 1;\n}\n\n.config-label[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-hint[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.config-checkbox[_ngcontent-%COMP%] {\n width: 1.1rem;\n height: 1.1rem;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.config-input[_ngcontent-%COMP%] {\n padding: 0.4rem 0.6rem;\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: 0.85rem;\n font-family: inherit;\n}\n\n.config-input-number[_ngcontent-%COMP%] {\n width: 80px;\n text-align: center;\n}\n\n.config-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.config-slider[_ngcontent-%COMP%] {\n width: 200px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.config-value-display[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n padding: 0.3rem 0.6rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: monospace;\n}\n\n\n\n.config-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1.5rem;\n text-align: center;\n gap: 1rem;\n color: var(--mj-text-muted);\n}\n\n.config-placeholder-icon[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n}\n\n\n\n\n.setup-progress[_ngcontent-%COMP%] {\n margin-bottom: 1.5rem;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n}\n\n.setup-progress-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.setup-progress-label[_ngcontent-%COMP%] {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.setup-progress-count[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.setup-progress-bar[_ngcontent-%COMP%] {\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.setup-progress-fill[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n\n\n\n\n.setup-step[_ngcontent-%COMP%] {\n padding: 1rem 1.25rem;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 0.75rem;\n transition: border-color 0.2s;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] {\n border-color: var(--mj-status-success-border);\n background: color-mix(in srgb, var(--mj-status-success) 3%, var(--mj-bg-surface));\n}\n\n.setup-step-pending[_ngcontent-%COMP%] {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.setup-step-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 0.85rem;\n}\n\n.setup-step-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] .setup-step-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: var(--mj-status-success);\n}\n\n.setup-step-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n}\n\n.setup-step-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n}\n\n.setup-step-title[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.setup-step-status[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] .setup-step-status[_ngcontent-%COMP%] {\n color: var(--mj-status-success-text);\n}\n\n\n\n\n.config-group-title[_ngcontent-%COMP%] {\n margin: 0 0 0.75rem 0;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n\n\n\n.config-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: 0.75rem;\n font-weight: 600;\n}\n\n.config-status-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n\n\n\n.setup-step-detail[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n padding-left: 2.85rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.setup-step-action[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.setup-step-action[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n\n.provider-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.provider-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.provider-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.provider-name[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.provider-class[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n\n\n\n.provider-credential-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem 0.75rem;\n margin-top: -0.25rem;\n}\n\n.provider-credential-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.provider-credential-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.provider-credential-picker[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n\n.provider-credential-select[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0.4rem 0.6rem;\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: 0.8rem;\n}\n\n.provider-credential-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.provider-credential-spinner[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n\n\n\n.index-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.index-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-default);\n}\n\n.index-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.index-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.index-name[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.index-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.index-meta[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.65rem;\n}\n\n.index-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n.index-delete-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.index-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n\n\n\n.create-index-form[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n padding: 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-brand-primary);\n border-radius: 10px;\n margin-left: 2.85rem;\n}\n\n.create-index-title[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.create-index-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.create-index-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.create-index-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.create-index-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.config-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: 0.85rem;\n}\n\n.config-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.create-index-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-top: 1rem;\n}\n\n.create-index-submit[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.create-index-submit[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.create-index-submit[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.create-index-cancel[_ngcontent-%COMP%] {\n padding: 8px 18px;\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 font-weight: 500;\n cursor: pointer;\n}\n\n.create-index-cancel[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.config-empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 2rem;\n text-align: center;\n gap: 0.75rem;\n border: 2px dashed var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n}\n\n.config-empty-icon[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n color: var(--mj-text-disabled);\n}\n\n.config-empty-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.config-empty-text[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n max-width: 480px;\n line-height: 1.5;\n}\n\n\n\n.config-tag-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.config-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: 0.78rem;\n font-weight: 500;\n}\n\n\n\n.config-section-note[_ngcontent-%COMP%] {\n margin-top: 1rem;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.config-section-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-info);\n}\n\n\n\n.config-save-bar[_ngcontent-%COMP%] {\n position: sticky;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-top: 2rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.config-save-text[_ngcontent-%COMP%] {\n flex: 1;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n}\n\n.config-save-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.config-save-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.config-save-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.config-reset-btn[_ngcontent-%COMP%] {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.config-reset-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n@media (max-width: 768px) {\n .config-layout[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .config-nav[_ngcontent-%COMP%] {\n width: 100%;\n flex-direction: row;\n overflow-x: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0;\n }\n\n .config-nav-header[_ngcontent-%COMP%] {\n display: none;\n }\n\n .config-nav-item[_ngcontent-%COMP%] {\n white-space: nowrap;\n padding: 0.6rem 1rem;\n }\n\n .config-nav-item-active[_ngcontent-%COMP%] {\n border-left: none;\n border-bottom: 3px solid var(--mj-brand-primary);\n }\n\n .config-content[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n}\n\n\n\n.fts-entity-controls[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.fts-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.fts-summary-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.fts-filter-input[_ngcontent-%COMP%] {\n max-width: 240px;\n}\n\n.fts-entity-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.fts-entity-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s, background 0.15s;\n}\n\n.fts-entity-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.fts-entity-card.fts-entity-enabled[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n}\n\n.fts-entity-toggle[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.fts-entity-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.fts-entity-name[_ngcontent-%COMP%] {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.fts-entity-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.fts-field-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 1px 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.fts-entity-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.fts-entity-title-field[_ngcontent-%COMP%], \n.fts-entity-snippet-field[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.fts-entity-title-field[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.fts-entity-snippet-field[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 4px;\n font-size: 10px;\n}\n\n\n\n\n.scope-manager[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 260px 1fr;\n gap: 16px;\n min-height: 420px;\n}\n\n.scope-manager-list[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-manager-list-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.scope-manager-new-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-link);\n padding: 3px 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.7rem;\n font-weight: 500;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.scope-manager-new-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.scope-manager-loading[_ngcontent-%COMP%], \n.scope-manager-empty[_ngcontent-%COMP%], \n.scope-manager-empty-detail[_ngcontent-%COMP%] {\n padding: 16px;\n color: var(--mj-text-muted);\n text-align: center;\n font-size: 0.85rem;\n}\n\n.scope-manager-empty-detail[_ngcontent-%COMP%] {\n padding: 40px 24px;\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n}\n\n.scope-manager-list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 6px;\n text-align: left;\n transition: background 120ms ease;\n}\n\n.scope-manager-list-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.scope-manager-list-item.active[_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: 500;\n}\n\n.scope-manager-list-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scope-manager-badge[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.scope-manager-detail[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n}\n\n.scope-manager-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.scope-manager-tab[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 6px 12px;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 4px;\n transition: background 120ms ease, color 120ms ease;\n}\n\n.scope-manager-tab[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.scope-manager-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom: 2px solid var(--mj-brand-primary);\n border-radius: 0;\n font-weight: 500;\n}\n\n.scope-manager-tab-spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.scope-manager-save-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-save-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.scope-manager-delete-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-status-error-text);\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.scope-manager-delete-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.scope-manager-open-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-open-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] label[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.scope-definition-full[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.scope-definition-toggle[_ngcontent-%COMP%] {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.scope-definition-toggle[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n accent-color: var(--mj-brand-primary);\n}\n\n.scope-code-block[_ngcontent-%COMP%] {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 8px;\n}\n\n\n\n\n\n.search-analytics-kpi-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.search-analytics-kpi[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.search-analytics-kpi-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.search-analytics-kpi-value[_ngcontent-%COMP%] {\n font-size: 1.6rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-kpi-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n}\n\n.search-analytics-h3[_ngcontent-%COMP%] {\n margin: 22px 0 8px;\n font-size: 1rem;\n color: var(--mj-text-primary);\n}\n\n.search-analytics-empty[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n margin: 4px 0 14px;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.86rem;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.search-analytics-refresh[_ngcontent-%COMP%] {\n margin-top: 16px;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.9rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.82rem;\n}\n\n.search-analytics-refresh[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n\n.search-permissions-loading[_ngcontent-%COMP%] {\n padding: 1.2rem;\n color: var(--mj-text-secondary);\n font-style: italic;\n}\n\n.search-permissions-filters[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr 180px 130px;\n gap: 0.5rem;\n margin-bottom: 0.8rem;\n}\n\n.search-permissions-filters[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n font-size: 0.85rem;\n}\n\n.search-permissions-summary[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n margin-bottom: 0.6rem;\n}\n\n.search-permissions-empty[_ngcontent-%COMP%] {\n padding: 1.2rem;\n color: var(--mj-text-muted);\n text-align: center;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.search-permissions-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 0.5rem 0.7rem;\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n}\n\n.search-permissions-secondary[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-permissions-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.1rem 0.5rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 3px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.search-permissions-level[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.15rem 0.55rem;\n border-radius: 3px;\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.search-permissions-level-none[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.search-permissions-level-read[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info-text);\n}\n\n.search-permissions-level-search[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.search-permissions-level-manage[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}"] });
|
|
2380
2422
|
};
|
|
2381
2423
|
KnowledgeConfigResourceComponent = __decorate([
|
|
2382
2424
|
RegisterClass(BaseResourceComponent, 'KnowledgeConfigResource')
|
|
@@ -2384,7 +2426,7 @@ KnowledgeConfigResourceComponent = __decorate([
|
|
|
2384
2426
|
export { KnowledgeConfigResourceComponent };
|
|
2385
2427
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(KnowledgeConfigResourceComponent, [{
|
|
2386
2428
|
type: Component,
|
|
2387
|
-
args: [{ standalone: false, selector: 'app-knowledge-config-resource', template: "@if (IsLoading) {\n <div class=\"config-loading\">\n <mj-loading text=\"Loading configuration...\" size=\"medium\"></mj-loading>\n </div>\n} @else {\n <div class=\"config-layout\">\n <!-- Left Navigation -->\n <nav class=\"config-nav\">\n <div class=\"config-nav-header\">\n <i class=\"fa-solid fa-cogs\"></i>\n <span>Configuration</span>\n </div>\n @for (section of Sections; track section.ID) {\n <button\n class=\"config-nav-item\"\n [class.config-nav-item-active]=\"ActiveSection === section.ID\"\n (click)=\"SelectSection(section.ID)\"\n >\n <i [class]=\"section.Icon\"></i>\n <span>{{ section.Label }}</span>\n </button>\n }\n </nav>\n\n <!-- Content Area -->\n <div class=\"config-content\">\n <!-- Pipeline Settings -->\n @if (ActiveSection === 'pipeline') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Pipeline Settings</h2>\n <p class=\"config-section-desc\">Configure how the Knowledge Pipeline processes incoming content.</p>\n\n <div class=\"config-group\">\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Auto-tag on Ingest</span>\n <span class=\"config-hint\">Automatically run autotagging when new content is ingested</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.AutotagOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Vectorize on Ingest</span>\n <span class=\"config-hint\">Automatically create embeddings for new content</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.VectorizeOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Default Batch Size</span>\n <span class=\"config-hint\">Number of items processed per batch</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.DefaultBatchSize\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"10\" max=\"1000\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Max Concurrent Jobs</span>\n <span class=\"config-hint\">Maximum number of pipeline jobs running at once</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.MaxConcurrentJobs\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"1\" max=\"10\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Vector Database Settings -->\n @if (ActiveSection === 'vectordb') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Vector Database</h2>\n <p class=\"config-section-desc\">Manage the shared vector index and database connection.</p>\n\n <!-- Setup Progress -->\n <div class=\"setup-progress\">\n <div class=\"setup-progress-header\">\n <span class=\"setup-progress-label\">Setup Progress</span>\n <span class=\"setup-progress-count\">{{ SetupStepsCompleted }} of 3 complete</span>\n </div>\n <div class=\"setup-progress-bar\">\n <div class=\"setup-progress-fill\" [style.width.%]=\"(SetupStepsCompleted / 3) * 100\"></div>\n </div>\n </div>\n\n <!-- Step 1: Providers -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorDBProvider\" [class.setup-step-pending]=\"!HasVectorDBProvider\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorDBProvider) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">1</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Database Providers</span>\n @if (HasVectorDBProvider) {\n <span class=\"setup-step-status\">{{ VectorDBProviders.length }} provider(s) registered</span>\n } @else {\n <span class=\"setup-step-status\">No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.</span>\n }\n </div>\n </div>\n @if (HasVectorDBProvider) {\n <div class=\"setup-step-detail\">\n @for (provider of VectorDBProviders; track provider.ID) {\n <div class=\"provider-card\">\n <div class=\"provider-icon\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"provider-info\">\n <span class=\"provider-name\">{{ provider.Name }}</span>\n <span class=\"provider-class\">{{ provider.ClassKey }}</span>\n </div>\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n </div>\n <div class=\"provider-credential-row\">\n <label class=\"provider-credential-label\">\n <i class=\"fa-solid fa-key\"></i> API Credential\n </label>\n <div class=\"provider-credential-picker\">\n <select class=\"provider-credential-select\"\n [(ngModel)]=\"provider.CredentialID\"\n (change)=\"SaveProviderCredential(provider)\"\n [disabled]=\"IsSavingCredential\">\n <option [ngValue]=\"null\">None (use environment variable)</option>\n @for (cred of AvailableCredentials; track cred.ID) {\n <option [ngValue]=\"cred.ID\">{{ cred.Name }}</option>\n }\n </select>\n @if (IsSavingCredential) {\n <i class=\"fa-solid fa-spinner fa-spin provider-credential-spinner\"></i>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Step 2: Embedding Model -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasEmbeddingModel\" [class.setup-step-pending]=\"!HasEmbeddingModel\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasEmbeddingModel) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">2</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Embedding Models</span>\n @if (HasEmbeddingModel) {\n <span class=\"setup-step-status\">{{ EmbeddingModels.length }} model(s) available</span>\n } @else {\n <span class=\"setup-step-status\">No embedding models found. Configure at least one in the AI app > Models tab.</span>\n }\n </div>\n </div>\n @if (HasEmbeddingModel) {\n <div class=\"setup-step-detail\">\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Step 3: Vector Indexes -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorIndex\" [class.setup-step-pending]=\"!HasVectorIndex\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorIndex) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">3</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Indexes</span>\n @if (HasVectorIndex) {\n <span class=\"setup-step-status\">{{ VectorIndexes.length }} index(es) configured</span>\n } @else if (HasVectorDBProvider && HasEmbeddingModel) {\n <span class=\"setup-step-status\">No indexes yet \u2014 create one below.</span>\n } @else {\n <span class=\"setup-step-status\">Complete steps 1 and 2 first.</span>\n }\n </div>\n @if (HasVectorDBProvider && HasEmbeddingModel && !ShowCreateIndexForm) {\n <button class=\"setup-step-action\" (click)=\"OpenCreateIndexForm()\">\n <i class=\"fa-solid fa-plus\"></i> Create Index\n </button>\n }\n </div>\n\n <!-- Existing Indexes -->\n @if (HasVectorIndex) {\n <div class=\"setup-step-detail\">\n @for (idx of VectorIndexes; track idx.ID) {\n <div class=\"index-card\">\n <div class=\"index-icon\">\n <i class=\"fa-solid fa-cubes\"></i>\n </div>\n <div class=\"index-info\">\n <span class=\"index-name\">{{ idx.Name }}</span>\n <span class=\"index-meta\">\n <i class=\"fa-solid fa-database\"></i> {{ idx.VectorDatabase }}\n \u00B7 \n <i class=\"fa-solid fa-microchip\"></i> {{ idx.EmbeddingModel }}\n </span>\n </div>\n <div class=\"index-actions\">\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n <button class=\"index-delete-btn\" (click)=\"DeleteIndex(idx.ID)\" title=\"Delete index\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Create Index Form -->\n @if (ShowCreateIndexForm) {\n <div class=\"create-index-form\">\n <h4 class=\"create-index-title\">\n <i class=\"fa-solid fa-plus-circle\"></i> Create New Vector Index\n </h4>\n <div class=\"create-index-fields\">\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Index Name</label>\n <input type=\"text\"\n class=\"config-input\"\n [(ngModel)]=\"NewIndexName\"\n placeholder=\"e.g., mj-knowledge-index\" />\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Vector Database</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexVectorDBID\">\n @for (db of VectorDBProviders; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Embedding Model</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexEmbeddingModelID\">\n @for (model of EmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"create-index-actions\">\n <button class=\"create-index-submit\" (click)=\"CreateIndex()\" [disabled]=\"IsCreatingIndex\">\n @if (IsCreatingIndex) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating...\n } @else {\n <i class=\"fa-solid fa-plus\"></i> Create Index\n }\n </button>\n <button class=\"create-index-cancel\" (click)=\"CancelCreateIndex()\" [disabled]=\"IsCreatingIndex\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Full-Text Indexes -->\n @if (ActiveSection === 'fulltext') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Full-Text Search Entities</h2>\n <p class=\"config-section-desc\">Configure which entities are included in full-text search. Entities with text fields (Name, Description, etc.) are automatically discovered.</p>\n\n @if (IsLoadingFTSEntities) {\n <mj-loading text=\"Discovering searchable entities...\" size=\"medium\"></mj-loading>\n } @else if (FTSEntities.length === 0) {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-text-width config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Searchable Entities Found</h3>\n <p class=\"config-empty-text\">No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.</p>\n </div>\n } @else {\n <div class=\"fts-entity-controls\">\n <div class=\"fts-summary\">\n <span class=\"fts-summary-count\">{{ EnabledFTSCount }} of {{ FTSEntities.length }} entities enabled for search</span>\n <input type=\"text\" class=\"config-input fts-filter-input\" placeholder=\"Filter entities...\" [(ngModel)]=\"FTSFilterText\" />\n </div>\n </div>\n\n <div class=\"fts-entity-list\">\n @for (entity of FilteredFTSEntities; track entity.EntityName) {\n <div class=\"fts-entity-card\" [class.fts-entity-enabled]=\"entity.Enabled\">\n <div class=\"fts-entity-toggle\">\n <input type=\"checkbox\" [(ngModel)]=\"entity.Enabled\" (change)=\"OnFTSEntityToggled(entity)\" class=\"config-checkbox\" />\n </div>\n <div class=\"fts-entity-info\">\n <span class=\"fts-entity-name\">{{ entity.EntityName }}</span>\n <div class=\"fts-entity-fields\">\n @for (field of entity.IndexedFields; track field) {\n <span class=\"fts-field-tag\">{{ field }}</span>\n }\n </div>\n </div>\n <div class=\"fts-entity-meta\">\n <span class=\"fts-entity-title-field\" title=\"Title field\">\n <i class=\"fa-solid fa-heading\"></i> {{ entity.TitleField }}\n </span>\n @if (entity.SnippetField !== entity.TitleField) {\n <span class=\"fts-entity-snippet-field\" title=\"Snippet field\">\n <i class=\"fa-solid fa-align-left\"></i> {{ entity.SnippetField }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Embedding Models -->\n @if (ActiveSection === 'embedding') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Embedding Models</h2>\n <p class=\"config-section-desc\">AI models used for generating vector embeddings from text.</p>\n\n @if (HasEmbeddingModel) {\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Active Model</span>\n <span class=\"config-hint\">Currently selected embedding model</span>\n </div>\n <span class=\"config-value-display\">{{ EmbeddingModelName }}</span>\n </div>\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Available Models</span>\n <span class=\"config-hint\">{{ EmbeddingModels.length }} embedding model(s) configured</span>\n </div>\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n </div>\n <p class=\"config-section-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Manage embedding models in the AI Dashboard > Models tab.\n </p>\n } @else {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-microchip config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Embedding Models Found</h3>\n <p class=\"config-empty-text\">\n Embedding models are required to convert text into vectors for semantic search and duplicate detection.\n Configure at least one embedding model (e.g., text-embedding-3-small) in the AI Dashboard > Models tab.\n </p>\n </div>\n }\n </div>\n }\n\n <!-- Thresholds -->\n @if (ActiveSection === 'thresholds') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Scoring Thresholds</h2>\n <p class=\"config-section-desc\">Set the scoring thresholds used by search, duplicate detection, and autotagging.</p>\n\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Absolute Match</span>\n <span class=\"config-hint\">Score above which duplicates are auto-confirmed ({{ FormatThreshold(ThresholdSettings.DuplicateAbsolute) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicateAbsolute\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.5\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Potential Match</span>\n <span class=\"config-hint\">Score above which duplicates are flagged for review ({{ FormatThreshold(ThresholdSettings.DuplicatePotential) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicatePotential\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Search Relevance</span>\n <span class=\"config-hint\">Minimum score for search results ({{ FormatThreshold(ThresholdSettings.SearchRelevance) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.SearchRelevance\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Autotag Confidence</span>\n <span class=\"config-hint\">Minimum confidence for accepting auto-generated tags ({{ FormatThreshold(ThresholdSettings.AutotagConfidence) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.AutotagConfidence\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Search Scopes Section -->\n @if (ActiveSection === 'search-scopes') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-compass-drafting\"></i> Search Scopes</h2>\n <p class=\"config-section-desc\">\n Define reusable search scopes that filter which providers, entities, external indexes, and storage accounts participate in a scoped search.\n Scopes can be assigned to AI agents for pre-execution RAG or agent-invoked search.\n </p>\n\n <div class=\"scope-manager\">\n <!-- Scope list -->\n <aside class=\"scope-manager-list\">\n <div class=\"scope-manager-list-header\">\n <span>Scopes ({{ SearchScopes.length }})</span>\n <button type=\"button\" class=\"scope-manager-new-btn\" (click)=\"CreateNewScope()\">\n <i class=\"fa-solid fa-plus\"></i> New\n </button>\n </div>\n @if (IsLoadingScopes) {\n <div class=\"scope-manager-loading\">Loading…</div>\n } @else if (SearchScopes.length === 0) {\n <div class=\"scope-manager-empty\">\n No scopes defined yet. Click <strong>New</strong> to create one.\n </div>\n } @else {\n @for (s of SearchScopes; track s.ID) {\n <button\n type=\"button\"\n class=\"scope-manager-list-item\"\n [class.active]=\"ActiveScopeID === s.ID\"\n (click)=\"SelectScope(s.ID)\">\n <i [class]=\"s.Icon || 'fa-solid fa-filter'\" aria-hidden=\"true\"></i>\n <span class=\"scope-manager-list-name\">{{ s.Name }}</span>\n @if (s.IsGlobal) {\n <span class=\"scope-manager-badge\">Global</span>\n } @else if (s.IsDefault) {\n <span class=\"scope-manager-badge\">Default</span>\n }\n </button>\n }\n }\n </aside>\n\n <!-- Scope detail -->\n <section class=\"scope-manager-detail\">\n @if (ActiveScope) {\n <!-- Tab strip -->\n <div class=\"scope-manager-tabs\">\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'definition'\" (click)=\"SelectScopeTab('definition')\">Definition</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'providers'\" (click)=\"SelectScopeTab('providers')\">Providers</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'indexes'\" (click)=\"SelectScopeTab('indexes')\">External Indexes</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'entities'\" (click)=\"SelectScopeTab('entities')\">Entities</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'storage'\" (click)=\"SelectScopeTab('storage')\">Storage</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'permissions'\" (click)=\"SelectScopeTab('permissions')\">Permissions</button>\n <div class=\"scope-manager-tab-spacer\"></div>\n @if (ActiveScope.ID) {\n <button type=\"button\" class=\"scope-manager-open-btn\"\n (click)=\"OpenActiveScopeFullForm()\"\n title=\"Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)\">\n <i class=\"fa-solid fa-up-right-from-square\"></i> Open Full Form\n </button>\n }\n <button type=\"button\" class=\"scope-manager-save-btn\" (click)=\"SaveActiveScope()\">\n <i class=\"fa-solid fa-save\"></i> Save\n </button>\n @if (!ActiveScope.IsGlobal) {\n <button type=\"button\" class=\"scope-manager-delete-btn\" (click)=\"DeleteActiveScope()\" title=\"Delete scope\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n\n <!-- Definition tab -->\n @if (ActiveScopeTab === 'definition') {\n <div class=\"scope-definition-grid\">\n <label>\n <span>Name</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Name\" (change)=\"ActiveScope.Name = $any($event.target).value\">\n </label>\n <label>\n <span>Icon (Font Awesome class)</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Icon || ''\" (change)=\"ActiveScope.Icon = $any($event.target).value\">\n </label>\n <label class=\"scope-definition-full\">\n <span>Description</span>\n <textarea rows=\"2\" class=\"mj-textarea\" [value]=\"ActiveScope.Description || ''\" (change)=\"ActiveScope.Description = $any($event.target).value\"></textarea>\n </label>\n <label>\n <span>Status</span>\n <select class=\"mj-input\" [value]=\"ActiveScope.Status\" (change)=\"ActiveScope.Status = $any($event.target).value\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </label>\n <label>\n <span>Start at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.StartAt)\" (change)=\"SetScopeDate(ActiveScope, 'StartAt', $any($event.target).value)\">\n </label>\n <label>\n <span>End at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.EndAt)\" (change)=\"SetScopeDate(ActiveScope, 'EndAt', $any($event.target).value)\">\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsDefault\" (change)=\"ActiveScope.IsDefault = $any($event.target).checked\" [disabled]=\"ActiveScope.IsGlobal\">\n <span>Default scope \u2014 picked when users/agents don't specify one</span>\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsGlobal\" disabled>\n <span>Global \u2014 reserved for the built-in Global scope (read-only)</span>\n </label>\n <label class=\"scope-definition-full\">\n <span>Scope Config (JSON)</span>\n <textarea rows=\"4\" class=\"mj-textarea scope-code-block\" spellcheck=\"false\" [value]=\"ActiveScope.ScopeConfig || ''\" (change)=\"ActiveScope.ScopeConfig = $any($event.target).value\"></textarea>\n </label>\n <label class=\"scope-definition-full\">\n <span>Search Context Config (JSON)</span>\n <textarea rows=\"4\" class=\"mj-textarea scope-code-block\" spellcheck=\"false\" [value]=\"ActiveScope.SearchContextConfig || ''\" (change)=\"ActiveScope.SearchContextConfig = $any($event.target).value\"></textarea>\n </label>\n </div>\n }\n\n @if (ActiveScopeTab === 'providers') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Providers\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeProviderColumns\"\n AddButtonLabel=\"+ Add provider\"\n EmptyMessage=\"No providers assigned. Without any providers, this scope searches nothing.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'indexes') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope External Indexes\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeExternalIndexColumns\"\n AddButtonLabel=\"+ Add external index\"\n EmptyMessage=\"No external indexes configured for this scope.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'entities') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Entities\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeEntityColumns\"\n AddButtonLabel=\"+ Add entity\"\n EmptyMessage=\"No entities configured. Scoped entity search will return no rows.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'storage') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Storage Accounts\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeStorageColumns\"\n AddButtonLabel=\"+ Add storage folder\"\n EmptyMessage=\"No storage accounts linked to this scope.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'permissions') {\n <div class=\"scope-permissions-help\" style=\"margin-bottom: 12px; padding: 8px 12px; background: var(--mj-bg-surface-card); border-left: 3px solid var(--mj-brand-primary); border-radius: 4px;\">\n <p style=\"margin: 0; font-size: 0.95em;\">\n <i class=\"fa-solid fa-shield-halved\" style=\"color: var(--mj-brand-primary);\"></i>\n <strong>Per-user / per-role grants on this scope.</strong>\n Each row binds <em>either</em> a User <em>or</em> a Role (not both). Levels:\n <code>None</code> = explicit deny that overrides role grants,\n <code>Read</code> = view scope metadata,\n <code>Search</code> = invoke ScopedSearchAction,\n <code>Manage</code> = full edit including authoring permissions.\n Combined with <code>AIAgent.SearchScopeAccess</code> via the resolver \u2014 see the spec for the full resolution order.\n </p>\n </div>\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Permissions\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopePermissionColumns\"\n AddButtonLabel=\"+ Grant access\"\n EmptyMessage=\"No explicit grants. Access falls back to agent SearchScopeAccess only.\">\n </mj-search-scope-child-grid>\n }\n } @else {\n <div class=\"scope-manager-empty-detail\">\n Select a scope on the left, or click <strong>New</strong> to create one.\n </div>\n }\n </section>\n </div>\n </div>\n }\n\n <!-- Search Analytics Section (P3.3) \u2014 driven by SearchExecutionLog -->\n @if (ActiveSection === 'search-analytics') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-chart-line\"></i> Search Analytics</h2>\n <p class=\"config-section-desc\">Aggregated metrics over the last 5,000 search invocations from <code>MJ: Search Execution Logs</code>. Use this to spot slow scopes, high-failure queries, or runaway reranker spend.</p>\n\n @if (AnalyticsLoading) {\n <mj-loading text=\"Loading analytics\u2026\" size=\"medium\"></mj-loading>\n } @else if (!AnalyticsLoaded) {\n <button class=\"mj-input\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Load analytics\n </button>\n } @else {\n <div class=\"search-analytics-kpi-grid\">\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Total runs</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsTotalRuns | number }}</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Success rate</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsSuccessRate }}%</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Hit rate</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsHitRate }}%</span>\n <span class=\"search-analytics-kpi-hint\">% of successful runs that returned \u22651 result</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Avg latency</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsAvgLatencyMs }}ms</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">P95 latency</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsP95LatencyMs }}ms</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Reranker spend</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsTotalRerankerCostCents | number:'1.0-2' }}\u00A2</span>\n </div>\n </div>\n\n <h3 class=\"search-analytics-h3\">Top scopes by volume</h3>\n @if (AnalyticsTopScopes.length === 0) {\n <p class=\"search-analytics-empty\">No runs in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Scope</th><th>Runs</th><th>Avg latency</th></tr>\n </thead>\n <tbody>\n @for (s of AnalyticsTopScopes; track s.ScopeID) {\n <tr>\n <td>{{ s.Name }}</td>\n <td>{{ s.Count | number }}</td>\n <td>{{ s.AvgLatencyMs }}ms</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Reranker spend by driver</h3>\n @if (AnalyticsRerankerSpend.length === 0) {\n <p class=\"search-analytics-empty\">No rerank invocations in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reranker</th><th>Calls</th><th>Total cents</th></tr>\n </thead>\n <tbody>\n @for (r of AnalyticsRerankerSpend; track r.Reranker) {\n <tr>\n <td>{{ r.Reranker }}</td>\n <td>{{ r.Count | number }}</td>\n <td>{{ r.TotalCents | number:'1.0-2' }}\u00A2</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Top failure reasons</h3>\n @if (AnalyticsTopFailures.length === 0) {\n <p class=\"search-analytics-empty\">No failures in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reason</th><th>Count</th></tr>\n </thead>\n <tbody>\n @for (f of AnalyticsTopFailures; track f.Reason) {\n <tr>\n <td>{{ f.Reason }}</td>\n <td>{{ f.Count | number }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <button class=\"mj-input search-analytics-refresh\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n }\n </div>\n }\n\n <!-- Permissions Audit Section (P2A.7) -->\n @if (ActiveSection === 'search-permissions') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-shield-halved\"></i> Permissions</h2>\n <p class=\"config-section-desc\">\n Cross-scope view of every <code>SearchScopePermission</code> row. Filter by scope, by user/role, or by permission level to answer \"who has access to what\". Read-only \u2014 to add or edit a grant, open the SearchScope's full form and use its Permissions panel.\n </p>\n\n @if (PermissionsLoading) {\n <div class=\"search-permissions-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading permission rows...\n </div>\n }\n\n @if (PermissionsLoaded && !PermissionsLoading) {\n <div class=\"search-permissions-filters\">\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by scope name...\" [(ngModel)]=\"PermissionsFilterScope\" />\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by user/role (name or email)...\" [(ngModel)]=\"PermissionsFilterPrincipal\" />\n <select class=\"mj-input\" [(ngModel)]=\"PermissionsFilterLevel\">\n <option value=\"\">All levels</option>\n <option value=\"None\">None</option>\n <option value=\"Read\">Read</option>\n <option value=\"Search\">Search</option>\n <option value=\"Manage\">Manage</option>\n </select>\n <button class=\"mj-input\" type=\"button\" (click)=\"RefreshPermissionsAudit()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n\n <div class=\"search-permissions-summary\">\n Showing {{ FilteredPermissionsRows.length }} of {{ PermissionsRows.length }} rows\n </div>\n\n @if (FilteredPermissionsRows.length === 0) {\n <div class=\"search-permissions-empty\">\n No permission rows match your filters.\n </div>\n } @else {\n <table class=\"search-permissions-table\">\n <thead>\n <tr>\n <th>Scope</th>\n <th>Principal</th>\n <th>Type</th>\n <th>Permission Level</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredPermissionsRows; track row.ID) {\n <tr>\n <td>{{ row.SearchScopeName }}</td>\n <td>\n @if (row.UserID) {\n {{ row.UserName }} <span class=\"search-permissions-secondary\">({{ row.UserEmail }})</span>\n } @else {\n {{ row.RoleName }}\n }\n </td>\n <td>\n @if (row.UserID) { <span class=\"search-permissions-tag\">User</span> }\n @if (row.RoleID) { <span class=\"search-permissions-tag\">Role</span> }\n </td>\n <td>\n <span class=\"search-permissions-level search-permissions-level-{{ row.PermissionLevel | lowercase }}\">{{ row.PermissionLevel }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n }\n </div>\n }\n\n <!-- Scheduling Section -->\n @if (ActiveSection === 'scheduling') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-clock\"></i> Scheduling</h2>\n <p class=\"config-section-desc\">Manage automated pipeline schedules for content classification and vector sync. Create schedules here or manage all schedules in the dedicated Scheduling app.</p>\n <div style=\"margin-top: 16px;\">\n <app-scheduling-resource></app-scheduling-resource>\n </div>\n </div>\n }\n\n <!-- Save Bar -->\n @if (HasUnsavedChanges) {\n <div class=\"config-save-bar\">\n <span class=\"config-save-text\">You have unsaved changes</span>\n <button class=\"config-save-btn\" (click)=\"SaveConfiguration()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i> Save Changes\n }\n </button>\n <button class=\"config-reset-btn\" (click)=\"ResetConfiguration()\" [disabled]=\"IsSaving\">\n Reset\n </button>\n </div>\n }\n </div>\n </div>\n}\n", styles: ["/* Knowledge Configuration - Settings Page with Left Nav */\n\n.config-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 400px;\n}\n\n.config-layout {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n/* Left Navigation */\n.config-nav {\n width: 240px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n padding: 0.5rem 0;\n}\n\n.config-nav-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n margin-bottom: 0.5rem;\n}\n\n.config-nav-item {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n padding: 0.55rem 1rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n text-align: left;\n transition: all 0.15s ease;\n width: 100%;\n}\n\n.config-nav-item:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.config-nav-item-active {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n/* Content Area */\n.config-content {\n flex: 1;\n padding: 1.5rem 2rem;\n overflow-y: auto;\n position: relative;\n}\n\n.config-section {\n max-width: 700px;\n}\n\n.config-section-title {\n font-size: 1.3rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 0.5rem;\n}\n\n.config-section-desc {\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n margin-bottom: 1.5rem;\n line-height: 1.5;\n}\n\n/* Config Groups */\n.config-group {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.config-toggle-row,\n.config-field-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n transition: background 0.1s ease;\n gap: 1rem;\n}\n\n.config-toggle-row:hover,\n.config-field-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.config-toggle-info,\n.config-field-info {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n flex: 1;\n}\n\n.config-label {\n font-weight: 500;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-hint {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.config-checkbox {\n width: 1.1rem;\n height: 1.1rem;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.config-input {\n padding: 0.4rem 0.6rem;\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: 0.85rem;\n font-family: inherit;\n}\n\n.config-input-number {\n width: 80px;\n text-align: center;\n}\n\n.config-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.config-slider {\n width: 200px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.config-value-display {\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n padding: 0.3rem 0.6rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: monospace;\n}\n\n/* Placeholder */\n.config-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1.5rem;\n text-align: center;\n gap: 1rem;\n color: var(--mj-text-muted);\n}\n\n.config-placeholder-icon {\n font-size: 2.5rem;\n}\n\n/* ---- Setup Progress Bar ---- */\n\n.setup-progress {\n margin-bottom: 1.5rem;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n}\n\n.setup-progress-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.setup-progress-label {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.setup-progress-count {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.setup-progress-bar {\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.setup-progress-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n\n/* ---- Setup Steps ---- */\n\n.setup-step {\n padding: 1rem 1.25rem;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 0.75rem;\n transition: border-color 0.2s;\n}\n\n.setup-step-complete {\n border-color: var(--mj-status-success-border);\n background: color-mix(in srgb, var(--mj-status-success) 3%, var(--mj-bg-surface));\n}\n\n.setup-step-pending {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.setup-step-header {\n display: flex;\n align-items: flex-start;\n gap: 0.85rem;\n}\n\n.setup-step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.setup-step-complete .setup-step-indicator i {\n font-size: 1.25rem;\n color: var(--mj-status-success);\n}\n\n.setup-step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n}\n\n.setup-step-info {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n}\n\n.setup-step-title {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.setup-step-status {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.setup-step-complete .setup-step-status {\n color: var(--mj-status-success-text);\n}\n\n/* ---- Config Group Title ---- */\n\n.config-group-title {\n margin: 0 0 0.75rem 0;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n/* ---- Status Badge ---- */\n\n.config-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.config-status-active {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n/* ---- Step Detail Area ---- */\n\n.setup-step-detail {\n margin-top: 0.75rem;\n padding-left: 2.85rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.setup-step-action {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.setup-step-action:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* ---- Provider Cards ---- */\n\n.provider-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.provider-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.provider-info {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.provider-name {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.provider-class {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n/* ---- Provider Credential Row ---- */\n\n.provider-credential-row {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem 0.75rem;\n margin-top: -0.25rem;\n}\n\n.provider-credential-label {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.provider-credential-label i {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.provider-credential-picker {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n\n.provider-credential-select {\n flex: 1;\n padding: 0.4rem 0.6rem;\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: 0.8rem;\n}\n\n.provider-credential-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.provider-credential-spinner {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n/* ---- Index Cards ---- */\n\n.index-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.index-card:hover {\n border-color: var(--mj-border-default);\n}\n\n.index-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.index-info {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.index-name {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.index-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.index-meta i {\n font-size: 0.65rem;\n}\n\n.index-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n.index-delete-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.index-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n/* ---- Create Index Form ---- */\n\n.create-index-form {\n margin-top: 0.75rem;\n padding: 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-brand-primary);\n border-radius: 10px;\n margin-left: 2.85rem;\n}\n\n.create-index-title {\n margin: 0 0 1rem 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.create-index-title i {\n color: var(--mj-brand-primary);\n}\n\n.create-index-fields {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.create-index-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.create-index-label {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.config-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: 0.85rem;\n}\n\n.config-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.create-index-actions {\n display: flex;\n gap: 8px;\n margin-top: 1rem;\n}\n\n.create-index-submit {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.create-index-submit:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.create-index-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.create-index-cancel {\n padding: 8px 18px;\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 font-weight: 500;\n cursor: pointer;\n}\n\n.create-index-cancel:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Empty State for unconfigured sections */\n.config-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 2rem;\n text-align: center;\n gap: 0.75rem;\n border: 2px dashed var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n}\n\n.config-empty-icon {\n font-size: 2.5rem;\n color: var(--mj-text-disabled);\n}\n\n.config-empty-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.config-empty-text {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n max-width: 480px;\n line-height: 1.5;\n}\n\n/* Tag list for showing multiple models */\n.config-tag-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.config-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: 0.78rem;\n font-weight: 500;\n}\n\n/* Section note */\n.config-section-note {\n margin-top: 1rem;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.config-section-note i {\n color: var(--mj-status-info);\n}\n\n/* Save Bar */\n.config-save-bar {\n position: sticky;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-top: 2rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.config-save-text {\n flex: 1;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n}\n\n.config-save-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.config-save-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.config-save-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.config-reset-btn {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.config-reset-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Mobile responsive */\n@media (max-width: 768px) {\n .config-layout {\n flex-direction: column;\n }\n\n .config-nav {\n width: 100%;\n flex-direction: row;\n overflow-x: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0;\n }\n\n .config-nav-header {\n display: none;\n }\n\n .config-nav-item {\n white-space: nowrap;\n padding: 0.6rem 1rem;\n }\n\n .config-nav-item-active {\n border-left: none;\n border-bottom: 3px solid var(--mj-brand-primary);\n }\n\n .config-content {\n padding: 1rem;\n }\n}\n\n/* Full-Text Search Entity Management */\n.fts-entity-controls {\n margin-bottom: 16px;\n}\n\n.fts-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.fts-summary-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.fts-filter-input {\n max-width: 240px;\n}\n\n.fts-entity-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.fts-entity-card {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s, background 0.15s;\n}\n\n.fts-entity-card:hover {\n border-color: var(--mj-border-strong);\n}\n\n.fts-entity-card.fts-entity-enabled {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n}\n\n.fts-entity-toggle {\n flex-shrink: 0;\n}\n\n.fts-entity-info {\n flex: 1;\n min-width: 0;\n}\n\n.fts-entity-name {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.fts-entity-fields {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.fts-field-tag {\n display: inline-block;\n padding: 1px 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.fts-entity-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.fts-entity-title-field,\n.fts-entity-snippet-field {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.fts-entity-title-field i,\n.fts-entity-snippet-field i {\n margin-right: 4px;\n font-size: 10px;\n}\n\n/* ===== Search Scopes Manager ===== */\n\n.scope-manager {\n display: grid;\n grid-template-columns: 260px 1fr;\n gap: 16px;\n min-height: 420px;\n}\n\n.scope-manager-list {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-manager-list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.scope-manager-new-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-link);\n padding: 3px 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.7rem;\n font-weight: 500;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.scope-manager-new-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.scope-manager-loading,\n.scope-manager-empty,\n.scope-manager-empty-detail {\n padding: 16px;\n color: var(--mj-text-muted);\n text-align: center;\n font-size: 0.85rem;\n}\n\n.scope-manager-empty-detail {\n padding: 40px 24px;\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n}\n\n.scope-manager-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 6px;\n text-align: left;\n transition: background 120ms ease;\n}\n\n.scope-manager-list-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.scope-manager-list-item.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.scope-manager-list-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scope-manager-badge {\n font-size: 0.625rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.scope-manager-detail {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n}\n\n.scope-manager-tabs {\n display: flex;\n align-items: center;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.scope-manager-tab {\n background: transparent;\n border: none;\n padding: 6px 12px;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 4px;\n transition: background 120ms ease, color 120ms ease;\n}\n\n.scope-manager-tab:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.scope-manager-tab.active {\n color: var(--mj-brand-primary);\n border-bottom: 2px solid var(--mj-brand-primary);\n border-radius: 0;\n font-weight: 500;\n}\n\n.scope-manager-tab-spacer {\n flex: 1;\n}\n\n.scope-manager-save-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-save-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.scope-manager-delete-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-status-error-text);\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.scope-manager-delete-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.scope-manager-open-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-open-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.scope-definition-grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n}\n\n.scope-definition-grid label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n.scope-definition-grid label > span {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.scope-definition-full {\n grid-column: 1 / -1;\n}\n\n.scope-definition-toggle {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.scope-definition-toggle input[type=\"checkbox\"] {\n accent-color: var(--mj-brand-primary);\n}\n\n.scope-code-block {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 8px;\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Search Analytics section (P3.3)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.search-analytics-kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.search-analytics-kpi {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.search-analytics-kpi-label {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.search-analytics-kpi-value {\n font-size: 1.6rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-kpi-hint {\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n}\n\n.search-analytics-h3 {\n margin: 22px 0 8px;\n font-size: 1rem;\n color: var(--mj-text-primary);\n}\n\n.search-analytics-empty {\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n margin: 4px 0 14px;\n}\n\n.search-analytics-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.86rem;\n}\n\n.search-analytics-table thead th {\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.search-analytics-table tbody td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.search-analytics-refresh {\n margin-top: 16px;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.9rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.82rem;\n}\n\n.search-analytics-refresh:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* \u2500\u2500\u2500 Permissions Audit (P2A.7) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.search-permissions-loading {\n padding: 1.2rem;\n color: var(--mj-text-secondary);\n font-style: italic;\n}\n\n.search-permissions-filters {\n display: grid;\n grid-template-columns: 1fr 1fr 180px 130px;\n gap: 0.5rem;\n margin-bottom: 0.8rem;\n}\n\n.search-permissions-filters .mj-input {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n font-size: 0.85rem;\n}\n\n.search-permissions-summary {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n margin-bottom: 0.6rem;\n}\n\n.search-permissions-empty {\n padding: 1.2rem;\n color: var(--mj-text-muted);\n text-align: center;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.search-permissions-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.search-permissions-table th,\n.search-permissions-table td {\n padding: 0.5rem 0.7rem;\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n}\n\n.search-permissions-table th {\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n}\n\n.search-permissions-secondary {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-permissions-tag {\n display: inline-block;\n padding: 0.1rem 0.5rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 3px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.search-permissions-level {\n display: inline-block;\n padding: 0.15rem 0.55rem;\n border-radius: 3px;\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.search-permissions-level-none {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.search-permissions-level-read {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info-text);\n}\n\n.search-permissions-level-search {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.search-permissions-level-manage {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n"] }]
|
|
2429
|
+
args: [{ standalone: false, selector: 'app-knowledge-config-resource', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Knowledge Hub Configuration\"\n Icon=\"fa-solid fa-cogs\"\n Subtitle=\"Pipeline, vector store, search, and automation settings\">\n <div meta>\n @if (HasUnsavedChanges) {\n <mj-stat-badge\n Icon=\"fa-solid fa-circle-exclamation\"\n Label=\"Unsaved changes\"\n Variant=\"warning\">\n </mj-stat-badge>\n }\n </div>\n <div actions>\n @if (HasUnsavedChanges) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ResetConfiguration()\" [disabled]=\"IsSaving\" title=\"Discard unsaved changes\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i> Reset\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"SaveConfiguration()\" [disabled]=\"IsSaving\" title=\"Save all settings\">\n <i class=\"fa-solid fa-floppy-disk\"></i> {{IsSaving ? 'Saving\u2026' : 'Save'}}\n </button>\n }\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\">\n@if (IsLoading) {\n <div class=\"config-loading\">\n <mj-loading text=\"Loading configuration...\" size=\"medium\"></mj-loading>\n </div>\n} @else {\n <div class=\"config-layout\">\n <!-- Left Navigation -->\n <nav class=\"config-nav\">\n <div class=\"config-nav-header\">\n <i class=\"fa-solid fa-cogs\"></i>\n <span>Configuration</span>\n </div>\n @for (section of Sections; track section.ID) {\n <button\n class=\"config-nav-item\"\n [class.config-nav-item-active]=\"ActiveSection === section.ID\"\n (click)=\"SelectSection(section.ID)\"\n >\n <i [class]=\"section.Icon\"></i>\n <span>{{ section.Label }}</span>\n </button>\n }\n </nav>\n\n <!-- Content Area -->\n <div class=\"config-content\">\n <!-- Pipeline Settings -->\n @if (ActiveSection === 'pipeline') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Pipeline Settings</h2>\n <p class=\"config-section-desc\">Configure how the Knowledge Pipeline processes incoming content.</p>\n\n <div class=\"config-group\">\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Auto-tag on Ingest</span>\n <span class=\"config-hint\">Automatically run autotagging when new content is ingested</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.AutotagOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Vectorize on Ingest</span>\n <span class=\"config-hint\">Automatically create embeddings for new content</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.VectorizeOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Default Batch Size</span>\n <span class=\"config-hint\">Number of items processed per batch</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.DefaultBatchSize\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"10\" max=\"1000\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Max Concurrent Jobs</span>\n <span class=\"config-hint\">Maximum number of pipeline jobs running at once</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.MaxConcurrentJobs\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"1\" max=\"10\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Vector Database Settings -->\n @if (ActiveSection === 'vectordb') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Vector Database</h2>\n <p class=\"config-section-desc\">Manage the shared vector index and database connection.</p>\n\n <!-- Setup Progress -->\n <div class=\"setup-progress\">\n <div class=\"setup-progress-header\">\n <span class=\"setup-progress-label\">Setup Progress</span>\n <span class=\"setup-progress-count\">{{ SetupStepsCompleted }} of 3 complete</span>\n </div>\n <div class=\"setup-progress-bar\">\n <div class=\"setup-progress-fill\" [style.width.%]=\"(SetupStepsCompleted / 3) * 100\"></div>\n </div>\n </div>\n\n <!-- Step 1: Providers -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorDBProvider\" [class.setup-step-pending]=\"!HasVectorDBProvider\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorDBProvider) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">1</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Database Providers</span>\n @if (HasVectorDBProvider) {\n <span class=\"setup-step-status\">{{ VectorDBProviders.length }} provider(s) registered</span>\n } @else {\n <span class=\"setup-step-status\">No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.</span>\n }\n </div>\n </div>\n @if (HasVectorDBProvider) {\n <div class=\"setup-step-detail\">\n @for (provider of VectorDBProviders; track provider.ID) {\n <div class=\"provider-card\">\n <div class=\"provider-icon\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"provider-info\">\n <span class=\"provider-name\">{{ provider.Name }}</span>\n <span class=\"provider-class\">{{ provider.ClassKey }}</span>\n </div>\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n </div>\n <div class=\"provider-credential-row\">\n <label class=\"provider-credential-label\">\n <i class=\"fa-solid fa-key\"></i> API Credential\n </label>\n <div class=\"provider-credential-picker\">\n <select class=\"provider-credential-select\"\n [(ngModel)]=\"provider.CredentialID\"\n (change)=\"SaveProviderCredential(provider)\"\n [disabled]=\"IsSavingCredential\">\n <option [ngValue]=\"null\">None (use environment variable)</option>\n @for (cred of AvailableCredentials; track cred.ID) {\n <option [ngValue]=\"cred.ID\">{{ cred.Name }}</option>\n }\n </select>\n @if (IsSavingCredential) {\n <i class=\"fa-solid fa-spinner fa-spin provider-credential-spinner\"></i>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Step 2: Embedding Model -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasEmbeddingModel\" [class.setup-step-pending]=\"!HasEmbeddingModel\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasEmbeddingModel) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">2</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Embedding Models</span>\n @if (HasEmbeddingModel) {\n <span class=\"setup-step-status\">{{ EmbeddingModels.length }} model(s) available</span>\n } @else {\n <span class=\"setup-step-status\">No embedding models found. Configure at least one in the AI app > Models tab.</span>\n }\n </div>\n </div>\n @if (HasEmbeddingModel) {\n <div class=\"setup-step-detail\">\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Step 3: Vector Indexes -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorIndex\" [class.setup-step-pending]=\"!HasVectorIndex\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorIndex) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">3</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Indexes</span>\n @if (HasVectorIndex) {\n <span class=\"setup-step-status\">{{ VectorIndexes.length }} index(es) configured</span>\n } @else if (HasVectorDBProvider && HasEmbeddingModel) {\n <span class=\"setup-step-status\">No indexes yet \u2014 create one below.</span>\n } @else {\n <span class=\"setup-step-status\">Complete steps 1 and 2 first.</span>\n }\n </div>\n @if (HasVectorDBProvider && HasEmbeddingModel && !ShowCreateIndexForm) {\n <button class=\"setup-step-action\" (click)=\"OpenCreateIndexForm()\">\n <i class=\"fa-solid fa-plus\"></i> Create Index\n </button>\n }\n </div>\n\n <!-- Existing Indexes -->\n @if (HasVectorIndex) {\n <div class=\"setup-step-detail\">\n @for (idx of VectorIndexes; track idx.ID) {\n <div class=\"index-card\">\n <div class=\"index-icon\">\n <i class=\"fa-solid fa-cubes\"></i>\n </div>\n <div class=\"index-info\">\n <span class=\"index-name\">{{ idx.Name }}</span>\n <span class=\"index-meta\">\n <i class=\"fa-solid fa-database\"></i> {{ idx.VectorDatabase }}\n \u00B7 \n <i class=\"fa-solid fa-microchip\"></i> {{ idx.EmbeddingModel }}\n </span>\n </div>\n <div class=\"index-actions\">\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n <button class=\"index-delete-btn\" (click)=\"DeleteIndex(idx.ID)\" title=\"Delete index\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Create Index Form -->\n @if (ShowCreateIndexForm) {\n <div class=\"create-index-form\">\n <h4 class=\"create-index-title\">\n <i class=\"fa-solid fa-plus-circle\"></i> Create New Vector Index\n </h4>\n <div class=\"create-index-fields\">\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Index Name</label>\n <input type=\"text\"\n class=\"config-input\"\n [(ngModel)]=\"NewIndexName\"\n placeholder=\"e.g., mj-knowledge-index\" />\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Vector Database</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexVectorDBID\">\n @for (db of VectorDBProviders; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Embedding Model</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexEmbeddingModelID\">\n @for (model of EmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"create-index-actions\">\n <button class=\"create-index-submit\" (click)=\"CreateIndex()\" [disabled]=\"IsCreatingIndex\">\n @if (IsCreatingIndex) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating...\n } @else {\n <i class=\"fa-solid fa-plus\"></i> Create Index\n }\n </button>\n <button class=\"create-index-cancel\" (click)=\"CancelCreateIndex()\" [disabled]=\"IsCreatingIndex\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Full-Text Indexes -->\n @if (ActiveSection === 'fulltext') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Full-Text Search Entities</h2>\n <p class=\"config-section-desc\">Configure which entities are included in full-text search. Entities with text fields (Name, Description, etc.) are automatically discovered.</p>\n\n @if (IsLoadingFTSEntities) {\n <mj-loading text=\"Discovering searchable entities...\" size=\"medium\"></mj-loading>\n } @else if (FTSEntities.length === 0) {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-text-width config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Searchable Entities Found</h3>\n <p class=\"config-empty-text\">No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.</p>\n </div>\n } @else {\n <div class=\"fts-entity-controls\">\n <div class=\"fts-summary\">\n <span class=\"fts-summary-count\">{{ EnabledFTSCount }} of {{ FTSEntities.length }} entities enabled for search</span>\n <input type=\"text\" class=\"config-input fts-filter-input\" placeholder=\"Filter entities...\" [(ngModel)]=\"FTSFilterText\" />\n </div>\n </div>\n\n <div class=\"fts-entity-list\">\n @for (entity of FilteredFTSEntities; track entity.EntityName) {\n <div class=\"fts-entity-card\" [class.fts-entity-enabled]=\"entity.Enabled\">\n <div class=\"fts-entity-toggle\">\n <input type=\"checkbox\" [(ngModel)]=\"entity.Enabled\" (change)=\"OnFTSEntityToggled(entity)\" class=\"config-checkbox\" />\n </div>\n <div class=\"fts-entity-info\">\n <span class=\"fts-entity-name\">{{ entity.EntityName }}</span>\n <div class=\"fts-entity-fields\">\n @for (field of entity.IndexedFields; track field) {\n <span class=\"fts-field-tag\">{{ field }}</span>\n }\n </div>\n </div>\n <div class=\"fts-entity-meta\">\n <span class=\"fts-entity-title-field\" title=\"Title field\">\n <i class=\"fa-solid fa-heading\"></i> {{ entity.TitleField }}\n </span>\n @if (entity.SnippetField !== entity.TitleField) {\n <span class=\"fts-entity-snippet-field\" title=\"Snippet field\">\n <i class=\"fa-solid fa-align-left\"></i> {{ entity.SnippetField }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Embedding Models -->\n @if (ActiveSection === 'embedding') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Embedding Models</h2>\n <p class=\"config-section-desc\">AI models used for generating vector embeddings from text.</p>\n\n @if (HasEmbeddingModel) {\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Active Model</span>\n <span class=\"config-hint\">Currently selected embedding model</span>\n </div>\n <span class=\"config-value-display\">{{ EmbeddingModelName }}</span>\n </div>\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Available Models</span>\n <span class=\"config-hint\">{{ EmbeddingModels.length }} embedding model(s) configured</span>\n </div>\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n </div>\n <p class=\"config-section-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Manage embedding models in the AI Dashboard > Models tab.\n </p>\n } @else {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-microchip config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Embedding Models Found</h3>\n <p class=\"config-empty-text\">\n Embedding models are required to convert text into vectors for semantic search and duplicate detection.\n Configure at least one embedding model (e.g., text-embedding-3-small) in the AI Dashboard > Models tab.\n </p>\n </div>\n }\n </div>\n }\n\n <!-- Thresholds -->\n @if (ActiveSection === 'thresholds') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Scoring Thresholds</h2>\n <p class=\"config-section-desc\">Set the scoring thresholds used by search, duplicate detection, and autotagging.</p>\n\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Absolute Match</span>\n <span class=\"config-hint\">Score above which duplicates are auto-confirmed ({{ FormatThreshold(ThresholdSettings.DuplicateAbsolute) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicateAbsolute\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.5\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Potential Match</span>\n <span class=\"config-hint\">Score above which duplicates are flagged for review ({{ FormatThreshold(ThresholdSettings.DuplicatePotential) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicatePotential\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Search Relevance</span>\n <span class=\"config-hint\">Minimum score for search results ({{ FormatThreshold(ThresholdSettings.SearchRelevance) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.SearchRelevance\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Autotag Confidence</span>\n <span class=\"config-hint\">Minimum confidence for accepting auto-generated tags ({{ FormatThreshold(ThresholdSettings.AutotagConfidence) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.AutotagConfidence\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Search Scopes Section -->\n @if (ActiveSection === 'search-scopes') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-compass-drafting\"></i> Search Scopes</h2>\n <p class=\"config-section-desc\">\n Define reusable search scopes that filter which providers, entities, external indexes, and storage accounts participate in a scoped search.\n Scopes can be assigned to AI agents for pre-execution RAG or agent-invoked search.\n </p>\n\n <div class=\"scope-manager\">\n <!-- Scope list -->\n <aside class=\"scope-manager-list\">\n <div class=\"scope-manager-list-header\">\n <span>Scopes ({{ SearchScopes.length }})</span>\n <button type=\"button\" class=\"scope-manager-new-btn\" (click)=\"CreateNewScope()\">\n <i class=\"fa-solid fa-plus\"></i> New\n </button>\n </div>\n @if (IsLoadingScopes) {\n <div class=\"scope-manager-loading\">Loading…</div>\n } @else if (SearchScopes.length === 0) {\n <div class=\"scope-manager-empty\">\n No scopes defined yet. Click <strong>New</strong> to create one.\n </div>\n } @else {\n @for (s of SearchScopes; track s.ID) {\n <button\n type=\"button\"\n class=\"scope-manager-list-item\"\n [class.active]=\"ActiveScopeID === s.ID\"\n (click)=\"SelectScope(s.ID)\">\n <i [class]=\"s.Icon || 'fa-solid fa-filter'\" aria-hidden=\"true\"></i>\n <span class=\"scope-manager-list-name\">{{ s.Name }}</span>\n @if (s.IsGlobal) {\n <span class=\"scope-manager-badge\">Global</span>\n } @else if (s.IsDefault) {\n <span class=\"scope-manager-badge\">Default</span>\n }\n </button>\n }\n }\n </aside>\n\n <!-- Scope detail -->\n <section class=\"scope-manager-detail\">\n @if (ActiveScope) {\n <!-- Tab strip -->\n <div class=\"scope-manager-tabs\">\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'definition'\" (click)=\"SelectScopeTab('definition')\">Definition</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'providers'\" (click)=\"SelectScopeTab('providers')\">Providers</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'indexes'\" (click)=\"SelectScopeTab('indexes')\">External Indexes</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'entities'\" (click)=\"SelectScopeTab('entities')\">Entities</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'storage'\" (click)=\"SelectScopeTab('storage')\">Storage</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'permissions'\" (click)=\"SelectScopeTab('permissions')\">Permissions</button>\n <div class=\"scope-manager-tab-spacer\"></div>\n @if (ActiveScope.ID) {\n <button type=\"button\" class=\"scope-manager-open-btn\"\n (click)=\"OpenActiveScopeFullForm()\"\n title=\"Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)\">\n <i class=\"fa-solid fa-up-right-from-square\"></i> Open Full Form\n </button>\n }\n <button type=\"button\" class=\"scope-manager-save-btn\" (click)=\"SaveActiveScope()\">\n <i class=\"fa-solid fa-save\"></i> Save\n </button>\n @if (!ActiveScope.IsGlobal) {\n <button type=\"button\" class=\"scope-manager-delete-btn\" (click)=\"DeleteActiveScope()\" title=\"Delete scope\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n\n <!-- Definition tab -->\n @if (ActiveScopeTab === 'definition') {\n <div class=\"scope-definition-grid\">\n <label>\n <span>Name</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Name\" (change)=\"ActiveScope.Name = $any($event.target).value\">\n </label>\n <label>\n <span>Icon (Font Awesome class)</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Icon || ''\" (change)=\"ActiveScope.Icon = $any($event.target).value\">\n </label>\n <label class=\"scope-definition-full\">\n <span>Description</span>\n <textarea rows=\"2\" class=\"mj-textarea\" [value]=\"ActiveScope.Description || ''\" (change)=\"ActiveScope.Description = $any($event.target).value\"></textarea>\n </label>\n <label>\n <span>Status</span>\n <select class=\"mj-input\" [value]=\"ActiveScope.Status\" (change)=\"ActiveScope.Status = $any($event.target).value\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </label>\n <label>\n <span>Start at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.StartAt)\" (change)=\"SetScopeDate(ActiveScope, 'StartAt', $any($event.target).value)\">\n </label>\n <label>\n <span>End at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.EndAt)\" (change)=\"SetScopeDate(ActiveScope, 'EndAt', $any($event.target).value)\">\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsDefault\" (change)=\"ActiveScope.IsDefault = $any($event.target).checked\" [disabled]=\"ActiveScope.IsGlobal\">\n <span>Default scope \u2014 picked when users/agents don't specify one</span>\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsGlobal\" disabled>\n <span>Global \u2014 reserved for the built-in Global scope (read-only)</span>\n </label>\n <label class=\"scope-definition-full\">\n <span>Scope Config (JSON)</span>\n <textarea rows=\"4\" class=\"mj-textarea scope-code-block\" spellcheck=\"false\" [value]=\"ActiveScope.ScopeConfig || ''\" (change)=\"ActiveScope.ScopeConfig = $any($event.target).value\"></textarea>\n </label>\n <label class=\"scope-definition-full\">\n <span>Search Context Config (JSON)</span>\n <textarea rows=\"4\" class=\"mj-textarea scope-code-block\" spellcheck=\"false\" [value]=\"ActiveScope.SearchContextConfig || ''\" (change)=\"ActiveScope.SearchContextConfig = $any($event.target).value\"></textarea>\n </label>\n </div>\n }\n\n @if (ActiveScopeTab === 'providers') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Providers\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeProviderColumns\"\n AddButtonLabel=\"+ Add provider\"\n EmptyMessage=\"No providers assigned. Without any providers, this scope searches nothing.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'indexes') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope External Indexes\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeExternalIndexColumns\"\n AddButtonLabel=\"+ Add external index\"\n EmptyMessage=\"No external indexes configured for this scope.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'entities') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Entities\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeEntityColumns\"\n AddButtonLabel=\"+ Add entity\"\n EmptyMessage=\"No entities configured. Scoped entity search will return no rows.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'storage') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Storage Accounts\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeStorageColumns\"\n AddButtonLabel=\"+ Add storage folder\"\n EmptyMessage=\"No storage accounts linked to this scope.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'permissions') {\n <div class=\"scope-permissions-help\" style=\"margin-bottom: 12px; padding: 8px 12px; background: var(--mj-bg-surface-card); border-left: 3px solid var(--mj-brand-primary); border-radius: 4px;\">\n <p style=\"margin: 0; font-size: 0.95em;\">\n <i class=\"fa-solid fa-shield-halved\" style=\"color: var(--mj-brand-primary);\"></i>\n <strong>Per-user / per-role grants on this scope.</strong>\n Each row binds <em>either</em> a User <em>or</em> a Role (not both). Levels:\n <code>None</code> = explicit deny that overrides role grants,\n <code>Read</code> = view scope metadata,\n <code>Search</code> = invoke ScopedSearchAction,\n <code>Manage</code> = full edit including authoring permissions.\n Combined with <code>AIAgent.SearchScopeAccess</code> via the resolver \u2014 see the spec for the full resolution order.\n </p>\n </div>\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Permissions\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopePermissionColumns\"\n AddButtonLabel=\"+ Grant access\"\n EmptyMessage=\"No explicit grants. Access falls back to agent SearchScopeAccess only.\">\n </mj-search-scope-child-grid>\n }\n } @else {\n <div class=\"scope-manager-empty-detail\">\n Select a scope on the left, or click <strong>New</strong> to create one.\n </div>\n }\n </section>\n </div>\n </div>\n }\n\n <!-- Search Analytics Section (P3.3) \u2014 driven by SearchExecutionLog -->\n @if (ActiveSection === 'search-analytics') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-chart-line\"></i> Search Analytics</h2>\n <p class=\"config-section-desc\">Aggregated metrics over the last 5,000 search invocations from <code>MJ: Search Execution Logs</code>. Use this to spot slow scopes, high-failure queries, or runaway reranker spend.</p>\n\n @if (AnalyticsLoading) {\n <mj-loading text=\"Loading analytics\u2026\" size=\"medium\"></mj-loading>\n } @else if (!AnalyticsLoaded) {\n <button class=\"mj-input\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Load analytics\n </button>\n } @else {\n <div class=\"search-analytics-kpi-grid\">\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Total runs</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsTotalRuns | number }}</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Success rate</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsSuccessRate }}%</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Hit rate</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsHitRate }}%</span>\n <span class=\"search-analytics-kpi-hint\">% of successful runs that returned \u22651 result</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Avg latency</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsAvgLatencyMs }}ms</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">P95 latency</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsP95LatencyMs }}ms</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Reranker spend</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsTotalRerankerCostCents | number:'1.0-2' }}\u00A2</span>\n </div>\n </div>\n\n <h3 class=\"search-analytics-h3\">Top scopes by volume</h3>\n @if (AnalyticsTopScopes.length === 0) {\n <p class=\"search-analytics-empty\">No runs in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Scope</th><th>Runs</th><th>Avg latency</th></tr>\n </thead>\n <tbody>\n @for (s of AnalyticsTopScopes; track s.ScopeID) {\n <tr>\n <td>{{ s.Name }}</td>\n <td>{{ s.Count | number }}</td>\n <td>{{ s.AvgLatencyMs }}ms</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Reranker spend by driver</h3>\n @if (AnalyticsRerankerSpend.length === 0) {\n <p class=\"search-analytics-empty\">No rerank invocations in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reranker</th><th>Calls</th><th>Total cents</th></tr>\n </thead>\n <tbody>\n @for (r of AnalyticsRerankerSpend; track r.Reranker) {\n <tr>\n <td>{{ r.Reranker }}</td>\n <td>{{ r.Count | number }}</td>\n <td>{{ r.TotalCents | number:'1.0-2' }}\u00A2</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Top failure reasons</h3>\n @if (AnalyticsTopFailures.length === 0) {\n <p class=\"search-analytics-empty\">No failures in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reason</th><th>Count</th></tr>\n </thead>\n <tbody>\n @for (f of AnalyticsTopFailures; track f.Reason) {\n <tr>\n <td>{{ f.Reason }}</td>\n <td>{{ f.Count | number }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <button class=\"mj-input search-analytics-refresh\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n }\n </div>\n }\n\n <!-- Permissions Audit Section (P2A.7) -->\n @if (ActiveSection === 'search-permissions') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-shield-halved\"></i> Permissions</h2>\n <p class=\"config-section-desc\">\n Cross-scope view of every <code>SearchScopePermission</code> row. Filter by scope, by user/role, or by permission level to answer \"who has access to what\". Read-only \u2014 to add or edit a grant, open the SearchScope's full form and use its Permissions panel.\n </p>\n\n @if (PermissionsLoading) {\n <div class=\"search-permissions-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading permission rows...\n </div>\n }\n\n @if (PermissionsLoaded && !PermissionsLoading) {\n <div class=\"search-permissions-filters\">\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by scope name...\" [(ngModel)]=\"PermissionsFilterScope\" />\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by user/role (name or email)...\" [(ngModel)]=\"PermissionsFilterPrincipal\" />\n <select class=\"mj-input\" [(ngModel)]=\"PermissionsFilterLevel\">\n <option value=\"\">All levels</option>\n <option value=\"None\">None</option>\n <option value=\"Read\">Read</option>\n <option value=\"Search\">Search</option>\n <option value=\"Manage\">Manage</option>\n </select>\n <button class=\"mj-input\" type=\"button\" (click)=\"RefreshPermissionsAudit()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n\n <div class=\"search-permissions-summary\">\n Showing {{ FilteredPermissionsRows.length }} of {{ PermissionsRows.length }} rows\n </div>\n\n @if (FilteredPermissionsRows.length === 0) {\n <div class=\"search-permissions-empty\">\n No permission rows match your filters.\n </div>\n } @else {\n <table class=\"search-permissions-table\">\n <thead>\n <tr>\n <th>Scope</th>\n <th>Principal</th>\n <th>Type</th>\n <th>Permission Level</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredPermissionsRows; track row.ID) {\n <tr>\n <td>{{ row.SearchScopeName }}</td>\n <td>\n @if (row.UserID) {\n {{ row.UserName }} <span class=\"search-permissions-secondary\">({{ row.UserEmail }})</span>\n } @else {\n {{ row.RoleName }}\n }\n </td>\n <td>\n @if (row.UserID) { <span class=\"search-permissions-tag\">User</span> }\n @if (row.RoleID) { <span class=\"search-permissions-tag\">Role</span> }\n </td>\n <td>\n <span class=\"search-permissions-level search-permissions-level-{{ row.PermissionLevel | lowercase }}\">{{ row.PermissionLevel }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n }\n </div>\n }\n\n <!-- Scheduling Section -->\n @if (ActiveSection === 'scheduling') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-clock\"></i> Scheduling</h2>\n <p class=\"config-section-desc\">Manage automated pipeline schedules for content classification and vector sync. Create schedules here or manage all schedules in the dedicated Scheduling app.</p>\n <div style=\"margin-top: 16px;\">\n <app-scheduling-resource [HideToolbar]=\"true\"></app-scheduling-resource>\n </div>\n </div>\n }\n\n <!-- Save Bar -->\n @if (HasUnsavedChanges) {\n <div class=\"config-save-bar\">\n <span class=\"config-save-text\">You have unsaved changes</span>\n <button class=\"config-save-btn\" (click)=\"SaveConfiguration()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i> Save Changes\n }\n </button>\n <button class=\"config-reset-btn\" (click)=\"ResetConfiguration()\" [disabled]=\"IsSaving\">\n Reset\n </button>\n </div>\n }\n </div>\n </div>\n}\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* Knowledge Configuration - Settings Page with Left Nav */\n\n\n.config-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 400px;\n}\n\n.config-layout {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n/* Left Navigation */\n.config-nav {\n width: 240px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n padding: 0.5rem 0;\n}\n\n.config-nav-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n margin-bottom: 0.5rem;\n}\n\n.config-nav-item {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n padding: 0.55rem 1rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n text-align: left;\n transition: all 0.15s ease;\n width: 100%;\n}\n\n.config-nav-item:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.config-nav-item-active {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n/* Content Area */\n.config-content {\n flex: 1;\n padding: 1.5rem 2rem;\n overflow-y: auto;\n position: relative;\n}\n\n.config-section {\n max-width: 700px;\n}\n\n.config-section-title {\n font-size: 1.3rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 0.5rem;\n}\n\n.config-section-desc {\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n margin-bottom: 1.5rem;\n line-height: 1.5;\n}\n\n/* Config Groups */\n.config-group {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.config-toggle-row,\n.config-field-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n transition: background 0.1s ease;\n gap: 1rem;\n}\n\n.config-toggle-row:hover,\n.config-field-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.config-toggle-info,\n.config-field-info {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n flex: 1;\n}\n\n.config-label {\n font-weight: 500;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-hint {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.config-checkbox {\n width: 1.1rem;\n height: 1.1rem;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.config-input {\n padding: 0.4rem 0.6rem;\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: 0.85rem;\n font-family: inherit;\n}\n\n.config-input-number {\n width: 80px;\n text-align: center;\n}\n\n.config-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.config-slider {\n width: 200px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.config-value-display {\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n padding: 0.3rem 0.6rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: monospace;\n}\n\n/* Placeholder */\n.config-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1.5rem;\n text-align: center;\n gap: 1rem;\n color: var(--mj-text-muted);\n}\n\n.config-placeholder-icon {\n font-size: 2.5rem;\n}\n\n/* ---- Setup Progress Bar ---- */\n\n.setup-progress {\n margin-bottom: 1.5rem;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n}\n\n.setup-progress-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.setup-progress-label {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.setup-progress-count {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.setup-progress-bar {\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.setup-progress-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n\n/* ---- Setup Steps ---- */\n\n.setup-step {\n padding: 1rem 1.25rem;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 0.75rem;\n transition: border-color 0.2s;\n}\n\n.setup-step-complete {\n border-color: var(--mj-status-success-border);\n background: color-mix(in srgb, var(--mj-status-success) 3%, var(--mj-bg-surface));\n}\n\n.setup-step-pending {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.setup-step-header {\n display: flex;\n align-items: flex-start;\n gap: 0.85rem;\n}\n\n.setup-step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.setup-step-complete .setup-step-indicator i {\n font-size: 1.25rem;\n color: var(--mj-status-success);\n}\n\n.setup-step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n}\n\n.setup-step-info {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n}\n\n.setup-step-title {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.setup-step-status {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.setup-step-complete .setup-step-status {\n color: var(--mj-status-success-text);\n}\n\n/* ---- Config Group Title ---- */\n\n.config-group-title {\n margin: 0 0 0.75rem 0;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n/* ---- Status Badge ---- */\n\n.config-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.config-status-active {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n/* ---- Step Detail Area ---- */\n\n.setup-step-detail {\n margin-top: 0.75rem;\n padding-left: 2.85rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.setup-step-action {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.setup-step-action:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* ---- Provider Cards ---- */\n\n.provider-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.provider-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.provider-info {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.provider-name {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.provider-class {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n/* ---- Provider Credential Row ---- */\n\n.provider-credential-row {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem 0.75rem;\n margin-top: -0.25rem;\n}\n\n.provider-credential-label {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.provider-credential-label i {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.provider-credential-picker {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n\n.provider-credential-select {\n flex: 1;\n padding: 0.4rem 0.6rem;\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: 0.8rem;\n}\n\n.provider-credential-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.provider-credential-spinner {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n/* ---- Index Cards ---- */\n\n.index-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.index-card:hover {\n border-color: var(--mj-border-default);\n}\n\n.index-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.index-info {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.index-name {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.index-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.index-meta i {\n font-size: 0.65rem;\n}\n\n.index-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n.index-delete-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.index-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n/* ---- Create Index Form ---- */\n\n.create-index-form {\n margin-top: 0.75rem;\n padding: 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-brand-primary);\n border-radius: 10px;\n margin-left: 2.85rem;\n}\n\n.create-index-title {\n margin: 0 0 1rem 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.create-index-title i {\n color: var(--mj-brand-primary);\n}\n\n.create-index-fields {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.create-index-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.create-index-label {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.config-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: 0.85rem;\n}\n\n.config-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.create-index-actions {\n display: flex;\n gap: 8px;\n margin-top: 1rem;\n}\n\n.create-index-submit {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.create-index-submit:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.create-index-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.create-index-cancel {\n padding: 8px 18px;\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 font-weight: 500;\n cursor: pointer;\n}\n\n.create-index-cancel:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Empty State for unconfigured sections */\n.config-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 2rem;\n text-align: center;\n gap: 0.75rem;\n border: 2px dashed var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n}\n\n.config-empty-icon {\n font-size: 2.5rem;\n color: var(--mj-text-disabled);\n}\n\n.config-empty-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.config-empty-text {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n max-width: 480px;\n line-height: 1.5;\n}\n\n/* Tag list for showing multiple models */\n.config-tag-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.config-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: 0.78rem;\n font-weight: 500;\n}\n\n/* Section note */\n.config-section-note {\n margin-top: 1rem;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.config-section-note i {\n color: var(--mj-status-info);\n}\n\n/* Save Bar */\n.config-save-bar {\n position: sticky;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-top: 2rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.config-save-text {\n flex: 1;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n}\n\n.config-save-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.config-save-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.config-save-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.config-reset-btn {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.config-reset-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Mobile responsive */\n@media (max-width: 768px) {\n .config-layout {\n flex-direction: column;\n }\n\n .config-nav {\n width: 100%;\n flex-direction: row;\n overflow-x: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0;\n }\n\n .config-nav-header {\n display: none;\n }\n\n .config-nav-item {\n white-space: nowrap;\n padding: 0.6rem 1rem;\n }\n\n .config-nav-item-active {\n border-left: none;\n border-bottom: 3px solid var(--mj-brand-primary);\n }\n\n .config-content {\n padding: 1rem;\n }\n}\n\n/* Full-Text Search Entity Management */\n.fts-entity-controls {\n margin-bottom: 16px;\n}\n\n.fts-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.fts-summary-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.fts-filter-input {\n max-width: 240px;\n}\n\n.fts-entity-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.fts-entity-card {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s, background 0.15s;\n}\n\n.fts-entity-card:hover {\n border-color: var(--mj-border-strong);\n}\n\n.fts-entity-card.fts-entity-enabled {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n}\n\n.fts-entity-toggle {\n flex-shrink: 0;\n}\n\n.fts-entity-info {\n flex: 1;\n min-width: 0;\n}\n\n.fts-entity-name {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.fts-entity-fields {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.fts-field-tag {\n display: inline-block;\n padding: 1px 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.fts-entity-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.fts-entity-title-field,\n.fts-entity-snippet-field {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.fts-entity-title-field i,\n.fts-entity-snippet-field i {\n margin-right: 4px;\n font-size: 10px;\n}\n\n/* ===== Search Scopes Manager ===== */\n\n.scope-manager {\n display: grid;\n grid-template-columns: 260px 1fr;\n gap: 16px;\n min-height: 420px;\n}\n\n.scope-manager-list {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-manager-list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.scope-manager-new-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-link);\n padding: 3px 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.7rem;\n font-weight: 500;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.scope-manager-new-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.scope-manager-loading,\n.scope-manager-empty,\n.scope-manager-empty-detail {\n padding: 16px;\n color: var(--mj-text-muted);\n text-align: center;\n font-size: 0.85rem;\n}\n\n.scope-manager-empty-detail {\n padding: 40px 24px;\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n}\n\n.scope-manager-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 6px;\n text-align: left;\n transition: background 120ms ease;\n}\n\n.scope-manager-list-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.scope-manager-list-item.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.scope-manager-list-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scope-manager-badge {\n font-size: 0.625rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.scope-manager-detail {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n}\n\n.scope-manager-tabs {\n display: flex;\n align-items: center;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.scope-manager-tab {\n background: transparent;\n border: none;\n padding: 6px 12px;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 4px;\n transition: background 120ms ease, color 120ms ease;\n}\n\n.scope-manager-tab:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.scope-manager-tab.active {\n color: var(--mj-brand-primary);\n border-bottom: 2px solid var(--mj-brand-primary);\n border-radius: 0;\n font-weight: 500;\n}\n\n.scope-manager-tab-spacer {\n flex: 1;\n}\n\n.scope-manager-save-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-save-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.scope-manager-delete-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-status-error-text);\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.scope-manager-delete-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.scope-manager-open-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-open-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.scope-definition-grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n}\n\n.scope-definition-grid label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n.scope-definition-grid label > span {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.scope-definition-full {\n grid-column: 1 / -1;\n}\n\n.scope-definition-toggle {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.scope-definition-toggle input[type=\"checkbox\"] {\n accent-color: var(--mj-brand-primary);\n}\n\n.scope-code-block {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 8px;\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Search Analytics section (P3.3)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.search-analytics-kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.search-analytics-kpi {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.search-analytics-kpi-label {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.search-analytics-kpi-value {\n font-size: 1.6rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-kpi-hint {\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n}\n\n.search-analytics-h3 {\n margin: 22px 0 8px;\n font-size: 1rem;\n color: var(--mj-text-primary);\n}\n\n.search-analytics-empty {\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n margin: 4px 0 14px;\n}\n\n.search-analytics-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.86rem;\n}\n\n.search-analytics-table thead th {\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.search-analytics-table tbody td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.search-analytics-refresh {\n margin-top: 16px;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.9rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.82rem;\n}\n\n.search-analytics-refresh:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* \u2500\u2500\u2500 Permissions Audit (P2A.7) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.search-permissions-loading {\n padding: 1.2rem;\n color: var(--mj-text-secondary);\n font-style: italic;\n}\n\n.search-permissions-filters {\n display: grid;\n grid-template-columns: 1fr 1fr 180px 130px;\n gap: 0.5rem;\n margin-bottom: 0.8rem;\n}\n\n.search-permissions-filters .mj-input {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n font-size: 0.85rem;\n}\n\n.search-permissions-summary {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n margin-bottom: 0.6rem;\n}\n\n.search-permissions-empty {\n padding: 1.2rem;\n color: var(--mj-text-muted);\n text-align: center;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.search-permissions-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.search-permissions-table th,\n.search-permissions-table td {\n padding: 0.5rem 0.7rem;\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n}\n\n.search-permissions-table th {\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n}\n\n.search-permissions-secondary {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-permissions-tag {\n display: inline-block;\n padding: 0.1rem 0.5rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 3px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.search-permissions-level {\n display: inline-block;\n padding: 0.15rem 0.55rem;\n border-radius: 3px;\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.search-permissions-level-none {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.search-permissions-level-read {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info-text);\n}\n\n.search-permissions-level-search {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.search-permissions-level-manage {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n"] }]
|
|
2388
2430
|
}], null, null); })();
|
|
2389
2431
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KnowledgeConfigResourceComponent, { className: "KnowledgeConfigResourceComponent", filePath: "src/KnowledgeHub/components/config/knowledge-config-resource.component.ts", lineNumber: 99 }); })();
|
|
2390
2432
|
/** Tree-shaking prevention */
|