@memberjunction/ng-dashboards 5.37.0 → 5.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -7
- package/dist/AI/components/agents/agent-configuration.component.js +199 -198
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
- 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 +166 -58
- package/dist/AI/components/analytics/cost-budget/cost-budget.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 +2 -1
- 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 +1 -0
- 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 +55 -36
- 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 +9 -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 +158 -117
- 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 +1 -0
- 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 +22 -8
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +89 -842
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1353 -7683
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +235 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1735 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts +43 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.js +209 -0
- package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts +276 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
- package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +40 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js +402 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +122 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +752 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +166 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1384 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +70 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js +448 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +47 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js +220 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +293 -289
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +209 -208
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +130 -128
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +17 -17
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +550 -532
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +14 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/AI/services/cache-metrics.d.ts +50 -0
- package/dist/AI/services/cache-metrics.d.ts.map +1 -0
- package/dist/AI/services/cache-metrics.js +43 -0
- package/dist/AI/services/cache-metrics.js.map +1 -0
- package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
- package/dist/APIKeys/api-keys-resource.component.js +132 -131
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +141 -141
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +15 -15
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +2 -2
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +2 -2
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +2 -2
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +72 -50
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +103 -102
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +52 -51
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +39 -38
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +92 -89
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +73 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +512 -127
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-resource.component.d.ts +22 -0
- package/dist/ComponentStudio/component-studio-resource.component.d.ts.map +1 -0
- package/dist/ComponentStudio/component-studio-resource.component.js +55 -0
- package/dist/ComponentStudio/component-studio-resource.component.js.map +1 -0
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +104 -45
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +234 -331
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts +54 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js +339 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts +65 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js +492 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts +88 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js +457 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +106 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.js +478 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -0
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +54 -0
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +361 -50
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +10 -0
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +114 -45
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
- package/dist/ComponentStudio/services/canvas-to-code.d.ts +32 -0
- package/dist/ComponentStudio/services/canvas-to-code.d.ts.map +1 -0
- package/dist/ComponentStudio/services/canvas-to-code.js +347 -0
- package/dist/ComponentStudio/services/canvas-to-code.js.map +1 -0
- package/dist/ComponentStudio/services/code-to-canvas.d.ts +32 -0
- package/dist/ComponentStudio/services/code-to-canvas.d.ts.map +1 -0
- package/dist/ComponentStudio/services/code-to-canvas.js +92 -0
- package/dist/ComponentStudio/services/code-to-canvas.js.map +1 -0
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts +29 -0
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.js +76 -0
- package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
- package/dist/ComponentStudio/services/entity-form-override.service.d.ts +86 -0
- package/dist/ComponentStudio/services/entity-form-override.service.d.ts.map +1 -0
- package/dist/ComponentStudio/services/entity-form-override.service.js +246 -0
- package/dist/ComponentStudio/services/entity-form-override.service.js.map +1 -0
- package/dist/ComponentStudio/services/field-binding-scanner.d.ts +29 -0
- package/dist/ComponentStudio/services/field-binding-scanner.d.ts.map +1 -0
- package/dist/ComponentStudio/services/field-binding-scanner.js +110 -0
- package/dist/ComponentStudio/services/field-binding-scanner.js.map +1 -0
- package/dist/ComponentStudio/services/form-canvas-model.d.ts +56 -0
- package/dist/ComponentStudio/services/form-canvas-model.d.ts.map +1 -0
- package/dist/ComponentStudio/services/form-canvas-model.js +35 -0
- package/dist/ComponentStudio/services/form-canvas-model.js.map +1 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.d.ts +10 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.d.ts.map +1 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.js +10 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.js.map +1 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +18 -17
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -85
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +155 -150
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +245 -243
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +18 -17
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts +964 -0
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -0
- package/dist/FormBuilder/form-builder-resource.component.js +4487 -0
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts +55 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts.map +1 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.js +73 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.js.map +1 -0
- package/dist/Home/home-application.d.ts +21 -1
- package/dist/Home/home-application.d.ts.map +1 -1
- package/dist/Home/home-application.js +60 -8
- package/dist/Home/home-application.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +236 -229
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +390 -389
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +45 -44
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +525 -566
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +135 -134
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +443 -438
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +14 -14
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +11 -10
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +436 -427
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +1 -1
- package/dist/Testing/components/testing-runs.component.js +116 -115
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +6 -7
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +173 -172
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +116 -92
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +47 -35
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +40 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +1 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +7 -1
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/component-studio-dashboards.module.d.ts +34 -22
- package/dist/component-studio-dashboards.module.d.ts.map +1 -1
- package/dist/component-studio-dashboards.module.js +65 -9
- package/dist/component-studio-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +4 -5
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +7 -5
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +55 -53
|
@@ -39,65 +39,67 @@ function KnowledgeConfigResourceComponent_Conditional_5_Template(rf, ctx) { if (
|
|
|
39
39
|
i0.ɵɵelementStart(0, "button", 7);
|
|
40
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
41
|
i0.ɵɵelement(1, "i", 8);
|
|
42
|
-
i0.ɵɵ
|
|
43
|
-
i0.ɵɵ
|
|
44
|
-
i0.ɵɵ
|
|
45
|
-
i0.ɵɵ
|
|
46
|
-
i0.ɵɵ
|
|
47
|
-
i0.ɵɵ
|
|
48
|
-
i0.ɵɵ
|
|
42
|
+
i0.ɵɵelementStart(2, "span", 9);
|
|
43
|
+
i0.ɵɵtext(3, "Reset");
|
|
44
|
+
i0.ɵɵelementEnd()();
|
|
45
|
+
i0.ɵɵelementStart(4, "button", 10);
|
|
46
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_5_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SaveConfiguration()); });
|
|
47
|
+
i0.ɵɵelement(5, "i", 11);
|
|
48
|
+
i0.ɵɵelementStart(6, "span", 9);
|
|
49
|
+
i0.ɵɵtext(7);
|
|
50
|
+
i0.ɵɵelementEnd()();
|
|
49
51
|
} if (rf & 2) {
|
|
50
52
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
51
53
|
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
52
|
-
i0.ɵɵadvance(
|
|
54
|
+
i0.ɵɵadvance(4);
|
|
53
55
|
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
54
|
-
i0.ɵɵadvance(
|
|
55
|
-
i0.ɵɵ
|
|
56
|
+
i0.ɵɵadvance(3);
|
|
57
|
+
i0.ɵɵtextInterpolate(ctx_r1.IsSaving ? "Saving\u2026" : "Save");
|
|
56
58
|
} }
|
|
57
59
|
function KnowledgeConfigResourceComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
58
60
|
i0.ɵɵelementStart(0, "div", 5);
|
|
59
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
61
|
+
i0.ɵɵelement(1, "mj-loading", 12);
|
|
60
62
|
i0.ɵɵelementEnd();
|
|
61
63
|
} }
|
|
62
64
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
63
65
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
64
|
-
i0.ɵɵelementStart(0, "div",
|
|
66
|
+
i0.ɵɵelementStart(0, "div", 15)(1, "div", 18)(2, "label", 19)(3, "div", 20)(4, "span", 21);
|
|
65
67
|
i0.ɵɵtext(5, "Auto-tag on Ingest");
|
|
66
68
|
i0.ɵɵelementEnd();
|
|
67
|
-
i0.ɵɵelementStart(6, "span",
|
|
69
|
+
i0.ɵɵelementStart(6, "span", 22);
|
|
68
70
|
i0.ɵɵtext(7, "Automatically run autotagging when new content is ingested");
|
|
69
71
|
i0.ɵɵelementEnd()();
|
|
70
|
-
i0.ɵɵelementStart(8, "input",
|
|
72
|
+
i0.ɵɵelementStart(8, "input", 23);
|
|
71
73
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.AutotagOnIngest, $event) || (ctx_r1.PipelineSettings.AutotagOnIngest = $event); return i0.ɵɵresetView($event); });
|
|
72
74
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_change_8_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
73
75
|
i0.ɵɵelementEnd()();
|
|
74
|
-
i0.ɵɵelementStart(9, "label",
|
|
76
|
+
i0.ɵɵelementStart(9, "label", 19)(10, "div", 20)(11, "span", 21);
|
|
75
77
|
i0.ɵɵtext(12, "Vectorize on Ingest");
|
|
76
78
|
i0.ɵɵelementEnd();
|
|
77
|
-
i0.ɵɵelementStart(13, "span",
|
|
79
|
+
i0.ɵɵelementStart(13, "span", 22);
|
|
78
80
|
i0.ɵɵtext(14, "Automatically create embeddings for new content");
|
|
79
81
|
i0.ɵɵelementEnd()();
|
|
80
|
-
i0.ɵɵelementStart(15, "input",
|
|
82
|
+
i0.ɵɵelementStart(15, "input", 23);
|
|
81
83
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.VectorizeOnIngest, $event) || (ctx_r1.PipelineSettings.VectorizeOnIngest = $event); return i0.ɵɵresetView($event); });
|
|
82
84
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_change_15_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
83
85
|
i0.ɵɵelementEnd()();
|
|
84
|
-
i0.ɵɵelementStart(16, "div",
|
|
86
|
+
i0.ɵɵelementStart(16, "div", 24)(17, "div", 25)(18, "span", 21);
|
|
85
87
|
i0.ɵɵtext(19, "Default Batch Size");
|
|
86
88
|
i0.ɵɵelementEnd();
|
|
87
|
-
i0.ɵɵelementStart(20, "span",
|
|
89
|
+
i0.ɵɵelementStart(20, "span", 22);
|
|
88
90
|
i0.ɵɵtext(21, "Number of items processed per batch");
|
|
89
91
|
i0.ɵɵelementEnd()();
|
|
90
|
-
i0.ɵɵelementStart(22, "input",
|
|
92
|
+
i0.ɵɵelementStart(22, "input", 26);
|
|
91
93
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.DefaultBatchSize, $event) || (ctx_r1.PipelineSettings.DefaultBatchSize = $event); return i0.ɵɵresetView($event); });
|
|
92
94
|
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_input_22_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
93
95
|
i0.ɵɵelementEnd()();
|
|
94
|
-
i0.ɵɵelementStart(23, "div",
|
|
96
|
+
i0.ɵɵelementStart(23, "div", 24)(24, "div", 25)(25, "span", 21);
|
|
95
97
|
i0.ɵɵtext(26, "Max Concurrent Jobs");
|
|
96
98
|
i0.ɵɵelementEnd();
|
|
97
|
-
i0.ɵɵelementStart(27, "span",
|
|
99
|
+
i0.ɵɵelementStart(27, "span", 22);
|
|
98
100
|
i0.ɵɵtext(28, "Maximum number of pipeline jobs running at once");
|
|
99
101
|
i0.ɵɵelementEnd()();
|
|
100
|
-
i0.ɵɵelementStart(29, "input",
|
|
102
|
+
i0.ɵɵelementStart(29, "input", 27);
|
|
101
103
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_ngModelChange_29_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.MaxConcurrentJobs, $event) || (ctx_r1.PipelineSettings.MaxConcurrentJobs = $event); return i0.ɵɵresetView($event); });
|
|
102
104
|
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_input_29_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
103
105
|
i0.ɵɵelementEnd()()()();
|
|
@@ -113,15 +115,15 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template(r
|
|
|
113
115
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.MaxConcurrentJobs);
|
|
114
116
|
} }
|
|
115
117
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
116
|
-
i0.ɵɵelement(0, "i",
|
|
118
|
+
i0.ɵɵelement(0, "i", 37);
|
|
117
119
|
} }
|
|
118
120
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
119
|
-
i0.ɵɵelementStart(0, "span",
|
|
121
|
+
i0.ɵɵelementStart(0, "span", 38);
|
|
120
122
|
i0.ɵɵtext(1, "1");
|
|
121
123
|
i0.ɵɵelementEnd();
|
|
122
124
|
} }
|
|
123
125
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
124
|
-
i0.ɵɵelementStart(0, "span",
|
|
126
|
+
i0.ɵɵelementStart(0, "span", 41);
|
|
125
127
|
i0.ɵɵtext(1);
|
|
126
128
|
i0.ɵɵelementEnd();
|
|
127
129
|
} if (rf & 2) {
|
|
@@ -130,12 +132,12 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
130
132
|
i0.ɵɵtextInterpolate1("", ctx_r1.VectorDBProviders.length, " provider(s) registered");
|
|
131
133
|
} }
|
|
132
134
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
133
|
-
i0.ɵɵelementStart(0, "span",
|
|
135
|
+
i0.ɵɵelementStart(0, "span", 41);
|
|
134
136
|
i0.ɵɵtext(1, "No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.");
|
|
135
137
|
i0.ɵɵelementEnd();
|
|
136
138
|
} }
|
|
137
139
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_For_20_Template(rf, ctx) { if (rf & 1) {
|
|
138
|
-
i0.ɵɵelementStart(0, "option",
|
|
140
|
+
i0.ɵɵelementStart(0, "option", 57);
|
|
139
141
|
i0.ɵɵtext(1);
|
|
140
142
|
i0.ɵɵelementEnd();
|
|
141
143
|
} if (rf & 2) {
|
|
@@ -145,36 +147,36 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
145
147
|
i0.ɵɵtextInterpolate(cred_r7.Name);
|
|
146
148
|
} }
|
|
147
149
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
148
|
-
i0.ɵɵelement(0, "i",
|
|
150
|
+
i0.ɵɵelement(0, "i", 58);
|
|
149
151
|
} }
|
|
150
152
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
151
153
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
152
|
-
i0.ɵɵelementStart(0, "div",
|
|
153
|
-
i0.ɵɵelement(2, "i",
|
|
154
|
+
i0.ɵɵelementStart(0, "div", 45)(1, "div", 46);
|
|
155
|
+
i0.ɵɵelement(2, "i", 47);
|
|
154
156
|
i0.ɵɵelementEnd();
|
|
155
|
-
i0.ɵɵelementStart(3, "div",
|
|
157
|
+
i0.ɵɵelementStart(3, "div", 48)(4, "span", 49);
|
|
156
158
|
i0.ɵɵtext(5);
|
|
157
159
|
i0.ɵɵelementEnd();
|
|
158
|
-
i0.ɵɵelementStart(6, "span",
|
|
160
|
+
i0.ɵɵelementStart(6, "span", 50);
|
|
159
161
|
i0.ɵɵtext(7);
|
|
160
162
|
i0.ɵɵelementEnd()();
|
|
161
|
-
i0.ɵɵelementStart(8, "span",
|
|
162
|
-
i0.ɵɵelement(9, "i",
|
|
163
|
+
i0.ɵɵelementStart(8, "span", 51);
|
|
164
|
+
i0.ɵɵelement(9, "i", 37);
|
|
163
165
|
i0.ɵɵtext(10, " Active ");
|
|
164
166
|
i0.ɵɵelementEnd()();
|
|
165
|
-
i0.ɵɵelementStart(11, "div",
|
|
166
|
-
i0.ɵɵelement(13, "i",
|
|
167
|
+
i0.ɵɵelementStart(11, "div", 52)(12, "label", 53);
|
|
168
|
+
i0.ɵɵelement(13, "i", 54);
|
|
167
169
|
i0.ɵɵtext(14, " API Credential ");
|
|
168
170
|
i0.ɵɵelementEnd();
|
|
169
|
-
i0.ɵɵelementStart(15, "div",
|
|
171
|
+
i0.ɵɵelementStart(15, "div", 55)(16, "select", 56);
|
|
170
172
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template_select_ngModelChange_16_listener($event) { const provider_r6 = i0.ɵɵrestoreView(_r5).$implicit; i0.ɵɵtwoWayBindingSet(provider_r6.CredentialID, $event) || (provider_r6.CredentialID = $event); return i0.ɵɵresetView($event); });
|
|
171
173
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template_select_change_16_listener() { const provider_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SaveProviderCredential(provider_r6)); });
|
|
172
|
-
i0.ɵɵelementStart(17, "option",
|
|
174
|
+
i0.ɵɵelementStart(17, "option", 57);
|
|
173
175
|
i0.ɵɵtext(18, "None (use environment variable)");
|
|
174
176
|
i0.ɵɵelementEnd();
|
|
175
|
-
i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_For_20_Template, 2, 2, "option",
|
|
177
|
+
i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_For_20_Template, 2, 2, "option", 57, _forTrack0);
|
|
176
178
|
i0.ɵɵelementEnd();
|
|
177
|
-
i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Conditional_21_Template, 1, 0, "i",
|
|
179
|
+
i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Conditional_21_Template, 1, 0, "i", 58);
|
|
178
180
|
i0.ɵɵelementEnd()();
|
|
179
181
|
} if (rf & 2) {
|
|
180
182
|
const provider_r6 = ctx.$implicit;
|
|
@@ -194,7 +196,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
194
196
|
i0.ɵɵconditional(ctx_r1.IsSavingCredential ? 21 : -1);
|
|
195
197
|
} }
|
|
196
198
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
197
|
-
i0.ɵɵelementStart(0, "div",
|
|
199
|
+
i0.ɵɵelementStart(0, "div", 42);
|
|
198
200
|
i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template, 22, 6, null, null, _forTrack0);
|
|
199
201
|
i0.ɵɵelementEnd();
|
|
200
202
|
} if (rf & 2) {
|
|
@@ -203,15 +205,15 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
203
205
|
i0.ɵɵrepeater(ctx_r1.VectorDBProviders);
|
|
204
206
|
} }
|
|
205
207
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
206
|
-
i0.ɵɵelement(0, "i",
|
|
208
|
+
i0.ɵɵelement(0, "i", 37);
|
|
207
209
|
} }
|
|
208
210
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
209
|
-
i0.ɵɵelementStart(0, "span",
|
|
211
|
+
i0.ɵɵelementStart(0, "span", 38);
|
|
210
212
|
i0.ɵɵtext(1, "2");
|
|
211
213
|
i0.ɵɵelementEnd();
|
|
212
214
|
} }
|
|
213
215
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
214
|
-
i0.ɵɵelementStart(0, "span",
|
|
216
|
+
i0.ɵɵelementStart(0, "span", 41);
|
|
215
217
|
i0.ɵɵtext(1);
|
|
216
218
|
i0.ɵɵelementEnd();
|
|
217
219
|
} if (rf & 2) {
|
|
@@ -220,12 +222,12 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
220
222
|
i0.ɵɵtextInterpolate1("", ctx_r1.EmbeddingModels.length, " model(s) available");
|
|
221
223
|
} }
|
|
222
224
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
223
|
-
i0.ɵɵelementStart(0, "span",
|
|
225
|
+
i0.ɵɵelementStart(0, "span", 41);
|
|
224
226
|
i0.ɵɵtext(1, "No embedding models found. Configure at least one in the AI app > Models tab.");
|
|
225
227
|
i0.ɵɵelementEnd();
|
|
226
228
|
} }
|
|
227
229
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
228
|
-
i0.ɵɵelementStart(0, "span",
|
|
230
|
+
i0.ɵɵelementStart(0, "span", 60);
|
|
229
231
|
i0.ɵɵtext(1);
|
|
230
232
|
i0.ɵɵelementEnd();
|
|
231
233
|
} if (rf & 2) {
|
|
@@ -234,8 +236,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
234
236
|
i0.ɵɵtextInterpolate(model_r8.Name);
|
|
235
237
|
} }
|
|
236
238
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
237
|
-
i0.ɵɵelementStart(0, "div",
|
|
238
|
-
i0.ɵɵrepeaterCreate(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_For_3_Template, 2, 1, "span",
|
|
239
|
+
i0.ɵɵelementStart(0, "div", 42)(1, "div", 59);
|
|
240
|
+
i0.ɵɵrepeaterCreate(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_For_3_Template, 2, 1, "span", 60, _forTrack0);
|
|
239
241
|
i0.ɵɵelementEnd()();
|
|
240
242
|
} if (rf & 2) {
|
|
241
243
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -243,15 +245,15 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
243
245
|
i0.ɵɵrepeater(ctx_r1.EmbeddingModels);
|
|
244
246
|
} }
|
|
245
247
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
246
|
-
i0.ɵɵelement(0, "i",
|
|
248
|
+
i0.ɵɵelement(0, "i", 37);
|
|
247
249
|
} }
|
|
248
250
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
249
|
-
i0.ɵɵelementStart(0, "span",
|
|
251
|
+
i0.ɵɵelementStart(0, "span", 38);
|
|
250
252
|
i0.ɵɵtext(1, "3");
|
|
251
253
|
i0.ɵɵelementEnd();
|
|
252
254
|
} }
|
|
253
255
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_39_Template(rf, ctx) { if (rf & 1) {
|
|
254
|
-
i0.ɵɵelementStart(0, "span",
|
|
256
|
+
i0.ɵɵelementStart(0, "span", 41);
|
|
255
257
|
i0.ɵɵtext(1);
|
|
256
258
|
i0.ɵɵelementEnd();
|
|
257
259
|
} if (rf & 2) {
|
|
@@ -260,44 +262,44 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
260
262
|
i0.ɵɵtextInterpolate1("", ctx_r1.VectorIndexes.length, " index(es) configured");
|
|
261
263
|
} }
|
|
262
264
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_40_Template(rf, ctx) { if (rf & 1) {
|
|
263
|
-
i0.ɵɵelementStart(0, "span",
|
|
265
|
+
i0.ɵɵelementStart(0, "span", 41);
|
|
264
266
|
i0.ɵɵtext(1, "No indexes yet \u2014 create one below.");
|
|
265
267
|
i0.ɵɵelementEnd();
|
|
266
268
|
} }
|
|
267
269
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_41_Template(rf, ctx) { if (rf & 1) {
|
|
268
|
-
i0.ɵɵelementStart(0, "span",
|
|
270
|
+
i0.ɵɵelementStart(0, "span", 41);
|
|
269
271
|
i0.ɵɵtext(1, "Complete steps 1 and 2 first.");
|
|
270
272
|
i0.ɵɵelementEnd();
|
|
271
273
|
} }
|
|
272
274
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template(rf, ctx) { if (rf & 1) {
|
|
273
275
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
274
|
-
i0.ɵɵelementStart(0, "button",
|
|
276
|
+
i0.ɵɵelementStart(0, "button", 61);
|
|
275
277
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenCreateIndexForm()); });
|
|
276
|
-
i0.ɵɵelement(1, "i",
|
|
278
|
+
i0.ɵɵelement(1, "i", 62);
|
|
277
279
|
i0.ɵɵtext(2, " Create Index ");
|
|
278
280
|
i0.ɵɵelementEnd();
|
|
279
281
|
} }
|
|
280
282
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
281
283
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
282
|
-
i0.ɵɵelementStart(0, "div",
|
|
283
|
-
i0.ɵɵelement(2, "i",
|
|
284
|
+
i0.ɵɵelementStart(0, "div", 63)(1, "div", 64);
|
|
285
|
+
i0.ɵɵelement(2, "i", 65);
|
|
284
286
|
i0.ɵɵelementEnd();
|
|
285
|
-
i0.ɵɵelementStart(3, "div",
|
|
287
|
+
i0.ɵɵelementStart(3, "div", 66)(4, "span", 67);
|
|
286
288
|
i0.ɵɵtext(5);
|
|
287
289
|
i0.ɵɵelementEnd();
|
|
288
|
-
i0.ɵɵelementStart(6, "span",
|
|
289
|
-
i0.ɵɵelement(7, "i",
|
|
290
|
+
i0.ɵɵelementStart(6, "span", 68);
|
|
291
|
+
i0.ɵɵelement(7, "i", 47);
|
|
290
292
|
i0.ɵɵtext(8);
|
|
291
|
-
i0.ɵɵelement(9, "i",
|
|
293
|
+
i0.ɵɵelement(9, "i", 69);
|
|
292
294
|
i0.ɵɵtext(10);
|
|
293
295
|
i0.ɵɵelementEnd()();
|
|
294
|
-
i0.ɵɵelementStart(11, "div",
|
|
295
|
-
i0.ɵɵelement(13, "i",
|
|
296
|
+
i0.ɵɵelementStart(11, "div", 70)(12, "span", 51);
|
|
297
|
+
i0.ɵɵelement(13, "i", 37);
|
|
296
298
|
i0.ɵɵtext(14, " Active ");
|
|
297
299
|
i0.ɵɵelementEnd();
|
|
298
|
-
i0.ɵɵelementStart(15, "button",
|
|
300
|
+
i0.ɵɵelementStart(15, "button", 71);
|
|
299
301
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_For_2_Template_button_click_15_listener() { const idx_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DeleteIndex(idx_r11.ID)); });
|
|
300
|
-
i0.ɵɵelement(16, "i",
|
|
302
|
+
i0.ɵɵelement(16, "i", 72);
|
|
301
303
|
i0.ɵɵelementEnd()()();
|
|
302
304
|
} if (rf & 2) {
|
|
303
305
|
const idx_r11 = ctx.$implicit;
|
|
@@ -309,8 +311,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
309
311
|
i0.ɵɵtextInterpolate1(" ", idx_r11.EmbeddingModel, " ");
|
|
310
312
|
} }
|
|
311
313
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_Template(rf, ctx) { if (rf & 1) {
|
|
312
|
-
i0.ɵɵelementStart(0, "div",
|
|
313
|
-
i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_For_2_Template, 17, 3, "div",
|
|
314
|
+
i0.ɵɵelementStart(0, "div", 42);
|
|
315
|
+
i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_For_2_Template, 17, 3, "div", 63, _forTrack0);
|
|
314
316
|
i0.ɵɵelementEnd();
|
|
315
317
|
} if (rf & 2) {
|
|
316
318
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -318,7 +320,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
318
320
|
i0.ɵɵrepeater(ctx_r1.VectorIndexes);
|
|
319
321
|
} }
|
|
320
322
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_14_Template(rf, ctx) { if (rf & 1) {
|
|
321
|
-
i0.ɵɵelementStart(0, "option",
|
|
323
|
+
i0.ɵɵelementStart(0, "option", 80);
|
|
322
324
|
i0.ɵɵtext(1);
|
|
323
325
|
i0.ɵɵelementEnd();
|
|
324
326
|
} if (rf & 2) {
|
|
@@ -328,7 +330,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
328
330
|
i0.ɵɵtextInterpolate(db_r13.Name);
|
|
329
331
|
} }
|
|
330
332
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_20_Template(rf, ctx) { if (rf & 1) {
|
|
331
|
-
i0.ɵɵelementStart(0, "option",
|
|
333
|
+
i0.ɵɵelementStart(0, "option", 80);
|
|
332
334
|
i0.ɵɵtext(1);
|
|
333
335
|
i0.ɵɵelementEnd();
|
|
334
336
|
} if (rf & 2) {
|
|
@@ -338,44 +340,44 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
338
340
|
i0.ɵɵtextInterpolate(model_r14.Name);
|
|
339
341
|
} }
|
|
340
342
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
341
|
-
i0.ɵɵelement(0, "i",
|
|
343
|
+
i0.ɵɵelement(0, "i", 84);
|
|
342
344
|
i0.ɵɵtext(1, " Creating... ");
|
|
343
345
|
} }
|
|
344
346
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
345
|
-
i0.ɵɵelement(0, "i",
|
|
347
|
+
i0.ɵɵelement(0, "i", 62);
|
|
346
348
|
i0.ɵɵtext(1, " Create Index ");
|
|
347
349
|
} }
|
|
348
350
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
349
351
|
const _r12 = i0.ɵɵgetCurrentView();
|
|
350
|
-
i0.ɵɵelementStart(0, "div",
|
|
351
|
-
i0.ɵɵelement(2, "i",
|
|
352
|
+
i0.ɵɵelementStart(0, "div", 44)(1, "h4", 73);
|
|
353
|
+
i0.ɵɵelement(2, "i", 74);
|
|
352
354
|
i0.ɵɵtext(3, " Create New Vector Index ");
|
|
353
355
|
i0.ɵɵelementEnd();
|
|
354
|
-
i0.ɵɵelementStart(4, "div",
|
|
356
|
+
i0.ɵɵelementStart(4, "div", 75)(5, "div", 76)(6, "label", 77);
|
|
355
357
|
i0.ɵɵtext(7, "Index Name");
|
|
356
358
|
i0.ɵɵelementEnd();
|
|
357
|
-
i0.ɵɵelementStart(8, "input",
|
|
359
|
+
i0.ɵɵelementStart(8, "input", 78);
|
|
358
360
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexName, $event) || (ctx_r1.NewIndexName = $event); return i0.ɵɵresetView($event); });
|
|
359
361
|
i0.ɵɵelementEnd()();
|
|
360
|
-
i0.ɵɵelementStart(9, "div",
|
|
362
|
+
i0.ɵɵelementStart(9, "div", 76)(10, "label", 77);
|
|
361
363
|
i0.ɵɵtext(11, "Vector Database");
|
|
362
364
|
i0.ɵɵelementEnd();
|
|
363
|
-
i0.ɵɵelementStart(12, "select",
|
|
365
|
+
i0.ɵɵelementStart(12, "select", 79);
|
|
364
366
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_select_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexVectorDBID, $event) || (ctx_r1.NewIndexVectorDBID = $event); return i0.ɵɵresetView($event); });
|
|
365
|
-
i0.ɵɵrepeaterCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_14_Template, 2, 2, "option",
|
|
367
|
+
i0.ɵɵrepeaterCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_14_Template, 2, 2, "option", 80, _forTrack0);
|
|
366
368
|
i0.ɵɵelementEnd()();
|
|
367
|
-
i0.ɵɵelementStart(15, "div",
|
|
369
|
+
i0.ɵɵelementStart(15, "div", 76)(16, "label", 77);
|
|
368
370
|
i0.ɵɵtext(17, "Embedding Model");
|
|
369
371
|
i0.ɵɵelementEnd();
|
|
370
|
-
i0.ɵɵelementStart(18, "select",
|
|
372
|
+
i0.ɵɵelementStart(18, "select", 79);
|
|
371
373
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_select_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexEmbeddingModelID, $event) || (ctx_r1.NewIndexEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
|
|
372
|
-
i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_20_Template, 2, 2, "option",
|
|
374
|
+
i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_20_Template, 2, 2, "option", 80, _forTrack0);
|
|
373
375
|
i0.ɵɵelementEnd()()();
|
|
374
|
-
i0.ɵɵelementStart(21, "div",
|
|
376
|
+
i0.ɵɵelementStart(21, "div", 81)(22, "button", 82);
|
|
375
377
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CreateIndex()); });
|
|
376
378
|
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_23_Template, 2, 0)(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_24_Template, 2, 0);
|
|
377
379
|
i0.ɵɵelementEnd();
|
|
378
|
-
i0.ɵɵelementStart(25, "button",
|
|
380
|
+
i0.ɵɵelementStart(25, "button", 83);
|
|
379
381
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CancelCreateIndex()); });
|
|
380
382
|
i0.ɵɵtext(26, " Cancel ");
|
|
381
383
|
i0.ɵɵelementEnd()()();
|
|
@@ -399,47 +401,47 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
|
|
|
399
401
|
i0.ɵɵproperty("disabled", ctx_r1.IsCreatingIndex);
|
|
400
402
|
} }
|
|
401
403
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
402
|
-
i0.ɵɵelementStart(0, "div",
|
|
404
|
+
i0.ɵɵelementStart(0, "div", 15)(1, "div", 28)(2, "div", 29)(3, "span", 30);
|
|
403
405
|
i0.ɵɵtext(4, "Setup Progress");
|
|
404
406
|
i0.ɵɵelementEnd();
|
|
405
|
-
i0.ɵɵelementStart(5, "span",
|
|
407
|
+
i0.ɵɵelementStart(5, "span", 31);
|
|
406
408
|
i0.ɵɵtext(6);
|
|
407
409
|
i0.ɵɵelementEnd()();
|
|
408
|
-
i0.ɵɵelementStart(7, "div",
|
|
409
|
-
i0.ɵɵelement(8, "div",
|
|
410
|
+
i0.ɵɵelementStart(7, "div", 32);
|
|
411
|
+
i0.ɵɵelement(8, "div", 33);
|
|
410
412
|
i0.ɵɵelementEnd()();
|
|
411
|
-
i0.ɵɵelementStart(9, "div",
|
|
412
|
-
i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_12_Template, 1, 0, "i",
|
|
413
|
+
i0.ɵɵelementStart(9, "div", 34)(10, "div", 35)(11, "div", 36);
|
|
414
|
+
i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_12_Template, 1, 0, "i", 37)(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_13_Template, 2, 0, "span", 38);
|
|
413
415
|
i0.ɵɵelementEnd();
|
|
414
|
-
i0.ɵɵelementStart(14, "div",
|
|
416
|
+
i0.ɵɵelementStart(14, "div", 39)(15, "span", 40);
|
|
415
417
|
i0.ɵɵtext(16, "Vector Database Providers");
|
|
416
418
|
i0.ɵɵelementEnd();
|
|
417
|
-
i0.ɵɵconditionalCreate(17, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_17_Template, 2, 1, "span",
|
|
419
|
+
i0.ɵɵconditionalCreate(17, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_17_Template, 2, 1, "span", 41)(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_18_Template, 2, 0, "span", 41);
|
|
418
420
|
i0.ɵɵelementEnd()();
|
|
419
|
-
i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_Template, 3, 0, "div",
|
|
421
|
+
i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_Template, 3, 0, "div", 42);
|
|
420
422
|
i0.ɵɵelementEnd();
|
|
421
|
-
i0.ɵɵelementStart(20, "div",
|
|
422
|
-
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_23_Template, 1, 0, "i",
|
|
423
|
+
i0.ɵɵelementStart(20, "div", 34)(21, "div", 35)(22, "div", 36);
|
|
424
|
+
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_23_Template, 1, 0, "i", 37)(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_24_Template, 2, 0, "span", 38);
|
|
423
425
|
i0.ɵɵelementEnd();
|
|
424
|
-
i0.ɵɵelementStart(25, "div",
|
|
426
|
+
i0.ɵɵelementStart(25, "div", 39)(26, "span", 40);
|
|
425
427
|
i0.ɵɵtext(27, "Embedding Models");
|
|
426
428
|
i0.ɵɵelementEnd();
|
|
427
|
-
i0.ɵɵconditionalCreate(28, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_28_Template, 2, 1, "span",
|
|
429
|
+
i0.ɵɵconditionalCreate(28, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_28_Template, 2, 1, "span", 41)(29, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_29_Template, 2, 0, "span", 41);
|
|
428
430
|
i0.ɵɵelementEnd()();
|
|
429
|
-
i0.ɵɵconditionalCreate(30, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_Template, 4, 0, "div",
|
|
431
|
+
i0.ɵɵconditionalCreate(30, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_Template, 4, 0, "div", 42);
|
|
430
432
|
i0.ɵɵelementEnd();
|
|
431
|
-
i0.ɵɵelementStart(31, "div",
|
|
432
|
-
i0.ɵɵconditionalCreate(34, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_34_Template, 1, 0, "i",
|
|
433
|
+
i0.ɵɵelementStart(31, "div", 34)(32, "div", 35)(33, "div", 36);
|
|
434
|
+
i0.ɵɵconditionalCreate(34, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_34_Template, 1, 0, "i", 37)(35, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_35_Template, 2, 0, "span", 38);
|
|
433
435
|
i0.ɵɵelementEnd();
|
|
434
|
-
i0.ɵɵelementStart(36, "div",
|
|
436
|
+
i0.ɵɵelementStart(36, "div", 39)(37, "span", 40);
|
|
435
437
|
i0.ɵɵtext(38, "Vector Indexes");
|
|
436
438
|
i0.ɵɵelementEnd();
|
|
437
|
-
i0.ɵɵconditionalCreate(39, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_39_Template, 2, 1, "span",
|
|
439
|
+
i0.ɵɵconditionalCreate(39, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_39_Template, 2, 1, "span", 41)(40, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_40_Template, 2, 0, "span", 41)(41, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_41_Template, 2, 0, "span", 41);
|
|
438
440
|
i0.ɵɵelementEnd();
|
|
439
|
-
i0.ɵɵconditionalCreate(42, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template, 3, 0, "button",
|
|
441
|
+
i0.ɵɵconditionalCreate(42, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template, 3, 0, "button", 43);
|
|
440
442
|
i0.ɵɵelementEnd();
|
|
441
|
-
i0.ɵɵconditionalCreate(43, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_Template, 3, 0, "div",
|
|
442
|
-
i0.ɵɵconditionalCreate(44, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template, 27, 6, "div",
|
|
443
|
+
i0.ɵɵconditionalCreate(43, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_Template, 3, 0, "div", 42);
|
|
444
|
+
i0.ɵɵconditionalCreate(44, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template, 27, 6, "div", 44);
|
|
443
445
|
i0.ɵɵelementEnd()();
|
|
444
446
|
} if (rf & 2) {
|
|
445
447
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -477,20 +479,20 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Template(r
|
|
|
477
479
|
i0.ɵɵconditional(ctx_r1.ShowCreateIndexForm ? 44 : -1);
|
|
478
480
|
} }
|
|
479
481
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
480
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
482
|
+
i0.ɵɵelement(0, "mj-loading", 85);
|
|
481
483
|
} }
|
|
482
484
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
483
|
-
i0.ɵɵelementStart(0, "div",
|
|
484
|
-
i0.ɵɵelement(1, "i",
|
|
485
|
-
i0.ɵɵelementStart(2, "h3",
|
|
485
|
+
i0.ɵɵelementStart(0, "div", 86);
|
|
486
|
+
i0.ɵɵelement(1, "i", 87);
|
|
487
|
+
i0.ɵɵelementStart(2, "h3", 88);
|
|
486
488
|
i0.ɵɵtext(3, "No Searchable Entities Found");
|
|
487
489
|
i0.ɵɵelementEnd();
|
|
488
|
-
i0.ɵɵelementStart(4, "p",
|
|
490
|
+
i0.ɵɵelementStart(4, "p", 89);
|
|
489
491
|
i0.ɵɵtext(5, "No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.");
|
|
490
492
|
i0.ɵɵelementEnd()();
|
|
491
493
|
} }
|
|
492
494
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
493
|
-
i0.ɵɵelementStart(0, "span",
|
|
495
|
+
i0.ɵɵelementStart(0, "span", 101);
|
|
494
496
|
i0.ɵɵtext(1);
|
|
495
497
|
i0.ɵɵelementEnd();
|
|
496
498
|
} if (rf & 2) {
|
|
@@ -499,8 +501,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditiona
|
|
|
499
501
|
i0.ɵɵtextInterpolate(field_r18);
|
|
500
502
|
} }
|
|
501
503
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
502
|
-
i0.ɵɵelementStart(0, "span",
|
|
503
|
-
i0.ɵɵelement(1, "i",
|
|
504
|
+
i0.ɵɵelementStart(0, "span", 105);
|
|
505
|
+
i0.ɵɵelement(1, "i", 106);
|
|
504
506
|
i0.ɵɵtext(2);
|
|
505
507
|
i0.ɵɵelementEnd();
|
|
506
508
|
} if (rf & 2) {
|
|
@@ -510,21 +512,21 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditiona
|
|
|
510
512
|
} }
|
|
511
513
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
512
514
|
const _r16 = i0.ɵɵgetCurrentView();
|
|
513
|
-
i0.ɵɵelementStart(0, "div",
|
|
515
|
+
i0.ɵɵelementStart(0, "div", 96)(1, "div", 97)(2, "input", 23);
|
|
514
516
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template_input_ngModelChange_2_listener($event) { const entity_r17 = i0.ɵɵrestoreView(_r16).$implicit; i0.ɵɵtwoWayBindingSet(entity_r17.Enabled, $event) || (entity_r17.Enabled = $event); return i0.ɵɵresetView($event); });
|
|
515
517
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template_input_change_2_listener() { const entity_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnFTSEntityToggled(entity_r17)); });
|
|
516
518
|
i0.ɵɵelementEnd()();
|
|
517
|
-
i0.ɵɵelementStart(3, "div",
|
|
519
|
+
i0.ɵɵelementStart(3, "div", 98)(4, "span", 99);
|
|
518
520
|
i0.ɵɵtext(5);
|
|
519
521
|
i0.ɵɵelementEnd();
|
|
520
|
-
i0.ɵɵelementStart(6, "div",
|
|
521
|
-
i0.ɵɵrepeaterCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_For_8_Template, 2, 1, "span",
|
|
522
|
+
i0.ɵɵelementStart(6, "div", 100);
|
|
523
|
+
i0.ɵɵrepeaterCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_For_8_Template, 2, 1, "span", 101, i0.ɵɵrepeaterTrackByIdentity);
|
|
522
524
|
i0.ɵɵelementEnd()();
|
|
523
|
-
i0.ɵɵelementStart(9, "div",
|
|
524
|
-
i0.ɵɵelement(11, "i",
|
|
525
|
+
i0.ɵɵelementStart(9, "div", 102)(10, "span", 103);
|
|
526
|
+
i0.ɵɵelement(11, "i", 104);
|
|
525
527
|
i0.ɵɵtext(12);
|
|
526
528
|
i0.ɵɵelementEnd();
|
|
527
|
-
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Conditional_13_Template, 3, 1, "span",
|
|
529
|
+
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Conditional_13_Template, 3, 1, "span", 105);
|
|
528
530
|
i0.ɵɵelementEnd()();
|
|
529
531
|
} if (rf & 2) {
|
|
530
532
|
const entity_r17 = ctx.$implicit;
|
|
@@ -542,14 +544,14 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditiona
|
|
|
542
544
|
} }
|
|
543
545
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
544
546
|
const _r15 = i0.ɵɵgetCurrentView();
|
|
545
|
-
i0.ɵɵelementStart(0, "div",
|
|
547
|
+
i0.ɵɵelementStart(0, "div", 90)(1, "div", 91)(2, "span", 92);
|
|
546
548
|
i0.ɵɵtext(3);
|
|
547
549
|
i0.ɵɵelementEnd();
|
|
548
|
-
i0.ɵɵelementStart(4, "input",
|
|
550
|
+
i0.ɵɵelementStart(4, "input", 93);
|
|
549
551
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FTSFilterText, $event) || (ctx_r1.FTSFilterText = $event); return i0.ɵɵresetView($event); });
|
|
550
552
|
i0.ɵɵelementEnd()()();
|
|
551
|
-
i0.ɵɵelementStart(5, "div",
|
|
552
|
-
i0.ɵɵrepeaterCreate(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template, 14, 6, "div",
|
|
553
|
+
i0.ɵɵelementStart(5, "div", 94);
|
|
554
|
+
i0.ɵɵrepeaterCreate(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template, 14, 6, "div", 95, _forTrack1);
|
|
553
555
|
i0.ɵɵelementEnd();
|
|
554
556
|
} if (rf & 2) {
|
|
555
557
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -561,8 +563,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditiona
|
|
|
561
563
|
i0.ɵɵrepeater(ctx_r1.FilteredFTSEntities);
|
|
562
564
|
} }
|
|
563
565
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
564
|
-
i0.ɵɵelementStart(0, "div",
|
|
565
|
-
i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_1_Template, 1, 0, "mj-loading",
|
|
566
|
+
i0.ɵɵelementStart(0, "div", 15);
|
|
567
|
+
i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_1_Template, 1, 0, "mj-loading", 85)(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_2_Template, 6, 0, "div", 86)(3, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_Template, 8, 3);
|
|
566
568
|
i0.ɵɵelementEnd();
|
|
567
569
|
} if (rf & 2) {
|
|
568
570
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -570,7 +572,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Template(r
|
|
|
570
572
|
i0.ɵɵconditional(ctx_r1.IsLoadingFTSEntities ? 1 : ctx_r1.FTSEntities.length === 0 ? 2 : 3);
|
|
571
573
|
} }
|
|
572
574
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_For_17_Template(rf, ctx) { if (rf & 1) {
|
|
573
|
-
i0.ɵɵelementStart(0, "span",
|
|
575
|
+
i0.ɵɵelementStart(0, "span", 60);
|
|
574
576
|
i0.ɵɵtext(1);
|
|
575
577
|
i0.ɵɵelementEnd();
|
|
576
578
|
} if (rf & 2) {
|
|
@@ -579,26 +581,26 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditiona
|
|
|
579
581
|
i0.ɵɵtextInterpolate(model_r19.Name);
|
|
580
582
|
} }
|
|
581
583
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
582
|
-
i0.ɵɵelementStart(0, "div",
|
|
584
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "div", 24)(2, "div", 25)(3, "span", 21);
|
|
583
585
|
i0.ɵɵtext(4, "Active Model");
|
|
584
586
|
i0.ɵɵelementEnd();
|
|
585
|
-
i0.ɵɵelementStart(5, "span",
|
|
587
|
+
i0.ɵɵelementStart(5, "span", 22);
|
|
586
588
|
i0.ɵɵtext(6, "Currently selected embedding model");
|
|
587
589
|
i0.ɵɵelementEnd()();
|
|
588
|
-
i0.ɵɵelementStart(7, "span",
|
|
590
|
+
i0.ɵɵelementStart(7, "span", 107);
|
|
589
591
|
i0.ɵɵtext(8);
|
|
590
592
|
i0.ɵɵelementEnd()();
|
|
591
|
-
i0.ɵɵelementStart(9, "div",
|
|
593
|
+
i0.ɵɵelementStart(9, "div", 24)(10, "div", 25)(11, "span", 21);
|
|
592
594
|
i0.ɵɵtext(12, "Available Models");
|
|
593
595
|
i0.ɵɵelementEnd();
|
|
594
|
-
i0.ɵɵelementStart(13, "span",
|
|
596
|
+
i0.ɵɵelementStart(13, "span", 22);
|
|
595
597
|
i0.ɵɵtext(14);
|
|
596
598
|
i0.ɵɵelementEnd()();
|
|
597
|
-
i0.ɵɵelementStart(15, "div",
|
|
598
|
-
i0.ɵɵrepeaterCreate(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_For_17_Template, 2, 1, "span",
|
|
599
|
+
i0.ɵɵelementStart(15, "div", 59);
|
|
600
|
+
i0.ɵɵrepeaterCreate(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_For_17_Template, 2, 1, "span", 60, _forTrack0);
|
|
599
601
|
i0.ɵɵelementEnd()()();
|
|
600
|
-
i0.ɵɵelementStart(18, "p",
|
|
601
|
-
i0.ɵɵelement(19, "i",
|
|
602
|
+
i0.ɵɵelementStart(18, "p", 108);
|
|
603
|
+
i0.ɵɵelement(19, "i", 109);
|
|
602
604
|
i0.ɵɵtext(20, " Manage embedding models in the AI Dashboard > Models tab. ");
|
|
603
605
|
i0.ɵɵelementEnd();
|
|
604
606
|
} if (rf & 2) {
|
|
@@ -611,18 +613,18 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditiona
|
|
|
611
613
|
i0.ɵɵrepeater(ctx_r1.EmbeddingModels);
|
|
612
614
|
} }
|
|
613
615
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
614
|
-
i0.ɵɵelementStart(0, "div",
|
|
615
|
-
i0.ɵɵelement(1, "i",
|
|
616
|
-
i0.ɵɵelementStart(2, "h3",
|
|
616
|
+
i0.ɵɵelementStart(0, "div", 86);
|
|
617
|
+
i0.ɵɵelement(1, "i", 110);
|
|
618
|
+
i0.ɵɵelementStart(2, "h3", 88);
|
|
617
619
|
i0.ɵɵtext(3, "No Embedding Models Found");
|
|
618
620
|
i0.ɵɵelementEnd();
|
|
619
|
-
i0.ɵɵelementStart(4, "p",
|
|
621
|
+
i0.ɵɵelementStart(4, "p", 89);
|
|
620
622
|
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. ");
|
|
621
623
|
i0.ɵɵelementEnd()();
|
|
622
624
|
} }
|
|
623
625
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
624
|
-
i0.ɵɵelementStart(0, "div",
|
|
625
|
-
i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_Template, 21, 2)(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_2_Template, 6, 0, "div",
|
|
626
|
+
i0.ɵɵelementStart(0, "div", 15);
|
|
627
|
+
i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_Template, 21, 2)(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_2_Template, 6, 0, "div", 86);
|
|
626
628
|
i0.ɵɵelementEnd();
|
|
627
629
|
} if (rf & 2) {
|
|
628
630
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -631,43 +633,43 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Template(r
|
|
|
631
633
|
} }
|
|
632
634
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
633
635
|
const _r20 = i0.ɵɵgetCurrentView();
|
|
634
|
-
i0.ɵɵelementStart(0, "div",
|
|
636
|
+
i0.ɵɵelementStart(0, "div", 15)(1, "div", 18)(2, "div", 24)(3, "div", 25)(4, "span", 21);
|
|
635
637
|
i0.ɵɵtext(5, "Duplicate Absolute Match");
|
|
636
638
|
i0.ɵɵelementEnd();
|
|
637
|
-
i0.ɵɵelementStart(6, "span",
|
|
639
|
+
i0.ɵɵelementStart(6, "span", 22);
|
|
638
640
|
i0.ɵɵtext(7);
|
|
639
641
|
i0.ɵɵelementEnd()();
|
|
640
|
-
i0.ɵɵelementStart(8, "input",
|
|
642
|
+
i0.ɵɵelementStart(8, "input", 111);
|
|
641
643
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.DuplicateAbsolute, $event) || (ctx_r1.ThresholdSettings.DuplicateAbsolute = $event); return i0.ɵɵresetView($event); });
|
|
642
644
|
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_8_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
643
645
|
i0.ɵɵelementEnd()();
|
|
644
|
-
i0.ɵɵelementStart(9, "div",
|
|
646
|
+
i0.ɵɵelementStart(9, "div", 24)(10, "div", 25)(11, "span", 21);
|
|
645
647
|
i0.ɵɵtext(12, "Duplicate Potential Match");
|
|
646
648
|
i0.ɵɵelementEnd();
|
|
647
|
-
i0.ɵɵelementStart(13, "span",
|
|
649
|
+
i0.ɵɵelementStart(13, "span", 22);
|
|
648
650
|
i0.ɵɵtext(14);
|
|
649
651
|
i0.ɵɵelementEnd()();
|
|
650
|
-
i0.ɵɵelementStart(15, "input",
|
|
652
|
+
i0.ɵɵelementStart(15, "input", 112);
|
|
651
653
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.DuplicatePotential, $event) || (ctx_r1.ThresholdSettings.DuplicatePotential = $event); return i0.ɵɵresetView($event); });
|
|
652
654
|
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_15_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
653
655
|
i0.ɵɵelementEnd()();
|
|
654
|
-
i0.ɵɵelementStart(16, "div",
|
|
656
|
+
i0.ɵɵelementStart(16, "div", 24)(17, "div", 25)(18, "span", 21);
|
|
655
657
|
i0.ɵɵtext(19, "Search Relevance");
|
|
656
658
|
i0.ɵɵelementEnd();
|
|
657
|
-
i0.ɵɵelementStart(20, "span",
|
|
659
|
+
i0.ɵɵelementStart(20, "span", 22);
|
|
658
660
|
i0.ɵɵtext(21);
|
|
659
661
|
i0.ɵɵelementEnd()();
|
|
660
|
-
i0.ɵɵelementStart(22, "input",
|
|
662
|
+
i0.ɵɵelementStart(22, "input", 113);
|
|
661
663
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.SearchRelevance, $event) || (ctx_r1.ThresholdSettings.SearchRelevance = $event); return i0.ɵɵresetView($event); });
|
|
662
664
|
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_22_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
663
665
|
i0.ɵɵelementEnd()();
|
|
664
|
-
i0.ɵɵelementStart(23, "div",
|
|
666
|
+
i0.ɵɵelementStart(23, "div", 24)(24, "div", 25)(25, "span", 21);
|
|
665
667
|
i0.ɵɵtext(26, "Autotag Confidence");
|
|
666
668
|
i0.ɵɵelementEnd();
|
|
667
|
-
i0.ɵɵelementStart(27, "span",
|
|
669
|
+
i0.ɵɵelementStart(27, "span", 22);
|
|
668
670
|
i0.ɵɵtext(28);
|
|
669
671
|
i0.ɵɵelementEnd()();
|
|
670
|
-
i0.ɵɵelementStart(29, "input",
|
|
672
|
+
i0.ɵɵelementStart(29, "input", 112);
|
|
671
673
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_29_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.AutotagConfidence, $event) || (ctx_r1.ThresholdSettings.AutotagConfidence = $event); return i0.ɵɵresetView($event); });
|
|
672
674
|
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_29_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
673
675
|
i0.ɵɵelementEnd()()()();
|
|
@@ -691,12 +693,12 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template(r
|
|
|
691
693
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ThresholdSettings.AutotagConfidence);
|
|
692
694
|
} }
|
|
693
695
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
694
|
-
i0.ɵɵelementStart(0, "div",
|
|
696
|
+
i0.ɵɵelementStart(0, "div", 118);
|
|
695
697
|
i0.ɵɵtext(1, "Loading\u2026");
|
|
696
698
|
i0.ɵɵelementEnd();
|
|
697
699
|
} }
|
|
698
700
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
699
|
-
i0.ɵɵelementStart(0, "div",
|
|
701
|
+
i0.ɵɵelementStart(0, "div", 119);
|
|
700
702
|
i0.ɵɵtext(1, " No scopes defined yet. Click ");
|
|
701
703
|
i0.ɵɵelementStart(2, "strong");
|
|
702
704
|
i0.ɵɵtext(3, "New");
|
|
@@ -705,24 +707,24 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
|
|
|
705
707
|
i0.ɵɵelementEnd();
|
|
706
708
|
} }
|
|
707
709
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
708
|
-
i0.ɵɵelementStart(0, "span",
|
|
710
|
+
i0.ɵɵelementStart(0, "span", 126);
|
|
709
711
|
i0.ɵɵtext(1, "Global");
|
|
710
712
|
i0.ɵɵelementEnd();
|
|
711
713
|
} }
|
|
712
714
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
713
|
-
i0.ɵɵelementStart(0, "span",
|
|
715
|
+
i0.ɵɵelementStart(0, "span", 126);
|
|
714
716
|
i0.ɵɵtext(1, "Default");
|
|
715
717
|
i0.ɵɵelementEnd();
|
|
716
718
|
} }
|
|
717
719
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
718
720
|
const _r22 = i0.ɵɵgetCurrentView();
|
|
719
|
-
i0.ɵɵelementStart(0, "button",
|
|
721
|
+
i0.ɵɵelementStart(0, "button", 123);
|
|
720
722
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Template_button_click_0_listener() { const s_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectScope(s_r23.ID)); });
|
|
721
|
-
i0.ɵɵelement(1, "i",
|
|
722
|
-
i0.ɵɵelementStart(2, "span",
|
|
723
|
+
i0.ɵɵelement(1, "i", 124);
|
|
724
|
+
i0.ɵɵelementStart(2, "span", 125);
|
|
723
725
|
i0.ɵɵtext(3);
|
|
724
726
|
i0.ɵɵelementEnd();
|
|
725
|
-
i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_4_Template, 2, 0, "span",
|
|
727
|
+
i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_4_Template, 2, 0, "span", 126)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_5_Template, 2, 0, "span", 126);
|
|
726
728
|
i0.ɵɵelementEnd();
|
|
727
729
|
} if (rf & 2) {
|
|
728
730
|
const s_r23 = ctx.$implicit;
|
|
@@ -736,90 +738,90 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
|
|
|
736
738
|
i0.ɵɵconditional(s_r23.IsGlobal ? 4 : s_r23.IsDefault ? 5 : -1);
|
|
737
739
|
} }
|
|
738
740
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
739
|
-
i0.ɵɵrepeaterCreate(0, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Template, 6, 6, "button",
|
|
741
|
+
i0.ɵɵrepeaterCreate(0, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Template, 6, 6, "button", 122, _forTrack0);
|
|
740
742
|
} if (rf & 2) {
|
|
741
743
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
742
744
|
i0.ɵɵrepeater(ctx_r1.SearchScopes);
|
|
743
745
|
} }
|
|
744
746
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
745
747
|
const _r25 = i0.ɵɵgetCurrentView();
|
|
746
|
-
i0.ɵɵelementStart(0, "button",
|
|
748
|
+
i0.ɵɵelementStart(0, "button", 139);
|
|
747
749
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OpenActiveScopeFullForm()); });
|
|
748
|
-
i0.ɵɵelement(1, "i",
|
|
750
|
+
i0.ɵɵelement(1, "i", 140);
|
|
749
751
|
i0.ɵɵtext(2, " Open Full Form ");
|
|
750
752
|
i0.ɵɵelementEnd();
|
|
751
753
|
} }
|
|
752
754
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
753
755
|
const _r26 = i0.ɵɵgetCurrentView();
|
|
754
|
-
i0.ɵɵelementStart(0, "button",
|
|
756
|
+
i0.ɵɵelementStart(0, "button", 141);
|
|
755
757
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DeleteActiveScope()); });
|
|
756
|
-
i0.ɵɵelement(1, "i",
|
|
758
|
+
i0.ɵɵelement(1, "i", 142);
|
|
757
759
|
i0.ɵɵelementEnd();
|
|
758
760
|
} }
|
|
759
761
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
760
762
|
const _r27 = i0.ɵɵgetCurrentView();
|
|
761
|
-
i0.ɵɵelementStart(0, "div",
|
|
763
|
+
i0.ɵɵelementStart(0, "div", 134)(1, "label")(2, "span");
|
|
762
764
|
i0.ɵɵtext(3, "Name");
|
|
763
765
|
i0.ɵɵelementEnd();
|
|
764
|
-
i0.ɵɵelementStart(4, "input",
|
|
766
|
+
i0.ɵɵelementStart(4, "input", 143);
|
|
765
767
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_4_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Name = $event.target.value); });
|
|
766
768
|
i0.ɵɵelementEnd()();
|
|
767
769
|
i0.ɵɵelementStart(5, "label")(6, "span");
|
|
768
770
|
i0.ɵɵtext(7, "Icon (Font Awesome class)");
|
|
769
771
|
i0.ɵɵelementEnd();
|
|
770
|
-
i0.ɵɵelementStart(8, "input",
|
|
772
|
+
i0.ɵɵelementStart(8, "input", 143);
|
|
771
773
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_8_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Icon = $event.target.value); });
|
|
772
774
|
i0.ɵɵelementEnd()();
|
|
773
|
-
i0.ɵɵelementStart(9, "label",
|
|
775
|
+
i0.ɵɵelementStart(9, "label", 144)(10, "span");
|
|
774
776
|
i0.ɵɵtext(11, "Description");
|
|
775
777
|
i0.ɵɵelementEnd();
|
|
776
|
-
i0.ɵɵelementStart(12, "textarea",
|
|
778
|
+
i0.ɵɵelementStart(12, "textarea", 145);
|
|
777
779
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_textarea_change_12_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Description = $event.target.value); });
|
|
778
780
|
i0.ɵɵelementEnd()();
|
|
779
781
|
i0.ɵɵelementStart(13, "label")(14, "span");
|
|
780
782
|
i0.ɵɵtext(15, "Status");
|
|
781
783
|
i0.ɵɵelementEnd();
|
|
782
|
-
i0.ɵɵelementStart(16, "select",
|
|
784
|
+
i0.ɵɵelementStart(16, "select", 146);
|
|
783
785
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_select_change_16_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Status = $event.target.value); });
|
|
784
|
-
i0.ɵɵelementStart(17, "option",
|
|
786
|
+
i0.ɵɵelementStart(17, "option", 147);
|
|
785
787
|
i0.ɵɵtext(18, "Active");
|
|
786
788
|
i0.ɵɵelementEnd();
|
|
787
|
-
i0.ɵɵelementStart(19, "option",
|
|
789
|
+
i0.ɵɵelementStart(19, "option", 148);
|
|
788
790
|
i0.ɵɵtext(20, "Inactive");
|
|
789
791
|
i0.ɵɵelementEnd()()();
|
|
790
792
|
i0.ɵɵelementStart(21, "label")(22, "span");
|
|
791
793
|
i0.ɵɵtext(23, "Start at");
|
|
792
794
|
i0.ɵɵelementEnd();
|
|
793
|
-
i0.ɵɵelementStart(24, "input",
|
|
795
|
+
i0.ɵɵelementStart(24, "input", 149);
|
|
794
796
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_24_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SetScopeDate(ctx_r1.ActiveScope, "StartAt", $event.target.value)); });
|
|
795
797
|
i0.ɵɵelementEnd()();
|
|
796
798
|
i0.ɵɵelementStart(25, "label")(26, "span");
|
|
797
799
|
i0.ɵɵtext(27, "End at");
|
|
798
800
|
i0.ɵɵelementEnd();
|
|
799
|
-
i0.ɵɵelementStart(28, "input",
|
|
801
|
+
i0.ɵɵelementStart(28, "input", 149);
|
|
800
802
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_28_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SetScopeDate(ctx_r1.ActiveScope, "EndAt", $event.target.value)); });
|
|
801
803
|
i0.ɵɵelementEnd()();
|
|
802
|
-
i0.ɵɵelementStart(29, "label",
|
|
804
|
+
i0.ɵɵelementStart(29, "label", 150)(30, "input", 151);
|
|
803
805
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_30_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.IsDefault = $event.target.checked); });
|
|
804
806
|
i0.ɵɵelementEnd();
|
|
805
807
|
i0.ɵɵelementStart(31, "span");
|
|
806
808
|
i0.ɵɵtext(32, "Default scope \u2014 picked when users/agents don't specify one");
|
|
807
809
|
i0.ɵɵelementEnd()();
|
|
808
|
-
i0.ɵɵelementStart(33, "label",
|
|
809
|
-
i0.ɵɵelement(34, "input",
|
|
810
|
+
i0.ɵɵelementStart(33, "label", 150);
|
|
811
|
+
i0.ɵɵelement(34, "input", 152);
|
|
810
812
|
i0.ɵɵelementStart(35, "span");
|
|
811
813
|
i0.ɵɵtext(36, "Global \u2014 reserved for the built-in Global scope (read-only)");
|
|
812
814
|
i0.ɵɵelementEnd()();
|
|
813
|
-
i0.ɵɵelementStart(37, "label",
|
|
815
|
+
i0.ɵɵelementStart(37, "label", 144)(38, "span");
|
|
814
816
|
i0.ɵɵtext(39, "Scope Config (JSON)");
|
|
815
817
|
i0.ɵɵelementEnd();
|
|
816
|
-
i0.ɵɵelementStart(40, "textarea",
|
|
818
|
+
i0.ɵɵelementStart(40, "textarea", 153);
|
|
817
819
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_textarea_change_40_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.ScopeConfig = $event.target.value); });
|
|
818
820
|
i0.ɵɵelementEnd()();
|
|
819
|
-
i0.ɵɵelementStart(41, "label",
|
|
821
|
+
i0.ɵɵelementStart(41, "label", 144)(42, "span");
|
|
820
822
|
i0.ɵɵtext(43, "Search Context Config (JSON)");
|
|
821
823
|
i0.ɵɵelementEnd();
|
|
822
|
-
i0.ɵɵelementStart(44, "textarea",
|
|
824
|
+
i0.ɵɵelementStart(44, "textarea", 153);
|
|
823
825
|
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_textarea_change_44_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.SearchContextConfig = $event.target.value); });
|
|
824
826
|
i0.ɵɵelementEnd()()();
|
|
825
827
|
} if (rf & 2) {
|
|
@@ -846,32 +848,32 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
|
|
|
846
848
|
i0.ɵɵproperty("value", ctx_r1.ActiveScope.SearchContextConfig || "");
|
|
847
849
|
} }
|
|
848
850
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
849
|
-
i0.ɵɵelement(0, "mj-search-scope-child-grid",
|
|
851
|
+
i0.ɵɵelement(0, "mj-search-scope-child-grid", 135);
|
|
850
852
|
} if (rf & 2) {
|
|
851
853
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
852
854
|
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeProviderColumns);
|
|
853
855
|
} }
|
|
854
856
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
855
|
-
i0.ɵɵelement(0, "mj-search-scope-child-grid",
|
|
857
|
+
i0.ɵɵelement(0, "mj-search-scope-child-grid", 136);
|
|
856
858
|
} if (rf & 2) {
|
|
857
859
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
858
860
|
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeExternalIndexColumns);
|
|
859
861
|
} }
|
|
860
862
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
861
|
-
i0.ɵɵelement(0, "mj-search-scope-child-grid",
|
|
863
|
+
i0.ɵɵelement(0, "mj-search-scope-child-grid", 137);
|
|
862
864
|
} if (rf & 2) {
|
|
863
865
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
864
866
|
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeEntityColumns);
|
|
865
867
|
} }
|
|
866
868
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
867
|
-
i0.ɵɵelement(0, "mj-search-scope-child-grid",
|
|
869
|
+
i0.ɵɵelement(0, "mj-search-scope-child-grid", 138);
|
|
868
870
|
} if (rf & 2) {
|
|
869
871
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
870
872
|
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeStorageColumns);
|
|
871
873
|
} }
|
|
872
874
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
873
|
-
i0.ɵɵelementStart(0, "div",
|
|
874
|
-
i0.ɵɵelement(2, "i",
|
|
875
|
+
i0.ɵɵelementStart(0, "div", 154)(1, "p", 155);
|
|
876
|
+
i0.ɵɵelement(2, "i", 156);
|
|
875
877
|
i0.ɵɵelementStart(3, "strong");
|
|
876
878
|
i0.ɵɵtext(4, "Per-user / per-role grants on this scope.");
|
|
877
879
|
i0.ɵɵelementEnd();
|
|
@@ -905,7 +907,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
|
|
|
905
907
|
i0.ɵɵelementEnd();
|
|
906
908
|
i0.ɵɵtext(26, " via the resolver \u2014 see the spec for the full resolution order. ");
|
|
907
909
|
i0.ɵɵelementEnd()();
|
|
908
|
-
i0.ɵɵelement(27, "mj-search-scope-child-grid",
|
|
910
|
+
i0.ɵɵelement(27, "mj-search-scope-child-grid", 157);
|
|
909
911
|
} if (rf & 2) {
|
|
910
912
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
911
913
|
i0.ɵɵadvance(27);
|
|
@@ -913,44 +915,44 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
|
|
|
913
915
|
} }
|
|
914
916
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
915
917
|
const _r24 = i0.ɵɵgetCurrentView();
|
|
916
|
-
i0.ɵɵelementStart(0, "div",
|
|
918
|
+
i0.ɵɵelementStart(0, "div", 127)(1, "button", 128);
|
|
917
919
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("definition")); });
|
|
918
920
|
i0.ɵɵtext(2, "Definition");
|
|
919
921
|
i0.ɵɵelementEnd();
|
|
920
|
-
i0.ɵɵelementStart(3, "button",
|
|
922
|
+
i0.ɵɵelementStart(3, "button", 128);
|
|
921
923
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("providers")); });
|
|
922
924
|
i0.ɵɵtext(4, "Providers");
|
|
923
925
|
i0.ɵɵelementEnd();
|
|
924
|
-
i0.ɵɵelementStart(5, "button",
|
|
926
|
+
i0.ɵɵelementStart(5, "button", 128);
|
|
925
927
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("indexes")); });
|
|
926
928
|
i0.ɵɵtext(6, "External Indexes");
|
|
927
929
|
i0.ɵɵelementEnd();
|
|
928
|
-
i0.ɵɵelementStart(7, "button",
|
|
930
|
+
i0.ɵɵelementStart(7, "button", 128);
|
|
929
931
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("entities")); });
|
|
930
932
|
i0.ɵɵtext(8, "Entities");
|
|
931
933
|
i0.ɵɵelementEnd();
|
|
932
|
-
i0.ɵɵelementStart(9, "button",
|
|
934
|
+
i0.ɵɵelementStart(9, "button", 128);
|
|
933
935
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("storage")); });
|
|
934
936
|
i0.ɵɵtext(10, "Storage");
|
|
935
937
|
i0.ɵɵelementEnd();
|
|
936
|
-
i0.ɵɵelementStart(11, "button",
|
|
938
|
+
i0.ɵɵelementStart(11, "button", 128);
|
|
937
939
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("permissions")); });
|
|
938
940
|
i0.ɵɵtext(12, "Permissions");
|
|
939
941
|
i0.ɵɵelementEnd();
|
|
940
|
-
i0.ɵɵelement(13, "div",
|
|
941
|
-
i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_14_Template, 3, 0, "button",
|
|
942
|
-
i0.ɵɵelementStart(15, "button",
|
|
942
|
+
i0.ɵɵelement(13, "div", 129);
|
|
943
|
+
i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_14_Template, 3, 0, "button", 130);
|
|
944
|
+
i0.ɵɵelementStart(15, "button", 131);
|
|
943
945
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SaveActiveScope()); });
|
|
944
|
-
i0.ɵɵelement(16, "i",
|
|
946
|
+
i0.ɵɵelement(16, "i", 132);
|
|
945
947
|
i0.ɵɵtext(17, " Save ");
|
|
946
948
|
i0.ɵɵelementEnd();
|
|
947
|
-
i0.ɵɵconditionalCreate(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template, 2, 0, "button",
|
|
949
|
+
i0.ɵɵconditionalCreate(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template, 2, 0, "button", 133);
|
|
948
950
|
i0.ɵɵelementEnd();
|
|
949
|
-
i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template, 45, 11, "div",
|
|
950
|
-
i0.ɵɵconditionalCreate(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_20_Template, 1, 2, "mj-search-scope-child-grid",
|
|
951
|
-
i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_21_Template, 1, 2, "mj-search-scope-child-grid",
|
|
952
|
-
i0.ɵɵconditionalCreate(22, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_22_Template, 1, 2, "mj-search-scope-child-grid",
|
|
953
|
-
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_23_Template, 1, 2, "mj-search-scope-child-grid",
|
|
951
|
+
i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template, 45, 11, "div", 134);
|
|
952
|
+
i0.ɵɵconditionalCreate(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_20_Template, 1, 2, "mj-search-scope-child-grid", 135);
|
|
953
|
+
i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_21_Template, 1, 2, "mj-search-scope-child-grid", 136);
|
|
954
|
+
i0.ɵɵconditionalCreate(22, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_22_Template, 1, 2, "mj-search-scope-child-grid", 137);
|
|
955
|
+
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_23_Template, 1, 2, "mj-search-scope-child-grid", 138);
|
|
954
956
|
i0.ɵɵconditionalCreate(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_24_Template, 28, 2);
|
|
955
957
|
} if (rf & 2) {
|
|
956
958
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -984,7 +986,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
|
|
|
984
986
|
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "permissions" ? 24 : -1);
|
|
985
987
|
} }
|
|
986
988
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
987
|
-
i0.ɵɵelementStart(0, "div",
|
|
989
|
+
i0.ɵɵelementStart(0, "div", 121);
|
|
988
990
|
i0.ɵɵtext(1, " Select a scope on the left, or click ");
|
|
989
991
|
i0.ɵɵelementStart(2, "strong");
|
|
990
992
|
i0.ɵɵtext(3, "New");
|
|
@@ -994,18 +996,18 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
|
|
|
994
996
|
} }
|
|
995
997
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
996
998
|
const _r21 = i0.ɵɵgetCurrentView();
|
|
997
|
-
i0.ɵɵelementStart(0, "div",
|
|
999
|
+
i0.ɵɵelementStart(0, "div", 15)(1, "div", 114)(2, "aside", 115)(3, "div", 116)(4, "span");
|
|
998
1000
|
i0.ɵɵtext(5);
|
|
999
1001
|
i0.ɵɵelementEnd();
|
|
1000
|
-
i0.ɵɵelementStart(6, "button",
|
|
1002
|
+
i0.ɵɵelementStart(6, "button", 117);
|
|
1001
1003
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CreateNewScope()); });
|
|
1002
|
-
i0.ɵɵelement(7, "i",
|
|
1004
|
+
i0.ɵɵelement(7, "i", 62);
|
|
1003
1005
|
i0.ɵɵtext(8, " New ");
|
|
1004
1006
|
i0.ɵɵelementEnd()();
|
|
1005
|
-
i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_9_Template, 2, 0, "div",
|
|
1007
|
+
i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_9_Template, 2, 0, "div", 118)(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_10_Template, 5, 0, "div", 119)(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_Template, 2, 0);
|
|
1006
1008
|
i0.ɵɵelementEnd();
|
|
1007
|
-
i0.ɵɵelementStart(12, "section",
|
|
1008
|
-
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template, 25, 20)(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_14_Template, 5, 0, "div",
|
|
1009
|
+
i0.ɵɵelementStart(12, "section", 120);
|
|
1010
|
+
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template, 25, 20)(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_14_Template, 5, 0, "div", 121);
|
|
1009
1011
|
i0.ɵɵelementEnd()()();
|
|
1010
1012
|
} if (rf & 2) {
|
|
1011
1013
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1017,18 +1019,18 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template(
|
|
|
1017
1019
|
i0.ɵɵconditional(ctx_r1.ActiveScope ? 13 : 14);
|
|
1018
1020
|
} }
|
|
1019
1021
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1020
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
1022
|
+
i0.ɵɵelement(0, "mj-loading", 158);
|
|
1021
1023
|
} }
|
|
1022
1024
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1023
1025
|
const _r28 = i0.ɵɵgetCurrentView();
|
|
1024
|
-
i0.ɵɵelementStart(0, "button",
|
|
1026
|
+
i0.ɵɵelementStart(0, "button", 160);
|
|
1025
1027
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.LoadSearchAnalytics()); });
|
|
1026
|
-
i0.ɵɵelement(1, "i",
|
|
1028
|
+
i0.ɵɵelement(1, "i", 161);
|
|
1027
1029
|
i0.ɵɵtext(2, " Load analytics ");
|
|
1028
1030
|
i0.ɵɵelementEnd();
|
|
1029
1031
|
} }
|
|
1030
1032
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_37_Template(rf, ctx) { if (rf & 1) {
|
|
1031
|
-
i0.ɵɵelementStart(0, "p",
|
|
1033
|
+
i0.ɵɵelementStart(0, "p", 168);
|
|
1032
1034
|
i0.ɵɵtext(1, "No runs in the window.");
|
|
1033
1035
|
i0.ɵɵelementEnd();
|
|
1034
1036
|
} }
|
|
@@ -1053,7 +1055,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
|
|
|
1053
1055
|
i0.ɵɵtextInterpolate1("", s_r30.AvgLatencyMs, "ms");
|
|
1054
1056
|
} }
|
|
1055
1057
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
1056
|
-
i0.ɵɵelementStart(0, "table",
|
|
1058
|
+
i0.ɵɵelementStart(0, "table", 169)(1, "thead")(2, "tr")(3, "th");
|
|
1057
1059
|
i0.ɵɵtext(4, "Scope");
|
|
1058
1060
|
i0.ɵɵelementEnd();
|
|
1059
1061
|
i0.ɵɵelementStart(5, "th");
|
|
@@ -1071,7 +1073,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
|
|
|
1071
1073
|
i0.ɵɵrepeater(ctx_r1.AnalyticsTopScopes);
|
|
1072
1074
|
} }
|
|
1073
1075
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_41_Template(rf, ctx) { if (rf & 1) {
|
|
1074
|
-
i0.ɵɵelementStart(0, "p",
|
|
1076
|
+
i0.ɵɵelementStart(0, "p", 168);
|
|
1075
1077
|
i0.ɵɵtext(1, "No rerank invocations in the window.");
|
|
1076
1078
|
i0.ɵɵelementEnd();
|
|
1077
1079
|
} }
|
|
@@ -1097,7 +1099,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
|
|
|
1097
1099
|
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(8, 5, r_r31.TotalCents, "1.0-2"), "\u00A2");
|
|
1098
1100
|
} }
|
|
1099
1101
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_42_Template(rf, ctx) { if (rf & 1) {
|
|
1100
|
-
i0.ɵɵelementStart(0, "table",
|
|
1102
|
+
i0.ɵɵelementStart(0, "table", 169)(1, "thead")(2, "tr")(3, "th");
|
|
1101
1103
|
i0.ɵɵtext(4, "Reranker");
|
|
1102
1104
|
i0.ɵɵelementEnd();
|
|
1103
1105
|
i0.ɵɵelementStart(5, "th");
|
|
@@ -1115,7 +1117,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
|
|
|
1115
1117
|
i0.ɵɵrepeater(ctx_r1.AnalyticsRerankerSpend);
|
|
1116
1118
|
} }
|
|
1117
1119
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
1118
|
-
i0.ɵɵelementStart(0, "p",
|
|
1120
|
+
i0.ɵɵelementStart(0, "p", 168);
|
|
1119
1121
|
i0.ɵɵtext(1, "No failures in the window.");
|
|
1120
1122
|
i0.ɵɵelementEnd();
|
|
1121
1123
|
} }
|
|
@@ -1135,7 +1137,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
|
|
|
1135
1137
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 2, f_r32.Count));
|
|
1136
1138
|
} }
|
|
1137
1139
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
1138
|
-
i0.ɵɵelementStart(0, "table",
|
|
1140
|
+
i0.ɵɵelementStart(0, "table", 169)(1, "thead")(2, "tr")(3, "th");
|
|
1139
1141
|
i0.ɵɵtext(4, "Reason");
|
|
1140
1142
|
i0.ɵɵelementEnd();
|
|
1141
1143
|
i0.ɵɵelementStart(5, "th");
|
|
@@ -1151,62 +1153,62 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
|
|
|
1151
1153
|
} }
|
|
1152
1154
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
1153
1155
|
const _r29 = i0.ɵɵgetCurrentView();
|
|
1154
|
-
i0.ɵɵelementStart(0, "div",
|
|
1156
|
+
i0.ɵɵelementStart(0, "div", 162)(1, "div", 163)(2, "span", 164);
|
|
1155
1157
|
i0.ɵɵtext(3, "Total runs");
|
|
1156
1158
|
i0.ɵɵelementEnd();
|
|
1157
|
-
i0.ɵɵelementStart(4, "span",
|
|
1159
|
+
i0.ɵɵelementStart(4, "span", 165);
|
|
1158
1160
|
i0.ɵɵtext(5);
|
|
1159
1161
|
i0.ɵɵpipe(6, "number");
|
|
1160
1162
|
i0.ɵɵelementEnd()();
|
|
1161
|
-
i0.ɵɵelementStart(7, "div",
|
|
1163
|
+
i0.ɵɵelementStart(7, "div", 163)(8, "span", 164);
|
|
1162
1164
|
i0.ɵɵtext(9, "Success rate");
|
|
1163
1165
|
i0.ɵɵelementEnd();
|
|
1164
|
-
i0.ɵɵelementStart(10, "span",
|
|
1166
|
+
i0.ɵɵelementStart(10, "span", 165);
|
|
1165
1167
|
i0.ɵɵtext(11);
|
|
1166
1168
|
i0.ɵɵelementEnd()();
|
|
1167
|
-
i0.ɵɵelementStart(12, "div",
|
|
1169
|
+
i0.ɵɵelementStart(12, "div", 163)(13, "span", 164);
|
|
1168
1170
|
i0.ɵɵtext(14, "Hit rate");
|
|
1169
1171
|
i0.ɵɵelementEnd();
|
|
1170
|
-
i0.ɵɵelementStart(15, "span",
|
|
1172
|
+
i0.ɵɵelementStart(15, "span", 165);
|
|
1171
1173
|
i0.ɵɵtext(16);
|
|
1172
1174
|
i0.ɵɵelementEnd();
|
|
1173
|
-
i0.ɵɵelementStart(17, "span",
|
|
1175
|
+
i0.ɵɵelementStart(17, "span", 166);
|
|
1174
1176
|
i0.ɵɵtext(18, "% of successful runs that returned \u22651 result");
|
|
1175
1177
|
i0.ɵɵelementEnd()();
|
|
1176
|
-
i0.ɵɵelementStart(19, "div",
|
|
1178
|
+
i0.ɵɵelementStart(19, "div", 163)(20, "span", 164);
|
|
1177
1179
|
i0.ɵɵtext(21, "Avg latency");
|
|
1178
1180
|
i0.ɵɵelementEnd();
|
|
1179
|
-
i0.ɵɵelementStart(22, "span",
|
|
1181
|
+
i0.ɵɵelementStart(22, "span", 165);
|
|
1180
1182
|
i0.ɵɵtext(23);
|
|
1181
1183
|
i0.ɵɵelementEnd()();
|
|
1182
|
-
i0.ɵɵelementStart(24, "div",
|
|
1184
|
+
i0.ɵɵelementStart(24, "div", 163)(25, "span", 164);
|
|
1183
1185
|
i0.ɵɵtext(26, "P95 latency");
|
|
1184
1186
|
i0.ɵɵelementEnd();
|
|
1185
|
-
i0.ɵɵelementStart(27, "span",
|
|
1187
|
+
i0.ɵɵelementStart(27, "span", 165);
|
|
1186
1188
|
i0.ɵɵtext(28);
|
|
1187
1189
|
i0.ɵɵelementEnd()();
|
|
1188
|
-
i0.ɵɵelementStart(29, "div",
|
|
1190
|
+
i0.ɵɵelementStart(29, "div", 163)(30, "span", 164);
|
|
1189
1191
|
i0.ɵɵtext(31, "Reranker spend");
|
|
1190
1192
|
i0.ɵɵelementEnd();
|
|
1191
|
-
i0.ɵɵelementStart(32, "span",
|
|
1193
|
+
i0.ɵɵelementStart(32, "span", 165);
|
|
1192
1194
|
i0.ɵɵtext(33);
|
|
1193
1195
|
i0.ɵɵpipe(34, "number");
|
|
1194
1196
|
i0.ɵɵelementEnd()()();
|
|
1195
|
-
i0.ɵɵelementStart(35, "h3",
|
|
1197
|
+
i0.ɵɵelementStart(35, "h3", 167);
|
|
1196
1198
|
i0.ɵɵtext(36, "Top scopes by volume");
|
|
1197
1199
|
i0.ɵɵelementEnd();
|
|
1198
|
-
i0.ɵɵconditionalCreate(37, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_37_Template, 2, 0, "p",
|
|
1199
|
-
i0.ɵɵelementStart(39, "h3",
|
|
1200
|
+
i0.ɵɵconditionalCreate(37, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_37_Template, 2, 0, "p", 168)(38, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_38_Template, 12, 0, "table", 169);
|
|
1201
|
+
i0.ɵɵelementStart(39, "h3", 167);
|
|
1200
1202
|
i0.ɵɵtext(40, "Reranker spend by driver");
|
|
1201
1203
|
i0.ɵɵelementEnd();
|
|
1202
|
-
i0.ɵɵconditionalCreate(41, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_41_Template, 2, 0, "p",
|
|
1203
|
-
i0.ɵɵelementStart(43, "h3",
|
|
1204
|
+
i0.ɵɵconditionalCreate(41, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_41_Template, 2, 0, "p", 168)(42, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_42_Template, 12, 0, "table", 169);
|
|
1205
|
+
i0.ɵɵelementStart(43, "h3", 167);
|
|
1204
1206
|
i0.ɵɵtext(44, "Top failure reasons");
|
|
1205
1207
|
i0.ɵɵelementEnd();
|
|
1206
|
-
i0.ɵɵconditionalCreate(45, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_45_Template, 2, 0, "p",
|
|
1207
|
-
i0.ɵɵelementStart(47, "button",
|
|
1208
|
+
i0.ɵɵconditionalCreate(45, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_45_Template, 2, 0, "p", 168)(46, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_46_Template, 10, 0, "table", 169);
|
|
1209
|
+
i0.ɵɵelementStart(47, "button", 170);
|
|
1208
1210
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Template_button_click_47_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.LoadSearchAnalytics()); });
|
|
1209
|
-
i0.ɵɵelement(48, "i",
|
|
1211
|
+
i0.ɵɵelement(48, "i", 161);
|
|
1210
1212
|
i0.ɵɵtext(49, " Refresh ");
|
|
1211
1213
|
i0.ɵɵelementEnd();
|
|
1212
1214
|
} if (rf & 2) {
|
|
@@ -1231,8 +1233,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
|
|
|
1231
1233
|
i0.ɵɵconditional(ctx_r1.AnalyticsTopFailures.length === 0 ? 45 : 46);
|
|
1232
1234
|
} }
|
|
1233
1235
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
1234
|
-
i0.ɵɵelementStart(0, "div",
|
|
1235
|
-
i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_1_Template, 1, 0, "mj-loading",
|
|
1236
|
+
i0.ɵɵelementStart(0, "div", 16);
|
|
1237
|
+
i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_1_Template, 1, 0, "mj-loading", 158)(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_2_Template, 3, 0, "button", 159)(3, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Template, 50, 14);
|
|
1236
1238
|
i0.ɵɵelementEnd();
|
|
1237
1239
|
} if (rf & 2) {
|
|
1238
1240
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1240,19 +1242,19 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template(
|
|
|
1240
1242
|
i0.ɵɵconditional(ctx_r1.AnalyticsLoading ? 1 : !ctx_r1.AnalyticsLoaded ? 2 : 3);
|
|
1241
1243
|
} }
|
|
1242
1244
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1243
|
-
i0.ɵɵelementStart(0, "div",
|
|
1244
|
-
i0.ɵɵelement(1, "i",
|
|
1245
|
+
i0.ɵɵelementStart(0, "div", 171);
|
|
1246
|
+
i0.ɵɵelement(1, "i", 84);
|
|
1245
1247
|
i0.ɵɵtext(2, " Loading permission rows... ");
|
|
1246
1248
|
i0.ɵɵelementEnd();
|
|
1247
1249
|
} }
|
|
1248
1250
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
1249
|
-
i0.ɵɵelementStart(0, "div",
|
|
1251
|
+
i0.ɵɵelementStart(0, "div", 182);
|
|
1250
1252
|
i0.ɵɵtext(1, " No permission rows match your filters. ");
|
|
1251
1253
|
i0.ɵɵelementEnd();
|
|
1252
1254
|
} }
|
|
1253
1255
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1254
1256
|
i0.ɵɵtext(0);
|
|
1255
|
-
i0.ɵɵelementStart(1, "span",
|
|
1257
|
+
i0.ɵɵelementStart(1, "span", 185);
|
|
1256
1258
|
i0.ɵɵtext(2);
|
|
1257
1259
|
i0.ɵɵelementEnd();
|
|
1258
1260
|
} if (rf & 2) {
|
|
@@ -1268,12 +1270,12 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Condition
|
|
|
1268
1270
|
i0.ɵɵtextInterpolate1(" ", row_r34.RoleName, " ");
|
|
1269
1271
|
} }
|
|
1270
1272
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
1271
|
-
i0.ɵɵelementStart(0, "span",
|
|
1273
|
+
i0.ɵɵelementStart(0, "span", 184);
|
|
1272
1274
|
i0.ɵɵtext(1, "User");
|
|
1273
1275
|
i0.ɵɵelementEnd();
|
|
1274
1276
|
} }
|
|
1275
1277
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
1276
|
-
i0.ɵɵelementStart(0, "span",
|
|
1278
|
+
i0.ɵɵelementStart(0, "span", 184);
|
|
1277
1279
|
i0.ɵɵtext(1, "Role");
|
|
1278
1280
|
i0.ɵɵelementEnd();
|
|
1279
1281
|
} }
|
|
@@ -1285,8 +1287,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Condition
|
|
|
1285
1287
|
i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_4_Template, 3, 2)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_5_Template, 1, 1);
|
|
1286
1288
|
i0.ɵɵelementEnd();
|
|
1287
1289
|
i0.ɵɵelementStart(6, "td");
|
|
1288
|
-
i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_7_Template, 2, 0, "span",
|
|
1289
|
-
i0.ɵɵconditionalCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_8_Template, 2, 0, "span",
|
|
1290
|
+
i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_7_Template, 2, 0, "span", 184);
|
|
1291
|
+
i0.ɵɵconditionalCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_8_Template, 2, 0, "span", 184);
|
|
1290
1292
|
i0.ɵɵelementEnd();
|
|
1291
1293
|
i0.ɵɵelementStart(9, "td")(10, "span");
|
|
1292
1294
|
i0.ɵɵpipe(11, "lowercase");
|
|
@@ -1308,7 +1310,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Condition
|
|
|
1308
1310
|
i0.ɵɵtextInterpolate(row_r34.PermissionLevel);
|
|
1309
1311
|
} }
|
|
1310
1312
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
1311
|
-
i0.ɵɵelementStart(0, "table",
|
|
1313
|
+
i0.ɵɵelementStart(0, "table", 183)(1, "thead")(2, "tr")(3, "th");
|
|
1312
1314
|
i0.ɵɵtext(4, "Scope");
|
|
1313
1315
|
i0.ɵɵelementEnd();
|
|
1314
1316
|
i0.ɵɵelementStart(5, "th");
|
|
@@ -1330,38 +1332,38 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Condition
|
|
|
1330
1332
|
} }
|
|
1331
1333
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1332
1334
|
const _r33 = i0.ɵɵgetCurrentView();
|
|
1333
|
-
i0.ɵɵelementStart(0, "div",
|
|
1335
|
+
i0.ɵɵelementStart(0, "div", 172)(1, "input", 173);
|
|
1334
1336
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterScope, $event) || (ctx_r1.PermissionsFilterScope = $event); return i0.ɵɵresetView($event); });
|
|
1335
1337
|
i0.ɵɵelementEnd();
|
|
1336
|
-
i0.ɵɵelementStart(2, "input",
|
|
1338
|
+
i0.ɵɵelementStart(2, "input", 174);
|
|
1337
1339
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterPrincipal, $event) || (ctx_r1.PermissionsFilterPrincipal = $event); return i0.ɵɵresetView($event); });
|
|
1338
1340
|
i0.ɵɵelementEnd();
|
|
1339
|
-
i0.ɵɵelementStart(3, "select",
|
|
1341
|
+
i0.ɵɵelementStart(3, "select", 175);
|
|
1340
1342
|
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template_select_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterLevel, $event) || (ctx_r1.PermissionsFilterLevel = $event); return i0.ɵɵresetView($event); });
|
|
1341
|
-
i0.ɵɵelementStart(4, "option",
|
|
1343
|
+
i0.ɵɵelementStart(4, "option", 176);
|
|
1342
1344
|
i0.ɵɵtext(5, "All levels");
|
|
1343
1345
|
i0.ɵɵelementEnd();
|
|
1344
|
-
i0.ɵɵelementStart(6, "option",
|
|
1346
|
+
i0.ɵɵelementStart(6, "option", 177);
|
|
1345
1347
|
i0.ɵɵtext(7, "None");
|
|
1346
1348
|
i0.ɵɵelementEnd();
|
|
1347
|
-
i0.ɵɵelementStart(8, "option",
|
|
1349
|
+
i0.ɵɵelementStart(8, "option", 178);
|
|
1348
1350
|
i0.ɵɵtext(9, "Read");
|
|
1349
1351
|
i0.ɵɵelementEnd();
|
|
1350
|
-
i0.ɵɵelementStart(10, "option",
|
|
1352
|
+
i0.ɵɵelementStart(10, "option", 179);
|
|
1351
1353
|
i0.ɵɵtext(11, "Search");
|
|
1352
1354
|
i0.ɵɵelementEnd();
|
|
1353
|
-
i0.ɵɵelementStart(12, "option",
|
|
1355
|
+
i0.ɵɵelementStart(12, "option", 180);
|
|
1354
1356
|
i0.ɵɵtext(13, "Manage");
|
|
1355
1357
|
i0.ɵɵelementEnd()();
|
|
1356
|
-
i0.ɵɵelementStart(14, "button",
|
|
1358
|
+
i0.ɵɵelementStart(14, "button", 160);
|
|
1357
1359
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.RefreshPermissionsAudit()); });
|
|
1358
|
-
i0.ɵɵelement(15, "i",
|
|
1360
|
+
i0.ɵɵelement(15, "i", 161);
|
|
1359
1361
|
i0.ɵɵtext(16, " Refresh ");
|
|
1360
1362
|
i0.ɵɵelementEnd()();
|
|
1361
|
-
i0.ɵɵelementStart(17, "div",
|
|
1363
|
+
i0.ɵɵelementStart(17, "div", 181);
|
|
1362
1364
|
i0.ɵɵtext(18);
|
|
1363
1365
|
i0.ɵɵelementEnd();
|
|
1364
|
-
i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_19_Template, 2, 0, "div",
|
|
1366
|
+
i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_19_Template, 2, 0, "div", 182)(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_Template, 14, 0, "table", 183);
|
|
1365
1367
|
} if (rf & 2) {
|
|
1366
1368
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1367
1369
|
i0.ɵɵadvance();
|
|
@@ -1376,8 +1378,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Condition
|
|
|
1376
1378
|
i0.ɵɵconditional(ctx_r1.FilteredPermissionsRows.length === 0 ? 19 : 20);
|
|
1377
1379
|
} }
|
|
1378
1380
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
1379
|
-
i0.ɵɵelementStart(0, "div",
|
|
1380
|
-
i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_1_Template, 3, 0, "div",
|
|
1381
|
+
i0.ɵɵelementStart(0, "div", 16);
|
|
1382
|
+
i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_1_Template, 3, 0, "div", 171);
|
|
1381
1383
|
i0.ɵɵconditionalCreate(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template, 21, 6);
|
|
1382
1384
|
i0.ɵɵelementEnd();
|
|
1383
1385
|
} if (rf & 2) {
|
|
@@ -1388,31 +1390,31 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template(
|
|
|
1388
1390
|
i0.ɵɵconditional(ctx_r1.PermissionsLoaded && !ctx_r1.PermissionsLoading ? 2 : -1);
|
|
1389
1391
|
} }
|
|
1390
1392
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
1391
|
-
i0.ɵɵelementStart(0, "div",
|
|
1392
|
-
i0.ɵɵelement(2, "app-scheduling-resource",
|
|
1393
|
+
i0.ɵɵelementStart(0, "div", 16)(1, "div", 186);
|
|
1394
|
+
i0.ɵɵelement(2, "app-scheduling-resource", 187);
|
|
1393
1395
|
i0.ɵɵelementEnd()();
|
|
1394
1396
|
} if (rf & 2) {
|
|
1395
1397
|
i0.ɵɵadvance(2);
|
|
1396
1398
|
i0.ɵɵproperty("HideToolbar", true);
|
|
1397
1399
|
} }
|
|
1398
1400
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1399
|
-
i0.ɵɵelement(0, "i",
|
|
1401
|
+
i0.ɵɵelement(0, "i", 84);
|
|
1400
1402
|
i0.ɵɵtext(1, " Saving... ");
|
|
1401
1403
|
} }
|
|
1402
1404
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
1403
|
-
i0.ɵɵelement(0, "i",
|
|
1405
|
+
i0.ɵɵelement(0, "i", 132);
|
|
1404
1406
|
i0.ɵɵtext(1, " Save Changes ");
|
|
1405
1407
|
} }
|
|
1406
1408
|
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
1407
1409
|
const _r35 = i0.ɵɵgetCurrentView();
|
|
1408
|
-
i0.ɵɵelementStart(0, "div",
|
|
1410
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "span", 188);
|
|
1409
1411
|
i0.ɵɵtext(2, "You have unsaved changes");
|
|
1410
1412
|
i0.ɵɵelementEnd();
|
|
1411
|
-
i0.ɵɵelementStart(3, "button",
|
|
1413
|
+
i0.ɵɵelementStart(3, "button", 189);
|
|
1412
1414
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveConfiguration()); });
|
|
1413
1415
|
i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_4_Template, 2, 0)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_5_Template, 2, 0);
|
|
1414
1416
|
i0.ɵɵelementEnd();
|
|
1415
|
-
i0.ɵɵelementStart(6, "button",
|
|
1417
|
+
i0.ɵɵelementStart(6, "button", 190);
|
|
1416
1418
|
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ResetConfiguration()); });
|
|
1417
1419
|
i0.ɵɵtext(7, " Reset ");
|
|
1418
1420
|
i0.ɵɵelementEnd()();
|
|
@@ -1427,22 +1429,22 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template(
|
|
|
1427
1429
|
} }
|
|
1428
1430
|
function KnowledgeConfigResourceComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
1429
1431
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
1430
|
-
i0.ɵɵelementStart(0, "div", 6)(1, "mj-left-nav",
|
|
1432
|
+
i0.ɵɵelementStart(0, "div", 6)(1, "mj-left-nav", 13);
|
|
1431
1433
|
i0.ɵɵlistener("ItemClicked", function KnowledgeConfigResourceComponent_Conditional_8_Template_mj_left_nav_ItemClicked_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNavItemClicked($event)); });
|
|
1432
1434
|
i0.ɵɵelementEnd();
|
|
1433
1435
|
i0.ɵɵelementStart(2, "mj-left-nav-content");
|
|
1434
|
-
i0.ɵɵelement(3, "mj-page-header-interior",
|
|
1436
|
+
i0.ɵɵelement(3, "mj-page-header-interior", 14);
|
|
1435
1437
|
i0.ɵɵelementStart(4, "mj-page-body-interior");
|
|
1436
|
-
i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template, 30, 4, "div",
|
|
1437
|
-
i0.ɵɵconditionalCreate(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Template, 45, 26, "div",
|
|
1438
|
-
i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Template, 4, 1, "div",
|
|
1439
|
-
i0.ɵɵconditionalCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Template, 3, 1, "div",
|
|
1440
|
-
i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template, 30, 8, "div",
|
|
1441
|
-
i0.ɵɵconditionalCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template, 15, 3, "div",
|
|
1442
|
-
i0.ɵɵconditionalCreate(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template, 4, 1, "div",
|
|
1443
|
-
i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template, 3, 2, "div",
|
|
1444
|
-
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template, 3, 1, "div",
|
|
1445
|
-
i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template, 8, 3, "div",
|
|
1438
|
+
i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template, 30, 4, "div", 15);
|
|
1439
|
+
i0.ɵɵconditionalCreate(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Template, 45, 26, "div", 15);
|
|
1440
|
+
i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Template, 4, 1, "div", 15);
|
|
1441
|
+
i0.ɵɵconditionalCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Template, 3, 1, "div", 15);
|
|
1442
|
+
i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template, 30, 8, "div", 15);
|
|
1443
|
+
i0.ɵɵconditionalCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template, 15, 3, "div", 15);
|
|
1444
|
+
i0.ɵɵconditionalCreate(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template, 4, 1, "div", 16);
|
|
1445
|
+
i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template, 3, 2, "div", 16);
|
|
1446
|
+
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template, 3, 1, "div", 16);
|
|
1447
|
+
i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template, 8, 3, "div", 17);
|
|
1446
1448
|
i0.ɵɵelementEnd()()();
|
|
1447
1449
|
} if (rf & 2) {
|
|
1448
1450
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -2344,12 +2346,12 @@ let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent ex
|
|
|
2344
2346
|
}));
|
|
2345
2347
|
}
|
|
2346
2348
|
static ɵfac = /*@__PURE__*/ (() => { let ɵKnowledgeConfigResourceComponent_BaseFactory; return function KnowledgeConfigResourceComponent_Factory(__ngFactoryType__) { return (ɵKnowledgeConfigResourceComponent_BaseFactory || (ɵKnowledgeConfigResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(KnowledgeConfigResourceComponent)))(__ngFactoryType__ || KnowledgeConfigResourceComponent); }; })();
|
|
2347
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KnowledgeConfigResourceComponent, selectors: [["app-knowledge-config-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 9, vars: 5, 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", "Padding"], [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"], [3, "ItemClicked", "Sections", "ActiveId"], [3, "Title", "Subtitle"], [1, "config-section"], [1, "config-section-content"], [1, "config-save-bar"], [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, "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"], ["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, "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"], [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) {
|
|
2349
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KnowledgeConfigResourceComponent, selectors: [["app-knowledge-config-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 9, vars: 5, 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", "Padding"], [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"], [1, "action-btn-label"], ["mjButton", "", "variant", "primary", "size", "sm", "title", "Save all settings", 3, "click", "disabled"], [1, "fa-solid", "fa-floppy-disk"], ["text", "Loading configuration...", "size", "medium"], ["MobileTitle", "Settings", 3, "ItemClicked", "Sections", "ActiveId"], [3, "Title", "Subtitle"], [1, "config-section"], [1, "config-section-content"], [1, "config-save-bar"], [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, "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"], ["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, "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"], [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) {
|
|
2348
2350
|
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1);
|
|
2349
2351
|
i0.ɵɵconditionalCreate(3, KnowledgeConfigResourceComponent_Conditional_3_Template, 1, 0, "mj-stat-badge", 2);
|
|
2350
2352
|
i0.ɵɵelementEnd();
|
|
2351
2353
|
i0.ɵɵelementStart(4, "div", 3);
|
|
2352
|
-
i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_5_Template,
|
|
2354
|
+
i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_5_Template, 8, 3);
|
|
2353
2355
|
i0.ɵɵelementEnd()();
|
|
2354
2356
|
i0.ɵɵelementStart(6, "mj-page-body", 4);
|
|
2355
2357
|
i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_7_Template, 2, 0, "div", 5)(8, KnowledgeConfigResourceComponent_Conditional_8_Template, 15, 14, "div", 6);
|
|
@@ -2371,7 +2373,7 @@ KnowledgeConfigResourceComponent = __decorate([
|
|
|
2371
2373
|
export { KnowledgeConfigResourceComponent };
|
|
2372
2374
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(KnowledgeConfigResourceComponent, [{
|
|
2373
2375
|
type: Component,
|
|
2374
|
-
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\" [Padding]=\"false\">\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 <mj-left-nav\n [Sections]=\"navSections\"\n [ActiveId]=\"ActiveSection\"\n (ItemClicked)=\"onNavItemClicked($event)\">\n </mj-left-nav>\n\n <mj-left-nav-content>\n <mj-page-header-interior\n [Title]=\"currentSection?.Label || ''\"\n [Subtitle]=\"currentSection?.Description || ''\">\n </mj-page-header-interior>\n <mj-page-body-interior>\n <!-- Pipeline Settings -->\n @if (ActiveSection === 'pipeline') {\n <div class=\"config-section\">\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\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\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\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\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 <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\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 @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 <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 </mj-page-body-interior>\n </mj-left-nav-content>\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/*\n Layout \u2014 <mj-left-nav> rail + <mj-left-nav-content> pane. The shared\n primitives own the rail width, nav item styling, and content sizing; we just\n need a flex-row wrapper so they sit side-by-side.\n*/\n.config-layout {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n/* Section title + description are now rendered by <mj-page-header-interior>\n (one shared instance bound to currentSection at the top of the content area).\n The legacy .config-section-title / .config-section-desc rules and the\n .config-content wrapper were retired with that migration; .config-section\n remains as a thin readability constraint on the form bodies. */\n.config-section {\n max-width: 700px;\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"] }]
|
|
2376
|
+
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> <span class=\"action-btn-label\">Reset</span>\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> <span class=\"action-btn-label\">{{IsSaving ? 'Saving\u2026' : 'Save'}}</span>\n </button>\n }\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\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 <mj-left-nav\n MobileTitle=\"Settings\"\n [Sections]=\"navSections\"\n [ActiveId]=\"ActiveSection\"\n (ItemClicked)=\"onNavItemClicked($event)\">\n </mj-left-nav>\n\n <mj-left-nav-content>\n <mj-page-header-interior\n [Title]=\"currentSection?.Label || ''\"\n [Subtitle]=\"currentSection?.Description || ''\">\n </mj-page-header-interior>\n <mj-page-body-interior>\n <!-- Pipeline Settings -->\n @if (ActiveSection === 'pipeline') {\n <div class=\"config-section\">\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\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\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\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\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 <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\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 @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 <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 </mj-page-body-interior>\n </mj-left-nav-content>\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/*\n Layout \u2014 <mj-left-nav> rail + <mj-left-nav-content> pane. The shared\n primitives own the rail width, nav item styling, and content sizing; we just\n need a flex-row wrapper so they sit side-by-side.\n*/\n.config-layout {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n/* Section title + description are now rendered by <mj-page-header-interior>\n (one shared instance bound to currentSection at the top of the content area).\n The legacy .config-section-title / .config-section-desc rules and the\n .config-content wrapper were retired with that migration; .config-section\n remains as a thin readability constraint on the form bodies. */\n.config-section {\n max-width: 700px;\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"] }]
|
|
2375
2377
|
}], null, null); })();
|
|
2376
2378
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KnowledgeConfigResourceComponent, { className: "KnowledgeConfigResourceComponent", filePath: "src/KnowledgeHub/components/config/knowledge-config-resource.component.ts", lineNumber: 100 }); })();
|
|
2377
2379
|
/** Tree-shaking prevention */
|