@memberjunction/ng-dashboards 5.38.0 → 5.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -7
- package/dist/AI/components/agents/agent-configuration.component.js +199 -198
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +217 -860
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1717 -7802
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +333 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +2125 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts +58 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.js +260 -0
- package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts +319 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
- package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +77 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js +519 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +131 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +813 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +177 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1465 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +78 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js +492 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +56 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js +271 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +306 -290
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +1 -1
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +209 -208
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +130 -128
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +17 -17
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +578 -538
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -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 +331 -303
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +14 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/AI/services/cache-metrics.d.ts +50 -0
- package/dist/AI/services/cache-metrics.d.ts.map +1 -0
- package/dist/AI/services/cache-metrics.js +43 -0
- package/dist/AI/services/cache-metrics.js.map +1 -0
- package/dist/APIKeys/api-applications-panel.component.js +2 -2
- package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
- package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
- package/dist/APIKeys/api-keys-resource.component.js +132 -131
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +141 -141
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +15 -15
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +2 -2
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +2 -2
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +2 -2
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +72 -50
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +103 -102
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +52 -51
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +39 -38
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +92 -89
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +18 -17
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -85
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +155 -150
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +245 -243
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +18 -17
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +236 -229
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +390 -389
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +14 -11
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -119
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/index.d.ts +3 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +3 -0
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +525 -566
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +135 -134
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
- package/dist/MCP/mcp-dashboard.component.js +443 -438
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +436 -427
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +1 -1
- package/dist/Testing/components/testing-runs.component.js +116 -115
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +6 -7
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +173 -172
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +116 -92
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +57 -35
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +80 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +1 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +7 -1
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +12 -14
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +5 -14
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +4 -5
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +7 -5
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +57 -54
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
|
@@ -19,7 +19,7 @@ import { CompositeKey, LogStatus, RecordMergeRequest, RunView } from '@memberjun
|
|
|
19
19
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
20
20
|
import { KnowledgeHubMetadataEngine } from '@memberjunction/core-entities';
|
|
21
21
|
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
22
|
-
import { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';
|
|
22
|
+
import { BaseResourceComponent, NavigationService, ActivityService } from '@memberjunction/ng-shared';
|
|
23
23
|
import * as i0 from "@angular/core";
|
|
24
24
|
import * as i1 from "@angular/forms";
|
|
25
25
|
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
@@ -43,14 +43,18 @@ function DuplicateDetectionResourceComponent_For_7_Template(rf, ctx) { if (rf &
|
|
|
43
43
|
} }
|
|
44
44
|
function DuplicateDetectionResourceComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
45
45
|
i0.ɵɵelement(0, "i", 30);
|
|
46
|
-
i0.ɵɵ
|
|
46
|
+
i0.ɵɵelementStart(1, "span", 31);
|
|
47
|
+
i0.ɵɵtext(2, "Detecting\u2026");
|
|
48
|
+
i0.ɵɵelementEnd();
|
|
47
49
|
} }
|
|
48
50
|
function DuplicateDetectionResourceComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
49
|
-
i0.ɵɵelement(0, "i",
|
|
50
|
-
i0.ɵɵ
|
|
51
|
+
i0.ɵɵelement(0, "i", 32);
|
|
52
|
+
i0.ɵɵelementStart(1, "span", 31);
|
|
53
|
+
i0.ɵɵtext(2, "Run Detection");
|
|
54
|
+
i0.ɵɵelementEnd();
|
|
51
55
|
} }
|
|
52
56
|
function DuplicateDetectionResourceComponent_Conditional_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
53
|
-
i0.ɵɵelementStart(0, "span",
|
|
57
|
+
i0.ɵɵelementStart(0, "span", 38);
|
|
54
58
|
i0.ɵɵtext(1);
|
|
55
59
|
i0.ɵɵelementEnd();
|
|
56
60
|
} if (rf & 2) {
|
|
@@ -59,17 +63,17 @@ function DuplicateDetectionResourceComponent_Conditional_12_Conditional_9_Templa
|
|
|
59
63
|
i0.ɵɵtextInterpolate(ctx_r1.DetectionCurrentItem);
|
|
60
64
|
} }
|
|
61
65
|
function DuplicateDetectionResourceComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
62
|
-
i0.ɵɵelementStart(0, "div", 7)(1, "div",
|
|
66
|
+
i0.ɵɵelementStart(0, "div", 7)(1, "div", 33)(2, "span", 34);
|
|
63
67
|
i0.ɵɵelement(3, "i", 30);
|
|
64
68
|
i0.ɵɵtext(4);
|
|
65
69
|
i0.ɵɵelementEnd();
|
|
66
|
-
i0.ɵɵelementStart(5, "span",
|
|
70
|
+
i0.ɵɵelementStart(5, "span", 35);
|
|
67
71
|
i0.ɵɵtext(6);
|
|
68
72
|
i0.ɵɵelementEnd()();
|
|
69
|
-
i0.ɵɵelementStart(7, "div",
|
|
70
|
-
i0.ɵɵelement(8, "div",
|
|
73
|
+
i0.ɵɵelementStart(7, "div", 36);
|
|
74
|
+
i0.ɵɵelement(8, "div", 37);
|
|
71
75
|
i0.ɵɵelementEnd();
|
|
72
|
-
i0.ɵɵconditionalCreate(9, DuplicateDetectionResourceComponent_Conditional_12_Conditional_9_Template, 2, 1, "span",
|
|
76
|
+
i0.ɵɵconditionalCreate(9, DuplicateDetectionResourceComponent_Conditional_12_Conditional_9_Template, 2, 1, "span", 38);
|
|
73
77
|
i0.ɵɵelementEnd();
|
|
74
78
|
} if (rf & 2) {
|
|
75
79
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -84,28 +88,28 @@ function DuplicateDetectionResourceComponent_Conditional_12_Template(rf, ctx) {
|
|
|
84
88
|
} }
|
|
85
89
|
function DuplicateDetectionResourceComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
86
90
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
87
|
-
i0.ɵɵelementStart(0, "div", 8)(1, "div",
|
|
88
|
-
i0.ɵɵelement(3, "i",
|
|
91
|
+
i0.ɵɵelementStart(0, "div", 8)(1, "div", 39)(2, "label", 40);
|
|
92
|
+
i0.ɵɵelement(3, "i", 41);
|
|
89
93
|
i0.ɵɵtext(4, " Potential Match ");
|
|
90
|
-
i0.ɵɵelementStart(5, "span",
|
|
94
|
+
i0.ɵɵelementStart(5, "span", 42);
|
|
91
95
|
i0.ɵɵtext(6);
|
|
92
96
|
i0.ɵɵelementEnd()();
|
|
93
|
-
i0.ɵɵelementStart(7, "input",
|
|
97
|
+
i0.ɵɵelementStart(7, "input", 43);
|
|
94
98
|
i0.ɵɵlistener("input", function DuplicateDetectionResourceComponent_Conditional_13_Template_input_input_7_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnPotentialThresholdChanged($event.target.value / 100)); });
|
|
95
99
|
i0.ɵɵelementEnd();
|
|
96
|
-
i0.ɵɵelementStart(8, "span",
|
|
100
|
+
i0.ɵɵelementStart(8, "span", 44);
|
|
97
101
|
i0.ɵɵtext(9, "Score above which duplicates are flagged for review");
|
|
98
102
|
i0.ɵɵelementEnd()();
|
|
99
|
-
i0.ɵɵelementStart(10, "div",
|
|
100
|
-
i0.ɵɵelement(12, "i",
|
|
103
|
+
i0.ɵɵelementStart(10, "div", 39)(11, "label", 40);
|
|
104
|
+
i0.ɵɵelement(12, "i", 45);
|
|
101
105
|
i0.ɵɵtext(13, " Absolute Match ");
|
|
102
|
-
i0.ɵɵelementStart(14, "span",
|
|
106
|
+
i0.ɵɵelementStart(14, "span", 42);
|
|
103
107
|
i0.ɵɵtext(15);
|
|
104
108
|
i0.ɵɵelementEnd()();
|
|
105
|
-
i0.ɵɵelementStart(16, "input",
|
|
109
|
+
i0.ɵɵelementStart(16, "input", 43);
|
|
106
110
|
i0.ɵɵlistener("input", function DuplicateDetectionResourceComponent_Conditional_13_Template_input_input_16_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnAbsoluteThresholdChanged($event.target.value / 100)); });
|
|
107
111
|
i0.ɵɵelementEnd();
|
|
108
|
-
i0.ɵɵelementStart(17, "span",
|
|
112
|
+
i0.ɵɵelementStart(17, "span", 44);
|
|
109
113
|
i0.ɵɵtext(18, "Score above which duplicates are auto-confirmed");
|
|
110
114
|
i0.ɵɵelementEnd()()();
|
|
111
115
|
} if (rf & 2) {
|
|
@@ -136,43 +140,43 @@ function DuplicateDetectionResourceComponent_For_40_Template(rf, ctx) { if (rf &
|
|
|
136
140
|
} }
|
|
137
141
|
function DuplicateDetectionResourceComponent_Conditional_57_Template(rf, ctx) { if (rf & 1) {
|
|
138
142
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
139
|
-
i0.ɵɵelementStart(0, "button",
|
|
143
|
+
i0.ɵɵelementStart(0, "button", 46);
|
|
140
144
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_57_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ClearFilters()); });
|
|
141
|
-
i0.ɵɵelement(1, "i",
|
|
145
|
+
i0.ɵɵelement(1, "i", 47);
|
|
142
146
|
i0.ɵɵtext(2, " Clear Filters ");
|
|
143
147
|
i0.ɵɵelementEnd();
|
|
144
148
|
} }
|
|
145
149
|
function DuplicateDetectionResourceComponent_Conditional_58_Template(rf, ctx) { if (rf & 1) {
|
|
146
150
|
i0.ɵɵelementStart(0, "div", 24);
|
|
147
|
-
i0.ɵɵelement(1, "i",
|
|
151
|
+
i0.ɵɵelement(1, "i", 48);
|
|
148
152
|
i0.ɵɵtext(2, " Merging is not available for this entity. Detection results are read-only. ");
|
|
149
153
|
i0.ɵɵelementEnd();
|
|
150
154
|
} }
|
|
151
155
|
function DuplicateDetectionResourceComponent_Conditional_59_Template(rf, ctx) { if (rf & 1) {
|
|
152
156
|
i0.ɵɵelementStart(0, "div", 25);
|
|
153
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
157
|
+
i0.ɵɵelement(1, "mj-loading", 49);
|
|
154
158
|
i0.ɵɵelementEnd();
|
|
155
159
|
} }
|
|
156
160
|
function DuplicateDetectionResourceComponent_Conditional_60_Template(rf, ctx) { if (rf & 1) {
|
|
157
161
|
i0.ɵɵelementStart(0, "div", 25);
|
|
158
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
162
|
+
i0.ɵɵelement(1, "mj-loading", 49);
|
|
159
163
|
i0.ɵɵelementEnd();
|
|
160
164
|
} }
|
|
161
165
|
function DuplicateDetectionResourceComponent_Conditional_61_Template(rf, ctx) { if (rf & 1) {
|
|
162
166
|
i0.ɵɵelementStart(0, "div", 26);
|
|
163
|
-
i0.ɵɵelement(1, "i",
|
|
164
|
-
i0.ɵɵelementStart(2, "p",
|
|
167
|
+
i0.ɵɵelement(1, "i", 50);
|
|
168
|
+
i0.ɵɵelementStart(2, "p", 51);
|
|
165
169
|
i0.ɵɵtext(3, "No duplicate detection results found.");
|
|
166
170
|
i0.ɵɵelementEnd();
|
|
167
|
-
i0.ɵɵelementStart(4, "p",
|
|
171
|
+
i0.ɵɵelementStart(4, "p", 52);
|
|
168
172
|
i0.ɵɵtext(5, "Select an entity document and click \"Run Detection\" to start.");
|
|
169
173
|
i0.ɵɵelementEnd()();
|
|
170
174
|
} }
|
|
171
175
|
function DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
172
|
-
i0.ɵɵelementStart(0, "div",
|
|
176
|
+
i0.ɵɵelementStart(0, "div", 83)(1, "span", 85);
|
|
173
177
|
i0.ɵɵtext(2);
|
|
174
178
|
i0.ɵɵelementEnd();
|
|
175
|
-
i0.ɵɵelementStart(3, "span",
|
|
179
|
+
i0.ɵɵelementStart(3, "span", 86);
|
|
176
180
|
i0.ɵɵtext(4);
|
|
177
181
|
i0.ɵɵelementEnd()();
|
|
178
182
|
} if (rf & 2) {
|
|
@@ -183,7 +187,7 @@ function DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_1
|
|
|
183
187
|
i0.ɵɵtextInterpolate(ms_r9.Name);
|
|
184
188
|
} }
|
|
185
189
|
function DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
186
|
-
i0.ɵɵelementStart(0, "div",
|
|
190
|
+
i0.ɵɵelementStart(0, "div", 84);
|
|
187
191
|
i0.ɵɵtext(1);
|
|
188
192
|
i0.ɵɵelementEnd();
|
|
189
193
|
} if (rf & 2) {
|
|
@@ -192,9 +196,9 @@ function DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_1
|
|
|
192
196
|
i0.ɵɵtextInterpolate1("+", group_r8.MatchCount - group_r8.TopMatchSummaries.length, " more");
|
|
193
197
|
} }
|
|
194
198
|
function DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
195
|
-
i0.ɵɵelementStart(0, "div",
|
|
196
|
-
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_For_2_Template, 5, 2, "div",
|
|
197
|
-
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_Conditional_3_Template, 2, 1, "div",
|
|
199
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
200
|
+
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_For_2_Template, 5, 2, "div", 83, _forTrack2);
|
|
201
|
+
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_Conditional_3_Template, 2, 1, "div", 84);
|
|
198
202
|
i0.ɵɵelementEnd();
|
|
199
203
|
} if (rf & 2) {
|
|
200
204
|
const group_r8 = i0.ɵɵnextContext().$implicit;
|
|
@@ -205,38 +209,38 @@ function DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_1
|
|
|
205
209
|
} }
|
|
206
210
|
function DuplicateDetectionResourceComponent_Conditional_62_For_10_Template(rf, ctx) { if (rf & 1) {
|
|
207
211
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
208
|
-
i0.ɵɵelementStart(0, "div",
|
|
212
|
+
i0.ɵɵelementStart(0, "div", 65);
|
|
209
213
|
i0.ɵɵlistener("dragstart", function DuplicateDetectionResourceComponent_Conditional_62_For_10_Template_div_dragstart_0_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnDragStart($event, group_r8)); })("dragend", function DuplicateDetectionResourceComponent_Conditional_62_For_10_Template_div_dragend_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnDragEnd()); })("click", function DuplicateDetectionResourceComponent_Conditional_62_For_10_Template_div_click_0_listener() { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenComparison(group_r8)); });
|
|
210
|
-
i0.ɵɵelementStart(1, "div",
|
|
214
|
+
i0.ɵɵelementStart(1, "div", 66)(2, "div", 67)(3, "div", 68);
|
|
211
215
|
i0.ɵɵelement(4, "i");
|
|
212
216
|
i0.ɵɵelementEnd();
|
|
213
|
-
i0.ɵɵelementStart(5, "div",
|
|
217
|
+
i0.ɵɵelementStart(5, "div", 69)(6, "div", 70);
|
|
214
218
|
i0.ɵɵtext(7);
|
|
215
219
|
i0.ɵɵelementEnd();
|
|
216
|
-
i0.ɵɵelementStart(8, "span",
|
|
220
|
+
i0.ɵɵelementStart(8, "span", 71);
|
|
217
221
|
i0.ɵɵtext(9);
|
|
218
222
|
i0.ɵɵelementEnd()()();
|
|
219
|
-
i0.ɵɵelementStart(10, "span",
|
|
223
|
+
i0.ɵɵelementStart(10, "span", 72);
|
|
220
224
|
i0.ɵɵtext(11);
|
|
221
225
|
i0.ɵɵelementEnd()();
|
|
222
|
-
i0.ɵɵelementStart(12, "div",
|
|
223
|
-
i0.ɵɵconditionalCreate(13, DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_Template, 4, 1, "div",
|
|
224
|
-
i0.ɵɵelementStart(14, "div",
|
|
225
|
-
i0.ɵɵelement(16, "i",
|
|
226
|
+
i0.ɵɵelementStart(12, "div", 73);
|
|
227
|
+
i0.ɵɵconditionalCreate(13, DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_Template, 4, 1, "div", 74);
|
|
228
|
+
i0.ɵɵelementStart(14, "div", 75)(15, "span", 76);
|
|
229
|
+
i0.ɵɵelement(16, "i", 77);
|
|
226
230
|
i0.ɵɵtext(17);
|
|
227
231
|
i0.ɵɵelementEnd();
|
|
228
|
-
i0.ɵɵelementStart(18, "span",
|
|
229
|
-
i0.ɵɵelement(19, "i",
|
|
232
|
+
i0.ɵɵelementStart(18, "span", 76);
|
|
233
|
+
i0.ɵɵelement(19, "i", 78);
|
|
230
234
|
i0.ɵɵtext(20);
|
|
231
235
|
i0.ɵɵelementEnd()()();
|
|
232
|
-
i0.ɵɵelementStart(21, "div",
|
|
236
|
+
i0.ɵɵelementStart(21, "div", 79)(22, "button", 80);
|
|
233
237
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_62_For_10_Template_button_click_22_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.ApproveMatch(group_r8); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
234
|
-
i0.ɵɵelement(23, "i",
|
|
238
|
+
i0.ɵɵelement(23, "i", 81);
|
|
235
239
|
i0.ɵɵtext(24, " Approve ");
|
|
236
240
|
i0.ɵɵelementEnd();
|
|
237
|
-
i0.ɵɵelementStart(25, "button",
|
|
241
|
+
i0.ɵɵelementStart(25, "button", 82);
|
|
238
242
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_62_For_10_Template_button_click_25_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.RejectMatch(group_r8); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
239
|
-
i0.ɵɵelement(26, "i",
|
|
243
|
+
i0.ɵɵelement(26, "i", 47);
|
|
240
244
|
i0.ɵɵtext(27, " Reject ");
|
|
241
245
|
i0.ɵɵelementEnd()()();
|
|
242
246
|
} if (rf & 2) {
|
|
@@ -266,17 +270,17 @@ function DuplicateDetectionResourceComponent_Conditional_62_For_10_Template(rf,
|
|
|
266
270
|
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
267
271
|
} }
|
|
268
272
|
function DuplicateDetectionResourceComponent_Conditional_62_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
269
|
-
i0.ɵɵelementStart(0, "div",
|
|
270
|
-
i0.ɵɵelement(1, "i",
|
|
273
|
+
i0.ɵɵelementStart(0, "div", 60);
|
|
274
|
+
i0.ɵɵelement(1, "i", 62);
|
|
271
275
|
i0.ɵɵelementStart(2, "span");
|
|
272
276
|
i0.ɵɵtext(3, "No pending items");
|
|
273
277
|
i0.ɵɵelementEnd()();
|
|
274
278
|
} }
|
|
275
279
|
function DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
276
|
-
i0.ɵɵelementStart(0, "div",
|
|
280
|
+
i0.ɵɵelementStart(0, "div", 83)(1, "span", 85);
|
|
277
281
|
i0.ɵɵtext(2);
|
|
278
282
|
i0.ɵɵelementEnd();
|
|
279
|
-
i0.ɵɵelementStart(3, "span",
|
|
283
|
+
i0.ɵɵelementStart(3, "span", 86);
|
|
280
284
|
i0.ɵɵtext(4);
|
|
281
285
|
i0.ɵɵelementEnd()();
|
|
282
286
|
} if (rf & 2) {
|
|
@@ -287,7 +291,7 @@ function DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_1
|
|
|
287
291
|
i0.ɵɵtextInterpolate(ms_r12.Name);
|
|
288
292
|
} }
|
|
289
293
|
function DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
290
|
-
i0.ɵɵelementStart(0, "div",
|
|
294
|
+
i0.ɵɵelementStart(0, "div", 84);
|
|
291
295
|
i0.ɵɵtext(1);
|
|
292
296
|
i0.ɵɵelementEnd();
|
|
293
297
|
} if (rf & 2) {
|
|
@@ -296,9 +300,9 @@ function DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_1
|
|
|
296
300
|
i0.ɵɵtextInterpolate1("+", group_r11.MatchCount - group_r11.TopMatchSummaries.length, " more");
|
|
297
301
|
} }
|
|
298
302
|
function DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
299
|
-
i0.ɵɵelementStart(0, "div",
|
|
300
|
-
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_For_2_Template, 5, 2, "div",
|
|
301
|
-
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_Conditional_3_Template, 2, 1, "div",
|
|
303
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
304
|
+
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_For_2_Template, 5, 2, "div", 83, _forTrack2);
|
|
305
|
+
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_Conditional_3_Template, 2, 1, "div", 84);
|
|
302
306
|
i0.ɵɵelementEnd();
|
|
303
307
|
} if (rf & 2) {
|
|
304
308
|
const group_r11 = i0.ɵɵnextContext().$implicit;
|
|
@@ -309,28 +313,28 @@ function DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_1
|
|
|
309
313
|
} }
|
|
310
314
|
function DuplicateDetectionResourceComponent_Conditional_62_For_21_Template(rf, ctx) { if (rf & 1) {
|
|
311
315
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
312
|
-
i0.ɵɵelementStart(0, "div",
|
|
316
|
+
i0.ɵɵelementStart(0, "div", 65);
|
|
313
317
|
i0.ɵɵlistener("dragstart", function DuplicateDetectionResourceComponent_Conditional_62_For_21_Template_div_dragstart_0_listener($event) { const group_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnDragStart($event, group_r11)); })("dragend", function DuplicateDetectionResourceComponent_Conditional_62_For_21_Template_div_dragend_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnDragEnd()); })("click", function DuplicateDetectionResourceComponent_Conditional_62_For_21_Template_div_click_0_listener() { const group_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenComparison(group_r11)); });
|
|
314
|
-
i0.ɵɵelementStart(1, "div",
|
|
318
|
+
i0.ɵɵelementStart(1, "div", 66)(2, "div", 67)(3, "div", 68);
|
|
315
319
|
i0.ɵɵelement(4, "i");
|
|
316
320
|
i0.ɵɵelementEnd();
|
|
317
|
-
i0.ɵɵelementStart(5, "div",
|
|
321
|
+
i0.ɵɵelementStart(5, "div", 69)(6, "div", 70);
|
|
318
322
|
i0.ɵɵtext(7);
|
|
319
323
|
i0.ɵɵelementEnd();
|
|
320
|
-
i0.ɵɵelementStart(8, "span",
|
|
324
|
+
i0.ɵɵelementStart(8, "span", 71);
|
|
321
325
|
i0.ɵɵtext(9);
|
|
322
326
|
i0.ɵɵelementEnd()()();
|
|
323
|
-
i0.ɵɵelementStart(10, "span",
|
|
327
|
+
i0.ɵɵelementStart(10, "span", 72);
|
|
324
328
|
i0.ɵɵtext(11);
|
|
325
329
|
i0.ɵɵelementEnd()();
|
|
326
|
-
i0.ɵɵelementStart(12, "div",
|
|
327
|
-
i0.ɵɵconditionalCreate(13, DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_Template, 4, 1, "div",
|
|
328
|
-
i0.ɵɵelementStart(14, "div",
|
|
329
|
-
i0.ɵɵelement(16, "i",
|
|
330
|
+
i0.ɵɵelementStart(12, "div", 73);
|
|
331
|
+
i0.ɵɵconditionalCreate(13, DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_Template, 4, 1, "div", 74);
|
|
332
|
+
i0.ɵɵelementStart(14, "div", 75)(15, "span", 76);
|
|
333
|
+
i0.ɵɵelement(16, "i", 77);
|
|
330
334
|
i0.ɵɵtext(17);
|
|
331
335
|
i0.ɵɵelementEnd();
|
|
332
|
-
i0.ɵɵelementStart(18, "span",
|
|
333
|
-
i0.ɵɵelement(19, "i",
|
|
336
|
+
i0.ɵɵelementStart(18, "span", 76);
|
|
337
|
+
i0.ɵɵelement(19, "i", 78);
|
|
334
338
|
i0.ɵɵtext(20);
|
|
335
339
|
i0.ɵɵelementEnd()()()();
|
|
336
340
|
} if (rf & 2) {
|
|
@@ -356,17 +360,17 @@ function DuplicateDetectionResourceComponent_Conditional_62_For_21_Template(rf,
|
|
|
356
360
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.FormatDate(group_r11.MatchedAt), " ");
|
|
357
361
|
} }
|
|
358
362
|
function DuplicateDetectionResourceComponent_Conditional_62_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
359
|
-
i0.ɵɵelementStart(0, "div",
|
|
360
|
-
i0.ɵɵelement(1, "i",
|
|
363
|
+
i0.ɵɵelementStart(0, "div", 60);
|
|
364
|
+
i0.ɵɵelement(1, "i", 87);
|
|
361
365
|
i0.ɵɵelementStart(2, "span");
|
|
362
366
|
i0.ɵɵtext(3, "No approved items");
|
|
363
367
|
i0.ɵɵelementEnd()();
|
|
364
368
|
} }
|
|
365
369
|
function DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
366
|
-
i0.ɵɵelementStart(0, "div",
|
|
370
|
+
i0.ɵɵelementStart(0, "div", 83)(1, "span", 85);
|
|
367
371
|
i0.ɵɵtext(2);
|
|
368
372
|
i0.ɵɵelementEnd();
|
|
369
|
-
i0.ɵɵelementStart(3, "span",
|
|
373
|
+
i0.ɵɵelementStart(3, "span", 86);
|
|
370
374
|
i0.ɵɵtext(4);
|
|
371
375
|
i0.ɵɵelementEnd()();
|
|
372
376
|
} if (rf & 2) {
|
|
@@ -377,7 +381,7 @@ function DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_1
|
|
|
377
381
|
i0.ɵɵtextInterpolate(ms_r15.Name);
|
|
378
382
|
} }
|
|
379
383
|
function DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
380
|
-
i0.ɵɵelementStart(0, "div",
|
|
384
|
+
i0.ɵɵelementStart(0, "div", 84);
|
|
381
385
|
i0.ɵɵtext(1);
|
|
382
386
|
i0.ɵɵelementEnd();
|
|
383
387
|
} if (rf & 2) {
|
|
@@ -386,9 +390,9 @@ function DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_1
|
|
|
386
390
|
i0.ɵɵtextInterpolate1("+", group_r14.MatchCount - group_r14.TopMatchSummaries.length, " more");
|
|
387
391
|
} }
|
|
388
392
|
function DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
389
|
-
i0.ɵɵelementStart(0, "div",
|
|
390
|
-
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_For_2_Template, 5, 2, "div",
|
|
391
|
-
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_Conditional_3_Template, 2, 1, "div",
|
|
393
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
394
|
+
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_For_2_Template, 5, 2, "div", 83, _forTrack2);
|
|
395
|
+
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_Conditional_3_Template, 2, 1, "div", 84);
|
|
392
396
|
i0.ɵɵelementEnd();
|
|
393
397
|
} if (rf & 2) {
|
|
394
398
|
const group_r14 = i0.ɵɵnextContext().$implicit;
|
|
@@ -399,28 +403,28 @@ function DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_1
|
|
|
399
403
|
} }
|
|
400
404
|
function DuplicateDetectionResourceComponent_Conditional_62_For_32_Template(rf, ctx) { if (rf & 1) {
|
|
401
405
|
const _r13 = i0.ɵɵgetCurrentView();
|
|
402
|
-
i0.ɵɵelementStart(0, "div",
|
|
406
|
+
i0.ɵɵelementStart(0, "div", 65);
|
|
403
407
|
i0.ɵɵlistener("dragstart", function DuplicateDetectionResourceComponent_Conditional_62_For_32_Template_div_dragstart_0_listener($event) { const group_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnDragStart($event, group_r14)); })("dragend", function DuplicateDetectionResourceComponent_Conditional_62_For_32_Template_div_dragend_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnDragEnd()); })("click", function DuplicateDetectionResourceComponent_Conditional_62_For_32_Template_div_click_0_listener() { const group_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenComparison(group_r14)); });
|
|
404
|
-
i0.ɵɵelementStart(1, "div",
|
|
408
|
+
i0.ɵɵelementStart(1, "div", 66)(2, "div", 67)(3, "div", 68);
|
|
405
409
|
i0.ɵɵelement(4, "i");
|
|
406
410
|
i0.ɵɵelementEnd();
|
|
407
|
-
i0.ɵɵelementStart(5, "div",
|
|
411
|
+
i0.ɵɵelementStart(5, "div", 69)(6, "div", 70);
|
|
408
412
|
i0.ɵɵtext(7);
|
|
409
413
|
i0.ɵɵelementEnd();
|
|
410
|
-
i0.ɵɵelementStart(8, "span",
|
|
414
|
+
i0.ɵɵelementStart(8, "span", 71);
|
|
411
415
|
i0.ɵɵtext(9);
|
|
412
416
|
i0.ɵɵelementEnd()()();
|
|
413
|
-
i0.ɵɵelementStart(10, "span",
|
|
417
|
+
i0.ɵɵelementStart(10, "span", 72);
|
|
414
418
|
i0.ɵɵtext(11);
|
|
415
419
|
i0.ɵɵelementEnd()();
|
|
416
|
-
i0.ɵɵelementStart(12, "div",
|
|
417
|
-
i0.ɵɵconditionalCreate(13, DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_Template, 4, 1, "div",
|
|
418
|
-
i0.ɵɵelementStart(14, "div",
|
|
419
|
-
i0.ɵɵelement(16, "i",
|
|
420
|
+
i0.ɵɵelementStart(12, "div", 73);
|
|
421
|
+
i0.ɵɵconditionalCreate(13, DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_Template, 4, 1, "div", 74);
|
|
422
|
+
i0.ɵɵelementStart(14, "div", 75)(15, "span", 76);
|
|
423
|
+
i0.ɵɵelement(16, "i", 77);
|
|
420
424
|
i0.ɵɵtext(17);
|
|
421
425
|
i0.ɵɵelementEnd();
|
|
422
|
-
i0.ɵɵelementStart(18, "span",
|
|
423
|
-
i0.ɵɵelement(19, "i",
|
|
426
|
+
i0.ɵɵelementStart(18, "span", 76);
|
|
427
|
+
i0.ɵɵelement(19, "i", 78);
|
|
424
428
|
i0.ɵɵtext(20);
|
|
425
429
|
i0.ɵɵelementEnd()()()();
|
|
426
430
|
} if (rf & 2) {
|
|
@@ -446,52 +450,52 @@ function DuplicateDetectionResourceComponent_Conditional_62_For_32_Template(rf,
|
|
|
446
450
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.FormatDate(group_r14.MatchedAt), " ");
|
|
447
451
|
} }
|
|
448
452
|
function DuplicateDetectionResourceComponent_Conditional_62_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
449
|
-
i0.ɵɵelementStart(0, "div",
|
|
450
|
-
i0.ɵɵelement(1, "i",
|
|
453
|
+
i0.ɵɵelementStart(0, "div", 60);
|
|
454
|
+
i0.ɵɵelement(1, "i", 87);
|
|
451
455
|
i0.ɵɵelementStart(2, "span");
|
|
452
456
|
i0.ɵɵtext(3, "No rejected items");
|
|
453
457
|
i0.ɵɵelementEnd()();
|
|
454
458
|
} }
|
|
455
459
|
function DuplicateDetectionResourceComponent_Conditional_62_Template(rf, ctx) { if (rf & 1) {
|
|
456
460
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
457
|
-
i0.ɵɵelementStart(0, "div", 27)(1, "div",
|
|
458
|
-
i0.ɵɵelement(3, "i",
|
|
459
|
-
i0.ɵɵelementStart(4, "span",
|
|
461
|
+
i0.ɵɵelementStart(0, "div", 27)(1, "div", 53)(2, "div", 54);
|
|
462
|
+
i0.ɵɵelement(3, "i", 55);
|
|
463
|
+
i0.ɵɵelementStart(4, "span", 56);
|
|
460
464
|
i0.ɵɵtext(5, "Pending Review");
|
|
461
465
|
i0.ɵɵelementEnd();
|
|
462
|
-
i0.ɵɵelementStart(6, "span",
|
|
466
|
+
i0.ɵɵelementStart(6, "span", 57);
|
|
463
467
|
i0.ɵɵtext(7);
|
|
464
468
|
i0.ɵɵelementEnd()();
|
|
465
|
-
i0.ɵɵelementStart(8, "div",
|
|
469
|
+
i0.ɵɵelementStart(8, "div", 58);
|
|
466
470
|
i0.ɵɵlistener("dragover", function DuplicateDetectionResourceComponent_Conditional_62_Template_div_dragover_8_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDragOver($event, "Pending")); })("dragleave", function DuplicateDetectionResourceComponent_Conditional_62_Template_div_dragleave_8_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDragLeave($event, "Pending")); })("drop", function DuplicateDetectionResourceComponent_Conditional_62_Template_div_drop_8_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDrop($event, "Pending")); });
|
|
467
|
-
i0.ɵɵrepeaterCreate(9, DuplicateDetectionResourceComponent_Conditional_62_For_10_Template, 28, 14, "div",
|
|
468
|
-
i0.ɵɵconditionalCreate(11, DuplicateDetectionResourceComponent_Conditional_62_Conditional_11_Template, 4, 0, "div",
|
|
471
|
+
i0.ɵɵrepeaterCreate(9, DuplicateDetectionResourceComponent_Conditional_62_For_10_Template, 28, 14, "div", 59, _forTrack1);
|
|
472
|
+
i0.ɵɵconditionalCreate(11, DuplicateDetectionResourceComponent_Conditional_62_Conditional_11_Template, 4, 0, "div", 60);
|
|
469
473
|
i0.ɵɵelementEnd()();
|
|
470
|
-
i0.ɵɵelementStart(12, "div",
|
|
471
|
-
i0.ɵɵelement(14, "i",
|
|
472
|
-
i0.ɵɵelementStart(15, "span",
|
|
474
|
+
i0.ɵɵelementStart(12, "div", 53)(13, "div", 61);
|
|
475
|
+
i0.ɵɵelement(14, "i", 62);
|
|
476
|
+
i0.ɵɵelementStart(15, "span", 56);
|
|
473
477
|
i0.ɵɵtext(16, "Approved");
|
|
474
478
|
i0.ɵɵelementEnd();
|
|
475
|
-
i0.ɵɵelementStart(17, "span",
|
|
479
|
+
i0.ɵɵelementStart(17, "span", 57);
|
|
476
480
|
i0.ɵɵtext(18);
|
|
477
481
|
i0.ɵɵelementEnd()();
|
|
478
|
-
i0.ɵɵelementStart(19, "div",
|
|
482
|
+
i0.ɵɵelementStart(19, "div", 58);
|
|
479
483
|
i0.ɵɵlistener("dragover", function DuplicateDetectionResourceComponent_Conditional_62_Template_div_dragover_19_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDragOver($event, "Approved")); })("dragleave", function DuplicateDetectionResourceComponent_Conditional_62_Template_div_dragleave_19_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDragLeave($event, "Approved")); })("drop", function DuplicateDetectionResourceComponent_Conditional_62_Template_div_drop_19_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDrop($event, "Approved")); });
|
|
480
|
-
i0.ɵɵrepeaterCreate(20, DuplicateDetectionResourceComponent_Conditional_62_For_21_Template, 21, 12, "div",
|
|
481
|
-
i0.ɵɵconditionalCreate(22, DuplicateDetectionResourceComponent_Conditional_62_Conditional_22_Template, 4, 0, "div",
|
|
484
|
+
i0.ɵɵrepeaterCreate(20, DuplicateDetectionResourceComponent_Conditional_62_For_21_Template, 21, 12, "div", 59, _forTrack1);
|
|
485
|
+
i0.ɵɵconditionalCreate(22, DuplicateDetectionResourceComponent_Conditional_62_Conditional_22_Template, 4, 0, "div", 60);
|
|
482
486
|
i0.ɵɵelementEnd()();
|
|
483
|
-
i0.ɵɵelementStart(23, "div",
|
|
484
|
-
i0.ɵɵelement(25, "i",
|
|
485
|
-
i0.ɵɵelementStart(26, "span",
|
|
487
|
+
i0.ɵɵelementStart(23, "div", 53)(24, "div", 63);
|
|
488
|
+
i0.ɵɵelement(25, "i", 64);
|
|
489
|
+
i0.ɵɵelementStart(26, "span", 56);
|
|
486
490
|
i0.ɵɵtext(27, "Rejected");
|
|
487
491
|
i0.ɵɵelementEnd();
|
|
488
|
-
i0.ɵɵelementStart(28, "span",
|
|
492
|
+
i0.ɵɵelementStart(28, "span", 57);
|
|
489
493
|
i0.ɵɵtext(29);
|
|
490
494
|
i0.ɵɵelementEnd()();
|
|
491
|
-
i0.ɵɵelementStart(30, "div",
|
|
495
|
+
i0.ɵɵelementStart(30, "div", 58);
|
|
492
496
|
i0.ɵɵlistener("dragover", function DuplicateDetectionResourceComponent_Conditional_62_Template_div_dragover_30_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDragOver($event, "Rejected")); })("dragleave", function DuplicateDetectionResourceComponent_Conditional_62_Template_div_dragleave_30_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDragLeave($event, "Rejected")); })("drop", function DuplicateDetectionResourceComponent_Conditional_62_Template_div_drop_30_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDrop($event, "Rejected")); });
|
|
493
|
-
i0.ɵɵrepeaterCreate(31, DuplicateDetectionResourceComponent_Conditional_62_For_32_Template, 21, 12, "div",
|
|
494
|
-
i0.ɵɵconditionalCreate(33, DuplicateDetectionResourceComponent_Conditional_62_Conditional_33_Template, 4, 0, "div",
|
|
497
|
+
i0.ɵɵrepeaterCreate(31, DuplicateDetectionResourceComponent_Conditional_62_For_32_Template, 21, 12, "div", 59, _forTrack1);
|
|
498
|
+
i0.ɵɵconditionalCreate(33, DuplicateDetectionResourceComponent_Conditional_62_Conditional_33_Template, 4, 0, "div", 60);
|
|
495
499
|
i0.ɵɵelementEnd()()();
|
|
496
500
|
} if (rf & 2) {
|
|
497
501
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -522,32 +526,32 @@ function DuplicateDetectionResourceComponent_Conditional_62_Template(rf, ctx) {
|
|
|
522
526
|
} }
|
|
523
527
|
function DuplicateDetectionResourceComponent_Conditional_63_Template(rf, ctx) { if (rf & 1) {
|
|
524
528
|
i0.ɵɵelementStart(0, "div", 28);
|
|
525
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
529
|
+
i0.ɵɵelement(1, "mj-loading", 88);
|
|
526
530
|
i0.ɵɵelementEnd();
|
|
527
531
|
} }
|
|
528
532
|
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
529
|
-
i0.ɵɵelementStart(0, "div",
|
|
530
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
533
|
+
i0.ɵɵelementStart(0, "div", 101);
|
|
534
|
+
i0.ɵɵelement(1, "mj-loading", 127);
|
|
531
535
|
i0.ɵɵelementEnd();
|
|
532
536
|
} }
|
|
533
537
|
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
534
|
-
i0.ɵɵelementStart(0, "span",
|
|
535
|
-
i0.ɵɵelement(1, "i",
|
|
538
|
+
i0.ɵɵelementStart(0, "span", 117);
|
|
539
|
+
i0.ɵɵelement(1, "i", 128);
|
|
536
540
|
i0.ɵɵtext(2, " Most deps");
|
|
537
541
|
i0.ɵɵelementEnd();
|
|
538
542
|
} }
|
|
539
543
|
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
540
|
-
i0.ɵɵelementStart(0, "div",
|
|
544
|
+
i0.ɵɵelementStart(0, "div", 137);
|
|
541
545
|
i0.ɵɵelement(1, "i", 30);
|
|
542
546
|
i0.ɵɵtext(2, " Loading...");
|
|
543
547
|
i0.ɵɵelementEnd();
|
|
544
548
|
} }
|
|
545
549
|
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
546
550
|
const _r20 = i0.ɵɵgetCurrentView();
|
|
547
|
-
i0.ɵɵelementStart(0, "div",
|
|
551
|
+
i0.ɵɵelementStart(0, "div", 139);
|
|
548
552
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_For_3_Template_div_click_0_listener($event) { const record_r21 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r1 = i0.ɵɵnextContext(6); ctx_r1.OpenDepRecord(record_r21); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
549
|
-
i0.ɵɵelement(1, "i",
|
|
550
|
-
i0.ɵɵelementStart(2, "span",
|
|
553
|
+
i0.ɵɵelement(1, "i", 140);
|
|
554
|
+
i0.ɵɵelementStart(2, "span", 141);
|
|
551
555
|
i0.ɵɵtext(3);
|
|
552
556
|
i0.ɵɵelementEnd()();
|
|
553
557
|
} if (rf & 2) {
|
|
@@ -556,9 +560,9 @@ function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Condi
|
|
|
556
560
|
i0.ɵɵtextInterpolate(record_r21.Name);
|
|
557
561
|
} }
|
|
558
562
|
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
559
|
-
i0.ɵɵelementStart(0, "div",
|
|
560
|
-
i0.ɵɵconditionalCreate(1, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_Conditional_1_Template, 3, 0, "div",
|
|
561
|
-
i0.ɵɵrepeaterCreate(2, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_For_3_Template, 4, 1, "div",
|
|
563
|
+
i0.ɵɵelementStart(0, "div", 136);
|
|
564
|
+
i0.ɵɵconditionalCreate(1, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_Conditional_1_Template, 3, 0, "div", 137);
|
|
565
|
+
i0.ɵɵrepeaterCreate(2, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_For_3_Template, 4, 1, "div", 138, i0.ɵɵrepeaterTrackByIndex);
|
|
562
566
|
i0.ɵɵelementEnd();
|
|
563
567
|
} if (rf & 2) {
|
|
564
568
|
const dep_r19 = i0.ɵɵnextContext().$implicit;
|
|
@@ -570,16 +574,16 @@ function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Condi
|
|
|
570
574
|
} }
|
|
571
575
|
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
572
576
|
const _r18 = i0.ɵɵgetCurrentView();
|
|
573
|
-
i0.ɵɵelementStart(0, "div",
|
|
577
|
+
i0.ɵɵelementStart(0, "div", 131)(1, "div", 132);
|
|
574
578
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Template_div_click_1_listener($event) { const dep_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.ToggleDepEntityGroup(0, dep_r19.Entity); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
575
|
-
i0.ɵɵelementStart(2, "span",
|
|
576
|
-
i0.ɵɵelement(3, "i",
|
|
579
|
+
i0.ɵɵelementStart(2, "span", 133);
|
|
580
|
+
i0.ɵɵelement(3, "i", 134);
|
|
577
581
|
i0.ɵɵtext(4);
|
|
578
582
|
i0.ɵɵelementEnd();
|
|
579
|
-
i0.ɵɵelementStart(5, "span",
|
|
583
|
+
i0.ɵɵelementStart(5, "span", 135);
|
|
580
584
|
i0.ɵɵtext(6);
|
|
581
585
|
i0.ɵɵelementEnd()();
|
|
582
|
-
i0.ɵɵconditionalCreate(7, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_Template, 4, 1, "div",
|
|
586
|
+
i0.ɵɵconditionalCreate(7, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_Template, 4, 1, "div", 136);
|
|
583
587
|
i0.ɵɵelementEnd();
|
|
584
588
|
} if (rf & 2) {
|
|
585
589
|
const dep_r19 = ctx.$implicit;
|
|
@@ -594,8 +598,8 @@ function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Condi
|
|
|
594
598
|
i0.ɵɵconditional(ctx_r1.IsDepEntityGroupExpanded(0, dep_r19.Entity) ? 7 : -1);
|
|
595
599
|
} }
|
|
596
600
|
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
597
|
-
i0.ɵɵelementStart(0, "div",
|
|
598
|
-
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Template, 8, 7, "div",
|
|
601
|
+
i0.ɵɵelementStart(0, "div", 130);
|
|
602
|
+
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Template, 8, 7, "div", 131, _forTrack5);
|
|
599
603
|
i0.ɵɵelementEnd();
|
|
600
604
|
} if (rf & 2) {
|
|
601
605
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -604,14 +608,14 @@ function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Condi
|
|
|
604
608
|
} }
|
|
605
609
|
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
606
610
|
const _r17 = i0.ɵɵgetCurrentView();
|
|
607
|
-
i0.ɵɵelementStart(0, "div",
|
|
611
|
+
i0.ɵɵelementStart(0, "div", 129);
|
|
608
612
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleDepsExpanded(0)); });
|
|
609
613
|
i0.ɵɵelementStart(1, "span");
|
|
610
614
|
i0.ɵɵtext(2);
|
|
611
615
|
i0.ɵɵelementEnd();
|
|
612
|
-
i0.ɵɵelement(3, "i",
|
|
616
|
+
i0.ɵɵelement(3, "i", 112);
|
|
613
617
|
i0.ɵɵelementEnd();
|
|
614
|
-
i0.ɵɵconditionalCreate(4, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_Template, 3, 0, "div",
|
|
618
|
+
i0.ɵɵconditionalCreate(4, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_Template, 3, 0, "div", 130);
|
|
615
619
|
} if (rf & 2) {
|
|
616
620
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
617
621
|
i0.ɵɵadvance(2);
|
|
@@ -622,23 +626,23 @@ function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Templ
|
|
|
622
626
|
i0.ɵɵconditional(ctx_r1.IsDepsExpanded(0) ? 4 : -1);
|
|
623
627
|
} }
|
|
624
628
|
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
625
|
-
i0.ɵɵelementStart(0, "span",
|
|
626
|
-
i0.ɵɵelement(1, "i",
|
|
629
|
+
i0.ɵɵelementStart(0, "span", 117);
|
|
630
|
+
i0.ɵɵelement(1, "i", 128);
|
|
627
631
|
i0.ɵɵtext(2, " Most deps");
|
|
628
632
|
i0.ɵɵelementEnd();
|
|
629
633
|
} }
|
|
630
634
|
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
631
|
-
i0.ɵɵelementStart(0, "div",
|
|
635
|
+
i0.ɵɵelementStart(0, "div", 137);
|
|
632
636
|
i0.ɵɵelement(1, "i", 30);
|
|
633
637
|
i0.ɵɵtext(2, " Loading...");
|
|
634
638
|
i0.ɵɵelementEnd();
|
|
635
639
|
} }
|
|
636
640
|
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
637
641
|
const _r27 = i0.ɵɵgetCurrentView();
|
|
638
|
-
i0.ɵɵelementStart(0, "div",
|
|
642
|
+
i0.ɵɵelementStart(0, "div", 139);
|
|
639
643
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_For_3_Template_div_click_0_listener($event) { const record_r28 = i0.ɵɵrestoreView(_r27).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); ctx_r1.OpenDepRecord(record_r28); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
640
|
-
i0.ɵɵelement(1, "i",
|
|
641
|
-
i0.ɵɵelementStart(2, "span",
|
|
644
|
+
i0.ɵɵelement(1, "i", 140);
|
|
645
|
+
i0.ɵɵelementStart(2, "span", 141);
|
|
642
646
|
i0.ɵɵtext(3);
|
|
643
647
|
i0.ɵɵelementEnd()();
|
|
644
648
|
} if (rf & 2) {
|
|
@@ -647,97 +651,97 @@ function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_2
|
|
|
647
651
|
i0.ɵɵtextInterpolate(record_r28.Name);
|
|
648
652
|
} }
|
|
649
653
|
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
650
|
-
i0.ɵɵelementStart(0, "div",
|
|
651
|
-
i0.ɵɵconditionalCreate(1, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_Conditional_1_Template, 3, 0, "div",
|
|
652
|
-
i0.ɵɵrepeaterCreate(2, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_For_3_Template, 4, 1, "div",
|
|
654
|
+
i0.ɵɵelementStart(0, "div", 136);
|
|
655
|
+
i0.ɵɵconditionalCreate(1, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_Conditional_1_Template, 3, 0, "div", 137);
|
|
656
|
+
i0.ɵɵrepeaterCreate(2, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_For_3_Template, 4, 1, "div", 138, i0.ɵɵrepeaterTrackByIndex);
|
|
653
657
|
i0.ɵɵelementEnd();
|
|
654
658
|
} if (rf & 2) {
|
|
655
659
|
const dep_r26 = i0.ɵɵnextContext().$implicit;
|
|
656
|
-
const ɵ$
|
|
660
|
+
const ɵ$index_564_r23 = i0.ɵɵnextContext(3).$index;
|
|
657
661
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
658
662
|
i0.ɵɵadvance();
|
|
659
|
-
i0.ɵɵconditional(ctx_r1.IsDepRecordsLoading(ɵ$
|
|
663
|
+
i0.ɵɵconditional(ctx_r1.IsDepRecordsLoading(ɵ$index_564_r23 + 1, dep_r26.Entity) ? 1 : -1);
|
|
660
664
|
i0.ɵɵadvance();
|
|
661
|
-
i0.ɵɵrepeater(ctx_r1.GetDepRecords(ɵ$
|
|
665
|
+
i0.ɵɵrepeater(ctx_r1.GetDepRecords(ɵ$index_564_r23 + 1, dep_r26.Entity));
|
|
662
666
|
} }
|
|
663
667
|
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
664
668
|
const _r25 = i0.ɵɵgetCurrentView();
|
|
665
|
-
i0.ɵɵelementStart(0, "div",
|
|
666
|
-
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Template_div_click_1_listener($event) { const dep_r26 = i0.ɵɵrestoreView(_r25).$implicit; const ɵ$
|
|
667
|
-
i0.ɵɵelementStart(2, "span",
|
|
668
|
-
i0.ɵɵelement(3, "i",
|
|
669
|
+
i0.ɵɵelementStart(0, "div", 131)(1, "div", 132);
|
|
670
|
+
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Template_div_click_1_listener($event) { const dep_r26 = i0.ɵɵrestoreView(_r25).$implicit; const ɵ$index_564_r23 = i0.ɵɵnextContext(3).$index; const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.ToggleDepEntityGroup(ɵ$index_564_r23 + 1, dep_r26.Entity); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
671
|
+
i0.ɵɵelementStart(2, "span", 133);
|
|
672
|
+
i0.ɵɵelement(3, "i", 134);
|
|
669
673
|
i0.ɵɵtext(4);
|
|
670
674
|
i0.ɵɵelementEnd();
|
|
671
|
-
i0.ɵɵelementStart(5, "span",
|
|
675
|
+
i0.ɵɵelementStart(5, "span", 135);
|
|
672
676
|
i0.ɵɵtext(6);
|
|
673
677
|
i0.ɵɵelementEnd()();
|
|
674
|
-
i0.ɵɵconditionalCreate(7, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_Template, 4, 1, "div",
|
|
678
|
+
i0.ɵɵconditionalCreate(7, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_Template, 4, 1, "div", 136);
|
|
675
679
|
i0.ɵɵelementEnd();
|
|
676
680
|
} if (rf & 2) {
|
|
677
681
|
const dep_r26 = ctx.$implicit;
|
|
678
|
-
const ɵ$
|
|
682
|
+
const ɵ$index_564_r23 = i0.ɵɵnextContext(3).$index;
|
|
679
683
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
680
684
|
i0.ɵɵadvance(3);
|
|
681
|
-
i0.ɵɵclassProp("fa-chevron-right", !ctx_r1.IsDepEntityGroupExpanded(ɵ$
|
|
685
|
+
i0.ɵɵclassProp("fa-chevron-right", !ctx_r1.IsDepEntityGroupExpanded(ɵ$index_564_r23 + 1, dep_r26.Entity))("fa-chevron-down", ctx_r1.IsDepEntityGroupExpanded(ɵ$index_564_r23 + 1, dep_r26.Entity));
|
|
682
686
|
i0.ɵɵadvance();
|
|
683
687
|
i0.ɵɵtextInterpolate1(" ", dep_r26.Entity, " ");
|
|
684
688
|
i0.ɵɵadvance(2);
|
|
685
689
|
i0.ɵɵtextInterpolate(dep_r26.Count);
|
|
686
690
|
i0.ɵɵadvance();
|
|
687
|
-
i0.ɵɵconditional(ctx_r1.IsDepEntityGroupExpanded(ɵ$
|
|
691
|
+
i0.ɵɵconditional(ctx_r1.IsDepEntityGroupExpanded(ɵ$index_564_r23 + 1, dep_r26.Entity) ? 7 : -1);
|
|
688
692
|
} }
|
|
689
693
|
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
690
|
-
i0.ɵɵelementStart(0, "div",
|
|
691
|
-
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Template, 8, 7, "div",
|
|
694
|
+
i0.ɵɵelementStart(0, "div", 130);
|
|
695
|
+
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Template, 8, 7, "div", 131, _forTrack5);
|
|
692
696
|
i0.ɵɵelementEnd();
|
|
693
697
|
} if (rf & 2) {
|
|
694
|
-
const ɵ$
|
|
698
|
+
const ɵ$index_564_r23 = i0.ɵɵnextContext(2).$index;
|
|
695
699
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
696
700
|
i0.ɵɵadvance();
|
|
697
|
-
i0.ɵɵrepeater(ctx_r1.GetGroupedDeps(ɵ$
|
|
701
|
+
i0.ɵɵrepeater(ctx_r1.GetGroupedDeps(ɵ$index_564_r23 + 1));
|
|
698
702
|
} }
|
|
699
703
|
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
700
704
|
const _r24 = i0.ɵɵgetCurrentView();
|
|
701
|
-
i0.ɵɵelementStart(0, "div",
|
|
702
|
-
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r24); const ɵ$
|
|
705
|
+
i0.ɵɵelementStart(0, "div", 129);
|
|
706
|
+
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r24); const ɵ$index_564_r23 = i0.ɵɵnextContext().$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleDepsExpanded(ɵ$index_564_r23 + 1)); });
|
|
703
707
|
i0.ɵɵelementStart(1, "span");
|
|
704
708
|
i0.ɵɵtext(2);
|
|
705
709
|
i0.ɵɵelementEnd();
|
|
706
|
-
i0.ɵɵelement(3, "i",
|
|
710
|
+
i0.ɵɵelement(3, "i", 112);
|
|
707
711
|
i0.ɵɵelementEnd();
|
|
708
|
-
i0.ɵɵconditionalCreate(4, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_Template, 3, 0, "div",
|
|
712
|
+
i0.ɵɵconditionalCreate(4, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_Template, 3, 0, "div", 130);
|
|
709
713
|
} if (rf & 2) {
|
|
710
|
-
const ɵ$
|
|
714
|
+
const ɵ$index_564_r23 = i0.ɵɵnextContext().$index;
|
|
711
715
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
712
716
|
i0.ɵɵadvance(2);
|
|
713
|
-
i0.ɵɵtextInterpolate(ctx_r1.IsDepsExpanded(ɵ$
|
|
717
|
+
i0.ɵɵtextInterpolate(ctx_r1.IsDepsExpanded(ɵ$index_564_r23 + 1) ? "Hide details" : "Show details");
|
|
714
718
|
i0.ɵɵadvance();
|
|
715
|
-
i0.ɵɵclassProp("fa-chevron-down", !ctx_r1.IsDepsExpanded(ɵ$
|
|
719
|
+
i0.ɵɵclassProp("fa-chevron-down", !ctx_r1.IsDepsExpanded(ɵ$index_564_r23 + 1))("fa-chevron-up", ctx_r1.IsDepsExpanded(ɵ$index_564_r23 + 1));
|
|
716
720
|
i0.ɵɵadvance();
|
|
717
|
-
i0.ɵɵconditional(ctx_r1.IsDepsExpanded(ɵ$
|
|
721
|
+
i0.ɵɵconditional(ctx_r1.IsDepsExpanded(ɵ$index_564_r23 + 1) ? 4 : -1);
|
|
718
722
|
} }
|
|
719
723
|
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
720
724
|
const _r29 = i0.ɵɵgetCurrentView();
|
|
721
|
-
i0.ɵɵelementStart(0, "button",
|
|
725
|
+
i0.ɵɵelementStart(0, "button", 147);
|
|
722
726
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_24_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r29); const match_r30 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.RejectIndividualMatch(match_r30)); });
|
|
723
|
-
i0.ɵɵelement(1, "i",
|
|
727
|
+
i0.ɵɵelement(1, "i", 64);
|
|
724
728
|
i0.ɵɵtext(2, " Skip ");
|
|
725
729
|
i0.ɵɵelementEnd();
|
|
726
730
|
} }
|
|
727
731
|
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_25_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
728
732
|
const _r31 = i0.ɵɵgetCurrentView();
|
|
729
|
-
i0.ɵɵelementStart(0, "button",
|
|
733
|
+
i0.ɵɵelementStart(0, "button", 150);
|
|
730
734
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_25_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r31); const match_r30 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.UndoRejectIndividualMatch(match_r30)); });
|
|
731
|
-
i0.ɵɵelement(1, "i",
|
|
735
|
+
i0.ɵɵelement(1, "i", 151);
|
|
732
736
|
i0.ɵɵtext(2, " Undo ");
|
|
733
737
|
i0.ɵɵelementEnd();
|
|
734
738
|
} }
|
|
735
739
|
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
736
|
-
i0.ɵɵelementStart(0, "span",
|
|
737
|
-
i0.ɵɵelement(1, "i",
|
|
740
|
+
i0.ɵɵelementStart(0, "span", 148);
|
|
741
|
+
i0.ɵɵelement(1, "i", 112);
|
|
738
742
|
i0.ɵɵtext(2);
|
|
739
743
|
i0.ɵɵelementEnd();
|
|
740
|
-
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_25_Conditional_3_Template, 3, 0, "button",
|
|
744
|
+
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_25_Conditional_3_Template, 3, 0, "button", 149);
|
|
741
745
|
} if (rf & 2) {
|
|
742
746
|
const match_r30 = i0.ɵɵnextContext().$implicit;
|
|
743
747
|
i0.ɵɵclassProp("status-approved", match_r30.Match.ApprovalStatus === "Approved")("status-rejected", match_r30.Match.ApprovalStatus === "Rejected");
|
|
@@ -750,42 +754,42 @@ function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_2
|
|
|
750
754
|
} }
|
|
751
755
|
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Template(rf, ctx) { if (rf & 1) {
|
|
752
756
|
const _r22 = i0.ɵɵgetCurrentView();
|
|
753
|
-
i0.ɵɵelementStart(0, "div",
|
|
757
|
+
i0.ɵɵelementStart(0, "div", 142)(1, "div", 143)(2, "span", 107);
|
|
754
758
|
i0.ɵɵtext(3);
|
|
755
759
|
i0.ɵɵelementEnd();
|
|
756
|
-
i0.ɵɵelementStart(4, "span",
|
|
760
|
+
i0.ɵɵelementStart(4, "span", 72);
|
|
757
761
|
i0.ɵɵtext(5);
|
|
758
762
|
i0.ɵɵelementEnd()();
|
|
759
|
-
i0.ɵɵelementStart(6, "span",
|
|
763
|
+
i0.ɵɵelementStart(6, "span", 144);
|
|
760
764
|
i0.ɵɵtext(7);
|
|
761
765
|
i0.ɵɵelementEnd();
|
|
762
|
-
i0.ɵɵelementStart(8, "div",
|
|
763
|
-
i0.ɵɵlistener("change", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Template_input_change_9_listener() { const ɵ$
|
|
766
|
+
i0.ɵɵelementStart(8, "div", 108)(9, "input", 109);
|
|
767
|
+
i0.ɵɵlistener("change", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Template_input_change_9_listener() { const ɵ$index_564_r23 = i0.ɵɵrestoreView(_r22).$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SetSurvivor(ɵ$index_564_r23 + 1)); });
|
|
764
768
|
i0.ɵɵelementEnd();
|
|
765
|
-
i0.ɵɵelementStart(10, "span",
|
|
769
|
+
i0.ɵɵelementStart(10, "span", 110);
|
|
766
770
|
i0.ɵɵtext(11);
|
|
767
771
|
i0.ɵɵelementEnd()();
|
|
768
|
-
i0.ɵɵelementStart(12, "button",
|
|
769
|
-
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Template_button_click_12_listener() { const ɵ$
|
|
770
|
-
i0.ɵɵelement(13, "i",
|
|
772
|
+
i0.ɵɵelementStart(12, "button", 111);
|
|
773
|
+
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Template_button_click_12_listener() { const ɵ$index_564_r23 = i0.ɵɵrestoreView(_r22).$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.UseAllFieldsFrom(ɵ$index_564_r23 + 1)); });
|
|
774
|
+
i0.ɵɵelement(13, "i", 112);
|
|
771
775
|
i0.ɵɵtext(14);
|
|
772
776
|
i0.ɵɵelementEnd();
|
|
773
|
-
i0.ɵɵelementStart(15, "div",
|
|
774
|
-
i0.ɵɵelement(17, "i",
|
|
775
|
-
i0.ɵɵelementStart(18, "span",
|
|
777
|
+
i0.ɵɵelementStart(15, "div", 113)(16, "div", 114);
|
|
778
|
+
i0.ɵɵelement(17, "i", 115);
|
|
779
|
+
i0.ɵɵelementStart(18, "span", 116);
|
|
776
780
|
i0.ɵɵtext(19);
|
|
777
781
|
i0.ɵɵelementEnd();
|
|
778
782
|
i0.ɵɵtext(20);
|
|
779
|
-
i0.ɵɵconditionalCreate(21, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_21_Template, 3, 0, "span",
|
|
783
|
+
i0.ɵɵconditionalCreate(21, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_21_Template, 3, 0, "span", 117);
|
|
780
784
|
i0.ɵɵelementEnd();
|
|
781
785
|
i0.ɵɵconditionalCreate(22, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Template, 5, 6);
|
|
782
786
|
i0.ɵɵelementEnd();
|
|
783
|
-
i0.ɵɵelementStart(23, "div",
|
|
784
|
-
i0.ɵɵconditionalCreate(24, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_24_Template, 3, 0, "button",
|
|
787
|
+
i0.ɵɵelementStart(23, "div", 145);
|
|
788
|
+
i0.ɵɵconditionalCreate(24, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_24_Template, 3, 0, "button", 146)(25, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_25_Template, 4, 10);
|
|
785
789
|
i0.ɵɵelementEnd()();
|
|
786
790
|
} if (rf & 2) {
|
|
787
791
|
const match_r30 = ctx.$implicit;
|
|
788
|
-
const ɵ$
|
|
792
|
+
const ɵ$index_564_r23 = ctx.$index;
|
|
789
793
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
790
794
|
i0.ɵɵclassProp("match-approved", match_r30.Match.ApprovalStatus === "Approved")("match-rejected", match_r30.Match.ApprovalStatus === "Rejected");
|
|
791
795
|
i0.ɵɵadvance(3);
|
|
@@ -797,25 +801,25 @@ function DuplicateDetectionResourceComponent_Conditional_64_For_47_Template(rf,
|
|
|
797
801
|
i0.ɵɵadvance(2);
|
|
798
802
|
i0.ɵɵtextInterpolate2("", match_r30.DiffCount, " difference", match_r30.DiffCount !== 1 ? "s" : "");
|
|
799
803
|
i0.ɵɵadvance(2);
|
|
800
|
-
i0.ɵɵproperty("checked", ctx_r1.SurvivorColumnIndex === ɵ$
|
|
804
|
+
i0.ɵɵproperty("checked", ctx_r1.SurvivorColumnIndex === ɵ$index_564_r23 + 1);
|
|
801
805
|
i0.ɵɵadvance();
|
|
802
|
-
i0.ɵɵclassProp("is-survivor", ctx_r1.SurvivorColumnIndex === ɵ$
|
|
806
|
+
i0.ɵɵclassProp("is-survivor", ctx_r1.SurvivorColumnIndex === ɵ$index_564_r23 + 1);
|
|
803
807
|
i0.ɵɵadvance();
|
|
804
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.SurvivorColumnIndex === ɵ$
|
|
808
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.SurvivorColumnIndex === ɵ$index_564_r23 + 1 ? "Surviving Record" : "Set as survivor", " ");
|
|
805
809
|
i0.ɵɵadvance();
|
|
806
|
-
i0.ɵɵclassProp("all-selected", ctx_r1.AllFieldsSelectedFrom(ɵ$
|
|
810
|
+
i0.ɵɵclassProp("all-selected", ctx_r1.AllFieldsSelectedFrom(ɵ$index_564_r23 + 1));
|
|
807
811
|
i0.ɵɵadvance();
|
|
808
|
-
i0.ɵɵclassProp("fa-check-double", ctx_r1.AllFieldsSelectedFrom(ɵ$
|
|
812
|
+
i0.ɵɵclassProp("fa-check-double", ctx_r1.AllFieldsSelectedFrom(ɵ$index_564_r23 + 1))("fa-clone", !ctx_r1.AllFieldsSelectedFrom(ɵ$index_564_r23 + 1));
|
|
809
813
|
i0.ɵɵadvance();
|
|
810
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.AllFieldsSelectedFrom(ɵ$
|
|
814
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.AllFieldsSelectedFrom(ɵ$index_564_r23 + 1) ? "Using all fields" : "Use all fields", " ");
|
|
811
815
|
i0.ɵɵadvance(5);
|
|
812
|
-
i0.ɵɵtextInterpolate(ctx_r1.GetTotalDeps(ɵ$
|
|
816
|
+
i0.ɵɵtextInterpolate(ctx_r1.GetTotalDeps(ɵ$index_564_r23 + 1));
|
|
813
817
|
i0.ɵɵadvance();
|
|
814
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.GetTotalDeps(ɵ$
|
|
818
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.GetTotalDeps(ɵ$index_564_r23 + 1) === 1 ? "dependency" : "dependencies", " ");
|
|
815
819
|
i0.ɵɵadvance();
|
|
816
|
-
i0.ɵɵconditional(ctx_r1.GetMaxDepsColumnIndex() === ɵ$
|
|
820
|
+
i0.ɵɵconditional(ctx_r1.GetMaxDepsColumnIndex() === ɵ$index_564_r23 + 1 && ctx_r1.GetTotalDeps(ɵ$index_564_r23 + 1) > 0 ? 21 : -1);
|
|
817
821
|
i0.ɵɵadvance();
|
|
818
|
-
i0.ɵɵconditional(ctx_r1.GetGroupedDeps(ɵ$
|
|
822
|
+
i0.ɵɵconditional(ctx_r1.GetGroupedDeps(ɵ$index_564_r23 + 1).length > 0 ? 22 : -1);
|
|
819
823
|
i0.ɵɵadvance(2);
|
|
820
824
|
i0.ɵɵconditional(match_r30.Match.ApprovalStatus === "Pending" ? 24 : 25);
|
|
821
825
|
} }
|
|
@@ -826,13 +830,13 @@ function DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_3
|
|
|
826
830
|
i0.ɵɵtextInterpolate1(" ", field_r33.SourceValue, " ");
|
|
827
831
|
} }
|
|
828
832
|
function DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
829
|
-
i0.ɵɵelementStart(0, "span",
|
|
833
|
+
i0.ɵɵelementStart(0, "span", 154);
|
|
830
834
|
i0.ɵɵtext(1, "(not available)");
|
|
831
835
|
i0.ɵɵelementEnd();
|
|
832
836
|
} }
|
|
833
837
|
function DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
834
838
|
const _r34 = i0.ɵɵgetCurrentView();
|
|
835
|
-
i0.ɵɵelementStart(0, "input",
|
|
839
|
+
i0.ɵɵelementStart(0, "input", 157);
|
|
836
840
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_5_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r34); return i0.ɵɵresetView($event.stopPropagation()); })("change", function DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_5_Template_input_change_0_listener() { i0.ɵɵrestoreView(_r34); const field_r33 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SelectFieldValue(field_r33, 0)); });
|
|
837
841
|
i0.ɵɵelementEnd();
|
|
838
842
|
} if (rf & 2) {
|
|
@@ -841,67 +845,67 @@ function DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_5
|
|
|
841
845
|
} }
|
|
842
846
|
function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
843
847
|
const _r39 = i0.ɵɵgetCurrentView();
|
|
844
|
-
i0.ɵɵelementStart(0, "input",
|
|
845
|
-
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Conditional_1_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r39); return i0.ɵɵresetView($event.stopPropagation()); })("change", function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Conditional_1_Template_input_change_0_listener() { i0.ɵɵrestoreView(_r39); const ɵ$
|
|
848
|
+
i0.ɵɵelementStart(0, "input", 157);
|
|
849
|
+
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Conditional_1_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r39); return i0.ɵɵresetView($event.stopPropagation()); })("change", function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Conditional_1_Template_input_change_0_listener() { i0.ɵɵrestoreView(_r39); const ɵ$index_682_r38 = i0.ɵɵnextContext(2).$index; const field_r33 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SelectFieldValue(field_r33, ɵ$index_682_r38 + 1)); });
|
|
846
850
|
i0.ɵɵelementEnd();
|
|
847
851
|
} if (rf & 2) {
|
|
848
|
-
const ɵ$
|
|
852
|
+
const ɵ$index_682_r38 = i0.ɵɵnextContext(2).$index;
|
|
849
853
|
const field_r33 = i0.ɵɵnextContext().$implicit;
|
|
850
|
-
i0.ɵɵproperty("name", "field-" + field_r33.FieldName)("checked", field_r33.SelectedColumnIndex === ɵ$
|
|
854
|
+
i0.ɵɵproperty("name", "field-" + field_r33.FieldName)("checked", field_r33.SelectedColumnIndex === ɵ$index_682_r38 + 1);
|
|
851
855
|
} }
|
|
852
856
|
function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
853
857
|
i0.ɵɵtext(0);
|
|
854
|
-
i0.ɵɵconditionalCreate(1, DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Conditional_1_Template, 1, 2, "input",
|
|
858
|
+
i0.ɵɵconditionalCreate(1, DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Conditional_1_Template, 1, 2, "input", 155);
|
|
855
859
|
} if (rf & 2) {
|
|
856
860
|
const ctx_r39 = i0.ɵɵnextContext();
|
|
857
861
|
const matchVal_r37 = ctx_r39.$implicit;
|
|
858
|
-
const ɵ$
|
|
862
|
+
const ɵ$index_682_r38 = ctx_r39.$index;
|
|
859
863
|
const field_r33 = i0.ɵɵnextContext().$implicit;
|
|
860
864
|
i0.ɵɵtextInterpolate1(" ", matchVal_r37, " ");
|
|
861
865
|
i0.ɵɵadvance();
|
|
862
|
-
i0.ɵɵconditional(field_r33.HasDifference || field_r33.SelectedColumnIndex === ɵ$
|
|
866
|
+
i0.ɵɵconditional(field_r33.HasDifference || field_r33.SelectedColumnIndex === ɵ$index_682_r38 + 1 ? 1 : -1);
|
|
863
867
|
} }
|
|
864
868
|
function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
865
|
-
i0.ɵɵelementStart(0, "span",
|
|
869
|
+
i0.ɵɵelementStart(0, "span", 154);
|
|
866
870
|
i0.ɵɵtext(1, "(not available)");
|
|
867
871
|
i0.ɵɵelementEnd();
|
|
868
872
|
} }
|
|
869
873
|
function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
870
874
|
const _r35 = i0.ɵɵgetCurrentView();
|
|
871
|
-
i0.ɵɵelementStart(0, "div",
|
|
872
|
-
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Template_div_click_0_listener() { const ctx_r35 = i0.ɵɵrestoreView(_r35); const matchVal_r37 = ctx_r35.$implicit; const ɵ$
|
|
873
|
-
i0.ɵɵconditionalCreate(1, DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Template, 2, 2)(2, DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_2_Template, 2, 0, "span",
|
|
875
|
+
i0.ɵɵelementStart(0, "div", 158);
|
|
876
|
+
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Template_div_click_0_listener() { const ctx_r35 = i0.ɵɵrestoreView(_r35); const matchVal_r37 = ctx_r35.$implicit; const ɵ$index_682_r38 = ctx_r35.$index; const field_r33 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(matchVal_r37 != null ? ctx_r1.SelectFieldValue(field_r33, ɵ$index_682_r38 + 1) : null); });
|
|
877
|
+
i0.ɵɵconditionalCreate(1, DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Template, 2, 2)(2, DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_2_Template, 2, 0, "span", 154);
|
|
874
878
|
i0.ɵɵelementEnd();
|
|
875
879
|
} if (rf & 2) {
|
|
876
880
|
const matchVal_r37 = ctx.$implicit;
|
|
877
|
-
const ɵ$
|
|
881
|
+
const ɵ$index_682_r38 = ctx.$index;
|
|
878
882
|
const ctx_r40 = i0.ɵɵnextContext();
|
|
879
883
|
const field_r33 = ctx_r40.$implicit;
|
|
880
|
-
const ɵ$
|
|
884
|
+
const ɵ$index_667_r42 = ctx_r40.$index;
|
|
881
885
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
882
|
-
i0.ɵɵclassProp("grid-row-odd", ɵ$
|
|
886
|
+
i0.ɵɵclassProp("grid-row-odd", ɵ$index_667_r42 % 2 !== 0)("value-same", ctx_r1.AreValuesEqual(field_r33.SourceValue, matchVal_r37))("value-different", matchVal_r37 != null && field_r33.SourceValue != null && !ctx_r1.AreValuesEqual(field_r33.SourceValue, matchVal_r37))("field-selected", field_r33.SelectedColumnIndex === ɵ$index_682_r38 + 1);
|
|
883
887
|
i0.ɵɵadvance();
|
|
884
888
|
i0.ɵɵconditional(matchVal_r37 != null ? 1 : 2);
|
|
885
889
|
} }
|
|
886
890
|
function DuplicateDetectionResourceComponent_Conditional_64_For_49_Template(rf, ctx) { if (rf & 1) {
|
|
887
891
|
const _r32 = i0.ɵɵgetCurrentView();
|
|
888
|
-
i0.ɵɵelementStart(0, "div",
|
|
892
|
+
i0.ɵɵelementStart(0, "div", 152);
|
|
889
893
|
i0.ɵɵtext(1);
|
|
890
894
|
i0.ɵɵelementEnd();
|
|
891
|
-
i0.ɵɵelementStart(2, "div",
|
|
895
|
+
i0.ɵɵelementStart(2, "div", 153);
|
|
892
896
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_49_Template_div_click_2_listener() { const field_r33 = i0.ɵɵrestoreView(_r32).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SelectFieldValue(field_r33, 0)); });
|
|
893
|
-
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_3_Template, 1, 1)(4, DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_4_Template, 2, 0, "span",
|
|
894
|
-
i0.ɵɵconditionalCreate(5, DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_5_Template, 1, 2, "input",
|
|
897
|
+
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_3_Template, 1, 1)(4, DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_4_Template, 2, 0, "span", 154);
|
|
898
|
+
i0.ɵɵconditionalCreate(5, DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_5_Template, 1, 2, "input", 155);
|
|
895
899
|
i0.ɵɵelementEnd();
|
|
896
|
-
i0.ɵɵrepeaterCreate(6, DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Template, 3, 9, "div",
|
|
900
|
+
i0.ɵɵrepeaterCreate(6, DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Template, 3, 9, "div", 156, i0.ɵɵrepeaterTrackByIndex);
|
|
897
901
|
} if (rf & 2) {
|
|
898
902
|
const field_r33 = ctx.$implicit;
|
|
899
|
-
const ɵ$
|
|
900
|
-
i0.ɵɵclassProp("grid-row-odd", ɵ$
|
|
903
|
+
const ɵ$index_667_r42 = ctx.$index;
|
|
904
|
+
i0.ɵɵclassProp("grid-row-odd", ɵ$index_667_r42 % 2 !== 0);
|
|
901
905
|
i0.ɵɵadvance();
|
|
902
906
|
i0.ɵɵtextInterpolate1(" ", field_r33.DisplayName, " ");
|
|
903
907
|
i0.ɵɵadvance();
|
|
904
|
-
i0.ɵɵclassProp("grid-row-odd", ɵ$
|
|
908
|
+
i0.ɵɵclassProp("grid-row-odd", ɵ$index_667_r42 % 2 !== 0)("has-diff-in-row", field_r33.HasDifference)("field-selected", field_r33.SelectedColumnIndex === 0);
|
|
905
909
|
i0.ɵɵadvance();
|
|
906
910
|
i0.ɵɵconditional(field_r33.SourceValue != null ? 3 : 4);
|
|
907
911
|
i0.ɵɵadvance(2);
|
|
@@ -916,98 +920,98 @@ function DuplicateDetectionResourceComponent_Conditional_64_Conditional_59_Templ
|
|
|
916
920
|
i0.ɵɵtextInterpolate2(" \u00B7 ", ctx_r1.CherryPickedCount(), " field", ctx_r1.CherryPickedCount() !== 1 ? "s" : "", " cherry-picked ");
|
|
917
921
|
} }
|
|
918
922
|
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_67_Template(rf, ctx) { if (rf & 1) {
|
|
919
|
-
i0.ɵɵelementStart(0, "span",
|
|
920
|
-
i0.ɵɵelement(1, "i",
|
|
923
|
+
i0.ɵɵelementStart(0, "span", 126);
|
|
924
|
+
i0.ɵɵelement(1, "i", 159);
|
|
921
925
|
i0.ɵɵtext(2, " Merging disabled for this entity");
|
|
922
926
|
i0.ɵɵelementEnd();
|
|
923
927
|
} }
|
|
924
928
|
function DuplicateDetectionResourceComponent_Conditional_64_Template(rf, ctx) { if (rf & 1) {
|
|
925
929
|
const _r16 = i0.ɵɵgetCurrentView();
|
|
926
|
-
i0.ɵɵelementStart(0, "div",
|
|
930
|
+
i0.ɵɵelementStart(0, "div", 89);
|
|
927
931
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseComparison()); });
|
|
928
932
|
i0.ɵɵelementEnd();
|
|
929
|
-
i0.ɵɵelementStart(1, "div",
|
|
933
|
+
i0.ɵɵelementStart(1, "div", 90);
|
|
930
934
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r16); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
931
|
-
i0.ɵɵelementStart(2, "div",
|
|
935
|
+
i0.ɵɵelementStart(2, "div", 91)(3, "div", 92)(4, "div", 93);
|
|
932
936
|
i0.ɵɵelement(5, "i");
|
|
933
937
|
i0.ɵɵelementEnd();
|
|
934
|
-
i0.ɵɵelementStart(6, "div")(7, "div",
|
|
938
|
+
i0.ɵɵelementStart(6, "div")(7, "div", 94);
|
|
935
939
|
i0.ɵɵtext(8);
|
|
936
940
|
i0.ɵɵelementEnd();
|
|
937
|
-
i0.ɵɵelementStart(9, "span",
|
|
941
|
+
i0.ɵɵelementStart(9, "span", 95);
|
|
938
942
|
i0.ɵɵtext(10);
|
|
939
943
|
i0.ɵɵelementEnd();
|
|
940
|
-
i0.ɵɵelementStart(11, "span",
|
|
944
|
+
i0.ɵɵelementStart(11, "span", 96);
|
|
941
945
|
i0.ɵɵtext(12);
|
|
942
946
|
i0.ɵɵelementEnd()()();
|
|
943
|
-
i0.ɵɵelementStart(13, "div",
|
|
947
|
+
i0.ɵɵelementStart(13, "div", 97)(14, "div", 98)(15, "button", 99);
|
|
944
948
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ComparisonShowAllFields = true); });
|
|
945
949
|
i0.ɵɵtext(16, "All Fields");
|
|
946
950
|
i0.ɵɵelementEnd();
|
|
947
|
-
i0.ɵɵelementStart(17, "button",
|
|
951
|
+
i0.ɵɵelementStart(17, "button", 99);
|
|
948
952
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ComparisonShowAllFields = false); });
|
|
949
953
|
i0.ɵɵtext(18, "Differences Only");
|
|
950
954
|
i0.ɵɵelementEnd()();
|
|
951
|
-
i0.ɵɵelementStart(19, "button",
|
|
955
|
+
i0.ɵɵelementStart(19, "button", 100);
|
|
952
956
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseComparison()); });
|
|
953
|
-
i0.ɵɵelement(20, "i",
|
|
957
|
+
i0.ɵɵelement(20, "i", 47);
|
|
954
958
|
i0.ɵɵelementEnd()()();
|
|
955
|
-
i0.ɵɵconditionalCreate(21, DuplicateDetectionResourceComponent_Conditional_64_Conditional_21_Template, 2, 0, "div",
|
|
956
|
-
i0.ɵɵelementStart(22, "div",
|
|
959
|
+
i0.ɵɵconditionalCreate(21, DuplicateDetectionResourceComponent_Conditional_64_Conditional_21_Template, 2, 0, "div", 101);
|
|
960
|
+
i0.ɵɵelementStart(22, "div", 102)(23, "div", 103)(24, "div", 104);
|
|
957
961
|
i0.ɵɵtext(25, "Field");
|
|
958
962
|
i0.ɵɵelementEnd();
|
|
959
|
-
i0.ɵɵelementStart(26, "div",
|
|
963
|
+
i0.ɵɵelementStart(26, "div", 105)(27, "span", 106);
|
|
960
964
|
i0.ɵɵtext(28, "Source");
|
|
961
965
|
i0.ɵɵelementEnd();
|
|
962
|
-
i0.ɵɵelementStart(29, "span",
|
|
966
|
+
i0.ɵɵelementStart(29, "span", 107);
|
|
963
967
|
i0.ɵɵtext(30);
|
|
964
968
|
i0.ɵɵelementEnd();
|
|
965
|
-
i0.ɵɵelementStart(31, "div",
|
|
969
|
+
i0.ɵɵelementStart(31, "div", 108)(32, "input", 109);
|
|
966
970
|
i0.ɵɵlistener("change", function DuplicateDetectionResourceComponent_Conditional_64_Template_input_change_32_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SetSurvivor(0)); });
|
|
967
971
|
i0.ɵɵelementEnd();
|
|
968
|
-
i0.ɵɵelementStart(33, "span",
|
|
972
|
+
i0.ɵɵelementStart(33, "span", 110);
|
|
969
973
|
i0.ɵɵtext(34);
|
|
970
974
|
i0.ɵɵelementEnd()();
|
|
971
|
-
i0.ɵɵelementStart(35, "button",
|
|
975
|
+
i0.ɵɵelementStart(35, "button", 111);
|
|
972
976
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.UseAllFieldsFrom(0)); });
|
|
973
|
-
i0.ɵɵelement(36, "i",
|
|
977
|
+
i0.ɵɵelement(36, "i", 112);
|
|
974
978
|
i0.ɵɵtext(37);
|
|
975
979
|
i0.ɵɵelementEnd();
|
|
976
|
-
i0.ɵɵelementStart(38, "div",
|
|
977
|
-
i0.ɵɵelement(40, "i",
|
|
978
|
-
i0.ɵɵelementStart(41, "span",
|
|
980
|
+
i0.ɵɵelementStart(38, "div", 113)(39, "div", 114);
|
|
981
|
+
i0.ɵɵelement(40, "i", 115);
|
|
982
|
+
i0.ɵɵelementStart(41, "span", 116);
|
|
979
983
|
i0.ɵɵtext(42);
|
|
980
984
|
i0.ɵɵelementEnd();
|
|
981
985
|
i0.ɵɵtext(43);
|
|
982
|
-
i0.ɵɵconditionalCreate(44, DuplicateDetectionResourceComponent_Conditional_64_Conditional_44_Template, 3, 0, "span",
|
|
986
|
+
i0.ɵɵconditionalCreate(44, DuplicateDetectionResourceComponent_Conditional_64_Conditional_44_Template, 3, 0, "span", 117);
|
|
983
987
|
i0.ɵɵelementEnd();
|
|
984
988
|
i0.ɵɵconditionalCreate(45, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Template, 5, 6);
|
|
985
989
|
i0.ɵɵelementEnd()();
|
|
986
|
-
i0.ɵɵrepeaterCreate(46, DuplicateDetectionResourceComponent_Conditional_64_For_47_Template, 26, 26, "div",
|
|
990
|
+
i0.ɵɵrepeaterCreate(46, DuplicateDetectionResourceComponent_Conditional_64_For_47_Template, 26, 26, "div", 118, _forTrack3);
|
|
987
991
|
i0.ɵɵrepeaterCreate(48, DuplicateDetectionResourceComponent_Conditional_64_For_49_Template, 8, 11, null, null, _forTrack4);
|
|
988
992
|
i0.ɵɵelementEnd()();
|
|
989
|
-
i0.ɵɵelementStart(50, "div",
|
|
993
|
+
i0.ɵɵelementStart(50, "div", 119)(51, "div", 120)(52, "span", 121);
|
|
990
994
|
i0.ɵɵtext(53);
|
|
991
995
|
i0.ɵɵelementEnd();
|
|
992
|
-
i0.ɵɵelementStart(54, "span",
|
|
993
|
-
i0.ɵɵelement(55, "i",
|
|
996
|
+
i0.ɵɵelementStart(54, "span", 122);
|
|
997
|
+
i0.ɵɵelement(55, "i", 123);
|
|
994
998
|
i0.ɵɵtext(56, " Surviving: ");
|
|
995
999
|
i0.ɵɵelementStart(57, "strong");
|
|
996
1000
|
i0.ɵɵtext(58);
|
|
997
1001
|
i0.ɵɵelementEnd();
|
|
998
1002
|
i0.ɵɵconditionalCreate(59, DuplicateDetectionResourceComponent_Conditional_64_Conditional_59_Template, 1, 2);
|
|
999
1003
|
i0.ɵɵelementEnd()();
|
|
1000
|
-
i0.ɵɵelementStart(60, "div",
|
|
1004
|
+
i0.ɵɵelementStart(60, "div", 124)(61, "button", 82);
|
|
1001
1005
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_Template_button_click_61_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); ctx_r1.RejectMatch(ctx_r1.ComparisonGroup); return i0.ɵɵresetView(ctx_r1.CloseComparison()); });
|
|
1002
|
-
i0.ɵɵelement(62, "i",
|
|
1006
|
+
i0.ɵɵelement(62, "i", 47);
|
|
1003
1007
|
i0.ɵɵtext(63, " Reject All ");
|
|
1004
1008
|
i0.ɵɵelementEnd();
|
|
1005
|
-
i0.ɵɵelementStart(64, "button",
|
|
1009
|
+
i0.ɵɵelementStart(64, "button", 125);
|
|
1006
1010
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_Template_button_click_64_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenMergeConfirm()); });
|
|
1007
|
-
i0.ɵɵelement(65, "i",
|
|
1011
|
+
i0.ɵɵelement(65, "i", 123);
|
|
1008
1012
|
i0.ɵɵtext(66, " Merge Records ");
|
|
1009
1013
|
i0.ɵɵelementEnd();
|
|
1010
|
-
i0.ɵɵconditionalCreate(67, DuplicateDetectionResourceComponent_Conditional_64_Conditional_67_Template, 3, 0, "span",
|
|
1014
|
+
i0.ɵɵconditionalCreate(67, DuplicateDetectionResourceComponent_Conditional_64_Conditional_67_Template, 3, 0, "span", 126);
|
|
1011
1015
|
i0.ɵɵelementEnd()()();
|
|
1012
1016
|
} if (rf & 2) {
|
|
1013
1017
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -1072,13 +1076,13 @@ function DuplicateDetectionResourceComponent_Conditional_64_Template(rf, ctx) {
|
|
|
1072
1076
|
i0.ɵɵconditional(!ctx_r1.MergeEnabled ? 67 : -1);
|
|
1073
1077
|
} }
|
|
1074
1078
|
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_22_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
1075
|
-
i0.ɵɵelementStart(0, "div",
|
|
1079
|
+
i0.ɵɵelementStart(0, "div", 184)(1, "span", 185);
|
|
1076
1080
|
i0.ɵɵtext(2);
|
|
1077
1081
|
i0.ɵɵelementEnd();
|
|
1078
|
-
i0.ɵɵelementStart(3, "span",
|
|
1082
|
+
i0.ɵɵelementStart(3, "span", 186);
|
|
1079
1083
|
i0.ɵɵtext(4);
|
|
1080
1084
|
i0.ɵɵelementEnd();
|
|
1081
|
-
i0.ɵɵelementStart(5, "span",
|
|
1085
|
+
i0.ɵɵelementStart(5, "span", 187);
|
|
1082
1086
|
i0.ɵɵtext(6);
|
|
1083
1087
|
i0.ɵɵelementEnd()();
|
|
1084
1088
|
} if (rf & 2) {
|
|
@@ -1091,10 +1095,10 @@ function DuplicateDetectionResourceComponent_Conditional_65_Conditional_22_For_4
|
|
|
1091
1095
|
i0.ɵɵtextInterpolate1("from ", field_r44.SourceName);
|
|
1092
1096
|
} }
|
|
1093
1097
|
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
1094
|
-
i0.ɵɵelementStart(0, "div")(1, "div",
|
|
1098
|
+
i0.ɵɵelementStart(0, "div")(1, "div", 183);
|
|
1095
1099
|
i0.ɵɵtext(2);
|
|
1096
1100
|
i0.ɵɵelementEnd();
|
|
1097
|
-
i0.ɵɵrepeaterCreate(3, DuplicateDetectionResourceComponent_Conditional_65_Conditional_22_For_4_Template, 7, 3, "div",
|
|
1101
|
+
i0.ɵɵrepeaterCreate(3, DuplicateDetectionResourceComponent_Conditional_65_Conditional_22_For_4_Template, 7, 3, "div", 184, _forTrack4);
|
|
1098
1102
|
i0.ɵɵelementEnd();
|
|
1099
1103
|
} if (rf & 2) {
|
|
1100
1104
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1138,8 +1142,8 @@ function DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_For_5
|
|
|
1138
1142
|
i0.ɵɵtextInterpolate(col_r45.Name);
|
|
1139
1143
|
} }
|
|
1140
1144
|
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
1141
|
-
i0.ɵɵelementStart(0, "div",
|
|
1142
|
-
i0.ɵɵelement(1, "i",
|
|
1145
|
+
i0.ɵɵelementStart(0, "div", 190);
|
|
1146
|
+
i0.ɵɵelement(1, "i", 191);
|
|
1143
1147
|
i0.ɵɵelementStart(2, "span");
|
|
1144
1148
|
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_For_5_Conditional_3_Template, 6, 4)(4, DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_For_5_Conditional_4_Template, 5, 1);
|
|
1145
1149
|
i0.ɵɵelementEnd()();
|
|
@@ -1149,11 +1153,11 @@ function DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_For_5
|
|
|
1149
1153
|
i0.ɵɵconditional(col_r45.DepCount > 0 ? 3 : 4);
|
|
1150
1154
|
} }
|
|
1151
1155
|
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
1152
|
-
i0.ɵɵelementStart(0, "div",
|
|
1153
|
-
i0.ɵɵelement(2, "i",
|
|
1156
|
+
i0.ɵɵelementStart(0, "div", 174)(1, "div", 188);
|
|
1157
|
+
i0.ɵɵelement(2, "i", 189);
|
|
1154
1158
|
i0.ɵɵtext(3, " Dependencies to Transfer");
|
|
1155
1159
|
i0.ɵɵelementEnd();
|
|
1156
|
-
i0.ɵɵrepeaterCreate(4, DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_For_5_Template, 5, 1, "div",
|
|
1160
|
+
i0.ɵɵrepeaterCreate(4, DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_For_5_Template, 5, 1, "div", 190, _forTrack6);
|
|
1157
1161
|
i0.ɵɵelementEnd();
|
|
1158
1162
|
} if (rf & 2) {
|
|
1159
1163
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1170,10 +1174,10 @@ function DuplicateDetectionResourceComponent_Conditional_65_For_29_Conditional_5
|
|
|
1170
1174
|
i0.ɵɵtext(0, " no deps ");
|
|
1171
1175
|
} }
|
|
1172
1176
|
function DuplicateDetectionResourceComponent_Conditional_65_For_29_Template(rf, ctx) { if (rf & 1) {
|
|
1173
|
-
i0.ɵɵelementStart(0, "div",
|
|
1177
|
+
i0.ɵɵelementStart(0, "div", 178)(1, "span", 192);
|
|
1174
1178
|
i0.ɵɵtext(2);
|
|
1175
1179
|
i0.ɵɵelementEnd();
|
|
1176
|
-
i0.ɵɵelementStart(3, "span",
|
|
1180
|
+
i0.ɵɵelementStart(3, "span", 193);
|
|
1177
1181
|
i0.ɵɵconditionalCreate(4, DuplicateDetectionResourceComponent_Conditional_65_For_29_Conditional_4_Template, 1, 2)(5, DuplicateDetectionResourceComponent_Conditional_65_For_29_Conditional_5_Template, 1, 0);
|
|
1178
1182
|
i0.ɵɵelementEnd()();
|
|
1179
1183
|
} if (rf & 2) {
|
|
@@ -1188,7 +1192,7 @@ function DuplicateDetectionResourceComponent_Conditional_65_Conditional_35_Templ
|
|
|
1188
1192
|
i0.ɵɵtext(1, " Merging... ");
|
|
1189
1193
|
} }
|
|
1190
1194
|
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_36_Template(rf, ctx) { if (rf & 1) {
|
|
1191
|
-
i0.ɵɵelement(0, "i",
|
|
1195
|
+
i0.ɵɵelement(0, "i", 123);
|
|
1192
1196
|
i0.ɵɵtext(1);
|
|
1193
1197
|
} if (rf & 2) {
|
|
1194
1198
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1197,47 +1201,47 @@ function DuplicateDetectionResourceComponent_Conditional_65_Conditional_36_Templ
|
|
|
1197
1201
|
} }
|
|
1198
1202
|
function DuplicateDetectionResourceComponent_Conditional_65_Template(rf, ctx) { if (rf & 1) {
|
|
1199
1203
|
const _r43 = i0.ɵɵgetCurrentView();
|
|
1200
|
-
i0.ɵɵelementStart(0, "div",
|
|
1204
|
+
i0.ɵɵelementStart(0, "div", 160);
|
|
1201
1205
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_65_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r43); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseMergeConfirm()); });
|
|
1202
|
-
i0.ɵɵelementStart(1, "div",
|
|
1206
|
+
i0.ɵɵelementStart(1, "div", 161);
|
|
1203
1207
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_65_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r43); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
1204
|
-
i0.ɵɵelementStart(2, "div",
|
|
1205
|
-
i0.ɵɵelement(4, "i",
|
|
1208
|
+
i0.ɵɵelementStart(2, "div", 162)(3, "div", 163);
|
|
1209
|
+
i0.ɵɵelement(4, "i", 123);
|
|
1206
1210
|
i0.ɵɵelementEnd();
|
|
1207
|
-
i0.ɵɵelementStart(5, "div")(6, "div",
|
|
1211
|
+
i0.ɵɵelementStart(5, "div")(6, "div", 164);
|
|
1208
1212
|
i0.ɵɵtext(7, "Confirm Record Merge");
|
|
1209
1213
|
i0.ɵɵelementEnd();
|
|
1210
|
-
i0.ɵɵelementStart(8, "div",
|
|
1214
|
+
i0.ɵɵelementStart(8, "div", 165);
|
|
1211
1215
|
i0.ɵɵtext(9, "This action cannot be undone. Please review carefully.");
|
|
1212
1216
|
i0.ɵɵelementEnd()()();
|
|
1213
|
-
i0.ɵɵelementStart(10, "div",
|
|
1214
|
-
i0.ɵɵelement(13, "i",
|
|
1217
|
+
i0.ɵɵelementStart(10, "div", 166)(11, "div", 167)(12, "div", 168);
|
|
1218
|
+
i0.ɵɵelement(13, "i", 169);
|
|
1215
1219
|
i0.ɵɵtext(14, " Surviving Record");
|
|
1216
1220
|
i0.ɵɵelementEnd();
|
|
1217
|
-
i0.ɵɵelementStart(15, "div",
|
|
1221
|
+
i0.ɵɵelementStart(15, "div", 170);
|
|
1218
1222
|
i0.ɵɵtext(16);
|
|
1219
1223
|
i0.ɵɵelementEnd();
|
|
1220
|
-
i0.ɵɵelementStart(17, "div",
|
|
1221
|
-
i0.ɵɵelement(18, "i",
|
|
1224
|
+
i0.ɵɵelementStart(17, "div", 171);
|
|
1225
|
+
i0.ɵɵelement(18, "i", 172);
|
|
1222
1226
|
i0.ɵɵtext(19);
|
|
1223
1227
|
i0.ɵɵelementEnd();
|
|
1224
|
-
i0.ɵɵelementStart(20, "div",
|
|
1228
|
+
i0.ɵɵelementStart(20, "div", 173);
|
|
1225
1229
|
i0.ɵɵtext(21, "This record's ID will be retained. All dependencies from merged records will be transferred here.");
|
|
1226
1230
|
i0.ɵɵelementEnd()();
|
|
1227
1231
|
i0.ɵɵconditionalCreate(22, DuplicateDetectionResourceComponent_Conditional_65_Conditional_22_Template, 5, 2, "div");
|
|
1228
|
-
i0.ɵɵconditionalCreate(23, DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_Template, 6, 0, "div",
|
|
1229
|
-
i0.ɵɵelementStart(24, "div",
|
|
1230
|
-
i0.ɵɵelement(26, "i",
|
|
1232
|
+
i0.ɵɵconditionalCreate(23, DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_Template, 6, 0, "div", 174);
|
|
1233
|
+
i0.ɵɵelementStart(24, "div", 175)(25, "div", 176);
|
|
1234
|
+
i0.ɵɵelement(26, "i", 177);
|
|
1231
1235
|
i0.ɵɵtext(27, " Records to Delete After Merge");
|
|
1232
1236
|
i0.ɵɵelementEnd();
|
|
1233
|
-
i0.ɵɵrepeaterCreate(28, DuplicateDetectionResourceComponent_Conditional_65_For_29_Template, 6, 2, "div",
|
|
1237
|
+
i0.ɵɵrepeaterCreate(28, DuplicateDetectionResourceComponent_Conditional_65_For_29_Template, 6, 2, "div", 178, _forTrack6);
|
|
1234
1238
|
i0.ɵɵelementEnd()();
|
|
1235
|
-
i0.ɵɵelementStart(30, "div",
|
|
1239
|
+
i0.ɵɵelementStart(30, "div", 179)(31, "button", 180);
|
|
1236
1240
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_65_Template_button_click_31_listener() { i0.ɵɵrestoreView(_r43); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseMergeConfirm()); });
|
|
1237
|
-
i0.ɵɵelement(32, "i",
|
|
1241
|
+
i0.ɵɵelement(32, "i", 181);
|
|
1238
1242
|
i0.ɵɵtext(33, " Back ");
|
|
1239
1243
|
i0.ɵɵelementEnd();
|
|
1240
|
-
i0.ɵɵelementStart(34, "button",
|
|
1244
|
+
i0.ɵɵelementStart(34, "button", 182);
|
|
1241
1245
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_65_Template_button_click_34_listener() { i0.ɵɵrestoreView(_r43); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ExecuteMerge()); });
|
|
1242
1246
|
i0.ɵɵconditionalCreate(35, DuplicateDetectionResourceComponent_Conditional_65_Conditional_35_Template, 2, 0)(36, DuplicateDetectionResourceComponent_Conditional_65_Conditional_36_Template, 2, 1);
|
|
1243
1247
|
i0.ɵɵelementEnd()()()();
|
|
@@ -1268,6 +1272,9 @@ let DuplicateDetectionResourceComponent = class DuplicateDetectionResourceCompon
|
|
|
1268
1272
|
}
|
|
1269
1273
|
}
|
|
1270
1274
|
cdr = inject(ChangeDetectorRef);
|
|
1275
|
+
activityService = inject(ActivityService);
|
|
1276
|
+
/** Activity-tracker id for the currently running detection (P3). */
|
|
1277
|
+
detectionActivityID = null;
|
|
1271
1278
|
navigationService = inject(NavigationService);
|
|
1272
1279
|
destroy$ = new Subject();
|
|
1273
1280
|
filterSubject = new Subject();
|
|
@@ -1599,6 +1606,11 @@ let DuplicateDetectionResourceComponent = class DuplicateDetectionResourceCompon
|
|
|
1599
1606
|
this.cdr.detectChanges();
|
|
1600
1607
|
return;
|
|
1601
1608
|
}
|
|
1609
|
+
this.detectionActivityID = this.activityService.Start('Duplicate detection', {
|
|
1610
|
+
icon: 'fa-solid fa-clone',
|
|
1611
|
+
detail: selectedDoc.EntityName,
|
|
1612
|
+
progress: 0,
|
|
1613
|
+
});
|
|
1602
1614
|
// Subscribe to progress using the run ID as PipelineRunID
|
|
1603
1615
|
this.subscribeToPipelineProgress(dupeRun.ID);
|
|
1604
1616
|
}
|
|
@@ -1872,6 +1884,10 @@ let DuplicateDetectionResourceComponent = class DuplicateDetectionResourceCompon
|
|
|
1872
1884
|
this.IsDetecting = false;
|
|
1873
1885
|
this.DetectionStage = success ? 'Complete' : 'Error';
|
|
1874
1886
|
this.DetectionProgress = success ? 100 : 0;
|
|
1887
|
+
if (this.detectionActivityID) {
|
|
1888
|
+
this.activityService.Complete(this.detectionActivityID, success ? 'success' : 'error');
|
|
1889
|
+
this.detectionActivityID = null;
|
|
1890
|
+
}
|
|
1875
1891
|
if (success) {
|
|
1876
1892
|
await this.LoadData();
|
|
1877
1893
|
}
|
|
@@ -2804,7 +2820,7 @@ let DuplicateDetectionResourceComponent = class DuplicateDetectionResourceCompon
|
|
|
2804
2820
|
static ɵfac = /*@__PURE__*/ (() => { let ɵDuplicateDetectionResourceComponent_BaseFactory; return function DuplicateDetectionResourceComponent_Factory(__ngFactoryType__) { return (ɵDuplicateDetectionResourceComponent_BaseFactory || (ɵDuplicateDetectionResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(DuplicateDetectionResourceComponent)))(__ngFactoryType__ || DuplicateDetectionResourceComponent); }; })();
|
|
2805
2821
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DuplicateDetectionResourceComponent, selectors: [["app-duplicate-detection-resource"]], hostBindings: function DuplicateDetectionResourceComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
2806
2822
|
i0.ɵɵlistener("keydown.escape", function DuplicateDetectionResourceComponent_keydown_escape_HostBindingHandler() { return ctx.OnEscapeKey(); }, i0.ɵɵresolveDocument);
|
|
2807
|
-
} }, inputs: { HideToolbar: "HideToolbar" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 66, vars: 30, consts: [["Title", "
|
|
2823
|
+
} }, inputs: { HideToolbar: "HideToolbar" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 66, vars: 30, consts: [["Title", "Record Duplicates", "Icon", "fa-solid fa-clone", "Subtitle", "Find and merge near-duplicate entity records using semantic similarity"], ["actions", ""], [1, "mj-input", "kh-doc-select", 3, "ngModelChange", "ngModel", "disabled"], ["value", ""], [3, "value"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], [3, "Flex"], [1, "detection-progress-section"], [1, "threshold-controls"], [1, "kpi-strip"], [1, "kpi-card"], [1, "kpi-value"], [1, "kpi-label"], [1, "kpi-card", "kpi-pending"], [1, "kpi-card", "kpi-approved"], [1, "kpi-card", "kpi-rejected"], [1, "filter-bar"], [1, "filter-group"], [1, "filter-select", 3, "ngModelChange", "ngModel", "disabled"], [1, "filter-range"], [1, "filter-label"], ["type", "number", "min", "0", "max", "1", "step", "0.05", 1, "filter-input", "filter-input-score", 3, "ngModelChange", "placeholder", "ngModel"], ["type", "date", 1, "filter-input", "filter-input-date", 3, "ngModelChange", "min", "max", "ngModel"], [1, "clear-filters-btn"], [1, "merge-warning-banner"], [1, "loading-container"], [1, "empty-state"], [1, "kanban-board"], [1, "saving-overlay"], [1, "merge-confirm-backdrop"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "action-btn-label"], [1, "fa-solid", "fa-magnifying-glass"], [1, "progress-header"], [1, "progress-stage"], [1, "progress-percent"], [1, "progress-bar-track"], [1, "progress-bar-fill"], [1, "progress-current-item"], [1, "threshold-slider-group"], [1, "threshold-label"], [1, "fa-solid", "fa-adjust"], [1, "threshold-value"], ["type", "range", 1, "threshold-slider", 3, "input", "min", "max", "step", "value", "disabled"], [1, "threshold-hint"], [1, "fa-solid", "fa-bullseye"], [1, "clear-filters-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "fa-solid", "fa-triangle-exclamation"], ["text", "Loading duplicate detection results..."], [1, "fa-solid", "fa-clone", "empty-icon"], [1, "empty-text"], [1, "empty-subtext"], [1, "kanban-column"], [1, "column-header", "column-header-pending"], [1, "fa-solid", "fa-clock"], [1, "column-title"], [1, "column-count"], [1, "column-body", 3, "dragover", "dragleave", "drop"], ["draggable", "true", 1, "kanban-card"], [1, "column-empty"], [1, "column-header", "column-header-approved"], [1, "fa-solid", "fa-check-circle"], [1, "column-header", "column-header-rejected"], [1, "fa-solid", "fa-ban"], ["draggable", "true", 1, "kanban-card", 3, "dragstart", "dragend", "click"], [1, "card-header"], [1, "card-header-left"], [1, "card-icon"], [1, "card-title-block"], [1, "card-record-name", 3, "title"], [1, "entity-badge"], [1, "score-indicator"], [1, "card-body"], [1, "match-summaries"], [1, "card-meta-row"], [1, "card-meta-item"], [1, "fa-solid", "fa-layer-group"], [1, "fa-solid", "fa-calendar"], [1, "card-actions"], [1, "action-btn", "approve-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-check"], [1, "action-btn", "reject-btn", 3, "click", "disabled"], [1, "match-summary-row"], [1, "match-summary-more"], [1, "match-score"], [1, "match-name"], [1, "fa-solid", "fa-inbox"], ["text", "Saving...", "size", "small"], [1, "slide-backdrop", 3, "click"], [1, "comparison-panel", 3, "click"], [1, "comparison-header"], [1, "comparison-header-left"], [1, "comparison-entity-icon"], [1, "comparison-title"], [1, "comparison-entity-badge"], [1, "comparison-match-count"], [1, "comparison-header-right"], [1, "comparison-toggle"], [1, "toggle-btn", 3, "click"], ["title", "Close (Esc)", 1, "comparison-close-btn", 3, "click"], [1, "comparison-loading"], [1, "comparison-grid-wrapper", 3, "hidden"], [1, "comparison-grid"], [1, "grid-corner-cell"], [1, "grid-col-header", "grid-col-source"], [1, "col-header-label"], [1, "col-header-name"], [1, "surviving-selector"], ["type", "radio", "name", "survivor", 1, "surviving-radio", 3, "change", "checked"], [1, "surviving-label"], [1, "use-all-btn", 3, "click"], [1, "fa-solid"], [1, "deps-summary"], [1, "deps-total"], [1, "fa-solid", "fa-link"], [1, "deps-total-number"], [1, "deps-total-recommended"], [1, "grid-col-header", 3, "match-approved", "match-rejected"], [1, "comparison-footer"], [1, "comparison-footer-left"], [1, "comparison-summary"], [1, "merge-summary"], [1, "fa-solid", "fa-code-merge"], [1, "comparison-footer-right"], [1, "action-btn", "merge-btn", 3, "click", "disabled", "title"], [1, "merge-disabled-hint"], ["text", "Loading records for comparison...", "size", "medium"], [1, "fa-solid", "fa-star"], [1, "deps-header", 3, "click"], [1, "deps-detail-list"], [1, "deps-detail-group"], [1, "deps-detail-row", 3, "click"], [1, "deps-detail-entity"], [1, "fa-solid", "deps-expand-icon"], [1, "deps-detail-count"], [1, "deps-records-list"], [1, "deps-record-loading"], [1, "deps-record-row"], [1, "deps-record-row", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square", "deps-record-icon"], [1, "deps-record-name"], [1, "grid-col-header"], [1, "col-header-top"], [1, "col-header-diff-count"], [1, "match-approval-actions"], ["title", "Skip this match (exclude from merge)", 1, "match-action-btn", "match-skip-btn"], ["title", "Skip this match (exclude from merge)", 1, "match-action-btn", "match-skip-btn", 3, "click"], [1, "match-status-badge"], ["title", "Undo skip", 1, "match-action-btn", "match-undo-btn"], ["title", "Undo skip", 1, "match-action-btn", "match-undo-btn", 3, "click"], [1, "fa-solid", "fa-undo"], [1, "grid-label-cell"], [1, "grid-value-cell", "grid-source-cell", 3, "click"], [1, "field-not-available"], ["type", "radio", 1, "field-select-radio", 3, "name", "checked"], [1, "grid-value-cell", 3, "grid-row-odd", "value-same", "value-different", "field-selected"], ["type", "radio", 1, "field-select-radio", 3, "click", "change", "name", "checked"], [1, "grid-value-cell", 3, "click"], [1, "fa-solid", "fa-info-circle"], [1, "merge-confirm-backdrop", 3, "click"], [1, "merge-confirm-panel", 3, "click"], [1, "merge-confirm-header"], [1, "merge-confirm-icon"], [1, "merge-confirm-title"], [1, "merge-confirm-subtitle"], [1, "merge-confirm-body"], [1, "merge-survivor-card"], [1, "merge-survivor-label"], [1, "fa-solid", "fa-shield-halved"], [1, "merge-survivor-name"], [1, "merge-survivor-pk"], [1, "fa-solid", "fa-key"], [1, "merge-survivor-detail"], [1, "merge-deps-transfer"], [1, "merge-delete-card"], [1, "merge-delete-label"], [1, "fa-solid", "fa-trash"], [1, "merge-delete-item"], [1, "merge-confirm-footer"], [1, "action-btn", "cancel-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-arrow-left"], [1, "action-btn", "confirm-merge-btn", 3, "click", "disabled"], [1, "merge-section-label"], [1, "merge-field-override"], [1, "merge-field-name"], [1, "merge-field-value"], [1, "merge-field-source"], [1, "merge-deps-transfer-label"], [1, "fa-solid", "fa-arrow-right-arrow-left"], [1, "merge-deps-transfer-row"], [1, "fa-solid", "fa-arrow-right"], [1, "merge-delete-name"], [1, "merge-delete-deps"]], template: function DuplicateDetectionResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
2808
2824
|
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1)(3, "select", 2);
|
|
2809
2825
|
i0.ɵɵtwoWayListener("ngModelChange", function DuplicateDetectionResourceComponent_Template_select_ngModelChange_3_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.SelectedEntityDocumentID, $event) || (ctx.SelectedEntityDocumentID = $event); return $event; });
|
|
2810
2826
|
i0.ɵɵelementStart(4, "option", 3);
|
|
@@ -2814,7 +2830,7 @@ let DuplicateDetectionResourceComponent = class DuplicateDetectionResourceCompon
|
|
|
2814
2830
|
i0.ɵɵelementEnd();
|
|
2815
2831
|
i0.ɵɵelementStart(8, "button", 5);
|
|
2816
2832
|
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Template_button_click_8_listener() { return ctx.RunDetection(); });
|
|
2817
|
-
i0.ɵɵconditionalCreate(9, DuplicateDetectionResourceComponent_Conditional_9_Template,
|
|
2833
|
+
i0.ɵɵconditionalCreate(9, DuplicateDetectionResourceComponent_Conditional_9_Template, 3, 0)(10, DuplicateDetectionResourceComponent_Conditional_10_Template, 3, 0);
|
|
2818
2834
|
i0.ɵɵelementEnd()()();
|
|
2819
2835
|
i0.ɵɵelementStart(11, "mj-page-body", 6);
|
|
2820
2836
|
i0.ɵɵconditionalCreate(12, DuplicateDetectionResourceComponent_Conditional_12_Template, 10, 5, "div", 7);
|
|
@@ -2948,7 +2964,7 @@ DuplicateDetectionResourceComponent = __decorate([
|
|
|
2948
2964
|
export { DuplicateDetectionResourceComponent };
|
|
2949
2965
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DuplicateDetectionResourceComponent, [{
|
|
2950
2966
|
type: Component,
|
|
2951
|
-
args: [{ standalone: false, selector: 'app-duplicate-detection-resource', encapsulation: ViewEncapsulation.None, template: "<mj-page-layout>\n <mj-page-header\n Title=\"Duplicate Detection\"\n Icon=\"fa-solid fa-clone\"\n Subtitle=\"Find and merge near-duplicate records using semantic similarity\">\n <div actions>\n <select class=\"mj-input kh-doc-select\"\n [(ngModel)]=\"SelectedEntityDocumentID\"\n [disabled]=\"IsDetecting\">\n <option value=\"\">Select entity document\u2026</option>\n @for (doc of EntityDocuments; track doc.ID) {\n <option [value]=\"doc.ID\">{{ doc.Name }} ({{ doc.EntityName }})</option>\n }\n </select>\n <button mjButton variant=\"primary\" size=\"sm\"\n (click)=\"RunDetection()\"\n [disabled]=\"IsDetecting || !SelectedEntityDocumentID\">\n @if (IsDetecting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Detecting\u2026\n } @else {\n <i class=\"fa-solid fa-magnifying-glass\"></i> Run Detection\n }\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\">\n <!-- Detection Progress (visible during run) -->\n @if (IsDetecting) {\n <div class=\"detection-progress-section\">\n <div class=\"progress-header\">\n <span class=\"progress-stage\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ DetectionStage }}\n </span>\n <span class=\"progress-percent\">{{ DetectionProgress }}%</span>\n </div>\n <div class=\"progress-bar-track\">\n <div class=\"progress-bar-fill\" [style.width.%]=\"DetectionProgress\"></div>\n </div>\n @if (DetectionCurrentItem) {\n <span class=\"progress-current-item\">{{ DetectionCurrentItem }}</span>\n }\n </div>\n }\n\n <!-- Threshold Controls (when entity doc selected) -->\n @if (SelectedDocumentThresholds) {\n <div class=\"threshold-controls\">\n <div class=\"threshold-slider-group\">\n <label class=\"threshold-label\">\n <i class=\"fa-solid fa-adjust\"></i>\n Potential Match\n <span class=\"threshold-value\">{{ (RunPotentialThreshold * 100).toFixed(0) }}%</span>\n </label>\n <input type=\"range\" class=\"threshold-slider\"\n [min]=\"30\" [max]=\"99\" [step]=\"1\"\n [value]=\"RunPotentialThreshold * 100\"\n (input)=\"OnPotentialThresholdChanged($any($event.target).value / 100)\"\n [disabled]=\"IsDetecting\" />\n <span class=\"threshold-hint\">Score above which duplicates are flagged for review</span>\n </div>\n <div class=\"threshold-slider-group\">\n <label class=\"threshold-label\">\n <i class=\"fa-solid fa-bullseye\"></i>\n Absolute Match\n <span class=\"threshold-value\">{{ (RunAbsoluteThreshold * 100).toFixed(0) }}%</span>\n </label>\n <input type=\"range\" class=\"threshold-slider\"\n [min]=\"50\" [max]=\"100\" [step]=\"1\"\n [value]=\"RunAbsoluteThreshold * 100\"\n (input)=\"OnAbsoluteThresholdChanged($any($event.target).value / 100)\"\n [disabled]=\"IsDetecting\" />\n <span class=\"threshold-hint\">Score above which duplicates are auto-confirmed</span>\n </div>\n </div>\n }\n\n <!-- KPI Strip -->\n <div class=\"kpi-strip\">\n <div class=\"kpi-card\">\n <div class=\"kpi-value\">{{ TotalGroupCount }}</div>\n <div class=\"kpi-label\">Total Groups</div>\n </div>\n <div class=\"kpi-card kpi-pending\">\n <div class=\"kpi-value\">{{ PendingCount }}</div>\n <div class=\"kpi-label\">Pending</div>\n </div>\n <div class=\"kpi-card kpi-approved\">\n <div class=\"kpi-value\">{{ ApprovedCount }}</div>\n <div class=\"kpi-label\">Approved</div>\n </div>\n <div class=\"kpi-card kpi-rejected\">\n <div class=\"kpi-value\">{{ RejectedCount }}</div>\n <div class=\"kpi-label\">Rejected</div>\n </div>\n </div>\n\n <!-- Filter Bar -->\n <div class=\"filter-bar\">\n <div class=\"filter-group\">\n <select class=\"filter-select\"\n [(ngModel)]=\"Filters.EntityName\"\n (ngModelChange)=\"OnFilterChange()\"\n [disabled]=\"EntityNames.length <= 1\">\n @if (EntityNames.length > 1) {\n <option value=\"\">All Entities</option>\n }\n @for (name of EntityNames; track name) {\n <option [value]=\"name\">{{ name }}</option>\n }\n </select>\n\n <div class=\"filter-range\">\n <label class=\"filter-label\">Min Score</label>\n <input type=\"number\"\n class=\"filter-input filter-input-score\"\n min=\"0\" max=\"1\" step=\"0.05\"\n [placeholder]=\"DataMinScore\"\n [(ngModel)]=\"Filters.MinScore\"\n (ngModelChange)=\"OnFilterChange()\">\n </div>\n\n <div class=\"filter-range\">\n <label class=\"filter-label\">Max Score</label>\n <input type=\"number\"\n class=\"filter-input filter-input-score\"\n min=\"0\" max=\"1\" step=\"0.05\"\n [placeholder]=\"DataMaxScore\"\n [(ngModel)]=\"Filters.MaxScore\"\n (ngModelChange)=\"OnFilterChange()\">\n </div>\n\n <div class=\"filter-range\">\n <label class=\"filter-label\">From</label>\n <input type=\"date\"\n class=\"filter-input filter-input-date\"\n [min]=\"DataMinDate\" [max]=\"DataMaxDate\"\n [(ngModel)]=\"Filters.DateFrom\"\n (ngModelChange)=\"OnFilterChange()\">\n </div>\n\n <div class=\"filter-range\">\n <label class=\"filter-label\">To</label>\n <input type=\"date\"\n class=\"filter-input filter-input-date\"\n [min]=\"DataMinDate\" [max]=\"DataMaxDate\"\n [(ngModel)]=\"Filters.DateTo\"\n (ngModelChange)=\"OnFilterChange()\">\n </div>\n </div>\n\n @if (HasActiveFilters) {\n <button class=\"clear-filters-btn\" (click)=\"ClearFilters()\">\n <i class=\"fa-solid fa-times\"></i> Clear Filters\n </button>\n }\n </div>\n\n <!-- Merge Warning Banner (non-blocking, shown when entity lacks AllowRecordMerge) -->\n @if (ShowMergeWarningBanner) {\n <div class=\"merge-warning-banner\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n Merging is not available for this entity. Detection results are read-only.\n </div>\n }\n\n <!-- Content -->\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading duplicate detection results...\"></mj-loading>\n </div>\n } @else if (IsLoadingResults) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading duplicate detection results...\"></mj-loading>\n </div>\n } @else if (TotalGroupCount === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-clone empty-icon\"></i>\n <p class=\"empty-text\">No duplicate detection results found.</p>\n <p class=\"empty-subtext\">Select an entity document and click \"Run Detection\" to start.</p>\n </div>\n } @else {\n <!-- Kanban Board -->\n <div class=\"kanban-board\">\n <!-- Pending Column -->\n <div class=\"kanban-column\" [class.drop-target-active]=\"DragOverColumn === 'Pending' && DraggedGroup?.ApprovalStatus !== 'Pending'\">\n <div class=\"column-header column-header-pending\">\n <i class=\"fa-solid fa-clock\"></i>\n <span class=\"column-title\">Pending Review</span>\n <span class=\"column-count\">{{ PendingCount }}</span>\n </div>\n <div class=\"column-body\"\n (dragover)=\"OnDragOver($event, 'Pending')\"\n (dragleave)=\"OnDragLeave($event, 'Pending')\"\n (drop)=\"OnDrop($event, 'Pending')\">\n @for (group of PendingGroups; track group.DetailId) {\n <div class=\"kanban-card\"\n draggable=\"true\"\n (dragstart)=\"OnDragStart($event, group)\"\n (dragend)=\"OnDragEnd()\"\n (click)=\"OpenComparison(group)\">\n <div class=\"card-header\">\n <div class=\"card-header-left\">\n <div class=\"card-icon\">\n <i [class]=\"group.EntityIcon\"></i>\n </div>\n <div class=\"card-title-block\">\n <div class=\"card-record-name\" [title]=\"group.RecordName\">{{ group.RecordName }}</div>\n <span class=\"entity-badge\">{{ group.EntityName }}</span>\n </div>\n </div>\n <span class=\"score-indicator\" [class]=\"GetScoreClass(group.HighestScore)\">\n {{ (group.HighestScore * 100).toFixed(0) }}%\n </span>\n </div>\n <div class=\"card-body\">\n @if (group.TopMatchSummaries.length > 0) {\n <div class=\"match-summaries\">\n @for (ms of group.TopMatchSummaries; track ms.Name) {\n <div class=\"match-summary-row\">\n <span class=\"match-score\">{{ (ms.Score * 100).toFixed(0) }}%</span>\n <span class=\"match-name\">{{ ms.Name }}</span>\n </div>\n }\n @if (group.MatchCount > group.TopMatchSummaries.length) {\n <div class=\"match-summary-more\">+{{ group.MatchCount - group.TopMatchSummaries.length }} more</div>\n }\n </div>\n }\n <div class=\"card-meta-row\">\n <span class=\"card-meta-item\">\n <i class=\"fa-solid fa-layer-group\"></i>\n {{ group.MatchCount }} match{{ group.MatchCount !== 1 ? 'es' : '' }}\n </span>\n <span class=\"card-meta-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n {{ FormatDate(group.MatchedAt) }}\n </span>\n </div>\n </div>\n <div class=\"card-actions\">\n <button class=\"action-btn approve-btn\"\n [disabled]=\"IsSaving\"\n (click)=\"ApproveMatch(group); $event.stopPropagation()\">\n <i class=\"fa-solid fa-check\"></i> Approve\n </button>\n <button class=\"action-btn reject-btn\"\n [disabled]=\"IsSaving\"\n (click)=\"RejectMatch(group); $event.stopPropagation()\">\n <i class=\"fa-solid fa-times\"></i> Reject\n </button>\n </div>\n </div>\n }\n @if (PendingGroups.length === 0) {\n <div class=\"column-empty\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>No pending items</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Approved Column -->\n <div class=\"kanban-column\" [class.drop-target-active]=\"DragOverColumn === 'Approved' && DraggedGroup?.ApprovalStatus !== 'Approved'\">\n <div class=\"column-header column-header-approved\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span class=\"column-title\">Approved</span>\n <span class=\"column-count\">{{ ApprovedCount }}</span>\n </div>\n <div class=\"column-body\"\n (dragover)=\"OnDragOver($event, 'Approved')\"\n (dragleave)=\"OnDragLeave($event, 'Approved')\"\n (drop)=\"OnDrop($event, 'Approved')\">\n @for (group of ApprovedGroups; track group.DetailId) {\n <div class=\"kanban-card\"\n draggable=\"true\"\n (dragstart)=\"OnDragStart($event, group)\"\n (dragend)=\"OnDragEnd()\"\n (click)=\"OpenComparison(group)\">\n <div class=\"card-header\">\n <div class=\"card-header-left\">\n <div class=\"card-icon\">\n <i [class]=\"group.EntityIcon\"></i>\n </div>\n <div class=\"card-title-block\">\n <div class=\"card-record-name\" [title]=\"group.RecordName\">{{ group.RecordName }}</div>\n <span class=\"entity-badge\">{{ group.EntityName }}</span>\n </div>\n </div>\n <span class=\"score-indicator\" [class]=\"GetScoreClass(group.HighestScore)\">\n {{ (group.HighestScore * 100).toFixed(0) }}%\n </span>\n </div>\n <div class=\"card-body\">\n @if (group.TopMatchSummaries.length > 0) {\n <div class=\"match-summaries\">\n @for (ms of group.TopMatchSummaries; track ms.Name) {\n <div class=\"match-summary-row\">\n <span class=\"match-score\">{{ (ms.Score * 100).toFixed(0) }}%</span>\n <span class=\"match-name\">{{ ms.Name }}</span>\n </div>\n }\n @if (group.MatchCount > group.TopMatchSummaries.length) {\n <div class=\"match-summary-more\">+{{ group.MatchCount - group.TopMatchSummaries.length }} more</div>\n }\n </div>\n }\n <div class=\"card-meta-row\">\n <span class=\"card-meta-item\">\n <i class=\"fa-solid fa-layer-group\"></i>\n {{ group.MatchCount }} match{{ group.MatchCount !== 1 ? 'es' : '' }}\n </span>\n <span class=\"card-meta-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n {{ FormatDate(group.MatchedAt) }}\n </span>\n </div>\n </div>\n </div>\n }\n @if (ApprovedGroups.length === 0) {\n <div class=\"column-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No approved items</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Rejected Column -->\n <div class=\"kanban-column\" [class.drop-target-active]=\"DragOverColumn === 'Rejected' && DraggedGroup?.ApprovalStatus !== 'Rejected'\">\n <div class=\"column-header column-header-rejected\">\n <i class=\"fa-solid fa-ban\"></i>\n <span class=\"column-title\">Rejected</span>\n <span class=\"column-count\">{{ RejectedCount }}</span>\n </div>\n <div class=\"column-body\"\n (dragover)=\"OnDragOver($event, 'Rejected')\"\n (dragleave)=\"OnDragLeave($event, 'Rejected')\"\n (drop)=\"OnDrop($event, 'Rejected')\">\n @for (group of RejectedGroups; track group.DetailId) {\n <div class=\"kanban-card\"\n draggable=\"true\"\n (dragstart)=\"OnDragStart($event, group)\"\n (dragend)=\"OnDragEnd()\"\n (click)=\"OpenComparison(group)\">\n <div class=\"card-header\">\n <div class=\"card-header-left\">\n <div class=\"card-icon\">\n <i [class]=\"group.EntityIcon\"></i>\n </div>\n <div class=\"card-title-block\">\n <div class=\"card-record-name\" [title]=\"group.RecordName\">{{ group.RecordName }}</div>\n <span class=\"entity-badge\">{{ group.EntityName }}</span>\n </div>\n </div>\n <span class=\"score-indicator\" [class]=\"GetScoreClass(group.HighestScore)\">\n {{ (group.HighestScore * 100).toFixed(0) }}%\n </span>\n </div>\n <div class=\"card-body\">\n @if (group.TopMatchSummaries.length > 0) {\n <div class=\"match-summaries\">\n @for (ms of group.TopMatchSummaries; track ms.Name) {\n <div class=\"match-summary-row\">\n <span class=\"match-score\">{{ (ms.Score * 100).toFixed(0) }}%</span>\n <span class=\"match-name\">{{ ms.Name }}</span>\n </div>\n }\n @if (group.MatchCount > group.TopMatchSummaries.length) {\n <div class=\"match-summary-more\">+{{ group.MatchCount - group.TopMatchSummaries.length }} more</div>\n }\n </div>\n }\n <div class=\"card-meta-row\">\n <span class=\"card-meta-item\">\n <i class=\"fa-solid fa-layer-group\"></i>\n {{ group.MatchCount }} match{{ group.MatchCount !== 1 ? 'es' : '' }}\n </span>\n <span class=\"card-meta-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n {{ FormatDate(group.MatchedAt) }}\n </span>\n </div>\n </div>\n </div>\n }\n @if (RejectedGroups.length === 0) {\n <div class=\"column-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No rejected items</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Saving overlay -->\n @if (IsSaving) {\n <div class=\"saving-overlay\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n }\n\n <!-- \u2550\u2550\u2550 Comparison Slide-In Panel \u2550\u2550\u2550 -->\n @if (ComparisonGroup) {\n <div class=\"slide-backdrop\" [class.comparison-closing]=\"ComparisonClosing\" (click)=\"CloseComparison()\"></div>\n <div class=\"comparison-panel\" [class.comparison-closing]=\"ComparisonClosing\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"comparison-header\">\n <div class=\"comparison-header-left\">\n <div class=\"comparison-entity-icon\">\n <i [class]=\"ComparisonGroup.EntityIcon\"></i>\n </div>\n <div>\n <div class=\"comparison-title\">{{ ComparisonGroup.RecordName }}</div>\n <span class=\"comparison-entity-badge\">{{ ComparisonGroup.EntityName }}</span>\n <span class=\"comparison-match-count\">\n {{ ComparisonGroup.MatchCount }} potential duplicate{{ ComparisonGroup.MatchCount !== 1 ? 's' : '' }}\n </span>\n </div>\n </div>\n <div class=\"comparison-header-right\">\n <div class=\"comparison-toggle\">\n <button class=\"toggle-btn\" [class.toggle-active]=\"ComparisonShowAllFields\"\n (click)=\"ComparisonShowAllFields = true\">All Fields</button>\n <button class=\"toggle-btn\" [class.toggle-active]=\"!ComparisonShowAllFields\"\n (click)=\"ComparisonShowAllFields = false\">Differences Only</button>\n </div>\n <button class=\"comparison-close-btn\" (click)=\"CloseComparison()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n\n <!-- Grid -->\n @if (ComparisonLoading) {\n <div class=\"comparison-loading\">\n <mj-loading text=\"Loading records for comparison...\" size=\"medium\"></mj-loading>\n </div>\n }\n <div class=\"comparison-grid-wrapper\" [hidden]=\"ComparisonLoading\">\n <div class=\"comparison-grid\"\n [style.grid-template-columns]=\"'160px repeat(' + (1 + ComparisonMatches.length) + ', minmax(180px, 1fr))'\">\n\n <!-- Corner cell -->\n <div class=\"grid-corner-cell\">Field</div>\n\n <!-- Source column header -->\n <div class=\"grid-col-header grid-col-source\">\n <span class=\"col-header-label\">Source</span>\n <span class=\"col-header-name\">{{ ComparisonGroup.RecordName }}</span>\n <div class=\"surviving-selector\">\n <input type=\"radio\" name=\"survivor\" class=\"surviving-radio\"\n [checked]=\"SurvivorColumnIndex === 0\"\n (change)=\"SetSurvivor(0)\">\n <span class=\"surviving-label\" [class.is-survivor]=\"SurvivorColumnIndex === 0\">\n {{ SurvivorColumnIndex === 0 ? 'Surviving Record' : 'Set as survivor' }}\n </span>\n </div>\n <button class=\"use-all-btn\" [class.all-selected]=\"AllFieldsSelectedFrom(0)\"\n (click)=\"UseAllFieldsFrom(0)\">\n <i class=\"fa-solid\" [class.fa-check-double]=\"AllFieldsSelectedFrom(0)\" [class.fa-clone]=\"!AllFieldsSelectedFrom(0)\"></i>\n {{ AllFieldsSelectedFrom(0) ? 'Using all fields' : 'Use all fields' }}\n </button>\n <!-- Dependencies Summary -->\n <div class=\"deps-summary\">\n <div class=\"deps-total\">\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"deps-total-number\">{{ GetTotalDeps(0) }}</span>\n {{ GetTotalDeps(0) === 1 ? 'dependency' : 'dependencies' }}\n @if (GetMaxDepsColumnIndex() === 0 && GetTotalDeps(0) > 0) {\n <span class=\"deps-total-recommended\"><i class=\"fa-solid fa-star\"></i> Most deps</span>\n }\n </div>\n @if (GetGroupedDeps(0).length > 0) {\n <div class=\"deps-header\" (click)=\"ToggleDepsExpanded(0)\">\n <span>{{ IsDepsExpanded(0) ? 'Hide details' : 'Show details' }}</span>\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!IsDepsExpanded(0)\" [class.fa-chevron-up]=\"IsDepsExpanded(0)\"></i>\n </div>\n @if (IsDepsExpanded(0)) {\n <div class=\"deps-detail-list\">\n @for (dep of GetGroupedDeps(0); track dep.Entity) {\n <div class=\"deps-detail-group\">\n <div class=\"deps-detail-row\" (click)=\"ToggleDepEntityGroup(0, dep.Entity); $event.stopPropagation()\">\n <span class=\"deps-detail-entity\">\n <i class=\"fa-solid deps-expand-icon\"\n [class.fa-chevron-right]=\"!IsDepEntityGroupExpanded(0, dep.Entity)\"\n [class.fa-chevron-down]=\"IsDepEntityGroupExpanded(0, dep.Entity)\"></i>\n {{ dep.Entity }}\n </span>\n <span class=\"deps-detail-count\">{{ dep.Count }}</span>\n </div>\n @if (IsDepEntityGroupExpanded(0, dep.Entity)) {\n <div class=\"deps-records-list\">\n @if (IsDepRecordsLoading(0, dep.Entity)) {\n <div class=\"deps-record-loading\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...</div>\n }\n @for (record of GetDepRecords(0, dep.Entity); track $index) {\n <div class=\"deps-record-row\" (click)=\"OpenDepRecord(record); $event.stopPropagation()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square deps-record-icon\"></i>\n <span class=\"deps-record-name\">{{ record.Name }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n\n <!-- Match column headers -->\n @for (match of ComparisonMatches; track match.Match.ID; let mi = $index) {\n <div class=\"grid-col-header\"\n [class.match-approved]=\"match.Match.ApprovalStatus === 'Approved'\"\n [class.match-rejected]=\"match.Match.ApprovalStatus === 'Rejected'\">\n <div class=\"col-header-top\">\n <span class=\"col-header-name\">{{ match.Name }}</span>\n <span class=\"score-indicator\" [class]=\"GetScoreClass(match.Score)\">\n {{ (match.Score * 100).toFixed(0) }}%\n </span>\n </div>\n <span class=\"col-header-diff-count\">{{ match.DiffCount }} difference{{ match.DiffCount !== 1 ? 's' : '' }}</span>\n <div class=\"surviving-selector\">\n <input type=\"radio\" name=\"survivor\" class=\"surviving-radio\"\n [checked]=\"SurvivorColumnIndex === mi + 1\"\n (change)=\"SetSurvivor(mi + 1)\">\n <span class=\"surviving-label\" [class.is-survivor]=\"SurvivorColumnIndex === mi + 1\">\n {{ SurvivorColumnIndex === mi + 1 ? 'Surviving Record' : 'Set as survivor' }}\n </span>\n </div>\n <button class=\"use-all-btn\" [class.all-selected]=\"AllFieldsSelectedFrom(mi + 1)\"\n (click)=\"UseAllFieldsFrom(mi + 1)\">\n <i class=\"fa-solid\" [class.fa-check-double]=\"AllFieldsSelectedFrom(mi + 1)\" [class.fa-clone]=\"!AllFieldsSelectedFrom(mi + 1)\"></i>\n {{ AllFieldsSelectedFrom(mi + 1) ? 'Using all fields' : 'Use all fields' }}\n </button>\n <!-- Dependencies Summary -->\n <div class=\"deps-summary\">\n <div class=\"deps-total\">\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"deps-total-number\">{{ GetTotalDeps(mi + 1) }}</span>\n {{ GetTotalDeps(mi + 1) === 1 ? 'dependency' : 'dependencies' }}\n @if (GetMaxDepsColumnIndex() === mi + 1 && GetTotalDeps(mi + 1) > 0) {\n <span class=\"deps-total-recommended\"><i class=\"fa-solid fa-star\"></i> Most deps</span>\n }\n </div>\n @if (GetGroupedDeps(mi + 1).length > 0) {\n <div class=\"deps-header\" (click)=\"ToggleDepsExpanded(mi + 1)\">\n <span>{{ IsDepsExpanded(mi + 1) ? 'Hide details' : 'Show details' }}</span>\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!IsDepsExpanded(mi + 1)\" [class.fa-chevron-up]=\"IsDepsExpanded(mi + 1)\"></i>\n </div>\n @if (IsDepsExpanded(mi + 1)) {\n <div class=\"deps-detail-list\">\n @for (dep of GetGroupedDeps(mi + 1); track dep.Entity) {\n <div class=\"deps-detail-group\">\n <div class=\"deps-detail-row\" (click)=\"ToggleDepEntityGroup(mi + 1, dep.Entity); $event.stopPropagation()\">\n <span class=\"deps-detail-entity\">\n <i class=\"fa-solid deps-expand-icon\"\n [class.fa-chevron-right]=\"!IsDepEntityGroupExpanded(mi + 1, dep.Entity)\"\n [class.fa-chevron-down]=\"IsDepEntityGroupExpanded(mi + 1, dep.Entity)\"></i>\n {{ dep.Entity }}\n </span>\n <span class=\"deps-detail-count\">{{ dep.Count }}</span>\n </div>\n @if (IsDepEntityGroupExpanded(mi + 1, dep.Entity)) {\n <div class=\"deps-records-list\">\n @if (IsDepRecordsLoading(mi + 1, dep.Entity)) {\n <div class=\"deps-record-loading\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...</div>\n }\n @for (record of GetDepRecords(mi + 1, dep.Entity); track $index) {\n <div class=\"deps-record-row\" (click)=\"OpenDepRecord(record); $event.stopPropagation()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square deps-record-icon\"></i>\n <span class=\"deps-record-name\">{{ record.Name }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n <!-- Per-match approval actions -->\n <div class=\"match-approval-actions\">\n @if (match.Match.ApprovalStatus === 'Pending') {\n <button class=\"match-action-btn match-skip-btn\"\n title=\"Skip this match (exclude from merge)\"\n (click)=\"RejectIndividualMatch(match)\">\n <i class=\"fa-solid fa-ban\"></i> Skip\n </button>\n } @else {\n <span class=\"match-status-badge\"\n [class.status-approved]=\"match.Match.ApprovalStatus === 'Approved'\"\n [class.status-rejected]=\"match.Match.ApprovalStatus === 'Rejected'\">\n <i class=\"fa-solid\" [class.fa-check]=\"match.Match.ApprovalStatus === 'Approved'\"\n [class.fa-times]=\"match.Match.ApprovalStatus === 'Rejected'\"></i>\n {{ match.Match.ApprovalStatus === 'Rejected' ? 'Skipped' : match.Match.ApprovalStatus }}\n </span>\n @if (match.Match.ApprovalStatus === 'Rejected') {\n <button class=\"match-action-btn match-undo-btn\"\n title=\"Undo skip\"\n (click)=\"UndoRejectIndividualMatch(match)\">\n <i class=\"fa-solid fa-undo\"></i> Undo\n </button>\n }\n }\n </div>\n </div>\n }\n\n <!-- Field rows -->\n @for (field of GetVisibleFields(); track field.FieldName; let odd = $odd) {\n <!-- Label cell -->\n <div class=\"grid-label-cell\" [class.grid-row-odd]=\"odd\">\n {{ field.DisplayName }}\n </div>\n <!-- Source value cell -->\n <div class=\"grid-value-cell grid-source-cell\"\n [class.grid-row-odd]=\"odd\"\n [class.has-diff-in-row]=\"field.HasDifference\"\n [class.field-selected]=\"field.SelectedColumnIndex === 0\"\n (click)=\"SelectFieldValue(field, 0)\">\n @if (field.SourceValue != null) {\n {{ field.SourceValue }}\n } @else {\n <span class=\"field-not-available\">(not available)</span>\n }\n @if (field.HasDifference || field.SelectedColumnIndex === 0) {\n <input type=\"radio\" [name]=\"'field-' + field.FieldName\" class=\"field-select-radio\"\n [checked]=\"field.SelectedColumnIndex === 0\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"SelectFieldValue(field, 0)\">\n }\n </div>\n <!-- Match value cells -->\n @for (matchVal of field.MatchValues; track $index; let mi = $index) {\n <div class=\"grid-value-cell\"\n [class.grid-row-odd]=\"odd\"\n [class.value-same]=\"AreValuesEqual(field.SourceValue, matchVal)\"\n [class.value-different]=\"matchVal != null && field.SourceValue != null && !AreValuesEqual(field.SourceValue, matchVal)\"\n [class.field-selected]=\"field.SelectedColumnIndex === mi + 1\"\n (click)=\"matchVal != null ? SelectFieldValue(field, mi + 1) : null\">\n @if (matchVal != null) {\n {{ matchVal }}\n @if (field.HasDifference || field.SelectedColumnIndex === mi + 1) {\n <input type=\"radio\" [name]=\"'field-' + field.FieldName\" class=\"field-select-radio\"\n [checked]=\"field.SelectedColumnIndex === mi + 1\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"SelectFieldValue(field, mi + 1)\">\n }\n } @else {\n <span class=\"field-not-available\">(not available)</span>\n }\n </div>\n }\n }\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"comparison-footer\">\n <div class=\"comparison-footer-left\">\n <span class=\"comparison-summary\">\n Showing {{ GetVisibleFields().length }} of {{ ComparisonFields.length }} fields\n </span>\n <span class=\"merge-summary\">\n <i class=\"fa-solid fa-code-merge\"></i>\n Surviving: <strong>{{ SurvivorName() }}</strong>\n @if (CherryPickedCount() > 0) {\n · {{ CherryPickedCount() }} field{{ CherryPickedCount() !== 1 ? 's' : '' }} cherry-picked\n }\n </span>\n </div>\n <div class=\"comparison-footer-right\">\n <button class=\"action-btn reject-btn\" [disabled]=\"IsSaving\"\n (click)=\"RejectMatch(ComparisonGroup!); CloseComparison()\">\n <i class=\"fa-solid fa-times\"></i> Reject All\n </button>\n <button class=\"action-btn merge-btn\" [disabled]=\"IsSaving || !HasMergeableMatches || !MergeEnabled\"\n (click)=\"OpenMergeConfirm()\"\n [title]=\"!MergeEnabled ? 'Merging is not enabled for this entity' : HasMergeableMatches ? 'Merge non-skipped records' : 'All matches have been skipped'\">\n <i class=\"fa-solid fa-code-merge\"></i> Merge Records\n </button>\n @if (!MergeEnabled) {\n <span class=\"merge-disabled-hint\"><i class=\"fa-solid fa-info-circle\"></i> Merging disabled for this entity</span>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- \u2550\u2550\u2550 Merge Confirmation Panel \u2550\u2550\u2550 -->\n @if (ShowMergeConfirm && ComparisonGroup) {\n <div class=\"merge-confirm-backdrop\" (click)=\"CloseMergeConfirm()\">\n <div class=\"merge-confirm-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"merge-confirm-header\">\n <div class=\"merge-confirm-icon\"><i class=\"fa-solid fa-code-merge\"></i></div>\n <div>\n <div class=\"merge-confirm-title\">Confirm Record Merge</div>\n <div class=\"merge-confirm-subtitle\">This action cannot be undone. Please review carefully.</div>\n </div>\n </div>\n\n <div class=\"merge-confirm-body\">\n <!-- Surviving Record -->\n <div class=\"merge-survivor-card\">\n <div class=\"merge-survivor-label\"><i class=\"fa-solid fa-shield-halved\"></i> Surviving Record</div>\n <div class=\"merge-survivor-name\">{{ SurvivorName() }}</div>\n <div class=\"merge-survivor-pk\">\n <i class=\"fa-solid fa-key\"></i>\n {{ SurvivorKeyDisplay() }}\n </div>\n <div class=\"merge-survivor-detail\">This record's ID will be retained. All dependencies from merged records will be transferred here.</div>\n </div>\n\n <!-- Cherry-picked field overrides -->\n @if (GetCherryPickedFields().length > 0) {\n <div>\n <div class=\"merge-section-label\">Field Value Overrides ({{ GetCherryPickedFields().length }} field{{ GetCherryPickedFields().length !== 1 ? 's' : '' }})</div>\n @for (field of GetCherryPickedFields(); track field.FieldName) {\n <div class=\"merge-field-override\">\n <span class=\"merge-field-name\">{{ field.DisplayName }}</span>\n <span class=\"merge-field-value\">\"{{ field.Value }}\"</span>\n <span class=\"merge-field-source\">from {{ field.SourceName }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Dependency transfer -->\n @if (GetNonSurvivorColumns().length > 0) {\n <div class=\"merge-deps-transfer\">\n <div class=\"merge-deps-transfer-label\"><i class=\"fa-solid fa-arrow-right-arrow-left\"></i> Dependencies to Transfer</div>\n @for (col of GetNonSurvivorColumns(); track col.ColumnIndex) {\n <div class=\"merge-deps-transfer-row\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n <span>\n @if (col.DepCount > 0) {\n <strong>{{ col.DepCount }}</strong> {{ col.DepCount === 1 ? 'dependency' : 'dependencies' }} from <strong>{{ col.Name }}</strong> → {{ SurvivorName() }}\n } @else {\n <strong>0</strong> dependencies from <strong>{{ col.Name }}</strong>\n }\n </span>\n </div>\n }\n </div>\n }\n\n <!-- Records to be deleted -->\n <div class=\"merge-delete-card\">\n <div class=\"merge-delete-label\"><i class=\"fa-solid fa-trash\"></i> Records to Delete After Merge</div>\n @for (col of GetNonSurvivorColumns(); track col.ColumnIndex) {\n <div class=\"merge-delete-item\">\n <span class=\"merge-delete-name\">{{ col.Name }}</span>\n <span class=\"merge-delete-deps\">\n @if (col.DepCount > 0) {\n {{ col.DepCount }} dep{{ col.DepCount !== 1 ? 's' : '' }} transferring\n } @else {\n no deps\n }\n </span>\n </div>\n }\n </div>\n </div>\n\n <div class=\"merge-confirm-footer\">\n <button class=\"action-btn cancel-btn\" (click)=\"CloseMergeConfirm()\" [disabled]=\"IsMerging\">\n <i class=\"fa-solid fa-arrow-left\"></i> Back\n </button>\n <button class=\"action-btn confirm-merge-btn\" (click)=\"ExecuteMerge()\" [disabled]=\"IsMerging\">\n @if (IsMerging) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging...\n } @else {\n <i class=\"fa-solid fa-code-merge\"></i> Confirm Merge ({{ GetNonSurvivorColumns().length + 1 }} records → 1)\n }\n </button>\n </div>\n </div>\n </div>\n }\n\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* ============================================================\n Duplicate Detection Kanban Board - Resource Component Styles\n All colors use MJ design tokens (--mj-*) exclusively.\n ============================================================ */\n\napp-duplicate-detection-resource {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n\n/* Entity-document select used in the [actions] slot. */\n.kh-doc-select {\n width: auto;\n min-width: 220px;\n min-height: 32px;\n padding: 4px 28px 4px 12px;\n font-size: 0.8125rem;\n}\n\n/* ---- Detection Progress ---- */\n\n.detection-progress-section {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-brand-primary);\n border-radius: 8px;\n padding: 14px 18px;\n margin-bottom: 16px;\n flex-shrink: 0;\n}\n\n.progress-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.progress-stage {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n.progress-percent {\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.progress-bar-track {\n height: 6px;\n border-radius: 3px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n.progress-bar-fill {\n height: 100%;\n border-radius: 3px;\n background: var(--mj-brand-primary);\n transition: width 0.3s ease;\n}\n\n.progress-current-item {\n display: block;\n margin-top: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ---- Threshold Controls ---- */\n\n.threshold-controls {\n display: flex;\n gap: 24px;\n padding: 12px 16px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 6%, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-subtle);\n margin-bottom: 16px;\n flex-shrink: 0;\n}\n\n.threshold-slider-group {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.threshold-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.threshold-value {\n margin-left: auto;\n font-weight: 700;\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n.threshold-slider {\n width: 100%;\n height: 4px;\n appearance: none;\n -webkit-appearance: none;\n background: var(--mj-border-default);\n border-radius: 2px;\n outline: none;\n cursor: pointer;\n}\n\n.threshold-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: var(--mj-brand-primary);\n border: 2px solid var(--mj-bg-surface);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n cursor: pointer;\n}\n\n.threshold-slider::-moz-range-thumb {\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: var(--mj-brand-primary);\n border: 2px solid var(--mj-bg-surface);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n cursor: pointer;\n}\n\n.threshold-slider:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.threshold-hint {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n/* ---- Threshold Info (legacy) ---- */\n\n.threshold-info {\n display: flex;\n gap: 16px;\n padding: 8px 14px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-info) 8%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-info-border);\n margin-bottom: 16px;\n flex-shrink: 0;\n}\n\n.threshold-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-status-info-text);\n font-weight: 500;\n}\n\n.threshold-item i {\n font-size: 11px;\n}\n\n/* ---- KPI Strip ---- */\n\n.kpi-strip {\n display: flex;\n gap: 12px;\n margin-bottom: 16px;\n flex-shrink: 0;\n}\n\n.kpi-card {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.kpi-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1.2;\n}\n\n.kpi-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-top: 2px;\n}\n\n.kpi-pending .kpi-value {\n color: var(--mj-status-warning);\n}\n\n.kpi-approved .kpi-value {\n color: var(--mj-status-success);\n}\n\n.kpi-rejected .kpi-value {\n color: var(--mj-status-error);\n}\n\n/* ---- Filter Bar ---- */\n\n.filter-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 16px;\n flex-shrink: 0;\n}\n\n.filter-group {\n display: flex;\n align-items: flex-end;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.filter-select {\n height: 34px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n min-width: 160px;\n}\n\n.filter-select:focus {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.filter-range {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.filter-label {\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.filter-input {\n height: 34px;\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n width: 100px;\n}\n\n.filter-input-score {\n width: 80px;\n}\n\n.filter-input-date {\n width: 140px;\n}\n\n.filter-input:focus {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.clear-filters-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n height: 34px;\n padding: 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.clear-filters-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n/* ---- Loading & Empty States ---- */\n\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 200px;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 200px;\n gap: 8px;\n}\n\n.empty-icon {\n font-size: 48px;\n color: var(--mj-text-disabled);\n}\n\n.empty-text {\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.empty-subtext {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin: 0;\n}\n\n/* ---- Kanban Board ---- */\n\n.kanban-board {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n overflow-x: auto;\n}\n\n.kanban-column {\n flex: 1;\n min-width: 280px;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.column-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n flex-shrink: 0;\n}\n\n.column-header-pending {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface));\n}\n\n.column-header-pending i {\n color: var(--mj-status-warning);\n}\n\n.column-header-approved {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n}\n\n.column-header-approved i {\n color: var(--mj-status-success);\n}\n\n.column-header-rejected {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n}\n\n.column-header-rejected i {\n color: var(--mj-status-error);\n}\n\n.column-title {\n flex: 1;\n}\n\n.column-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n padding: 0 6px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.column-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.column-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 32px 16px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.column-empty i {\n font-size: 24px;\n}\n\n/* ---- Kanban Cards ---- */\n\n.kanban-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n transition: box-shadow 0.15s ease, border-color 0.15s ease;\n flex-shrink: 0; /* Prevent cards from shrinking \u2014 column scrolls instead */\n}\n\n.kanban-card:hover {\n border-color: var(--mj-border-strong);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n}\n\n/* Drag and Drop */\n.kanban-card[draggable=\"true\"] {\n cursor: grab;\n}\n\n.kanban-card[draggable=\"true\"]:active {\n cursor: grabbing;\n}\n\n.drop-target-active {\n outline: 2px dashed var(--mj-brand-primary);\n outline-offset: -2px;\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface-card)) !important;\n}\n\n.drop-target-active .column-body {\n min-height: 100px;\n}\n\n.card-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 10px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n gap: 8px;\n}\n\n.card-header-left {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n min-width: 0;\n flex: 1;\n}\n\n.card-icon {\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n flex-shrink: 0;\n}\n\n.card-title-block {\n min-width: 0;\n flex: 1;\n}\n\n.card-record-name {\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-bottom: 2px;\n}\n\n.entity-badge {\n display: inline-flex;\n align-items: center;\n padding: 1px 6px;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-muted);\n letter-spacing: 0.2px;\n}\n\n/* Score indicator colors */\n\n.score-indicator {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 40px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 700;\n}\n\n.score-high {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n border: 1px solid var(--mj-status-success-border);\n}\n\n.score-medium {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border: 1px solid var(--mj-status-warning-border);\n}\n\n.score-low {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n}\n\n.card-body {\n padding: 10px 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.match-summaries {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.match-summary-row {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n}\n\n.match-score {\n flex-shrink: 0;\n font-weight: 600;\n font-size: 11px;\n color: var(--mj-text-muted);\n min-width: 30px;\n}\n\n.match-name {\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.match-summary-more {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-style: italic;\n padding-left: 38px;\n}\n\n.card-meta-row {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n border-top: 1px solid var(--mj-border-subtle);\n padding-top: 6px;\n}\n\n.card-meta-item {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.card-meta-item i {\n font-size: 10px;\n}\n font-size: 12px;\n max-width: 180px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Comparison Slide-In Panel\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.slide-backdrop {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 9999;\n animation: fadeIn 0.2s ease;\n}\n\n.slide-backdrop.comparison-closing {\n animation: fadeOut 0.25s ease forwards;\n}\n\n@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n@keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }\n\n.comparison-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 82vw;\n max-width: 1300px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -8px 0 40px rgba(0,0,0,0.4);\n z-index: 10000;\n display: flex;\n flex-direction: column;\n animation: slideIn 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.comparison-panel.comparison-closing {\n animation: slideOut 0.25s cubic-bezier(0.4, 0, 0.2, 1) forwards;\n}\n\n@keyframes slideIn { from { transform: translateX(100%); } to { transform: translateX(0); } }\n@keyframes slideOut { from { transform: translateX(0); } to { transform: translateX(100%); } }\n\n/* Header */\n.comparison-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 12px;\n}\n\n.comparison-header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n\n.comparison-entity-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.comparison-title {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.comparison-entity-badge {\n display: inline-block;\n padding: 1px 7px;\n border-radius: 10px;\n font-size: 0.65rem;\n font-weight: 500;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n margin-right: 6px;\n}\n\n.comparison-match-count {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.comparison-header-right {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-shrink: 0;\n}\n\n/* Toggle */\n.comparison-toggle {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.toggle-btn {\n padding: 5px 12px;\n font-size: 0.7rem;\n font-weight: 500;\n border: none;\n cursor: pointer;\n transition: all 0.15s ease;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n}\n\n.toggle-btn:first-child {\n border-right: 1px solid var(--mj-border-default);\n}\n\n.toggle-btn.toggle-active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.comparison-close-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n transition: all 0.15s ease;\n}\n\n.comparison-close-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n/* Loading state */\n.comparison-loading {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Grid wrapper */\n.comparison-grid-wrapper {\n flex: 1;\n overflow: auto;\n min-height: 0;\n}\n\n/* Grid */\n.comparison-grid {\n display: grid;\n min-width: 100%;\n}\n\n.comparison-grid > div {\n padding: 8px 12px;\n font-size: 0.78rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n border-right: 1px solid var(--mj-border-subtle);\n}\n\n/* Corner cell */\n.grid-corner-cell {\n position: sticky;\n top: 0;\n left: 0;\n z-index: 4;\n background: var(--mj-bg-surface-elevated);\n font-size: 0.65rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: flex-end;\n padding-bottom: 6px;\n}\n\n/* Column headers */\n.grid-col-header {\n position: sticky;\n top: 0;\n z-index: 3;\n background: var(--mj-bg-surface-elevated);\n padding: 10px 12px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.grid-col-source {\n border-left: 3px solid var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface-elevated));\n}\n\n.col-header-label {\n font-size: 0.6rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-brand-primary);\n}\n\n.col-header-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n}\n\n.col-header-name {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.col-header-diff-count {\n font-size: 0.65rem;\n color: var(--mj-status-warning-text);\n}\n\n/* Surviving record selector */\n.surviving-selector {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n}\n\n.surviving-radio {\n appearance: none;\n width: 14px;\n height: 14px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.surviving-radio:checked {\n border-color: var(--mj-brand-primary);\n background: var(--mj-brand-primary);\n box-shadow: inset 0 0 0 2px var(--mj-bg-surface-elevated);\n}\n\n.surviving-label {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.surviving-label.is-survivor {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n/* Use all fields button */\n.use-all-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.62rem;\n cursor: pointer;\n transition: all 0.12s ease;\n margin-top: 2px;\n}\n\n.use-all-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.use-all-btn.all-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n/* Per-match actions */\n.comparison-match-actions {\n display: flex;\n gap: 4px;\n margin-top: 3px;\n}\n\n.action-btn-sm {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid;\n border-radius: 5px;\n cursor: pointer;\n font-size: 0.65rem;\n transition: all 0.15s ease;\n}\n\n.approve-btn-sm {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n border-color: var(--mj-status-success-border);\n}\n.approve-btn-sm:hover { background: rgba(34,197,94,0.25); }\n\n.reject-btn-sm {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border-color: var(--mj-status-error-border);\n}\n.reject-btn-sm:hover { background: rgba(239,68,68,0.25); }\n\n.match-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 0.68rem;\n font-weight: 500;\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.status-approved {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.status-rejected {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.match-approval-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 6px;\n}\n\n.match-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 10px;\n border-radius: 6px;\n font-size: 0.7rem;\n font-weight: 500;\n border: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.15s ease, border-color 0.15s ease;\n}\n\n.match-skip-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-border-default));\n}\n\n.match-skip-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error);\n}\n\n.match-undo-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n}\n\n.match-undo-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.match-approved {\n border-top: 3px solid var(--mj-status-success);\n}\n\n.match-rejected {\n border-top: 3px solid var(--mj-status-error);\n opacity: 0.6;\n}\n\n/* Label cells */\n.grid-label-cell {\n position: sticky;\n left: 0;\n z-index: 2;\n background: var(--mj-bg-surface);\n font-size: 0.72rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n}\n\n.grid-row-odd {\n background: color-mix(in srgb, var(--mj-bg-surface-sunken) 50%, var(--mj-bg-surface));\n}\n\n.grid-label-cell.grid-row-odd {\n background: color-mix(in srgb, var(--mj-bg-surface-sunken) 50%, var(--mj-bg-surface));\n}\n\n/* Value cells */\n.grid-value-cell {\n font-size: 0.78rem;\n color: var(--mj-text-primary);\n line-height: 1.45;\n word-break: break-word;\n position: relative;\n cursor: pointer;\n}\n\n.grid-source-cell {\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n border-left: 3px solid transparent;\n}\n\n.grid-source-cell.grid-row-odd {\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, color-mix(in srgb, var(--mj-bg-surface-sunken) 50%, var(--mj-bg-surface)));\n}\n\n.grid-source-cell.has-diff-in-row {\n font-weight: 600;\n}\n\n/* Diff highlighting */\n.value-same {\n color: var(--mj-text-muted);\n}\n\n.value-different {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent) !important;\n border-left: 3px solid var(--mj-status-warning);\n color: var(--mj-text-primary);\n}\n\n.field-not-available {\n font-style: italic;\n font-size: 0.72rem;\n color: var(--mj-text-disabled);\n}\n\n/* Field selection radio */\n.field-select-radio {\n position: absolute;\n top: 50%;\n right: 8px;\n transform: translateY(-50%);\n appearance: none;\n width: 16px;\n height: 16px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.12s ease;\n opacity: 0.4;\n}\n\n.field-select-radio:hover {\n opacity: 0.8;\n}\n\n.field-select-radio:checked {\n border-color: var(--mj-brand-primary);\n background: var(--mj-brand-primary);\n box-shadow: inset 0 0 0 2.5px var(--mj-bg-surface);\n opacity: 1;\n}\n\n.grid-value-cell.field-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)) !important;\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.grid-value-cell.field-selected .field-select-radio {\n opacity: 1;\n}\n\n/* Footer */\n.comparison-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.comparison-footer-left {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.comparison-summary {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.merge-summary {\n font-size: 0.72rem;\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.merge-summary i {\n font-size: 0.65rem;\n}\n\n.comparison-footer-right {\n display: flex;\n gap: 8px;\n}\n\n.comparison-footer-right .action-btn {\n flex: none;\n padding: 7px 14px;\n}\n\n.merge-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.merge-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.card-actions {\n display: flex;\n gap: 8px;\n padding: 10px 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.action-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n height: 32px;\n padding: 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s ease, border-color 0.15s ease;\n}\n\n.action-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.approve-btn {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n border-color: var(--mj-status-success-border);\n}\n\n.approve-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-success) 20%, var(--mj-bg-surface));\n}\n\n.reject-btn {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n border-color: var(--mj-status-error-border);\n}\n\n.reject-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n/* ---- Responsive ---- */\n\n@media (max-width: 768px) {\n .kanban-board {\n flex-direction: column;\n }\n\n .kanban-column {\n min-width: auto;\n max-height: 400px;\n }\n}\n\n@media (max-width: 480px) {\n .kpi-strip {\n flex-direction: column;\n }\n\n .filter-bar {\n flex-wrap: wrap;\n }\n\n .filter-group {\n flex-direction: column;\n align-items: stretch;\n width: 100%;\n }\n\n .filter-select {\n min-width: auto;\n width: 100%;\n }\n\n .filter-input {\n width: 100%;\n }\n\n .card-actions {\n flex-direction: column;\n }\n\n .action-btn {\n width: 100%;\n }\n}\n\n/* ---- Saving Overlay ---- */\n\n.saving-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-overlay);\n z-index: 10;\n border-radius: 8px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Dependencies Summary (in column headers)\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.deps-summary {\n margin-top: 6px;\n padding: 6px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 0.68rem;\n}\n\n.deps-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-weight: 600;\n}\n\n.deps-header i {\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n}\n\n.deps-header:hover {\n color: var(--mj-text-primary);\n}\n\n.deps-total {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 0.72rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.deps-total i {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.deps-total-number {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n padding: 0 6px;\n border-radius: 8px;\n font-size: 0.7rem;\n font-weight: 700;\n}\n\n.deps-total-recommended {\n font-size: 0.58rem;\n color: var(--mj-status-success-text);\n font-weight: 600;\n margin-left: 4px;\n}\n\n.deps-total-recommended i {\n color: var(--mj-status-success-text);\n}\n\n.deps-detail-list {\n margin-top: 4px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.deps-detail-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 3px 0;\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 3px;\n transition: background 0.1s ease;\n}\n\n.deps-detail-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.deps-detail-entity {\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-text-secondary);\n}\n\n.deps-expand-icon {\n font-size: 0.5rem;\n width: 10px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n/* Individual dependency records list */\n.deps-records-list {\n padding-left: 14px;\n margin-bottom: 2px;\n}\n\n.deps-record-row {\n display: flex;\n align-items: center;\n gap: 5px;\n padding: 2px 4px;\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 3px;\n transition: color 0.1s ease, background 0.1s ease;\n}\n\n.deps-record-row:hover {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.deps-record-icon {\n font-size: 0.5rem;\n flex-shrink: 0;\n}\n\n.deps-record-name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.6rem;\n}\n\n.deps-record-loading {\n padding: 3px 4px;\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n}\n\n.deps-record-loading i {\n margin-right: 4px;\n}\n\n.deps-detail-count {\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Merge Confirmation Panel\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.merge-confirm-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 20000;\n animation: fadeIn 0.2s ease;\n}\n\n.merge-confirm-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 520px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -8px 0 40px rgba(0, 0, 0, 0.4);\n z-index: 20001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: slideIn 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.merge-confirm-header {\n padding: 18px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.merge-confirm-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n font-size: 1.1rem;\n flex-shrink: 0;\n}\n\n.merge-confirm-title {\n font-size: 1.05rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.merge-confirm-subtitle {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.merge-confirm-body {\n padding: 20px 24px;\n overflow-y: auto;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* Surviving record card */\n\n.merge-survivor-card {\n padding: 14px;\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n border: 1px solid var(--mj-brand-primary);\n border-radius: 8px;\n}\n\n.merge-survivor-label {\n font-size: 0.65rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-brand-primary);\n margin-bottom: 4px;\n}\n\n.merge-survivor-label i {\n margin-right: 4px;\n}\n\n.merge-survivor-name {\n font-size: 0.95rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.merge-survivor-pk {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n padding: 4px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 0.68rem;\n font-family: monospace;\n color: var(--mj-text-secondary);\n}\n\n.merge-survivor-pk i {\n font-size: 0.6rem;\n color: var(--mj-brand-primary);\n}\n\n.merge-survivor-detail {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n margin-top: 4px;\n}\n\n/* Cherry-picked fields section */\n\n.merge-section-label {\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-bottom: 6px;\n}\n\n.merge-field-override {\n display: flex;\n align-items: baseline;\n gap: 8px;\n padding: 6px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.merge-field-name {\n font-weight: 600;\n color: var(--mj-text-secondary);\n min-width: 110px;\n flex-shrink: 0;\n}\n\n.merge-field-value {\n color: var(--mj-text-primary);\n}\n\n.merge-field-source {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-left: auto;\n white-space: nowrap;\n}\n\n/* Dependency transfer summary */\n\n.merge-deps-transfer {\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.merge-deps-transfer-label {\n font-size: 0.65rem;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-brand-primary);\n margin-bottom: 6px;\n}\n\n.merge-deps-transfer-label i {\n margin-right: 4px;\n}\n\n.merge-deps-transfer-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 3px 0;\n font-size: 0.75rem;\n color: var(--mj-text-secondary);\n}\n\n.merge-deps-transfer-row i {\n color: var(--mj-brand-primary);\n font-size: 0.65rem;\n width: 14px;\n text-align: center;\n}\n\n/* Records to delete */\n\n.merge-delete-card {\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error-border);\n border-radius: 8px;\n}\n\n.merge-delete-label {\n font-size: 0.65rem;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-status-error-text);\n margin-bottom: 6px;\n}\n\n.merge-delete-label i {\n margin-right: 4px;\n}\n\n.merge-delete-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 5px 0;\n font-size: 0.78rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.merge-delete-item:last-child {\n border-bottom: none;\n}\n\n.merge-delete-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.merge-delete-deps {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n/* Confirm footer */\n\n.merge-confirm-footer {\n padding: 14px 24px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n}\n\n.cancel-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n\n.cancel-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.confirm-merge-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.confirm-merge-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.confirm-merge-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* ---- Responsive: Merge Confirm ---- */\n\n@media (max-width: 600px) {\n .merge-confirm-panel {\n width: 100%;\n }\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 Merge Disabled Hint \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.merge-disabled-hint {\n font-size: 11.5px;\n color: var(--mj-status-warning-text, #e65100);\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-left: 4px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 Merge Warning Banner (inline, non-blocking) \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.merge-warning-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n margin-bottom: 12px;\n border-radius: 6px;\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border: 1px solid var(--mj-status-warning-border);\n font-size: 13px;\n font-weight: 500;\n flex-shrink: 0;\n}\n\n.merge-warning-banner i {\n font-size: 14px;\n flex-shrink: 0;\n}\n"] }]
|
|
2967
|
+
args: [{ standalone: false, selector: 'app-duplicate-detection-resource', encapsulation: ViewEncapsulation.None, template: "<mj-page-layout>\n <mj-page-header\n Title=\"Record Duplicates\"\n Icon=\"fa-solid fa-clone\"\n Subtitle=\"Find and merge near-duplicate entity records using semantic similarity\">\n <div actions>\n <select class=\"mj-input kh-doc-select\"\n [(ngModel)]=\"SelectedEntityDocumentID\"\n [disabled]=\"IsDetecting\">\n <option value=\"\">Select entity document\u2026</option>\n @for (doc of EntityDocuments; track doc.ID) {\n <option [value]=\"doc.ID\">{{ doc.Name }} ({{ doc.EntityName }})</option>\n }\n </select>\n <button mjButton variant=\"primary\" size=\"sm\"\n (click)=\"RunDetection()\"\n [disabled]=\"IsDetecting || !SelectedEntityDocumentID\">\n @if (IsDetecting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> <span class=\"action-btn-label\">Detecting\u2026</span>\n } @else {\n <i class=\"fa-solid fa-magnifying-glass\"></i> <span class=\"action-btn-label\">Run Detection</span>\n }\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\">\n <!-- Detection Progress (visible during run) -->\n @if (IsDetecting) {\n <div class=\"detection-progress-section\">\n <div class=\"progress-header\">\n <span class=\"progress-stage\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ DetectionStage }}\n </span>\n <span class=\"progress-percent\">{{ DetectionProgress }}%</span>\n </div>\n <div class=\"progress-bar-track\">\n <div class=\"progress-bar-fill\" [style.width.%]=\"DetectionProgress\"></div>\n </div>\n @if (DetectionCurrentItem) {\n <span class=\"progress-current-item\">{{ DetectionCurrentItem }}</span>\n }\n </div>\n }\n\n <!-- Threshold Controls (when entity doc selected) -->\n @if (SelectedDocumentThresholds) {\n <div class=\"threshold-controls\">\n <div class=\"threshold-slider-group\">\n <label class=\"threshold-label\">\n <i class=\"fa-solid fa-adjust\"></i>\n Potential Match\n <span class=\"threshold-value\">{{ (RunPotentialThreshold * 100).toFixed(0) }}%</span>\n </label>\n <input type=\"range\" class=\"threshold-slider\"\n [min]=\"30\" [max]=\"99\" [step]=\"1\"\n [value]=\"RunPotentialThreshold * 100\"\n (input)=\"OnPotentialThresholdChanged($any($event.target).value / 100)\"\n [disabled]=\"IsDetecting\" />\n <span class=\"threshold-hint\">Score above which duplicates are flagged for review</span>\n </div>\n <div class=\"threshold-slider-group\">\n <label class=\"threshold-label\">\n <i class=\"fa-solid fa-bullseye\"></i>\n Absolute Match\n <span class=\"threshold-value\">{{ (RunAbsoluteThreshold * 100).toFixed(0) }}%</span>\n </label>\n <input type=\"range\" class=\"threshold-slider\"\n [min]=\"50\" [max]=\"100\" [step]=\"1\"\n [value]=\"RunAbsoluteThreshold * 100\"\n (input)=\"OnAbsoluteThresholdChanged($any($event.target).value / 100)\"\n [disabled]=\"IsDetecting\" />\n <span class=\"threshold-hint\">Score above which duplicates are auto-confirmed</span>\n </div>\n </div>\n }\n\n <!-- KPI Strip -->\n <div class=\"kpi-strip\">\n <div class=\"kpi-card\">\n <div class=\"kpi-value\">{{ TotalGroupCount }}</div>\n <div class=\"kpi-label\">Total Groups</div>\n </div>\n <div class=\"kpi-card kpi-pending\">\n <div class=\"kpi-value\">{{ PendingCount }}</div>\n <div class=\"kpi-label\">Pending</div>\n </div>\n <div class=\"kpi-card kpi-approved\">\n <div class=\"kpi-value\">{{ ApprovedCount }}</div>\n <div class=\"kpi-label\">Approved</div>\n </div>\n <div class=\"kpi-card kpi-rejected\">\n <div class=\"kpi-value\">{{ RejectedCount }}</div>\n <div class=\"kpi-label\">Rejected</div>\n </div>\n </div>\n\n <!-- Filter Bar -->\n <div class=\"filter-bar\">\n <div class=\"filter-group\">\n <select class=\"filter-select\"\n [(ngModel)]=\"Filters.EntityName\"\n (ngModelChange)=\"OnFilterChange()\"\n [disabled]=\"EntityNames.length <= 1\">\n @if (EntityNames.length > 1) {\n <option value=\"\">All Entities</option>\n }\n @for (name of EntityNames; track name) {\n <option [value]=\"name\">{{ name }}</option>\n }\n </select>\n\n <div class=\"filter-range\">\n <label class=\"filter-label\">Min Score</label>\n <input type=\"number\"\n class=\"filter-input filter-input-score\"\n min=\"0\" max=\"1\" step=\"0.05\"\n [placeholder]=\"DataMinScore\"\n [(ngModel)]=\"Filters.MinScore\"\n (ngModelChange)=\"OnFilterChange()\">\n </div>\n\n <div class=\"filter-range\">\n <label class=\"filter-label\">Max Score</label>\n <input type=\"number\"\n class=\"filter-input filter-input-score\"\n min=\"0\" max=\"1\" step=\"0.05\"\n [placeholder]=\"DataMaxScore\"\n [(ngModel)]=\"Filters.MaxScore\"\n (ngModelChange)=\"OnFilterChange()\">\n </div>\n\n <div class=\"filter-range\">\n <label class=\"filter-label\">From</label>\n <input type=\"date\"\n class=\"filter-input filter-input-date\"\n [min]=\"DataMinDate\" [max]=\"DataMaxDate\"\n [(ngModel)]=\"Filters.DateFrom\"\n (ngModelChange)=\"OnFilterChange()\">\n </div>\n\n <div class=\"filter-range\">\n <label class=\"filter-label\">To</label>\n <input type=\"date\"\n class=\"filter-input filter-input-date\"\n [min]=\"DataMinDate\" [max]=\"DataMaxDate\"\n [(ngModel)]=\"Filters.DateTo\"\n (ngModelChange)=\"OnFilterChange()\">\n </div>\n </div>\n\n @if (HasActiveFilters) {\n <button class=\"clear-filters-btn\" (click)=\"ClearFilters()\">\n <i class=\"fa-solid fa-times\"></i> Clear Filters\n </button>\n }\n </div>\n\n <!-- Merge Warning Banner (non-blocking, shown when entity lacks AllowRecordMerge) -->\n @if (ShowMergeWarningBanner) {\n <div class=\"merge-warning-banner\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n Merging is not available for this entity. Detection results are read-only.\n </div>\n }\n\n <!-- Content -->\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading duplicate detection results...\"></mj-loading>\n </div>\n } @else if (IsLoadingResults) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading duplicate detection results...\"></mj-loading>\n </div>\n } @else if (TotalGroupCount === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-clone empty-icon\"></i>\n <p class=\"empty-text\">No duplicate detection results found.</p>\n <p class=\"empty-subtext\">Select an entity document and click \"Run Detection\" to start.</p>\n </div>\n } @else {\n <!-- Kanban Board -->\n <div class=\"kanban-board\">\n <!-- Pending Column -->\n <div class=\"kanban-column\" [class.drop-target-active]=\"DragOverColumn === 'Pending' && DraggedGroup?.ApprovalStatus !== 'Pending'\">\n <div class=\"column-header column-header-pending\">\n <i class=\"fa-solid fa-clock\"></i>\n <span class=\"column-title\">Pending Review</span>\n <span class=\"column-count\">{{ PendingCount }}</span>\n </div>\n <div class=\"column-body\"\n (dragover)=\"OnDragOver($event, 'Pending')\"\n (dragleave)=\"OnDragLeave($event, 'Pending')\"\n (drop)=\"OnDrop($event, 'Pending')\">\n @for (group of PendingGroups; track group.DetailId) {\n <div class=\"kanban-card\"\n draggable=\"true\"\n (dragstart)=\"OnDragStart($event, group)\"\n (dragend)=\"OnDragEnd()\"\n (click)=\"OpenComparison(group)\">\n <div class=\"card-header\">\n <div class=\"card-header-left\">\n <div class=\"card-icon\">\n <i [class]=\"group.EntityIcon\"></i>\n </div>\n <div class=\"card-title-block\">\n <div class=\"card-record-name\" [title]=\"group.RecordName\">{{ group.RecordName }}</div>\n <span class=\"entity-badge\">{{ group.EntityName }}</span>\n </div>\n </div>\n <span class=\"score-indicator\" [class]=\"GetScoreClass(group.HighestScore)\">\n {{ (group.HighestScore * 100).toFixed(0) }}%\n </span>\n </div>\n <div class=\"card-body\">\n @if (group.TopMatchSummaries.length > 0) {\n <div class=\"match-summaries\">\n @for (ms of group.TopMatchSummaries; track ms.Name) {\n <div class=\"match-summary-row\">\n <span class=\"match-score\">{{ (ms.Score * 100).toFixed(0) }}%</span>\n <span class=\"match-name\">{{ ms.Name }}</span>\n </div>\n }\n @if (group.MatchCount > group.TopMatchSummaries.length) {\n <div class=\"match-summary-more\">+{{ group.MatchCount - group.TopMatchSummaries.length }} more</div>\n }\n </div>\n }\n <div class=\"card-meta-row\">\n <span class=\"card-meta-item\">\n <i class=\"fa-solid fa-layer-group\"></i>\n {{ group.MatchCount }} match{{ group.MatchCount !== 1 ? 'es' : '' }}\n </span>\n <span class=\"card-meta-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n {{ FormatDate(group.MatchedAt) }}\n </span>\n </div>\n </div>\n <div class=\"card-actions\">\n <button class=\"action-btn approve-btn\"\n [disabled]=\"IsSaving\"\n (click)=\"ApproveMatch(group); $event.stopPropagation()\">\n <i class=\"fa-solid fa-check\"></i> Approve\n </button>\n <button class=\"action-btn reject-btn\"\n [disabled]=\"IsSaving\"\n (click)=\"RejectMatch(group); $event.stopPropagation()\">\n <i class=\"fa-solid fa-times\"></i> Reject\n </button>\n </div>\n </div>\n }\n @if (PendingGroups.length === 0) {\n <div class=\"column-empty\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>No pending items</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Approved Column -->\n <div class=\"kanban-column\" [class.drop-target-active]=\"DragOverColumn === 'Approved' && DraggedGroup?.ApprovalStatus !== 'Approved'\">\n <div class=\"column-header column-header-approved\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span class=\"column-title\">Approved</span>\n <span class=\"column-count\">{{ ApprovedCount }}</span>\n </div>\n <div class=\"column-body\"\n (dragover)=\"OnDragOver($event, 'Approved')\"\n (dragleave)=\"OnDragLeave($event, 'Approved')\"\n (drop)=\"OnDrop($event, 'Approved')\">\n @for (group of ApprovedGroups; track group.DetailId) {\n <div class=\"kanban-card\"\n draggable=\"true\"\n (dragstart)=\"OnDragStart($event, group)\"\n (dragend)=\"OnDragEnd()\"\n (click)=\"OpenComparison(group)\">\n <div class=\"card-header\">\n <div class=\"card-header-left\">\n <div class=\"card-icon\">\n <i [class]=\"group.EntityIcon\"></i>\n </div>\n <div class=\"card-title-block\">\n <div class=\"card-record-name\" [title]=\"group.RecordName\">{{ group.RecordName }}</div>\n <span class=\"entity-badge\">{{ group.EntityName }}</span>\n </div>\n </div>\n <span class=\"score-indicator\" [class]=\"GetScoreClass(group.HighestScore)\">\n {{ (group.HighestScore * 100).toFixed(0) }}%\n </span>\n </div>\n <div class=\"card-body\">\n @if (group.TopMatchSummaries.length > 0) {\n <div class=\"match-summaries\">\n @for (ms of group.TopMatchSummaries; track ms.Name) {\n <div class=\"match-summary-row\">\n <span class=\"match-score\">{{ (ms.Score * 100).toFixed(0) }}%</span>\n <span class=\"match-name\">{{ ms.Name }}</span>\n </div>\n }\n @if (group.MatchCount > group.TopMatchSummaries.length) {\n <div class=\"match-summary-more\">+{{ group.MatchCount - group.TopMatchSummaries.length }} more</div>\n }\n </div>\n }\n <div class=\"card-meta-row\">\n <span class=\"card-meta-item\">\n <i class=\"fa-solid fa-layer-group\"></i>\n {{ group.MatchCount }} match{{ group.MatchCount !== 1 ? 'es' : '' }}\n </span>\n <span class=\"card-meta-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n {{ FormatDate(group.MatchedAt) }}\n </span>\n </div>\n </div>\n </div>\n }\n @if (ApprovedGroups.length === 0) {\n <div class=\"column-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No approved items</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Rejected Column -->\n <div class=\"kanban-column\" [class.drop-target-active]=\"DragOverColumn === 'Rejected' && DraggedGroup?.ApprovalStatus !== 'Rejected'\">\n <div class=\"column-header column-header-rejected\">\n <i class=\"fa-solid fa-ban\"></i>\n <span class=\"column-title\">Rejected</span>\n <span class=\"column-count\">{{ RejectedCount }}</span>\n </div>\n <div class=\"column-body\"\n (dragover)=\"OnDragOver($event, 'Rejected')\"\n (dragleave)=\"OnDragLeave($event, 'Rejected')\"\n (drop)=\"OnDrop($event, 'Rejected')\">\n @for (group of RejectedGroups; track group.DetailId) {\n <div class=\"kanban-card\"\n draggable=\"true\"\n (dragstart)=\"OnDragStart($event, group)\"\n (dragend)=\"OnDragEnd()\"\n (click)=\"OpenComparison(group)\">\n <div class=\"card-header\">\n <div class=\"card-header-left\">\n <div class=\"card-icon\">\n <i [class]=\"group.EntityIcon\"></i>\n </div>\n <div class=\"card-title-block\">\n <div class=\"card-record-name\" [title]=\"group.RecordName\">{{ group.RecordName }}</div>\n <span class=\"entity-badge\">{{ group.EntityName }}</span>\n </div>\n </div>\n <span class=\"score-indicator\" [class]=\"GetScoreClass(group.HighestScore)\">\n {{ (group.HighestScore * 100).toFixed(0) }}%\n </span>\n </div>\n <div class=\"card-body\">\n @if (group.TopMatchSummaries.length > 0) {\n <div class=\"match-summaries\">\n @for (ms of group.TopMatchSummaries; track ms.Name) {\n <div class=\"match-summary-row\">\n <span class=\"match-score\">{{ (ms.Score * 100).toFixed(0) }}%</span>\n <span class=\"match-name\">{{ ms.Name }}</span>\n </div>\n }\n @if (group.MatchCount > group.TopMatchSummaries.length) {\n <div class=\"match-summary-more\">+{{ group.MatchCount - group.TopMatchSummaries.length }} more</div>\n }\n </div>\n }\n <div class=\"card-meta-row\">\n <span class=\"card-meta-item\">\n <i class=\"fa-solid fa-layer-group\"></i>\n {{ group.MatchCount }} match{{ group.MatchCount !== 1 ? 'es' : '' }}\n </span>\n <span class=\"card-meta-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n {{ FormatDate(group.MatchedAt) }}\n </span>\n </div>\n </div>\n </div>\n }\n @if (RejectedGroups.length === 0) {\n <div class=\"column-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No rejected items</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Saving overlay -->\n @if (IsSaving) {\n <div class=\"saving-overlay\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n }\n\n <!-- \u2550\u2550\u2550 Comparison Slide-In Panel \u2550\u2550\u2550 -->\n @if (ComparisonGroup) {\n <div class=\"slide-backdrop\" [class.comparison-closing]=\"ComparisonClosing\" (click)=\"CloseComparison()\"></div>\n <div class=\"comparison-panel\" [class.comparison-closing]=\"ComparisonClosing\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"comparison-header\">\n <div class=\"comparison-header-left\">\n <div class=\"comparison-entity-icon\">\n <i [class]=\"ComparisonGroup.EntityIcon\"></i>\n </div>\n <div>\n <div class=\"comparison-title\">{{ ComparisonGroup.RecordName }}</div>\n <span class=\"comparison-entity-badge\">{{ ComparisonGroup.EntityName }}</span>\n <span class=\"comparison-match-count\">\n {{ ComparisonGroup.MatchCount }} potential duplicate{{ ComparisonGroup.MatchCount !== 1 ? 's' : '' }}\n </span>\n </div>\n </div>\n <div class=\"comparison-header-right\">\n <div class=\"comparison-toggle\">\n <button class=\"toggle-btn\" [class.toggle-active]=\"ComparisonShowAllFields\"\n (click)=\"ComparisonShowAllFields = true\">All Fields</button>\n <button class=\"toggle-btn\" [class.toggle-active]=\"!ComparisonShowAllFields\"\n (click)=\"ComparisonShowAllFields = false\">Differences Only</button>\n </div>\n <button class=\"comparison-close-btn\" (click)=\"CloseComparison()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n\n <!-- Grid -->\n @if (ComparisonLoading) {\n <div class=\"comparison-loading\">\n <mj-loading text=\"Loading records for comparison...\" size=\"medium\"></mj-loading>\n </div>\n }\n <div class=\"comparison-grid-wrapper\" [hidden]=\"ComparisonLoading\">\n <div class=\"comparison-grid\"\n [style.grid-template-columns]=\"'160px repeat(' + (1 + ComparisonMatches.length) + ', minmax(180px, 1fr))'\">\n\n <!-- Corner cell -->\n <div class=\"grid-corner-cell\">Field</div>\n\n <!-- Source column header -->\n <div class=\"grid-col-header grid-col-source\">\n <span class=\"col-header-label\">Source</span>\n <span class=\"col-header-name\">{{ ComparisonGroup.RecordName }}</span>\n <div class=\"surviving-selector\">\n <input type=\"radio\" name=\"survivor\" class=\"surviving-radio\"\n [checked]=\"SurvivorColumnIndex === 0\"\n (change)=\"SetSurvivor(0)\">\n <span class=\"surviving-label\" [class.is-survivor]=\"SurvivorColumnIndex === 0\">\n {{ SurvivorColumnIndex === 0 ? 'Surviving Record' : 'Set as survivor' }}\n </span>\n </div>\n <button class=\"use-all-btn\" [class.all-selected]=\"AllFieldsSelectedFrom(0)\"\n (click)=\"UseAllFieldsFrom(0)\">\n <i class=\"fa-solid\" [class.fa-check-double]=\"AllFieldsSelectedFrom(0)\" [class.fa-clone]=\"!AllFieldsSelectedFrom(0)\"></i>\n {{ AllFieldsSelectedFrom(0) ? 'Using all fields' : 'Use all fields' }}\n </button>\n <!-- Dependencies Summary -->\n <div class=\"deps-summary\">\n <div class=\"deps-total\">\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"deps-total-number\">{{ GetTotalDeps(0) }}</span>\n {{ GetTotalDeps(0) === 1 ? 'dependency' : 'dependencies' }}\n @if (GetMaxDepsColumnIndex() === 0 && GetTotalDeps(0) > 0) {\n <span class=\"deps-total-recommended\"><i class=\"fa-solid fa-star\"></i> Most deps</span>\n }\n </div>\n @if (GetGroupedDeps(0).length > 0) {\n <div class=\"deps-header\" (click)=\"ToggleDepsExpanded(0)\">\n <span>{{ IsDepsExpanded(0) ? 'Hide details' : 'Show details' }}</span>\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!IsDepsExpanded(0)\" [class.fa-chevron-up]=\"IsDepsExpanded(0)\"></i>\n </div>\n @if (IsDepsExpanded(0)) {\n <div class=\"deps-detail-list\">\n @for (dep of GetGroupedDeps(0); track dep.Entity) {\n <div class=\"deps-detail-group\">\n <div class=\"deps-detail-row\" (click)=\"ToggleDepEntityGroup(0, dep.Entity); $event.stopPropagation()\">\n <span class=\"deps-detail-entity\">\n <i class=\"fa-solid deps-expand-icon\"\n [class.fa-chevron-right]=\"!IsDepEntityGroupExpanded(0, dep.Entity)\"\n [class.fa-chevron-down]=\"IsDepEntityGroupExpanded(0, dep.Entity)\"></i>\n {{ dep.Entity }}\n </span>\n <span class=\"deps-detail-count\">{{ dep.Count }}</span>\n </div>\n @if (IsDepEntityGroupExpanded(0, dep.Entity)) {\n <div class=\"deps-records-list\">\n @if (IsDepRecordsLoading(0, dep.Entity)) {\n <div class=\"deps-record-loading\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...</div>\n }\n @for (record of GetDepRecords(0, dep.Entity); track $index) {\n <div class=\"deps-record-row\" (click)=\"OpenDepRecord(record); $event.stopPropagation()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square deps-record-icon\"></i>\n <span class=\"deps-record-name\">{{ record.Name }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n\n <!-- Match column headers -->\n @for (match of ComparisonMatches; track match.Match.ID; let mi = $index) {\n <div class=\"grid-col-header\"\n [class.match-approved]=\"match.Match.ApprovalStatus === 'Approved'\"\n [class.match-rejected]=\"match.Match.ApprovalStatus === 'Rejected'\">\n <div class=\"col-header-top\">\n <span class=\"col-header-name\">{{ match.Name }}</span>\n <span class=\"score-indicator\" [class]=\"GetScoreClass(match.Score)\">\n {{ (match.Score * 100).toFixed(0) }}%\n </span>\n </div>\n <span class=\"col-header-diff-count\">{{ match.DiffCount }} difference{{ match.DiffCount !== 1 ? 's' : '' }}</span>\n <div class=\"surviving-selector\">\n <input type=\"radio\" name=\"survivor\" class=\"surviving-radio\"\n [checked]=\"SurvivorColumnIndex === mi + 1\"\n (change)=\"SetSurvivor(mi + 1)\">\n <span class=\"surviving-label\" [class.is-survivor]=\"SurvivorColumnIndex === mi + 1\">\n {{ SurvivorColumnIndex === mi + 1 ? 'Surviving Record' : 'Set as survivor' }}\n </span>\n </div>\n <button class=\"use-all-btn\" [class.all-selected]=\"AllFieldsSelectedFrom(mi + 1)\"\n (click)=\"UseAllFieldsFrom(mi + 1)\">\n <i class=\"fa-solid\" [class.fa-check-double]=\"AllFieldsSelectedFrom(mi + 1)\" [class.fa-clone]=\"!AllFieldsSelectedFrom(mi + 1)\"></i>\n {{ AllFieldsSelectedFrom(mi + 1) ? 'Using all fields' : 'Use all fields' }}\n </button>\n <!-- Dependencies Summary -->\n <div class=\"deps-summary\">\n <div class=\"deps-total\">\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"deps-total-number\">{{ GetTotalDeps(mi + 1) }}</span>\n {{ GetTotalDeps(mi + 1) === 1 ? 'dependency' : 'dependencies' }}\n @if (GetMaxDepsColumnIndex() === mi + 1 && GetTotalDeps(mi + 1) > 0) {\n <span class=\"deps-total-recommended\"><i class=\"fa-solid fa-star\"></i> Most deps</span>\n }\n </div>\n @if (GetGroupedDeps(mi + 1).length > 0) {\n <div class=\"deps-header\" (click)=\"ToggleDepsExpanded(mi + 1)\">\n <span>{{ IsDepsExpanded(mi + 1) ? 'Hide details' : 'Show details' }}</span>\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!IsDepsExpanded(mi + 1)\" [class.fa-chevron-up]=\"IsDepsExpanded(mi + 1)\"></i>\n </div>\n @if (IsDepsExpanded(mi + 1)) {\n <div class=\"deps-detail-list\">\n @for (dep of GetGroupedDeps(mi + 1); track dep.Entity) {\n <div class=\"deps-detail-group\">\n <div class=\"deps-detail-row\" (click)=\"ToggleDepEntityGroup(mi + 1, dep.Entity); $event.stopPropagation()\">\n <span class=\"deps-detail-entity\">\n <i class=\"fa-solid deps-expand-icon\"\n [class.fa-chevron-right]=\"!IsDepEntityGroupExpanded(mi + 1, dep.Entity)\"\n [class.fa-chevron-down]=\"IsDepEntityGroupExpanded(mi + 1, dep.Entity)\"></i>\n {{ dep.Entity }}\n </span>\n <span class=\"deps-detail-count\">{{ dep.Count }}</span>\n </div>\n @if (IsDepEntityGroupExpanded(mi + 1, dep.Entity)) {\n <div class=\"deps-records-list\">\n @if (IsDepRecordsLoading(mi + 1, dep.Entity)) {\n <div class=\"deps-record-loading\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...</div>\n }\n @for (record of GetDepRecords(mi + 1, dep.Entity); track $index) {\n <div class=\"deps-record-row\" (click)=\"OpenDepRecord(record); $event.stopPropagation()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square deps-record-icon\"></i>\n <span class=\"deps-record-name\">{{ record.Name }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n <!-- Per-match approval actions -->\n <div class=\"match-approval-actions\">\n @if (match.Match.ApprovalStatus === 'Pending') {\n <button class=\"match-action-btn match-skip-btn\"\n title=\"Skip this match (exclude from merge)\"\n (click)=\"RejectIndividualMatch(match)\">\n <i class=\"fa-solid fa-ban\"></i> Skip\n </button>\n } @else {\n <span class=\"match-status-badge\"\n [class.status-approved]=\"match.Match.ApprovalStatus === 'Approved'\"\n [class.status-rejected]=\"match.Match.ApprovalStatus === 'Rejected'\">\n <i class=\"fa-solid\" [class.fa-check]=\"match.Match.ApprovalStatus === 'Approved'\"\n [class.fa-times]=\"match.Match.ApprovalStatus === 'Rejected'\"></i>\n {{ match.Match.ApprovalStatus === 'Rejected' ? 'Skipped' : match.Match.ApprovalStatus }}\n </span>\n @if (match.Match.ApprovalStatus === 'Rejected') {\n <button class=\"match-action-btn match-undo-btn\"\n title=\"Undo skip\"\n (click)=\"UndoRejectIndividualMatch(match)\">\n <i class=\"fa-solid fa-undo\"></i> Undo\n </button>\n }\n }\n </div>\n </div>\n }\n\n <!-- Field rows -->\n @for (field of GetVisibleFields(); track field.FieldName; let odd = $odd) {\n <!-- Label cell -->\n <div class=\"grid-label-cell\" [class.grid-row-odd]=\"odd\">\n {{ field.DisplayName }}\n </div>\n <!-- Source value cell -->\n <div class=\"grid-value-cell grid-source-cell\"\n [class.grid-row-odd]=\"odd\"\n [class.has-diff-in-row]=\"field.HasDifference\"\n [class.field-selected]=\"field.SelectedColumnIndex === 0\"\n (click)=\"SelectFieldValue(field, 0)\">\n @if (field.SourceValue != null) {\n {{ field.SourceValue }}\n } @else {\n <span class=\"field-not-available\">(not available)</span>\n }\n @if (field.HasDifference || field.SelectedColumnIndex === 0) {\n <input type=\"radio\" [name]=\"'field-' + field.FieldName\" class=\"field-select-radio\"\n [checked]=\"field.SelectedColumnIndex === 0\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"SelectFieldValue(field, 0)\">\n }\n </div>\n <!-- Match value cells -->\n @for (matchVal of field.MatchValues; track $index; let mi = $index) {\n <div class=\"grid-value-cell\"\n [class.grid-row-odd]=\"odd\"\n [class.value-same]=\"AreValuesEqual(field.SourceValue, matchVal)\"\n [class.value-different]=\"matchVal != null && field.SourceValue != null && !AreValuesEqual(field.SourceValue, matchVal)\"\n [class.field-selected]=\"field.SelectedColumnIndex === mi + 1\"\n (click)=\"matchVal != null ? SelectFieldValue(field, mi + 1) : null\">\n @if (matchVal != null) {\n {{ matchVal }}\n @if (field.HasDifference || field.SelectedColumnIndex === mi + 1) {\n <input type=\"radio\" [name]=\"'field-' + field.FieldName\" class=\"field-select-radio\"\n [checked]=\"field.SelectedColumnIndex === mi + 1\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"SelectFieldValue(field, mi + 1)\">\n }\n } @else {\n <span class=\"field-not-available\">(not available)</span>\n }\n </div>\n }\n }\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"comparison-footer\">\n <div class=\"comparison-footer-left\">\n <span class=\"comparison-summary\">\n Showing {{ GetVisibleFields().length }} of {{ ComparisonFields.length }} fields\n </span>\n <span class=\"merge-summary\">\n <i class=\"fa-solid fa-code-merge\"></i>\n Surviving: <strong>{{ SurvivorName() }}</strong>\n @if (CherryPickedCount() > 0) {\n · {{ CherryPickedCount() }} field{{ CherryPickedCount() !== 1 ? 's' : '' }} cherry-picked\n }\n </span>\n </div>\n <div class=\"comparison-footer-right\">\n <button class=\"action-btn reject-btn\" [disabled]=\"IsSaving\"\n (click)=\"RejectMatch(ComparisonGroup!); CloseComparison()\">\n <i class=\"fa-solid fa-times\"></i> Reject All\n </button>\n <button class=\"action-btn merge-btn\" [disabled]=\"IsSaving || !HasMergeableMatches || !MergeEnabled\"\n (click)=\"OpenMergeConfirm()\"\n [title]=\"!MergeEnabled ? 'Merging is not enabled for this entity' : HasMergeableMatches ? 'Merge non-skipped records' : 'All matches have been skipped'\">\n <i class=\"fa-solid fa-code-merge\"></i> Merge Records\n </button>\n @if (!MergeEnabled) {\n <span class=\"merge-disabled-hint\"><i class=\"fa-solid fa-info-circle\"></i> Merging disabled for this entity</span>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- \u2550\u2550\u2550 Merge Confirmation Panel \u2550\u2550\u2550 -->\n @if (ShowMergeConfirm && ComparisonGroup) {\n <div class=\"merge-confirm-backdrop\" (click)=\"CloseMergeConfirm()\">\n <div class=\"merge-confirm-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"merge-confirm-header\">\n <div class=\"merge-confirm-icon\"><i class=\"fa-solid fa-code-merge\"></i></div>\n <div>\n <div class=\"merge-confirm-title\">Confirm Record Merge</div>\n <div class=\"merge-confirm-subtitle\">This action cannot be undone. Please review carefully.</div>\n </div>\n </div>\n\n <div class=\"merge-confirm-body\">\n <!-- Surviving Record -->\n <div class=\"merge-survivor-card\">\n <div class=\"merge-survivor-label\"><i class=\"fa-solid fa-shield-halved\"></i> Surviving Record</div>\n <div class=\"merge-survivor-name\">{{ SurvivorName() }}</div>\n <div class=\"merge-survivor-pk\">\n <i class=\"fa-solid fa-key\"></i>\n {{ SurvivorKeyDisplay() }}\n </div>\n <div class=\"merge-survivor-detail\">This record's ID will be retained. All dependencies from merged records will be transferred here.</div>\n </div>\n\n <!-- Cherry-picked field overrides -->\n @if (GetCherryPickedFields().length > 0) {\n <div>\n <div class=\"merge-section-label\">Field Value Overrides ({{ GetCherryPickedFields().length }} field{{ GetCherryPickedFields().length !== 1 ? 's' : '' }})</div>\n @for (field of GetCherryPickedFields(); track field.FieldName) {\n <div class=\"merge-field-override\">\n <span class=\"merge-field-name\">{{ field.DisplayName }}</span>\n <span class=\"merge-field-value\">\"{{ field.Value }}\"</span>\n <span class=\"merge-field-source\">from {{ field.SourceName }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Dependency transfer -->\n @if (GetNonSurvivorColumns().length > 0) {\n <div class=\"merge-deps-transfer\">\n <div class=\"merge-deps-transfer-label\"><i class=\"fa-solid fa-arrow-right-arrow-left\"></i> Dependencies to Transfer</div>\n @for (col of GetNonSurvivorColumns(); track col.ColumnIndex) {\n <div class=\"merge-deps-transfer-row\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n <span>\n @if (col.DepCount > 0) {\n <strong>{{ col.DepCount }}</strong> {{ col.DepCount === 1 ? 'dependency' : 'dependencies' }} from <strong>{{ col.Name }}</strong> → {{ SurvivorName() }}\n } @else {\n <strong>0</strong> dependencies from <strong>{{ col.Name }}</strong>\n }\n </span>\n </div>\n }\n </div>\n }\n\n <!-- Records to be deleted -->\n <div class=\"merge-delete-card\">\n <div class=\"merge-delete-label\"><i class=\"fa-solid fa-trash\"></i> Records to Delete After Merge</div>\n @for (col of GetNonSurvivorColumns(); track col.ColumnIndex) {\n <div class=\"merge-delete-item\">\n <span class=\"merge-delete-name\">{{ col.Name }}</span>\n <span class=\"merge-delete-deps\">\n @if (col.DepCount > 0) {\n {{ col.DepCount }} dep{{ col.DepCount !== 1 ? 's' : '' }} transferring\n } @else {\n no deps\n }\n </span>\n </div>\n }\n </div>\n </div>\n\n <div class=\"merge-confirm-footer\">\n <button class=\"action-btn cancel-btn\" (click)=\"CloseMergeConfirm()\" [disabled]=\"IsMerging\">\n <i class=\"fa-solid fa-arrow-left\"></i> Back\n </button>\n <button class=\"action-btn confirm-merge-btn\" (click)=\"ExecuteMerge()\" [disabled]=\"IsMerging\">\n @if (IsMerging) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging...\n } @else {\n <i class=\"fa-solid fa-code-merge\"></i> Confirm Merge ({{ GetNonSurvivorColumns().length + 1 }} records → 1)\n }\n </button>\n </div>\n </div>\n </div>\n }\n\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* ============================================================\n Duplicate Detection Kanban Board - Resource Component Styles\n All colors use MJ design tokens (--mj-*) exclusively.\n ============================================================ */\n\napp-duplicate-detection-resource {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n\n/* Entity-document select used in the [actions] slot. */\n.kh-doc-select {\n width: auto;\n min-width: 220px;\n min-height: 32px;\n padding: 4px 28px 4px 12px;\n font-size: 0.8125rem;\n}\n\n/* ---- Detection Progress ---- */\n\n.detection-progress-section {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-brand-primary);\n border-radius: 8px;\n padding: 14px 18px;\n margin-bottom: 16px;\n flex-shrink: 0;\n}\n\n.progress-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.progress-stage {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n.progress-percent {\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.progress-bar-track {\n height: 6px;\n border-radius: 3px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n.progress-bar-fill {\n height: 100%;\n border-radius: 3px;\n background: var(--mj-brand-primary);\n transition: width 0.3s ease;\n}\n\n.progress-current-item {\n display: block;\n margin-top: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ---- Threshold Controls ---- */\n\n.threshold-controls {\n display: flex;\n gap: 24px;\n padding: 12px 16px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 6%, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-subtle);\n margin-bottom: 16px;\n flex-shrink: 0;\n}\n\n.threshold-slider-group {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.threshold-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.threshold-value {\n margin-left: auto;\n font-weight: 700;\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n.threshold-slider {\n width: 100%;\n height: 4px;\n appearance: none;\n -webkit-appearance: none;\n background: var(--mj-border-default);\n border-radius: 2px;\n outline: none;\n cursor: pointer;\n}\n\n.threshold-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: var(--mj-brand-primary);\n border: 2px solid var(--mj-bg-surface);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n cursor: pointer;\n}\n\n.threshold-slider::-moz-range-thumb {\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: var(--mj-brand-primary);\n border: 2px solid var(--mj-bg-surface);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n cursor: pointer;\n}\n\n.threshold-slider:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.threshold-hint {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n/* ---- Threshold Info (legacy) ---- */\n\n.threshold-info {\n display: flex;\n gap: 16px;\n padding: 8px 14px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-info) 8%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-info-border);\n margin-bottom: 16px;\n flex-shrink: 0;\n}\n\n.threshold-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-status-info-text);\n font-weight: 500;\n}\n\n.threshold-item i {\n font-size: 11px;\n}\n\n/* ---- KPI Strip ---- */\n\n.kpi-strip {\n display: flex;\n gap: 12px;\n margin-bottom: 16px;\n flex-shrink: 0;\n}\n\n.kpi-card {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.kpi-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1.2;\n}\n\n.kpi-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-top: 2px;\n}\n\n.kpi-pending .kpi-value {\n color: var(--mj-status-warning);\n}\n\n.kpi-approved .kpi-value {\n color: var(--mj-status-success);\n}\n\n.kpi-rejected .kpi-value {\n color: var(--mj-status-error);\n}\n\n/* ---- Filter Bar ---- */\n\n.filter-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 16px;\n flex-shrink: 0;\n}\n\n.filter-group {\n display: flex;\n align-items: flex-end;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.filter-select {\n height: 34px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n min-width: 160px;\n}\n\n.filter-select:focus {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.filter-range {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.filter-label {\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.filter-input {\n height: 34px;\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n width: 100px;\n}\n\n.filter-input-score {\n width: 80px;\n}\n\n.filter-input-date {\n width: 140px;\n}\n\n.filter-input:focus {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.clear-filters-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n height: 34px;\n padding: 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.clear-filters-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n/* ---- Loading & Empty States ---- */\n\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 200px;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 200px;\n gap: 8px;\n}\n\n.empty-icon {\n font-size: 48px;\n color: var(--mj-text-disabled);\n}\n\n.empty-text {\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.empty-subtext {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin: 0;\n}\n\n/* ---- Kanban Board ---- */\n\n.kanban-board {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n overflow-x: auto;\n}\n\n.kanban-column {\n flex: 1;\n min-width: 280px;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.column-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n flex-shrink: 0;\n}\n\n.column-header-pending {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface));\n}\n\n.column-header-pending i {\n color: var(--mj-status-warning);\n}\n\n.column-header-approved {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n}\n\n.column-header-approved i {\n color: var(--mj-status-success);\n}\n\n.column-header-rejected {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n}\n\n.column-header-rejected i {\n color: var(--mj-status-error);\n}\n\n.column-title {\n flex: 1;\n}\n\n.column-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n padding: 0 6px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.column-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.column-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 32px 16px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.column-empty i {\n font-size: 24px;\n}\n\n/* ---- Kanban Cards ---- */\n\n.kanban-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n transition: box-shadow 0.15s ease, border-color 0.15s ease;\n flex-shrink: 0; /* Prevent cards from shrinking \u2014 column scrolls instead */\n}\n\n.kanban-card:hover {\n border-color: var(--mj-border-strong);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n}\n\n/* Drag and Drop */\n.kanban-card[draggable=\"true\"] {\n cursor: grab;\n}\n\n.kanban-card[draggable=\"true\"]:active {\n cursor: grabbing;\n}\n\n.drop-target-active {\n outline: 2px dashed var(--mj-brand-primary);\n outline-offset: -2px;\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface-card)) !important;\n}\n\n.drop-target-active .column-body {\n min-height: 100px;\n}\n\n.card-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 10px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n gap: 8px;\n}\n\n.card-header-left {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n min-width: 0;\n flex: 1;\n}\n\n.card-icon {\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n flex-shrink: 0;\n}\n\n.card-title-block {\n min-width: 0;\n flex: 1;\n}\n\n.card-record-name {\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-bottom: 2px;\n}\n\n.entity-badge {\n display: inline-flex;\n align-items: center;\n padding: 1px 6px;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-muted);\n letter-spacing: 0.2px;\n}\n\n/* Score indicator colors */\n\n.score-indicator {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 40px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 700;\n}\n\n.score-high {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n border: 1px solid var(--mj-status-success-border);\n}\n\n.score-medium {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border: 1px solid var(--mj-status-warning-border);\n}\n\n.score-low {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n}\n\n.card-body {\n padding: 10px 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.match-summaries {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.match-summary-row {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n}\n\n.match-score {\n flex-shrink: 0;\n font-weight: 600;\n font-size: 11px;\n color: var(--mj-text-muted);\n min-width: 30px;\n}\n\n.match-name {\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.match-summary-more {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-style: italic;\n padding-left: 38px;\n}\n\n.card-meta-row {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n border-top: 1px solid var(--mj-border-subtle);\n padding-top: 6px;\n}\n\n.card-meta-item {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.card-meta-item i {\n font-size: 10px;\n}\n font-size: 12px;\n max-width: 180px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Comparison Slide-In Panel\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.slide-backdrop {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 9999;\n animation: fadeIn 0.2s ease;\n}\n\n.slide-backdrop.comparison-closing {\n animation: fadeOut 0.25s ease forwards;\n}\n\n@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n@keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }\n\n.comparison-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 82vw;\n max-width: 1300px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -8px 0 40px rgba(0,0,0,0.4);\n z-index: 10000;\n display: flex;\n flex-direction: column;\n animation: slideIn 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.comparison-panel.comparison-closing {\n animation: slideOut 0.25s cubic-bezier(0.4, 0, 0.2, 1) forwards;\n}\n\n@keyframes slideIn { from { transform: translateX(100%); } to { transform: translateX(0); } }\n@keyframes slideOut { from { transform: translateX(0); } to { transform: translateX(100%); } }\n\n/* Header */\n.comparison-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 12px;\n}\n\n.comparison-header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n\n.comparison-entity-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.comparison-title {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.comparison-entity-badge {\n display: inline-block;\n padding: 1px 7px;\n border-radius: 10px;\n font-size: 0.65rem;\n font-weight: 500;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n margin-right: 6px;\n}\n\n.comparison-match-count {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.comparison-header-right {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-shrink: 0;\n}\n\n/* Toggle */\n.comparison-toggle {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.toggle-btn {\n padding: 5px 12px;\n font-size: 0.7rem;\n font-weight: 500;\n border: none;\n cursor: pointer;\n transition: all 0.15s ease;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n}\n\n.toggle-btn:first-child {\n border-right: 1px solid var(--mj-border-default);\n}\n\n.toggle-btn.toggle-active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.comparison-close-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n transition: all 0.15s ease;\n}\n\n.comparison-close-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n/* Loading state */\n.comparison-loading {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Grid wrapper */\n.comparison-grid-wrapper {\n flex: 1;\n overflow: auto;\n min-height: 0;\n}\n\n/* Grid */\n.comparison-grid {\n display: grid;\n min-width: 100%;\n}\n\n.comparison-grid > div {\n padding: 8px 12px;\n font-size: 0.78rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n border-right: 1px solid var(--mj-border-subtle);\n}\n\n/* Corner cell */\n.grid-corner-cell {\n position: sticky;\n top: 0;\n left: 0;\n z-index: 4;\n background: var(--mj-bg-surface-elevated);\n font-size: 0.65rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: flex-end;\n padding-bottom: 6px;\n}\n\n/* Column headers */\n.grid-col-header {\n position: sticky;\n top: 0;\n z-index: 3;\n background: var(--mj-bg-surface-elevated);\n padding: 10px 12px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.grid-col-source {\n border-left: 3px solid var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface-elevated));\n}\n\n.col-header-label {\n font-size: 0.6rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-brand-primary);\n}\n\n.col-header-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n}\n\n.col-header-name {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.col-header-diff-count {\n font-size: 0.65rem;\n color: var(--mj-status-warning-text);\n}\n\n/* Surviving record selector */\n.surviving-selector {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n}\n\n.surviving-radio {\n appearance: none;\n width: 14px;\n height: 14px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.surviving-radio:checked {\n border-color: var(--mj-brand-primary);\n background: var(--mj-brand-primary);\n box-shadow: inset 0 0 0 2px var(--mj-bg-surface-elevated);\n}\n\n.surviving-label {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.surviving-label.is-survivor {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n/* Use all fields button */\n.use-all-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.62rem;\n cursor: pointer;\n transition: all 0.12s ease;\n margin-top: 2px;\n}\n\n.use-all-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.use-all-btn.all-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n/* Per-match actions */\n.comparison-match-actions {\n display: flex;\n gap: 4px;\n margin-top: 3px;\n}\n\n.action-btn-sm {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid;\n border-radius: 5px;\n cursor: pointer;\n font-size: 0.65rem;\n transition: all 0.15s ease;\n}\n\n.approve-btn-sm {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n border-color: var(--mj-status-success-border);\n}\n.approve-btn-sm:hover { background: rgba(34,197,94,0.25); }\n\n.reject-btn-sm {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border-color: var(--mj-status-error-border);\n}\n.reject-btn-sm:hover { background: rgba(239,68,68,0.25); }\n\n.match-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 0.68rem;\n font-weight: 500;\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.status-approved {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.status-rejected {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.match-approval-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 6px;\n}\n\n.match-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 10px;\n border-radius: 6px;\n font-size: 0.7rem;\n font-weight: 500;\n border: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.15s ease, border-color 0.15s ease;\n}\n\n.match-skip-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-border-default));\n}\n\n.match-skip-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error);\n}\n\n.match-undo-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n}\n\n.match-undo-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.match-approved {\n border-top: 3px solid var(--mj-status-success);\n}\n\n.match-rejected {\n border-top: 3px solid var(--mj-status-error);\n opacity: 0.6;\n}\n\n/* Label cells */\n.grid-label-cell {\n position: sticky;\n left: 0;\n z-index: 2;\n background: var(--mj-bg-surface);\n font-size: 0.72rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n}\n\n.grid-row-odd {\n background: color-mix(in srgb, var(--mj-bg-surface-sunken) 50%, var(--mj-bg-surface));\n}\n\n.grid-label-cell.grid-row-odd {\n background: color-mix(in srgb, var(--mj-bg-surface-sunken) 50%, var(--mj-bg-surface));\n}\n\n/* Value cells */\n.grid-value-cell {\n font-size: 0.78rem;\n color: var(--mj-text-primary);\n line-height: 1.45;\n word-break: break-word;\n position: relative;\n cursor: pointer;\n}\n\n.grid-source-cell {\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n border-left: 3px solid transparent;\n}\n\n.grid-source-cell.grid-row-odd {\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, color-mix(in srgb, var(--mj-bg-surface-sunken) 50%, var(--mj-bg-surface)));\n}\n\n.grid-source-cell.has-diff-in-row {\n font-weight: 600;\n}\n\n/* Diff highlighting */\n.value-same {\n color: var(--mj-text-muted);\n}\n\n.value-different {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent) !important;\n border-left: 3px solid var(--mj-status-warning);\n color: var(--mj-text-primary);\n}\n\n.field-not-available {\n font-style: italic;\n font-size: 0.72rem;\n color: var(--mj-text-disabled);\n}\n\n/* Field selection radio */\n.field-select-radio {\n position: absolute;\n top: 50%;\n right: 8px;\n transform: translateY(-50%);\n appearance: none;\n width: 16px;\n height: 16px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.12s ease;\n opacity: 0.4;\n}\n\n.field-select-radio:hover {\n opacity: 0.8;\n}\n\n.field-select-radio:checked {\n border-color: var(--mj-brand-primary);\n background: var(--mj-brand-primary);\n box-shadow: inset 0 0 0 2.5px var(--mj-bg-surface);\n opacity: 1;\n}\n\n.grid-value-cell.field-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)) !important;\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.grid-value-cell.field-selected .field-select-radio {\n opacity: 1;\n}\n\n/* Footer */\n.comparison-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.comparison-footer-left {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.comparison-summary {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.merge-summary {\n font-size: 0.72rem;\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.merge-summary i {\n font-size: 0.65rem;\n}\n\n.comparison-footer-right {\n display: flex;\n gap: 8px;\n}\n\n.comparison-footer-right .action-btn {\n flex: none;\n padding: 7px 14px;\n}\n\n.merge-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.merge-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.card-actions {\n display: flex;\n gap: 8px;\n padding: 10px 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.action-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n height: 32px;\n padding: 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s ease, border-color 0.15s ease;\n}\n\n.action-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.approve-btn {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n border-color: var(--mj-status-success-border);\n}\n\n.approve-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-success) 20%, var(--mj-bg-surface));\n}\n\n.reject-btn {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n border-color: var(--mj-status-error-border);\n}\n\n.reject-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n/* ---- Responsive ---- */\n\n@media (max-width: 768px) {\n .kanban-board {\n flex-direction: column;\n }\n\n .kanban-column {\n min-width: auto;\n max-height: 400px;\n }\n}\n\n@media (max-width: 480px) {\n .kpi-strip {\n flex-direction: column;\n }\n\n .filter-bar {\n flex-wrap: wrap;\n }\n\n .filter-group {\n flex-direction: column;\n align-items: stretch;\n width: 100%;\n }\n\n .filter-select {\n min-width: auto;\n width: 100%;\n }\n\n .filter-input {\n width: 100%;\n }\n\n .card-actions {\n flex-direction: column;\n }\n\n .action-btn {\n width: 100%;\n }\n}\n\n/* ---- Saving Overlay ---- */\n\n.saving-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-overlay);\n z-index: 10;\n border-radius: 8px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Dependencies Summary (in column headers)\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.deps-summary {\n margin-top: 6px;\n padding: 6px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 0.68rem;\n}\n\n.deps-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-weight: 600;\n}\n\n.deps-header i {\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n}\n\n.deps-header:hover {\n color: var(--mj-text-primary);\n}\n\n.deps-total {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 0.72rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.deps-total i {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.deps-total-number {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n padding: 0 6px;\n border-radius: 8px;\n font-size: 0.7rem;\n font-weight: 700;\n}\n\n.deps-total-recommended {\n font-size: 0.58rem;\n color: var(--mj-status-success-text);\n font-weight: 600;\n margin-left: 4px;\n}\n\n.deps-total-recommended i {\n color: var(--mj-status-success-text);\n}\n\n.deps-detail-list {\n margin-top: 4px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.deps-detail-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 3px 0;\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 3px;\n transition: background 0.1s ease;\n}\n\n.deps-detail-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.deps-detail-entity {\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-text-secondary);\n}\n\n.deps-expand-icon {\n font-size: 0.5rem;\n width: 10px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n/* Individual dependency records list */\n.deps-records-list {\n padding-left: 14px;\n margin-bottom: 2px;\n}\n\n.deps-record-row {\n display: flex;\n align-items: center;\n gap: 5px;\n padding: 2px 4px;\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 3px;\n transition: color 0.1s ease, background 0.1s ease;\n}\n\n.deps-record-row:hover {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.deps-record-icon {\n font-size: 0.5rem;\n flex-shrink: 0;\n}\n\n.deps-record-name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.6rem;\n}\n\n.deps-record-loading {\n padding: 3px 4px;\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n}\n\n.deps-record-loading i {\n margin-right: 4px;\n}\n\n.deps-detail-count {\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Merge Confirmation Panel\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.merge-confirm-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 20000;\n animation: fadeIn 0.2s ease;\n}\n\n.merge-confirm-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 520px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -8px 0 40px rgba(0, 0, 0, 0.4);\n z-index: 20001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: slideIn 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.merge-confirm-header {\n padding: 18px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.merge-confirm-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n font-size: 1.1rem;\n flex-shrink: 0;\n}\n\n.merge-confirm-title {\n font-size: 1.05rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.merge-confirm-subtitle {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.merge-confirm-body {\n padding: 20px 24px;\n overflow-y: auto;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* Surviving record card */\n\n.merge-survivor-card {\n padding: 14px;\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n border: 1px solid var(--mj-brand-primary);\n border-radius: 8px;\n}\n\n.merge-survivor-label {\n font-size: 0.65rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-brand-primary);\n margin-bottom: 4px;\n}\n\n.merge-survivor-label i {\n margin-right: 4px;\n}\n\n.merge-survivor-name {\n font-size: 0.95rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.merge-survivor-pk {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n padding: 4px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 0.68rem;\n font-family: monospace;\n color: var(--mj-text-secondary);\n}\n\n.merge-survivor-pk i {\n font-size: 0.6rem;\n color: var(--mj-brand-primary);\n}\n\n.merge-survivor-detail {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n margin-top: 4px;\n}\n\n/* Cherry-picked fields section */\n\n.merge-section-label {\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-bottom: 6px;\n}\n\n.merge-field-override {\n display: flex;\n align-items: baseline;\n gap: 8px;\n padding: 6px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.merge-field-name {\n font-weight: 600;\n color: var(--mj-text-secondary);\n min-width: 110px;\n flex-shrink: 0;\n}\n\n.merge-field-value {\n color: var(--mj-text-primary);\n}\n\n.merge-field-source {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-left: auto;\n white-space: nowrap;\n}\n\n/* Dependency transfer summary */\n\n.merge-deps-transfer {\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.merge-deps-transfer-label {\n font-size: 0.65rem;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-brand-primary);\n margin-bottom: 6px;\n}\n\n.merge-deps-transfer-label i {\n margin-right: 4px;\n}\n\n.merge-deps-transfer-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 3px 0;\n font-size: 0.75rem;\n color: var(--mj-text-secondary);\n}\n\n.merge-deps-transfer-row i {\n color: var(--mj-brand-primary);\n font-size: 0.65rem;\n width: 14px;\n text-align: center;\n}\n\n/* Records to delete */\n\n.merge-delete-card {\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error-border);\n border-radius: 8px;\n}\n\n.merge-delete-label {\n font-size: 0.65rem;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-status-error-text);\n margin-bottom: 6px;\n}\n\n.merge-delete-label i {\n margin-right: 4px;\n}\n\n.merge-delete-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 5px 0;\n font-size: 0.78rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.merge-delete-item:last-child {\n border-bottom: none;\n}\n\n.merge-delete-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.merge-delete-deps {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n/* Confirm footer */\n\n.merge-confirm-footer {\n padding: 14px 24px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n}\n\n.cancel-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n\n.cancel-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.confirm-merge-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.confirm-merge-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.confirm-merge-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* ---- Responsive: Merge Confirm ---- */\n\n@media (max-width: 600px) {\n .merge-confirm-panel {\n width: 100%;\n }\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 Merge Disabled Hint \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.merge-disabled-hint {\n font-size: 11.5px;\n color: var(--mj-status-warning-text, #e65100);\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-left: 4px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 Merge Warning Banner (inline, non-blocking) \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.merge-warning-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n margin-bottom: 12px;\n border-radius: 6px;\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border: 1px solid var(--mj-status-warning-border);\n font-size: 13px;\n font-weight: 500;\n flex-shrink: 0;\n}\n\n.merge-warning-banner i {\n font-size: 14px;\n flex-shrink: 0;\n}\n"] }]
|
|
2952
2968
|
}], null, { OnEscapeKey: [{
|
|
2953
2969
|
type: HostListener,
|
|
2954
2970
|
args: ['document:keydown.escape']
|