@memberjunction/ng-dashboards 5.30.0 → 5.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +4 -4
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +2 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +8 -6
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +6 -5
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +2 -1
- 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 +6 -5
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +6 -5
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +2 -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 +7 -4
- 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 +3 -2
- 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 +10 -6
- 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 +2 -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 +6 -5
- 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 +2 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +6 -5
- 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.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +55 -52
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -15
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +4 -3
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +2 -2
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +10 -8
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +2 -2
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts +2 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +13 -10
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1181 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -0
- package/dist/AI/components/tags/tags-resource.component.js +7487 -0
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +25 -21
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/index.d.ts +1 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +5 -0
- package/dist/AI/index.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 +12 -4
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +5 -4
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.d.ts +2 -1
- package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +5 -5
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +11 -10
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-list.component.d.ts +2 -1
- package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-list.component.js +6 -5
- package/dist/APIKeys/api-key-list.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +4 -4
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +8 -6
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.js +10 -8
- package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.d.ts +2 -1
- package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +6 -5
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +2 -2
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts +2 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +6 -5
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +1 -1
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts +2 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +6 -4
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts +2 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.js +7 -5
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts +2 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +7 -5
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +4 -4
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +1 -1
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +1 -1
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +3 -3
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +1 -1
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +3 -3
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +5 -4
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +2 -1
- 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 +6 -4
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +11 -2
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +61 -27
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -2
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +19 -11
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts +4 -2
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +11 -3
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +10 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +18 -9
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts +11 -1
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.js +23 -3
- package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts +6 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.js +16 -6
- package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +1 -1
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +13 -13
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +4 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.js +5 -2
- package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +3 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -4
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +3 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +7 -6
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +3 -2
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +6 -5
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +10 -9
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts +6 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +15 -5
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts +64 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js +400 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts +42 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js +232 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts +14 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js +38 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts +24 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js +77 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts +88 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js +404 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts +12 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js +116 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +55 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +204 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +61 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/entity-list.component.js +485 -0
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts +52 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js +320 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts +79 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js +378 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts +85 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js +429 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts +58 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js +333 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts +36 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js +345 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts +13 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js +81 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +30 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +131 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer-erd.d.ts +19 -0
- package/dist/DatabaseDesigner/database-designer-erd.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer-erd.js +84 -0
- package/dist/DatabaseDesigner/database-designer-erd.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer.types.d.ts +167 -0
- package/dist/DatabaseDesigner/database-designer.types.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer.types.js +26 -0
- package/dist/DatabaseDesigner/database-designer.types.js.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.d.ts +94 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.js +392 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.js.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.service.d.ts +78 -0
- package/dist/DatabaseDesigner/services/database-designer.service.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.service.js +273 -0
- package/dist/DatabaseDesigner/services/database-designer.service.js.map +1 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts +79 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.js +204 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.js.map +1 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/action-pin-config-dialog.component.d.ts +2 -1
- package/dist/Home/action-pin-config-dialog.component.d.ts.map +1 -1
- package/dist/Home/action-pin-config-dialog.component.js +6 -4
- package/dist/Home/action-pin-config-dialog.component.js.map +1 -1
- package/dist/Home/action-pin-runner-dialog.component.d.ts +2 -1
- package/dist/Home/action-pin-runner-dialog.component.d.ts.map +1 -1
- package/dist/Home/action-pin-runner-dialog.component.js +5 -4
- package/dist/Home/action-pin-runner-dialog.component.js.map +1 -1
- package/dist/Home/home-application.d.ts.map +1 -1
- package/dist/Home/home-application.js +10 -12
- package/dist/Home/home-application.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +3 -3
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +1 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +11 -10
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2 -2
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +1 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +5 -4
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +5 -1
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +27 -19
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +6 -6
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +8 -6
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +6 -6
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +3 -3
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +6 -6
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +4 -4
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +6 -6
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +11 -10
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +5 -0
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +11 -3
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts +2 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +8 -6
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.d.ts +2 -1
- package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +7 -5
- package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +12 -12
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/Permissions/permissions-shared.d.ts +3 -3
- package/dist/Permissions/permissions-shared.d.ts.map +1 -1
- package/dist/Permissions/permissions-shared.js +5 -5
- package/dist/Permissions/permissions-shared.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +1 -1
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +1 -2
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +5 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +21 -13
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +2 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +9 -7
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.d.ts +6 -1
- package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.js +21 -11
- package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +3 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +15 -11
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +5 -5
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +1 -2
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +3 -3
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +35 -34
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +6 -0
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +3 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -1
- package/dist/public-api.js.map +1 -1
- package/dist/shared/entity-field-display.d.ts +4 -3
- package/dist/shared/entity-field-display.d.ts.map +1 -1
- package/dist/shared/entity-field-display.js +9 -9
- package/dist/shared/entity-field-display.js.map +1 -1
- package/package.json +52 -51
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags-resource.component.js","sourceRoot":"","sources":["../../../../src/AI/components/tags/tags-resource.component.ts","../../../../src/AI/components/tags/tags-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Tags dashboard — the canonical home for everything tag-related\n * across MJ. Tags aren't classification-only: any entity / workload can assign\n * them, so this dashboard lives at the Knowledge Hub top level rather than\n * being buried inside the Classify (autotag pipeline) dashboard.\n *\n * Four tabs:\n * - Tag Library — table + drill-down + word cloud (moved from Classify).\n * - Taxonomy — tree / Duplicates / Orphans / Treemap / Audit Log\n * (moved from Classify; Tree's right-detail panel now also surfaces\n * governance + scope + synonym editing; Duplicates + Orphans are now\n * server-driven from `MJ:Tag Suggestions`).\n * - Suggestions — human-in-the-loop review queue (`MJ:Tag Suggestions`).\n * - Health — Tag Health 3-card summary, threshold tuning, run history,\n * \"Rebuild stale embeddings\".\n *\n * The Classify dashboard still owns the autotag pipeline run-management\n * surface (Pipeline / Sources / Types / History).\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, inject, ViewEncapsulation } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseEntity, CompositeKey, Metadata, RunQuery, RunView } from '@memberjunction/core';\nimport { TreeBranchConfig, TreeLeafConfig } from '@memberjunction/ng-trees';\nimport { ResourceData, KnowledgeHubMetadataEngine, MJContentSourceEntity, MJContentSourceTypeEntity_IContentSourceTypeField, MJScheduledActionEntity, MJScheduledActionParamEntity, MJContentItemDuplicateEntity, UserInfoEngine, MJTagEntity, MJTagSynonymEntity, MJTagScopeEntity } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { GraphQLDataProvider, GraphQLAIClient } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { WordCloudItem } from '@memberjunction/ng-word-cloud';\n\n// ── Tab type ──\n\n/**\n * Tab union — wide for now because this component is in transition: the\n * existing autotagging-pipeline tabs (pipeline / sources / types / history)\n * are still referenced by helpers we share. NavItems only emits the 4\n * tag-related entries, so the user only ever sees Tags / Taxonomy /\n * Suggestions / Health. The dead-code strip is a follow-up.\n */\ntype TabName = 'pipeline' | 'sources' | 'types' | 'tags' | 'taxonomy' | 'history' | 'suggestions' | 'health';\n\n/** Conventional `Reason` values from MJ:Tag Suggestions. */\ntype TagSuggestionReason =\n | 'BelowThreshold' | 'ConstrainedMode' | 'AmbiguousMatch' | 'ParentFrozen'\n | 'AutoGrowDisabled' | 'MaxChildrenExceeded' | 'MaxDepthExceeded'\n | 'BelowMinWeight' | 'RequiresReview' | 'MaxItemTagsExceeded'\n | 'MergeCandidate' | 'LowUsage' | 'WideNode';\n\ninterface SuggestionRow {\n ID: string;\n ProposedName: string;\n Reason: string;\n BestMatchTagID: string | null;\n BestMatchName: string | null;\n BestMatchPath: string | null;\n BestMatchScore: number | null;\n SourceContentSourceID: string | null;\n SourceContentItemID: string | null;\n SourceText: string | null;\n CreatedAt: Date;\n Status: string;\n selected: boolean;\n dispositionInProgress: 'create-new' | 'merge' | 'reject' | null;\n}\n\ninterface HealthRunHistoryRow {\n When: Date;\n Trigger: string;\n TagsScanned: number;\n Merge: number;\n LowUsage: number;\n WideNode: number;\n DurationMs: number;\n}\n\ninterface SynonymRow {\n ID: string;\n Synonym: string;\n Source: string;\n CreatedAt: Date;\n}\n\ninterface TagScopeRowView {\n ID: string;\n ScopeEntityID: string;\n ScopeRecordID: string;\n EntityName: string;\n DisplayName: string;\n}\n\n// ── Interfaces ──\n\ninterface NavItem {\n Tab: TabName;\n Icon: string;\n Label: string;\n BadgeText: string;\n BadgeClass: string;\n}\n\ninterface KPIMetric {\n Label: string;\n Value: number;\n Icon: string;\n Trend: string;\n TrendUp: boolean;\n}\n\ninterface PipelineStageInfo {\n Name: string;\n Icon: string;\n Status: 'idle' | 'active' | 'complete';\n Count: string;\n}\n\ninterface FeedItem {\n Name: string;\n SourceName: string;\n Tags: string[];\n TimeAgo: string;\n Status: 'complete' | 'processing' | 'error';\n}\n\ninterface SourceMini {\n ID: string;\n Name: string;\n Icon: string;\n Meta: string;\n StatusClass: 'active' | 'error' | 'inactive';\n}\n\ninterface SourceCard {\n ID: string;\n Name: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n Icon: string;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n URL: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ContentSourceTypeID: string;\n ContentTypeID: string;\n ContentFileTypeID: string;\n EmbeddingModelID: string;\n VectorIndexID: string;\n EntityID: string;\n EntityDocumentID: string;\n RequiresFileType: boolean;\n /** FK to ScheduledAction entity, null if no schedule configured */\n ScheduledActionID: string | null;\n /** Denormalized name of the linked ScheduledAction */\n ScheduledActionName: string | null;\n /** Human-readable schedule description (parsed from cron) */\n ScheduleDescription: string | null;\n}\n\ninterface ContentTypeCard {\n ID: string;\n Name: string;\n Description: string;\n AIModelName: string;\n AIModelID: string;\n MinTags: number;\n MaxTags: number;\n SourcesUsing: number;\n ItemsTagged: number;\n RangeLeftPct: number;\n RangeRightPct: number;\n EmbeddingModelID: string;\n VectorIndexID: string;\n}\n\ninterface TagRow {\n Tag: string;\n UsageCount: number;\n AvgWeight: number;\n BarWidthPct: number;\n TopSource: string;\n FirstSeen: string;\n}\n\ninterface TagCloudItem {\n Tag: string;\n AvgWeight: number;\n SizeClass: 'large' | '' | 'small';\n}\n\ninterface TagBySource {\n SourceName: string;\n Count: number;\n}\n\ninterface RunHistoryRow {\n ID: string;\n Status: string;\n StatusClass: string;\n SourceName: string;\n StartedDisplay: string;\n Duration: string;\n Items: string;\n Tags: string;\n Errors: string;\n ErrorClass: string;\n}\n\ninterface DropdownOption {\n ID: string;\n Name: string;\n}\n\n/** G3: Content item duplicate pair for review */\ninterface ContentDuplicateRow {\n ID: string;\n ItemAName: string;\n ItemASource: string;\n ItemBName: string;\n ItemBSource: string;\n SimilarityScore: number;\n DetectionMethod: string;\n Status: 'Pending' | 'Confirmed' | 'Dismissed' | 'Merged';\n}\n\n/** D2/D3/D8: Per-source detail row for a specific pipeline run */\ninterface RunDetailRow {\n SourceName: string;\n SourceType: string;\n Status: string;\n StatusClass: string;\n ItemsProcessed: number;\n ItemsTagged: number;\n ItemsVectorized: number;\n ErrorCount: number;\n TotalTokens: number;\n TotalCost: number;\n Duration: string;\n}\n\n// ── Taxonomy Governance interfaces ──\n\ntype TaxonomySubTab = 'tree' | 'duplicates' | 'orphans' | 'treemap' | 'audit';\n\ninterface TaxTreeNode {\n ID: string;\n Name: string;\n DisplayName: string;\n Description: string;\n ParentID: string | null;\n Depth: number;\n Children: TaxTreeNode[];\n ItemCount: number;\n AvgWeight: number;\n HealthColor: 'green' | 'yellow' | 'red';\n IsExpanded: boolean;\n IsSelected: boolean;\n FirstSeen: string;\n}\n\ninterface TaxDuplicatePair {\n TagA: string;\n TagB: string;\n TagAID: string;\n TagBID: string;\n Similarity: number;\n SeverityClass: 'high' | 'moderate';\n /** True when multiple Tag records share the same name (case-insensitive) */\n IsExactDuplicate: boolean;\n /** How many Tag records share this exact name (only set when IsExactDuplicate) */\n ExactDuplicateCount: number;\n /** All Tag IDs sharing the exact name (only set when IsExactDuplicate) */\n AllIDs: string[];\n}\n\ninterface TaxOrphanCard {\n ID: string;\n Name: string;\n UsageCount: number;\n AvgWeight: number;\n FirstSeen: string;\n LastSeen: string;\n IsSelected: boolean;\n}\n\ninterface TaxTreemapCell {\n ID: string;\n Name: string;\n ItemCount: number;\n ColorClass: string;\n RowSpan: number;\n}\n\n/** Supported audit action types — matches DB Action values (lowercased) */\ntype TaxAuditAction = 'created' | 'merged' | 'moved' | 'deleted' | 'renamed' | 'deprecated' | 'descriptionchanged' | 'reactivated' | 'split';\n\ninterface TaxAuditEvent {\n Type: TaxAuditAction;\n Description: string;\n TagRef: string;\n User: string;\n Timestamp: string;\n DayHeader: string;\n}\n\ninterface TaxHealthStat {\n Total: number;\n Healthy: number;\n NeedAttention: number;\n Orphaned: number;\n Duplicates: number;\n}\n\ninterface WeightedTag {\n Tag: string;\n Weight: number;\n}\n\n/** Status value for embedding or tagging pipeline phases */\ntype ItemPipelineStatus = 'Complete' | 'Processing' | 'Failed' | 'Pending';\n\ninterface ContentItemDetail {\n ID: string;\n Name: string;\n SourceName: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n URL: string;\n TextContent: string;\n Checksum: string;\n Tags: WeightedTag[];\n CreatedAt: string;\n UpdatedAt: string;\n ContentSourceID: string;\n ContentSourceTypeID: string;\n StatusDot: 'complete' | 'processing' | 'error';\n TagCount: number;\n /** Whether this source type uses content/file type (false for Entity sources) */\n RequiresContentType: boolean;\n /** Entity record ID if source is entity type (for direct entity navigation) */\n EntityRecordID: string | null;\n /** Entity name if source is entity type */\n EntityName: string | null;\n /** Embedding pipeline status for this content item */\n EmbeddingStatus: ItemPipelineStatus;\n /** Tagging pipeline status for this content item */\n TaggingStatus: ItemPipelineStatus;\n}\n\ninterface SourceDetailInfo {\n ID: string;\n Name: string;\n SourceTypeName: string;\n FileTypeName: string;\n ContentTypeName: string;\n RequiresFileType: boolean;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n Icon: string;\n URL: string;\n EmbeddingModelName: string;\n VectorIndexName: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ErrorCount: number;\n ContentItems: ContentItemDetail[];\n RunHistory: RunHistoryRow[];\n}\n\n// ── Slide-in form mode ──\n\ntype FormMode = 'none' | 'add-source' | 'edit-source' | 'add-type' | 'edit-type';\n\n@RegisterClass(BaseResourceComponent, 'Tags')\n@Component({\n standalone: false,\n selector: 'mj-tags-resource',\n templateUrl: './tags-resource.component.html',\n styleUrls: ['./tags-resource.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class TagsResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n protected override destroy$ = new Subject<void>();\n private cdr = inject(ChangeDetectorRef);\n protected override navigationService = inject(NavigationService);\n\n // ── Global state ──\n public IsLoading = true;\n\n // ── Accurate total counts from TotalRowCount (not capped by MaxRows) ──\n private totalContentItemCount = 0;\n private totalContentTagCount = 0;\n\n // ── Tab state ──\n public ActiveTab: TabName = 'tags';\n private tabDataLoaded = new Set<TabName>();\n\n // ── Left nav ──\n public NavItems: NavItem[] = [];\n\n // ── Pipeline tab ──\n public KPIMetrics: KPIMetric[] = [];\n public PipelineStages: PipelineStageInfo[] = [];\n public FeedItems: FeedItem[] = [];\n public SourceMinis: SourceMini[] = [];\n public TrendingTags: TagCloudItem[] = [];\n\n // ── Pipeline feed search & pagination ──\n public FeedSearchQuery = '';\n public FeedPage = 0;\n public readonly FeedPageSize = 20;\n /** Sort order for the feed: 'newest' (default) or 'oldest' */\n public FeedSortOrder: 'newest' | 'oldest' = 'newest';\n\n /** Feed items filtered by search query and sorted */\n public get FilteredFeedItems(): FeedItem[] {\n let items = this.FeedItems;\n if (this.FeedSearchQuery.trim()) {\n const q = this.FeedSearchQuery.toLowerCase();\n items = items.filter(item =>\n item.Name.toLowerCase().includes(q) ||\n item.SourceName.toLowerCase().includes(q) ||\n item.Tags.some(t => t.toLowerCase().includes(q))\n );\n }\n if (this.FeedSortOrder === 'oldest') {\n return [...items].reverse();\n }\n return items;\n }\n\n /** Toggle feed sort order */\n public ToggleFeedSort(): void {\n this.FeedSortOrder = this.FeedSortOrder === 'newest' ? 'oldest' : 'newest';\n this.FeedPage = 0;\n this.cdr.detectChanges();\n }\n\n /** Paginated feed items for the current page */\n public get PaginatedFeedItems(): FeedItem[] {\n const items = this.FilteredFeedItems;\n const start = this.FeedPage * this.FeedPageSize;\n return items.slice(start, start + this.FeedPageSize);\n }\n\n /** Total pages for the feed */\n public get FeedTotalPages(): number {\n return Math.max(1, Math.ceil(this.FilteredFeedItems.length / this.FeedPageSize));\n }\n\n /** Handle feed search input change */\n public OnFeedSearchChange(): void {\n this.FeedPage = 0;\n this.cdr.detectChanges();\n }\n\n /** Navigate to previous feed page */\n public FeedPrevPage(): void {\n if (this.FeedPage > 0) {\n this.FeedPage--;\n this.cdr.detectChanges();\n }\n }\n\n /** Navigate to next feed page */\n public FeedNextPage(): void {\n if (this.FeedPage < this.FeedTotalPages - 1) {\n this.FeedPage++;\n this.cdr.detectChanges();\n }\n }\n\n /** Get the index in the original FeedItems array for a paginated item */\n public GetFeedItemOriginalIndex(item: FeedItem): number {\n return this.FeedItems.indexOf(item);\n }\n\n // Pipeline run state\n public IsRunning = false;\n public IsPaused = false;\n public RunProgress = 0;\n public RunStage = '';\n public RunCurrentItem = '';\n /** The current pipeline run ID (from GraphQL subscription) */\n public CurrentPipelineRunID: string | null = null;\n /** The process run ID (server-side ContentProcessRun) for pause/cancel/resume */\n public CurrentProcessRunID: string | null = null;\n\n // ── Pipeline Config Widget ──\n public ShowPipelineConfig = false;\n public PipelineConfig: {\n Pipeline?: { BatchSize?: number; MaxConcurrentBatches?: number; DelayBetweenBatchesMs?: number; ResumeFromLastBatch?: boolean; ErrorThresholdPercent?: number };\n RateLimits?: { LLM?: { RequestsPerMinute?: number; TokensPerMinute?: number }; Embedding?: { RequestsPerMinute?: number; TokensPerMinute?: number }; VectorDB?: { RequestsPerMinute?: number } };\n } = {\n Pipeline: { BatchSize: 100, MaxConcurrentBatches: 1, DelayBetweenBatchesMs: 200, ResumeFromLastBatch: true, ErrorThresholdPercent: 20 },\n RateLimits: { LLM: { RequestsPerMinute: 60, TokensPerMinute: 100000 }, Embedding: { RequestsPerMinute: 300, TokensPerMinute: 500000 }, VectorDB: { RequestsPerMinute: 200 } }\n };\n\n public TogglePipelineConfig(): void {\n this.ShowPipelineConfig = !this.ShowPipelineConfig;\n this.persistClassifyPreferences();\n }\n\n private persistClassifyPreferences(): void {\n const prefs = JSON.stringify({\n ActiveTab: this.ActiveTab,\n ShowPipelineConfig: this.ShowPipelineConfig,\n });\n UserInfoEngine.Instance.SetSettingDebounced(TagsResourceComponent.PREFS_KEY, prefs);\n }\n\n private loadClassifyPreferences(): void {\n const raw = UserInfoEngine.Instance.GetSetting(TagsResourceComponent.PREFS_KEY);\n if (raw) {\n try {\n const prefs = JSON.parse(raw);\n if (prefs.ActiveTab) this.ActiveTab = prefs.ActiveTab;\n if (prefs.ShowPipelineConfig != null) this.ShowPipelineConfig = prefs.ShowPipelineConfig;\n } catch { /* ignore */ }\n }\n }\n\n public FormatTokenCount(tokens: number): string {\n if (tokens >= 1000000) return `${(tokens / 1000000).toFixed(1)}M`;\n if (tokens >= 1000) return `${(tokens / 1000).toFixed(0)}K`;\n return String(tokens);\n }\n\n // ── Sources tab ──\n public SourceCards: SourceCard[] = [];\n public ContentDuplicates: ContentDuplicateRow[] = [];\n public IsLoadingDuplicates = false;\n\n // ── Content Types tab ──\n public ContentTypeCards: ContentTypeCard[] = [];\n\n // ── Tag Library tab ──\n public TagRows: TagRow[] = [];\n public TagCloud: TagCloudItem[] = [];\n public TagCloudWordItems: WordCloudItem[] = [];\n public TagsBySource: TagBySource[] = [];\n public TagSearchQuery = '';\n public FilteredTagRows: TagRow[] = [];\n public SelectedDrillDownTag: string | null = null;\n public TagDrillDownItems: { ID: string; Name: string; SourceName: string; Weight: number; UpdatedAt: string; FeedIndex: number }[] = [];\n\n // ── Run History tab ──\n public RunHistoryRows: RunHistoryRow[] = [];\n public HistorySourceFilter = '';\n public HistoryStatusFilter = '';\n public FilteredRunRows: RunHistoryRow[] = [];\n public HistorySourceOptions: string[] = [];\n\n // D3/D8: Run History Detail slide-in\n public SelectedRunID: string | null = null;\n public RunDetailRows: RunDetailRow[] = [];\n public IsLoadingRunDetail = false;\n\n // D2: Pipeline Monitor — live per-source progress\n public LiveRunDetailRows: RunDetailRow[] = [];\n public IsLoadingLiveDetails = false;\n\n // ── Taxonomy Governance tab ──\n public TaxSubTab: TaxonomySubTab = 'tree';\n public TaxTreeNodes: TaxTreeNode[] = [];\n public TaxFlatNodes: TaxTreeNode[] = [];\n public TaxFilteredNodes: TaxTreeNode[] = [];\n public TaxSelectedNode: TaxTreeNode | null = null;\n public TaxTreeSearch = '';\n public TaxDuplicates: TaxDuplicatePair[] = [];\n public TaxOrphans: TaxOrphanCard[] = [];\n public TaxAllOrphansSelected = false;\n public TaxTreemapCells: TaxTreemapCell[] = [];\n public TaxAuditEvents: TaxAuditEvent[] = [];\n public TaxAuditFilterTypes = new Set<string>(['created', 'merged', 'moved', 'deleted', 'renamed', 'deprecated', 'descriptionchanged', 'reactivated', 'split']);\n public TaxHealth: TaxHealthStat = { Total: 0, Healthy: 0, NeedAttention: 0, Orphaned: 0, Duplicates: 0 };\n public TaxRecentItems: { Name: string; Weight: number; Date: string; Icon: string }[] = [];\n public TaxTreemapKPIs: { Label: string; Value: string }[] = [];\n public TaxIsEditing = false;\n\n // ── Create Tag Dialog ──\n public ShowCreateTagDialog = false;\n public CreateTagName = '';\n public CreateTagDescription = '';\n public CreateTagParentID: string | null = null;\n /** Label shown in the create dialog to indicate context (e.g., \"under AI Agent\") */\n public CreateTagParentLabel = '';\n\n // ── Multi-select for drag reparenting ──\n public TaxMultiSelectMode = false;\n public TaxSelectedIDs = new Set<string>();\n /** The node currently being dragged over (drop target highlight) */\n public TaxDragOverNodeID: string | null = null;\n /** True while a drag-reparent operation is saving */\n public TaxTreeSaving = false;\n\n /** Count of high-confidence duplicate pairs (>85% similarity) */\n public get TaxHighConfidenceDupeCount(): number {\n return this.TaxDuplicates.filter(d => d.SeverityClass === 'high').length;\n }\n\n /** Count of moderate-confidence duplicate pairs (70-85% similarity) */\n public get TaxModerateDupeCount(): number {\n return this.TaxDuplicates.filter(d => d.SeverityClass === 'moderate').length;\n }\n public TaxEditName = '';\n public TaxEditDescription = '';\n\n // ── Suggestions inbox state (server-driven from MJ:Tag Suggestions) ──\n public SuggestionRows: SuggestionRow[] = [];\n public SuggestionRowsFiltered: SuggestionRow[] = [];\n public SuggestionFilterReason = '';\n public SuggestionFilterMinScore: number | null = null;\n public SuggestionSearch = '';\n public SuggestionSelected: SuggestionRow | null = null;\n public SuggestionBulkInProgress = false;\n public PendingSuggestionCount = 0;\n public ReasonOptions: TagSuggestionReason[] = [\n 'BelowThreshold', 'ConstrainedMode', 'AmbiguousMatch', 'ParentFrozen', 'AutoGrowDisabled',\n 'MaxChildrenExceeded', 'MaxDepthExceeded', 'BelowMinWeight', 'RequiresReview',\n 'MaxItemTagsExceeded', 'MergeCandidate', 'LowUsage', 'WideNode',\n ];\n\n // ── Tag Health state ──\n public HealthThresholds = {\n minCoOccurrence: 10,\n minNameSimilarity: 0.5,\n minEmbeddingSimilarity: 0.85,\n maxUsage: 3,\n maxImplicitChildren: 25,\n };\n public HealthRunning = false;\n public RebuildEmbeddingsRunning = false;\n public LastHealthSummary: {\n mergeCount: number; lowUsageCount: number; wideNodeCount: number; durationMs: number; runAt: Date | null;\n } = { mergeCount: 0, lowUsageCount: 0, wideNodeCount: 0, durationMs: 0, runAt: null };\n public HealthRunHistory: HealthRunHistoryRow[] = [];\n\n // ── Per-tag governance editing (Tree right-detail addendum) ──\n public SelectedTagSavingField: Record<string, boolean> = {};\n public SelectedTagSynonyms: SynonymRow[] = [];\n public SelectedTagScopes: TagScopeRowView[] = [];\n public NewSynonymName = '';\n public NewSynonymSource: 'Manual' | 'Imported' | 'Merged' | 'LLM' = 'Manual';\n\n // Raw taxonomy data cache\n /** Public so the template's Health tab can read tag count for the runbar. */\n public tagsRaw: Record<string, unknown>[] = [];\n private taggedItemsRaw: Record<string, unknown>[] = [];\n private tagAuditLogsRaw: Record<string, unknown>[] = [];\n /** Cached per-tag aggregates from server-side SQL (weights + counts) */\n private tagAggregateWeights = new Map<string, number>();\n private tagAggregateCounts = new Map<string, number>();\n\n // ── Slide-in form ──\n public FormMode: FormMode = 'none';\n public FormSaving = false;\n public ShowNoContentTypeWarning = false;\n\n // Source form fields\n public FormSourceName = '';\n public FormSourceTypeID = '';\n public FormContentTypeID = '';\n public FormFileTypeID = '';\n public FormSourceURL = '';\n public EditingSourceID = '';\n\n // Content Type form fields\n public FormTypeName = '';\n public FormTypeDescription = '';\n public FormTypeAIModelID = '';\n public FormTypeMinTags = 1;\n public FormTypeMaxTags = 10;\n public EditingTypeID = '';\n\n // Embedding model + vector index form fields (Content Type)\n public FormTypeEmbeddingModelID = '';\n public FormTypeVectorIndexID = '';\n\n // Entity source fields (shown when source type is \"Entity\")\n public FormSourceEntityID = '';\n public FormSourceEntityDocID = '';\n\n // Embedding model + vector index form fields (Content Source overrides)\n public FormSourceEmbeddingModelID = '';\n public FormSourceVectorIndexID = '';\n\n // ── Schedule dialog ──\n /** Whether the schedule creation dialog is visible */\n public ShowScheduleDialog = false;\n /** Whether a schedule save operation is in progress */\n public ScheduleSaving = false;\n /** Source card currently being scheduled */\n public SchedulingSourceCard: SourceCard | null = null;\n /** Cron expression for the schedule form */\n public ScheduleCron = '0 2 * * *';\n /** Whether the schedule should be active immediately */\n public ScheduleEnabled = true;\n\n // ── Confirmation dialog state ──\n /** Whether a generic confirmation overlay is visible */\n public ShowConfirmDialog = false;\n /** Title text for the confirmation dialog */\n public ConfirmDialogTitle = '';\n /** Body message for the confirmation dialog */\n public ConfirmDialogMessage = '';\n /** Callback invoked when user confirms */\n private confirmDialogAction: (() => Promise<void>) | null = null;\n\n // ── Split dialog state ──\n /** Whether the split-tag dialog is visible */\n public ShowSplitDialog = false;\n /** Comma-separated new child tag names for the split operation */\n public SplitChildNames = '';\n /** The node currently being split */\n private splitTargetNode: TaxTreeNode | null = null;\n\n // ── Move dialog state ──\n /** Whether the move-tag dialog is visible */\n public ShowMoveDialog = false;\n /** Selected new parent tag ID for the move operation */\n public MoveNewParentID: string | null = null;\n /** The node currently being moved */\n private moveTargetNode: TaxTreeNode | null = null;\n\n // ── Merge Into dialog state ──\n public ShowMergeIntoDialog = false;\n public MergeSourceTag: TaxTreeNode | null = null;\n public MergeTargetID: string | null = null;\n public MergeTargetData: { ID: string; Label: string }[] = [];\n\n // ── Treemap drill-in state ──\n /** Whether the treemap drill-in panel is visible */\n public ShowTreemapDrillIn = false;\n /** Tag node currently displayed in treemap drill-in */\n public TreemapDrillInNode: TaxTreeNode | null = null;\n\n /** Cached ScheduledAction entities, keyed by normalized ID */\n private scheduledActionsCache = new Map<string, MJScheduledActionEntity>();\n\n /**\n * Whether the currently selected source type is \"Entity\", which switches\n * the URL field to Entity/EntityDocument pickers.\n */\n /** Whether the selected source type is the Entity type (name-based check) */\n public get IsEntitySourceTypeSelected(): boolean {\n if (!this.FormSourceTypeID) return false;\n const sourceType = this.SourceTypeOptions.find(o => UUIDsEqual(o.ID, this.FormSourceTypeID));\n return sourceType?.Name?.toLowerCase() === 'entity';\n }\n\n /** Whether the selected source type requires Content Type / File Type selection */\n public get SelectedSourceTypeRequiresContentType(): boolean {\n if (!this.FormSourceTypeID) return true;\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const st = engine.ContentSourceTypes.find(t => UUIDsEqual(t.ID, this.FormSourceTypeID));\n return st?.ConfigurationObject?.RequiresContentType !== false;\n } catch {\n return true;\n }\n }\n\n /** Entities that have at least one EntityDocument configured */\n public get EntitiesWithDocuments(): { ID: string; Name: string }[] {\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const docs = engine.GetActiveEntityDocuments();\n const entityMap = new Map<string, string>();\n const md = this.ProviderToUse;\n for (const doc of docs) {\n const entityName = doc.Get('Entity') as string;\n if (entityName) {\n const entityInfo = md.Entities.find(e => e.Name === entityName);\n if (entityInfo && !entityMap.has(entityInfo.ID)) {\n entityMap.set(entityInfo.ID, entityInfo.Name);\n }\n }\n }\n return Array.from(entityMap.entries())\n .map(([ID, Name]) => ({ ID, Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n } catch {\n return [];\n }\n }\n\n /** Entity documents for the selected entity */\n public get EntityDocOptionsForSelectedEntity(): { ID: string; Name: string }[] {\n if (!this.FormSourceEntityID) return [];\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, this.FormSourceEntityID));\n if (!entityInfo) return [];\n return engine.GetActiveEntityDocuments()\n .filter(d => (d.Get('Entity') as string) === entityInfo.Name)\n .map(d => ({ ID: d.ID, Name: d.Name }));\n } catch {\n return [];\n }\n }\n\n // ── Dynamic source-type fields (metadata-driven) ──\n\n /** Stores source-type-specific config values keyed by RequiredFields[].Key */\n public FormSourceSpecificConfig: Record<string, string> = {};\n\n /** Available MJ Storage provider keys for the storage-provider-picker widget */\n public StorageProviderOptions: string[] = ['Azure Blob Storage', 'AWS S3', 'Google Cloud Storage', 'SharePoint', 'Dropbox', 'Box'];\n\n /**\n * The RequiredFields array from the selected source type's ConfigurationObject.\n * Drives dynamic form rendering — each field becomes a widget.\n */\n public get SelectedSourceTypeFields(): MJContentSourceTypeEntity_IContentSourceTypeField[] {\n if (!this.FormSourceTypeID) return [];\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const sourceType = engine.ContentSourceTypes.find(st => UUIDsEqual(st.ID, this.FormSourceTypeID));\n if (!sourceType) return [];\n const config = sourceType.ConfigurationObject;\n return config?.RequiredFields ?? [];\n } catch {\n return [];\n }\n }\n\n /**\n * Get dependent options for a field (e.g., entity-doc-picker depends on entity-picker).\n * Returns entity documents for the entity selected in the dependent field.\n */\n public GetDependentOptions(field: MJContentSourceTypeEntity_IContentSourceTypeField): { ID: string; Name: string }[] {\n if (field.Type === 'entity-doc-picker' && field.DependsOnField) {\n const entityID = this.FormSourceSpecificConfig[field.DependsOnField];\n if (!entityID) return [];\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityID));\n if (!entityInfo) return [];\n return engine.GetActiveEntityDocuments()\n .filter(d => (d.Get('Entity') as string) === entityInfo.Name)\n .map(d => ({ ID: d.ID, Name: d.Name }));\n } catch {\n return [];\n }\n }\n return [];\n }\n\n /**\n * Handle a source-specific field value change.\n * For entity-picker: auto-select the first entity doc if only one exists.\n */\n public OnSourceFieldChanged(fieldKey: string): void {\n // Find fields that depend on this field\n for (const field of this.SelectedSourceTypeFields) {\n if (field.DependsOnField === fieldKey) {\n const options = this.GetDependentOptions(field);\n if (options.length === 1) {\n this.FormSourceSpecificConfig[field.Key] = options[0].ID;\n } else {\n this.FormSourceSpecificConfig[field.Key] = '';\n }\n }\n }\n }\n\n // ── Detail panels ──\n public SelectedFeedItem: ContentItemDetail | null = null;\n public ShowItemDetail = false;\n public SelectedSource: SourceDetailInfo | null = null;\n public ShowSourceDetail = false;\n public SourceDetailLoading = false;\n\n // ── D4: Source detail status filter ──\n /** Filter content items in source detail by pipeline status */\n public SourceDetailStatusFilter: ItemPipelineStatus | 'All' = 'All';\n /** Available status options for the filter dropdown */\n public readonly SourceDetailStatusOptions: (ItemPipelineStatus | 'All')[] = ['All', 'Complete', 'Processing', 'Failed', 'Pending'];\n\n // ── D7: Source detail pagination ──\n /** Current page index (0-based) for source detail content list */\n public SourceDetailPage = 0;\n /** Number of content items per page in source detail */\n public readonly SourceDetailPageSize = 10;\n\n /**\n * Returns source detail content items filtered by SourceDetailStatusFilter,\n * then sliced to the current page.\n */\n public get FilteredSourceDetailItems(): ContentItemDetail[] {\n if (!this.SelectedSource) return [];\n const items = this.SourceDetailStatusFilter === 'All'\n ? this.SelectedSource.ContentItems\n : this.SelectedSource.ContentItems.filter(\n ci => ci.EmbeddingStatus === this.SourceDetailStatusFilter ||\n ci.TaggingStatus === this.SourceDetailStatusFilter\n );\n const start = this.SourceDetailPage * this.SourceDetailPageSize;\n return items.slice(start, start + this.SourceDetailPageSize);\n }\n\n /** Total number of filtered items (before pagination) */\n public get FilteredSourceDetailTotal(): number {\n if (!this.SelectedSource) return 0;\n if (this.SourceDetailStatusFilter === 'All') return this.SelectedSource.ContentItems.length;\n return this.SelectedSource.ContentItems.filter(\n ci => ci.EmbeddingStatus === this.SourceDetailStatusFilter ||\n ci.TaggingStatus === this.SourceDetailStatusFilter\n ).length;\n }\n\n /** Total pages for source detail pagination */\n public get SourceDetailTotalPages(): number {\n return Math.max(1, Math.ceil(this.FilteredSourceDetailTotal / this.SourceDetailPageSize));\n }\n\n /** Navigate to the previous page in source detail content list */\n public SourceDetailPrevPage(): void {\n if (this.SourceDetailPage > 0) {\n this.SourceDetailPage--;\n this.cdr.detectChanges();\n }\n }\n\n /** Navigate to the next page in source detail content list */\n public SourceDetailNextPage(): void {\n if (this.SourceDetailPage < this.SourceDetailTotalPages - 1) {\n this.SourceDetailPage++;\n this.cdr.detectChanges();\n }\n }\n\n /** Handle change of the source detail status filter dropdown */\n public OnSourceDetailStatusFilterChange(): void {\n this.SourceDetailPage = 0;\n this.cdr.detectChanges();\n }\n\n /**\n * D4: Placeholder handler for retrying failed items in source detail.\n * Re-runs the pipeline for the current source. In the future this could\n * target only Failed items.\n */\n public RetryFailedItems(): void {\n if (!this.SelectedSource) return;\n const failedCount = this.SelectedSource.ContentItems.filter(\n ci => ci.EmbeddingStatus === 'Failed' || ci.TaggingStatus === 'Failed'\n ).length;\n if (failedCount === 0) {\n MJNotificationService.Instance.CreateSimpleNotification('No failed items to retry', 'info', 2500);\n return;\n }\n MJNotificationService.Instance.CreateSimpleNotification(\n `Retry queued for ${failedCount} failed item${failedCount > 1 ? 's' : ''}. Pipeline will re-process on next run.`,\n 'info',\n 3000\n );\n }\n\n /** Returns the CSS class for a pipeline status badge color */\n public GetStatusBadgeClass(status: ItemPipelineStatus): string {\n switch (status) {\n case 'Complete': return 'at-status-badge-complete';\n case 'Processing': return 'at-status-badge-processing';\n case 'Failed': return 'at-status-badge-failed';\n case 'Pending': return 'at-status-badge-pending';\n }\n }\n\n // Dropdown options for forms\n public SourceTypeOptions: DropdownOption[] = [];\n public ContentTypeOptions: DropdownOption[] = [];\n public FileTypeOptions: DropdownOption[] = [];\n public AIModelOptions: DropdownOption[] = [];\n public EmbeddingModelOptions: DropdownOption[] = [];\n public VectorIndexOptions: DropdownOption[] = [];\n\n // Tree-dropdown configs for AI model selection (vendor → model grouping)\n public AIModelVendorBranch: TreeBranchConfig = {\n EntityName: 'MJ: AI Vendors',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-building',\n OrderBy: 'Name ASC',\n };\n public AllModelsLeaf: TreeLeafConfig = {\n EntityName: 'MJ: AI Models',\n ParentField: '',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-brain',\n OrderBy: '__mj_CreatedAt DESC',\n JunctionConfig: {\n EntityName: 'MJ: AI Model Vendors',\n LeafForeignKey: 'ModelID',\n BranchForeignKey: 'VendorID',\n },\n };\n /** Branch config filtered to only vendors that have at least one embedding model */\n public EmbeddingVendorBranch: TreeBranchConfig = {\n EntityName: 'MJ: AI Vendors',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-building',\n OrderBy: 'Name ASC',\n ExtraFilter: `ID IN (SELECT mv.VendorID FROM [__mj].vwAIModelVendors mv JOIN [__mj].vwAIModels m ON mv.ModelID = m.ID WHERE m.AIModelType = 'Embeddings')`,\n };\n public EmbeddingModelsLeaf: TreeLeafConfig = {\n EntityName: 'MJ: AI Models',\n ParentField: '',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-vector-square',\n ExtraFilter: \"AIModelType = 'Embeddings'\",\n OrderBy: '__mj_CreatedAt DESC',\n JunctionConfig: {\n EntityName: 'MJ: AI Model Vendors',\n LeafForeignKey: 'ModelID',\n BranchForeignKey: 'VendorID',\n },\n };\n\n // ── Raw data cache ──\n private contentSourcesRaw: Record<string, unknown>[] = [];\n private contentItemsRaw: Record<string, unknown>[] = [];\n private contentTagsRaw: Record<string, unknown>[] = [];\n private contentRunsRaw: Record<string, unknown>[] = [];\n private contentSourceTypesRaw: Record<string, unknown>[] = [];\n private contentTypesRaw: Record<string, unknown>[] = [];\n private contentFileTypesRaw: Record<string, unknown>[] = [];\n private aiModelsRaw: Record<string, unknown>[] = [];\n\n // ── Lifecycle ──\n\n private static readonly PREFS_KEY = 'KH_Classify_Preferences';\n\n async ngAfterViewInit(): Promise<void> {\n await Promise.all([\n KnowledgeHubMetadataEngine.Instance.Config(false),\n UserInfoEngine.Instance.Config(false),\n ]);\n this.loadClassifyPreferences();\n this.applyIncomingConfiguration();\n\n // Tags dashboard's default landing is the Tag Library — load that data\n // (and the entity-record-document cache used by drill-down) up front.\n await Promise.all([this.loadTagLibraryData(), this.loadEntityRecordDocCache()]);\n this.tabDataLoaded.add('tags');\n\n // If preferences/config set a non-default initial tab, load it eagerly.\n if (this.ActiveTab !== 'tags' && !this.tabDataLoaded.has(this.ActiveTab)) {\n await this.loadTabData(this.ActiveTab);\n this.tabDataLoaded.add(this.ActiveTab);\n }\n\n this.IsLoading = false;\n this.registerAgentTools();\n this.emitAgentContext();\n\n // D9: If navigated with tagSearch, switch to tags tab and pre-fill search\n await this.handleInitialTagSearch();\n\n this.cdr.detectChanges();\n this.NotifyLoadComplete();\n }\n\n /**\n * D9: Read incoming configuration from ResourceData (e.g. from Analytics tag navigation).\n * Sets the initial tab and tag search query if provided.\n */\n private applyIncomingConfiguration(): void {\n const config = this.Data?.Configuration as Record<string, unknown> | undefined;\n if (!config) return;\n\n const initialTab = config['initialTab'] as TabName | undefined;\n if (initialTab) {\n this.ActiveTab = initialTab;\n }\n }\n\n /**\n * D9: If a tagSearch parameter was provided via configuration, switch to the tags tab\n * and apply the search filter after tag data loads.\n */\n private async handleInitialTagSearch(): Promise<void> {\n const config = this.Data?.Configuration as Record<string, unknown> | undefined;\n const tagSearch = config?.['tagSearch'] as string | undefined;\n if (!tagSearch) return;\n\n // Ensure tag data is loaded\n if (!this.tabDataLoaded.has('tags')) {\n await this.loadTabData('tags');\n this.tabDataLoaded.add('tags');\n }\n\n this.TagSearchQuery = tagSearch;\n this.FilterTags();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Report current classify dashboard state to the agent */\n private emitAgentContext(): void {\n this.navigationService.SetAgentContext(this, {\n ActiveTab: this.ActiveTab,\n SourceCount: this.contentSourcesRaw.length,\n ContentItemCount: this.contentItemsRaw.length,\n TagCount: this.contentTagsRaw.length,\n PipelineStatus: this.IsRunning ? 'running' : 'idle',\n PipelineProgress: this.RunProgress,\n ShowPipelineConfig: this.ShowPipelineConfig,\n });\n }\n\n /** Register client tools the agent can invoke on the Classify dashboard */\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'SwitchClassifyTab',\n Description: 'Switch to a specific tab in the Classify dashboard',\n ParameterSchema: {\n type: 'object',\n properties: {\n tab: { type: 'string', enum: ['pipeline', 'sources', 'types', 'tags', 'taxonomy', 'history'], description: 'The tab to switch to' },\n },\n required: ['tab'],\n },\n Handler: async (params: Record<string, unknown>) => {\n await this.SwitchTab(params['tab'] as TabName);\n return { Success: true, Data: { ActiveTab: this.ActiveTab } };\n },\n },\n {\n Name: 'RunClassificationPipeline',\n Description: 'Trigger the content classification pipeline. Optionally filter to specific content source IDs.',\n ParameterSchema: {\n type: 'object',\n properties: {\n sourceIDs: { type: 'array', items: { type: 'string' }, description: 'Optional array of ContentSource IDs to process. Omit to run all.' },\n },\n },\n Handler: async (params: Record<string, unknown>) => {\n const sourceIDs = params['sourceIDs'] as string[] | undefined;\n await this.RunPipeline(sourceIDs);\n return { Success: true, Data: { PipelineStatus: 'running' } };\n },\n },\n {\n Name: 'SearchClassifyTags',\n Description: 'Filter the tag library by a search query',\n ParameterSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search text to filter tags by' },\n },\n required: ['query'],\n },\n Handler: async (params: Record<string, unknown>) => {\n this.TagSearchQuery = String(params['query'] ?? '');\n this.FilterTags();\n return { Success: true, Data: { MatchCount: this.FilteredTagRows.length } };\n },\n },\n ]);\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Classify';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-tags';\n }\n\n // ── Tab switching ──\n\n public async SwitchTab(tab: TabName): Promise<void> {\n if (tab === this.ActiveTab) return;\n this.ActiveTab = tab;\n this.persistClassifyPreferences();\n this.emitAgentContext();\n this.cdr.detectChanges();\n\n if (!this.tabDataLoaded.has(tab)) {\n await this.loadTabData(tab);\n this.tabDataLoaded.add(tab);\n this.cdr.detectChanges();\n }\n }\n\n private async loadTabData(tab: TabName): Promise<void> {\n switch (tab) {\n case 'pipeline':\n await this.LoadPipelineData();\n break;\n case 'sources':\n await this.loadSourcesData();\n break;\n case 'types':\n await this.loadContentTypesData();\n break;\n case 'tags':\n await this.loadTagLibraryData();\n break;\n case 'taxonomy':\n await this.loadTaxonomyData();\n // Pull pending suggestions so the Duplicates / Orphans sub-tabs are populated.\n await this.loadSuggestions();\n break;\n case 'history':\n await this.loadRunHistoryData();\n break;\n case 'suggestions':\n await this.loadSuggestions();\n break;\n case 'health':\n // Health tab uses already-loaded suggestion totals + threshold defaults.\n if (this.SuggestionRows.length === 0) await this.loadSuggestions();\n break;\n }\n }\n\n // ════════════════════════════════════════════\n // PIPELINE TAB — Data Loading & Building\n // ════════════════════════════════════════════\n\n public async LoadPipelineData(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [sourcesResult, itemsResult, runsResult, tagsResult, sourceTypesResult, contentTypesResult] = await rv.RunViews([\n { EntityName: 'MJ: Content Sources', OrderBy: 'Name', ResultType: 'simple' },\n { EntityName: 'MJ: Content Items', OrderBy: '__mj_UpdatedAt DESC', MaxRows: 200, ResultType: 'simple', Fields: ['ID', 'Name', 'ContentSourceID', 'ContentSourceTypeID', 'ContentSource', 'ContentSourceType', 'ContentType', 'ContentFileType', 'URL', 'Text', 'Checksum', 'EntityRecordDocumentID', '__mj_CreatedAt', '__mj_UpdatedAt'] },\n { EntityName: 'MJ: Content Process Runs', OrderBy: 'StartTime DESC', MaxRows: 100, ResultType: 'simple' },\n { EntityName: 'MJ: Content Item Tags', ResultType: 'simple', Fields: ['ID', 'ItemID', 'Item', 'Tag', 'TagID', 'Weight', '__mj_CreatedAt'] },\n { EntityName: 'MJ: Content Source Types', ResultType: 'simple' },\n { EntityName: 'MJ: Content Types', ResultType: 'simple' }\n ]);\n\n this.contentSourcesRaw = sourcesResult.Success ? sourcesResult.Results : [];\n this.contentItemsRaw = itemsResult.Success ? itemsResult.Results : [];\n this.contentRunsRaw = runsResult.Success ? runsResult.Results : [];\n this.contentTagsRaw = tagsResult.Success ? tagsResult.Results : [];\n this.contentSourceTypesRaw = sourceTypesResult.Success ? sourceTypesResult.Results : [];\n this.contentTypesRaw = contentTypesResult.Success ? contentTypesResult.Results : [];\n\n // Use TotalRowCount for accurate KPI/badge counts (the Results arrays are\n // capped by MaxRows for feed display, but TotalRowCount reflects the full DB count)\n this.totalContentItemCount = itemsResult.Success ? itemsResult.TotalRowCount : 0;\n this.totalContentTagCount = tagsResult.Success ? tagsResult.TotalRowCount : 0;\n\n // Load ScheduledAction entities referenced by sources so cron descriptions are available\n await this.loadScheduledActionsForSources();\n\n this.buildNavItems();\n this.buildKPIMetrics();\n this.buildPipelineStages();\n this.buildFeedItems();\n this.buildSourceMinis();\n this.buildTrendingTags();\n } catch (error) {\n console.error('[Autotagging] Error loading pipeline data:', error);\n }\n }\n\n private buildNavItems(): void {\n // Tags dashboard shows only tag-related sections. The pipeline / sources /\n // types / history surfaces live in the Classify dashboard instead.\n this.NavItems = [\n { Tab: 'tags', Icon: 'fa-solid fa-chart-simple', Label: 'Overview', BadgeText: String(this.totalContentTagCount), BadgeClass: '' },\n { Tab: 'taxonomy', Icon: 'fa-solid fa-sitemap', Label: 'Taxonomy', BadgeText: String(this.tagsRaw.length || ''), BadgeClass: '' },\n { Tab: 'suggestions', Icon: 'fa-solid fa-inbox', Label: 'Suggestions', BadgeText: String(this.PendingSuggestionCount || ''), BadgeClass: '' },\n { Tab: 'health', Icon: 'fa-solid fa-heart-pulse', Label: 'Health', BadgeText: '', BadgeClass: '' },\n ];\n }\n\n private buildKPIMetrics(): void {\n const sourceCount = this.contentSourcesRaw.length;\n const itemCount = this.totalContentItemCount;\n const tagCount = this.totalContentTagCount;\n const errorCount = this.contentRunsRaw.filter(r => (r['Status'] as string)?.toLowerCase() === 'error' || (r['Status'] as string)?.toLowerCase() === 'failed').length;\n\n this.KPIMetrics = [\n { Label: 'Active Sources', Value: sourceCount, Icon: 'fa-solid fa-satellite-dish', Trend: '', TrendUp: true },\n { Label: 'Content Items', Value: itemCount, Icon: 'fa-solid fa-file-lines', Trend: '', TrendUp: true },\n { Label: 'Tags Generated', Value: tagCount, Icon: 'fa-solid fa-tags', Trend: tagCount > 0 && itemCount > 0 ? `${(tagCount / itemCount).toFixed(1)} avg/item` : '', TrendUp: true },\n { Label: 'Errors', Value: errorCount, Icon: 'fa-solid fa-circle-exclamation', Trend: '', TrendUp: false }\n ];\n }\n\n private buildPipelineStages(): void {\n this.PipelineStages = [\n { Name: 'Ingest', Icon: 'fa-solid fa-download', Status: 'idle', Count: '\\u2014' },\n { Name: 'Extract', Icon: 'fa-solid fa-file-lines', Status: 'idle', Count: '\\u2014' },\n { Name: 'Chunk', Icon: 'fa-solid fa-scissors', Status: 'idle', Count: '\\u2014' },\n { Name: 'Tag', Icon: 'fa-solid fa-tags', Status: 'idle', Count: '\\u2014' },\n { Name: 'Vectorize', Icon: 'fa-solid fa-vector-square', Status: 'idle', Count: '\\u2014' }\n ];\n }\n\n private buildFeedItems(): void {\n const tagsByItem = this.countTagsByItem();\n\n this.FeedItems = this.contentItemsRaw.map(item => {\n const itemId = item['ID'] as string;\n const normalizedId = NormalizeUUID(itemId);\n const itemTags = this.getTopTagsForItem(itemId, 3);\n return {\n Name: (item['Name'] as string) ?? 'Unnamed Item',\n SourceName: (item['ContentSource'] as string) ?? 'Unknown',\n Tags: itemTags,\n TimeAgo: this.formatRelativeTime(item['__mj_UpdatedAt'] as string),\n Status: this.inferItemStatus(tagsByItem.get(normalizedId) ?? 0)\n };\n });\n }\n\n private buildSourceMinis(): void {\n // When items are capped by MaxRows, countItemsBySource() undercounts.\n // For a single source, use the accurate totalContentItemCount instead.\n const singleSource = this.contentSourcesRaw.length === 1;\n const itemCountBySource = singleSource ? null : this.countItemsBySource();\n this.SourceMinis = this.contentSourcesRaw.map(source => {\n const id = source['ID'] as string;\n const itemCount = singleSource ? this.totalContentItemCount : (itemCountBySource!.get(id) ?? 0);\n const typeName = (source['ContentSourceType'] as string) ?? 'Unknown';\n return {\n ID: id,\n Name: (source['Name'] as string) ?? 'Unnamed',\n Icon: this.GetSourceTypeIcon(typeName),\n Meta: `${this.formatNumber(itemCount)} items`,\n StatusClass: 'active' as const\n };\n });\n }\n\n /**\n * D6: Build trending tags weighted by recency (last 7 days).\n * Counts tags from ContentItemTag records created in the last 7 days\n * and weights by frequency. Falls back to all-time data if no recent tags.\n */\n private buildTrendingTags(): void {\n const sevenDaysAgo = new Date(Date.now() - 7 * 86400000);\n const recentTags = this.contentTagsRaw.filter(tag => {\n const d = tag['__mj_CreatedAt'] as string | undefined;\n return d && new Date(d) >= sevenDaysAgo;\n });\n\n const scored = this.computeTrendingFromTags(recentTags.length > 0 ? recentTags : this.contentTagsRaw);\n const maxScore = scored.length > 0 ? scored[0].score : 1;\n\n this.TrendingTags = scored.map(s => ({\n Tag: s.tag,\n AvgWeight: s.weight,\n SizeClass: s.score >= maxScore * 0.7 ? 'large' : s.score >= maxScore * 0.3 ? '' : 'small'\n }));\n }\n\n /**\n * Compute scored trending tags from a given set of tag records.\n * Returns top 12 tags sorted by score (frequency x avg weight).\n */\n private computeTrendingFromTags(tags: Record<string, unknown>[]): { tag: string; count: number; weight: number; score: number }[] {\n const counts = new Map<string, number>();\n const weightSums = new Map<string, number>();\n for (const tag of tags) {\n const t = tag['Tag'] as string;\n const w = Number(tag['Weight'] ?? 0.5);\n if (t) {\n counts.set(t, (counts.get(t) ?? 0) + 1);\n weightSums.set(t, (weightSums.get(t) ?? 0) + w);\n }\n }\n return Array.from(counts.entries()).map(([tag, count]) => {\n const weight = count > 0 ? (weightSums.get(tag) ?? 0) / count : 1.0;\n return { tag, count, weight, score: count * weight };\n }).sort((a, b) => b.score - a.score).slice(0, 12);\n }\n\n // ════════════════════════════════════════════\n // SOURCES TAB\n // ════════════════════════════════════════════\n\n private async loadSourcesData(): Promise<void> {\n await this.ensureBaseDataLoaded();\n this.buildSourceCards();\n }\n\n private buildSourceCards(): void {\n // When there's a single source, use the accurate total counts from TotalRowCount\n // instead of counting from the capped contentItemsRaw/contentTagsRaw arrays.\n const singleSource = this.contentSourcesRaw.length === 1;\n const itemCountBySource = singleSource ? null : this.countItemsBySource();\n const tagCountBySource = singleSource ? null : this.countTagsBySource();\n const lastRunBySource = this.getLastRunBySource();\n\n this.SourceCards = this.contentSourcesRaw.map(source => {\n const id = source['ID'] as string;\n const itemCount = singleSource ? this.totalContentItemCount : (itemCountBySource!.get(id) ?? 0);\n const tagCount = singleSource ? this.totalContentTagCount : (tagCountBySource!.get(id) ?? 0);\n const avgTags = itemCount > 0 ? (tagCount / itemCount).toFixed(1) : '0';\n const lastRun = lastRunBySource.get(id);\n const typeName = (source['ContentSourceType'] as string) ?? 'Unknown';\n const lastRunStatus = lastRun ? (lastRun['Status'] as string)?.toLowerCase() : null;\n const hasError = lastRunStatus === 'error' || lastRunStatus === 'failed';\n\n const scheduledActionID = (source['ScheduledActionID'] as string | null) ?? null;\n const scheduledActionName = (source['ScheduledAction'] as string | null) ?? null;\n const cronExpr = scheduledActionID ? this.getScheduledActionCron(scheduledActionID) : null;\n\n return {\n ID: id,\n Name: (source['Name'] as string) ?? 'Unnamed Source',\n SourceTypeName: typeName,\n ContentTypeName: (source['ContentType'] as string) ?? 'Unknown',\n FileTypeName: (source['ContentFileType'] as string) ?? 'Unknown',\n Icon: this.GetSourceTypeIcon(typeName),\n StatusClass: hasError ? 'error' as const : 'active' as const,\n StatusLabel: hasError ? 'Error' : 'Active',\n URL: (source['URL'] as string) ?? '',\n ItemCount: itemCount,\n TagCount: tagCount,\n AvgTags: avgTags,\n LastRunAgo: lastRun ? this.formatRelativeTime(lastRun['StartTime'] as string) : 'Never',\n ContentSourceTypeID: source['ContentSourceTypeID'] as string,\n ContentTypeID: source['ContentTypeID'] as string,\n ContentFileTypeID: source['ContentFileTypeID'] as string,\n EmbeddingModelID: (source['EmbeddingModelID'] as string) ?? '',\n VectorIndexID: (source['VectorIndexID'] as string) ?? '',\n EntityID: (source['EntityID'] as string) ?? '',\n EntityDocumentID: (source['EntityDocumentID'] as string) ?? '',\n RequiresFileType: this.sourceTypeRequiresFileType(source['ContentSourceTypeID'] as string),\n ScheduledActionID: scheduledActionID,\n ScheduledActionName: scheduledActionName,\n ScheduleDescription: cronExpr ? CronToHumanReadable(cronExpr) : null,\n };\n });\n }\n\n /** Resolve the entity record ID from the EntityRecordDocument for entity-sourced content items */\n private resolveEntityRecordID(item: Record<string, unknown>, sourceId: string): string | null {\n const erdID = item['EntityRecordDocumentID'] as string | null;\n if (!erdID) return null;\n return this.entityRecordDocCache.get(NormalizeUUID(erdID)) ?? null;\n }\n\n /** Resolve the entity name for an entity-sourced content source */\n private resolveEntityName(sourceId: string): string | null {\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const source = engine.ContentSources.find(cs => UUIDsEqual(cs.ID, sourceId));\n if (!source?.EntityID) return null;\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, source.EntityID));\n return entityInfo?.Name ?? null;\n } catch {\n return null;\n }\n }\n\n /** Check if a source type's Configuration says RequiresFileType !== false */\n private sourceTypeRequiresFileType(sourceTypeID: string): boolean {\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const st = engine.ContentSourceTypes.find(t => UUIDsEqual(t.ID, sourceTypeID));\n return st?.ConfigurationObject?.RequiresFileType !== false;\n } catch {\n return true;\n }\n }\n\n // ════════════════════════════════════════════\n // CONTENT TYPES TAB\n // ════════════════════════════════════════════\n\n private async loadContentTypesData(): Promise<void> {\n if (this.contentTypesRaw.length === 0) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({ EntityName: 'MJ: Content Types', ResultType: 'simple' });\n if (result.Success) this.contentTypesRaw = result.Results;\n }\n await this.ensureBaseDataLoaded();\n this.buildContentTypeCards();\n }\n\n private buildContentTypeCards(): void {\n const sourcesUsingByType = this.countSourcesByContentType();\n // When items are capped by MaxRows, countItemsByContentType undercounts.\n // For a single content type, use the accurate totalContentItemCount.\n const singleType = this.contentTypesRaw.length === 1;\n const itemsByType = singleType ? null : this.countItemsByContentType();\n\n this.ContentTypeCards = this.contentTypesRaw.map(ct => {\n const id = ct['ID'] as string;\n const minTags = (ct['MinTags'] as number) ?? 1;\n const maxTags = (ct['MaxTags'] as number) ?? 10;\n const range = 15; // max possible\n return {\n ID: id,\n Name: (ct['Name'] as string) ?? 'Unnamed',\n Description: (ct['Description'] as string) ?? '',\n AIModelName: (ct['AIModel'] as string) ?? 'Default Model',\n AIModelID: (ct['AIModelID'] as string) ?? '',\n MinTags: minTags,\n MaxTags: maxTags,\n SourcesUsing: sourcesUsingByType.get(id) ?? 0,\n ItemsTagged: singleType ? this.totalContentItemCount : (itemsByType!.get(id) ?? 0),\n RangeLeftPct: Math.round((minTags / range) * 100),\n RangeRightPct: Math.round(100 - (maxTags / range) * 100),\n EmbeddingModelID: (ct['EmbeddingModelID'] as string) ?? '',\n VectorIndexID: (ct['VectorIndexID'] as string) ?? ''\n };\n });\n }\n\n // ════════════════════════════════════════════\n // TAG LIBRARY TAB\n // ════════════════════════════════════════════\n\n private async loadTagLibraryData(): Promise<void> {\n await this.ensureBaseDataLoaded();\n this.buildTagRows();\n this.buildTagCloud();\n this.buildTagsBySource();\n this.FilteredTagRows = this.TagRows;\n }\n\n private buildTagRows(): void {\n const tagCounts = this.countAllTags();\n const avgWeights = this.computeAvgWeights();\n const tagSourceMap = this.getTopSourcePerTag();\n const tagFirstSeen = this.getFirstSeenPerTag();\n const sorted = Array.from(tagCounts.entries()).sort((a, b) => b[1] - a[1]);\n const maxCount = sorted.length > 0 ? sorted[0][1] : 1;\n\n this.TagRows = sorted.map(([tag, count]) => ({\n Tag: tag,\n UsageCount: count,\n AvgWeight: avgWeights.get(tag) ?? 1.0,\n BarWidthPct: Math.round((count / maxCount) * 100),\n TopSource: tagSourceMap.get(tag) ?? 'Unknown',\n FirstSeen: tagFirstSeen.get(tag) ?? ''\n }));\n }\n\n private buildTagCloud(): void {\n const tagCounts = this.countAllTags();\n const avgWeights = this.computeAvgWeights();\n // Sort by a combined score: usage count * avg weight (so high-weight, high-count tags bubble up)\n const scored = Array.from(tagCounts.entries()).map(([tag, count]) => {\n const weight = avgWeights.get(tag) ?? 1.0;\n return { tag, count, weight, score: count * weight };\n }).sort((a, b) => b.score - a.score).slice(0, 20);\n const maxScore = scored.length > 0 ? scored[0].score : 1;\n\n this.TagCloud = scored.map(s => ({\n Tag: s.tag,\n AvgWeight: s.weight,\n SizeClass: s.score >= maxScore * 0.7 ? 'large' : s.score >= maxScore * 0.3 ? '' : 'small'\n }));\n\n // Build WordCloudItem[] for the mj-word-cloud component\n this.TagCloudWordItems = scored.map(s => ({\n Text: s.tag,\n Weight: maxScore > 0 ? s.score / maxScore : 0,\n Metadata: { Count: s.count, AvgWeight: s.weight }\n }));\n }\n\n private buildTagsBySource(): void {\n const sourceTagCounts = new Map<string, number>();\n const itemSourceMap = new Map<string, string>();\n for (const item of this.contentItemsRaw) {\n itemSourceMap.set(item['ID'] as string, (item['ContentSource'] as string) ?? 'Unknown');\n }\n for (const tag of this.contentTagsRaw) {\n const source = itemSourceMap.get(tag['ItemID'] as string) ?? 'Unknown';\n sourceTagCounts.set(source, (sourceTagCounts.get(source) ?? 0) + 1);\n }\n this.TagsBySource = Array.from(sourceTagCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([name, count]) => ({ SourceName: name, Count: count }));\n }\n\n /** Convert a string ID to a CompositeKey for tree-dropdown binding */\n public ToCompositeKey(id: string | null | undefined): CompositeKey | null {\n if (!id) return null;\n return new CompositeKey([{ FieldName: 'ID', Value: id }]);\n }\n\n /** Extract the ID string from a CompositeKey (from tree-dropdown ValueChange) */\n public FromCompositeKey(key: CompositeKey | CompositeKey[] | null): string {\n if (!key) return '';\n const ck = Array.isArray(key) ? key[0] : key;\n if (!ck?.KeyValuePairs?.length) return '';\n return String(ck.KeyValuePairs[0].Value || '');\n }\n\n public FilterTags(): void {\n const q = this.TagSearchQuery.toLowerCase().trim();\n this.FilteredTagRows = q\n ? this.TagRows.filter(r => r.Tag.toLowerCase().includes(q))\n : this.TagRows;\n this.cdr.detectChanges();\n }\n\n /** Drill down into content items matching a specific tag */\n public DrillDownTag(tagName: string): void {\n if (this.SelectedDrillDownTag === tagName) {\n this.CloseDrillDownTag();\n return;\n }\n this.SelectedDrillDownTag = tagName;\n\n // Find all content items that have this tag\n const matchingItemIDs = new Map<string, number>(); // itemID → weight\n for (const tag of this.contentTagsRaw) {\n if ((tag['Tag'] as string) === tagName) {\n matchingItemIDs.set(\n NormalizeUUID(tag['ItemID'] as string),\n Number(tag['Weight'] ?? 1)\n );\n }\n }\n\n this.TagDrillDownItems = [];\n for (let i = 0; i < this.contentItemsRaw.length; i++) {\n const item = this.contentItemsRaw[i];\n const normalizedID = NormalizeUUID(item['ID'] as string);\n const weight = matchingItemIDs.get(normalizedID);\n if (weight !== undefined) {\n this.TagDrillDownItems.push({\n ID: item['ID'] as string,\n Name: (item['Name'] as string) ?? 'Unnamed',\n SourceName: (item['ContentSource'] as string) ?? 'Unknown',\n Weight: weight,\n UpdatedAt: this.formatShortDate((item['__mj_UpdatedAt'] as string) ?? ''),\n FeedIndex: i,\n });\n }\n }\n\n // Sort by weight descending\n this.TagDrillDownItems.sort((a, b) => b.Weight - a.Weight);\n this.cdr.detectChanges();\n }\n\n public CloseDrillDownTag(): void {\n this.SelectedDrillDownTag = null;\n this.TagDrillDownItems = [];\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // RUN HISTORY TAB\n // ════════════════════════════════════════════\n\n private async loadRunHistoryData(): Promise<void> {\n if (this.contentRunsRaw.length === 0) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Content Process Runs',\n OrderBy: 'StartTime DESC',\n MaxRows: 200,\n ResultType: 'simple'\n });\n if (result.Success) this.contentRunsRaw = result.Results;\n }\n this.buildRunHistoryRows();\n this.buildHistorySourceOptions();\n this.FilteredRunRows = this.RunHistoryRows;\n }\n\n private buildRunHistoryRows(): void {\n this.RunHistoryRows = this.contentRunsRaw.map(run => {\n const status = (run['Status'] as string) ?? 'Unknown';\n const startTime = run['StartTime'] as string | null;\n const endTime = run['EndTime'] as string | null;\n const duration = this.computeDuration(startTime, endTime);\n const processedItems = run['ProcessedItems'] as number | null;\n const errorCount = run['ErrorCount'] as number | null;\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'error' || statusLower === 'failed';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const hasErrors = (errorCount ?? 0) > 0;\n\n return {\n ID: run['ID'] as string,\n Status: this.displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n SourceName: (run['Source'] as string) ?? 'Unknown',\n StartedDisplay: startTime ? this.formatDate(startTime) : '\\u2014',\n Duration: duration,\n Items: processedItems != null ? this.formatNumber(processedItems) : '\\u2014',\n Tags: '\\u2014',\n Errors: hasErrors ? this.formatNumber(errorCount!) : (isFailed ? status : '0'),\n ErrorClass: isFailed || hasErrors ? 'run-error-text' : ''\n };\n });\n }\n\n private buildHistorySourceOptions(): void {\n const sources = new Set<string>();\n for (const run of this.contentRunsRaw) {\n const s = run['Source'] as string;\n if (s) sources.add(s);\n }\n this.HistorySourceOptions = Array.from(sources).sort();\n }\n\n public FilterRunHistory(): void {\n this.FilteredRunRows = this.RunHistoryRows.filter(row => {\n if (this.HistorySourceFilter && row.SourceName !== this.HistorySourceFilter) return false;\n if (this.HistoryStatusFilter && row.StatusClass !== this.HistoryStatusFilter) return false;\n return true;\n });\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // D3/D8: RUN HISTORY DETAIL SLIDE-IN\n // ════════════════════════════════════════════\n\n /**\n * D3/D8: Open the detail view for a specific run, loading ContentProcessRunDetail records.\n */\n public async OpenRunDetail(runID: string): Promise<void> {\n if (this.SelectedRunID === runID) {\n this.CloseRunDetail();\n return;\n }\n this.SelectedRunID = runID;\n this.IsLoadingRunDetail = true;\n this.RunDetailRows = [];\n this.cdr.detectChanges();\n\n await this.loadRunDetailRows(runID);\n\n this.IsLoadingRunDetail = false;\n this.cdr.detectChanges();\n }\n\n /** D3/D8: Close the run detail slide-in */\n public CloseRunDetail(): void {\n this.SelectedRunID = null;\n this.RunDetailRows = [];\n this.IsLoadingRunDetail = false;\n this.cdr.detectChanges();\n }\n\n /**\n * D2/D3/D8: Load ContentProcessRunDetail records for a given run and map to RunDetailRow[].\n */\n private async loadRunDetailRows(runID: string): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Content Process Run Details',\n ExtraFilter: `ContentProcessRunID='${runID}'`,\n OrderBy: 'ContentSource',\n ResultType: 'simple',\n });\n if (result.Success) {\n this.RunDetailRows = this.mapRunDetailRecords(result.Results);\n }\n }\n\n /**\n * D2: Load live per-source progress for the currently running pipeline.\n * Called when the pipeline is actively running.\n */\n public async LoadLiveRunDetails(): Promise<void> {\n // Find the most recent running pipeline run\n const runningRun = this.contentRunsRaw.find(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return status === 'running' || status === 'processing' || status === 'in progress';\n });\n if (!runningRun) {\n this.LiveRunDetailRows = [];\n return;\n }\n\n this.IsLoadingLiveDetails = true;\n this.cdr.detectChanges();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Content Process Run Details',\n ExtraFilter: `ContentProcessRunID='${String(runningRun['ID'])}'`,\n OrderBy: 'ContentSource',\n ResultType: 'simple',\n });\n if (result.Success) {\n this.LiveRunDetailRows = this.mapRunDetailRecords(result.Results);\n }\n\n this.IsLoadingLiveDetails = false;\n this.cdr.detectChanges();\n }\n\n /** Map raw ContentProcessRunDetail records to RunDetailRow[] */\n private mapRunDetailRecords(records: Record<string, unknown>[]): RunDetailRow[] {\n return records.map(d => {\n const status = String(d['Status'] || 'Pending');\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'failed' || statusLower === 'error';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const startTime = d['StartTime'] ? new Date(String(d['StartTime'])) : null;\n const endTime = d['EndTime'] ? new Date(String(d['EndTime'])) : null;\n const durationMs = startTime && endTime ? endTime.getTime() - startTime.getTime() : 0;\n const durationStr = durationMs > 60000 ? `${Math.round(durationMs / 60000)}m` : `${Math.round(durationMs / 1000)}s`;\n\n return {\n SourceName: String(d['ContentSource'] || 'Unknown'),\n SourceType: String(d['ContentSourceType'] || ''),\n Status: this.displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n ItemsProcessed: Number(d['ItemsProcessed'] || 0),\n ItemsTagged: Number(d['ItemsTagged'] || 0),\n ItemsVectorized: Number(d['ItemsVectorized'] || 0),\n ErrorCount: Number(d['ErrorCount'] || 0),\n TotalTokens: Number(d['TotalTokensUsed'] || 0),\n TotalCost: Number(d['TotalCost'] || 0),\n Duration: durationStr,\n };\n });\n }\n\n // ════════════════════════════════════════════\n // SLIDE-IN FORM — Sources\n // ════════════════════════════════════════════\n\n public async OpenAddSourceForm(): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.resetSourceForm();\n this.FormMode = 'add-source';\n this.cdr.detectChanges();\n }\n\n public async OpenEditSourceForm(card: SourceCard): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.FormSourceName = card.Name;\n this.FormSourceTypeID = card.ContentSourceTypeID;\n this.FormContentTypeID = card.ContentTypeID;\n this.FormFileTypeID = card.ContentFileTypeID;\n this.FormSourceURL = card.URL;\n this.FormSourceEntityID = card.EntityID ?? '';\n this.FormSourceEntityDocID = card.EntityDocumentID ?? '';\n this.FormSourceEmbeddingModelID = card.EmbeddingModelID ?? '';\n this.FormSourceVectorIndexID = card.VectorIndexID ?? '';\n this.EditingSourceID = card.ID;\n\n // Populate FormSourceSpecificConfig from existing Configuration JSON\n this.FormSourceSpecificConfig = {};\n const rawSource = this.contentSourcesRaw.find(s => UUIDsEqual(s['ID'] as string, card.ID));\n if (rawSource) {\n const configStr = rawSource['Configuration'] as string | null;\n if (configStr) {\n try {\n const parsed = JSON.parse(configStr);\n const specific = parsed?.SourceSpecificConfiguration as Record<string, string> | undefined;\n if (specific) {\n this.FormSourceSpecificConfig = { ...specific };\n }\n } catch {\n // Configuration not valid JSON, ignore\n }\n }\n }\n\n this.FormMode = 'edit-source';\n this.cdr.detectChanges();\n }\n\n public async SaveSource(): Promise<void> {\n if (this.FormSaving) return;\n\n // Validate required fields before saving\n if (!this.FormSourceName.trim()) {\n MJNotificationService.Instance.CreateSimpleNotification('Please enter a source name.', 'warning', 3000);\n return;\n }\n if (!this.FormSourceTypeID) {\n MJNotificationService.Instance.CreateSimpleNotification('Please select a source type.', 'warning', 3000);\n return;\n }\n\n // For non-Entity source types, ContentType is required\n if (!this.IsEntitySourceTypeSelected && this.SelectedSourceTypeRequiresContentType) {\n if (!this.FormContentTypeID) {\n if (this.ContentTypeOptions.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'No content types are configured. Please create a content type first in the Content Types section.',\n 'warning', 5000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select a content type.',\n 'warning', 3000\n );\n }\n return;\n }\n }\n\n this.FormSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJContentSourceEntity>('MJ: Content Sources');\n\n if (this.FormMode === 'edit-source' && this.EditingSourceID) {\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.EditingSourceID }]));\n } else {\n entity.NewRecord();\n }\n\n entity.Name = this.FormSourceName;\n entity.ContentSourceTypeID = this.FormSourceTypeID;\n\n // For Entity source type, ContentType and FileType are not relevant\n // but the DB columns are NOT NULL, so default to the first available value\n if (this.IsEntitySourceTypeSelected) {\n const engine = KnowledgeHubMetadataEngine.Instance;\n if (!entity.ContentTypeID) {\n if (engine.ContentTypes.length === 0) {\n this.FormSaving = false;\n this.cdr.detectChanges();\n this.ShowNoContentTypeWarning = true;\n return;\n }\n entity.ContentTypeID = engine.ContentTypes[0].ID;\n }\n if (!entity.ContentFileTypeID && engine.ContentFileTypes.length > 0) {\n entity.ContentFileTypeID = engine.ContentFileTypes[0].ID;\n }\n } else {\n entity.ContentTypeID = this.FormContentTypeID;\n entity.ContentFileTypeID = this.FormFileTypeID;\n }\n\n // Store source-type-specific values from the dynamic form\n // For Entity type: EntityID and EntityDocumentID go on the entity directly\n if (this.IsEntitySourceTypeSelected) {\n entity.EntityID = this.FormSourceSpecificConfig['EntityID'] || null;\n const entityDocID = this.FormSourceSpecificConfig['EntityDocumentID'];\n if (entityDocID) {\n entity.EntityDocumentID = entityDocID;\n } else {\n // Auto-select first doc if only one exists\n const docField = this.SelectedSourceTypeFields.find(f => f.Type === 'entity-doc-picker');\n const docs = docField ? this.GetDependentOptions(docField) : [];\n entity.EntityDocumentID = docs.length > 0 ? docs[0].ID : null;\n }\n entity.URL = '';\n } else {\n entity.EntityID = null;\n entity.EntityDocumentID = null;\n // URL comes from dynamic fields for RSS/Website, or empty for others\n entity.URL = this.FormSourceSpecificConfig['URL'] || '';\n }\n\n // Store the full SourceSpecificConfiguration in the Configuration JSON\n const currentConfig = entity.ConfigurationObject ?? {};\n currentConfig.SourceSpecificConfiguration = { ...this.FormSourceSpecificConfig };\n entity.ConfigurationObject = currentConfig;\n\n entity.EmbeddingModelID = this.FormSourceEmbeddingModelID || null;\n entity.VectorIndexID = this.FormSourceVectorIndexID || null;\n\n const saved = await entity.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n this.FormMode === 'edit-source' ? 'Source updated' : 'Source created', 'success', 2500\n );\n this.CloseForm();\n await this.refreshSourcesTab();\n } else {\n // CP-4: Show detailed error from LatestResult\n const errorDetail = entity.LatestResult?.Message ?? 'Unknown error';\n console.error('[Classify] Save source failed:', entity.LatestResult);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to save source: ${errorDetail}`, 'error', 5000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[Classify] Save source exception:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.FormSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n public async DeleteSource(card: SourceCard): Promise<void> {\n if (!confirm(`Delete source \"${card.Name}\"? This cannot be undone.`)) return;\n\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Content Sources');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: card.ID }]));\n const deleted = await entity.Delete();\n if (deleted) {\n MJNotificationService.Instance.CreateSimpleNotification('Source deleted', 'success', 2500);\n await this.refreshSourcesTab();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to delete source', 'error', 3000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n // ════════════════════════════════════════════\n // SCHEDULE DIALOG — Quick Schedule for Source\n // ════════════════════════════════════════════\n\n /**\n * Opens the schedule dialog pre-filled for the given source card.\n * Defaults to a daily 2 AM cron expression.\n * @param card The source card to create a schedule for\n */\n public OpenScheduleDialog(card: SourceCard): void {\n this.SchedulingSourceCard = card;\n this.ScheduleCron = '0 2 * * *';\n this.ScheduleEnabled = true;\n this.ShowScheduleDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the schedule dialog without saving */\n public CloseScheduleDialog(): void {\n this.ShowScheduleDialog = false;\n this.SchedulingSourceCard = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Saves a new ScheduledAction for the current source, links it\n * via ContentSource.ScheduledActionID, and creates the default\n * action params for the Autotag and Vectorize action.\n */\n public async SaveSchedule(): Promise<void> {\n if (this.ScheduleSaving || !this.SchedulingSourceCard) return;\n this.ScheduleSaving = true;\n this.cdr.detectChanges();\n\n const card = this.SchedulingSourceCard;\n\n try {\n const md = this.ProviderToUse;\n\n // 1. Find the \"Autotag and Vectorize Content\" action\n const actionID = await this.findAutotagActionID();\n if (!actionID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Could not find the \"Autotag and Vectorize Content\" action. Please check action configuration.',\n 'error', 5000\n );\n return;\n }\n\n // 2. Create the ScheduledAction\n const scheduledAction = await md.GetEntityObject<MJScheduledActionEntity>('MJ: Scheduled Actions');\n scheduledAction.NewRecord();\n scheduledAction.Name = `Autotag: ${card.Name}`;\n scheduledAction.Description = `Automated classification pipeline for content source \"${card.Name}\"`;\n scheduledAction.ActionID = actionID;\n scheduledAction.Type = 'Custom';\n scheduledAction.CronExpression = this.ScheduleCron;\n scheduledAction.CustomCronExpression = this.ScheduleCron;\n scheduledAction.Status = this.ScheduleEnabled ? 'Active' : 'Disabled';\n scheduledAction.Timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n const saved = await scheduledAction.Save();\n if (!saved) {\n const errorDetail = scheduledAction.LatestResult?.Message ?? 'Unknown error';\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to create schedule: ${errorDetail}`, 'error', 5000\n );\n return;\n }\n\n // 3. Create ScheduledActionParam for sourceIDs\n await this.createSourceIDParam(scheduledAction.ID, actionID, card.ID);\n\n // 4. Link ScheduledAction to ContentSource\n await this.linkScheduleToSource(card.ID, scheduledAction.ID);\n\n // 5. Cache the new action for cron display\n this.scheduledActionsCache.set(NormalizeUUID(scheduledAction.ID), scheduledAction);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n `Schedule created: ${CronToHumanReadable(this.ScheduleCron)}`, 'success', 3000\n );\n\n this.CloseScheduleDialog();\n await this.refreshSourcesTab();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[Classify] Schedule creation error:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.ScheduleSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Removes the schedule from a source card by unlinking the ScheduledActionID.\n * @param card The source card to remove the schedule from\n */\n public async RemoveSchedule(card: SourceCard): Promise<void> {\n if (!card.ScheduledActionID) return;\n if (!confirm(`Remove the schedule \"${card.ScheduleDescription ?? 'schedule'}\" from \"${card.Name}\"?`)) return;\n\n try {\n await this.linkScheduleToSource(card.ID, null);\n MJNotificationService.Instance.CreateSimpleNotification('Schedule removed from source', 'success', 2500);\n await this.refreshSourcesTab();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n /**\n * Returns the human-readable schedule description for a source card.\n * Used in the template to display schedule indicators.\n */\n public GetScheduleLabel(card: SourceCard): string {\n return card.ScheduleDescription ?? 'Scheduled';\n }\n\n /**\n * Returns a human-readable preview of a cron expression for the schedule dialog.\n * @param cron The cron expression to preview\n */\n public GetCronPreview(cron: string): string {\n return CronToHumanReadable(cron);\n }\n\n /** Looks up the cron expression for a cached ScheduledAction by ID */\n private getScheduledActionCron(scheduledActionID: string): string | null {\n const cached = this.scheduledActionsCache.get(NormalizeUUID(scheduledActionID));\n return cached?.CronExpression ?? null;\n }\n\n /**\n * Loads ScheduledAction entities referenced by content sources into the local cache.\n * Called during initial data load so cron descriptions are available for card rendering.\n */\n private async loadScheduledActionsForSources(): Promise<void> {\n const actionIDs = this.contentSourcesRaw\n .map(s => s['ScheduledActionID'] as string | null)\n .filter((id): id is string => id != null);\n\n if (actionIDs.length === 0) return;\n\n const uniqueIDs = [...new Set(actionIDs.map(id => NormalizeUUID(id)))];\n // Skip IDs already cached\n const toLoad = uniqueIDs.filter(id => !this.scheduledActionsCache.has(id));\n if (toLoad.length === 0) return;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter = toLoad.map(id => `'${id}'`).join(',');\n const result = await rv.RunView<MJScheduledActionEntity>({\n EntityName: 'MJ: Scheduled Actions',\n ExtraFilter: `ID IN (${filter})`,\n ResultType: 'entity_object',\n });\n\n if (result.Success) {\n for (const action of result.Results) {\n this.scheduledActionsCache.set(NormalizeUUID(action.ID), action);\n }\n }\n }\n\n /** Finds the Action ID for \"Autotag and Vectorize Content\" by querying actions */\n private async findAutotagActionID(): Promise<string | null> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'Actions',\n ExtraFilter: `Name = 'Autotag and Vectorize Content'`,\n Fields: ['ID'],\n ResultType: 'simple',\n MaxRows: 1,\n });\n if (result.Success && result.Results.length > 0) {\n return result.Results[0].ID;\n }\n return null;\n }\n\n /**\n * Creates a ScheduledActionParam that passes the source ID to the action.\n * Looks up the \"EntityNames\" action param and sets the source ID as its value.\n */\n private async createSourceIDParam(scheduledActionID: string, actionID: string, sourceID: string): Promise<void> {\n // Find the \"EntityNames\" action param to get its ID\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const paramResult = await rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'Action Params',\n ExtraFilter: `ActionID = '${actionID}' AND Name = 'EntityNames'`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n MaxRows: 1,\n });\n\n if (!paramResult.Success || paramResult.Results.length === 0) {\n console.warn('[Classify] Could not find EntityNames action param for source ID scheduling');\n return;\n }\n\n const md = this.ProviderToUse;\n const param = await md.GetEntityObject<MJScheduledActionParamEntity>('MJ: Scheduled Action Params');\n param.NewRecord();\n param.ScheduledActionID = scheduledActionID;\n param.ActionParamID = paramResult.Results[0].ID;\n param.ValueType = 'Static';\n param.Value = sourceID;\n\n const saved = await param.Save();\n if (!saved) {\n console.warn('[Classify] Failed to save schedule param:', param.LatestResult?.Message);\n }\n }\n\n /**\n * Links (or unlinks) a ScheduledAction to a ContentSource by updating\n * the ContentSource.ScheduledActionID field.\n */\n private async linkScheduleToSource(sourceID: string, scheduledActionID: string | null): Promise<void> {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJContentSourceEntity>('MJ: Content Sources');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: sourceID }]));\n entity.ScheduledActionID = scheduledActionID;\n const saved = await entity.Save();\n if (!saved) {\n throw new Error(entity.LatestResult?.Message ?? 'Failed to update content source');\n }\n }\n\n // ════════════════════════════════════════════\n // SLIDE-IN FORM — Content Types\n // ════════════════════════════════════════════\n\n public async OpenAddTypeForm(): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.resetTypeForm();\n this.FormMode = 'add-type';\n this.cdr.detectChanges();\n }\n\n public async OpenEditTypeForm(card: ContentTypeCard): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.FormTypeName = card.Name;\n this.FormTypeDescription = card.Description;\n this.FormTypeAIModelID = card.AIModelID;\n this.FormTypeMinTags = card.MinTags;\n this.FormTypeMaxTags = card.MaxTags;\n this.FormTypeEmbeddingModelID = card.EmbeddingModelID ?? '';\n this.FormTypeVectorIndexID = card.VectorIndexID ?? '';\n this.EditingTypeID = card.ID;\n this.FormMode = 'edit-type';\n this.cdr.detectChanges();\n }\n\n public async SaveContentType(): Promise<void> {\n if (this.FormSaving) return;\n this.FormSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Content Types');\n\n if (this.FormMode === 'edit-type' && this.EditingTypeID) {\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.EditingTypeID }]));\n } else {\n entity.NewRecord();\n }\n\n entity.Set('Name', this.FormTypeName);\n entity.Set('Description', this.FormTypeDescription);\n entity.Set('AIModelID', this.FormTypeAIModelID);\n entity.Set('MinTags', this.FormTypeMinTags);\n entity.Set('MaxTags', this.FormTypeMaxTags);\n entity.Set('EmbeddingModelID', this.FormTypeEmbeddingModelID || null);\n entity.Set('VectorIndexID', this.FormTypeVectorIndexID || null);\n\n const saved = await entity.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n this.FormMode === 'edit-type' ? 'Content type updated' : 'Content type created', 'success', 2500\n );\n this.CloseForm();\n await this.refreshContentTypesTab();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to save content type', 'error', 3000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n } finally {\n this.FormSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n public CloseForm(): void {\n this.FormMode = 'none';\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // PIPELINE RUN\n // ════════════════════════════════════════════\n\n /**\n * Run the pipeline for a specific content source only.\n */\n public async RunPipelineForSource(contentSourceID: string): Promise<void> {\n return this.RunPipeline([contentSourceID]);\n }\n\n public async RunPipeline(contentSourceIDs?: string[]): Promise<void> {\n if (this.IsRunning) return;\n\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) return;\n\n this.IsRunning = true;\n this.IsPaused = false;\n this.RunProgress = 0;\n this.RunStage = 'Starting...';\n this.RunCurrentItem = '';\n this.CurrentPipelineRunID = null;\n this.CurrentProcessRunID = null;\n this.cdr.detectChanges();\n\n try {\n const aiClient = new GraphQLAIClient(provider);\n const result = await aiClient.RunAutotagPipeline(\n contentSourceIDs ? { contentSourceIDs } : undefined\n );\n\n if (!result.Success || !result.PipelineRunID) {\n this.IsRunning = false;\n this.RunStage = '';\n MJNotificationService.Instance.CreateSimpleNotification(\n `Pipeline failed: ${result.ErrorMessage ?? 'Unknown error'}`, 'error', 5000\n );\n this.cdr.detectChanges();\n return;\n }\n\n this.CurrentPipelineRunID = result.PipelineRunID;\n this.subscribeToPipelineProgress(result.PipelineRunID);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[Autotagging] Error starting pipeline:', msg);\n this.IsRunning = false;\n this.RunStage = '';\n MJNotificationService.Instance.CreateSimpleNotification(`Pipeline error: ${msg}`, 'error', 5000);\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Pause a running classification pipeline. The server sets CancellationRequested\n * on the process run so the engine pauses gracefully after the current batch.\n */\n public async PausePipeline(): Promise<void> {\n if (!this.IsRunning || this.IsPaused || !this.CurrentProcessRunID) return;\n\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) return;\n\n try {\n const aiClient = new GraphQLAIClient(provider);\n const result = await aiClient.PauseClassificationPipeline(this.CurrentProcessRunID);\n if (result.Success) {\n this.IsPaused = true;\n this.RunStage = 'Pausing...';\n MJNotificationService.Instance.CreateSimpleNotification('Pipeline pause requested', 'info', 3000);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Pause failed: ${result.ErrorMessage ?? 'Unknown error'}`, 'error', 4000\n );\n }\n this.cdr.detectChanges();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Pause error: ${msg}`, 'error', 4000);\n }\n }\n\n /**\n * Resume a paused classification pipeline from its last completed offset.\n */\n public async ResumePipeline(): Promise<void> {\n if (!this.IsPaused || !this.CurrentProcessRunID) return;\n\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) return;\n\n try {\n const aiClient = new GraphQLAIClient(provider);\n const result = await aiClient.ResumeClassificationPipeline(this.CurrentProcessRunID);\n if (result.Success) {\n this.IsPaused = false;\n this.IsRunning = true;\n this.RunStage = 'Resuming...';\n if (result.PipelineRunID) {\n this.CurrentPipelineRunID = result.PipelineRunID;\n this.subscribeToPipelineProgress(result.PipelineRunID);\n }\n MJNotificationService.Instance.CreateSimpleNotification('Pipeline resumed', 'success', 3000);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Resume failed: ${result.ErrorMessage ?? 'Unknown error'}`, 'error', 4000\n );\n }\n this.cdr.detectChanges();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Resume error: ${msg}`, 'error', 4000);\n }\n }\n\n /**\n * Cancel a running or paused pipeline. Uses pause mechanism and resets UI state.\n */\n public async CancelPipeline(): Promise<void> {\n if (!this.CurrentProcessRunID && !this.IsRunning) return;\n\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) return;\n\n // If we have a process run ID, request server-side cancellation\n if (this.CurrentProcessRunID) {\n try {\n const aiClient = new GraphQLAIClient(provider);\n await aiClient.PauseClassificationPipeline(this.CurrentProcessRunID);\n } catch {\n // Best-effort cancellation — proceed with UI reset regardless\n }\n }\n\n this.IsRunning = false;\n this.IsPaused = false;\n this.RunProgress = 0;\n this.RunStage = '';\n this.RunCurrentItem = '';\n this.CurrentPipelineRunID = null;\n this.CurrentProcessRunID = null;\n MJNotificationService.Instance.CreateSimpleNotification('Pipeline cancelled', 'info', 3000);\n this.cdr.detectChanges();\n }\n\n private subscribeToPipelineProgress(pipelineRunID: string): void {\n const provider = this.ProviderToUse as GraphQLDataProvider;\n const subscriptionQuery = `\n subscription PipelineProgress($pipelineRunID: String!) {\n PipelineProgress(pipelineRunID: $pipelineRunID) {\n PipelineRunID\n Stage\n TotalItems\n ProcessedItems\n CurrentItem\n PercentComplete\n ElapsedMs\n }\n }\n `;\n\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\n\n const finishPipeline = (success: boolean) => {\n if (idleTimer) clearTimeout(idleTimer);\n rxSub?.unsubscribe();\n\n Promise.resolve().then(async () => {\n this.IsRunning = false;\n this.IsPaused = false;\n this.RunStage = success ? 'Complete' : 'Error';\n this.RunProgress = success ? 100 : 0;\n this.CurrentPipelineRunID = null;\n this.CurrentProcessRunID = null;\n\n for (const stage of this.PipelineStages) {\n stage.Status = 'idle';\n stage.Count = '\\u2014';\n }\n\n if (success) {\n this.tabDataLoaded.clear();\n // Reload pipeline data AND refresh ERD cache (new EntityRecordDocuments\n // may have been created by the pipeline for entity sources)\n this.entityRecordDocCache.clear();\n await Promise.all([\n this.LoadPipelineData(),\n this.loadEntityRecordDocCache(),\n ]);\n this.tabDataLoaded.add('pipeline');\n MJNotificationService.Instance.CreateSimpleNotification('Pipeline complete', 'success', 3000);\n }\n this.cdr.detectChanges();\n });\n };\n\n const resetIdleTimer = () => {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n if (this.IsRunning) finishPipeline(true);\n }, 30000);\n };\n\n resetIdleTimer();\n\n const sub = provider.subscribe(subscriptionQuery, { pipelineRunID });\n const rxSub = sub.pipe(takeUntil(this.destroy$)).subscribe({\n next: (data: Record<string, unknown>) => {\n const progress = (data as Record<string, Record<string, unknown>>)['PipelineProgress'];\n if (!progress) return;\n\n const stage = progress['Stage'] as string;\n const pct = progress['PercentComplete'] as number;\n const currentItem = progress['CurrentItem'] as string | undefined;\n\n this.RunProgress = Math.min(100, Math.max(0, pct));\n this.RunStage = this.formatStageName(stage);\n this.RunCurrentItem = currentItem ?? '';\n this.updateStagesForActiveRun(stage);\n this.cdr.detectChanges();\n\n if (stage === 'complete') {\n finishPipeline(true);\n } else if (stage === 'error') {\n finishPipeline(false);\n } else {\n resetIdleTimer();\n }\n },\n error: (err: unknown) => {\n console.error('[Autotagging] Pipeline subscription error:', err);\n finishPipeline(false);\n }\n });\n }\n\n private updateStagesForActiveRun(activeStageCode: string): void {\n const stageCodeToName: Record<string, string> = {\n 'ingest': 'Ingest', 'extract': 'Extract', 'chunk': 'Chunk',\n 'tag': 'Tag', 'autotag': 'Tag', 'vectorize': 'Vectorize'\n };\n const activeName = stageCodeToName[activeStageCode] ?? '';\n let passedActive = false;\n\n for (const stage of this.PipelineStages) {\n if (stage.Name === activeName) {\n stage.Status = 'active';\n passedActive = true;\n } else if (!passedActive) {\n stage.Status = 'complete';\n } else {\n stage.Status = 'idle';\n }\n }\n }\n\n private formatStageName(stage: string): string {\n const map: Record<string, string> = {\n 'extract': 'Extracting content', 'autotag': 'Running autotaggers',\n 'vectorize': 'Vectorizing content', 'complete': 'Complete',\n 'error': 'Error', 'ingest': 'Ingesting', 'chunk': 'Chunking',\n 'tag': 'Tagging'\n };\n return map[stage] ?? stage;\n }\n\n // ════════════════════════════════════════════\n // HELPER — Aggregation utilities\n // ════════════════════════════════════════════\n\n private countTagsByItem(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const tag of this.contentTagsRaw) {\n const itemId = NormalizeUUID(tag['ItemID'] as string);\n if (itemId) counts.set(itemId, (counts.get(itemId) ?? 0) + 1);\n }\n return counts;\n }\n\n private getTopTagsForItem(itemId: string, max: number): string[] {\n const tags: string[] = [];\n for (const tag of this.contentTagsRaw) {\n if (UUIDsEqual(tag['ItemID'] as string, itemId)) {\n tags.push(tag['Tag'] as string);\n if (tags.length >= max) break;\n }\n }\n return tags;\n }\n\n private countItemsBySource(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of this.contentItemsRaw) {\n const sourceId = item['ContentSourceID'] as string;\n if (sourceId) counts.set(sourceId, (counts.get(sourceId) ?? 0) + 1);\n }\n return counts;\n }\n\n private countTagsBySource(): Map<string, number> {\n const itemSourceMap = new Map<string, string>();\n for (const item of this.contentItemsRaw) {\n itemSourceMap.set(item['ID'] as string, item['ContentSourceID'] as string);\n }\n const counts = new Map<string, number>();\n for (const tag of this.contentTagsRaw) {\n const sourceId = itemSourceMap.get(tag['ItemID'] as string);\n if (sourceId) counts.set(sourceId, (counts.get(sourceId) ?? 0) + 1);\n }\n return counts;\n }\n\n private getLastRunBySource(): Map<string, Record<string, unknown>> {\n const map = new Map<string, Record<string, unknown>>();\n for (const run of this.contentRunsRaw) {\n const sourceId = run['SourceID'] as string;\n if (sourceId && !map.has(sourceId)) {\n map.set(sourceId, run);\n }\n }\n return map;\n }\n\n private countAllTags(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const tag of this.contentTagsRaw) {\n const t = tag['Tag'] as string;\n if (t) counts.set(t, (counts.get(t) ?? 0) + 1);\n }\n return counts;\n }\n\n /** Compute average weight per tag across all occurrences */\n private computeAvgWeights(): Map<string, number> {\n const sums = new Map<string, number>();\n const counts = new Map<string, number>();\n for (const tag of this.contentTagsRaw) {\n const t = tag['Tag'] as string;\n const w = Number(tag['Weight'] ?? 0.5);\n if (t) {\n sums.set(t, (sums.get(t) ?? 0) + w);\n counts.set(t, (counts.get(t) ?? 0) + 1);\n }\n }\n const avgs = new Map<string, number>();\n for (const [t, sum] of sums) {\n avgs.set(t, Math.round((sum / (counts.get(t) ?? 1)) * 100) / 100);\n }\n return avgs;\n }\n\n private getTopSourcePerTag(): Map<string, string> {\n const tagSourceCounts = new Map<string, Map<string, number>>();\n const itemSourceMap = new Map<string, string>();\n for (const item of this.contentItemsRaw) {\n itemSourceMap.set(item['ID'] as string, (item['ContentSource'] as string) ?? 'Unknown');\n }\n for (const tag of this.contentTagsRaw) {\n const t = tag['Tag'] as string;\n const source = itemSourceMap.get(tag['ItemID'] as string) ?? 'Unknown';\n if (!tagSourceCounts.has(t)) tagSourceCounts.set(t, new Map());\n const inner = tagSourceCounts.get(t)!;\n inner.set(source, (inner.get(source) ?? 0) + 1);\n }\n const result = new Map<string, string>();\n for (const [tag, sourceCounts] of tagSourceCounts) {\n let maxSource = 'Unknown';\n let maxCount = 0;\n for (const [source, count] of sourceCounts) {\n if (count > maxCount) { maxSource = source; maxCount = count; }\n }\n result.set(tag, maxSource);\n }\n return result;\n }\n\n private getFirstSeenPerTag(): Map<string, string> {\n const result = new Map<string, string>();\n for (const tag of this.contentTagsRaw) {\n const t = tag['Tag'] as string;\n if (t && !result.has(t)) {\n const date = tag['__mj_CreatedAt'] as string;\n result.set(t, date ? this.formatShortDate(date) : '');\n }\n }\n return result;\n }\n\n private countSourcesByContentType(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const source of this.contentSourcesRaw) {\n const typeId = source['ContentTypeID'] as string;\n if (typeId) counts.set(typeId, (counts.get(typeId) ?? 0) + 1);\n }\n return counts;\n }\n\n private countItemsByContentType(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of this.contentItemsRaw) {\n const typeId = item['ContentTypeID'] as string;\n if (typeId) counts.set(typeId, (counts.get(typeId) ?? 0) + 1);\n }\n return counts;\n }\n\n private inferItemStatus(tagCount: number): 'complete' | 'processing' | 'error' {\n return tagCount > 0 ? 'complete' : 'processing';\n }\n\n // ════════════════════════════════════════════\n // HELPER — Formatting\n // ════════════════════════════════════════════\n\n public formatRelativeTime(dateStr: string | null | undefined): string {\n if (!dateStr) return 'Never';\n const now = new Date();\n const then = new Date(dateStr);\n const diffMs = now.getTime() - then.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n const diffHours = Math.floor(diffMins / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n const diffDays = Math.floor(diffHours / 24);\n return `${diffDays}d ago`;\n }\n\n public formatNumber(n: number): string {\n return n.toLocaleString();\n }\n\n /** Returns font size in rem for a tag based on its weight (0.0-1.0). Range: 0.7rem to 1.0rem */\n public TagFontSize(weight: number): string {\n const min = 0.7;\n const max = 1.0;\n return `${min + (max - min) * Math.min(1, Math.max(0, weight))}rem`;\n }\n\n /** Format weight as percentage for display in tag chip */\n public FormatWeight(weight: number): string {\n return `${Math.round(weight * 100)}%`;\n }\n\n private formatShortDate(dateStr: string): string {\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n } catch {\n return '';\n }\n }\n\n private formatDate(dateStr: string): string {\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n } catch {\n return dateStr;\n }\n }\n\n private computeDuration(start: string | null, end: string | null): string {\n if (!start) return '\\u2014';\n const s = new Date(start);\n const e = end ? new Date(end) : new Date();\n const ms = e.getTime() - s.getTime();\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${Math.round(ms / 1000)}s`;\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n }\n\n private displayStatus(status: string): string {\n const lower = status.toLowerCase();\n if (lower === 'complete' || lower === 'completed' || lower === 'done') return 'Complete';\n if (lower === 'error' || lower === 'failed') return 'Failed';\n if (lower === 'running' || lower === 'processing') return 'Running';\n return status;\n }\n\n public GetSourceTypeIcon(typeName: string): string {\n const iconMap: Record<string, string> = {\n 'Web': 'fa-solid fa-globe', 'Web Crawler': 'fa-solid fa-globe',\n 'API': 'fa-solid fa-plug', 'Database': 'fa-solid fa-database',\n 'File': 'fa-solid fa-file-alt', 'Email': 'fa-solid fa-envelope',\n 'RSS': 'fa-solid fa-rss', 'RSS Feed': 'fa-solid fa-rss',\n 'CMS': 'fa-solid fa-newspaper', 'PDF': 'fa-solid fa-file-pdf'\n };\n return iconMap[typeName] ?? 'fa-solid fa-folder';\n }\n\n // ════════════════════════════════════════════\n // HELPER — Data loading\n // ════════════════════════════════════════════\n\n private async ensureBaseDataLoaded(): Promise<void> {\n if (this.contentSourcesRaw.length > 0 && this.contentItemsRaw.length > 0) return;\n await this.LoadPipelineData();\n }\n\n private async ensureFormDropdownsLoaded(): Promise<void> {\n try {\n // Use KnowledgeHubMetadataEngine for cached reference data — instant, no RunView needed\n const engine = KnowledgeHubMetadataEngine.Instance;\n await engine.Config(false); // no-op if already loaded\n\n this.SourceTypeOptions = engine.ContentSourceTypes.map(t => ({ ID: t.ID, Name: t.Name }));\n this.ContentTypeOptions = engine.ContentTypes.map(t => ({ ID: t.ID, Name: t.Name }));\n this.FileTypeOptions = engine.ContentFileTypes.map(t => ({ ID: t.ID, Name: t.Name }));\n this.VectorIndexOptions = engine.VectorIndexes.map(vi => ({ ID: vi.ID, Name: vi.Name }));\n\n // AI Models from AIEngineBase (already cached)\n if (this.AIModelOptions.length === 0) {\n const aiEngine = AIEngineBase.Instance;\n await aiEngine.Config(false);\n this.AIModelOptions = aiEngine.Models.map(m => ({ ID: m.ID, Name: m.Name }));\n this.EmbeddingModelOptions = aiEngine.Models\n .filter(m => m.AIModelType?.trim().toLowerCase() === 'embeddings')\n .map(m => ({ ID: m.ID, Name: m.Name }));\n }\n } catch (error) {\n console.error('[Autotagging] Error loading form dropdowns:', error);\n }\n }\n\n private resetSourceForm(): void {\n this.FormSourceName = '';\n this.FormSourceTypeID = '';\n this.FormContentTypeID = '';\n this.FormFileTypeID = '';\n this.FormSourceURL = '';\n this.FormSourceEntityID = '';\n this.FormSourceEntityDocID = '';\n this.FormSourceEmbeddingModelID = '';\n this.FormSourceVectorIndexID = '';\n this.EditingSourceID = '';\n this.FormSourceSpecificConfig = {};\n }\n\n private resetTypeForm(): void {\n this.FormTypeName = '';\n this.FormTypeDescription = '';\n this.FormTypeAIModelID = '';\n this.FormTypeMinTags = 1;\n this.FormTypeMaxTags = 10;\n this.FormTypeEmbeddingModelID = '';\n this.FormTypeVectorIndexID = '';\n this.EditingTypeID = '';\n }\n\n private async refreshSourcesTab(): Promise<void> {\n this.tabDataLoaded.delete('sources');\n this.tabDataLoaded.delete('pipeline');\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({ EntityName: 'MJ: Content Sources', OrderBy: 'Name', ResultType: 'simple' });\n if (result.Success) this.contentSourcesRaw = result.Results;\n await this.loadScheduledActionsForSources();\n this.buildSourceCards();\n this.buildNavItems();\n this.cdr.detectChanges();\n }\n\n private async refreshContentTypesTab(): Promise<void> {\n this.tabDataLoaded.delete('types');\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({ EntityName: 'MJ: Content Types', ResultType: 'simple' });\n if (result.Success) this.contentTypesRaw = result.Results;\n this.buildContentTypeCards();\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // DETAIL PANELS — Feed Item / Content Item\n // ════════════════════════════════════════════\n\n public OpenFeedItemDetail(index: number): void {\n const feed = this.FeedItems[index];\n if (!feed) return;\n\n const rawItem = this.contentItemsRaw[index];\n if (!rawItem) return;\n\n const itemId = rawItem['ID'] as string;\n const allTags = this.getAllWeightedTagsForItem(itemId);\n const tagCount = allTags.length;\n\n const contentSourceTypeID = (rawItem['ContentSourceTypeID'] as string) ?? '';\n const requiresContentType = this.sourceTypeRequiresFileType(contentSourceTypeID);\n\n // For entity sources, resolve the entity record ID from the EntityRecordDocument\n let entityRecordID: string | null = null;\n let entityName: string | null = null;\n if (!requiresContentType) {\n const source = this.contentSourcesRaw.find(s => UUIDsEqual(s['ID'] as string, rawItem['ContentSourceID'] as string));\n if (source) {\n const entityID = source['EntityID'] as string | null;\n if (entityID) {\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityID));\n entityName = entityInfo?.Name ?? null;\n // Get RecordID from the EntityRecordDocument linked to this content item\n const erdID = rawItem['EntityRecordDocumentID'] as string | null;\n if (erdID) {\n const erd = this.entityRecordDocCache.get(NormalizeUUID(erdID));\n entityRecordID = erd ?? null;\n }\n }\n }\n }\n\n const statuses = this.inferPipelineStatuses(rawItem, tagCount);\n this.SelectedFeedItem = {\n ID: itemId,\n Name: feed.Name,\n SourceName: feed.SourceName,\n SourceTypeName: (rawItem['ContentSourceType'] as string) ?? 'Unknown',\n ContentTypeName: (rawItem['ContentType'] as string) ?? 'Unknown',\n FileTypeName: (rawItem['ContentFileType'] as string) ?? '',\n URL: (rawItem['URL'] as string) ?? '',\n TextContent: (rawItem['Text'] as string) ?? '',\n Checksum: (rawItem['Checksum'] as string) ?? '',\n Tags: allTags,\n CreatedAt: this.formatDate((rawItem['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: this.formatDate((rawItem['__mj_UpdatedAt'] as string) ?? ''),\n ContentSourceID: (rawItem['ContentSourceID'] as string) ?? '',\n ContentSourceTypeID: contentSourceTypeID,\n StatusDot: feed.Status,\n TagCount: tagCount,\n RequiresContentType: requiresContentType,\n EntityRecordID: entityRecordID,\n EntityName: entityName,\n EmbeddingStatus: statuses.EmbeddingStatus,\n TaggingStatus: statuses.TaggingStatus,\n };\n this.ShowItemDetail = true;\n this.cdr.detectChanges();\n }\n\n public OpenContentItemDetail(item: ContentItemDetail): void {\n this.SelectedFeedItem = item;\n this.ShowItemDetail = true;\n this.cdr.detectChanges();\n }\n\n /** Open content item detail slide-in by content item ID (used from tag drill-down) */\n public OpenItemDetailByID(contentItemID: string): void {\n const rawIndex = this.contentItemsRaw.findIndex(i => UUIDsEqual(i['ID'] as string, contentItemID));\n if (rawIndex < 0) return;\n\n const rawItem = this.contentItemsRaw[rawIndex];\n const itemId = rawItem['ID'] as string;\n const allTags = this.getAllWeightedTagsForItem(itemId);\n const contentSourceTypeID = (rawItem['ContentSourceTypeID'] as string) ?? '';\n const requiresContentType = this.sourceTypeRequiresFileType(contentSourceTypeID);\n\n let entityRecordID: string | null = null;\n let entityName: string | null = null;\n if (!requiresContentType) {\n const source = this.contentSourcesRaw.find(s => UUIDsEqual(s['ID'] as string, rawItem['ContentSourceID'] as string));\n if (source) {\n const entityID = source['EntityID'] as string | null;\n if (entityID) {\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityID));\n entityName = entityInfo?.Name ?? null;\n const erdID = rawItem['EntityRecordDocumentID'] as string | null;\n if (erdID) {\n entityRecordID = this.entityRecordDocCache.get(NormalizeUUID(erdID)) ?? null;\n }\n }\n }\n }\n\n const statuses2 = this.inferPipelineStatuses(rawItem, allTags.length);\n this.SelectedFeedItem = {\n ID: itemId,\n Name: (rawItem['Name'] as string) ?? 'Unnamed',\n SourceName: (rawItem['ContentSource'] as string) ?? 'Unknown',\n SourceTypeName: (rawItem['ContentSourceType'] as string) ?? 'Unknown',\n ContentTypeName: (rawItem['ContentType'] as string) ?? 'Unknown',\n FileTypeName: (rawItem['ContentFileType'] as string) ?? '',\n URL: (rawItem['URL'] as string) ?? '',\n TextContent: (rawItem['Text'] as string) ?? '',\n Checksum: (rawItem['Checksum'] as string) ?? '',\n Tags: allTags,\n CreatedAt: this.formatDate((rawItem['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: this.formatDate((rawItem['__mj_UpdatedAt'] as string) ?? ''),\n ContentSourceID: (rawItem['ContentSourceID'] as string) ?? '',\n ContentSourceTypeID: contentSourceTypeID,\n StatusDot: allTags.length > 0 ? 'complete' : 'processing',\n TagCount: allTags.length,\n RequiresContentType: requiresContentType,\n EntityRecordID: entityRecordID,\n EntityName: entityName,\n EmbeddingStatus: statuses2.EmbeddingStatus,\n TaggingStatus: statuses2.TaggingStatus,\n };\n this.ShowItemDetail = true;\n this.cdr.detectChanges();\n }\n\n public CloseItemDetail(): void {\n this.ShowItemDetail = false;\n this.SelectedFeedItem = null;\n this.cdr.detectChanges();\n }\n\n public OpenRecordFromItem(item: ContentItemDetail): void {\n const md = this.ProviderToUse;\n const pkey = new CompositeKey();\n\n // For entity sources: navigate to the actual entity record, not the ContentItem\n if (item.EntityName && item.EntityRecordID) {\n const entityInfo = md.Entities.find(e => e.Name === item.EntityName);\n if (entityInfo) {\n pkey.LoadFromURLSegment(entityInfo, item.EntityRecordID);\n } else {\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: item.EntityRecordID }];\n }\n this.navigationService.OpenEntityRecord(item.EntityName, pkey);\n } else {\n // For non-entity sources: open the ContentItem record\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: item.ID }];\n this.navigationService.OpenEntityRecord('MJ: Content Items', pkey);\n }\n }\n\n /** Cache: EntityRecordDocument ID → RecordID */\n private entityRecordDocCache = new Map<string, string>();\n\n /** Load ERD RecordIDs for entity-sourced content items */\n private async loadEntityRecordDocCache(): Promise<void> {\n if (this.entityRecordDocCache.size > 0) return;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string; RecordID: string }>({\n EntityName: 'MJ: Entity Record Documents',\n ResultType: 'simple',\n Fields: ['ID', 'RecordID'],\n });\n if (result.Success) {\n for (const erd of result.Results) {\n this.entityRecordDocCache.set(NormalizeUUID(erd.ID), erd.RecordID);\n }\n }\n }\n\n private getAllWeightedTagsForItem(itemId: string): WeightedTag[] {\n const tags: WeightedTag[] = [];\n for (const tag of this.contentTagsRaw) {\n if (UUIDsEqual(tag['ItemID'] as string, itemId)) {\n tags.push({\n Tag: tag['Tag'] as string,\n Weight: Number(tag['Weight'] ?? 1),\n });\n }\n }\n return tags.sort((a, b) => b.Weight - a.Weight);\n }\n\n /**\n * D4: Infer embedding and tagging pipeline statuses for a content item.\n * Uses tag count and run history heuristics since dedicated status columns\n * are not yet available on the ContentItem entity.\n */\n private inferPipelineStatuses(\n rawItem: Record<string, unknown>,\n tagCount: number\n ): { EmbeddingStatus: ItemPipelineStatus; TaggingStatus: ItemPipelineStatus } {\n const explicitEmbedding = rawItem['EmbeddingStatus'] as string | undefined;\n const explicitTagging = rawItem['TaggingStatus'] as string | undefined;\n if (explicitEmbedding || explicitTagging) {\n return {\n EmbeddingStatus: this.mapStatusString(explicitEmbedding),\n TaggingStatus: this.mapStatusString(explicitTagging),\n };\n }\n\n const hasChecksum = !!(rawItem['Checksum'] as string);\n const hasText = !!((rawItem['Text'] as string)?.trim());\n const sourceID = rawItem['ContentSourceID'] as string;\n const lastRun = this.contentRunsRaw.find(r => r['SourceID'] as string === sourceID);\n const lastRunFailed = lastRun &&\n ((lastRun['Status'] as string)?.toLowerCase() === 'error' ||\n (lastRun['Status'] as string)?.toLowerCase() === 'failed');\n\n let embeddingStatus: ItemPipelineStatus = 'Pending';\n if (hasChecksum || hasText) embeddingStatus = 'Complete';\n else if (lastRunFailed) embeddingStatus = 'Failed';\n\n let taggingStatus: ItemPipelineStatus = 'Pending';\n if (tagCount > 0) taggingStatus = 'Complete';\n else if (embeddingStatus === 'Complete') taggingStatus = lastRunFailed ? 'Failed' : 'Pending';\n else if (lastRunFailed) taggingStatus = 'Failed';\n\n return { EmbeddingStatus: embeddingStatus, TaggingStatus: taggingStatus };\n }\n\n /** Map a raw status string to the ItemPipelineStatus union */\n private mapStatusString(status: string | undefined): ItemPipelineStatus {\n if (!status) return 'Pending';\n const lower = status.toLowerCase();\n if (lower === 'complete' || lower === 'completed' || lower === 'done') return 'Complete';\n if (lower === 'processing' || lower === 'running') return 'Processing';\n if (lower === 'failed' || lower === 'error') return 'Failed';\n return 'Pending';\n }\n\n // ════════════════════════════════════════════\n // DETAIL PANELS — Source Detail\n // ════════════════════════════════════════════\n\n public async OpenSourceDetail(card: SourceCard): Promise<void> {\n this.SourceDetailLoading = true;\n this.SourceDetailPage = 0;\n this.SourceDetailStatusFilter = 'All';\n this.ShowSourceDetail = true;\n this.cdr.detectChanges();\n\n try {\n const sourceItems = await this.loadContentItemsForSource(card.ID);\n const sourceRuns = await this.loadRunHistoryForSource(card.ID);\n\n const embeddingModelName = this.resolveEmbeddingModelName(card.EmbeddingModelID);\n const vectorIndexName = this.resolveVectorIndexName(card.VectorIndexID);\n const errorCount = sourceRuns.filter(r => r.StatusClass === 'failed').length;\n\n this.SelectedSource = {\n ID: card.ID,\n Name: card.Name,\n SourceTypeName: card.SourceTypeName,\n FileTypeName: card.FileTypeName,\n ContentTypeName: card.ContentTypeName,\n RequiresFileType: card.RequiresFileType,\n StatusClass: card.StatusClass,\n StatusLabel: card.StatusLabel,\n Icon: card.Icon,\n URL: card.URL,\n EmbeddingModelName: embeddingModelName,\n VectorIndexName: vectorIndexName,\n ItemCount: card.ItemCount,\n TagCount: card.TagCount,\n AvgTags: card.AvgTags,\n LastRunAgo: card.LastRunAgo,\n ErrorCount: errorCount,\n ContentItems: sourceItems,\n RunHistory: sourceRuns\n };\n } catch (error) {\n console.error('[Autotagging] Error loading source detail:', error);\n } finally {\n this.SourceDetailLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public CloseSourceDetail(): void {\n this.ShowSourceDetail = false;\n this.SelectedSource = null;\n this.cdr.detectChanges();\n }\n\n public OpenRecordFromSource(source: SourceDetailInfo): void {\n const pkey = new CompositeKey();\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: source.ID }];\n this.navigationService.OpenEntityRecord('MJ: Content Sources', pkey);\n }\n\n public OpenEditSourceFromDetail(): void {\n if (!this.SelectedSource) return;\n const card = this.SourceCards.find(c => UUIDsEqual(c.ID, this.SelectedSource!.ID));\n if (card) {\n this.CloseSourceDetail();\n this.OpenEditSourceForm(card);\n }\n }\n\n public async RunSourceFromDetail(): Promise<void> {\n this.CloseSourceDetail();\n await this.RunPipeline();\n }\n\n public async DeleteSourceFromDetail(): Promise<void> {\n if (!this.SelectedSource) return;\n const card = this.SourceCards.find(c => UUIDsEqual(c.ID, this.SelectedSource!.ID));\n if (card) {\n this.CloseSourceDetail();\n await this.DeleteSource(card);\n }\n }\n\n private async loadContentItemsForSource(sourceId: string): Promise<ContentItemDetail[]> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Content Items',\n ExtraFilter: `ContentSourceID='${sourceId}'`,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 100,\n ResultType: 'simple'\n });\n\n if (!result.Success) return [];\n\n const tagsByItem = this.countTagsByItem();\n return result.Results.map(item => {\n const itemId = item['ID'] as string;\n const allTags = this.getAllWeightedTagsForItem(itemId);\n const tagCount = tagsByItem.get(itemId) ?? allTags.length;\n const contentSourceTypeID = (item['ContentSourceTypeID'] as string) ?? '';\n const itemStatuses = this.inferPipelineStatuses(item, tagCount);\n return {\n ID: itemId,\n Name: (item['Name'] as string) ?? 'Unnamed',\n SourceName: (item['ContentSource'] as string) ?? '',\n SourceTypeName: (item['ContentSourceType'] as string) ?? '',\n ContentTypeName: (item['ContentType'] as string) ?? '',\n FileTypeName: (item['ContentFileType'] as string) ?? '',\n URL: (item['URL'] as string) ?? '',\n TextContent: (item['Text'] as string) ?? '',\n Checksum: (item['Checksum'] as string) ?? '',\n Tags: allTags,\n CreatedAt: this.formatDate((item['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: this.formatDate((item['__mj_UpdatedAt'] as string) ?? ''),\n ContentSourceID: sourceId,\n ContentSourceTypeID: contentSourceTypeID,\n StatusDot: tagCount > 0 ? 'complete' : 'processing',\n TagCount: tagCount,\n RequiresContentType: this.sourceTypeRequiresFileType(contentSourceTypeID),\n EntityRecordID: this.resolveEntityRecordID(item, sourceId),\n EntityName: this.resolveEntityName(sourceId),\n EmbeddingStatus: itemStatuses.EmbeddingStatus,\n TaggingStatus: itemStatuses.TaggingStatus,\n };\n });\n }\n\n private async loadRunHistoryForSource(sourceId: string): Promise<RunHistoryRow[]> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Content Process Runs',\n ExtraFilter: `SourceID='${sourceId}'`,\n OrderBy: 'StartTime DESC',\n MaxRows: 10,\n ResultType: 'simple'\n });\n\n if (!result.Success) return [];\n\n return result.Results.map(run => {\n const status = (run['Status'] as string) ?? 'Unknown';\n const startTime = run['StartTime'] as string | null;\n const endTime = run['EndTime'] as string | null;\n const duration = this.computeDuration(startTime, endTime);\n const processedItems = run['ProcessedItems'] as number | null;\n const errorCount = run['ErrorCount'] as number | null;\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'error' || statusLower === 'failed';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const hasErrors = (errorCount ?? 0) > 0;\n\n return {\n ID: run['ID'] as string,\n Status: this.displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n SourceName: (run['Source'] as string) ?? 'Unknown',\n StartedDisplay: startTime ? this.formatDate(startTime) : '\\u2014',\n Duration: duration,\n Items: processedItems != null ? this.formatNumber(processedItems) : '\\u2014',\n Tags: '\\u2014',\n Errors: hasErrors ? this.formatNumber(errorCount!) : (isFailed ? status : '0'),\n ErrorClass: isFailed || hasErrors ? 'run-error-text' : ''\n };\n });\n }\n\n private resolveEmbeddingModelName(modelId: string): string {\n if (!modelId) return 'System default';\n const aiEngine = AIEngineBase.Instance;\n const model = aiEngine.Models.find(m => UUIDsEqual(m.ID, modelId));\n return model ? model.Name : 'Unknown';\n }\n\n private resolveVectorIndexName(indexId: string): string {\n if (!indexId) return 'System default';\n const engine = KnowledgeHubMetadataEngine.Instance;\n const idx = engine.GetVectorIndexById(indexId);\n return idx ? idx.Name : 'Unknown';\n }\n\n // ════════════════════════════════════════════\n // TAXONOMY GOVERNANCE TAB\n // ════════════════════════════════════════════\n\n public SwitchTaxSubTab(sub: TaxonomySubTab): void {\n this.TaxSubTab = sub;\n this.cdr.detectChanges();\n }\n\n /**\n * Loads all data needed by the Taxonomy Governance sub-tabs:\n * Tags, Tagged Items, Tag Audit Logs, and cross-references content item tags.\n */\n private async loadTaxonomyData(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [tagsResult, taggedItemsResult, auditResult] = await rv.RunViews([\n { EntityName: 'MJ: Tags', OrderBy: 'Name', ResultType: 'simple' },\n { EntityName: 'MJ: Tagged Items', ResultType: 'simple' },\n { EntityName: 'MJ: Tag Audit Logs', OrderBy: '__mj_CreatedAt DESC', MaxRows: 200, ResultType: 'simple' }\n ]);\n\n this.tagsRaw = tagsResult.Success ? tagsResult.Results : [];\n this.taggedItemsRaw = taggedItemsResult.Success ? taggedItemsResult.Results : [];\n this.tagAuditLogsRaw = auditResult.Success ? auditResult.Results : [];\n\n // Also ensure content item tags are loaded for cross-referencing\n await this.ensureBaseDataLoaded();\n\n // Load per-tag aggregates (weights + counts) via server-side SQL\n await this.loadTagAggregates();\n\n this.buildTaxTree();\n // Duplicates + Orphans are now server-driven from MJ:Tag Suggestions\n // (populated by TagHealthJob). The legacy client-side detectors\n // are no longer invoked here; the data flows in via\n // `populateDuplicatesFromSuggestions()` /\n // `populateOrphansFromSuggestions()` after `loadSuggestions()`.\n this.buildTaxTreemap();\n this.buildTaxAuditLog();\n this.buildTaxHealth();\n this.populateDuplicatesFromSuggestions();\n this.populateOrphansFromSuggestions();\n } catch (error) {\n console.error('[Autotagging] Error loading taxonomy data:', error);\n }\n }\n\n /**\n * Server-driven replacement for buildTaxDuplicates(). Reads pending\n * `MJ:Tag Suggestions` rows with `Reason='MergeCandidate'` and projects\n * each into the `TaxDuplicatePair` shape the existing Duplicates sub-tab\n * UI expects. The UI's \"Merge\" button still calls `MergeTags()` (which\n * we now route through the server-side `PromoteTagSuggestion` mutation\n * via the wrapper below).\n */\n private populateDuplicatesFromSuggestions(): void {\n const merges = this.SuggestionRows.filter(s => s.Reason === 'MergeCandidate' && s.BestMatchTagID);\n const pairs: TaxDuplicatePair[] = merges.map(s => {\n const score = s.BestMatchScore ?? 0;\n return {\n TagA: s.ProposedName,\n TagB: s.BestMatchName ?? '',\n TagAID: s.ID, // suggestion ID; we route through it\n TagBID: s.BestMatchTagID!,\n Similarity: Math.round(score * 100),\n SeverityClass: score >= 0.85 ? 'high' : 'moderate',\n IsExactDuplicate: false,\n ExactDuplicateCount: 0,\n AllIDs: [],\n };\n });\n pairs.sort((a, b) => b.Similarity - a.Similarity);\n this.TaxDuplicates = pairs;\n }\n\n /**\n * Server-driven replacement for buildTaxOrphans(). Reads pending\n * `MJ:Tag Suggestions` with `Reason='LowUsage'` and projects each into\n * the `TaxOrphanCard` shape. The existing Orphans UI's bulk-delete\n * actions still hit `MJ:Tags.Delete()` directly — those go through the\n * server-side `MJTagEntityServer` Delete override (which cleans up FK\n * references) so the workflow is unchanged.\n */\n private populateOrphansFromSuggestions(): void {\n const lows = this.SuggestionRows.filter(s => s.Reason === 'LowUsage' && s.BestMatchTagID);\n this.TaxOrphans = lows.map(s => {\n const tag = this.tagsRaw.find(t => UUIDsEqual(t['ID'] as string, s.BestMatchTagID!));\n return {\n ID: s.BestMatchTagID!,\n Name: tag ? (tag['Name'] as string) : s.ProposedName,\n UsageCount: this.tagAggregateCounts.get(NormalizeUUID(s.BestMatchTagID!)) ?? 0,\n AvgWeight: this.tagAggregateWeights.get(NormalizeUUID(s.BestMatchTagID!)) ?? 0,\n FirstSeen: tag ? this.formatShortDate((tag['__mj_CreatedAt'] as string) ?? '') : '',\n LastSeen: tag ? this.formatShortDate((tag['__mj_UpdatedAt'] as string) ?? '') : '',\n IsSelected: false,\n };\n });\n }\n\n // ── Tree View ──\n\n /**\n * Builds the taxonomy tree from raw tag data, wiring up parent-child\n * relationships and attaching item counts and average weights.\n */\n private buildTaxTree(): void {\n const tagMap = new Map<string, TaxTreeNode>();\n const tagItemCounts = this.tagAggregateCounts;\n const tagAvgWeights = this.tagAggregateWeights;\n\n // Create flat node list from raw tags (exclude merged/soft-deleted tags)\n const activeTags = this.tagsRaw.filter(t => (t['Status'] as string)?.toLowerCase() !== 'merged');\n for (const tag of activeTags) {\n const id = tag['ID'] as string;\n const normalizedId = NormalizeUUID(id);\n const name = (tag['Name'] as string) ?? 'Unnamed';\n const itemCount = tagItemCounts.get(normalizedId) ?? 0;\n const avgWeight = tagAvgWeights.get(normalizedId) ?? 0;\n\n tagMap.set(normalizedId, {\n ID: id,\n Name: name,\n DisplayName: (tag['DisplayName'] as string) ?? name,\n Description: (tag['Description'] as string) ?? '',\n ParentID: (tag['ParentID'] as string) ?? null,\n Depth: 0,\n Children: [],\n ItemCount: itemCount,\n AvgWeight: avgWeight,\n HealthColor: this.computeTagHealth(itemCount, avgWeight),\n IsExpanded: false,\n IsSelected: false,\n FirstSeen: this.formatShortDate((tag['__mj_CreatedAt'] as string) ?? '')\n });\n }\n\n // Build parent-child relationships\n const roots: TaxTreeNode[] = [];\n for (const node of tagMap.values()) {\n const normalizedParent = node.ParentID ? NormalizeUUID(node.ParentID) : null;\n if (normalizedParent && tagMap.has(normalizedParent)) {\n tagMap.get(normalizedParent)!.Children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n // Compute depths and aggregate child counts\n this.computeTreeDepths(roots, 0);\n this.propagateItemCounts(roots);\n\n // Sort children alphabetically\n this.sortTreeNodes(roots);\n\n // Expand top two levels by default\n for (const root of roots) {\n root.IsExpanded = true;\n for (const child of root.Children) {\n child.IsExpanded = true;\n }\n }\n\n this.TaxTreeNodes = roots;\n this.TaxFlatNodes = this.flattenTree(roots);\n this.TaxFilteredNodes = this.TaxFlatNodes;\n\n // Select first node if available\n if (this.TaxFlatNodes.length > 0) {\n this.SelectTaxNode(this.TaxFlatNodes[0]);\n }\n }\n\n private computeTreeDepths(nodes: TaxTreeNode[], depth: number): void {\n for (const node of nodes) {\n node.Depth = depth;\n this.computeTreeDepths(node.Children, depth + 1);\n }\n }\n\n private propagateItemCounts(nodes: TaxTreeNode[]): number {\n let total = 0;\n for (const node of nodes) {\n const childCount = this.propagateItemCounts(node.Children);\n node.ItemCount = node.ItemCount + childCount;\n total += node.ItemCount;\n }\n return total;\n }\n\n private sortTreeNodes(nodes: TaxTreeNode[]): void {\n nodes.sort((a, b) => a.Name.localeCompare(b.Name));\n for (const node of nodes) {\n this.sortTreeNodes(node.Children);\n }\n }\n\n private flattenTree(nodes: TaxTreeNode[]): TaxTreeNode[] {\n const result: TaxTreeNode[] = [];\n for (const node of nodes) {\n result.push(node);\n if (node.IsExpanded && node.Children.length > 0) {\n result.push(...this.flattenTree(node.Children));\n }\n }\n return result;\n }\n\n private computeTagHealth(itemCount: number, avgWeight: number): 'green' | 'yellow' | 'red' {\n if (itemCount === 0) return 'red';\n if (itemCount <= 2 || avgWeight < 0.3) return 'yellow';\n return 'green';\n }\n\n /**\n * Counts the number of items referencing each tag, combining both\n * Tagged Items and Content Item Tags. Uses NormalizeUUID for\n * cross-platform UUID case consistency.\n */\n private countItemsByTag(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const ti of this.taggedItemsRaw) {\n const tagId = ti['TagID'] as string;\n if (tagId) {\n const key = NormalizeUUID(tagId);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n // Also count from content item tags that reference TagID\n for (const cit of this.contentTagsRaw) {\n const tagId = cit['TagID'] as string;\n if (tagId) {\n const key = NormalizeUUID(tagId);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n return counts;\n }\n\n /**\n * Loads per-tag average weights and item counts via a server-side SQL aggregation.\n * This avoids loading all 17K+ TaggedItem rows to the browser.\n */\n /**\n * Loads per-tag average weights and item counts via the \"Tag Aggregates\" saved query.\n * This runs a SQL GROUP BY on the server, avoiding loading 17K+ TaggedItem rows to the browser.\n */\n private async loadTagAggregates(): Promise<void> {\n this.tagAggregateWeights.clear();\n this.tagAggregateCounts.clear();\n try {\n const rq = new RunQuery();\n const result = await rq.RunQuery({\n QueryName: 'Tag Aggregates',\n CategoryPath: '/MJ/Tags'\n });\n if (result.Success) {\n for (const row of result.Results) {\n const tagId = row['TagID'] as string;\n if (tagId) {\n const key = NormalizeUUID(tagId);\n this.tagAggregateWeights.set(key, Number(row['AvgWeight'] ?? 0));\n this.tagAggregateCounts.set(key, Number(row['ItemCount'] ?? 0));\n }\n }\n }\n } catch (error) {\n console.error('[Autotagging] Error loading tag aggregates:', error);\n }\n }\n\n public ToggleTaxNode(node: TaxTreeNode): void {\n if (node.Children.length > 0) {\n node.IsExpanded = !node.IsExpanded;\n this.TaxFlatNodes = this.flattenTree(this.TaxTreeNodes);\n this.applyTaxTreeFilter();\n this.cdr.detectChanges();\n }\n }\n\n public SelectTaxNode(node: TaxTreeNode): void {\n // Deselect previous\n for (const n of this.TaxFlatNodes) {\n n.IsSelected = false;\n }\n node.IsSelected = true;\n this.TaxSelectedNode = node;\n this.TaxIsEditing = false;\n this.loadRecentItemsForTag(node);\n // Hydrate the governance/scope/synonyms detail underneath the existing tree-node detail.\n this.syncSelectedTagFull(node);\n this.cdr.detectChanges();\n }\n\n /**\n * MJTagEntity backing the currently-selected TaxTreeNode. Exposed for the\n * governance / scope / synonyms detail panel that lives below the existing\n * Tree right-side detail. Populated by `syncSelectedTagFull` whenever the\n * tree selection changes.\n */\n public SelectedTagFull: MJTagEntity | null = null;\n\n private syncSelectedTagFull(node: TaxTreeNode): void {\n // Look up the entity from the cached `tagsRaw`. tagsRaw rows are\n // plain JSON (loaded via RunView simple ResultType), so we need the\n // raw fields directly — we don't load a full MJTagEntity here to\n // avoid an extra DB round-trip per click. The fields we read on the\n // template (IsGlobal, AllowAutoGrow, etc.) are all present in the\n // raw row from the `vwTags` view.\n const raw = this.tagsRaw.find(t => UUIDsEqual(t['ID'] as string, node.ID));\n if (!raw) {\n this.SelectedTagFull = null;\n this.SelectedTagSynonyms = [];\n this.SelectedTagScopes = [];\n return;\n }\n // Cast through unknown so the template can use typed properties on raw fields.\n this.SelectedTagFull = raw as unknown as MJTagEntity;\n\n // Synonyms — query view is fine here since the cardinality per tag is small.\n this.SelectedTagSynonyms = [];\n this.SelectedTagScopes = [];\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n rv.RunViews([\n { EntityName: 'MJ: Tag Synonyms', ExtraFilter: `TagID='${node.ID}'`, ResultType: 'simple' },\n { EntityName: 'MJ: Tag Scopes', ExtraFilter: `TagID='${node.ID}'`, ResultType: 'simple' },\n ]).then(([synRes, scopeRes]) => {\n if (synRes.Success) {\n this.SelectedTagSynonyms = (synRes.Results as Array<Record<string, unknown>>).map(r => ({\n ID: r['ID'] as string,\n Synonym: r['Synonym'] as string,\n Source: r['Source'] as string,\n CreatedAt: new Date(r['__mj_CreatedAt'] as string),\n }));\n }\n if (scopeRes.Success) {\n this.SelectedTagScopes = (scopeRes.Results as Array<Record<string, unknown>>).map(r => ({\n ID: r['ID'] as string,\n ScopeEntityID: r['ScopeEntityID'] as string,\n ScopeRecordID: r['ScopeRecordID'] as string,\n EntityName: (r['ScopeEntity'] as string) ?? 'Unknown entity',\n DisplayName: r['ScopeRecordID'] as string,\n }));\n }\n this.cdr.detectChanges();\n });\n }\n\n public IsGlobalLocked(): boolean {\n return this.SelectedTagFull != null && this.SelectedTagScopes.length > 0;\n }\n\n /**\n * Toggle a per-tag governance flag. Persists via a fresh MJTagEntity load\n * + Save so the server-side `MJTagEntityServer` Save() override can run\n * the IsGlobal⊕TagScope invariant check.\n */\n public async ToggleGovernanceFlag(\n field: 'AllowAutoGrow' | 'IsFrozen' | 'RequiresReview' | 'IsGlobal'\n ): Promise<void> {\n if (!this.SelectedTagFull || !this.TaxSelectedNode) return;\n if (field === 'IsGlobal' && this.IsGlobalLocked()) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Cannot toggle Global while scope rows exist. Remove all scope rows first or use Edit scope…',\n 'warning', 5000\n );\n return;\n }\n const currentValue = (this.SelectedTagFull as unknown as Record<string, unknown>)[field] as boolean;\n await this.persistTagField(this.TaxSelectedNode.ID, field, !currentValue);\n }\n\n public async SaveSelectedTagNumber(\n field: 'MaxChildren' | 'MaxDescendantDepth' | 'MinWeight',\n raw: string\n ): Promise<void> {\n if (!this.TaxSelectedNode) return;\n const trimmed = raw.trim();\n const value: number | null = trimmed === '' ? null : Number(trimmed);\n if (value !== null && !Number.isFinite(value)) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${raw}\" is not a valid number for ${field}.`, 'error', 4000\n );\n return;\n }\n await this.persistTagField(this.TaxSelectedNode.ID, field, value);\n }\n\n private async persistTagField(tagID: string, field: keyof MJTagEntity, value: unknown): Promise<void> {\n this.SelectedTagSavingField[field as string] = true;\n this.cdr.detectChanges();\n try {\n const md = this.ProviderToUse;\n const fresh = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n const loaded = await fresh.Load(tagID);\n if (!loaded) throw new Error(`Failed to load tag ${tagID}`);\n (fresh as unknown as Record<string, unknown>)[field as string] = value;\n const ok = await fresh.Save();\n if (!ok) throw new Error(fresh.LatestResult?.CompleteMessage ?? 'Save failed');\n // Mirror back into the cached tagsRaw row so the toggles reflect immediately.\n const raw = this.tagsRaw.find(t => UUIDsEqual(t['ID'] as string, tagID));\n if (raw) (raw as Record<string, unknown>)[field as string] = value;\n if (this.SelectedTagFull) {\n (this.SelectedTagFull as unknown as Record<string, unknown>)[field as string] = value;\n }\n MJNotificationService.Instance.CreateSimpleNotification(\n `Saved ${String(field)} on \"${this.TaxSelectedNode?.Name}\".`,\n 'info', 1800\n );\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to save ${String(field)}: ${msg}`, 'error', 5000\n );\n } finally {\n this.SelectedTagSavingField[field as string] = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Inline synonym add. Server-side TagSynonymEntity Save handles uniqueness. */\n public async AddSynonym(): Promise<void> {\n const text = this.NewSynonymName.trim();\n if (!text || !this.TaxSelectedNode) return;\n if (this.SelectedTagSynonyms.some(s => s.Synonym.toLowerCase() === text.toLowerCase())) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${text}\" is already a synonym for this tag.`, 'warning', 3000\n );\n return;\n }\n try {\n const md = this.ProviderToUse;\n const syn = await md.GetEntityObject<MJTagSynonymEntity>('MJ: Tag Synonyms', md.CurrentUser);\n syn.NewRecord();\n syn.TagID = this.TaxSelectedNode.ID;\n syn.Synonym = text;\n syn.Source = this.NewSynonymSource;\n const ok = await syn.Save();\n if (!ok) throw new Error(syn.LatestResult?.CompleteMessage ?? 'Save failed');\n this.SelectedTagSynonyms = [\n ...this.SelectedTagSynonyms,\n { ID: syn.ID, Synonym: syn.Synonym, Source: syn.Source, CreatedAt: new Date() }\n ];\n this.NewSynonymName = '';\n MJNotificationService.Instance.CreateSimpleNotification(\n `Added synonym \"${text}\".`, 'info', 2000\n );\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to add synonym: ${msg}`, 'error', 5000\n );\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n public async RemoveSynonym(row: SynonymRow): Promise<void> {\n if (!this.TaxSelectedNode) return;\n if (!confirm(`Remove synonym \"${row.Synonym}\"?`)) return;\n try {\n const md = this.ProviderToUse;\n const syn = await md.GetEntityObject<MJTagSynonymEntity>('MJ: Tag Synonyms', md.CurrentUser);\n const loaded = await syn.Load(row.ID);\n if (!loaded) throw new Error('Synonym not found.');\n const ok = await syn.Delete();\n if (!ok) throw new Error(syn.LatestResult?.CompleteMessage ?? 'Delete failed');\n this.SelectedTagSynonyms = this.SelectedTagSynonyms.filter(s => !UUIDsEqual(s.ID, row.ID));\n MJNotificationService.Instance.CreateSimpleNotification(\n `Removed synonym \"${row.Synonym}\".`, 'info', 1800\n );\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to remove synonym: ${msg}`, 'error', 5000\n );\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Open the scope dialog. Implementation note: a full dual-pane scope\n * editor is on the roadmap; for the first pass we surface a simple\n * \"remove all scope rows + flip to global\" button so admins can promote\n * a scoped tag to global, plus a notification pointing them to the\n * Suggestions/admin path for finer-grained scope assignments.\n */\n public async OpenScopeDialog(): Promise<void> {\n if (!this.TaxSelectedNode || !this.SelectedTagFull) return;\n // Phase-1 minimal implementation: confirm + clear + flip global.\n // Full dual-pane editor (entity picker, parent-subset validation,\n // batch save) lives in the standalone TagGovernance dashboard and\n // will be folded in on the next iteration of this dashboard.\n if (this.SelectedTagScopes.length === 0 && !this.SelectedTagFull.IsGlobal) {\n // Empty scope + non-global = currently unreachable. Promote to global.\n if (!confirm('This tag has no scope rows and is not global — it is currently unreachable. Promote to global?')) return;\n await this.persistTagField(this.TaxSelectedNode.ID, 'IsGlobal', true);\n return;\n }\n if (this.SelectedTagScopes.length > 0) {\n if (!confirm(`Remove all ${this.SelectedTagScopes.length} scope row(s) and promote to global? This makes the tag visible to all tenants.`)) return;\n try {\n const md = this.ProviderToUse;\n for (const sc of this.SelectedTagScopes) {\n const row = await md.GetEntityObject<MJTagScopeEntity>('MJ: Tag Scopes', md.CurrentUser);\n const loaded = await row.Load(sc.ID);\n if (loaded) await row.Delete();\n }\n this.SelectedTagScopes = [];\n await this.persistTagField(this.TaxSelectedNode.ID, 'IsGlobal', true);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Tag promoted to global.', 'info', 2500\n );\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to promote: ${msg}`, 'error', 5000\n );\n }\n return;\n }\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Tag is already global.', 'info', 2200\n );\n }\n\n public FilterTaxTree(): void {\n this.applyTaxTreeFilter();\n this.cdr.detectChanges();\n }\n\n private applyTaxTreeFilter(): void {\n const q = this.TaxTreeSearch.toLowerCase().trim();\n if (!q) {\n this.TaxFilteredNodes = this.TaxFlatNodes;\n } else {\n this.TaxFilteredNodes = this.TaxFlatNodes.filter(n =>\n n.Name.toLowerCase().includes(q) || n.DisplayName.toLowerCase().includes(q)\n );\n }\n }\n\n public GetTaxBreadcrumb(node: TaxTreeNode): { ID: string; Name: string }[] {\n const breadcrumb: { ID: string; Name: string }[] = [];\n const tagMap = new Map<string, Record<string, unknown>>();\n for (const t of this.tagsRaw) {\n tagMap.set(t['ID'] as string, t);\n }\n\n let currentID: string | null = node.ParentID;\n while (currentID) {\n const parent = tagMap.get(currentID);\n if (!parent) break;\n breadcrumb.unshift({ ID: currentID, Name: (parent['Name'] as string) ?? '' });\n currentID = (parent['ParentID'] as string) ?? null;\n }\n return breadcrumb;\n }\n\n public NavigateToBreadcrumb(tagId: string): void {\n const node = this.TaxFlatNodes.find(n => UUIDsEqual(n.ID, tagId));\n if (node) {\n this.SelectTaxNode(node);\n }\n }\n\n private loadRecentItemsForTag(node: TaxTreeNode): void {\n // Find content item tags that reference this tag's ID.\n // Use the 'Item' view field (ContentItem name) directly from the tag record\n // instead of looking up from the capped contentItemsRaw array.\n const matchingTags = this.contentTagsRaw.filter(cit =>\n UUIDsEqual(cit['TagID'] as string, node.ID)\n ).slice(0, 5);\n\n this.TaxRecentItems = matchingTags.map(cit => ({\n Name: (cit['Item'] as string) ?? 'Unnamed Item',\n Weight: Number(cit['Weight'] ?? 0.5),\n Date: this.formatShortDate((cit['__mj_CreatedAt'] as string) ?? ''),\n Icon: 'fa-solid fa-file-lines'\n }));\n }\n\n // ── Tag Operations ──\n\n public StartEditTag(): void {\n if (!this.TaxSelectedNode) return;\n this.TaxIsEditing = true;\n this.TaxEditName = this.TaxSelectedNode.Name;\n this.TaxEditDescription = this.TaxSelectedNode.Description;\n this.cdr.detectChanges();\n }\n\n public CancelEditTag(): void {\n this.TaxIsEditing = false;\n this.cdr.detectChanges();\n }\n\n public async SaveEditTag(): Promise<void> {\n if (!this.TaxSelectedNode) return;\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.TaxSelectedNode.ID }]));\n entity.Set('Name', this.TaxEditName);\n entity.Set('Description', this.TaxEditDescription);\n const saved = await entity.Save();\n if (saved) {\n this.TaxSelectedNode.Name = this.TaxEditName;\n this.TaxSelectedNode.DisplayName = this.TaxEditName;\n this.TaxSelectedNode.Description = this.TaxEditDescription;\n this.TaxIsEditing = false;\n this.addTaxAuditEntry('renamed', this.TaxEditName);\n MJNotificationService.Instance.CreateSimpleNotification('Tag updated', 'success', 2500);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to update tag', 'error', 3000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n this.cdr.detectChanges();\n }\n\n public async MoveTag(node: TaxTreeNode, newParentId: string | null): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: node.ID }]));\n entity.Set('ParentID', newParentId);\n const saved = await entity.Save();\n if (saved) {\n this.addTaxAuditEntry('moved', node.Name);\n MJNotificationService.Instance.CreateSimpleNotification('Tag moved', 'success', 2500);\n await this.RefreshTaxonomyData();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n public DeleteTag(node: TaxTreeNode): void {\n this.OpenConfirmDialog(\n 'Delete Tag',\n `Delete tag \"${node.Name}\"? This will also remove all tagged item associations.`,\n async () => {\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: node.ID }]));\n const deleted = await entity.Delete();\n if (deleted) {\n this.addTaxAuditEntry('deleted', node.Name);\n MJNotificationService.Instance.CreateSimpleNotification('Tag deleted', 'success', 2500);\n await this.RefreshTaxonomyData();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n );\n }\n\n // ── Create Tag ──\n\n /** Open create tag dialog for a root-level tag */\n public OpenCreateRootTag(): void {\n this.CreateTagParentID = null;\n this.CreateTagParentLabel = 'Root level';\n this.CreateTagName = '';\n this.CreateTagDescription = '';\n this.ShowCreateTagDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Open create tag dialog as child of the selected node */\n public OpenCreateChildTag(): void {\n if (!this.TaxSelectedNode) return;\n this.OpenCreateChildTagFor(this.TaxSelectedNode);\n }\n\n /** Open create tag dialog as child of a specific node */\n public OpenCreateChildTagFor(node: TaxTreeNode): void {\n this.CreateTagParentID = node.ID;\n this.CreateTagParentLabel = `under \"${node.Name}\"`;\n this.CreateTagName = '';\n this.CreateTagDescription = '';\n this.ShowCreateTagDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Close create tag dialog */\n public CloseCreateTagDialog(): void {\n this.ShowCreateTagDialog = false;\n this.cdr.detectChanges();\n }\n\n /** Save the new tag */\n public async SaveNewTag(): Promise<void> {\n const name = this.CreateTagName.trim();\n if (!name) return;\n\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n entity.NewRecord();\n entity.Set('Name', name);\n entity.Set('DisplayName', name);\n entity.Set('Description', this.CreateTagDescription.trim() || null);\n entity.Set('ParentID', this.CreateTagParentID);\n const saved = await entity.Save();\n if (saved) {\n this.addTaxAuditEntry('created', name);\n MJNotificationService.Instance.CreateSimpleNotification(`Tag \"${name}\" created`, 'success', 2500);\n this.ShowCreateTagDialog = false;\n await this.RefreshTaxonomyData();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to save tag', 'error', 4000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n // ── Multi-Select & Drag Reparent ──\n\n /** Toggle multi-select mode on/off */\n public ToggleMultiSelectMode(): void {\n this.TaxMultiSelectMode = !this.TaxMultiSelectMode;\n if (!this.TaxMultiSelectMode) {\n this.TaxSelectedIDs.clear();\n }\n this.cdr.detectChanges();\n }\n\n /** Toggle a node's selection in multi-select mode */\n public ToggleNodeSelection(node: TaxTreeNode, event: Event): void {\n event.stopPropagation();\n if (this.TaxSelectedIDs.has(node.ID)) {\n this.TaxSelectedIDs.delete(node.ID);\n } else {\n this.TaxSelectedIDs.add(node.ID);\n }\n this.cdr.detectChanges();\n }\n\n /** Check if a node is selected in multi-select mode */\n public IsNodeMultiSelected(nodeID: string): boolean {\n return this.TaxSelectedIDs.has(nodeID);\n }\n\n /** Handle drag start on a tree node */\n public OnTreeNodeDragStart(event: DragEvent, node: TaxTreeNode): void {\n if (!event.dataTransfer) return;\n // If dragging a multi-selected node, drag all selected; otherwise just this one\n const dragIDs = this.TaxMultiSelectMode && this.TaxSelectedIDs.has(node.ID)\n ? [...this.TaxSelectedIDs]\n : [node.ID];\n event.dataTransfer.setData('text/plain', JSON.stringify(dragIDs));\n event.dataTransfer.effectAllowed = 'move';\n }\n\n /** Handle drag over a tree node (drop target) */\n public OnTreeNodeDragOver(event: DragEvent, node: TaxTreeNode): void {\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.TaxDragOverNodeID = node.ID;\n }\n\n /** Handle drag leave */\n public OnTreeNodeDragLeave(): void {\n this.TaxDragOverNodeID = null;\n }\n\n /** Handle drop — reparent dragged node(s) under the drop target */\n public async OnTreeNodeDrop(event: DragEvent, targetNode: TaxTreeNode): Promise<void> {\n event.preventDefault();\n this.TaxDragOverNodeID = null;\n\n const data = event.dataTransfer?.getData('text/plain');\n if (!data) return;\n\n let dragIDs: string[];\n try { dragIDs = JSON.parse(data); } catch { return; }\n\n // Prevent dropping onto itself or a descendant\n const targetDescendants = this.collectDescendantIds(targetNode);\n const validIDs = dragIDs.filter(id =>\n !UUIDsEqual(id, targetNode.ID) && !targetDescendants.has(NormalizeUUID(id))\n );\n\n if (validIDs.length === 0) return;\n\n this.TaxTreeSaving = true;\n this.cdr.detectChanges();\n\n const md = this.ProviderToUse;\n let movedCount = 0;\n for (const tagID of validIDs) {\n try {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: tagID }]));\n entity.Set('ParentID', targetNode.ID);\n const saved = await entity.Save();\n if (saved) movedCount++;\n } catch {\n // continue with remaining\n }\n }\n\n if (movedCount > 0) {\n const label = movedCount === 1 ? '1 tag' : `${movedCount} tags`;\n MJNotificationService.Instance.CreateSimpleNotification(`Moved ${label} under \"${targetNode.Name}\"`, 'success', 2500);\n this.addTaxAuditEntry('moved', `${movedCount} tag(s) → ${targetNode.Name}`);\n this.TaxSelectedIDs.clear();\n await this.RefreshTaxonomyData();\n }\n\n this.TaxTreeSaving = false;\n this.cdr.detectChanges();\n }\n\n /** Handle drop on the \"Root\" drop zone (make root-level) */\n public async OnDropToRoot(event: DragEvent): Promise<void> {\n event.preventDefault();\n this.TaxDragOverNodeID = null;\n\n const data = event.dataTransfer?.getData('text/plain');\n if (!data) return;\n\n let dragIDs: string[];\n try { dragIDs = JSON.parse(data); } catch { return; }\n\n this.TaxTreeSaving = true;\n this.cdr.detectChanges();\n\n const md = this.ProviderToUse;\n let movedCount = 0;\n for (const tagID of dragIDs) {\n try {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: tagID }]));\n if (entity.Get('ParentID') != null) {\n entity.Set('ParentID', null);\n const saved = await entity.Save();\n if (saved) movedCount++;\n }\n } catch {\n // continue\n }\n }\n\n if (movedCount > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(`Moved ${movedCount} tag(s) to root`, 'success', 2500);\n this.addTaxAuditEntry('moved', `${movedCount} tag(s) → root`);\n this.TaxSelectedIDs.clear();\n await this.RefreshTaxonomyData();\n }\n\n this.TaxTreeSaving = false;\n this.cdr.detectChanges();\n }\n\n public IsMerging = false;\n\n public async MergeTags(sourceTagId: string, targetTagId: string, sourceName: string, targetName: string): Promise<void> {\n if (this.IsMerging) return; // Prevent duplicate calls from button spam\n this.IsMerging = true;\n this.cdr.detectChanges();\n\n try {\n // Re-parent tagged items from source to target\n const itemsToMove = this.taggedItemsRaw.filter(ti => (ti['TagID'] as string) === sourceTagId);\n const md = this.ProviderToUse;\n for (const ti of itemsToMove) {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tagged Items');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: ti['ID'] as string }]));\n entity.Set('TagID', targetTagId);\n await entity.Save();\n }\n\n // Re-parent children of source under target\n const childTags = this.tagsRaw.filter(t => (t['ParentID'] as string) === sourceTagId);\n for (const child of childTags) {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: child['ID'] as string }]));\n entity.Set('ParentID', targetTagId);\n await entity.Save();\n }\n\n // Clean up co-occurrence records before delete (FK constraint)\n await this.cleanupTagReferences(sourceTagId);\n\n // Delete source tag (original behavior — hard delete)\n const sourceEntity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await sourceEntity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: sourceTagId }]));\n await sourceEntity.Delete();\n\n this.addTaxAuditEntry('merged', `${sourceName} into ${targetName}`);\n MJNotificationService.Instance.CreateSimpleNotification(`Merged \"${sourceName}\" into \"${targetName}\"`, 'success', 3000);\n await this.RefreshTaxonomyData();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Merge error: ${msg}`, 'error', 4000);\n } finally {\n this.IsMerging = false;\n this.cdr.detectChanges();\n }\n }\n\n public async MakeChildTag(childTagId: string, parentTagId: string): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: childTagId }]));\n entity.Set('ParentID', parentTagId);\n const saved = await entity.Save();\n if (saved) {\n this.addTaxAuditEntry('moved', (entity.Get('Name') as string) ?? 'tag');\n MJNotificationService.Instance.CreateSimpleNotification('Tag reparented', 'success', 2500);\n await this.RefreshTaxonomyData();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n public DismissDuplicate(pair: TaxDuplicatePair): void {\n this.TaxDuplicates = this.TaxDuplicates.filter(d => d !== pair);\n this.TaxHealth.Duplicates = this.TaxDuplicates.length;\n this.cdr.detectChanges();\n }\n\n // ── Duplicates ──\n\n private buildTaxDuplicates(): void {\n const tags = this.tagsRaw\n .filter(t => (t['Status'] as string)?.toLowerCase() !== 'merged')\n .map(t => ({\n ID: t['ID'] as string,\n Name: (t['Name'] as string) ?? ''\n }));\n\n const pairs: TaxDuplicatePair[] = [];\n\n // 1. Group exact-name duplicates (case-insensitive) into single entries\n const exactGroups = this.groupExactNameDuplicates(tags);\n const consumedIDs = new Set<string>();\n\n for (const [, group] of exactGroups) {\n if (group.length < 2) continue;\n // Emit one consolidated entry per group of exact-name duplicates\n pairs.push({\n TagA: group[0].Name,\n TagB: group[0].Name,\n TagAID: group[0].ID,\n TagBID: group[1].ID,\n Similarity: 100,\n SeverityClass: 'high',\n IsExactDuplicate: true,\n ExactDuplicateCount: group.length,\n AllIDs: group.map(t => t.ID)\n });\n for (const t of group) consumedIDs.add(t.ID);\n }\n\n // 2. Fuzzy/similar pairs — skip any tags already covered by exact-name groups\n for (let i = 0; i < tags.length; i++) {\n if (consumedIDs.has(tags[i].ID)) continue;\n for (let j = i + 1; j < tags.length; j++) {\n if (consumedIDs.has(tags[j].ID)) continue;\n const sim = this.computeStringSimilarity(tags[i].Name, tags[j].Name);\n if (sim >= 0.70) {\n pairs.push({\n TagA: tags[i].Name,\n TagB: tags[j].Name,\n TagAID: tags[i].ID,\n TagBID: tags[j].ID,\n Similarity: Math.round(sim * 100),\n SeverityClass: sim >= 0.85 ? 'high' : 'moderate',\n IsExactDuplicate: false,\n ExactDuplicateCount: 0,\n AllIDs: []\n });\n }\n }\n }\n\n pairs.sort((a, b) => b.Similarity - a.Similarity);\n this.TaxDuplicates = pairs;\n }\n\n /** Group tags by case-insensitive name, returning only groups with 2+ members */\n private groupExactNameDuplicates(tags: { ID: string; Name: string }[]): Map<string, { ID: string; Name: string }[]> {\n const groups = new Map<string, { ID: string; Name: string }[]>();\n for (const tag of tags) {\n const key = tag.Name.toLowerCase().trim();\n const group = groups.get(key);\n if (group) {\n group.push(tag);\n } else {\n groups.set(key, [tag]);\n }\n }\n return groups;\n }\n\n /**\n * Enhanced string similarity: separator normalization, abbreviation,\n * pluralization, token-overlap Jaccard, containment, and Levenshtein.\n * Returns the highest score among all heuristics.\n */\n private computeStringSimilarity(a: string, b: string): number {\n const la = a.toLowerCase().trim();\n const lb = b.toLowerCase().trim();\n if (la === lb) return 1.0;\n\n // Strip separators and compare\n const normA = la.replace(/[\\s\\-_&]+/g, '');\n const normB = lb.replace(/[\\s\\-_&]+/g, '');\n if (normA === normB) return 0.98;\n\n let best = 0;\n\n // Abbreviation\n if (this.isAbbreviationOf(la, lb) || this.isAbbreviationOf(lb, la)) {\n best = Math.max(best, 0.90);\n }\n\n // Pluralization\n best = Math.max(best, this.computePluralizationScore(la, lb));\n\n // Token Jaccard\n best = Math.max(best, this.computeTokenJaccardSimilarity(la, lb));\n\n // Containment\n if (lb.includes(la) || la.includes(lb)) {\n const shorter = la.length < lb.length ? la : lb;\n const longer = la.length < lb.length ? lb : la;\n best = Math.max(best, shorter.length / longer.length);\n }\n\n // Levenshtein\n const dist = this.levenshteinDistance(la, lb);\n const maxLen = Math.max(la.length, lb.length);\n if (maxLen > 0) {\n best = Math.max(best, 1 - dist / maxLen);\n }\n\n return best;\n }\n\n /** Scores simple English pluralization differences */\n private computePluralizationScore(a: string, b: string): number {\n const shorter = a.length <= b.length ? a : b;\n const longer = a.length <= b.length ? b : a;\n if (longer === shorter + 's') return 0.95;\n if (longer === shorter + 'es') return 0.95;\n if (shorter.endsWith('y') && longer === shorter.slice(0, -1) + 'ies') return 0.95;\n return 0;\n }\n\n /** Jaccard similarity on word tokens */\n private computeTokenJaccardSimilarity(a: string, b: string): number {\n const tokensA = new Set(a.split(/[\\s\\-_&]+/).filter(w => w.length > 0));\n const tokensB = new Set(b.split(/[\\s\\-_&]+/).filter(w => w.length > 0));\n if (tokensA.size === 0 || tokensB.size === 0) return 0;\n let intersection = 0;\n for (const token of tokensA) {\n if (tokensB.has(token)) intersection++;\n }\n const union = tokensA.size + tokensB.size - intersection;\n return union > 0 ? intersection / union : 0;\n }\n\n private isAbbreviationOf(short: string, long: string): boolean {\n if (short.length >= long.length) return false;\n if (short.length < 2) return false;\n\n // Check if short is initials of words in long\n const words = long.split(/[\\s\\-_&]+/).filter(w => w.length > 0);\n if (words.length < 2) return false;\n const initials = words.map(w => w[0]).join('');\n return initials === short;\n }\n\n private levenshteinDistance(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0) as number[]);\n\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);\n }\n }\n return dp[m][n];\n }\n\n // ── Orphans ──\n\n /**\n * Finds orphan tags: no parent, no children, and zero usage.\n * A tag with even 1 connection is not orphaned — it's just a leaf.\n * Uses NormalizeUUID for consistent cross-platform UUID comparisons.\n */\n private buildTaxOrphans(): void {\n const tagItemCounts = this.tagAggregateCounts;\n const tagAvgWeights = this.tagAggregateWeights;\n const hasChildren = new Set<string>();\n for (const t of this.tagsRaw) {\n const pid = t['ParentID'] as string;\n if (pid) hasChildren.add(NormalizeUUID(pid));\n }\n\n this.TaxOrphans = this.tagsRaw\n .filter(t => {\n const normalizedId = NormalizeUUID(t['ID'] as string);\n const parentId = t['ParentID'] as string | null;\n const status = (t['Status'] as string)?.toLowerCase();\n const itemCount = tagItemCounts.get(normalizedId) ?? 0;\n // Skip merged tags — they're soft-deleted\n if (status === 'merged') return false;\n // Orphan: no parent, no children, and zero connections\n return !parentId && !hasChildren.has(normalizedId) && itemCount === 0;\n })\n .map(t => {\n const id = t['ID'] as string;\n const normalizedId = NormalizeUUID(id);\n const itemCount = tagItemCounts.get(normalizedId) ?? 0;\n return {\n ID: id,\n Name: (t['Name'] as string) ?? 'Unnamed',\n UsageCount: itemCount,\n AvgWeight: tagAvgWeights.get(normalizedId) ?? 0,\n FirstSeen: this.formatShortDate((t['__mj_CreatedAt'] as string) ?? ''),\n LastSeen: this.formatShortDate((t['__mj_UpdatedAt'] as string) ?? ''),\n IsSelected: false\n };\n })\n .sort((a, b) => a.UsageCount - b.UsageCount);\n }\n\n public ToggleOrphanSelection(orphan: TaxOrphanCard): void {\n orphan.IsSelected = !orphan.IsSelected;\n this.TaxAllOrphansSelected = this.TaxOrphans.every(o => o.IsSelected);\n this.cdr.detectChanges();\n }\n\n public ToggleAllOrphans(): void {\n this.TaxAllOrphansSelected = !this.TaxAllOrphansSelected;\n for (const o of this.TaxOrphans) {\n o.IsSelected = this.TaxAllOrphansSelected;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Clean up TagCoOccurrence records that reference a tag before deleting it.\n * Without this, the FK constraint on TagCoOccurrence blocks the delete.\n */\n private async cleanupTagReferences(tagId: string): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const coOccResult = await rv.RunView<BaseEntity>({\n EntityName: 'MJ: Tag Co Occurrences',\n ExtraFilter: `TagAID='${tagId}' OR TagBID='${tagId}'`,\n ResultType: 'entity_object'\n });\n if (coOccResult.Success) {\n for (const coOcc of coOccResult.Results) {\n await coOcc.Delete();\n }\n }\n }\n\n public DeleteOrphan(orphan: TaxOrphanCard): void {\n this.OpenConfirmDialog(\n 'Delete Orphan Tag',\n `Delete orphan tag \"${orphan.Name}\"?`,\n async () => {\n try {\n await this.cleanupTagReferences(orphan.ID);\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: orphan.ID }]));\n const deleted = await entity.Delete();\n if (deleted) {\n this.addTaxAuditEntry('deleted', orphan.Name);\n MJNotificationService.Instance.CreateSimpleNotification('Orphan tag deleted', 'success', 2500);\n this.TaxOrphans = this.TaxOrphans.filter(o => !UUIDsEqual(o.ID, orphan.ID));\n this.TaxHealth.Orphaned = this.TaxOrphans.length;\n this.cdr.detectChanges();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n );\n }\n\n public BulkDeleteOrphans(): void {\n const selected = this.TaxOrphans.filter(o => o.IsSelected);\n if (selected.length === 0) return;\n\n this.OpenConfirmDialog(\n 'Bulk Delete Orphan Tags',\n `Delete ${selected.length} selected orphan tag${selected.length > 1 ? 's' : ''}? This cannot be undone.`,\n async () => {\n const md = this.ProviderToUse;\n let deletedCount = 0;\n for (const orphan of selected) {\n try {\n await this.cleanupTagReferences(orphan.ID);\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: orphan.ID }]));\n if (await entity.Delete()) {\n deletedCount++;\n this.addTaxAuditEntry('deleted', orphan.Name);\n }\n } catch {\n // continue with remaining\n }\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(`Deleted ${deletedCount} tags`, 'success', 3000);\n this.TaxOrphans = this.TaxOrphans.filter(o => !o.IsSelected);\n this.TaxHealth.Orphaned = this.TaxOrphans.length;\n this.TaxAllOrphansSelected = false;\n this.cdr.detectChanges();\n }\n );\n }\n\n /** Delete all orphan tags at once with a styled confirmation dialog */\n public DeleteAllOrphans(): void {\n if (this.TaxOrphans.length === 0) return;\n this.OpenConfirmDialog(\n 'Delete All Orphaned Tags',\n `Delete all ${this.TaxOrphans.length} orphaned tag${this.TaxOrphans.length > 1 ? 's' : ''}? This cannot be undone.`,\n async () => {\n const md = this.ProviderToUse;\n let deletedCount = 0;\n for (const orphan of this.TaxOrphans) {\n try {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: orphan.ID }]));\n if (await entity.Delete()) {\n deletedCount++;\n this.addTaxAuditEntry('deleted', orphan.Name);\n }\n } catch {\n // continue with remaining\n }\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(`Deleted ${deletedCount} orphan tags`, 'success', 3000);\n this.TaxOrphans = [];\n this.TaxHealth.Orphaned = 0;\n this.TaxAllOrphansSelected = false;\n this.cdr.detectChanges();\n }\n );\n }\n\n // ── Treemap ──\n\n private buildTaxTreemap(): void {\n // Build treemap cells from root-level tags, sized by item count\n const tagItemCounts = this.countItemsByTag();\n\n // Group tags by root parent\n const rootGroups = new Map<string, { Name: string; TotalItems: number }>();\n for (const node of this.TaxTreeNodes) {\n rootGroups.set(node.ID, { Name: node.Name, TotalItems: node.ItemCount });\n }\n\n const colorFamilies = ['at-tm-blue', 'at-tm-green', 'at-tm-purple', 'at-tm-orange'];\n const cells: TaxTreemapCell[] = [];\n let colorIdx = 0;\n\n // For each root, add children as cells\n for (const root of this.TaxTreeNodes) {\n const family = colorFamilies[colorIdx % colorFamilies.length];\n let shadeIdx = 1;\n\n // Add root children (or the root itself if it has no children)\n const childNodes = root.Children.length > 0 ? root.Children : [root];\n const sortedChildren = [...childNodes].sort((a, b) => b.ItemCount - a.ItemCount);\n\n for (const child of sortedChildren.slice(0, 4)) {\n cells.push({\n ID: child.ID,\n Name: child.Name,\n ItemCount: child.ItemCount,\n ColorClass: `${family}-${shadeIdx}`,\n RowSpan: child.ItemCount > 10 ? 2 : 1\n });\n shadeIdx++;\n }\n colorIdx++;\n }\n\n this.TaxTreemapCells = cells;\n\n // KPIs\n const totalTags = this.tagsRaw.length;\n const maxDepth = this.TaxFlatNodes.length > 0\n ? Math.max(...this.TaxFlatNodes.map(n => n.Depth))\n : 0;\n const avgDepth = this.TaxFlatNodes.length > 0\n ? (this.TaxFlatNodes.reduce((sum, n) => sum + n.Depth, 0) / this.TaxFlatNodes.length).toFixed(1)\n : '0';\n const mostUsed = this.TaxFlatNodes.length > 0\n ? [...this.TaxFlatNodes].sort((a, b) => b.ItemCount - a.ItemCount)[0]?.Name ?? 'None'\n : 'None';\n\n this.TaxTreemapKPIs = [\n { Label: 'Total Tags', Value: String(totalTags) },\n { Label: 'Avg Depth', Value: avgDepth },\n { Label: 'Max Depth', Value: String(maxDepth) },\n { Label: 'Most Used Tag', Value: mostUsed }\n ];\n }\n\n // ── Audit Log ──\n\n /**\n * Builds the audit timeline from the MJ: Tag Audit Logs entity.\n * Falls back to synthesizing \"created\" events from tag creation dates\n * if no real audit log records exist yet.\n */\n private buildTaxAuditLog(): void {\n if (this.tagAuditLogsRaw.length > 0) {\n this.TaxAuditEvents = this.buildAuditEventsFromLogs();\n } else {\n this.TaxAuditEvents = this.synthesizeAuditEventsFromTags();\n }\n }\n\n /**\n * Maps real Tag Audit Log records into TaxAuditEvent objects.\n * Uses the view's denormalized Tag, PerformedByUser, and RelatedTag fields.\n */\n private buildAuditEventsFromLogs(): TaxAuditEvent[] {\n const events: TaxAuditEvent[] = [];\n\n for (const log of this.tagAuditLogsRaw) {\n const action = (log['Action'] as string) ?? '';\n const type = this.mapAuditActionToType(action);\n if (!type) continue;\n\n const tagName = (log['Tag'] as string) ?? 'Unknown';\n const relatedTag = (log['RelatedTag'] as string) ?? '';\n const user = (log['PerformedByUser'] as string) ?? 'System';\n const createdAt = (log['__mj_CreatedAt'] as string) ?? '';\n const details = this.parseAuditDetails(log['Details'] as string | null);\n\n events.push({\n Type: type,\n Description: this.buildAuditDescription(type, tagName, relatedTag, details),\n TagRef: tagName,\n User: user,\n Timestamp: this.formatDate(createdAt),\n DayHeader: this.formatDayHeader(createdAt)\n });\n }\n\n return events;\n }\n\n /**\n * Synthesizes audit events from tag __mj_CreatedAt dates when no\n * real audit log records exist. Used as a fallback only.\n */\n private synthesizeAuditEventsFromTags(): TaxAuditEvent[] {\n const events: TaxAuditEvent[] = [];\n for (const tag of this.tagsRaw) {\n const name = (tag['Name'] as string) ?? 'Unnamed';\n const createdAt = tag['__mj_CreatedAt'] as string;\n if (createdAt) {\n events.push({\n Type: 'created',\n Description: 'Tag created',\n TagRef: name,\n User: 'System',\n Timestamp: this.formatDate(createdAt),\n DayHeader: this.formatDayHeader(createdAt)\n });\n }\n }\n events.sort((a, b) => b.Timestamp.localeCompare(a.Timestamp));\n return events.slice(0, 50);\n }\n\n /**\n * Maps a PascalCase DB Action value (e.g. \"Renamed\") to the lowercase\n * TaxAuditAction type used in the UI. Returns null for unrecognized values.\n */\n private mapAuditActionToType(action: string): TaxAuditAction | null {\n const mapped = action.toLowerCase() as TaxAuditAction;\n const validTypes: Set<string> = new Set<string>([\n 'created', 'merged', 'moved', 'deleted', 'renamed',\n 'deprecated', 'descriptionchanged', 'reactivated', 'split'\n ]);\n return validTypes.has(mapped) ? mapped : null;\n }\n\n /**\n * Safely parses the JSON Details column from a Tag Audit Log record.\n * Returns an empty object on parse failure.\n */\n private parseAuditDetails(details: string | null): Record<string, string> {\n if (!details) return {};\n try {\n return JSON.parse(details) as Record<string, string>;\n } catch {\n return {};\n }\n }\n\n /**\n * Builds a human-readable description for an audit event based on the\n * action type and any additional context from the related tag or details JSON.\n */\n private buildAuditDescription(type: TaxAuditAction, tagName: string, relatedTag: string, details: Record<string, string>): string {\n switch (type) {\n case 'created':\n return 'Tag created';\n case 'renamed': {\n const oldName = details['OldName'];\n return oldName ? `Renamed from \"${oldName}\"` : 'Tag renamed';\n }\n case 'moved': {\n return 'Tag moved to new parent';\n }\n case 'merged':\n return relatedTag ? `Merged into \"${relatedTag}\"` : 'Tags merged';\n case 'split':\n return relatedTag ? `Split from \"${relatedTag}\"` : 'Tag split';\n case 'deleted':\n return 'Tag deleted';\n case 'deprecated':\n return 'Tag deprecated';\n case 'reactivated':\n return 'Tag reactivated';\n case 'descriptionchanged':\n return 'Description updated';\n default:\n return `Tag ${type}`;\n }\n }\n\n /**\n * Adds a local-only audit entry to the top of the timeline for\n * immediate UI feedback after a user action (merge, delete, etc.).\n */\n private addTaxAuditEntry(type: TaxAuditAction, tagRef: string): void {\n const now = new Date().toISOString();\n this.TaxAuditEvents.unshift({\n Type: type,\n Description: this.buildAuditDescription(type, tagRef, '', {}),\n TagRef: tagRef,\n User: 'You',\n Timestamp: this.formatDate(now),\n DayHeader: 'Today'\n });\n }\n\n public ToggleTaxAuditFilter(type: string): void {\n if (this.TaxAuditFilterTypes.has(type)) {\n this.TaxAuditFilterTypes.delete(type);\n } else {\n this.TaxAuditFilterTypes.add(type);\n }\n this.cdr.detectChanges();\n }\n\n public GetFilteredAuditEvents(): TaxAuditEvent[] {\n return this.TaxAuditEvents.filter(e => this.TaxAuditFilterTypes.has(e.Type));\n }\n\n private formatDayHeader(dateStr: string): string {\n try {\n const d = new Date(dateStr);\n const today = new Date();\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n\n if (d.toDateString() === today.toDateString()) return 'Today';\n if (d.toDateString() === yesterday.toDateString()) return 'Yesterday';\n return d.toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' });\n } catch {\n return '';\n }\n }\n\n // ── Health Stats ──\n\n private buildTaxHealth(): void {\n const total = this.tagsRaw.length;\n const orphaned = this.TaxOrphans.length;\n const duplicates = this.TaxDuplicates.length;\n const needAttention = this.TaxFlatNodes.filter(n => n.HealthColor === 'yellow').length;\n const healthy = total - orphaned - needAttention;\n\n this.TaxHealth = { Total: total, Healthy: Math.max(0, healthy), NeedAttention: needAttention, Orphaned: orphaned, Duplicates: duplicates };\n }\n\n /** Returns the Font Awesome icon class for an audit event action type. */\n public GetTaxAuditIcon(type: string): string {\n const map: Record<string, string> = {\n 'created': 'fa-solid fa-plus',\n 'merged': 'fa-solid fa-code-merge',\n 'moved': 'fa-solid fa-arrows-up-down',\n 'deleted': 'fa-solid fa-trash',\n 'renamed': 'fa-solid fa-pen',\n 'deprecated': 'fa-solid fa-ban',\n 'descriptionchanged': 'fa-solid fa-file-pen',\n 'reactivated': 'fa-solid fa-rotate-left',\n 'split': 'fa-solid fa-code-branch'\n };\n return map[type] ?? 'fa-solid fa-circle';\n }\n\n // ── Confirmation Dialog ──\n\n /** Opens a styled confirmation dialog, replacing browser `confirm()`. */\n public OpenConfirmDialog(title: string, message: string, action: () => Promise<void>): void {\n this.ConfirmDialogTitle = title;\n this.ConfirmDialogMessage = message;\n this.confirmDialogAction = action;\n this.ShowConfirmDialog = true;\n this.cdr.detectChanges();\n }\n\n /** User confirmed the dialog action */\n public async ConfirmDialogAccept(): Promise<void> {\n this.ShowConfirmDialog = false;\n if (this.confirmDialogAction) {\n await this.confirmDialogAction();\n }\n this.confirmDialogAction = null;\n this.cdr.detectChanges();\n }\n\n /** User cancelled the confirmation dialog */\n public ConfirmDialogCancel(): void {\n this.ShowConfirmDialog = false;\n this.confirmDialogAction = null;\n this.cdr.detectChanges();\n }\n\n // ── Split Dialog ──\n\n /** Opens the split-tag dialog for a given tree node */\n public OpenSplitDialog(node: TaxTreeNode): void {\n this.splitTargetNode = node;\n this.SplitChildNames = '';\n this.ShowSplitDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the split-tag dialog without action */\n public CloseSplitDialog(): void {\n this.ShowSplitDialog = false;\n this.splitTargetNode = null;\n this.SplitChildNames = '';\n this.cdr.detectChanges();\n }\n\n /** Executes the split operation, creating child tags from comma-separated names */\n public async ExecuteSplit(): Promise<void> {\n if (!this.splitTargetNode || !this.SplitChildNames.trim()) return;\n const names = this.SplitChildNames.split(',')\n .map(n => n.trim())\n .filter(n => n.length > 0);\n if (names.length === 0) return;\n\n this.ShowSplitDialog = false;\n const nodeName = this.splitTargetNode.Name;\n const parentId = this.splitTargetNode.ParentID;\n\n try {\n const md = this.ProviderToUse;\n for (const name of names) {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n entity.NewRecord();\n entity.Set('Name', name);\n entity.Set('DisplayName', name);\n entity.Set('ParentID', parentId);\n await entity.Save();\n }\n\n this.addTaxAuditEntry('split', `${nodeName} into ${names.join(', ')}`);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Split \"${nodeName}\" into ${names.length} new tags`, 'success', 3000\n );\n await this.RefreshTaxonomyData();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Split error: ${msg}`, 'error', 4000);\n }\n this.splitTargetNode = null;\n this.SplitChildNames = '';\n this.cdr.detectChanges();\n }\n\n // ── Move Dialog ──\n\n /** Opens the move-tag dialog for a given tree node */\n public OpenMoveDialog(node: TaxTreeNode): void {\n this.moveTargetNode = node;\n this.MoveNewParentID = node.ParentID;\n this.ShowMoveDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the move-tag dialog without action */\n public CloseMoveDialog(): void {\n this.ShowMoveDialog = false;\n this.moveTargetNode = null;\n this.MoveNewParentID = null;\n this.cdr.detectChanges();\n }\n\n /** Returns flat list of tags eligible as move targets (excludes the node being moved and its descendants) */\n public GetMoveTargetOptions(): { ID: string; Name: string; Depth: number }[] {\n if (!this.moveTargetNode) return [];\n const excludeIds = this.collectDescendantIds(this.moveTargetNode);\n excludeIds.add(NormalizeUUID(this.moveTargetNode.ID));\n\n return this.TaxFlatNodes\n .filter(n => !excludeIds.has(NormalizeUUID(n.ID)))\n .map(n => ({ ID: n.ID, Name: n.Name, Depth: n.Depth }));\n }\n\n /** Collects IDs of all descendants of a node */\n private collectDescendantIds(node: TaxTreeNode): Set<string> {\n const ids = new Set<string>();\n for (const child of node.Children) {\n ids.add(NormalizeUUID(child.ID));\n for (const id of this.collectDescendantIds(child)) {\n ids.add(id);\n }\n }\n return ids;\n }\n\n /** Executes the move operation */\n public async ExecuteMove(): Promise<void> {\n if (!this.moveTargetNode) return;\n const newParent = this.MoveNewParentID;\n this.ShowMoveDialog = false;\n\n await this.MoveTag(this.moveTargetNode, newParent);\n this.moveTargetNode = null;\n this.MoveNewParentID = null;\n this.cdr.detectChanges();\n }\n\n // ── Merge Into Dialog ──\n\n public OpenMergeIntoDialog(node: TaxTreeNode): void {\n this.MergeSourceTag = node;\n this.MergeTargetID = null;\n this.MergeTargetData = this.GetMergeTargetOptions().map(o => ({\n ID: o.ID,\n Label: `${' '.repeat(o.Depth)}${o.Name} (${o.ItemCount})`\n }));\n this.ShowMergeIntoDialog = true;\n this.cdr.detectChanges();\n }\n\n public OnMergeTargetSelected(value: unknown): void {\n this.MergeTargetID = value != null ? String(value) : null;\n }\n\n public CloseMergeIntoDialog(): void {\n this.ShowMergeIntoDialog = false;\n this.MergeSourceTag = null;\n this.MergeTargetID = null;\n this.cdr.detectChanges();\n }\n\n /** Returns flat list of tags eligible as merge targets (excludes the source tag) */\n public GetMergeTargetOptions(): { ID: string; Name: string; Depth: number; ItemCount: number }[] {\n if (!this.MergeSourceTag) return [];\n const sourceNormalized = NormalizeUUID(this.MergeSourceTag.ID);\n\n return this.TaxFlatNodes\n .filter(n => NormalizeUUID(n.ID) !== sourceNormalized)\n .map(n => ({ ID: n.ID, Name: n.Name, Depth: n.Depth, ItemCount: n.ItemCount }));\n }\n\n public async ExecuteMergeInto(): Promise<void> {\n if (!this.MergeSourceTag || !this.MergeTargetID) return;\n const targetNode = this.TaxFlatNodes.find(n => UUIDsEqual(n.ID, this.MergeTargetID!));\n const targetName = targetNode?.Name ?? 'Unknown';\n const sourceName = this.MergeSourceTag.Name;\n const sourceId = this.MergeSourceTag.ID;\n const targetId = this.MergeTargetID;\n\n this.ShowMergeIntoDialog = false;\n await this.MergeTags(sourceId, targetId, sourceName, targetName);\n this.MergeSourceTag = null;\n this.MergeTargetID = null;\n }\n\n // ── Treemap Drill-In ──\n\n /** Opens treemap drill-in panel for the given cell */\n public OpenTreemapDrillIn(cell: TaxTreemapCell): void {\n const node = this.TaxFlatNodes.find(n => UUIDsEqual(n.ID, cell.ID));\n if (node) {\n this.TreemapDrillInNode = node;\n this.ShowTreemapDrillIn = true;\n this.loadRecentItemsForTag(node);\n this.cdr.detectChanges();\n }\n }\n\n /** Closes treemap drill-in panel */\n public CloseTreemapDrillIn(): void {\n this.ShowTreemapDrillIn = false;\n this.TreemapDrillInNode = null;\n this.cdr.detectChanges();\n }\n\n /** Navigate from treemap drill-in to the tag in the tree view */\n public DrillInToTreeView(node: TaxTreeNode): void {\n this.CloseTreemapDrillIn();\n this.SwitchTaxSubTab('tree');\n this.SelectTaxNode(node);\n }\n\n public async RefreshTaxonomyData(): Promise<void> {\n this.tabDataLoaded.delete('taxonomy');\n await this.loadTaxonomyData();\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // CONTENT ITEM DUPLICATES (G3)\n // ════════════════════════════════════════════\n\n /** Load pending content item duplicates for review */\n public async LoadContentDuplicates(): Promise<void> {\n this.IsLoadingDuplicates = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{\n ID: string; ContentItemA: string; ContentItemB: string;\n ContentItemAID: string; ContentItemBID: string;\n SimilarityScore: number; DetectionMethod: string; Status: string;\n }>({\n EntityName: 'MJ: Content Item Duplicates',\n ExtraFilter: `Status = 'Pending'`,\n OrderBy: 'SimilarityScore DESC',\n MaxRows: 100,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n // Look up source names for items\n const itemIDs = new Set<string>();\n for (const row of result.Results) {\n itemIDs.add(row.ContentItemAID);\n itemIDs.add(row.ContentItemBID);\n }\n\n const sourceNameMap = await this.resolveItemSourceNames(Array.from(itemIDs));\n\n this.ContentDuplicates = result.Results.map(row => ({\n ID: row.ID,\n ItemAName: row.ContentItemA || 'Unknown',\n ItemASource: sourceNameMap.get(row.ContentItemAID) ?? 'Unknown',\n ItemBName: row.ContentItemB || 'Unknown',\n ItemBSource: sourceNameMap.get(row.ContentItemBID) ?? 'Unknown',\n SimilarityScore: row.SimilarityScore,\n DetectionMethod: row.DetectionMethod,\n Status: row.Status as ContentDuplicateRow['Status'],\n }));\n }\n } catch (error) {\n console.error('[Classify] Error loading content duplicates:', error);\n } finally {\n this.IsLoadingDuplicates = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Resolve content source names for a list of content item IDs */\n private async resolveItemSourceNames(itemIDs: string[]): Promise<Map<string, string>> {\n const map = new Map<string, string>();\n if (itemIDs.length === 0) return map;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const idFilter = itemIDs.map(id => `ID='${id}'`).join(' OR ');\n const result = await rv.RunView<{ ID: string; ContentSource: string }>({\n EntityName: 'MJ: Content Items',\n ExtraFilter: `(${idFilter})`,\n Fields: ['ID', 'ContentSource'],\n ResultType: 'simple'\n });\n\n if (result.Success) {\n for (const row of result.Results) {\n map.set(row.ID, row.ContentSource || 'Unknown');\n }\n }\n return map;\n }\n\n /** Confirm a content duplicate pair */\n public async ConfirmContentDuplicate(dupRow: ContentDuplicateRow): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJContentItemDuplicateEntity>('MJ: Content Item Duplicates');\n const loaded = await entity.Load(dupRow.ID);\n if (!loaded) return;\n\n entity.Status = 'Confirmed';\n const saved = await entity.Save();\n if (saved) {\n this.ContentDuplicates = this.ContentDuplicates.filter(d => !UUIDsEqual(d.ID, dupRow.ID));\n MJNotificationService.Instance.CreateSimpleNotification('Duplicate confirmed', 'success', 2000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 3000);\n }\n this.cdr.detectChanges();\n }\n\n /** Dismiss a content duplicate pair */\n public async DismissContentDuplicate(dupRow: ContentDuplicateRow): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJContentItemDuplicateEntity>('MJ: Content Item Duplicates');\n const loaded = await entity.Load(dupRow.ID);\n if (!loaded) return;\n\n entity.Status = 'Dismissed';\n entity.Resolution = 'NotDuplicate';\n const saved = await entity.Save();\n if (saved) {\n this.ContentDuplicates = this.ContentDuplicates.filter(d => !UUIDsEqual(d.ID, dupRow.ID));\n MJNotificationService.Instance.CreateSimpleNotification('Duplicate dismissed', 'success', 2000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 3000);\n }\n this.cdr.detectChanges();\n }\n\n // ========================================================================\n // SUGGESTIONS — server-driven from MJ:Tag Suggestions\n // ========================================================================\n\n /** Load all pending suggestions and refresh the filtered view + nav badge. */\n public async loadSuggestions(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const sugsResult = await rv.RunView<Record<string, unknown>>({\n EntityName: 'MJ: Tag Suggestions',\n ExtraFilter: `Status='Pending'`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'simple',\n MaxRows: 1000,\n });\n if (!sugsResult.Success) {\n MJNotificationService.Instance.CreateSimpleNotification(`Failed to load suggestions: ${sugsResult.ErrorMessage}`, 'error', 5000);\n this.SuggestionRows = [];\n } else {\n this.SuggestionRows = sugsResult.Results.map(r => {\n const matchID = (r['BestMatchTagID'] as string) ?? null;\n const matchTag = matchID ? this.tagsRaw.find(t => UUIDsEqual(t['ID'] as string, matchID)) : null;\n const matchName = matchTag ? (matchTag['Name'] as string) : null;\n return {\n ID: r['ID'] as string,\n ProposedName: r['ProposedName'] as string,\n Reason: r['Reason'] as string,\n BestMatchTagID: matchID,\n BestMatchName: matchName,\n BestMatchPath: matchTag ? this.computeTagPath(matchTag) : null,\n BestMatchScore: (r['BestMatchScore'] as number) ?? null,\n SourceContentSourceID: (r['SourceContentSourceID'] as string) ?? null,\n SourceContentItemID: (r['SourceContentItemID'] as string) ?? null,\n SourceText: (r['SourceText'] as string) ?? null,\n CreatedAt: new Date(r['__mj_CreatedAt'] as string),\n Status: r['Status'] as string,\n selected: false,\n dispositionInProgress: null,\n } as SuggestionRow;\n });\n }\n this.PendingSuggestionCount = this.SuggestionRows.length;\n this.applySuggestionFilters();\n // Refresh nav badge\n this.buildNavItems();\n this.cdr.detectChanges();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error loading suggestions: ${msg}`, 'error', 5000);\n }\n }\n\n /** Walk the parent chain to build a › -separated breadcrumb for a tag. */\n private computeTagPath(tag: Record<string, unknown>): string {\n const parts: string[] = [tag['Name'] as string];\n let cursorID = (tag['ParentID'] as string) ?? null;\n const guard = new Set<string>();\n while (cursorID && !guard.has(cursorID) && parts.length < 8) {\n guard.add(cursorID);\n const next = this.tagsRaw.find(t => UUIDsEqual(t['ID'] as string, cursorID!));\n if (!next) break;\n parts.unshift(next['Name'] as string);\n cursorID = (next['ParentID'] as string) ?? null;\n }\n return parts.join(' › ');\n }\n\n /**\n * Coerce the min-score number-input event into either a number or null,\n * then re-apply filters. Inline arrow expressions in the template can't\n * disambiguate `Event` vs `number` so we route through this helper.\n */\n public OnMinScoreChange(value: number | string | null | undefined): void {\n if (value == null || value === '' || (typeof value === 'string' && value.trim() === '')) {\n this.SuggestionFilterMinScore = null;\n } else {\n const n = typeof value === 'number' ? value : Number(value);\n this.SuggestionFilterMinScore = Number.isFinite(n) ? n : null;\n }\n this.applySuggestionFilters();\n }\n\n public applySuggestionFilters(): void {\n const reason = this.SuggestionFilterReason;\n const minScore = this.SuggestionFilterMinScore;\n const search = this.SuggestionSearch.trim().toLowerCase();\n this.SuggestionRowsFiltered = this.SuggestionRows.filter(r => {\n if (reason && r.Reason !== reason) return false;\n if (minScore != null && (r.BestMatchScore == null || r.BestMatchScore < minScore)) return false;\n if (search) {\n const haystack = `${r.ProposedName} ${r.BestMatchName ?? ''} ${r.SourceText ?? ''}`.toLowerCase();\n if (!haystack.includes(search)) return false;\n }\n return true;\n });\n this.cdr.detectChanges();\n }\n\n public ToggleSuggestionSelected(row: SuggestionRow, ev: Event): void {\n ev.stopPropagation();\n row.selected = !row.selected;\n this.cdr.detectChanges();\n }\n\n public ToggleAllSuggestions(checked: boolean): void {\n for (const r of this.SuggestionRowsFiltered) r.selected = checked;\n this.cdr.detectChanges();\n }\n\n public SelectedSuggestionCount(): number {\n return this.SuggestionRowsFiltered.filter(r => r.selected).length;\n }\n\n public SelectSuggestion(row: SuggestionRow): void {\n this.SuggestionSelected = row;\n this.cdr.detectChanges();\n }\n\n public CloseDrawer(): void {\n this.SuggestionSelected = null;\n this.cdr.detectChanges();\n }\n\n /** Server-driven: routes through TagGovernanceResolver mutations. */\n public async DispositionSuggestion(row: SuggestionRow, kind: 'create-new' | 'merge' | 'reject'): Promise<void> {\n if (!row || row.dispositionInProgress) return;\n row.dispositionInProgress = kind;\n this.cdr.detectChanges();\n try {\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) throw new Error('No GraphQL provider available.');\n const client = new GraphQLAIClient(provider);\n if (kind === 'reject') {\n const r = await client.RejectTagSuggestion({ suggestionID: row.ID });\n if (!r.Success) throw new Error(r.ErrorMessage ?? 'reject failed');\n MJNotificationService.Instance.CreateSimpleNotification(`Rejected \"${row.ProposedName}\".`, 'info', 2200);\n } else {\n const r = await client.PromoteTagSuggestion({\n suggestionID: row.ID,\n strategy: kind === 'merge' ? 'merge-into-existing' : 'create-new',\n targetTagID: kind === 'merge' ? row.BestMatchTagID ?? undefined : undefined,\n });\n if (!r.Success) throw new Error(r.ErrorMessage ?? 'promote failed');\n if (kind === 'merge') {\n MJNotificationService.Instance.CreateSimpleNotification(`Merged \"${row.ProposedName}\" into \"${r.ResolvedTagName ?? row.BestMatchName}\".`, 'info', 2500);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(`Created tag \"${r.ResolvedTagName ?? row.ProposedName}\".`, 'info', 2500);\n }\n }\n this.SuggestionRows = this.SuggestionRows.filter(r => !UUIDsEqual(r.ID, row.ID));\n this.PendingSuggestionCount = this.SuggestionRows.length;\n this.applySuggestionFilters();\n this.buildNavItems();\n if (this.SuggestionSelected && UUIDsEqual(this.SuggestionSelected.ID, row.ID)) this.SuggestionSelected = null;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Failed to ${kind}: ${msg}`, 'error', 6000);\n } finally {\n row.dispositionInProgress = null;\n this.cdr.detectChanges();\n }\n }\n\n public async BulkApprove(): Promise<void> {\n const selected = this.SuggestionRowsFiltered.filter(r => r.selected);\n if (selected.length === 0) return;\n if (!confirm(`Approve ${selected.length} suggestion(s)? Each will merge into its best match (when available) or be created as a new tag.`)) return;\n this.SuggestionBulkInProgress = true;\n for (const row of selected) {\n const kind = row.BestMatchTagID ? 'merge' : 'create-new';\n await this.DispositionSuggestion(row, kind);\n }\n this.SuggestionBulkInProgress = false;\n }\n\n public async BulkReject(): Promise<void> {\n const selected = this.SuggestionRowsFiltered.filter(r => r.selected);\n if (selected.length === 0) return;\n if (!confirm(`Reject ${selected.length} suggestion(s)?`)) return;\n this.SuggestionBulkInProgress = true;\n for (const row of selected) await this.DispositionSuggestion(row, 'reject');\n this.SuggestionBulkInProgress = false;\n }\n\n public ReasonClass(reason: string): string {\n switch (reason) {\n case 'MergeCandidate': return 'merge';\n case 'BelowThreshold': return 'below';\n case 'ConstrainedMode':\n case 'AmbiguousMatch': return 'constrained';\n case 'ParentFrozen':\n case 'MaxChildrenExceeded':\n case 'MaxDepthExceeded':\n case 'BelowMinWeight': return 'frozen';\n case 'RequiresReview': return 'review';\n case 'LowUsage': return 'lowusage';\n case 'WideNode': return 'widenode';\n case 'AutoGrowDisabled':\n case 'MaxItemTagsExceeded': return 'autogrow';\n default: return '';\n }\n }\n\n // ========================================================================\n // TAG HEALTH — wraps the server TagHealthJob via GraphQL\n // ========================================================================\n\n public async RunHealthNow(): Promise<void> {\n if (this.HealthRunning) return;\n this.HealthRunning = true;\n this.cdr.detectChanges();\n try {\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) throw new Error('No GraphQL provider available.');\n const client = new GraphQLAIClient(provider);\n const r = await client.RunTagHealth({\n minCoOccurrence: this.HealthThresholds.minCoOccurrence,\n minNameSimilarity: this.HealthThresholds.minNameSimilarity,\n minEmbeddingSimilarity: this.HealthThresholds.minEmbeddingSimilarity,\n maxUsage: this.HealthThresholds.maxUsage,\n maxImplicitChildren: this.HealthThresholds.maxImplicitChildren,\n });\n if (!r.Success) throw new Error(r.ErrorMessage ?? 'health run failed');\n this.LastHealthSummary = {\n mergeCount: r.MergeCount,\n lowUsageCount: r.LowUsageCount,\n wideNodeCount: r.WideNodeCount,\n durationMs: r.DurationMs,\n runAt: new Date(),\n };\n this.HealthRunHistory = [\n { When: new Date(), Trigger: 'Manual · UI', TagsScanned: this.tagsRaw.length, Merge: r.MergeCount, LowUsage: r.LowUsageCount, WideNode: r.WideNodeCount, DurationMs: r.DurationMs },\n ...this.HealthRunHistory,\n ].slice(0, 12);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Tag Health: ${r.MergeCount} merge / ${r.LowUsageCount} low-usage / ${r.WideNodeCount} wide-node in ${r.DurationMs}ms.`,\n 'info', 4000\n );\n // Pull in the new pending suggestions so Duplicates / Orphans / Suggestions all reflect\n await this.loadSuggestions();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Tag Health failed: ${msg}`, 'error', 5000);\n } finally {\n this.HealthRunning = false;\n this.cdr.detectChanges();\n }\n }\n\n public async RebuildEmbeddings(): Promise<void> {\n if (this.RebuildEmbeddingsRunning) return;\n if (!confirm('Rebuild embeddings for all tags whose model doesn\\'t match the configured embedding model? This can take time.')) return;\n this.RebuildEmbeddingsRunning = true;\n this.cdr.detectChanges();\n try {\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) throw new Error('No GraphQL provider available.');\n const client = new GraphQLAIClient(provider);\n const r = await client.RebuildTagEmbeddings();\n if (!r.Success) throw new Error(r.ErrorMessage ?? 'rebuild failed');\n MJNotificationService.Instance.CreateSimpleNotification(`Refreshed ${r.Refreshed}/${r.Total} tag embeddings.`, 'info', 4000);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Rebuild failed: ${msg}`, 'error', 5000);\n } finally {\n this.RebuildEmbeddingsRunning = false;\n this.cdr.detectChanges();\n }\n }\n}\n\nexport function LoadTagsResource(): void {\n // Prevents tree-shaking\n}\n\n// ================================================================\n// Cron-to-Human-Readable Utility\n// ================================================================\n\n/**\n * Converts a 5-part or 6-part cron expression to a human-readable English string.\n *\n * Handles common patterns:\n * `0 * * * *` -> \"Every hour\"\n * `0 2 * * *` -> \"Daily at 2:00 AM\"\n * `0 2 * * 1` -> \"Weekly on Monday at 2:00 AM\"\n * `star/15 * * * *` -> \"Every 15 minutes\" (where star = asterisk)\n * `0 0 1 * *` -> \"Monthly on day 1 at 12:00 AM\"\n *\n * Falls back to returning the raw cron string for unrecognized patterns.\n *\n * @param cron A cron expression string (5 or 6 parts)\n * @returns A human-readable description or the raw cron if unrecognized\n */\nexport function CronToHumanReadable(cron: string): string {\n if (!cron) return 'No schedule';\n\n const parts = cron.trim().split(/\\s+/);\n const p = parseCronParts(parts);\n if (!p) return cron;\n\n return formatCronParts(p) ?? cron;\n}\n\n/** Internal cron field tuple */\ninterface CronFields {\n Minute: string;\n Hour: string;\n DayOfMonth: string;\n Month: string;\n DayOfWeek: string;\n}\n\n/**\n * Parses 5-part or 6-part cron expressions into normalized fields.\n * 6-part expressions have a leading seconds field that is discarded.\n */\nfunction parseCronParts(parts: string[]): CronFields | null {\n if (parts.length === 5) {\n return { Minute: parts[0], Hour: parts[1], DayOfMonth: parts[2], Month: parts[3], DayOfWeek: parts[4] };\n }\n if (parts.length === 6) {\n return { Minute: parts[1], Hour: parts[2], DayOfMonth: parts[3], Month: parts[4], DayOfWeek: parts[5] };\n }\n return null;\n}\n\n/**\n * Attempts to map parsed cron fields to a human-readable string.\n * Returns null when the pattern is not recognized.\n */\nfunction formatCronParts(p: CronFields): string | null {\n // Every N minutes: */N * * * *\n if (p.Minute.startsWith('*/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n const interval = parseInt(p.Minute.slice(2), 10);\n if (interval === 1) return 'Every minute';\n return `Every ${interval} minutes`;\n }\n\n // Every hour at minute M: M * * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n return 'Every hour';\n }\n\n // Every N hours: 0 */N * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour.startsWith('*/') && p.DayOfMonth === '*') {\n const interval = parseInt(p.Hour.slice(2), 10);\n if (interval === 1) return 'Every hour';\n return `Every ${interval} hours`;\n }\n\n // Specific hour + minute with wildcard or specific day fields\n if (!p.Minute.includes('*') && !p.Minute.includes('/') &&\n !p.Hour.includes('*') && !p.Hour.includes('/') &&\n p.Month === '*') {\n\n const hour = parseInt(p.Hour, 10);\n const minute = parseInt(p.Minute, 10);\n const timeStr = formatTimeOfDay(hour, minute);\n\n // Weekly: specific day of week\n if (p.DayOfWeek !== '*' && p.DayOfMonth === '*') {\n const dayName = dayOfWeekToName(p.DayOfWeek);\n return `Weekly on ${dayName} at ${timeStr}`;\n }\n\n // Monthly: specific day of month\n if (p.DayOfMonth !== '*' && p.DayOfWeek === '*') {\n return `Monthly on day ${p.DayOfMonth} at ${timeStr}`;\n }\n\n // Daily\n if (p.DayOfMonth === '*' && p.DayOfWeek === '*') {\n return `Daily at ${timeStr}`;\n }\n }\n\n return null;\n}\n\n/** Formats hour and minute to 12-hour AM/PM time string */\nfunction formatTimeOfDay(hour: number, minute: number): string {\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const h = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const m = minute.toString().padStart(2, '0');\n return `${h}:${m} ${ampm}`;\n}\n\n/** Maps day-of-week cron values (0-7 or SUN-SAT) to English names */\nfunction dayOfWeekToName(dow: string): string {\n const names: Record<string, string> = {\n '0': 'Sunday', '1': 'Monday', '2': 'Tuesday',\n '3': 'Wednesday', '4': 'Thursday', '5': 'Friday',\n '6': 'Saturday', '7': 'Sunday',\n 'SUN': 'Sunday', 'MON': 'Monday', 'TUE': 'Tuesday',\n 'WED': 'Wednesday', 'THU': 'Thursday', 'FRI': 'Friday',\n 'SAT': 'Saturday',\n };\n return names[dow.toUpperCase()] ?? dow;\n}\n","<!-- Tags Dashboard -->\n<div class=\"at-dashboard\">\n\n <!-- ══════ LEFT NAV ══════ -->\n <div class=\"at-left-nav\">\n <div class=\"at-left-nav-header\">\n <h2><i class=\"fa-solid fa-sitemap\"></i> Tags</h2>\n </div>\n <div class=\"at-left-nav-items\">\n @for (item of NavItems; track item.Tab) {\n <div class=\"at-nav-item\" [class.active]=\"ActiveTab === item.Tab\" (click)=\"SwitchTab(item.Tab)\">\n <i [class]=\"item.Icon\"></i> {{ item.Label }}\n @if (item.BadgeText) {\n <span class=\"at-nav-badge\" [class.at-nav-badge-live]=\"item.BadgeClass === 'nav-badge-live'\">{{ item.BadgeText }}</span>\n }\n </div>\n }\n </div>\n <div class=\"at-left-nav-footer\">\n <button class=\"at-run-pipeline-btn\" (click)=\"RunHealthNow()\" [disabled]=\"HealthRunning\">\n @if (HealthRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running…\n } @else {\n <i class=\"fa-solid fa-heart-pulse\"></i> Run Tag Health\n }\n </button>\n </div>\n </div>\n\n <!-- ══════ MAIN AREA ══════ -->\n <div class=\"at-main-area\">\n\n @if (IsLoading) {\n <div class=\"at-loading-overlay\">\n <mj-loading text=\"Loading tag data…\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading) {\n <!-- TAB 4: TAG LIBRARY -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'tags') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Overview</div>\n <div class=\"at-page-subtitle\">{{ TagRows.length }} unique tags across all content sources</div>\n </div>\n <div class=\"at-page-actions\">\n <input type=\"text\" class=\"at-search-input\" placeholder=\"Search tags...\"\n [(ngModel)]=\"TagSearchQuery\" (input)=\"FilterTags()\">\n </div>\n </div>\n <div class=\"at-page-body\">\n <div class=\"at-tag-lib-layout\">\n <div class=\"at-tag-lib-main\">\n <div class=\"at-card\">\n <div class=\"at-card-body\" style=\"max-height: 500px; overflow-y: auto;\">\n <table class=\"at-tag-table\">\n <thead>\n <tr>\n <th>Tag</th>\n <th>Count</th>\n <th>Avg Weight</th>\n <th>Distribution</th>\n <th>Top Source</th>\n <th>First Seen</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredTagRows; track row.Tag) {\n <tr class=\"at-tag-row-clickable\" (click)=\"DrillDownTag(row.Tag)\"\n [class.at-tag-row-selected]=\"SelectedDrillDownTag === row.Tag\">\n <td class=\"at-tag-name-cell\">{{ row.Tag }}</td>\n <td>{{ row.UsageCount }}</td>\n <td>\n <div class=\"at-weight-indicator\">\n <div class=\"at-weight-bar\">\n <div class=\"at-weight-bar-fill\" [style.width.%]=\"row.AvgWeight * 100\"\n [class.at-weight-high]=\"row.AvgWeight >= 0.7\"\n [class.at-weight-medium]=\"row.AvgWeight >= 0.4 && row.AvgWeight < 0.7\"\n [class.at-weight-low]=\"row.AvgWeight < 0.4\"></div>\n </div>\n <span class=\"at-weight-value\">{{ row.AvgWeight.toFixed(2) }}</span>\n </div>\n </td>\n <td>\n <div class=\"at-tag-bar\">\n <div class=\"at-tag-bar-fill\" [style.width.%]=\"row.BarWidthPct\"></div>\n </div>\n </td>\n <td>{{ row.TopSource }}</td>\n <td>{{ row.FirstSeen }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Tag drill-down: content items matching selected tag -->\n @if (SelectedDrillDownTag) {\n <div class=\"at-card\" style=\"margin-top: 12px;\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\">\n <i class=\"fa-solid fa-tag\"></i>\n Content items tagged \"{{ SelectedDrillDownTag }}\"\n ({{ TagDrillDownItems.length }})\n </span>\n <button class=\"at-slide-close\" (click)=\"CloseDrillDownTag()\" style=\"background:none;border:none;cursor:pointer;color:var(--mj-text-muted)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-card-body\" style=\"max-height: 300px; overflow-y: auto;\">\n @if (TagDrillDownItems.length === 0) {\n <div class=\"at-empty-state\"><p>No content items found for this tag.</p></div>\n } @else {\n <table class=\"at-tag-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Source</th>\n <th>Weight</th>\n <th>Updated</th>\n </tr>\n </thead>\n <tbody>\n @for (di of TagDrillDownItems; track di.ID) {\n <tr class=\"at-tag-row-clickable\" (click)=\"OpenItemDetailByID(di.ID)\">\n <td>{{ di.Name }}</td>\n <td>{{ di.SourceName }}</td>\n <td>{{ FormatWeight(di.Weight) }}</td>\n <td>{{ di.UpdatedAt }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"at-tag-lib-sidebar\">\n <div class=\"at-card at-tag-cloud-card\">\n <div class=\"at-card-title\" style=\"margin-bottom: 12px;\"><i class=\"fa-solid fa-cloud\"></i> Tag Cloud</div>\n @if (TagCloudWordItems.length > 0) {\n <mj-word-cloud\n [Items]=\"TagCloudWordItems\"\n [MaxFontSize]=\"40\"\n [MinFontSize]=\"12\"\n [MaxItems]=\"20\"\n Layout=\"spiral\"\n ColorMode=\"weight-gradient\"\n [Interactive]=\"true\"\n [Animate]=\"true\">\n </mj-word-cloud>\n } @else {\n <div class=\"at-tag-cloud-empty\">No tags yet</div>\n }\n </div>\n <div class=\"at-card\" style=\"padding: 16px; margin-top: 12px;\">\n <div class=\"at-card-title\" style=\"margin-bottom: 10px;\"><i class=\"fa-solid fa-chart-pie\"></i> By Source</div>\n <div class=\"at-tags-by-source\">\n @for (s of TagsBySource; track s.SourceName) {\n <div class=\"at-tag-source-row\">\n <span>{{ s.SourceName }}</span>\n <strong>{{ s.Count }}</strong>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 6: TAXONOMY GOVERNANCE -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'taxonomy') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Taxonomy Governance</div>\n <div class=\"at-page-subtitle\">Manage tag hierarchy, resolve duplicates, and monitor taxonomy health — <strong>{{ TaxHealth.Total }} total tags</strong></div>\n </div>\n <div class=\"at-page-actions\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"RefreshTaxonomyData()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n </div>\n\n <!-- Sub-tab strip -->\n <div class=\"at-tax-tab-strip\">\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'tree'\" (click)=\"SwitchTaxSubTab('tree')\">\n <i class=\"fa-solid fa-sitemap\"></i> Tree View\n </div>\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'duplicates'\" (click)=\"SwitchTaxSubTab('duplicates')\">\n <i class=\"fa-solid fa-link\"></i> Duplicates\n @if (TaxDuplicates.length > 0) {\n <span class=\"at-tax-tab-badge at-tax-badge-warning\">{{ TaxDuplicates.length }}</span>\n }\n </div>\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'orphans'\" (click)=\"SwitchTaxSubTab('orphans')\">\n <i class=\"fa-solid fa-ban\"></i> Orphans\n @if (TaxOrphans.length > 0) {\n <span class=\"at-tax-tab-badge at-tax-badge-error\">{{ TaxOrphans.length }}</span>\n }\n </div>\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'treemap'\" (click)=\"SwitchTaxSubTab('treemap')\">\n <i class=\"fa-solid fa-chart-tree-map\"></i> Treemap\n </div>\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'audit'\" (click)=\"SwitchTaxSubTab('audit')\">\n <i class=\"fa-solid fa-scroll\"></i> Audit Log\n </div>\n </div>\n\n <div class=\"at-page-body\">\n\n <!-- ══ SUB-TAB 1: TREE VIEW ══ -->\n @if (TaxSubTab === 'tree') {\n <div class=\"at-tax-split-view\">\n <!-- Tree panel -->\n <div class=\"at-tax-tree-panel\" style=\"position: relative;\">\n <div class=\"at-tax-tree-toolbar\">\n <input type=\"text\" class=\"at-search-input\" style=\"flex: 1;\" placeholder=\"Search tags...\"\n [(ngModel)]=\"TaxTreeSearch\" (input)=\"FilterTaxTree()\">\n <button class=\"at-tax-toolbar-btn\" title=\"Add root tag\" (click)=\"OpenCreateRootTag()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n <button class=\"at-tax-toolbar-btn\" [class.active]=\"TaxMultiSelectMode\"\n title=\"Toggle multi-select for drag reparenting\" (click)=\"ToggleMultiSelectMode()\">\n <i class=\"fa-solid fa-check-double\"></i>\n </button>\n </div>\n <div class=\"at-tax-tree-body\"\n (dragover)=\"$event.preventDefault()\"\n (drop)=\"OnDropToRoot($event)\">\n @if (TaxFilteredNodes.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-sitemap\"></i>\n <p>No tags found</p>\n </div>\n }\n @for (node of TaxFilteredNodes; track node.ID) {\n <div class=\"at-tax-tree-node\"\n [class.at-tax-node-selected]=\"node.IsSelected\"\n [class.at-tax-node-drag-over]=\"TaxDragOverNodeID === node.ID\"\n [class.at-tax-node-multi-selected]=\"IsNodeMultiSelected(node.ID)\"\n [style.padding-left.px]=\"16 + node.Depth * 20\"\n [attr.draggable]=\"true\"\n (dragstart)=\"OnTreeNodeDragStart($event, node)\"\n (dragover)=\"OnTreeNodeDragOver($event, node)\"\n (dragleave)=\"OnTreeNodeDragLeave()\"\n (drop)=\"OnTreeNodeDrop($event, node); $event.stopPropagation()\"\n (click)=\"SelectTaxNode(node)\">\n @if (TaxMultiSelectMode) {\n <input type=\"checkbox\" class=\"at-tax-tree-checkbox\"\n [checked]=\"IsNodeMultiSelected(node.ID)\"\n (click)=\"ToggleNodeSelection(node, $event)\">\n }\n <span class=\"at-tax-tree-arrow\"\n [class.at-tax-arrow-expanded]=\"node.IsExpanded && node.Children.length > 0\"\n [class.at-tax-arrow-collapsed]=\"!node.IsExpanded && node.Children.length > 0\"\n [class.at-tax-arrow-leaf]=\"node.Children.length === 0\"\n (click)=\"ToggleTaxNode(node); $event.stopPropagation()\"></span>\n <span class=\"at-tax-health-dot\" [class]=\"node.HealthColor\"></span>\n <span class=\"at-tax-tree-label\" [class.at-tax-tree-label-selected]=\"node.IsSelected\">{{ node.Name }}</span>\n <span class=\"at-tax-tree-count\">({{ node.ItemCount }})</span>\n <span class=\"at-tax-tree-add-child\" title=\"Add child tag\"\n (click)=\"OpenCreateChildTagFor(node); $event.stopPropagation()\">\n <i class=\"fa-solid fa-plus\"></i>\n </span>\n </div>\n }\n </div>\n @if (TaxTreeSaving) {\n <div class=\"at-tax-tree-saving-overlay\">\n <mj-loading text=\"Moving tags...\" size=\"small\"></mj-loading>\n </div>\n }\n </div>\n\n <!-- Details panel -->\n <div class=\"at-tax-details-panel\">\n @if (TaxSelectedNode) {\n <div class=\"at-tax-details-header\">\n <!-- Breadcrumb -->\n <div class=\"at-tax-breadcrumb\">\n @for (bc of GetTaxBreadcrumb(TaxSelectedNode); track bc.ID) {\n <span class=\"at-tax-bc-link\" (click)=\"NavigateToBreadcrumb(bc.ID)\">{{ bc.Name }}</span>\n <span class=\"at-tax-bc-sep\">›</span>\n }\n <span class=\"at-tax-bc-current\">{{ TaxSelectedNode.Name }}</span>\n </div>\n\n @if (!TaxIsEditing) {\n <div class=\"at-tax-details-title\">\n {{ TaxSelectedNode.DisplayName }}\n <span class=\"at-tax-edit-icon\" (click)=\"StartEditTag()\" title=\"Edit name\">\n <i class=\"fa-solid fa-pen\"></i>\n </span>\n </div>\n @if (TaxSelectedNode.Description) {\n <div class=\"at-tax-details-desc\">{{ TaxSelectedNode.Description }}</div>\n }\n } @else {\n <div class=\"at-tax-edit-form\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"TaxEditName\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" rows=\"3\" [(ngModel)]=\"TaxEditDescription\"></textarea>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveEditTag()\">Save</button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CancelEditTag()\">Cancel</button>\n </div>\n </div>\n }\n </div>\n\n <!-- Stats row -->\n <div class=\"at-tax-stats-row\">\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.ItemCount }}</div>\n <div class=\"at-tax-stat-label\">Items Tagged</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.AvgWeight.toFixed(2) }}</div>\n <div class=\"at-tax-stat-label\">Avg Weight</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.Children.length }}</div>\n <div class=\"at-tax-stat-label\">Children</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.Depth }}</div>\n <div class=\"at-tax-stat-label\">Depth</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value at-tax-stat-date\">{{ TaxSelectedNode.FirstSeen }}</div>\n <div class=\"at-tax-stat-label\">First Seen</div>\n </div>\n </div>\n\n <!-- Action toolbar -->\n @if (!TaxIsEditing) {\n <div class=\"at-tax-action-toolbar\">\n <button class=\"at-tax-action-btn\" (click)=\"OpenCreateChildTag()\"><i class=\"fa-solid fa-plus\"></i> Add Child</button>\n <button class=\"at-tax-action-btn\" (click)=\"StartEditTag()\"><i class=\"fa-solid fa-pen\"></i> Rename</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenMoveDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-arrows-up-down\"></i> Move</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenMergeIntoDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-compress\"></i> Merge Into...</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenSplitDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-code-branch\"></i> Split</button>\n <button class=\"at-tax-action-btn at-tax-action-danger\" (click)=\"DeleteTag(TaxSelectedNode)\"><i class=\"fa-solid fa-trash\"></i> Delete</button>\n </div>\n }\n\n <!-- Child tags -->\n @if (TaxSelectedNode.Children.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Child Tags</div>\n <div class=\"at-tax-child-chips\">\n @for (child of TaxSelectedNode.Children; track child.ID) {\n <span class=\"at-tax-child-chip\" (click)=\"SelectTaxNode(child)\">\n {{ child.Name }}\n <span class=\"at-tax-chip-count\">{{ child.ItemCount }}</span>\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Recently tagged items -->\n @if (TaxRecentItems.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Recently Tagged Items</div>\n <div class=\"at-tax-recent-list\">\n @for (item of TaxRecentItems; track $index) {\n <div class=\"at-tax-recent-item\">\n <div class=\"at-tax-recent-icon\"><i [class]=\"item.Icon\"></i></div>\n <div class=\"at-tax-recent-name\">{{ item.Name }}</div>\n <div class=\"at-tax-recent-weight\">{{ item.Weight.toFixed(2) }}</div>\n <div class=\"at-tax-recent-date\">{{ item.Date }}</div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- ─── Governance — per-node controls for the autotagger ─── -->\n @if (SelectedTagFull) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Governance — how the autotagger may grow this subtree</div>\n\n <div class=\"at-tg-toggle-row\">\n <div class=\"at-tg-toggle-label\">\n <span class=\"at-tg-toggle-t\">Allow auto-grow under this tag</span>\n <span class=\"at-tg-toggle-d\">Lets the classifier create child tags below this one. Off = constrained subtree.</span>\n </div>\n <div class=\"at-tg-switch\" [class.on]=\"SelectedTagFull.AllowAutoGrow\"\n [class.disabled]=\"SelectedTagSavingField['AllowAutoGrow']\"\n (click)=\"ToggleGovernanceFlag('AllowAutoGrow')\"></div>\n </div>\n\n <div class=\"at-tg-toggle-row\">\n <div class=\"at-tg-toggle-label\">\n <span class=\"at-tg-toggle-t\">Freeze this subtree</span>\n <span class=\"at-tg-toggle-d\">Locks this entire subtree against auto-creation, regardless of mode.</span>\n </div>\n <div class=\"at-tg-switch\" [class.on]=\"SelectedTagFull.IsFrozen\"\n [class.disabled]=\"SelectedTagSavingField['IsFrozen']\"\n (click)=\"ToggleGovernanceFlag('IsFrozen')\"></div>\n </div>\n\n <div class=\"at-tg-toggle-row\">\n <div class=\"at-tg-toggle-label\">\n <span class=\"at-tg-toggle-t\">Requires review for matches</span>\n <span class=\"at-tg-toggle-d\">High-confidence matches against this tag are routed to the suggestion queue first.</span>\n </div>\n <div class=\"at-tg-switch\" [class.on]=\"SelectedTagFull.RequiresReview\"\n [class.disabled]=\"SelectedTagSavingField['RequiresReview']\"\n (click)=\"ToggleGovernanceFlag('RequiresReview')\"></div>\n </div>\n\n <div class=\"at-tg-grid-3\">\n <div class=\"at-tg-field\">\n <label>Max children</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\"\n [value]=\"SelectedTagFull.MaxChildren ?? ''\"\n (change)=\"SaveSelectedTagNumber('MaxChildren', $any($event.target).value)\" />\n <span class=\"at-tg-hint\">Hard cap on direct children. Blank = unlimited.</span>\n </div>\n <div class=\"at-tg-field\">\n <label>Max descendant depth</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\"\n [value]=\"SelectedTagFull.MaxDescendantDepth ?? ''\"\n (change)=\"SaveSelectedTagNumber('MaxDescendantDepth', $any($event.target).value)\" />\n <span class=\"at-tg-hint\">From this node down. 0 = leaf-only.</span>\n </div>\n <div class=\"at-tg-field\">\n <label>Min confidence</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" max=\"1\" step=\"0.01\"\n [value]=\"SelectedTagFull.MinWeight ?? ''\"\n (change)=\"SaveSelectedTagNumber('MinWeight', $any($event.target).value)\" />\n <span class=\"at-tg-hint\">Floor for matches against this tag.</span>\n </div>\n </div>\n </div>\n\n <!-- ─── Scope — who can see this tag ─── -->\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Scope — who can see and tag with this</div>\n\n <div class=\"at-tg-toggle-row\">\n <div class=\"at-tg-toggle-label\">\n <span class=\"at-tg-toggle-t\">Global tag (visible to all tenants)</span>\n <span class=\"at-tg-toggle-d\">\n Off = restricted to the scope rows below.\n @if (IsGlobalLocked()) { <strong>Locked while scope rows exist.</strong> }\n </span>\n </div>\n <div class=\"at-tg-switch\" [class.on]=\"SelectedTagFull.IsGlobal\"\n [class.disabled]=\"IsGlobalLocked() || SelectedTagSavingField['IsGlobal']\"\n (click)=\"ToggleGovernanceFlag('IsGlobal')\"></div>\n </div>\n\n <div class=\"at-tg-chip-list\">\n @for (s of SelectedTagScopes; track s.ID) {\n <span class=\"at-tg-chip scoped\">{{ s.EntityName }} · {{ s.DisplayName }}</span>\n }\n @if (SelectedTagScopes.length === 0) {\n <span class=\"at-tg-hint\" style=\"font-style: italic;\">\n No scope rows. {{ SelectedTagFull.IsGlobal ? 'Tag is global.' : 'Tag is non-global with no scope — currently unreachable.' }}\n </span>\n }\n <button class=\"at-action-btn at-btn-sm\" (click)=\"OpenScopeDialog()\">\n <i class=\"fa-solid fa-pencil\"></i> Edit scope…\n </button>\n </div>\n <div class=\"at-tg-hint\" style=\"margin-top: 8px;\">\n <i class=\"fa-solid fa-info-circle\"></i> Children inherit this scope automatically. Promotion to global requires admin approval.\n </div>\n </div>\n\n <!-- ─── Synonyms — alternate names that resolve to this tag ─── -->\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Synonyms — alternate names that resolve to this tag</div>\n\n <div class=\"at-tg-syn-add\">\n <input class=\"at-search-input\" placeholder='e.g. \"GenAI\"'\n [(ngModel)]=\"NewSynonymName\"\n (keyup.enter)=\"AddSynonym()\" />\n <select class=\"at-search-input\" style=\"width: 130px;\"\n [(ngModel)]=\"NewSynonymSource\">\n <option value=\"Manual\">Manual</option>\n <option value=\"Imported\">Imported</option>\n <option value=\"Merged\">Merged</option>\n <option value=\"LLM\">LLM</option>\n </select>\n <button class=\"at-action-btn at-primary-btn\" (click)=\"AddSynonym()\" [disabled]=\"!NewSynonymName.trim()\">+ Add</button>\n </div>\n\n @if (SelectedTagSynonyms.length === 0) {\n <div class=\"at-tg-hint\" style=\"font-style: italic;\">No synonyms yet.</div>\n } @else {\n @for (s of SelectedTagSynonyms; track s.ID) {\n <div class=\"at-tg-syn-row\" [class.pending]=\"s.Source === 'LLM'\">\n <div class=\"at-tg-syn-name\">{{ s.Synonym }}</div>\n <span class=\"at-tg-syn-src {{ s.Source.toLowerCase() }}\">{{ s.Source }}</span>\n <span class=\"at-tg-syn-x\" title=\"Remove\" (click)=\"RemoveSynonym(s)\"><i class=\"fa-solid fa-xmark\"></i></span>\n </div>\n }\n }\n </div>\n }\n } @else {\n <div class=\"at-empty-state\" style=\"height: 100%;\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select a tag from the tree to view details</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Health bar -->\n <div class=\"at-tax-health-bar\">\n <span class=\"at-tax-health-label\">Taxonomy Health</span>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-total\"></span>\n <span class=\"at-tax-health-value\">{{ TaxHealth.Total }}</span>\n <span class=\"at-tax-health-text\">Total</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-healthy\"></span>\n <span class=\"at-tax-health-value at-tax-val-success\">{{ TaxHealth.Healthy }}</span>\n <span class=\"at-tax-health-text\">Healthy</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-attention\"></span>\n <span class=\"at-tax-health-value at-tax-val-warning\">{{ TaxHealth.NeedAttention }}</span>\n <span class=\"at-tax-health-text\">Need Attention</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-orphaned\"></span>\n <span class=\"at-tax-health-value at-tax-val-error\">{{ TaxHealth.Orphaned }}</span>\n <span class=\"at-tax-health-text\">Orphaned</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-duplicates\"></span>\n <span class=\"at-tax-health-value at-tax-val-info\">{{ TaxHealth.Duplicates }}</span>\n <span class=\"at-tax-health-text\">Duplicate Candidates</span>\n </div>\n </div>\n }\n\n <!-- ══ SUB-TAB 2: DUPLICATES ══ -->\n @if (TaxSubTab === 'duplicates') {\n <div class=\"at-tax-dup-stats-bar\">\n <div class=\"at-tax-dup-stat\"><strong>{{ TaxDuplicates.length }}</strong> candidates found</div>\n <div class=\"at-tax-dup-stat at-tax-dup-high\"><strong>{{ TaxHighConfidenceDupeCount }}</strong> high confidence (>85%)</div>\n <div class=\"at-tax-dup-stat at-tax-dup-moderate\"><strong>{{ TaxModerateDupeCount }}</strong> moderate (70-85%)</div>\n </div>\n\n @if (TaxDuplicates.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No duplicate tags detected</p>\n </div>\n }\n\n <div class=\"at-tax-dup-list\">\n @for (pair of TaxDuplicates; track $index) {\n <div class=\"at-tax-dup-card\" [class.at-tax-dup-high]=\"pair.SeverityClass === 'high'\" [class.at-tax-dup-moderate]=\"pair.SeverityClass === 'moderate'\">\n @if (pair.IsExactDuplicate) {\n <!-- Exact-name duplicates: show single tag name with count -->\n <div class=\"at-tax-dup-tag\">{{ pair.TagA }}</div>\n <div class=\"at-tax-dup-similarity\">\n <span class=\"at-tax-sim-percent high\">\n <i class=\"fa-solid fa-clone\"></i> {{ pair.ExactDuplicateCount }} identical records\n </span>\n </div>\n <div class=\"at-tax-dup-actions\">\n <button class=\"at-tax-dup-btn at-tax-dup-btn-primary\" (click)=\"MergeTags(pair.TagAID, pair.TagBID, pair.TagA, pair.TagB)\" [disabled]=\"IsMerging\">@if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { Merge }</button>\n <button class=\"at-tax-dup-btn\" (click)=\"DismissDuplicate(pair)\">Dismiss</button>\n </div>\n } @else {\n <!-- Similar (non-exact) pairs: show both tags with similarity -->\n <div class=\"at-tax-dup-tag\">{{ pair.TagA }}</div>\n <div class=\"at-tax-dup-arrow\"><i class=\"fa-solid fa-arrows-left-right\"></i></div>\n <div class=\"at-tax-dup-similarity\">\n <div class=\"at-tax-sim-bar-bg\">\n <div class=\"at-tax-sim-bar-fill\" [class]=\"pair.SeverityClass\" [style.width.%]=\"pair.Similarity\"></div>\n </div>\n <span class=\"at-tax-sim-percent\" [class]=\"pair.SeverityClass\">{{ pair.Similarity }}%</span>\n </div>\n <div class=\"at-tax-dup-arrow\"><i class=\"fa-solid fa-arrows-left-right\"></i></div>\n <div class=\"at-tax-dup-tag\">{{ pair.TagB }}</div>\n <div class=\"at-tax-dup-actions\">\n <button class=\"at-tax-dup-btn at-tax-dup-btn-primary\" (click)=\"MergeTags(pair.TagAID, pair.TagBID, pair.TagA, pair.TagB)\" [disabled]=\"IsMerging\">@if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { Merge }</button>\n <button class=\"at-tax-dup-btn\" (click)=\"MakeChildTag(pair.TagAID, pair.TagBID)\">Make Child</button>\n <button class=\"at-tax-dup-btn\" (click)=\"DismissDuplicate(pair)\">Dismiss</button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- ══ SUB-TAB 3: ORPHANS ══ -->\n @if (TaxSubTab === 'orphans') {\n <div class=\"at-tax-orphan-toolbar\">\n <span class=\"at-tax-orphan-count\">{{ TaxOrphans.length }} orphaned tags</span>\n <span class=\"at-tax-orphan-desc\">— no parent, no children, low usage</span>\n <div class=\"at-tax-orphan-bulk\">\n <button class=\"at-tax-bulk-btn\" (click)=\"ToggleAllOrphans()\">\n @if (TaxAllOrphansSelected) { <i class=\"fa-solid fa-square-check\"></i> } @else { <i class=\"fa-regular fa-square\"></i> }\n Select All\n </button>\n <button class=\"at-tax-bulk-btn at-tax-bulk-danger\" (click)=\"BulkDeleteOrphans()\">\n <i class=\"fa-solid fa-trash\"></i> Bulk Delete\n </button>\n <button class=\"at-tax-bulk-btn at-tax-bulk-danger\" (click)=\"DeleteAllOrphans()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete All ({{ TaxOrphans.length }})\n </button>\n </div>\n </div>\n\n @if (TaxOrphans.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No orphaned tags</p>\n </div>\n }\n\n <div class=\"at-tax-orphan-grid\">\n @for (orphan of TaxOrphans; track orphan.ID) {\n <div class=\"at-tax-orphan-card\">\n <div class=\"at-tax-orphan-header\">\n <span class=\"at-tax-orphan-name\">{{ orphan.Name }}</span>\n <input type=\"checkbox\" class=\"at-tax-orphan-checkbox\" [checked]=\"orphan.IsSelected\"\n (change)=\"ToggleOrphanSelection(orphan)\" (click)=\"$event.stopPropagation()\">\n </div>\n <div class=\"at-tax-orphan-stats\">\n <span>Usage: <strong>{{ orphan.UsageCount }}</strong></span>\n <span>Avg Weight: <strong>{{ orphan.AvgWeight.toFixed(2) }}</strong></span>\n </div>\n <div class=\"at-tax-orphan-dates\">\n <span>First: {{ orphan.FirstSeen }}</span>\n <span>Last: {{ orphan.LastSeen }}</span>\n </div>\n <div class=\"at-tax-orphan-actions\">\n <button class=\"at-tax-orphan-btn at-tax-orphan-delete\" (click)=\"DeleteOrphan(orphan)\">Delete</button>\n <button class=\"at-tax-orphan-btn\">Ignore</button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- ══ SUB-TAB 4: TREEMAP ══ -->\n @if (TaxSubTab === 'treemap') {\n <div class=\"at-tax-treemap-kpi-strip\">\n @for (kpi of TaxTreemapKPIs; track kpi.Label) {\n <div class=\"at-tax-treemap-kpi\">\n <div class=\"at-tax-treemap-kpi-value\">{{ kpi.Value }}</div>\n <div class=\"at-tax-treemap-kpi-label\">{{ kpi.Label }}</div>\n </div>\n }\n </div>\n\n @if (TaxTreemapCells.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-chart-tree-map\"></i>\n <p>No taxonomy data to visualize</p>\n </div>\n } @else {\n <div class=\"at-tax-treemap-container\">\n @for (cell of TaxTreemapCells; track $index) {\n <div class=\"at-tax-treemap-cell at-tax-treemap-cell-clickable\" [class]=\"cell.ColorClass\"\n [style.grid-row]=\"cell.RowSpan > 1 ? 'span ' + cell.RowSpan : ''\"\n (click)=\"OpenTreemapDrillIn(cell)\">\n <span class=\"at-tax-cell-name\">{{ cell.Name }}</span>\n <span class=\"at-tax-cell-count\">{{ cell.ItemCount }} items</span>\n </div>\n }\n </div>\n }\n\n <!-- Treemap Drill-In Panel -->\n @if (ShowTreemapDrillIn && TreemapDrillInNode) {\n <div class=\"at-tax-drillin-overlay\" (click)=\"CloseTreemapDrillIn()\">\n <div class=\"at-tax-drillin-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-tax-drillin-header\">\n <h3><i class=\"fa-solid fa-tag\"></i> {{ TreemapDrillInNode.Name }}</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseTreemapDrillIn()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-tax-drillin-body\">\n <div class=\"at-tax-stats-row\">\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.ItemCount }}</div>\n <div class=\"at-tax-stat-label\">Items Tagged</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.AvgWeight.toFixed(2) }}</div>\n <div class=\"at-tax-stat-label\">Avg Weight</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.Children.length }}</div>\n <div class=\"at-tax-stat-label\">Children</div>\n </div>\n </div>\n\n @if (TreemapDrillInNode.Children.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Child Tags</div>\n <div class=\"at-tax-child-chips\">\n @for (child of TreemapDrillInNode.Children; track child.ID) {\n <span class=\"at-tax-child-chip\">{{ child.Name }} <span class=\"at-tax-chip-count\">{{ child.ItemCount }}</span></span>\n }\n </div>\n </div>\n }\n\n @if (TaxRecentItems.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Recently Tagged Items</div>\n <div class=\"at-tax-recent-list\">\n @for (item of TaxRecentItems; track $index) {\n <div class=\"at-tax-recent-item\">\n <div class=\"at-tax-recent-icon\"><i [class]=\"item.Icon\"></i></div>\n <div class=\"at-tax-recent-name\">{{ item.Name }}</div>\n <div class=\"at-tax-recent-weight\">{{ item.Weight.toFixed(2) }}</div>\n <div class=\"at-tax-recent-date\">{{ item.Date }}</div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"at-tax-drillin-footer\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"DrillInToTreeView(TreemapDrillInNode)\">\n <i class=\"fa-solid fa-sitemap\"></i> View in Tree\n </button>\n </div>\n </div>\n </div>\n }\n }\n\n <!-- ══ SUB-TAB 5: AUDIT LOG ══ -->\n @if (TaxSubTab === 'audit') {\n <div class=\"at-tax-audit-filters\">\n <span class=\"at-tax-audit-filter-label\">Filter</span>\n <div class=\"at-tax-audit-checkbox-group\">\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('created')\" (change)=\"ToggleTaxAuditFilter('created')\"> Created\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('merged')\" (change)=\"ToggleTaxAuditFilter('merged')\"> Merged\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('moved')\" (change)=\"ToggleTaxAuditFilter('moved')\"> Moved\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('deleted')\" (change)=\"ToggleTaxAuditFilter('deleted')\"> Deleted\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('renamed')\" (change)=\"ToggleTaxAuditFilter('renamed')\"> Renamed\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('deprecated')\" (change)=\"ToggleTaxAuditFilter('deprecated')\"> Deprecated\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('split')\" (change)=\"ToggleTaxAuditFilter('split')\"> Split\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('reactivated')\" (change)=\"ToggleTaxAuditFilter('reactivated')\"> Reactivated\n </label>\n </div>\n </div>\n\n @if (GetFilteredAuditEvents().length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-scroll\"></i>\n <p>No audit events match the current filters</p>\n </div>\n }\n\n <div class=\"at-tax-audit-timeline\">\n @for (event of GetFilteredAuditEvents(); track $index) {\n <div class=\"at-tax-audit-event\">\n <div class=\"at-tax-audit-event-icon\" [class]=\"event.Type\">\n <i [class]=\"GetTaxAuditIcon(event.Type)\"></i>\n </div>\n <div class=\"at-tax-audit-event-body\">\n <div class=\"at-tax-audit-event-desc\">\n {{ event.Description }} <span class=\"at-tax-tag-ref\">{{ event.TagRef }}</span>\n </div>\n <div class=\"at-tax-audit-event-meta\">\n <span>{{ event.User }}</span>\n <span>{{ event.Timestamp }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB: SUGGESTIONS — server-driven inbox -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'suggestions') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Suggestions Inbox</div>\n <div class=\"at-page-subtitle\">{{ SuggestionRows.length }} pending · select rows for bulk approve / reject</div>\n </div>\n <div class=\"at-page-actions\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"loadSuggestions()\"><i class=\"fa-solid fa-arrows-rotate\"></i> Refresh</button>\n <button class=\"at-action-btn at-primary-btn\" (click)=\"RunHealthNow()\" [disabled]=\"HealthRunning\">\n @if (HealthRunning) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Running… }\n @else { <i class=\"fa-solid fa-heart-pulse\"></i> Run Tag Health }\n </button>\n </div>\n </div>\n\n <div class=\"at-page-body\">\n <div class=\"sg-shell\">\n <div class=\"sg-main\">\n <div class=\"sg-toolbar\">\n <input class=\"at-search-input\" style=\"width: 280px;\" placeholder=\"Search proposed name, source text…\"\n [(ngModel)]=\"SuggestionSearch\" (input)=\"applySuggestionFilters()\" />\n <select class=\"at-search-input\" style=\"width: 200px;\"\n [(ngModel)]=\"SuggestionFilterReason\" (change)=\"applySuggestionFilters()\">\n <option value=\"\">All reasons</option>\n @for (r of ReasonOptions; track r) { <option [value]=\"r\">{{ r }}</option> }\n </select>\n <input class=\"at-search-input\" type=\"number\" step=\"0.05\" min=\"0\" max=\"1\"\n style=\"width: 100px;\" placeholder=\"Min score\"\n [ngModel]=\"SuggestionFilterMinScore\"\n (ngModelChange)=\"OnMinScoreChange($event)\" />\n <span style=\"flex: 1;\"></span>\n <span class=\"at-muted\" style=\"font-size: 12px;\">\n Showing <strong>{{ SuggestionRowsFiltered.length }} of {{ SuggestionRows.length }}</strong>\n </span>\n </div>\n\n @if (SelectedSuggestionCount() > 0) {\n <div class=\"sg-bulk-bar\">\n <strong>{{ SelectedSuggestionCount() }} selected</strong>\n <span style=\"flex: 1;\"></span>\n <button class=\"at-action-btn at-success-btn at-btn-sm\" (click)=\"BulkApprove()\" [disabled]=\"SuggestionBulkInProgress\">\n <i class=\"fa-solid fa-check\"></i> Approve all (auto-pick best)\n </button>\n <button class=\"at-action-btn at-danger-btn at-btn-sm\" (click)=\"BulkReject()\" [disabled]=\"SuggestionBulkInProgress\">\n <i class=\"fa-solid fa-xmark\"></i> Reject\n </button>\n </div>\n }\n\n <div class=\"sg-table-body\">\n @if (SuggestionRowsFiltered.length === 0) {\n <div class=\"at-empty-state\"><i class=\"fa-solid fa-inbox\"></i><p>No pending suggestions.</p></div>\n } @else {\n <table class=\"sg-table\">\n <thead>\n <tr>\n <th style=\"width: 30px;\">\n <input type=\"checkbox\"\n [checked]=\"SelectedSuggestionCount() === SuggestionRowsFiltered.length && SuggestionRowsFiltered.length > 0\"\n (change)=\"ToggleAllSuggestions($any($event.target).checked)\" />\n </th>\n <th>Proposed name</th>\n <th>Reason</th>\n <th>Best match</th>\n <th>Score</th>\n <th>Created</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (row of SuggestionRowsFiltered; track row.ID) {\n <tr [class.sg-row-checked]=\"row.selected\"\n [class.sg-row-selected]=\"SuggestionSelected && SuggestionSelected.ID === row.ID\"\n (click)=\"SelectSuggestion(row)\">\n <td><input type=\"checkbox\" [checked]=\"row.selected\" (click)=\"ToggleSuggestionSelected(row, $event)\" /></td>\n <td><strong>{{ row.ProposedName }}</strong></td>\n <td><span class=\"sg-reason {{ ReasonClass(row.Reason) }}\">{{ row.Reason }}</span></td>\n <td>\n @if (row.BestMatchName) {\n {{ row.BestMatchName }}\n <span class=\"at-muted\" style=\"font-size: 11px;\">{{ row.BestMatchPath }}</span>\n } @else {\n <span class=\"at-muted\">— no match —</span>\n }\n </td>\n <td class=\"sg-score\">\n @if (row.BestMatchScore != null) {\n <span class=\"sg-score-bar\"><span [style.width.%]=\"row.BestMatchScore * 100\"></span></span>\n {{ row.BestMatchScore | number: '1.3-3' }}\n } @else {\n <span class=\"at-muted\">—</span>\n }\n </td>\n <td class=\"at-muted\">{{ row.CreatedAt | date: 'short' }}</td>\n <td>\n @if (row.dispositionInProgress) {\n <span class=\"at-muted\" style=\"font-size: 11px;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> {{ row.dispositionInProgress }}…\n </span>\n } @else {\n <div class=\"sg-row-actions\">\n <button class=\"at-action-btn at-btn-xs\" title=\"Create as new tag\"\n (click)=\"DispositionSuggestion(row, 'create-new'); $event.stopPropagation()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n @if (row.BestMatchTagID) {\n <button class=\"at-action-btn at-primary-btn at-btn-xs\" title=\"Merge into best match\"\n (click)=\"DispositionSuggestion(row, 'merge'); $event.stopPropagation()\">\n <i class=\"fa-solid fa-code-merge\"></i>\n </button>\n }\n <button class=\"at-action-btn at-danger-btn at-btn-xs\" title=\"Reject\"\n (click)=\"DispositionSuggestion(row, 'reject'); $event.stopPropagation()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n\n @if (SuggestionSelected) {\n <aside class=\"sg-drawer\">\n <div class=\"sg-drawer-hd\">\n <div>\n <div style=\"font-weight: 600;\">\"{{ SuggestionSelected.ProposedName }}\"</div>\n <div class=\"at-muted\" style=\"font-size: 11px;\">{{ SuggestionSelected.CreatedAt | date: 'short' }}</div>\n </div>\n <button class=\"at-action-btn at-btn-xs\" (click)=\"CloseDrawer()\" title=\"Close\"><i class=\"fa-solid fa-xmark\"></i></button>\n </div>\n <div class=\"sg-drawer-bd\">\n <span class=\"sg-reason {{ ReasonClass(SuggestionSelected.Reason) }}\">\n {{ SuggestionSelected.Reason }}\n @if (SuggestionSelected.BestMatchScore != null) { · {{ SuggestionSelected.BestMatchScore | number: '1.3-3' }} }\n </span>\n\n @if (SuggestionSelected.BestMatchTagID) {\n <h4>Proposes merge into</h4>\n <div class=\"sg-candidate\">\n <div style=\"flex: 1;\">\n <div style=\"font-weight: 600;\">{{ SuggestionSelected.BestMatchName }}</div>\n <div class=\"at-muted\" style=\"font-size: 11px;\">{{ SuggestionSelected.BestMatchPath }}</div>\n </div>\n </div>\n }\n\n @if (SuggestionSelected.SourceText) {\n <h4>Source text</h4>\n <p class=\"sg-preview\">\"{{ SuggestionSelected.SourceText }}\"</p>\n }\n\n <h4>If approved</h4>\n <p class=\"sg-preview\">\n @if (SuggestionSelected.BestMatchTagID) {\n Re-point any free-text ContentItemTag rows whose Tag matches \"<strong>{{ SuggestionSelected.ProposedName }}</strong>\" to <strong>{{ SuggestionSelected.BestMatchName }}</strong>, add it as a synonym (Source: Merged), and mark the suggestion as Merged.\n } @else {\n Create a new tag named \"<strong>{{ SuggestionSelected.ProposedName }}</strong>\" (subject to ValidateAutoGrow), inherit parent scope when applicable, and re-point any matching free-text ContentItemTag rows.\n }\n </p>\n </div>\n <div class=\"sg-drawer-ft\">\n @if (SuggestionSelected.BestMatchTagID) {\n <button class=\"at-action-btn at-primary-btn\" (click)=\"DispositionSuggestion(SuggestionSelected!, 'merge')\"\n [disabled]=\"!!SuggestionSelected.dispositionInProgress\">\n <i class=\"fa-solid fa-code-merge\"></i> Merge\n </button>\n }\n <button class=\"at-action-btn\" (click)=\"DispositionSuggestion(SuggestionSelected!, 'create-new')\"\n [disabled]=\"!!SuggestionSelected.dispositionInProgress\">\n <i class=\"fa-solid fa-plus\"></i> Create as new\n </button>\n <button class=\"at-action-btn at-danger-btn\" (click)=\"DispositionSuggestion(SuggestionSelected!, 'reject')\"\n [disabled]=\"!!SuggestionSelected.dispositionInProgress\">\n <i class=\"fa-solid fa-xmark\"></i> Reject\n </button>\n </div>\n </aside>\n }\n </div>\n </div>\n }\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB: HEALTH — Tag Health 3-card summary -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'health') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Tag Health</div>\n <div class=\"at-page-subtitle\">Automated signals about taxonomy quality</div>\n </div>\n <div class=\"at-page-actions\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"RebuildEmbeddings()\" [disabled]=\"RebuildEmbeddingsRunning\">\n @if (RebuildEmbeddingsRunning) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Rebuilding… }\n @else { <i class=\"fa-solid fa-rotate\"></i> Rebuild stale embeddings }\n </button>\n <button class=\"at-action-btn at-primary-btn\" (click)=\"RunHealthNow()\" [disabled]=\"HealthRunning\">\n @if (HealthRunning) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Running… }\n @else { <i class=\"fa-solid fa-play\"></i> Run now }\n </button>\n </div>\n </div>\n\n <div class=\"health-shell\">\n <div class=\"runbar\">\n <div class=\"stat\">\n <div class=\"l\">Last run</div>\n <div class=\"v\">{{ LastHealthSummary.runAt ? (LastHealthSummary.runAt | date: 'short') : '—' }}</div>\n </div>\n <div class=\"stat\">\n <div class=\"l\">Tags scanned</div>\n <div class=\"v\">{{ tagsRaw.length }}</div>\n </div>\n <div class=\"stat\">\n <div class=\"l\">Issues enqueued (last run)</div>\n <div class=\"v\">{{ LastHealthSummary.mergeCount + LastHealthSummary.lowUsageCount + LastHealthSummary.wideNodeCount }}</div>\n </div>\n <div class=\"stat\">\n <div class=\"l\">Pending suggestions</div>\n <div class=\"v\">{{ PendingSuggestionCount }}</div>\n </div>\n <span class=\"grow\"></span>\n <div class=\"stat\">\n <div class=\"l\">Last duration</div>\n <div class=\"v\">{{ LastHealthSummary.durationMs ? (LastHealthSummary.durationMs + 'ms') : '—' }}</div>\n </div>\n </div>\n\n <div class=\"health-cards\">\n <div class=\"h-card merge\">\n <div class=\"top\">\n <div class=\"ic\"><i class=\"fa-solid fa-code-merge\"></i></div>\n <div>\n <div class=\"name\">Merge candidates</div>\n <h3>Likely duplicate tags</h3>\n </div>\n </div>\n <div class=\"big\">{{ LastHealthSummary.mergeCount }}</div>\n <p class=\"sub\">Pairs with high embedding cosine + name similarity. Approving merges the source into the target and re-points existing ContentItemTag rows.</p>\n <div class=\"ft\">\n <button class=\"at-action-btn at-primary-btn at-btn-sm\" (click)=\"SwitchTab('suggestions'); SuggestionFilterReason = 'MergeCandidate'; applySuggestionFilters()\">\n Open in Suggestions\n </button>\n </div>\n </div>\n\n <div class=\"h-card lowusage\">\n <div class=\"top\">\n <div class=\"ic\"><i class=\"fa-solid fa-leaf\"></i></div>\n <div>\n <div class=\"name\">Low usage</div>\n <h3>Deprecation candidates</h3>\n </div>\n </div>\n <div class=\"big\">{{ LastHealthSummary.lowUsageCount }}</div>\n <p class=\"sub\">Active tags used fewer than the threshold over the lookback window. Often abandoned imports or finished-project tags.</p>\n <div class=\"ft\">\n <button class=\"at-action-btn at-primary-btn at-btn-sm\" (click)=\"SwitchTab('suggestions'); SuggestionFilterReason = 'LowUsage'; applySuggestionFilters()\">\n Review\n </button>\n </div>\n </div>\n\n <div class=\"h-card widenode\">\n <div class=\"top\">\n <div class=\"ic\"><i class=\"fa-solid fa-tree\"></i></div>\n <div>\n <div class=\"name\">Wide nodes</div>\n <h3>Parents with too many children</h3>\n </div>\n </div>\n <div class=\"big\">{{ LastHealthSummary.wideNodeCount }}</div>\n <p class=\"sub\">Parents whose direct-child count exceeds <strong>MaxChildren</strong> (or the implicit threshold {{ HealthThresholds.maxImplicitChildren }} when no cap is set).</p>\n <div class=\"ft\">\n <button class=\"at-action-btn at-primary-btn at-btn-sm\" (click)=\"SwitchTab('suggestions'); SuggestionFilterReason = 'WideNode'; applySuggestionFilters()\">\n Review\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"threshold-form\">\n <h3>Health-job thresholds</h3>\n <div class=\"grid\">\n <div class=\"field\"><label>Merge: min co-occurrence</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" [(ngModel)]=\"HealthThresholds.minCoOccurrence\" />\n <span class=\"at-hint\">Pairs must appear together in ≥ this many items.</span>\n </div>\n <div class=\"field\"><label>Merge: min embedding cosine</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" max=\"1\" step=\"0.01\" [(ngModel)]=\"HealthThresholds.minEmbeddingSimilarity\" />\n </div>\n <div class=\"field\"><label>Merge: min name similarity</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" max=\"1\" step=\"0.05\" [(ngModel)]=\"HealthThresholds.minNameSimilarity\" />\n <span class=\"at-hint\">Dice's-coefficient bigram similarity.</span>\n </div>\n <div class=\"field\"><label>Low usage: max usage</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" [(ngModel)]=\"HealthThresholds.maxUsage\" />\n </div>\n <div class=\"field\"><label>Wide node: max implicit children</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" [(ngModel)]=\"HealthThresholds.maxImplicitChildren\" />\n <span class=\"at-hint\">Used when a tag has no explicit MaxChildren cap.</span>\n </div>\n </div>\n </div>\n\n <div class=\"run-history\">\n <div class=\"run-history-hd\">\n <h3>Run history</h3>\n <span class=\"at-muted\" style=\"font-size: 11px;\">last {{ HealthRunHistory.length }} runs</span>\n </div>\n @if (HealthRunHistory.length === 0) {\n <div class=\"at-empty-state\" style=\"padding: 32px;\"><i class=\"fa-solid fa-clock-rotate-left\"></i><p>No runs yet.</p></div>\n } @else {\n <table>\n <thead>\n <tr>\n <th>When</th><th>Trigger</th><th>Tags scanned</th><th>Merge</th><th>Low usage</th><th>Wide node</th><th>Total</th><th>Duration</th>\n </tr>\n </thead>\n <tbody>\n @for (run of HealthRunHistory; track run.When) {\n <tr>\n <td class=\"at-muted\">{{ run.When | date: 'short' }}</td>\n <td>{{ run.Trigger }}</td>\n <td>{{ run.TagsScanned }}</td>\n <td>{{ run.Merge }}</td>\n <td>{{ run.LowUsage }}</td>\n <td>{{ run.WideNode }}</td>\n <td><strong>{{ run.Merge + run.LowUsage + run.WideNode }}</strong></td>\n <td>{{ run.DurationMs }}ms</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n }\n\n <!-- end @if (!IsLoading) -->\n }\n\n </div>\n <!-- end at-main-area -->\n\n <!-- ══════ ITEM DETAIL SLIDE-IN ══════ -->\n @if (ShowItemDetail && SelectedFeedItem) {\n <div class=\"at-slide-overlay\" (click)=\"CloseItemDetail()\"></div>\n <div class=\"at-slide-panel at-detail-panel\">\n <div class=\"at-slide-header\">\n <h3><i class=\"fa-solid fa-file-lines\"></i> Content Item</h3>\n <button class=\"at-slide-close\" aria-label=\"Close item detail\" (click)=\"CloseItemDetail()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n <!-- Header -->\n <div class=\"at-detail-item-header\">\n <h4 class=\"at-detail-item-name\">{{ SelectedFeedItem.Name }}</h4>\n <div class=\"at-detail-badges\">\n <span class=\"at-detail-badge at-detail-badge-source\">{{ SelectedFeedItem.SourceName }}</span>\n @if (SelectedFeedItem.RequiresContentType) {\n <span class=\"at-detail-badge at-detail-badge-type\">{{ SelectedFeedItem.ContentTypeName }}</span>\n @if (SelectedFeedItem.FileTypeName) {\n <span class=\"at-detail-badge at-detail-badge-file\"><i class=\"fa-solid fa-file\"></i> {{ SelectedFeedItem.FileTypeName }}</span>\n }\n }\n </div>\n </div>\n\n <!-- URL -->\n @if (SelectedFeedItem.URL) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">URL</div>\n <a [href]=\"SelectedFeedItem.URL\" target=\"_blank\" class=\"at-detail-link\">\n {{ SelectedFeedItem.URL }}\n <i class=\"fa-solid fa-external-link-alt\" style=\"font-size: 0.65rem; margin-left: 4px;\"></i>\n </a>\n </div>\n }\n\n <!-- Text Preview -->\n @if (SelectedFeedItem.TextContent) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Content Preview</div>\n <div class=\"at-detail-text-preview\">{{ SelectedFeedItem.TextContent }}</div>\n </div>\n }\n\n <!-- Tags (weighted) -->\n @if (SelectedFeedItem.Tags.length > 0) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Tags ({{ SelectedFeedItem.Tags.length }})</div>\n <div class=\"at-detail-tags\">\n @for (wt of SelectedFeedItem.Tags; track wt.Tag) {\n <span class=\"at-tag-pill at-tag-weighted\" [style.font-size]=\"TagFontSize(wt.Weight)\">\n {{ wt.Tag }}\n <span class=\"at-tag-weight\">{{ FormatWeight(wt.Weight) }}</span>\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Metadata -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Metadata</div>\n <div class=\"at-detail-meta-grid\">\n @if (SelectedFeedItem.Checksum) {\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Checksum</span>\n <span class=\"at-detail-meta-value at-detail-meta-mono\">{{ SelectedFeedItem.Checksum }}</span>\n </div>\n }\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Created</span>\n <span class=\"at-detail-meta-value\">{{ SelectedFeedItem.CreatedAt }}</span>\n </div>\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Updated</span>\n <span class=\"at-detail-meta-value\">{{ SelectedFeedItem.UpdatedAt }}</span>\n </div>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"at-detail-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"OpenRecordFromItem(SelectedFeedItem)\">\n <i class=\"fa-solid fa-external-link-alt\"></i> Open Record\n </button>\n <button class=\"at-action-btn at-secondary-btn\" disabled>\n <i class=\"fa-solid fa-magnifying-glass\"></i> See Similar Items\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════ CONFIRMATION DIALOG ══════ -->\n @if (ShowConfirmDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"ConfirmDialogCancel()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ ConfirmDialogTitle }}</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"ConfirmDialogCancel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <p class=\"at-confirm-message\">{{ ConfirmDialogMessage }}</p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-danger-btn\" (click)=\"ConfirmDialogAccept()\">\n <i class=\"fa-solid fa-check\"></i> Confirm\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"ConfirmDialogCancel()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════ SPLIT DIALOG ══════ -->\n @if (ShowSplitDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseSplitDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-code-branch\"></i> Split Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseSplitDialog()\">\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>New tag names (comma-separated)</label>\n <input type=\"text\" class=\"mj-input\" style=\"width: 100%;\"\n [(ngModel)]=\"SplitChildNames\"\n placeholder=\"Tag A, Tag B, Tag C\" />\n </div>\n <p class=\"at-confirm-message\">New tags will be created as siblings of the original tag under the same parent.</p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteSplit()\" [disabled]=\"!SplitChildNames.trim()\">\n <i class=\"fa-solid fa-code-branch\"></i> Create Tags\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseSplitDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════ MOVE DIALOG ══════ -->\n @if (ShowCreateTagDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseCreateTagDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-plus\"></i> Create Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseCreateTagDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-tax-create-context\">{{ CreateTagParentLabel }}</div>\n <div class=\"at-schedule-field\">\n <label>Name</label>\n <input type=\"text\" class=\"mj-input\" style=\"width: 100%;\" [(ngModel)]=\"CreateTagName\"\n placeholder=\"Tag name\" (keydown.enter)=\"SaveNewTag()\">\n </div>\n <div class=\"at-schedule-field\">\n <label>Description (optional)</label>\n <textarea class=\"mj-textarea\" rows=\"3\" style=\"width: 100%;\" [(ngModel)]=\"CreateTagDescription\"\n placeholder=\"Brief description of this tag\"></textarea>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveNewTag()\" [disabled]=\"!CreateTagName.trim()\">\n <i class=\"fa-solid fa-check\"></i> Create\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseCreateTagDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n @if (ShowMoveDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseMoveDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-arrows-up-down\"></i> Move Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseMoveDialog()\">\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>New parent tag</label>\n <select class=\"mj-input\" style=\"width: 100%;\" [(ngModel)]=\"MoveNewParentID\">\n <option [ngValue]=\"null\">(Root level — no parent)</option>\n @for (opt of GetMoveTargetOptions(); track opt.ID) {\n <option [ngValue]=\"opt.ID\">{{ '\\u00A0\\u00A0'.repeat(opt.Depth) }}{{ opt.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteMove()\">\n <i class=\"fa-solid fa-check\"></i> Move\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseMoveDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n @if (ShowMergeIntoDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseMergeIntoDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-compress\"></i> Merge \"{{ MergeSourceTag?.Name }}\" Into...</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseMergeIntoDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <p style=\"font-size: 0.85rem; color: var(--mj-text-secondary); margin: 0 0 12px;\">\n All tagged items will be moved to the target tag, then \"{{ MergeSourceTag?.Name }}\" will be deleted.\n </p>\n <div class=\"at-schedule-field\">\n <label>Merge into</label>\n <mj-combobox\n [Data]=\"MergeTargetData\"\n TextField=\"Label\"\n ValueField=\"ID\"\n [Filterable]=\"true\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Search and select a tag...\"\n (ValueChange)=\"OnMergeTargetSelected($event)\">\n </mj-combobox>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteMergeInto()\" [disabled]=\"!MergeTargetID || IsMerging\">\n @if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { <i class=\"fa-solid fa-compress\"></i> Merge }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseMergeIntoDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n</div>\n"]}
|