@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
|
@@ -0,0 +1,1384 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Classify · Content Sources tab.
|
|
3
|
+
*
|
|
4
|
+
* Self-contained sub-page: owns its header-interior, the source cards grid,
|
|
5
|
+
* the per-source detail slide-in, and the quick-schedule dialog. Receives the
|
|
6
|
+
* shared raw data needed to build the cards (sources, items, tags, runs, and
|
|
7
|
+
* the cached ScheduledAction + EntityRecordDocument lookups) from the host
|
|
8
|
+
* orchestrator via `@Input()`. Cross-tab concerns — opening the add/edit slide-in
|
|
9
|
+
* form, running the pipeline, opening a content-item detail, and reloading the
|
|
10
|
+
* shared source list after a mutation — bubble up via `@Output()`.
|
|
11
|
+
*
|
|
12
|
+
* Out of scope (stays in the host): the add/edit source slide-in FORM, the
|
|
13
|
+
* pipeline tab, and the Content Duplicates section.
|
|
14
|
+
*/
|
|
15
|
+
import { Component, ChangeDetectorRef, EventEmitter, Input, Output, inject } from '@angular/core';
|
|
16
|
+
import { CompositeKey, RunView } from '@memberjunction/core';
|
|
17
|
+
import { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';
|
|
18
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
19
|
+
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
20
|
+
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
21
|
+
import { KnowledgeHubMetadataEngine } from '@memberjunction/core-entities';
|
|
22
|
+
import { formatNumber, formatDate, computeDuration, displayStatus, getSourceTypeIcon, CronToHumanReadable } from '../shared/classify.format';
|
|
23
|
+
import * as i0 from "@angular/core";
|
|
24
|
+
import * as i1 from "@angular/forms";
|
|
25
|
+
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
26
|
+
import * as i3 from "@memberjunction/ng-ui-components";
|
|
27
|
+
import * as i4 from "../dialogs/dry-run-preview.dialog.component";
|
|
28
|
+
import * as i5 from "@angular/common";
|
|
29
|
+
const _forTrack0 = ($index, $item) => $item.ID;
|
|
30
|
+
function ClassifySourcesTabComponent_For_11_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
31
|
+
i0.ɵɵtext(0);
|
|
32
|
+
} if (rf & 2) {
|
|
33
|
+
const card_r2 = i0.ɵɵnextContext().$implicit;
|
|
34
|
+
i0.ɵɵtextInterpolate1(" \u00B7 ", card_r2.FileTypeName);
|
|
35
|
+
} }
|
|
36
|
+
function ClassifySourcesTabComponent_For_11_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
37
|
+
i0.ɵɵelementStart(0, "div", 23);
|
|
38
|
+
i0.ɵɵtext(1);
|
|
39
|
+
i0.ɵɵelementEnd();
|
|
40
|
+
} if (rf & 2) {
|
|
41
|
+
const card_r2 = i0.ɵɵnextContext().$implicit;
|
|
42
|
+
i0.ɵɵadvance();
|
|
43
|
+
i0.ɵɵtextInterpolate(card_r2.URL);
|
|
44
|
+
} }
|
|
45
|
+
function ClassifySourcesTabComponent_For_11_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
46
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
47
|
+
i0.ɵɵelementStart(0, "div", 37);
|
|
48
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_For_11_Conditional_35_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r4); const card_r2 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.RemoveSchedule(card_r2); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
49
|
+
i0.ɵɵelement(1, "i", 38);
|
|
50
|
+
i0.ɵɵelementStart(2, "span");
|
|
51
|
+
i0.ɵɵtext(3);
|
|
52
|
+
i0.ɵɵelementEnd()();
|
|
53
|
+
} if (rf & 2) {
|
|
54
|
+
const card_r2 = i0.ɵɵnextContext().$implicit;
|
|
55
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
56
|
+
i0.ɵɵadvance(3);
|
|
57
|
+
i0.ɵɵtextInterpolate(ctx_r2.GetScheduleLabel(card_r2));
|
|
58
|
+
} }
|
|
59
|
+
function ClassifySourcesTabComponent_For_11_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
60
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
61
|
+
i0.ɵɵelementStart(0, "button", 39);
|
|
62
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_For_11_Conditional_46_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r5); const card_r2 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.OpenScheduleDialog(card_r2); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
63
|
+
i0.ɵɵelement(1, "i", 38);
|
|
64
|
+
i0.ɵɵtext(2, " Schedule");
|
|
65
|
+
i0.ɵɵelementEnd();
|
|
66
|
+
} }
|
|
67
|
+
function ClassifySourcesTabComponent_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
68
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
69
|
+
i0.ɵɵelementStart(0, "div", 16);
|
|
70
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_For_11_Template_div_click_0_listener() { const card_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OpenSourceDetail(card_r2)); });
|
|
71
|
+
i0.ɵɵelementStart(1, "div", 17)(2, "div", 18);
|
|
72
|
+
i0.ɵɵelement(3, "i");
|
|
73
|
+
i0.ɵɵelementEnd();
|
|
74
|
+
i0.ɵɵelementStart(4, "div")(5, "div", 19);
|
|
75
|
+
i0.ɵɵtext(6);
|
|
76
|
+
i0.ɵɵelementEnd();
|
|
77
|
+
i0.ɵɵelementStart(7, "div", 20);
|
|
78
|
+
i0.ɵɵtext(8);
|
|
79
|
+
i0.ɵɵconditionalCreate(9, ClassifySourcesTabComponent_For_11_Conditional_9_Template, 1, 1);
|
|
80
|
+
i0.ɵɵelementEnd()();
|
|
81
|
+
i0.ɵɵelementStart(10, "div", 21);
|
|
82
|
+
i0.ɵɵelement(11, "div", 22);
|
|
83
|
+
i0.ɵɵtext(12);
|
|
84
|
+
i0.ɵɵelementEnd()();
|
|
85
|
+
i0.ɵɵconditionalCreate(13, ClassifySourcesTabComponent_For_11_Conditional_13_Template, 2, 1, "div", 23);
|
|
86
|
+
i0.ɵɵelementStart(14, "div", 24)(15, "div", 25)(16, "div", 26);
|
|
87
|
+
i0.ɵɵtext(17);
|
|
88
|
+
i0.ɵɵelementEnd();
|
|
89
|
+
i0.ɵɵelementStart(18, "div", 27);
|
|
90
|
+
i0.ɵɵtext(19, "Items");
|
|
91
|
+
i0.ɵɵelementEnd()();
|
|
92
|
+
i0.ɵɵelementStart(20, "div", 25)(21, "div", 26);
|
|
93
|
+
i0.ɵɵtext(22);
|
|
94
|
+
i0.ɵɵelementEnd();
|
|
95
|
+
i0.ɵɵelementStart(23, "div", 27);
|
|
96
|
+
i0.ɵɵtext(24, "Tags");
|
|
97
|
+
i0.ɵɵelementEnd()();
|
|
98
|
+
i0.ɵɵelementStart(25, "div", 25)(26, "div", 26);
|
|
99
|
+
i0.ɵɵtext(27);
|
|
100
|
+
i0.ɵɵelementEnd();
|
|
101
|
+
i0.ɵɵelementStart(28, "div", 27);
|
|
102
|
+
i0.ɵɵtext(29, "Avg Tags");
|
|
103
|
+
i0.ɵɵelementEnd()();
|
|
104
|
+
i0.ɵɵelementStart(30, "div", 25)(31, "div", 26);
|
|
105
|
+
i0.ɵɵtext(32);
|
|
106
|
+
i0.ɵɵelementEnd();
|
|
107
|
+
i0.ɵɵelementStart(33, "div", 27);
|
|
108
|
+
i0.ɵɵtext(34, "Last Run");
|
|
109
|
+
i0.ɵɵelementEnd()()();
|
|
110
|
+
i0.ɵɵconditionalCreate(35, ClassifySourcesTabComponent_For_11_Conditional_35_Template, 4, 1, "div", 28);
|
|
111
|
+
i0.ɵɵelementStart(36, "div", 29)(37, "button", 30);
|
|
112
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_For_11_Template_button_click_37_listener($event) { const card_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.onEditSource(card_r2); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
113
|
+
i0.ɵɵelement(38, "i", 31);
|
|
114
|
+
i0.ɵɵtext(39, " Edit");
|
|
115
|
+
i0.ɵɵelementEnd();
|
|
116
|
+
i0.ɵɵelementStart(40, "button", 30);
|
|
117
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_For_11_Template_button_click_40_listener($event) { const card_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.onRunSource(card_r2.ID); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
118
|
+
i0.ɵɵelement(41, "i", 32);
|
|
119
|
+
i0.ɵɵtext(42, " Run");
|
|
120
|
+
i0.ɵɵelementEnd();
|
|
121
|
+
i0.ɵɵelementStart(43, "button", 30);
|
|
122
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_For_11_Template_button_click_43_listener($event) { const card_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.OpenDryRunPreview(card_r2); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
123
|
+
i0.ɵɵelement(44, "i", 33);
|
|
124
|
+
i0.ɵɵtext(45, " Preview");
|
|
125
|
+
i0.ɵɵelementEnd();
|
|
126
|
+
i0.ɵɵconditionalCreate(46, ClassifySourcesTabComponent_For_11_Conditional_46_Template, 3, 0, "button", 34);
|
|
127
|
+
i0.ɵɵelementStart(47, "button", 35);
|
|
128
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_For_11_Template_button_click_47_listener($event) { const card_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.DeleteSource(card_r2); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
129
|
+
i0.ɵɵelement(48, "i", 36);
|
|
130
|
+
i0.ɵɵtext(49, " Delete");
|
|
131
|
+
i0.ɵɵelementEnd()()();
|
|
132
|
+
} if (rf & 2) {
|
|
133
|
+
const card_r2 = ctx.$implicit;
|
|
134
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
135
|
+
i0.ɵɵadvance(3);
|
|
136
|
+
i0.ɵɵclassMap(card_r2.Icon);
|
|
137
|
+
i0.ɵɵadvance(3);
|
|
138
|
+
i0.ɵɵtextInterpolate(card_r2.Name);
|
|
139
|
+
i0.ɵɵadvance(2);
|
|
140
|
+
i0.ɵɵtextInterpolate(card_r2.SourceTypeName);
|
|
141
|
+
i0.ɵɵadvance();
|
|
142
|
+
i0.ɵɵconditional(card_r2.RequiresFileType ? 9 : -1);
|
|
143
|
+
i0.ɵɵadvance();
|
|
144
|
+
i0.ɵɵclassMap(card_r2.StatusClass);
|
|
145
|
+
i0.ɵɵadvance();
|
|
146
|
+
i0.ɵɵclassMap(card_r2.StatusClass);
|
|
147
|
+
i0.ɵɵadvance();
|
|
148
|
+
i0.ɵɵtextInterpolate1(" ", card_r2.StatusLabel, " ");
|
|
149
|
+
i0.ɵɵadvance();
|
|
150
|
+
i0.ɵɵconditional(card_r2.URL ? 13 : -1);
|
|
151
|
+
i0.ɵɵadvance(4);
|
|
152
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatNumber(card_r2.ItemCount));
|
|
153
|
+
i0.ɵɵadvance(5);
|
|
154
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatNumber(card_r2.TagCount));
|
|
155
|
+
i0.ɵɵadvance(5);
|
|
156
|
+
i0.ɵɵtextInterpolate(card_r2.AvgTags);
|
|
157
|
+
i0.ɵɵadvance(5);
|
|
158
|
+
i0.ɵɵtextInterpolate(card_r2.LastRunAgo);
|
|
159
|
+
i0.ɵɵadvance(3);
|
|
160
|
+
i0.ɵɵconditional(card_r2.ScheduledActionID ? 35 : -1);
|
|
161
|
+
i0.ɵɵadvance(11);
|
|
162
|
+
i0.ɵɵconditional(!card_r2.ScheduledActionID ? 46 : -1);
|
|
163
|
+
} }
|
|
164
|
+
function ClassifySourcesTabComponent_Conditional_18_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
165
|
+
i0.ɵɵelementStart(0, "div", 47);
|
|
166
|
+
i0.ɵɵelement(1, "mj-loading", 48);
|
|
167
|
+
i0.ɵɵelementEnd();
|
|
168
|
+
} }
|
|
169
|
+
function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
170
|
+
i0.ɵɵelementStart(0, "div", 57)(1, "span", 58);
|
|
171
|
+
i0.ɵɵtext(2, "URL");
|
|
172
|
+
i0.ɵɵelementEnd();
|
|
173
|
+
i0.ɵɵelementStart(3, "a", 78);
|
|
174
|
+
i0.ɵɵtext(4);
|
|
175
|
+
i0.ɵɵelementEnd()();
|
|
176
|
+
} if (rf & 2) {
|
|
177
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
178
|
+
i0.ɵɵadvance(3);
|
|
179
|
+
i0.ɵɵproperty("href", ctx_r2.SelectedSource.URL, i0.ɵɵsanitizeUrl);
|
|
180
|
+
i0.ɵɵadvance();
|
|
181
|
+
i0.ɵɵtextInterpolate(ctx_r2.SelectedSource.URL);
|
|
182
|
+
} }
|
|
183
|
+
function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
184
|
+
i0.ɵɵelementStart(0, "div", 57)(1, "span", 58);
|
|
185
|
+
i0.ɵɵtext(2, "Content Type");
|
|
186
|
+
i0.ɵɵelementEnd();
|
|
187
|
+
i0.ɵɵelementStart(3, "span", 59);
|
|
188
|
+
i0.ɵɵtext(4);
|
|
189
|
+
i0.ɵɵelementEnd()();
|
|
190
|
+
i0.ɵɵelementStart(5, "div", 57)(6, "span", 58);
|
|
191
|
+
i0.ɵɵtext(7, "File Type");
|
|
192
|
+
i0.ɵɵelementEnd();
|
|
193
|
+
i0.ɵɵelementStart(8, "span", 59);
|
|
194
|
+
i0.ɵɵtext(9);
|
|
195
|
+
i0.ɵɵelementEnd()();
|
|
196
|
+
} if (rf & 2) {
|
|
197
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
198
|
+
i0.ɵɵadvance(4);
|
|
199
|
+
i0.ɵɵtextInterpolate(ctx_r2.SelectedSource.ContentTypeName);
|
|
200
|
+
i0.ɵɵadvance(5);
|
|
201
|
+
i0.ɵɵtextInterpolate(ctx_r2.SelectedSource.FileTypeName);
|
|
202
|
+
} }
|
|
203
|
+
function ClassifySourcesTabComponent_Conditional_18_Conditional_10_For_64_Template(rf, ctx) { if (rf & 1) {
|
|
204
|
+
i0.ɵɵelementStart(0, "option", 67);
|
|
205
|
+
i0.ɵɵtext(1);
|
|
206
|
+
i0.ɵɵelementEnd();
|
|
207
|
+
} if (rf & 2) {
|
|
208
|
+
const opt_r8 = ctx.$implicit;
|
|
209
|
+
i0.ɵɵproperty("value", opt_r8);
|
|
210
|
+
i0.ɵɵadvance();
|
|
211
|
+
i0.ɵɵtextInterpolate(opt_r8);
|
|
212
|
+
} }
|
|
213
|
+
function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_69_Template(rf, ctx) { if (rf & 1) {
|
|
214
|
+
i0.ɵɵelementStart(0, "div", 71)(1, "p");
|
|
215
|
+
i0.ɵɵtext(2);
|
|
216
|
+
i0.ɵɵelementEnd()();
|
|
217
|
+
} if (rf & 2) {
|
|
218
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
219
|
+
i0.ɵɵadvance(2);
|
|
220
|
+
i0.ɵɵtextInterpolate(ctx_r2.SourceDetailStatusFilter === "All" ? "No content items yet." : "No items match this filter.");
|
|
221
|
+
} }
|
|
222
|
+
function ClassifySourcesTabComponent_Conditional_18_Conditional_10_For_71_Template(rf, ctx) { if (rf & 1) {
|
|
223
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
224
|
+
i0.ɵɵelementStart(0, "div", 79);
|
|
225
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_18_Conditional_10_For_71_Template_div_click_0_listener() { const ci_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OpenContentItemDetail(ci_r10)); });
|
|
226
|
+
i0.ɵɵelement(1, "div", 80);
|
|
227
|
+
i0.ɵɵelementStart(2, "span", 81);
|
|
228
|
+
i0.ɵɵtext(3);
|
|
229
|
+
i0.ɵɵelementEnd();
|
|
230
|
+
i0.ɵɵelementStart(4, "span", 82);
|
|
231
|
+
i0.ɵɵtext(5);
|
|
232
|
+
i0.ɵɵelementEnd();
|
|
233
|
+
i0.ɵɵelementStart(6, "span", 82);
|
|
234
|
+
i0.ɵɵtext(7);
|
|
235
|
+
i0.ɵɵelementEnd();
|
|
236
|
+
i0.ɵɵelementStart(8, "span", 83);
|
|
237
|
+
i0.ɵɵtext(9);
|
|
238
|
+
i0.ɵɵelementEnd();
|
|
239
|
+
i0.ɵɵelementStart(10, "span", 84);
|
|
240
|
+
i0.ɵɵtext(11);
|
|
241
|
+
i0.ɵɵelementEnd()();
|
|
242
|
+
} if (rf & 2) {
|
|
243
|
+
const ci_r10 = ctx.$implicit;
|
|
244
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
245
|
+
i0.ɵɵadvance();
|
|
246
|
+
i0.ɵɵclassMap(ci_r10.StatusDot);
|
|
247
|
+
i0.ɵɵadvance(2);
|
|
248
|
+
i0.ɵɵtextInterpolate(ci_r10.Name);
|
|
249
|
+
i0.ɵɵadvance();
|
|
250
|
+
i0.ɵɵclassMap(ctx_r2.GetStatusBadgeClass(ci_r10.EmbeddingStatus));
|
|
251
|
+
i0.ɵɵadvance();
|
|
252
|
+
i0.ɵɵtextInterpolate1("E:", ci_r10.EmbeddingStatus);
|
|
253
|
+
i0.ɵɵadvance();
|
|
254
|
+
i0.ɵɵclassMap(ctx_r2.GetStatusBadgeClass(ci_r10.TaggingStatus));
|
|
255
|
+
i0.ɵɵadvance();
|
|
256
|
+
i0.ɵɵtextInterpolate1("T:", ci_r10.TaggingStatus);
|
|
257
|
+
i0.ɵɵadvance(2);
|
|
258
|
+
i0.ɵɵtextInterpolate1("", ci_r10.TagCount, " tags");
|
|
259
|
+
i0.ɵɵadvance(2);
|
|
260
|
+
i0.ɵɵtextInterpolate(ci_r10.UpdatedAt);
|
|
261
|
+
} }
|
|
262
|
+
function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_72_Template(rf, ctx) { if (rf & 1) {
|
|
263
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
264
|
+
i0.ɵɵelementStart(0, "div", 73)(1, "button", 85);
|
|
265
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_72_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SourceDetailPrevPage()); });
|
|
266
|
+
i0.ɵɵelement(2, "i", 86);
|
|
267
|
+
i0.ɵɵtext(3, " Prev ");
|
|
268
|
+
i0.ɵɵelementEnd();
|
|
269
|
+
i0.ɵɵelementStart(4, "span", 87);
|
|
270
|
+
i0.ɵɵtext(5);
|
|
271
|
+
i0.ɵɵelementEnd();
|
|
272
|
+
i0.ɵɵelementStart(6, "button", 85);
|
|
273
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_72_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SourceDetailNextPage()); });
|
|
274
|
+
i0.ɵɵtext(7, " Next ");
|
|
275
|
+
i0.ɵɵelement(8, "i", 88);
|
|
276
|
+
i0.ɵɵelementEnd()();
|
|
277
|
+
} if (rf & 2) {
|
|
278
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
279
|
+
i0.ɵɵadvance();
|
|
280
|
+
i0.ɵɵproperty("disabled", ctx_r2.SourceDetailPage === 0);
|
|
281
|
+
i0.ɵɵadvance(4);
|
|
282
|
+
i0.ɵɵtextInterpolate2("Page ", ctx_r2.SourceDetailPage + 1, " of ", ctx_r2.SourceDetailTotalPages);
|
|
283
|
+
i0.ɵɵadvance();
|
|
284
|
+
i0.ɵɵproperty("disabled", ctx_r2.SourceDetailPage >= ctx_r2.SourceDetailTotalPages - 1);
|
|
285
|
+
} }
|
|
286
|
+
function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_73_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
287
|
+
i0.ɵɵelementStart(0, "div", 90)(1, "span", 91);
|
|
288
|
+
i0.ɵɵtext(2);
|
|
289
|
+
i0.ɵɵelementEnd();
|
|
290
|
+
i0.ɵɵelementStart(3, "span", 92);
|
|
291
|
+
i0.ɵɵtext(4);
|
|
292
|
+
i0.ɵɵelementEnd();
|
|
293
|
+
i0.ɵɵelementStart(5, "span", 93);
|
|
294
|
+
i0.ɵɵtext(6);
|
|
295
|
+
i0.ɵɵelementEnd();
|
|
296
|
+
i0.ɵɵelementStart(7, "span", 94);
|
|
297
|
+
i0.ɵɵtext(8);
|
|
298
|
+
i0.ɵɵelementEnd()();
|
|
299
|
+
} if (rf & 2) {
|
|
300
|
+
const run_r12 = ctx.$implicit;
|
|
301
|
+
i0.ɵɵadvance();
|
|
302
|
+
i0.ɵɵclassMap(run_r12.StatusClass);
|
|
303
|
+
i0.ɵɵadvance();
|
|
304
|
+
i0.ɵɵtextInterpolate(run_r12.Status);
|
|
305
|
+
i0.ɵɵadvance(2);
|
|
306
|
+
i0.ɵɵtextInterpolate(run_r12.StartedDisplay);
|
|
307
|
+
i0.ɵɵadvance(2);
|
|
308
|
+
i0.ɵɵtextInterpolate(run_r12.Duration);
|
|
309
|
+
i0.ɵɵadvance(2);
|
|
310
|
+
i0.ɵɵtextInterpolate1("", run_r12.Items, " items");
|
|
311
|
+
} }
|
|
312
|
+
function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_73_Template(rf, ctx) { if (rf & 1) {
|
|
313
|
+
i0.ɵɵelementStart(0, "div", 54)(1, "div", 55);
|
|
314
|
+
i0.ɵɵtext(2, "Recent Runs");
|
|
315
|
+
i0.ɵɵelementEnd();
|
|
316
|
+
i0.ɵɵelementStart(3, "div", 89);
|
|
317
|
+
i0.ɵɵrepeaterCreate(4, ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_73_For_5_Template, 9, 6, "div", 90, _forTrack0);
|
|
318
|
+
i0.ɵɵelementEnd()();
|
|
319
|
+
} if (rf & 2) {
|
|
320
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
321
|
+
i0.ɵɵadvance(4);
|
|
322
|
+
i0.ɵɵrepeater(ctx_r2.SelectedSource.RunHistory);
|
|
323
|
+
} }
|
|
324
|
+
function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
325
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
326
|
+
i0.ɵɵelementStart(0, "div", 49)(1, "div", 18);
|
|
327
|
+
i0.ɵɵelement(2, "i");
|
|
328
|
+
i0.ɵɵelementEnd();
|
|
329
|
+
i0.ɵɵelementStart(3, "div")(4, "h4", 50);
|
|
330
|
+
i0.ɵɵtext(5);
|
|
331
|
+
i0.ɵɵelementEnd();
|
|
332
|
+
i0.ɵɵelementStart(6, "div", 51)(7, "span", 52);
|
|
333
|
+
i0.ɵɵtext(8);
|
|
334
|
+
i0.ɵɵelementEnd();
|
|
335
|
+
i0.ɵɵelementStart(9, "span", 53);
|
|
336
|
+
i0.ɵɵtext(10);
|
|
337
|
+
i0.ɵɵelementEnd()()()();
|
|
338
|
+
i0.ɵɵelementStart(11, "div", 54)(12, "div", 55);
|
|
339
|
+
i0.ɵɵtext(13, "Configuration");
|
|
340
|
+
i0.ɵɵelementEnd();
|
|
341
|
+
i0.ɵɵelementStart(14, "div", 56);
|
|
342
|
+
i0.ɵɵconditionalCreate(15, ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_15_Template, 5, 2, "div", 57);
|
|
343
|
+
i0.ɵɵconditionalCreate(16, ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_16_Template, 10, 2);
|
|
344
|
+
i0.ɵɵelementStart(17, "div", 57)(18, "span", 58);
|
|
345
|
+
i0.ɵɵtext(19, "Embedding Model");
|
|
346
|
+
i0.ɵɵelementEnd();
|
|
347
|
+
i0.ɵɵelementStart(20, "span", 59);
|
|
348
|
+
i0.ɵɵtext(21);
|
|
349
|
+
i0.ɵɵelementEnd()();
|
|
350
|
+
i0.ɵɵelementStart(22, "div", 57)(23, "span", 58);
|
|
351
|
+
i0.ɵɵtext(24, "Vector Index");
|
|
352
|
+
i0.ɵɵelementEnd();
|
|
353
|
+
i0.ɵɵelementStart(25, "span", 59);
|
|
354
|
+
i0.ɵɵtext(26);
|
|
355
|
+
i0.ɵɵelementEnd()()()();
|
|
356
|
+
i0.ɵɵelementStart(27, "div", 54)(28, "div", 55);
|
|
357
|
+
i0.ɵɵtext(29, "Statistics");
|
|
358
|
+
i0.ɵɵelementEnd();
|
|
359
|
+
i0.ɵɵelementStart(30, "div", 60)(31, "div", 61)(32, "div", 62);
|
|
360
|
+
i0.ɵɵtext(33);
|
|
361
|
+
i0.ɵɵelementEnd();
|
|
362
|
+
i0.ɵɵelementStart(34, "div", 63);
|
|
363
|
+
i0.ɵɵtext(35, "Items");
|
|
364
|
+
i0.ɵɵelementEnd()();
|
|
365
|
+
i0.ɵɵelementStart(36, "div", 61)(37, "div", 62);
|
|
366
|
+
i0.ɵɵtext(38);
|
|
367
|
+
i0.ɵɵelementEnd();
|
|
368
|
+
i0.ɵɵelementStart(39, "div", 63);
|
|
369
|
+
i0.ɵɵtext(40, "Tags");
|
|
370
|
+
i0.ɵɵelementEnd()();
|
|
371
|
+
i0.ɵɵelementStart(41, "div", 61)(42, "div", 62);
|
|
372
|
+
i0.ɵɵtext(43);
|
|
373
|
+
i0.ɵɵelementEnd();
|
|
374
|
+
i0.ɵɵelementStart(44, "div", 63);
|
|
375
|
+
i0.ɵɵtext(45, "Avg Tags");
|
|
376
|
+
i0.ɵɵelementEnd()();
|
|
377
|
+
i0.ɵɵelementStart(46, "div", 61)(47, "div", 62);
|
|
378
|
+
i0.ɵɵtext(48);
|
|
379
|
+
i0.ɵɵelementEnd();
|
|
380
|
+
i0.ɵɵelementStart(49, "div", 63);
|
|
381
|
+
i0.ɵɵtext(50, "Last Run");
|
|
382
|
+
i0.ɵɵelementEnd()();
|
|
383
|
+
i0.ɵɵelementStart(51, "div", 61)(52, "div", 62);
|
|
384
|
+
i0.ɵɵtext(53);
|
|
385
|
+
i0.ɵɵelementEnd();
|
|
386
|
+
i0.ɵɵelementStart(54, "div", 63);
|
|
387
|
+
i0.ɵɵtext(55, "Errors");
|
|
388
|
+
i0.ɵɵelementEnd()()()();
|
|
389
|
+
i0.ɵɵelementStart(56, "div", 54)(57, "div", 64)(58, "div", 55);
|
|
390
|
+
i0.ɵɵtext(59);
|
|
391
|
+
i0.ɵɵpipe(60, "number");
|
|
392
|
+
i0.ɵɵelementEnd();
|
|
393
|
+
i0.ɵɵelementStart(61, "div", 65)(62, "select", 66);
|
|
394
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Template_select_ngModelChange_62_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.SourceDetailStatusFilter, $event) || (ctx_r2.SourceDetailStatusFilter = $event); return i0.ɵɵresetView($event); });
|
|
395
|
+
i0.ɵɵlistener("ngModelChange", function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Template_select_ngModelChange_62_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnSourceDetailStatusFilterChange()); });
|
|
396
|
+
i0.ɵɵrepeaterCreate(63, ClassifySourcesTabComponent_Conditional_18_Conditional_10_For_64_Template, 2, 2, "option", 67, i0.ɵɵrepeaterTrackByIdentity);
|
|
397
|
+
i0.ɵɵelementEnd();
|
|
398
|
+
i0.ɵɵelementStart(65, "button", 68);
|
|
399
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Template_button_click_65_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.RetryFailedItems()); });
|
|
400
|
+
i0.ɵɵelement(66, "i", 69);
|
|
401
|
+
i0.ɵɵtext(67, " Retry Failed ");
|
|
402
|
+
i0.ɵɵelementEnd()()();
|
|
403
|
+
i0.ɵɵelementStart(68, "div", 70);
|
|
404
|
+
i0.ɵɵconditionalCreate(69, ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_69_Template, 3, 1, "div", 71);
|
|
405
|
+
i0.ɵɵrepeaterCreate(70, ClassifySourcesTabComponent_Conditional_18_Conditional_10_For_71_Template, 12, 11, "div", 72, _forTrack0);
|
|
406
|
+
i0.ɵɵelementEnd();
|
|
407
|
+
i0.ɵɵconditionalCreate(72, ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_72_Template, 9, 4, "div", 73);
|
|
408
|
+
i0.ɵɵelementEnd();
|
|
409
|
+
i0.ɵɵconditionalCreate(73, ClassifySourcesTabComponent_Conditional_18_Conditional_10_Conditional_73_Template, 6, 0, "div", 54);
|
|
410
|
+
i0.ɵɵelementStart(74, "div", 74)(75, "button", 75);
|
|
411
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Template_button_click_75_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OpenEditSourceFromDetail()); });
|
|
412
|
+
i0.ɵɵelement(76, "i", 31);
|
|
413
|
+
i0.ɵɵtext(77, " Edit ");
|
|
414
|
+
i0.ɵɵelementEnd();
|
|
415
|
+
i0.ɵɵelementStart(78, "button", 76);
|
|
416
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Template_button_click_78_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.RunSourceFromDetail()); });
|
|
417
|
+
i0.ɵɵelement(79, "i", 32);
|
|
418
|
+
i0.ɵɵtext(80, " Run Now ");
|
|
419
|
+
i0.ɵɵelementEnd();
|
|
420
|
+
i0.ɵɵelementStart(81, "button", 77);
|
|
421
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_18_Conditional_10_Template_button_click_81_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.DeleteSourceFromDetail()); });
|
|
422
|
+
i0.ɵɵelement(82, "i", 36);
|
|
423
|
+
i0.ɵɵtext(83, " Delete ");
|
|
424
|
+
i0.ɵɵelementEnd()();
|
|
425
|
+
} if (rf & 2) {
|
|
426
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
427
|
+
i0.ɵɵadvance(2);
|
|
428
|
+
i0.ɵɵclassMap(ctx_r2.SelectedSource.Icon);
|
|
429
|
+
i0.ɵɵadvance(3);
|
|
430
|
+
i0.ɵɵtextInterpolate(ctx_r2.SelectedSource.Name);
|
|
431
|
+
i0.ɵɵadvance(3);
|
|
432
|
+
i0.ɵɵtextInterpolate(ctx_r2.SelectedSource.SourceTypeName);
|
|
433
|
+
i0.ɵɵadvance();
|
|
434
|
+
i0.ɵɵclassMap("at-detail-badge-status-" + ctx_r2.SelectedSource.StatusClass);
|
|
435
|
+
i0.ɵɵadvance();
|
|
436
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.SelectedSource.StatusLabel, " ");
|
|
437
|
+
i0.ɵɵadvance(5);
|
|
438
|
+
i0.ɵɵconditional(ctx_r2.SelectedSource.URL ? 15 : -1);
|
|
439
|
+
i0.ɵɵadvance();
|
|
440
|
+
i0.ɵɵconditional(ctx_r2.SelectedSource.RequiresFileType ? 16 : -1);
|
|
441
|
+
i0.ɵɵadvance(5);
|
|
442
|
+
i0.ɵɵtextInterpolate(ctx_r2.SelectedSource.EmbeddingModelName);
|
|
443
|
+
i0.ɵɵadvance(5);
|
|
444
|
+
i0.ɵɵtextInterpolate(ctx_r2.SelectedSource.VectorIndexName);
|
|
445
|
+
i0.ɵɵadvance(7);
|
|
446
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatNumber(ctx_r2.SelectedSource.ItemCount));
|
|
447
|
+
i0.ɵɵadvance(5);
|
|
448
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatNumber(ctx_r2.SelectedSource.TagCount));
|
|
449
|
+
i0.ɵɵadvance(5);
|
|
450
|
+
i0.ɵɵtextInterpolate(ctx_r2.SelectedSource.AvgTags);
|
|
451
|
+
i0.ɵɵadvance(5);
|
|
452
|
+
i0.ɵɵtextInterpolate(ctx_r2.SelectedSource.LastRunAgo);
|
|
453
|
+
i0.ɵɵadvance(4);
|
|
454
|
+
i0.ɵɵclassProp("at-kpi-error-value", ctx_r2.SelectedSource.ErrorCount > 0);
|
|
455
|
+
i0.ɵɵadvance();
|
|
456
|
+
i0.ɵɵtextInterpolate(ctx_r2.SelectedSource.ErrorCount);
|
|
457
|
+
i0.ɵɵadvance(6);
|
|
458
|
+
i0.ɵɵtextInterpolate2("Content Library (", ctx_r2.FilteredSourceDetailTotal, " of ", i0.ɵɵpipeBind1(60, 24, ctx_r2.SelectedSource.ItemCount), ")");
|
|
459
|
+
i0.ɵɵadvance(3);
|
|
460
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.SourceDetailStatusFilter);
|
|
461
|
+
i0.ɵɵadvance();
|
|
462
|
+
i0.ɵɵrepeater(ctx_r2.SourceDetailStatusOptions);
|
|
463
|
+
i0.ɵɵadvance(6);
|
|
464
|
+
i0.ɵɵconditional(ctx_r2.FilteredSourceDetailItems.length === 0 ? 69 : -1);
|
|
465
|
+
i0.ɵɵadvance();
|
|
466
|
+
i0.ɵɵrepeater(ctx_r2.FilteredSourceDetailItems);
|
|
467
|
+
i0.ɵɵadvance(2);
|
|
468
|
+
i0.ɵɵconditional(ctx_r2.SourceDetailTotalPages > 1 ? 72 : -1);
|
|
469
|
+
i0.ɵɵadvance();
|
|
470
|
+
i0.ɵɵconditional(ctx_r2.SelectedSource.RunHistory.length > 0 ? 73 : -1);
|
|
471
|
+
} }
|
|
472
|
+
function ClassifySourcesTabComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
473
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
474
|
+
i0.ɵɵelementStart(0, "div", 40);
|
|
475
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_18_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.CloseSourceDetail()); });
|
|
476
|
+
i0.ɵɵelementEnd();
|
|
477
|
+
i0.ɵɵelementStart(1, "div", 41)(2, "div", 42)(3, "h3");
|
|
478
|
+
i0.ɵɵelement(4, "i", 43);
|
|
479
|
+
i0.ɵɵtext(5, " Source Detail");
|
|
480
|
+
i0.ɵɵelementEnd();
|
|
481
|
+
i0.ɵɵelementStart(6, "button", 44);
|
|
482
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_18_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.CloseSourceDetail()); });
|
|
483
|
+
i0.ɵɵelement(7, "i", 45);
|
|
484
|
+
i0.ɵɵelementEnd()();
|
|
485
|
+
i0.ɵɵelementStart(8, "div", 46);
|
|
486
|
+
i0.ɵɵconditionalCreate(9, ClassifySourcesTabComponent_Conditional_18_Conditional_9_Template, 2, 0, "div", 47);
|
|
487
|
+
i0.ɵɵconditionalCreate(10, ClassifySourcesTabComponent_Conditional_18_Conditional_10_Template, 84, 26);
|
|
488
|
+
i0.ɵɵelementEnd()();
|
|
489
|
+
} if (rf & 2) {
|
|
490
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
491
|
+
i0.ɵɵadvance(9);
|
|
492
|
+
i0.ɵɵconditional(ctx_r2.SourceDetailLoading ? 9 : -1);
|
|
493
|
+
i0.ɵɵadvance();
|
|
494
|
+
i0.ɵɵconditional(!ctx_r2.SourceDetailLoading && ctx_r2.SelectedSource ? 10 : -1);
|
|
495
|
+
} }
|
|
496
|
+
function ClassifySourcesTabComponent_Conditional_19_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
497
|
+
i0.ɵɵelement(0, "i", 112);
|
|
498
|
+
i0.ɵɵtext(1, " Saving... ");
|
|
499
|
+
} }
|
|
500
|
+
function ClassifySourcesTabComponent_Conditional_19_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
501
|
+
i0.ɵɵelement(0, "i", 113);
|
|
502
|
+
i0.ɵɵtext(1, " Create Schedule ");
|
|
503
|
+
} }
|
|
504
|
+
function ClassifySourcesTabComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
505
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
506
|
+
i0.ɵɵelementStart(0, "div", 95);
|
|
507
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_19_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.CloseScheduleDialog()); });
|
|
508
|
+
i0.ɵɵelementStart(1, "div", 96);
|
|
509
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_19_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
510
|
+
i0.ɵɵelementStart(2, "div", 97)(3, "h3");
|
|
511
|
+
i0.ɵɵelement(4, "i", 38);
|
|
512
|
+
i0.ɵɵtext(5, " Schedule Pipeline");
|
|
513
|
+
i0.ɵɵelementEnd();
|
|
514
|
+
i0.ɵɵelementStart(6, "button", 98);
|
|
515
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_19_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.CloseScheduleDialog()); });
|
|
516
|
+
i0.ɵɵelement(7, "i", 45);
|
|
517
|
+
i0.ɵɵelementEnd()();
|
|
518
|
+
i0.ɵɵelementStart(8, "div", 99)(9, "div", 100)(10, "label");
|
|
519
|
+
i0.ɵɵtext(11, "Source");
|
|
520
|
+
i0.ɵɵelementEnd();
|
|
521
|
+
i0.ɵɵelementStart(12, "div", 101);
|
|
522
|
+
i0.ɵɵelement(13, "i");
|
|
523
|
+
i0.ɵɵtext(14);
|
|
524
|
+
i0.ɵɵelementEnd()();
|
|
525
|
+
i0.ɵɵelementStart(15, "div", 100)(16, "label");
|
|
526
|
+
i0.ɵɵtext(17, "Action");
|
|
527
|
+
i0.ɵɵelementEnd();
|
|
528
|
+
i0.ɵɵelementStart(18, "div", 102);
|
|
529
|
+
i0.ɵɵtext(19, "Autotag and Vectorize Content");
|
|
530
|
+
i0.ɵɵelementEnd()();
|
|
531
|
+
i0.ɵɵelementStart(20, "div", 100)(21, "label", 103);
|
|
532
|
+
i0.ɵɵtext(22, "Cron Expression");
|
|
533
|
+
i0.ɵɵelementEnd();
|
|
534
|
+
i0.ɵɵelementStart(23, "input", 104);
|
|
535
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourcesTabComponent_Conditional_19_Template_input_ngModelChange_23_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleCron, $event) || (ctx_r2.ScheduleCron = $event); return i0.ɵɵresetView($event); });
|
|
536
|
+
i0.ɵɵelementEnd();
|
|
537
|
+
i0.ɵɵelementStart(24, "div", 105);
|
|
538
|
+
i0.ɵɵelement(25, "i", 106);
|
|
539
|
+
i0.ɵɵtext(26);
|
|
540
|
+
i0.ɵɵelementEnd()();
|
|
541
|
+
i0.ɵɵelementStart(27, "div", 107)(28, "label", 108);
|
|
542
|
+
i0.ɵɵtext(29, "Enabled");
|
|
543
|
+
i0.ɵɵelementEnd();
|
|
544
|
+
i0.ɵɵelementStart(30, "input", 109);
|
|
545
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourcesTabComponent_Conditional_19_Template_input_ngModelChange_30_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleEnabled, $event) || (ctx_r2.ScheduleEnabled = $event); return i0.ɵɵresetView($event); });
|
|
546
|
+
i0.ɵɵelementEnd()()();
|
|
547
|
+
i0.ɵɵelementStart(31, "div", 110)(32, "button", 111);
|
|
548
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_19_Template_button_click_32_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.SaveSchedule()); });
|
|
549
|
+
i0.ɵɵconditionalCreate(33, ClassifySourcesTabComponent_Conditional_19_Conditional_33_Template, 2, 0)(34, ClassifySourcesTabComponent_Conditional_19_Conditional_34_Template, 2, 0);
|
|
550
|
+
i0.ɵɵelementEnd();
|
|
551
|
+
i0.ɵɵelementStart(35, "button", 76);
|
|
552
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Conditional_19_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.CloseScheduleDialog()); });
|
|
553
|
+
i0.ɵɵtext(36, "Cancel");
|
|
554
|
+
i0.ɵɵelementEnd()()()();
|
|
555
|
+
} if (rf & 2) {
|
|
556
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
557
|
+
i0.ɵɵadvance(13);
|
|
558
|
+
i0.ɵɵclassMap(ctx_r2.SchedulingSourceCard.Icon);
|
|
559
|
+
i0.ɵɵadvance();
|
|
560
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.SchedulingSourceCard.Name, " ");
|
|
561
|
+
i0.ɵɵadvance(9);
|
|
562
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ScheduleCron);
|
|
563
|
+
i0.ɵɵadvance(3);
|
|
564
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.GetCronPreview(ctx_r2.ScheduleCron), " ");
|
|
565
|
+
i0.ɵɵadvance(4);
|
|
566
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ScheduleEnabled);
|
|
567
|
+
i0.ɵɵadvance(2);
|
|
568
|
+
i0.ɵɵproperty("disabled", ctx_r2.ScheduleSaving);
|
|
569
|
+
i0.ɵɵadvance();
|
|
570
|
+
i0.ɵɵconditional(ctx_r2.ScheduleSaving ? 33 : 34);
|
|
571
|
+
} }
|
|
572
|
+
export class ClassifySourcesTabComponent extends BaseAngularComponent {
|
|
573
|
+
cdr = inject(ChangeDetectorRef);
|
|
574
|
+
// ── Shared raw inputs (host is the data orchestrator) ──
|
|
575
|
+
/** Raw `MJ: Content Sources` rows — the primary source for the cards. */
|
|
576
|
+
_sources = [];
|
|
577
|
+
set Sources(value) {
|
|
578
|
+
this._sources = value ?? [];
|
|
579
|
+
this.rebuild();
|
|
580
|
+
}
|
|
581
|
+
get Sources() {
|
|
582
|
+
return this._sources;
|
|
583
|
+
}
|
|
584
|
+
/** Raw `MJ: Content Items` rows — used to count items per source. */
|
|
585
|
+
_items = [];
|
|
586
|
+
set Items(value) {
|
|
587
|
+
this._items = value ?? [];
|
|
588
|
+
this.rebuild();
|
|
589
|
+
}
|
|
590
|
+
get Items() {
|
|
591
|
+
return this._items;
|
|
592
|
+
}
|
|
593
|
+
/** Raw `MJ: Content Item Tags` rows — used to count tags per source. */
|
|
594
|
+
_tags = [];
|
|
595
|
+
set Tags(value) {
|
|
596
|
+
this._tags = value ?? [];
|
|
597
|
+
this.rebuild();
|
|
598
|
+
}
|
|
599
|
+
get Tags() {
|
|
600
|
+
return this._tags;
|
|
601
|
+
}
|
|
602
|
+
/** Raw `MJ: Content Process Runs` rows — used to derive last-run + status. */
|
|
603
|
+
_runs = [];
|
|
604
|
+
set Runs(value) {
|
|
605
|
+
this._runs = value ?? [];
|
|
606
|
+
this.rebuild();
|
|
607
|
+
}
|
|
608
|
+
get Runs() {
|
|
609
|
+
return this._runs;
|
|
610
|
+
}
|
|
611
|
+
/** Accurate total item count from TotalRowCount (used when a single source exists). */
|
|
612
|
+
_totalItemCount = 0;
|
|
613
|
+
set TotalItemCount(value) {
|
|
614
|
+
this._totalItemCount = value ?? 0;
|
|
615
|
+
this.rebuild();
|
|
616
|
+
}
|
|
617
|
+
get TotalItemCount() {
|
|
618
|
+
return this._totalItemCount;
|
|
619
|
+
}
|
|
620
|
+
/** Accurate total tag count from TotalRowCount (used when a single source exists). */
|
|
621
|
+
_totalTagCount = 0;
|
|
622
|
+
set TotalTagCount(value) {
|
|
623
|
+
this._totalTagCount = value ?? 0;
|
|
624
|
+
this.rebuild();
|
|
625
|
+
}
|
|
626
|
+
get TotalTagCount() {
|
|
627
|
+
return this._totalTagCount;
|
|
628
|
+
}
|
|
629
|
+
/** Cached ScheduledAction entities, keyed by normalized ID, supplied by the host. */
|
|
630
|
+
_scheduledActions = new Map();
|
|
631
|
+
set ScheduledActions(value) {
|
|
632
|
+
this._scheduledActions = value ?? new Map();
|
|
633
|
+
this.rebuild();
|
|
634
|
+
}
|
|
635
|
+
get ScheduledActions() {
|
|
636
|
+
return this._scheduledActions;
|
|
637
|
+
}
|
|
638
|
+
/** Cache: EntityRecordDocument ID → RecordID, supplied by the host. */
|
|
639
|
+
_entityRecordDocCache = new Map();
|
|
640
|
+
set EntityRecordDocCache(value) {
|
|
641
|
+
this._entityRecordDocCache = value ?? new Map();
|
|
642
|
+
}
|
|
643
|
+
get EntityRecordDocCache() {
|
|
644
|
+
return this._entityRecordDocCache;
|
|
645
|
+
}
|
|
646
|
+
// ── Tab-local view state ──
|
|
647
|
+
SourceCards = [];
|
|
648
|
+
// Source Detail slide-in
|
|
649
|
+
SelectedSource = null;
|
|
650
|
+
ShowSourceDetail = false;
|
|
651
|
+
SourceDetailLoading = false;
|
|
652
|
+
SourceDetailStatusFilter = 'All';
|
|
653
|
+
SourceDetailStatusOptions = ['All', 'Complete', 'Processing', 'Failed', 'Pending'];
|
|
654
|
+
SourceDetailPage = 0;
|
|
655
|
+
SourceDetailPageSize = 10;
|
|
656
|
+
// Dry-run preview dialog (hosted here, like the schedule + detail dialogs)
|
|
657
|
+
ShowDryRunPreview = false;
|
|
658
|
+
DryRunSourceCard = null;
|
|
659
|
+
// Schedule dialog
|
|
660
|
+
ShowScheduleDialog = false;
|
|
661
|
+
ScheduleSaving = false;
|
|
662
|
+
SchedulingSourceCard = null;
|
|
663
|
+
ScheduleCron = '0 2 * * *';
|
|
664
|
+
ScheduleEnabled = true;
|
|
665
|
+
/** Template-facing formatter. */
|
|
666
|
+
formatNumber = formatNumber;
|
|
667
|
+
// ── Cross-tab intents (host owns the slide-in form, navigation, pipeline) ──
|
|
668
|
+
/** Bubble "add source" up — host opens its slide-in CRUD form. */
|
|
669
|
+
AddSourceRequested = new EventEmitter();
|
|
670
|
+
/** Bubble "edit source" up — host opens its slide-in CRUD form pre-filled. */
|
|
671
|
+
EditSourceRequested = new EventEmitter();
|
|
672
|
+
/** Bubble "run pipeline for source" up — host runs the pipeline for the given source ID. */
|
|
673
|
+
RunSourceRequested = new EventEmitter();
|
|
674
|
+
/** Bubble "open content item detail" up — host owns the item-detail slide-in. */
|
|
675
|
+
OpenContentItemRequested = new EventEmitter();
|
|
676
|
+
/** Fired after a delete / schedule change so the host reloads the shared source list. */
|
|
677
|
+
DataChanged = new EventEmitter();
|
|
678
|
+
onAddSource() {
|
|
679
|
+
this.AddSourceRequested.emit();
|
|
680
|
+
}
|
|
681
|
+
onEditSource(card) {
|
|
682
|
+
this.EditSourceRequested.emit(card);
|
|
683
|
+
}
|
|
684
|
+
onRunSource(sourceID) {
|
|
685
|
+
this.RunSourceRequested.emit(sourceID);
|
|
686
|
+
}
|
|
687
|
+
// ── Dry-run preview (in-memory, nothing persisted) ──
|
|
688
|
+
/** Opens the dry-run disposition preview for a source. */
|
|
689
|
+
OpenDryRunPreview(card) {
|
|
690
|
+
this.DryRunSourceCard = card;
|
|
691
|
+
this.ShowDryRunPreview = true;
|
|
692
|
+
this.cdr.detectChanges();
|
|
693
|
+
}
|
|
694
|
+
CloseDryRunPreview() {
|
|
695
|
+
this.ShowDryRunPreview = false;
|
|
696
|
+
this.DryRunSourceCard = null;
|
|
697
|
+
this.cdr.detectChanges();
|
|
698
|
+
}
|
|
699
|
+
// ════════════════════════════════════════════
|
|
700
|
+
// SOURCE CARDS
|
|
701
|
+
// ════════════════════════════════════════════
|
|
702
|
+
/** Rebuild the source card view models from the current inputs. */
|
|
703
|
+
rebuild() {
|
|
704
|
+
const singleSource = this._sources.length === 1;
|
|
705
|
+
const itemCountBySource = singleSource ? null : this.countItemsBySource();
|
|
706
|
+
const tagCountBySource = singleSource ? null : this.countTagsBySource();
|
|
707
|
+
const lastRunBySource = this.getLastRunBySource();
|
|
708
|
+
this.SourceCards = this._sources.map(source => {
|
|
709
|
+
const id = source['ID'];
|
|
710
|
+
const itemCount = singleSource ? this._totalItemCount : (itemCountBySource.get(id) ?? 0);
|
|
711
|
+
const tagCount = singleSource ? this._totalTagCount : (tagCountBySource.get(id) ?? 0);
|
|
712
|
+
const avgTags = itemCount > 0 ? (tagCount / itemCount).toFixed(1) : '0';
|
|
713
|
+
const lastRun = lastRunBySource.get(id);
|
|
714
|
+
const typeName = source['ContentSourceType'] ?? 'Unknown';
|
|
715
|
+
const lastRunStatus = lastRun ? lastRun['Status']?.toLowerCase() : null;
|
|
716
|
+
const hasError = lastRunStatus === 'error' || lastRunStatus === 'failed';
|
|
717
|
+
const scheduledActionID = source['ScheduledActionID'] ?? null;
|
|
718
|
+
const scheduledActionName = source['ScheduledAction'] ?? null;
|
|
719
|
+
const cronExpr = scheduledActionID ? this.getScheduledActionCron(scheduledActionID) : null;
|
|
720
|
+
return {
|
|
721
|
+
ID: id,
|
|
722
|
+
Name: source['Name'] ?? 'Unnamed Source',
|
|
723
|
+
SourceTypeName: typeName,
|
|
724
|
+
ContentTypeName: source['ContentType'] ?? 'Unknown',
|
|
725
|
+
FileTypeName: source['ContentFileType'] ?? 'Unknown',
|
|
726
|
+
Icon: getSourceTypeIcon(typeName),
|
|
727
|
+
StatusClass: hasError ? 'error' : 'active',
|
|
728
|
+
StatusLabel: hasError ? 'Error' : 'Active',
|
|
729
|
+
URL: source['URL'] ?? '',
|
|
730
|
+
ItemCount: itemCount,
|
|
731
|
+
TagCount: tagCount,
|
|
732
|
+
AvgTags: avgTags,
|
|
733
|
+
LastRunAgo: lastRun ? this.formatRelativeTime(lastRun['StartTime']) : 'Never',
|
|
734
|
+
ContentSourceTypeID: source['ContentSourceTypeID'],
|
|
735
|
+
ContentTypeID: source['ContentTypeID'],
|
|
736
|
+
ContentFileTypeID: source['ContentFileTypeID'],
|
|
737
|
+
EmbeddingModelID: source['EmbeddingModelID'] ?? '',
|
|
738
|
+
VectorIndexID: source['VectorIndexID'] ?? '',
|
|
739
|
+
EntityID: source['EntityID'] ?? '',
|
|
740
|
+
EntityDocumentID: source['EntityDocumentID'] ?? '',
|
|
741
|
+
RequiresFileType: this.sourceTypeRequiresFileType(source['ContentSourceTypeID']),
|
|
742
|
+
ScheduledActionID: scheduledActionID,
|
|
743
|
+
ScheduledActionName: scheduledActionName,
|
|
744
|
+
ScheduleDescription: cronExpr ? CronToHumanReadable(cronExpr) : null,
|
|
745
|
+
};
|
|
746
|
+
});
|
|
747
|
+
this.cdr.detectChanges();
|
|
748
|
+
}
|
|
749
|
+
// ── Aggregation utilities (read only the raw inputs) ──
|
|
750
|
+
countItemsBySource() {
|
|
751
|
+
const counts = new Map();
|
|
752
|
+
for (const item of this._items) {
|
|
753
|
+
const sourceId = item['ContentSourceID'];
|
|
754
|
+
if (sourceId)
|
|
755
|
+
counts.set(sourceId, (counts.get(sourceId) ?? 0) + 1);
|
|
756
|
+
}
|
|
757
|
+
return counts;
|
|
758
|
+
}
|
|
759
|
+
countTagsBySource() {
|
|
760
|
+
const itemSourceMap = new Map();
|
|
761
|
+
for (const item of this._items) {
|
|
762
|
+
itemSourceMap.set(item['ID'], item['ContentSourceID']);
|
|
763
|
+
}
|
|
764
|
+
const counts = new Map();
|
|
765
|
+
for (const tag of this._tags) {
|
|
766
|
+
const sourceId = itemSourceMap.get(tag['ItemID']);
|
|
767
|
+
if (sourceId)
|
|
768
|
+
counts.set(sourceId, (counts.get(sourceId) ?? 0) + 1);
|
|
769
|
+
}
|
|
770
|
+
return counts;
|
|
771
|
+
}
|
|
772
|
+
getLastRunBySource() {
|
|
773
|
+
const map = new Map();
|
|
774
|
+
for (const run of this._runs) {
|
|
775
|
+
const sourceId = run['SourceID'];
|
|
776
|
+
if (sourceId && !map.has(sourceId)) {
|
|
777
|
+
map.set(sourceId, run);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
return map;
|
|
781
|
+
}
|
|
782
|
+
countTagsByItem() {
|
|
783
|
+
const counts = new Map();
|
|
784
|
+
for (const tag of this._tags) {
|
|
785
|
+
const itemId = NormalizeUUID(tag['ItemID']);
|
|
786
|
+
if (itemId)
|
|
787
|
+
counts.set(itemId, (counts.get(itemId) ?? 0) + 1);
|
|
788
|
+
}
|
|
789
|
+
return counts;
|
|
790
|
+
}
|
|
791
|
+
getAllWeightedTagsForItem(itemId) {
|
|
792
|
+
const tags = [];
|
|
793
|
+
for (const tag of this._tags) {
|
|
794
|
+
if (UUIDsEqual(tag['ItemID'], itemId)) {
|
|
795
|
+
tags.push({
|
|
796
|
+
Tag: tag['Tag'],
|
|
797
|
+
Weight: Number(tag['Weight'] ?? 1),
|
|
798
|
+
});
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
return tags.sort((a, b) => b.Weight - a.Weight);
|
|
802
|
+
}
|
|
803
|
+
/** Check if a source type's Configuration says RequiresFileType !== false */
|
|
804
|
+
sourceTypeRequiresFileType(sourceTypeID) {
|
|
805
|
+
try {
|
|
806
|
+
const engine = KnowledgeHubMetadataEngine.Instance;
|
|
807
|
+
const st = engine.ContentSourceTypes.find(t => UUIDsEqual(t.ID, sourceTypeID));
|
|
808
|
+
return st?.ConfigurationObject?.RequiresFileType !== false;
|
|
809
|
+
}
|
|
810
|
+
catch {
|
|
811
|
+
return true;
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
/** Resolve the entity record ID from the EntityRecordDocument for entity-sourced content items */
|
|
815
|
+
resolveEntityRecordID(item) {
|
|
816
|
+
const erdID = item['EntityRecordDocumentID'];
|
|
817
|
+
if (!erdID)
|
|
818
|
+
return null;
|
|
819
|
+
return this._entityRecordDocCache.get(NormalizeUUID(erdID)) ?? null;
|
|
820
|
+
}
|
|
821
|
+
/** Resolve the entity name for an entity-sourced content source */
|
|
822
|
+
resolveEntityName(sourceId) {
|
|
823
|
+
try {
|
|
824
|
+
const engine = KnowledgeHubMetadataEngine.Instance;
|
|
825
|
+
const source = engine.ContentSources.find(cs => UUIDsEqual(cs.ID, sourceId));
|
|
826
|
+
if (!source?.EntityID)
|
|
827
|
+
return null;
|
|
828
|
+
const md = this.ProviderToUse;
|
|
829
|
+
const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, source.EntityID));
|
|
830
|
+
return entityInfo?.Name ?? null;
|
|
831
|
+
}
|
|
832
|
+
catch {
|
|
833
|
+
return null;
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
resolveEmbeddingModelName(modelId) {
|
|
837
|
+
if (!modelId)
|
|
838
|
+
return 'System default';
|
|
839
|
+
const aiEngine = AIEngineBase.Instance;
|
|
840
|
+
const model = aiEngine.Models.find(m => UUIDsEqual(m.ID, modelId));
|
|
841
|
+
return model ? model.Name : 'Unknown';
|
|
842
|
+
}
|
|
843
|
+
resolveVectorIndexName(indexId) {
|
|
844
|
+
if (!indexId)
|
|
845
|
+
return 'System default';
|
|
846
|
+
const engine = KnowledgeHubMetadataEngine.Instance;
|
|
847
|
+
const idx = engine.GetVectorIndexById(indexId);
|
|
848
|
+
return idx ? idx.Name : 'Unknown';
|
|
849
|
+
}
|
|
850
|
+
/**
|
|
851
|
+
* Infer embedding and tagging pipeline statuses for a content item. Uses tag
|
|
852
|
+
* count + run-history heuristics since dedicated status columns are not yet
|
|
853
|
+
* available on the ContentItem entity.
|
|
854
|
+
*/
|
|
855
|
+
inferPipelineStatuses(rawItem, tagCount) {
|
|
856
|
+
const explicitEmbedding = rawItem['EmbeddingStatus'];
|
|
857
|
+
const explicitTagging = rawItem['TaggingStatus'];
|
|
858
|
+
if (explicitEmbedding || explicitTagging) {
|
|
859
|
+
return {
|
|
860
|
+
EmbeddingStatus: this.mapStatusString(explicitEmbedding),
|
|
861
|
+
TaggingStatus: this.mapStatusString(explicitTagging),
|
|
862
|
+
};
|
|
863
|
+
}
|
|
864
|
+
const hasChecksum = !!rawItem['Checksum'];
|
|
865
|
+
const hasText = !!(rawItem['Text']?.trim());
|
|
866
|
+
const sourceID = rawItem['ContentSourceID'];
|
|
867
|
+
const lastRun = this._runs.find(r => r['SourceID'] === sourceID);
|
|
868
|
+
const lastRunFailed = lastRun &&
|
|
869
|
+
(lastRun['Status']?.toLowerCase() === 'error' ||
|
|
870
|
+
lastRun['Status']?.toLowerCase() === 'failed');
|
|
871
|
+
let embeddingStatus = 'Pending';
|
|
872
|
+
if (hasChecksum || hasText)
|
|
873
|
+
embeddingStatus = 'Complete';
|
|
874
|
+
else if (lastRunFailed)
|
|
875
|
+
embeddingStatus = 'Failed';
|
|
876
|
+
let taggingStatus = 'Pending';
|
|
877
|
+
if (tagCount > 0)
|
|
878
|
+
taggingStatus = 'Complete';
|
|
879
|
+
else if (embeddingStatus === 'Complete')
|
|
880
|
+
taggingStatus = lastRunFailed ? 'Failed' : 'Pending';
|
|
881
|
+
else if (lastRunFailed)
|
|
882
|
+
taggingStatus = 'Failed';
|
|
883
|
+
return { EmbeddingStatus: embeddingStatus, TaggingStatus: taggingStatus };
|
|
884
|
+
}
|
|
885
|
+
mapStatusString(status) {
|
|
886
|
+
if (!status)
|
|
887
|
+
return 'Pending';
|
|
888
|
+
const lower = status.toLowerCase();
|
|
889
|
+
if (lower === 'complete' || lower === 'completed' || lower === 'done')
|
|
890
|
+
return 'Complete';
|
|
891
|
+
if (lower === 'processing' || lower === 'running')
|
|
892
|
+
return 'Processing';
|
|
893
|
+
if (lower === 'failed' || lower === 'error')
|
|
894
|
+
return 'Failed';
|
|
895
|
+
return 'Pending';
|
|
896
|
+
}
|
|
897
|
+
formatRelativeTime(dateStr) {
|
|
898
|
+
if (!dateStr)
|
|
899
|
+
return 'Never';
|
|
900
|
+
const now = new Date();
|
|
901
|
+
const then = new Date(dateStr);
|
|
902
|
+
const diffMs = now.getTime() - then.getTime();
|
|
903
|
+
const diffMins = Math.floor(diffMs / 60000);
|
|
904
|
+
if (diffMins < 1)
|
|
905
|
+
return 'Just now';
|
|
906
|
+
if (diffMins < 60)
|
|
907
|
+
return `${diffMins}m ago`;
|
|
908
|
+
const diffHours = Math.floor(diffMins / 60);
|
|
909
|
+
if (diffHours < 24)
|
|
910
|
+
return `${diffHours}h ago`;
|
|
911
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
912
|
+
return `${diffDays}d ago`;
|
|
913
|
+
}
|
|
914
|
+
/** Looks up the cron expression for a cached ScheduledAction by ID */
|
|
915
|
+
getScheduledActionCron(scheduledActionID) {
|
|
916
|
+
const cached = this._scheduledActions.get(NormalizeUUID(scheduledActionID));
|
|
917
|
+
return cached?.CronExpression ?? null;
|
|
918
|
+
}
|
|
919
|
+
/** Returns the CSS class for a pipeline status badge color */
|
|
920
|
+
GetStatusBadgeClass(status) {
|
|
921
|
+
switch (status) {
|
|
922
|
+
case 'Complete': return 'at-status-badge-complete';
|
|
923
|
+
case 'Processing': return 'at-status-badge-processing';
|
|
924
|
+
case 'Failed': return 'at-status-badge-failed';
|
|
925
|
+
case 'Pending': return 'at-status-badge-pending';
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
// ════════════════════════════════════════════
|
|
929
|
+
// DELETE
|
|
930
|
+
// ════════════════════════════════════════════
|
|
931
|
+
async DeleteSource(card) {
|
|
932
|
+
if (!confirm(`Delete source "${card.Name}"? This cannot be undone.`))
|
|
933
|
+
return;
|
|
934
|
+
try {
|
|
935
|
+
const p = this.ProviderToUse;
|
|
936
|
+
const entity = await p.GetEntityObject('MJ: Content Sources', p.CurrentUser);
|
|
937
|
+
await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: card.ID }]));
|
|
938
|
+
const deleted = await entity.Delete();
|
|
939
|
+
if (deleted) {
|
|
940
|
+
MJNotificationService.Instance.CreateSimpleNotification('Source deleted', 'success', 2500);
|
|
941
|
+
this.DataChanged.emit();
|
|
942
|
+
}
|
|
943
|
+
else {
|
|
944
|
+
MJNotificationService.Instance.CreateSimpleNotification('Failed to delete source', 'error', 3000);
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
catch (error) {
|
|
948
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
949
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
// ════════════════════════════════════════════
|
|
953
|
+
// SCHEDULE DIALOG — Quick Schedule for Source
|
|
954
|
+
// ════════════════════════════════════════════
|
|
955
|
+
OpenScheduleDialog(card) {
|
|
956
|
+
this.SchedulingSourceCard = card;
|
|
957
|
+
this.ScheduleCron = '0 2 * * *';
|
|
958
|
+
this.ScheduleEnabled = true;
|
|
959
|
+
this.ShowScheduleDialog = true;
|
|
960
|
+
this.cdr.detectChanges();
|
|
961
|
+
}
|
|
962
|
+
CloseScheduleDialog() {
|
|
963
|
+
this.ShowScheduleDialog = false;
|
|
964
|
+
this.SchedulingSourceCard = null;
|
|
965
|
+
this.cdr.detectChanges();
|
|
966
|
+
}
|
|
967
|
+
/**
|
|
968
|
+
* Saves a new ScheduledAction for the current source, links it via
|
|
969
|
+
* ContentSource.ScheduledActionID, and creates the default action params
|
|
970
|
+
* for the Autotag and Vectorize action.
|
|
971
|
+
*/
|
|
972
|
+
async SaveSchedule() {
|
|
973
|
+
if (this.ScheduleSaving || !this.SchedulingSourceCard)
|
|
974
|
+
return;
|
|
975
|
+
this.ScheduleSaving = true;
|
|
976
|
+
this.cdr.detectChanges();
|
|
977
|
+
const card = this.SchedulingSourceCard;
|
|
978
|
+
try {
|
|
979
|
+
const p = this.ProviderToUse;
|
|
980
|
+
// 1. Find the "Autotag and Vectorize Content" action
|
|
981
|
+
const actionID = await this.findAutotagActionID();
|
|
982
|
+
if (!actionID) {
|
|
983
|
+
MJNotificationService.Instance.CreateSimpleNotification('Could not find the "Autotag and Vectorize Content" action. Please check action configuration.', 'error', 5000);
|
|
984
|
+
return;
|
|
985
|
+
}
|
|
986
|
+
// 2. Create the ScheduledAction
|
|
987
|
+
const scheduledAction = await p.GetEntityObject('MJ: Scheduled Actions', p.CurrentUser);
|
|
988
|
+
scheduledAction.NewRecord();
|
|
989
|
+
scheduledAction.Name = `Autotag: ${card.Name}`;
|
|
990
|
+
scheduledAction.Description = `Automated classification pipeline for content source "${card.Name}"`;
|
|
991
|
+
scheduledAction.ActionID = actionID;
|
|
992
|
+
scheduledAction.Type = 'Custom';
|
|
993
|
+
scheduledAction.CronExpression = this.ScheduleCron;
|
|
994
|
+
scheduledAction.CustomCronExpression = this.ScheduleCron;
|
|
995
|
+
scheduledAction.Status = this.ScheduleEnabled ? 'Active' : 'Disabled';
|
|
996
|
+
scheduledAction.Timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
997
|
+
const saved = await scheduledAction.Save();
|
|
998
|
+
if (!saved) {
|
|
999
|
+
const errorDetail = scheduledAction.LatestResult?.CompleteMessage ?? 'Unknown error';
|
|
1000
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Failed to create schedule: ${errorDetail}`, 'error', 5000);
|
|
1001
|
+
return;
|
|
1002
|
+
}
|
|
1003
|
+
// 3. Create ScheduledActionParam for sourceIDs
|
|
1004
|
+
await this.createSourceIDParam(scheduledAction.ID, actionID, card.ID);
|
|
1005
|
+
// 4. Link ScheduledAction to ContentSource
|
|
1006
|
+
await this.linkScheduleToSource(card.ID, scheduledAction.ID);
|
|
1007
|
+
// 5. Cache the new action for cron display
|
|
1008
|
+
this._scheduledActions.set(NormalizeUUID(scheduledAction.ID), scheduledAction);
|
|
1009
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Schedule created: ${CronToHumanReadable(this.ScheduleCron)}`, 'success', 3000);
|
|
1010
|
+
this.CloseScheduleDialog();
|
|
1011
|
+
this.DataChanged.emit();
|
|
1012
|
+
}
|
|
1013
|
+
catch (error) {
|
|
1014
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
1015
|
+
console.error('[Classify] Schedule creation error:', error);
|
|
1016
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);
|
|
1017
|
+
}
|
|
1018
|
+
finally {
|
|
1019
|
+
this.ScheduleSaving = false;
|
|
1020
|
+
this.cdr.detectChanges();
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
/**
|
|
1024
|
+
* Removes the schedule from a source card by unlinking the ScheduledActionID.
|
|
1025
|
+
*/
|
|
1026
|
+
async RemoveSchedule(card) {
|
|
1027
|
+
if (!card.ScheduledActionID)
|
|
1028
|
+
return;
|
|
1029
|
+
if (!confirm(`Remove the schedule "${card.ScheduleDescription ?? 'schedule'}" from "${card.Name}"?`))
|
|
1030
|
+
return;
|
|
1031
|
+
try {
|
|
1032
|
+
await this.linkScheduleToSource(card.ID, null);
|
|
1033
|
+
MJNotificationService.Instance.CreateSimpleNotification('Schedule removed from source', 'success', 2500);
|
|
1034
|
+
this.DataChanged.emit();
|
|
1035
|
+
}
|
|
1036
|
+
catch (error) {
|
|
1037
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
1038
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
/** Returns the human-readable schedule description for a source card. */
|
|
1042
|
+
GetScheduleLabel(card) {
|
|
1043
|
+
return card.ScheduleDescription ?? 'Scheduled';
|
|
1044
|
+
}
|
|
1045
|
+
/** Returns a human-readable preview of a cron expression for the schedule dialog. */
|
|
1046
|
+
GetCronPreview(cron) {
|
|
1047
|
+
return CronToHumanReadable(cron);
|
|
1048
|
+
}
|
|
1049
|
+
/** Finds the Action ID for "Autotag and Vectorize Content" by querying actions */
|
|
1050
|
+
async findAutotagActionID() {
|
|
1051
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
1052
|
+
const result = await rv.RunView({
|
|
1053
|
+
EntityName: 'Actions',
|
|
1054
|
+
ExtraFilter: `Name = 'Autotag and Vectorize Content'`,
|
|
1055
|
+
Fields: ['ID'],
|
|
1056
|
+
ResultType: 'simple',
|
|
1057
|
+
MaxRows: 1,
|
|
1058
|
+
});
|
|
1059
|
+
if (result.Success && result.Results.length > 0) {
|
|
1060
|
+
return result.Results[0].ID;
|
|
1061
|
+
}
|
|
1062
|
+
return null;
|
|
1063
|
+
}
|
|
1064
|
+
/**
|
|
1065
|
+
* Creates a ScheduledActionParam that passes the source ID to the action.
|
|
1066
|
+
* Looks up the "EntityNames" action param and sets the source ID as its value.
|
|
1067
|
+
*/
|
|
1068
|
+
async createSourceIDParam(scheduledActionID, actionID, sourceID) {
|
|
1069
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
1070
|
+
const paramResult = await rv.RunView({
|
|
1071
|
+
EntityName: 'Action Params',
|
|
1072
|
+
ExtraFilter: `ActionID = '${actionID}' AND Name = 'EntityNames'`,
|
|
1073
|
+
Fields: ['ID', 'Name'],
|
|
1074
|
+
ResultType: 'simple',
|
|
1075
|
+
MaxRows: 1,
|
|
1076
|
+
});
|
|
1077
|
+
if (!paramResult.Success || paramResult.Results.length === 0) {
|
|
1078
|
+
console.warn('[Classify] Could not find EntityNames action param for source ID scheduling');
|
|
1079
|
+
return;
|
|
1080
|
+
}
|
|
1081
|
+
const p = this.ProviderToUse;
|
|
1082
|
+
const param = await p.GetEntityObject('MJ: Scheduled Action Params', p.CurrentUser);
|
|
1083
|
+
param.NewRecord();
|
|
1084
|
+
param.ScheduledActionID = scheduledActionID;
|
|
1085
|
+
param.ActionParamID = paramResult.Results[0].ID;
|
|
1086
|
+
param.ValueType = 'Static';
|
|
1087
|
+
param.Value = sourceID;
|
|
1088
|
+
const saved = await param.Save();
|
|
1089
|
+
if (!saved) {
|
|
1090
|
+
console.warn('[Classify] Failed to save schedule param:', param.LatestResult?.CompleteMessage);
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
/**
|
|
1094
|
+
* Links (or unlinks) a ScheduledAction to a ContentSource by updating
|
|
1095
|
+
* the ContentSource.ScheduledActionID field.
|
|
1096
|
+
*/
|
|
1097
|
+
async linkScheduleToSource(sourceID, scheduledActionID) {
|
|
1098
|
+
const p = this.ProviderToUse;
|
|
1099
|
+
const entity = await p.GetEntityObject('MJ: Content Sources', p.CurrentUser);
|
|
1100
|
+
await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: sourceID }]));
|
|
1101
|
+
entity.ScheduledActionID = scheduledActionID;
|
|
1102
|
+
const saved = await entity.Save();
|
|
1103
|
+
if (!saved) {
|
|
1104
|
+
throw new Error(entity.LatestResult?.CompleteMessage ?? 'Failed to update content source');
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
// ════════════════════════════════════════════
|
|
1108
|
+
// SOURCE DETAIL SLIDE-IN
|
|
1109
|
+
// ════════════════════════════════════════════
|
|
1110
|
+
async OpenSourceDetail(card) {
|
|
1111
|
+
this.SourceDetailLoading = true;
|
|
1112
|
+
this.SourceDetailPage = 0;
|
|
1113
|
+
this.SourceDetailStatusFilter = 'All';
|
|
1114
|
+
this.ShowSourceDetail = true;
|
|
1115
|
+
this.cdr.detectChanges();
|
|
1116
|
+
try {
|
|
1117
|
+
const sourceItems = await this.loadContentItemsForSource(card.ID);
|
|
1118
|
+
const sourceRuns = await this.loadRunHistoryForSource(card.ID);
|
|
1119
|
+
const embeddingModelName = this.resolveEmbeddingModelName(card.EmbeddingModelID);
|
|
1120
|
+
const vectorIndexName = this.resolveVectorIndexName(card.VectorIndexID);
|
|
1121
|
+
const errorCount = sourceRuns.filter(r => r.StatusClass === 'failed').length;
|
|
1122
|
+
this.SelectedSource = {
|
|
1123
|
+
ID: card.ID,
|
|
1124
|
+
Name: card.Name,
|
|
1125
|
+
SourceTypeName: card.SourceTypeName,
|
|
1126
|
+
FileTypeName: card.FileTypeName,
|
|
1127
|
+
ContentTypeName: card.ContentTypeName,
|
|
1128
|
+
RequiresFileType: card.RequiresFileType,
|
|
1129
|
+
StatusClass: card.StatusClass,
|
|
1130
|
+
StatusLabel: card.StatusLabel,
|
|
1131
|
+
Icon: card.Icon,
|
|
1132
|
+
URL: card.URL,
|
|
1133
|
+
EmbeddingModelName: embeddingModelName,
|
|
1134
|
+
VectorIndexName: vectorIndexName,
|
|
1135
|
+
ItemCount: card.ItemCount,
|
|
1136
|
+
TagCount: card.TagCount,
|
|
1137
|
+
AvgTags: card.AvgTags,
|
|
1138
|
+
LastRunAgo: card.LastRunAgo,
|
|
1139
|
+
ErrorCount: errorCount,
|
|
1140
|
+
ContentItems: sourceItems,
|
|
1141
|
+
RunHistory: sourceRuns
|
|
1142
|
+
};
|
|
1143
|
+
}
|
|
1144
|
+
catch (error) {
|
|
1145
|
+
console.error('[Autotagging] Error loading source detail:', error);
|
|
1146
|
+
}
|
|
1147
|
+
finally {
|
|
1148
|
+
this.SourceDetailLoading = false;
|
|
1149
|
+
this.cdr.detectChanges();
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
CloseSourceDetail() {
|
|
1153
|
+
this.ShowSourceDetail = false;
|
|
1154
|
+
this.SelectedSource = null;
|
|
1155
|
+
this.cdr.detectChanges();
|
|
1156
|
+
}
|
|
1157
|
+
OpenContentItemDetail(item) {
|
|
1158
|
+
this.OpenContentItemRequested.emit(item);
|
|
1159
|
+
}
|
|
1160
|
+
OpenEditSourceFromDetail() {
|
|
1161
|
+
if (!this.SelectedSource)
|
|
1162
|
+
return;
|
|
1163
|
+
const card = this.SourceCards.find(c => UUIDsEqual(c.ID, this.SelectedSource.ID));
|
|
1164
|
+
if (card) {
|
|
1165
|
+
this.CloseSourceDetail();
|
|
1166
|
+
this.EditSourceRequested.emit(card);
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
RunSourceFromDetail() {
|
|
1170
|
+
if (!this.SelectedSource)
|
|
1171
|
+
return;
|
|
1172
|
+
const sourceID = this.SelectedSource.ID;
|
|
1173
|
+
this.CloseSourceDetail();
|
|
1174
|
+
this.RunSourceRequested.emit(sourceID);
|
|
1175
|
+
}
|
|
1176
|
+
async DeleteSourceFromDetail() {
|
|
1177
|
+
if (!this.SelectedSource)
|
|
1178
|
+
return;
|
|
1179
|
+
const card = this.SourceCards.find(c => UUIDsEqual(c.ID, this.SelectedSource.ID));
|
|
1180
|
+
if (card) {
|
|
1181
|
+
this.CloseSourceDetail();
|
|
1182
|
+
await this.DeleteSource(card);
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
// ── Source-detail filtering + pagination ──
|
|
1186
|
+
get FilteredSourceDetailItems() {
|
|
1187
|
+
if (!this.SelectedSource)
|
|
1188
|
+
return [];
|
|
1189
|
+
const items = this.SourceDetailStatusFilter === 'All'
|
|
1190
|
+
? this.SelectedSource.ContentItems
|
|
1191
|
+
: this.SelectedSource.ContentItems.filter(ci => ci.EmbeddingStatus === this.SourceDetailStatusFilter ||
|
|
1192
|
+
ci.TaggingStatus === this.SourceDetailStatusFilter);
|
|
1193
|
+
const start = this.SourceDetailPage * this.SourceDetailPageSize;
|
|
1194
|
+
return items.slice(start, start + this.SourceDetailPageSize);
|
|
1195
|
+
}
|
|
1196
|
+
get FilteredSourceDetailTotal() {
|
|
1197
|
+
if (!this.SelectedSource)
|
|
1198
|
+
return 0;
|
|
1199
|
+
if (this.SourceDetailStatusFilter === 'All')
|
|
1200
|
+
return this.SelectedSource.ContentItems.length;
|
|
1201
|
+
return this.SelectedSource.ContentItems.filter(ci => ci.EmbeddingStatus === this.SourceDetailStatusFilter ||
|
|
1202
|
+
ci.TaggingStatus === this.SourceDetailStatusFilter).length;
|
|
1203
|
+
}
|
|
1204
|
+
get SourceDetailTotalPages() {
|
|
1205
|
+
return Math.max(1, Math.ceil(this.FilteredSourceDetailTotal / this.SourceDetailPageSize));
|
|
1206
|
+
}
|
|
1207
|
+
SourceDetailPrevPage() {
|
|
1208
|
+
if (this.SourceDetailPage > 0) {
|
|
1209
|
+
this.SourceDetailPage--;
|
|
1210
|
+
this.cdr.detectChanges();
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
SourceDetailNextPage() {
|
|
1214
|
+
if (this.SourceDetailPage < this.SourceDetailTotalPages - 1) {
|
|
1215
|
+
this.SourceDetailPage++;
|
|
1216
|
+
this.cdr.detectChanges();
|
|
1217
|
+
}
|
|
1218
|
+
}
|
|
1219
|
+
OnSourceDetailStatusFilterChange() {
|
|
1220
|
+
this.SourceDetailPage = 0;
|
|
1221
|
+
this.cdr.detectChanges();
|
|
1222
|
+
}
|
|
1223
|
+
/**
|
|
1224
|
+
* Placeholder handler for retrying failed items in source detail. Surfaces a
|
|
1225
|
+
* notification; the pipeline re-processes failed items on the next run.
|
|
1226
|
+
*/
|
|
1227
|
+
RetryFailedItems() {
|
|
1228
|
+
if (!this.SelectedSource)
|
|
1229
|
+
return;
|
|
1230
|
+
const failedCount = this.SelectedSource.ContentItems.filter(ci => ci.EmbeddingStatus === 'Failed' || ci.TaggingStatus === 'Failed').length;
|
|
1231
|
+
if (failedCount === 0) {
|
|
1232
|
+
MJNotificationService.Instance.CreateSimpleNotification('No failed items to retry', 'info', 2500);
|
|
1233
|
+
return;
|
|
1234
|
+
}
|
|
1235
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Retry queued for ${failedCount} failed item${failedCount > 1 ? 's' : ''}. Pipeline will re-process on next run.`, 'info', 3000);
|
|
1236
|
+
}
|
|
1237
|
+
async loadContentItemsForSource(sourceId) {
|
|
1238
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
1239
|
+
const result = await rv.RunView({
|
|
1240
|
+
EntityName: 'MJ: Content Items',
|
|
1241
|
+
ExtraFilter: `ContentSourceID='${sourceId}'`,
|
|
1242
|
+
OrderBy: '__mj_UpdatedAt DESC',
|
|
1243
|
+
MaxRows: 100,
|
|
1244
|
+
ResultType: 'simple'
|
|
1245
|
+
});
|
|
1246
|
+
if (!result.Success)
|
|
1247
|
+
return [];
|
|
1248
|
+
const tagsByItem = this.countTagsByItem();
|
|
1249
|
+
return result.Results.map(item => {
|
|
1250
|
+
const itemId = item['ID'];
|
|
1251
|
+
const allTags = this.getAllWeightedTagsForItem(itemId);
|
|
1252
|
+
const tagCount = tagsByItem.get(itemId) ?? allTags.length;
|
|
1253
|
+
const contentSourceTypeID = item['ContentSourceTypeID'] ?? '';
|
|
1254
|
+
const itemStatuses = this.inferPipelineStatuses(item, tagCount);
|
|
1255
|
+
return {
|
|
1256
|
+
ID: itemId,
|
|
1257
|
+
Name: item['Name'] ?? 'Unnamed',
|
|
1258
|
+
SourceName: item['ContentSource'] ?? '',
|
|
1259
|
+
SourceTypeName: item['ContentSourceType'] ?? '',
|
|
1260
|
+
ContentTypeName: item['ContentType'] ?? '',
|
|
1261
|
+
FileTypeName: item['ContentFileType'] ?? '',
|
|
1262
|
+
URL: item['URL'] ?? '',
|
|
1263
|
+
TextContent: item['Text'] ?? '',
|
|
1264
|
+
Checksum: item['Checksum'] ?? '',
|
|
1265
|
+
Tags: allTags,
|
|
1266
|
+
CreatedAt: formatDate(item['__mj_CreatedAt'] ?? ''),
|
|
1267
|
+
UpdatedAt: formatDate(item['__mj_UpdatedAt'] ?? ''),
|
|
1268
|
+
ContentSourceID: sourceId,
|
|
1269
|
+
ContentSourceTypeID: contentSourceTypeID,
|
|
1270
|
+
StatusDot: tagCount > 0 ? 'complete' : 'processing',
|
|
1271
|
+
TagCount: tagCount,
|
|
1272
|
+
RequiresContentType: this.sourceTypeRequiresFileType(contentSourceTypeID),
|
|
1273
|
+
EntityRecordID: this.resolveEntityRecordID(item),
|
|
1274
|
+
EntityName: this.resolveEntityName(sourceId),
|
|
1275
|
+
EmbeddingStatus: itemStatuses.EmbeddingStatus,
|
|
1276
|
+
TaggingStatus: itemStatuses.TaggingStatus,
|
|
1277
|
+
};
|
|
1278
|
+
});
|
|
1279
|
+
}
|
|
1280
|
+
async loadRunHistoryForSource(sourceId) {
|
|
1281
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
1282
|
+
const result = await rv.RunView({
|
|
1283
|
+
EntityName: 'MJ: Content Process Runs',
|
|
1284
|
+
ExtraFilter: `SourceID='${sourceId}'`,
|
|
1285
|
+
OrderBy: 'StartTime DESC',
|
|
1286
|
+
MaxRows: 10,
|
|
1287
|
+
ResultType: 'simple'
|
|
1288
|
+
});
|
|
1289
|
+
if (!result.Success)
|
|
1290
|
+
return [];
|
|
1291
|
+
return result.Results.map(run => {
|
|
1292
|
+
const status = run['Status'] ?? 'Unknown';
|
|
1293
|
+
const startTime = run['StartTime'];
|
|
1294
|
+
const endTime = run['EndTime'];
|
|
1295
|
+
const duration = computeDuration(startTime, endTime);
|
|
1296
|
+
const processedItems = run['ProcessedItems'];
|
|
1297
|
+
const errorCount = run['ErrorCount'];
|
|
1298
|
+
const statusLower = status.toLowerCase();
|
|
1299
|
+
const isFailed = statusLower === 'error' || statusLower === 'failed';
|
|
1300
|
+
const isRunning = statusLower === 'running' || statusLower === 'processing';
|
|
1301
|
+
const hasErrors = (errorCount ?? 0) > 0;
|
|
1302
|
+
return {
|
|
1303
|
+
ID: run['ID'],
|
|
1304
|
+
Status: displayStatus(status),
|
|
1305
|
+
StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',
|
|
1306
|
+
SourceName: run['Source'] ?? 'Unknown',
|
|
1307
|
+
StartedDisplay: startTime ? formatDate(startTime) : '—',
|
|
1308
|
+
Duration: duration,
|
|
1309
|
+
Items: processedItems != null ? formatNumber(processedItems) : '—',
|
|
1310
|
+
Tags: '—',
|
|
1311
|
+
Errors: hasErrors ? formatNumber(errorCount) : (isFailed ? status : '0'),
|
|
1312
|
+
ErrorClass: isFailed || hasErrors ? 'run-error-text' : ''
|
|
1313
|
+
};
|
|
1314
|
+
});
|
|
1315
|
+
}
|
|
1316
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵClassifySourcesTabComponent_BaseFactory; return function ClassifySourcesTabComponent_Factory(__ngFactoryType__) { return (ɵClassifySourcesTabComponent_BaseFactory || (ɵClassifySourcesTabComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ClassifySourcesTabComponent)))(__ngFactoryType__ || ClassifySourcesTabComponent); }; })();
|
|
1317
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassifySourcesTabComponent, selectors: [["classify-sources-tab"]], inputs: { Sources: "Sources", Items: "Items", Tags: "Tags", Runs: "Runs", TotalItemCount: "TotalItemCount", TotalTagCount: "TotalTagCount", ScheduledActions: "ScheduledActions", EntityRecordDocCache: "EntityRecordDocCache" }, outputs: { AddSourceRequested: "AddSourceRequested", EditSourceRequested: "EditSourceRequested", RunSourceRequested: "RunSourceRequested", OpenContentItemRequested: "OpenContentItemRequested", DataChanged: "DataChanged" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 21, vars: 7, consts: [["Title", "Content Sources", "Subtitle", "Configure where content is ingested from"], ["actions", ""], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "mj-action-label"], [3, "Padding", "Flex"], [1, "at-main-area"], [1, "at-page-body"], [1, "at-sources-grid"], [1, "at-source-card-full", "at-source-card-clickable"], [1, "at-add-source-card", 3, "click"], [1, "fa-solid", "fa-plus-circle"], [2, "font-size", "0.85rem", "font-weight", "600"], [2, "font-size", "0.72rem"], [1, "at-schedule-overlay"], [3, "Closed", "Provider", "Show", "SourceCard"], [1, "at-source-card-full", "at-source-card-clickable", 3, "click"], [1, "at-source-card-header"], [1, "at-source-card-icon"], [1, "at-source-card-title"], [1, "at-source-card-type"], [1, "at-source-card-status"], [1, "at-source-mini-status"], [1, "at-source-card-url"], [1, "at-source-card-stats"], [1, "at-source-stat"], [1, "at-source-stat-value"], [1, "at-source-stat-label"], ["title", "Click to remove schedule", 1, "at-schedule-indicator"], [1, "at-source-card-actions"], [1, "at-source-action-btn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-play"], [1, "fa-solid", "fa-flask"], [1, "at-source-action-btn", "at-source-schedule-btn"], [1, "at-source-action-btn", "at-source-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash"], ["title", "Click to remove schedule", 1, "at-schedule-indicator", 3, "click"], [1, "fa-regular", "fa-clock"], [1, "at-source-action-btn", "at-source-schedule-btn", 3, "click"], [1, "at-slide-overlay", 3, "click"], [1, "at-slide-panel", "at-detail-panel"], [1, "at-slide-header"], [1, "fa-solid", "fa-database"], ["aria-label", "Close source detail", 1, "at-slide-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "at-slide-body"], [1, "at-loading-overlay"], ["text", "Loading source details..."], [1, "at-detail-source-header"], [1, "at-detail-item-name"], [1, "at-detail-badges"], [1, "at-detail-badge", "at-detail-badge-type"], [1, "at-detail-badge"], [1, "at-detail-section"], [1, "at-detail-section-label"], [1, "at-detail-meta-grid"], [1, "at-detail-meta-row"], [1, "at-detail-meta-key"], [1, "at-detail-meta-value"], [1, "at-detail-stats-strip"], [1, "at-detail-stat"], [1, "at-detail-stat-value"], [1, "at-detail-stat-label"], [1, "at-detail-section-header-row"], [1, "at-detail-section-controls"], [1, "at-detail-filter-select", 3, "ngModelChange", "ngModel"], [3, "value"], ["title", "Re-queue failed items for processing", 1, "at-action-btn", "at-retry-btn", 3, "click"], [1, "fa-solid", "fa-rotate-right"], [1, "at-detail-content-list"], [1, "at-empty-state", 2, "padding", "16px"], [1, "at-detail-content-item"], [1, "at-detail-pagination"], [1, "at-detail-actions"], [1, "at-action-btn", "at-primary-btn", 3, "click"], [1, "at-action-btn", "at-secondary-btn", 3, "click"], [1, "at-action-btn", "at-secondary-btn", "at-source-delete-btn", 3, "click"], ["target", "_blank", 1, "at-detail-link", "at-detail-meta-value", 3, "href"], [1, "at-detail-content-item", 3, "click"], [1, "at-feed-status-dot"], [1, "at-detail-content-item-name"], [1, "at-status-badge"], [1, "at-detail-content-item-tags"], [1, "at-detail-content-item-time"], [1, "at-page-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-left"], [1, "at-page-info"], [1, "fa-solid", "fa-chevron-right"], [1, "at-detail-run-history"], [1, "at-detail-run-row"], [1, "at-run-status-badge"], [1, "at-detail-run-time"], [1, "at-detail-run-duration"], [1, "at-detail-run-items"], [1, "at-schedule-overlay", 3, "click"], [1, "at-schedule-dialog", 3, "click"], [1, "at-schedule-dialog-header"], ["aria-label", "Close", 1, "at-schedule-dialog-close", 3, "click"], [1, "at-schedule-dialog-body"], [1, "at-schedule-field"], [1, "at-schedule-source-name"], [1, "at-schedule-action-name"], ["for", "schedule-cron"], ["id", "schedule-cron", "type", "text", "placeholder", "0 2 * * *", 1, "mj-input", "at-schedule-cron-input", 3, "ngModelChange", "ngModel"], [1, "at-schedule-cron-preview"], [1, "fa-solid", "fa-info-circle"], [1, "at-schedule-field", "at-schedule-toggle-row"], ["for", "schedule-enabled"], ["id", "schedule-enabled", "type", "checkbox", 1, "mj-checkbox", 3, "ngModelChange", "ngModel"], [1, "at-schedule-dialog-footer"], [1, "at-action-btn", "at-primary-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-check"]], template: function ClassifySourcesTabComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1318
|
+
i0.ɵɵelementStart(0, "mj-page-header-interior", 0)(1, "div", 1)(2, "button", 2);
|
|
1319
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Template_button_click_2_listener() { return ctx.onAddSource(); });
|
|
1320
|
+
i0.ɵɵelement(3, "i", 3);
|
|
1321
|
+
i0.ɵɵelementStart(4, "span", 4);
|
|
1322
|
+
i0.ɵɵtext(5, "Add Source");
|
|
1323
|
+
i0.ɵɵelementEnd()()()();
|
|
1324
|
+
i0.ɵɵelementStart(6, "mj-page-body-interior", 5)(7, "div", 6)(8, "div", 7)(9, "div", 8);
|
|
1325
|
+
i0.ɵɵrepeaterCreate(10, ClassifySourcesTabComponent_For_11_Template, 50, 17, "div", 9, _forTrack0);
|
|
1326
|
+
i0.ɵɵelementStart(12, "div", 10);
|
|
1327
|
+
i0.ɵɵlistener("click", function ClassifySourcesTabComponent_Template_div_click_12_listener() { return ctx.onAddSource(); });
|
|
1328
|
+
i0.ɵɵelement(13, "i", 11);
|
|
1329
|
+
i0.ɵɵelementStart(14, "span", 12);
|
|
1330
|
+
i0.ɵɵtext(15, "Add Content Source");
|
|
1331
|
+
i0.ɵɵelementEnd();
|
|
1332
|
+
i0.ɵɵelementStart(16, "span", 13);
|
|
1333
|
+
i0.ɵɵtext(17, "Web, RSS, Email, Files, API");
|
|
1334
|
+
i0.ɵɵelementEnd()()()()()();
|
|
1335
|
+
i0.ɵɵconditionalCreate(18, ClassifySourcesTabComponent_Conditional_18_Template, 11, 2);
|
|
1336
|
+
i0.ɵɵconditionalCreate(19, ClassifySourcesTabComponent_Conditional_19_Template, 37, 8, "div", 14);
|
|
1337
|
+
i0.ɵɵelementStart(20, "classify-dry-run-preview", 15);
|
|
1338
|
+
i0.ɵɵlistener("Closed", function ClassifySourcesTabComponent_Template_classify_dry_run_preview_Closed_20_listener() { return ctx.CloseDryRunPreview(); });
|
|
1339
|
+
i0.ɵɵelementEnd();
|
|
1340
|
+
} if (rf & 2) {
|
|
1341
|
+
i0.ɵɵadvance(6);
|
|
1342
|
+
i0.ɵɵproperty("Padding", false)("Flex", true);
|
|
1343
|
+
i0.ɵɵadvance(4);
|
|
1344
|
+
i0.ɵɵrepeater(ctx.SourceCards);
|
|
1345
|
+
i0.ɵɵadvance(8);
|
|
1346
|
+
i0.ɵɵconditional(ctx.ShowSourceDetail ? 18 : -1);
|
|
1347
|
+
i0.ɵɵadvance();
|
|
1348
|
+
i0.ɵɵconditional(ctx.ShowScheduleDialog && ctx.SchedulingSourceCard ? 19 : -1);
|
|
1349
|
+
i0.ɵɵadvance();
|
|
1350
|
+
i0.ɵɵproperty("Provider", ctx.Provider)("Show", ctx.ShowDryRunPreview)("SourceCard", ctx.DryRunSourceCard);
|
|
1351
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.LoadingComponent, i3.MJButtonDirective, i3.MJPageHeaderInteriorComponent, i3.MJPageBodyInteriorComponent, i4.ClassifyDryRunPreviewDialogComponent, i5.DecimalPipe], encapsulation: 2 });
|
|
1352
|
+
}
|
|
1353
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ClassifySourcesTabComponent, [{
|
|
1354
|
+
type: Component,
|
|
1355
|
+
args: [{ standalone: false, selector: 'classify-sources-tab', template: "<mj-page-header-interior\n Title=\"Content Sources\"\n Subtitle=\"Configure where content is ingested from\">\n <div actions>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"onAddSource()\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"mj-action-label\">Add Source</span>\n </button>\n </div>\n</mj-page-header-interior>\n\n<mj-page-body-interior [Padding]=\"false\" [Flex]=\"true\">\n <div class=\"at-main-area\">\n <div class=\"at-page-body\">\n <div class=\"at-sources-grid\">\n @for (card of SourceCards; track card.ID) {\n <div class=\"at-source-card-full at-source-card-clickable\" (click)=\"OpenSourceDetail(card)\">\n <div class=\"at-source-card-header\">\n <div class=\"at-source-card-icon\"><i [class]=\"card.Icon\"></i></div>\n <div>\n <div class=\"at-source-card-title\">{{ card.Name }}</div>\n <div class=\"at-source-card-type\">{{ card.SourceTypeName }}@if (card.RequiresFileType) { \u00B7 {{ card.FileTypeName }}}</div>\n </div>\n <div class=\"at-source-card-status\" [class]=\"card.StatusClass\">\n <div class=\"at-source-mini-status\" [class]=\"card.StatusClass\"></div>\n {{ card.StatusLabel }}\n </div>\n </div>\n @if (card.URL) {\n <div class=\"at-source-card-url\">{{ card.URL }}</div>\n }\n <div class=\"at-source-card-stats\">\n <div class=\"at-source-stat\">\n <div class=\"at-source-stat-value\">{{ formatNumber(card.ItemCount) }}</div>\n <div class=\"at-source-stat-label\">Items</div>\n </div>\n <div class=\"at-source-stat\">\n <div class=\"at-source-stat-value\">{{ formatNumber(card.TagCount) }}</div>\n <div class=\"at-source-stat-label\">Tags</div>\n </div>\n <div class=\"at-source-stat\">\n <div class=\"at-source-stat-value\">{{ card.AvgTags }}</div>\n <div class=\"at-source-stat-label\">Avg Tags</div>\n </div>\n <div class=\"at-source-stat\">\n <div class=\"at-source-stat-value\">{{ card.LastRunAgo }}</div>\n <div class=\"at-source-stat-label\">Last Run</div>\n </div>\n </div>\n <!-- Schedule indicator -->\n @if (card.ScheduledActionID) {\n <div class=\"at-schedule-indicator\" (click)=\"RemoveSchedule(card); $event.stopPropagation()\" title=\"Click to remove schedule\">\n <i class=\"fa-regular fa-clock\"></i>\n <span>{{ GetScheduleLabel(card) }}</span>\n </div>\n }\n <div class=\"at-source-card-actions\">\n <button class=\"at-source-action-btn\" (click)=\"onEditSource(card); $event.stopPropagation()\"><i class=\"fa-solid fa-pen\"></i> Edit</button>\n <button class=\"at-source-action-btn\" (click)=\"onRunSource(card.ID); $event.stopPropagation()\"><i class=\"fa-solid fa-play\"></i> Run</button>\n <button class=\"at-source-action-btn\" (click)=\"OpenDryRunPreview(card); $event.stopPropagation()\"><i class=\"fa-solid fa-flask\"></i> Preview</button>\n @if (!card.ScheduledActionID) {\n <button class=\"at-source-action-btn at-source-schedule-btn\" (click)=\"OpenScheduleDialog(card); $event.stopPropagation()\"><i class=\"fa-regular fa-clock\"></i> Schedule</button>\n }\n <button class=\"at-source-action-btn at-source-delete-btn\" (click)=\"DeleteSource(card); $event.stopPropagation()\"><i class=\"fa-solid fa-trash\"></i> Delete</button>\n </div>\n </div>\n }\n\n <!-- Add Source Card -->\n <div class=\"at-add-source-card\" (click)=\"onAddSource()\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n <span style=\"font-size: 0.85rem; font-weight: 600;\">Add Content Source</span>\n <span style=\"font-size: 0.72rem;\">Web, RSS, Email, Files, API</span>\n </div>\n </div>\n </div>\n </div>\n</mj-page-body-interior>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550 SOURCE DETAIL SLIDE-IN \u2550\u2550\u2550\u2550\u2550\u2550 -->\n@if (ShowSourceDetail) {\n <div class=\"at-slide-overlay\" (click)=\"CloseSourceDetail()\"></div>\n <div class=\"at-slide-panel at-detail-panel\">\n <div class=\"at-slide-header\">\n <h3><i class=\"fa-solid fa-database\"></i> Source Detail</h3>\n <button class=\"at-slide-close\" aria-label=\"Close source detail\" (click)=\"CloseSourceDetail()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n @if (SourceDetailLoading) {\n <div class=\"at-loading-overlay\">\n <mj-loading text=\"Loading source details...\"></mj-loading>\n </div>\n }\n @if (!SourceDetailLoading && SelectedSource) {\n <!-- Source Header -->\n <div class=\"at-detail-source-header\">\n <div class=\"at-source-card-icon\"><i [class]=\"SelectedSource.Icon\"></i></div>\n <div>\n <h4 class=\"at-detail-item-name\">{{ SelectedSource.Name }}</h4>\n <div class=\"at-detail-badges\">\n <span class=\"at-detail-badge at-detail-badge-type\">{{ SelectedSource.SourceTypeName }}</span>\n <span class=\"at-detail-badge\" [class]=\"'at-detail-badge-status-' + SelectedSource.StatusClass\">\n {{ SelectedSource.StatusLabel }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Configuration -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Configuration</div>\n <div class=\"at-detail-meta-grid\">\n @if (SelectedSource.URL) {\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">URL</span>\n <a [href]=\"SelectedSource.URL\" target=\"_blank\" class=\"at-detail-link at-detail-meta-value\">{{ SelectedSource.URL }}</a>\n </div>\n }\n @if (SelectedSource.RequiresFileType) {\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Content Type</span>\n <span class=\"at-detail-meta-value\">{{ SelectedSource.ContentTypeName }}</span>\n </div>\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">File Type</span>\n <span class=\"at-detail-meta-value\">{{ SelectedSource.FileTypeName }}</span>\n </div>\n }\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Embedding Model</span>\n <span class=\"at-detail-meta-value\">{{ SelectedSource.EmbeddingModelName }}</span>\n </div>\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Vector Index</span>\n <span class=\"at-detail-meta-value\">{{ SelectedSource.VectorIndexName }}</span>\n </div>\n </div>\n </div>\n\n <!-- Stats -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Statistics</div>\n <div class=\"at-detail-stats-strip\">\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\">{{ formatNumber(SelectedSource.ItemCount) }}</div>\n <div class=\"at-detail-stat-label\">Items</div>\n </div>\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\">{{ formatNumber(SelectedSource.TagCount) }}</div>\n <div class=\"at-detail-stat-label\">Tags</div>\n </div>\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\">{{ SelectedSource.AvgTags }}</div>\n <div class=\"at-detail-stat-label\">Avg Tags</div>\n </div>\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\">{{ SelectedSource.LastRunAgo }}</div>\n <div class=\"at-detail-stat-label\">Last Run</div>\n </div>\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\" [class.at-kpi-error-value]=\"SelectedSource.ErrorCount > 0\">{{ SelectedSource.ErrorCount }}</div>\n <div class=\"at-detail-stat-label\">Errors</div>\n </div>\n </div>\n </div>\n\n <!-- Content Library (status badges, pagination) -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-header-row\">\n <div class=\"at-detail-section-label\">Content Library ({{ FilteredSourceDetailTotal }} of {{ SelectedSource.ItemCount | number }})</div>\n <div class=\"at-detail-section-controls\">\n <select class=\"at-detail-filter-select\" [(ngModel)]=\"SourceDetailStatusFilter\" (ngModelChange)=\"OnSourceDetailStatusFilterChange()\">\n @for (opt of SourceDetailStatusOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n <button class=\"at-action-btn at-retry-btn\" (click)=\"RetryFailedItems()\" title=\"Re-queue failed items for processing\">\n <i class=\"fa-solid fa-rotate-right\"></i> Retry Failed\n </button>\n </div>\n </div>\n <div class=\"at-detail-content-list\">\n @if (FilteredSourceDetailItems.length === 0) {\n <div class=\"at-empty-state\" style=\"padding: 16px;\">\n <p>{{ SourceDetailStatusFilter === 'All' ? 'No content items yet.' : 'No items match this filter.' }}</p>\n </div>\n }\n @for (ci of FilteredSourceDetailItems; track ci.ID) {\n <div class=\"at-detail-content-item\" (click)=\"OpenContentItemDetail(ci)\">\n <div class=\"at-feed-status-dot\" [class]=\"ci.StatusDot\"></div>\n <span class=\"at-detail-content-item-name\">{{ ci.Name }}</span>\n <span class=\"at-status-badge\" [class]=\"GetStatusBadgeClass(ci.EmbeddingStatus)\">E:{{ ci.EmbeddingStatus }}</span>\n <span class=\"at-status-badge\" [class]=\"GetStatusBadgeClass(ci.TaggingStatus)\">T:{{ ci.TaggingStatus }}</span>\n <span class=\"at-detail-content-item-tags\">{{ ci.TagCount }} tags</span>\n <span class=\"at-detail-content-item-time\">{{ ci.UpdatedAt }}</span>\n </div>\n }\n </div>\n <!-- Pagination -->\n @if (SourceDetailTotalPages > 1) {\n <div class=\"at-detail-pagination\">\n <button class=\"at-page-btn\" [disabled]=\"SourceDetailPage === 0\" (click)=\"SourceDetailPrevPage()\">\n <i class=\"fa-solid fa-chevron-left\"></i> Prev\n </button>\n <span class=\"at-page-info\">Page {{ SourceDetailPage + 1 }} of {{ SourceDetailTotalPages }}</span>\n <button class=\"at-page-btn\" [disabled]=\"SourceDetailPage >= SourceDetailTotalPages - 1\" (click)=\"SourceDetailNextPage()\">\n Next <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n }\n </div>\n\n <!-- Run History -->\n @if (SelectedSource.RunHistory.length > 0) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Recent Runs</div>\n <div class=\"at-detail-run-history\">\n @for (run of SelectedSource.RunHistory; track run.ID) {\n <div class=\"at-detail-run-row\">\n <span class=\"at-run-status-badge\" [class]=\"run.StatusClass\">{{ run.Status }}</span>\n <span class=\"at-detail-run-time\">{{ run.StartedDisplay }}</span>\n <span class=\"at-detail-run-duration\">{{ run.Duration }}</span>\n <span class=\"at-detail-run-items\">{{ run.Items }} items</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Actions -->\n <div class=\"at-detail-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"OpenEditSourceFromDetail()\">\n <i class=\"fa-solid fa-pen\"></i> Edit\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"RunSourceFromDetail()\">\n <i class=\"fa-solid fa-play\"></i> Run Now\n </button>\n <button class=\"at-action-btn at-secondary-btn at-source-delete-btn\" (click)=\"DeleteSourceFromDetail()\">\n <i class=\"fa-solid fa-trash\"></i> Delete\n </button>\n </div>\n }\n </div>\n </div>\n}\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550 SCHEDULE DIALOG \u2550\u2550\u2550\u2550\u2550\u2550 -->\n@if (ShowScheduleDialog && SchedulingSourceCard) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseScheduleDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-regular fa-clock\"></i> Schedule Pipeline</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseScheduleDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>Source</label>\n <div class=\"at-schedule-source-name\">\n <i [class]=\"SchedulingSourceCard.Icon\"></i>\n {{ SchedulingSourceCard.Name }}\n </div>\n </div>\n <div class=\"at-schedule-field\">\n <label>Action</label>\n <div class=\"at-schedule-action-name\">Autotag and Vectorize Content</div>\n </div>\n <div class=\"at-schedule-field\">\n <label for=\"schedule-cron\">Cron Expression</label>\n <input id=\"schedule-cron\"\n type=\"text\"\n class=\"mj-input at-schedule-cron-input\"\n [(ngModel)]=\"ScheduleCron\"\n placeholder=\"0 2 * * *\" />\n <div class=\"at-schedule-cron-preview\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ GetCronPreview(ScheduleCron) }}\n </div>\n </div>\n <div class=\"at-schedule-field at-schedule-toggle-row\">\n <label for=\"schedule-enabled\">Enabled</label>\n <input id=\"schedule-enabled\"\n type=\"checkbox\"\n class=\"mj-checkbox\"\n [(ngModel)]=\"ScheduleEnabled\" />\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveSchedule()\" [disabled]=\"ScheduleSaving\">\n @if (ScheduleSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i> Create Schedule\n }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseScheduleDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550 DRY-RUN DISPOSITION PREVIEW (in-memory, nothing persisted) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n<classify-dry-run-preview\n [Provider]=\"Provider\"\n [Show]=\"ShowDryRunPreview\"\n [SourceCard]=\"DryRunSourceCard\"\n (Closed)=\"CloseDryRunPreview()\">\n</classify-dry-run-preview>\n", styles: ["/*\n * Content Sources tab styles.\n *\n * The host (AutotaggingPipelineResourceComponent) uses ViewEncapsulation.None,\n * so its `.at-*` rules are global and already style this tab's markup (cards,\n * source-detail slide-in, schedule dialog) while it renders inside the host\n * shell. Tab-specific rules would live here; none are needed during the\n * host-slim step.\n */\n"] }]
|
|
1356
|
+
}], null, { Sources: [{
|
|
1357
|
+
type: Input
|
|
1358
|
+
}], Items: [{
|
|
1359
|
+
type: Input
|
|
1360
|
+
}], Tags: [{
|
|
1361
|
+
type: Input
|
|
1362
|
+
}], Runs: [{
|
|
1363
|
+
type: Input
|
|
1364
|
+
}], TotalItemCount: [{
|
|
1365
|
+
type: Input
|
|
1366
|
+
}], TotalTagCount: [{
|
|
1367
|
+
type: Input
|
|
1368
|
+
}], ScheduledActions: [{
|
|
1369
|
+
type: Input
|
|
1370
|
+
}], EntityRecordDocCache: [{
|
|
1371
|
+
type: Input
|
|
1372
|
+
}], AddSourceRequested: [{
|
|
1373
|
+
type: Output
|
|
1374
|
+
}], EditSourceRequested: [{
|
|
1375
|
+
type: Output
|
|
1376
|
+
}], RunSourceRequested: [{
|
|
1377
|
+
type: Output
|
|
1378
|
+
}], OpenContentItemRequested: [{
|
|
1379
|
+
type: Output
|
|
1380
|
+
}], DataChanged: [{
|
|
1381
|
+
type: Output
|
|
1382
|
+
}] }); })();
|
|
1383
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ClassifySourcesTabComponent, { className: "ClassifySourcesTabComponent", filePath: "src/AI/components/autotagging/tabs/sources-tab.component.ts", lineNumber: 34 }); })();
|
|
1384
|
+
//# sourceMappingURL=sources-tab.component.js.map
|