@memberjunction/ng-dashboards 5.34.0 → 5.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +399 -292
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +75 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +400 -89
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +990 -992
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +17 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +370 -425
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +317 -357
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +403 -362
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +781 -783
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +6 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +79 -30
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +196 -142
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/index.d.ts +0 -1
- package/dist/Actions/components/explorer/index.d.ts.map +1 -1
- package/dist/Actions/components/explorer/index.js +0 -1
- package/dist/Actions/components/explorer/index.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +32 -40
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +32 -40
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +32 -40
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.js +24 -5
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +80 -99
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +127 -106
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +44 -45
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +60 -58
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +139 -162
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +6 -0
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +521 -485
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +8 -0
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +309 -318
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +866 -847
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +182 -163
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +241 -241
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +1 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +28 -1
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +486 -532
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +152 -160
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +234 -246
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +1248 -1338
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +1 -1
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +34 -1
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.js +76 -85
- package/dist/Permissions/audit-log-resource.component.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +64 -69
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +63 -74
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -0
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +812 -784
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +420 -393
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +587 -608
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +9 -12
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +3 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +310 -274
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +16 -19
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts +3 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +307 -273
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +107 -93
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +185 -188
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +154 -184
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +350 -354
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +163 -169
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/actions-dashboards.module.d.ts +15 -16
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +34 -11
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +45 -48
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +36 -10
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +2 -1
- package/dist/archiving-dashboards.module.d.ts.map +1 -1
- package/dist/archiving-dashboards.module.js +12 -2
- package/dist/archiving-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +2 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +24 -3
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +31 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +1 -1
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +28 -1
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +1 -1
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +28 -1
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -3
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +1 -1
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +31 -1
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +8 -7
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +30 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +52 -52
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
|
@@ -23,6 +23,7 @@ import { BaseResourceComponent, NavigationService } from '@memberjunction/ng-sha
|
|
|
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";
|
|
26
|
+
import * as i3 from "@memberjunction/ng-ui-components";
|
|
26
27
|
const _forTrack0 = ($index, $item) => $item.ID;
|
|
27
28
|
const _forTrack1 = ($index, $item) => $item.DetailId;
|
|
28
29
|
const _forTrack2 = ($index, $item) => $item.Name;
|
|
@@ -30,8 +31,8 @@ const _forTrack3 = ($index, $item) => $item.Match.ID;
|
|
|
30
31
|
const _forTrack4 = ($index, $item) => $item.FieldName;
|
|
31
32
|
const _forTrack5 = ($index, $item) => $item.Entity;
|
|
32
33
|
const _forTrack6 = ($index, $item) => $item.ColumnIndex;
|
|
33
|
-
function
|
|
34
|
-
i0.ɵɵelementStart(0, "option",
|
|
34
|
+
function DuplicateDetectionResourceComponent_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
35
|
+
i0.ɵɵelementStart(0, "option", 4);
|
|
35
36
|
i0.ɵɵtext(1);
|
|
36
37
|
i0.ɵɵelementEnd();
|
|
37
38
|
} if (rf & 2) {
|
|
@@ -40,16 +41,16 @@ function DuplicateDetectionResourceComponent_For_12_Template(rf, ctx) { if (rf &
|
|
|
40
41
|
i0.ɵɵadvance();
|
|
41
42
|
i0.ɵɵtextInterpolate2("", doc_r1.Name, " (", doc_r1.EntityName, ")");
|
|
42
43
|
} }
|
|
43
|
-
function
|
|
44
|
-
i0.ɵɵelement(0, "i",
|
|
45
|
-
i0.ɵɵtext(1, " Detecting
|
|
44
|
+
function DuplicateDetectionResourceComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
45
|
+
i0.ɵɵelement(0, "i", 30);
|
|
46
|
+
i0.ɵɵtext(1, " Detecting\u2026 ");
|
|
46
47
|
} }
|
|
47
|
-
function
|
|
48
|
-
i0.ɵɵelement(0, "i",
|
|
48
|
+
function DuplicateDetectionResourceComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
49
|
+
i0.ɵɵelement(0, "i", 31);
|
|
49
50
|
i0.ɵɵtext(1, " Run Detection ");
|
|
50
51
|
} }
|
|
51
|
-
function
|
|
52
|
-
i0.ɵɵelementStart(0, "span",
|
|
52
|
+
function DuplicateDetectionResourceComponent_Conditional_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
53
|
+
i0.ɵɵelementStart(0, "span", 37);
|
|
53
54
|
i0.ɵɵtext(1);
|
|
54
55
|
i0.ɵɵelementEnd();
|
|
55
56
|
} if (rf & 2) {
|
|
@@ -57,18 +58,18 @@ function DuplicateDetectionResourceComponent_Conditional_16_Conditional_9_Templa
|
|
|
57
58
|
i0.ɵɵadvance();
|
|
58
59
|
i0.ɵɵtextInterpolate(ctx_r1.DetectionCurrentItem);
|
|
59
60
|
} }
|
|
60
|
-
function
|
|
61
|
-
i0.ɵɵelementStart(0, "div",
|
|
62
|
-
i0.ɵɵelement(3, "i",
|
|
61
|
+
function DuplicateDetectionResourceComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
62
|
+
i0.ɵɵelementStart(0, "div", 7)(1, "div", 32)(2, "span", 33);
|
|
63
|
+
i0.ɵɵelement(3, "i", 30);
|
|
63
64
|
i0.ɵɵtext(4);
|
|
64
65
|
i0.ɵɵelementEnd();
|
|
65
|
-
i0.ɵɵelementStart(5, "span",
|
|
66
|
+
i0.ɵɵelementStart(5, "span", 34);
|
|
66
67
|
i0.ɵɵtext(6);
|
|
67
68
|
i0.ɵɵelementEnd()();
|
|
68
|
-
i0.ɵɵelementStart(7, "div",
|
|
69
|
-
i0.ɵɵelement(8, "div",
|
|
69
|
+
i0.ɵɵelementStart(7, "div", 35);
|
|
70
|
+
i0.ɵɵelement(8, "div", 36);
|
|
70
71
|
i0.ɵɵelementEnd();
|
|
71
|
-
i0.ɵɵconditionalCreate(9,
|
|
72
|
+
i0.ɵɵconditionalCreate(9, DuplicateDetectionResourceComponent_Conditional_12_Conditional_9_Template, 2, 1, "span", 37);
|
|
72
73
|
i0.ɵɵelementEnd();
|
|
73
74
|
} if (rf & 2) {
|
|
74
75
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -81,30 +82,30 @@ function DuplicateDetectionResourceComponent_Conditional_16_Template(rf, ctx) {
|
|
|
81
82
|
i0.ɵɵadvance();
|
|
82
83
|
i0.ɵɵconditional(ctx_r1.DetectionCurrentItem ? 9 : -1);
|
|
83
84
|
} }
|
|
84
|
-
function
|
|
85
|
+
function DuplicateDetectionResourceComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
85
86
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
86
|
-
i0.ɵɵelementStart(0, "div",
|
|
87
|
-
i0.ɵɵelement(3, "i",
|
|
87
|
+
i0.ɵɵelementStart(0, "div", 8)(1, "div", 38)(2, "label", 39);
|
|
88
|
+
i0.ɵɵelement(3, "i", 40);
|
|
88
89
|
i0.ɵɵtext(4, " Potential Match ");
|
|
89
|
-
i0.ɵɵelementStart(5, "span",
|
|
90
|
+
i0.ɵɵelementStart(5, "span", 41);
|
|
90
91
|
i0.ɵɵtext(6);
|
|
91
92
|
i0.ɵɵelementEnd()();
|
|
92
|
-
i0.ɵɵelementStart(7, "input",
|
|
93
|
-
i0.ɵɵlistener("input", function
|
|
93
|
+
i0.ɵɵelementStart(7, "input", 42);
|
|
94
|
+
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)); });
|
|
94
95
|
i0.ɵɵelementEnd();
|
|
95
|
-
i0.ɵɵelementStart(8, "span",
|
|
96
|
+
i0.ɵɵelementStart(8, "span", 43);
|
|
96
97
|
i0.ɵɵtext(9, "Score above which duplicates are flagged for review");
|
|
97
98
|
i0.ɵɵelementEnd()();
|
|
98
|
-
i0.ɵɵelementStart(10, "div",
|
|
99
|
-
i0.ɵɵelement(12, "i",
|
|
99
|
+
i0.ɵɵelementStart(10, "div", 38)(11, "label", 39);
|
|
100
|
+
i0.ɵɵelement(12, "i", 44);
|
|
100
101
|
i0.ɵɵtext(13, " Absolute Match ");
|
|
101
|
-
i0.ɵɵelementStart(14, "span",
|
|
102
|
+
i0.ɵɵelementStart(14, "span", 41);
|
|
102
103
|
i0.ɵɵtext(15);
|
|
103
104
|
i0.ɵɵelementEnd()();
|
|
104
|
-
i0.ɵɵelementStart(16, "input",
|
|
105
|
-
i0.ɵɵlistener("input", function
|
|
105
|
+
i0.ɵɵelementStart(16, "input", 42);
|
|
106
|
+
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)); });
|
|
106
107
|
i0.ɵɵelementEnd();
|
|
107
|
-
i0.ɵɵelementStart(17, "span",
|
|
108
|
+
i0.ɵɵelementStart(17, "span", 43);
|
|
108
109
|
i0.ɵɵtext(18, "Score above which duplicates are auto-confirmed");
|
|
109
110
|
i0.ɵɵelementEnd()()();
|
|
110
111
|
} if (rf & 2) {
|
|
@@ -118,13 +119,13 @@ function DuplicateDetectionResourceComponent_Conditional_17_Template(rf, ctx) {
|
|
|
118
119
|
i0.ɵɵadvance();
|
|
119
120
|
i0.ɵɵproperty("min", 50)("max", 100)("step", 1)("value", ctx_r1.RunAbsoluteThreshold * 100)("disabled", ctx_r1.IsDetecting);
|
|
120
121
|
} }
|
|
121
|
-
function
|
|
122
|
-
i0.ɵɵelementStart(0, "option",
|
|
122
|
+
function DuplicateDetectionResourceComponent_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
123
|
+
i0.ɵɵelementStart(0, "option", 3);
|
|
123
124
|
i0.ɵɵtext(1, "All Entities");
|
|
124
125
|
i0.ɵɵelementEnd();
|
|
125
126
|
} }
|
|
126
|
-
function
|
|
127
|
-
i0.ɵɵelementStart(0, "option",
|
|
127
|
+
function DuplicateDetectionResourceComponent_For_40_Template(rf, ctx) { if (rf & 1) {
|
|
128
|
+
i0.ɵɵelementStart(0, "option", 4);
|
|
128
129
|
i0.ɵɵtext(1);
|
|
129
130
|
i0.ɵɵelementEnd();
|
|
130
131
|
} if (rf & 2) {
|
|
@@ -133,45 +134,45 @@ function DuplicateDetectionResourceComponent_For_44_Template(rf, ctx) { if (rf &
|
|
|
133
134
|
i0.ɵɵadvance();
|
|
134
135
|
i0.ɵɵtextInterpolate(name_r4);
|
|
135
136
|
} }
|
|
136
|
-
function
|
|
137
|
+
function DuplicateDetectionResourceComponent_Conditional_57_Template(rf, ctx) { if (rf & 1) {
|
|
137
138
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
138
|
-
i0.ɵɵelementStart(0, "button",
|
|
139
|
-
i0.ɵɵlistener("click", function
|
|
140
|
-
i0.ɵɵelement(1, "i",
|
|
139
|
+
i0.ɵɵelementStart(0, "button", 45);
|
|
140
|
+
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", 46);
|
|
141
142
|
i0.ɵɵtext(2, " Clear Filters ");
|
|
142
143
|
i0.ɵɵelementEnd();
|
|
143
144
|
} }
|
|
144
|
-
function
|
|
145
|
-
i0.ɵɵelementStart(0, "div",
|
|
146
|
-
i0.ɵɵelement(1, "i",
|
|
145
|
+
function DuplicateDetectionResourceComponent_Conditional_58_Template(rf, ctx) { if (rf & 1) {
|
|
146
|
+
i0.ɵɵelementStart(0, "div", 24);
|
|
147
|
+
i0.ɵɵelement(1, "i", 47);
|
|
147
148
|
i0.ɵɵtext(2, " Merging is not available for this entity. Detection results are read-only. ");
|
|
148
149
|
i0.ɵɵelementEnd();
|
|
149
150
|
} }
|
|
150
|
-
function
|
|
151
|
-
i0.ɵɵelementStart(0, "div",
|
|
152
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
151
|
+
function DuplicateDetectionResourceComponent_Conditional_59_Template(rf, ctx) { if (rf & 1) {
|
|
152
|
+
i0.ɵɵelementStart(0, "div", 25);
|
|
153
|
+
i0.ɵɵelement(1, "mj-loading", 48);
|
|
153
154
|
i0.ɵɵelementEnd();
|
|
154
155
|
} }
|
|
155
|
-
function
|
|
156
|
-
i0.ɵɵelementStart(0, "div",
|
|
157
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
156
|
+
function DuplicateDetectionResourceComponent_Conditional_60_Template(rf, ctx) { if (rf & 1) {
|
|
157
|
+
i0.ɵɵelementStart(0, "div", 25);
|
|
158
|
+
i0.ɵɵelement(1, "mj-loading", 48);
|
|
158
159
|
i0.ɵɵelementEnd();
|
|
159
160
|
} }
|
|
160
|
-
function
|
|
161
|
-
i0.ɵɵelementStart(0, "div",
|
|
162
|
-
i0.ɵɵelement(1, "i",
|
|
163
|
-
i0.ɵɵelementStart(2, "p",
|
|
161
|
+
function DuplicateDetectionResourceComponent_Conditional_61_Template(rf, ctx) { if (rf & 1) {
|
|
162
|
+
i0.ɵɵelementStart(0, "div", 26);
|
|
163
|
+
i0.ɵɵelement(1, "i", 49);
|
|
164
|
+
i0.ɵɵelementStart(2, "p", 50);
|
|
164
165
|
i0.ɵɵtext(3, "No duplicate detection results found.");
|
|
165
166
|
i0.ɵɵelementEnd();
|
|
166
|
-
i0.ɵɵelementStart(4, "p",
|
|
167
|
+
i0.ɵɵelementStart(4, "p", 51);
|
|
167
168
|
i0.ɵɵtext(5, "Select an entity document and click \"Run Detection\" to start.");
|
|
168
169
|
i0.ɵɵelementEnd()();
|
|
169
170
|
} }
|
|
170
|
-
function
|
|
171
|
-
i0.ɵɵelementStart(0, "div",
|
|
171
|
+
function DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
172
|
+
i0.ɵɵelementStart(0, "div", 82)(1, "span", 84);
|
|
172
173
|
i0.ɵɵtext(2);
|
|
173
174
|
i0.ɵɵelementEnd();
|
|
174
|
-
i0.ɵɵelementStart(3, "span",
|
|
175
|
+
i0.ɵɵelementStart(3, "span", 85);
|
|
175
176
|
i0.ɵɵtext(4);
|
|
176
177
|
i0.ɵɵelementEnd()();
|
|
177
178
|
} if (rf & 2) {
|
|
@@ -181,8 +182,8 @@ function DuplicateDetectionResourceComponent_Conditional_66_For_10_Conditional_1
|
|
|
181
182
|
i0.ɵɵadvance(2);
|
|
182
183
|
i0.ɵɵtextInterpolate(ms_r9.Name);
|
|
183
184
|
} }
|
|
184
|
-
function
|
|
185
|
-
i0.ɵɵelementStart(0, "div",
|
|
185
|
+
function DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
186
|
+
i0.ɵɵelementStart(0, "div", 83);
|
|
186
187
|
i0.ɵɵtext(1);
|
|
187
188
|
i0.ɵɵelementEnd();
|
|
188
189
|
} if (rf & 2) {
|
|
@@ -190,10 +191,10 @@ function DuplicateDetectionResourceComponent_Conditional_66_For_10_Conditional_1
|
|
|
190
191
|
i0.ɵɵadvance();
|
|
191
192
|
i0.ɵɵtextInterpolate1("+", group_r8.MatchCount - group_r8.TopMatchSummaries.length, " more");
|
|
192
193
|
} }
|
|
193
|
-
function
|
|
194
|
-
i0.ɵɵelementStart(0, "div",
|
|
195
|
-
i0.ɵɵrepeaterCreate(1,
|
|
196
|
-
i0.ɵɵconditionalCreate(3,
|
|
194
|
+
function DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
195
|
+
i0.ɵɵelementStart(0, "div", 73);
|
|
196
|
+
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_For_2_Template, 5, 2, "div", 82, _forTrack2);
|
|
197
|
+
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_Conditional_3_Template, 2, 1, "div", 83);
|
|
197
198
|
i0.ɵɵelementEnd();
|
|
198
199
|
} if (rf & 2) {
|
|
199
200
|
const group_r8 = i0.ɵɵnextContext().$implicit;
|
|
@@ -202,40 +203,40 @@ function DuplicateDetectionResourceComponent_Conditional_66_For_10_Conditional_1
|
|
|
202
203
|
i0.ɵɵadvance(2);
|
|
203
204
|
i0.ɵɵconditional(group_r8.MatchCount > group_r8.TopMatchSummaries.length ? 3 : -1);
|
|
204
205
|
} }
|
|
205
|
-
function
|
|
206
|
+
function DuplicateDetectionResourceComponent_Conditional_62_For_10_Template(rf, ctx) { if (rf & 1) {
|
|
206
207
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
207
|
-
i0.ɵɵelementStart(0, "div",
|
|
208
|
-
i0.ɵɵlistener("dragstart", function
|
|
209
|
-
i0.ɵɵelementStart(1, "div",
|
|
208
|
+
i0.ɵɵelementStart(0, "div", 64);
|
|
209
|
+
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", 65)(2, "div", 66)(3, "div", 67);
|
|
210
211
|
i0.ɵɵelement(4, "i");
|
|
211
212
|
i0.ɵɵelementEnd();
|
|
212
|
-
i0.ɵɵelementStart(5, "div",
|
|
213
|
+
i0.ɵɵelementStart(5, "div", 68)(6, "div", 69);
|
|
213
214
|
i0.ɵɵtext(7);
|
|
214
215
|
i0.ɵɵelementEnd();
|
|
215
|
-
i0.ɵɵelementStart(8, "span",
|
|
216
|
+
i0.ɵɵelementStart(8, "span", 70);
|
|
216
217
|
i0.ɵɵtext(9);
|
|
217
218
|
i0.ɵɵelementEnd()()();
|
|
218
|
-
i0.ɵɵelementStart(10, "span",
|
|
219
|
+
i0.ɵɵelementStart(10, "span", 71);
|
|
219
220
|
i0.ɵɵtext(11);
|
|
220
221
|
i0.ɵɵelementEnd()();
|
|
221
|
-
i0.ɵɵelementStart(12, "div",
|
|
222
|
-
i0.ɵɵconditionalCreate(13,
|
|
223
|
-
i0.ɵɵelementStart(14, "div",
|
|
224
|
-
i0.ɵɵelement(16, "i",
|
|
222
|
+
i0.ɵɵelementStart(12, "div", 72);
|
|
223
|
+
i0.ɵɵconditionalCreate(13, DuplicateDetectionResourceComponent_Conditional_62_For_10_Conditional_13_Template, 4, 1, "div", 73);
|
|
224
|
+
i0.ɵɵelementStart(14, "div", 74)(15, "span", 75);
|
|
225
|
+
i0.ɵɵelement(16, "i", 76);
|
|
225
226
|
i0.ɵɵtext(17);
|
|
226
227
|
i0.ɵɵelementEnd();
|
|
227
|
-
i0.ɵɵelementStart(18, "span",
|
|
228
|
-
i0.ɵɵelement(19, "i",
|
|
228
|
+
i0.ɵɵelementStart(18, "span", 75);
|
|
229
|
+
i0.ɵɵelement(19, "i", 77);
|
|
229
230
|
i0.ɵɵtext(20);
|
|
230
231
|
i0.ɵɵelementEnd()()();
|
|
231
|
-
i0.ɵɵelementStart(21, "div",
|
|
232
|
-
i0.ɵɵlistener("click", function
|
|
233
|
-
i0.ɵɵelement(23, "i",
|
|
232
|
+
i0.ɵɵelementStart(21, "div", 78)(22, "button", 79);
|
|
233
|
+
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", 80);
|
|
234
235
|
i0.ɵɵtext(24, " Approve ");
|
|
235
236
|
i0.ɵɵelementEnd();
|
|
236
|
-
i0.ɵɵelementStart(25, "button",
|
|
237
|
-
i0.ɵɵlistener("click", function
|
|
238
|
-
i0.ɵɵelement(26, "i",
|
|
237
|
+
i0.ɵɵelementStart(25, "button", 81);
|
|
238
|
+
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", 46);
|
|
239
240
|
i0.ɵɵtext(27, " Reject ");
|
|
240
241
|
i0.ɵɵelementEnd()()();
|
|
241
242
|
} if (rf & 2) {
|
|
@@ -264,18 +265,18 @@ function DuplicateDetectionResourceComponent_Conditional_66_For_10_Template(rf,
|
|
|
264
265
|
i0.ɵɵadvance(3);
|
|
265
266
|
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
266
267
|
} }
|
|
267
|
-
function
|
|
268
|
-
i0.ɵɵelementStart(0, "div",
|
|
269
|
-
i0.ɵɵelement(1, "i",
|
|
268
|
+
function DuplicateDetectionResourceComponent_Conditional_62_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
269
|
+
i0.ɵɵelementStart(0, "div", 59);
|
|
270
|
+
i0.ɵɵelement(1, "i", 61);
|
|
270
271
|
i0.ɵɵelementStart(2, "span");
|
|
271
272
|
i0.ɵɵtext(3, "No pending items");
|
|
272
273
|
i0.ɵɵelementEnd()();
|
|
273
274
|
} }
|
|
274
|
-
function
|
|
275
|
-
i0.ɵɵelementStart(0, "div",
|
|
275
|
+
function DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
276
|
+
i0.ɵɵelementStart(0, "div", 82)(1, "span", 84);
|
|
276
277
|
i0.ɵɵtext(2);
|
|
277
278
|
i0.ɵɵelementEnd();
|
|
278
|
-
i0.ɵɵelementStart(3, "span",
|
|
279
|
+
i0.ɵɵelementStart(3, "span", 85);
|
|
279
280
|
i0.ɵɵtext(4);
|
|
280
281
|
i0.ɵɵelementEnd()();
|
|
281
282
|
} if (rf & 2) {
|
|
@@ -285,8 +286,8 @@ function DuplicateDetectionResourceComponent_Conditional_66_For_21_Conditional_1
|
|
|
285
286
|
i0.ɵɵadvance(2);
|
|
286
287
|
i0.ɵɵtextInterpolate(ms_r12.Name);
|
|
287
288
|
} }
|
|
288
|
-
function
|
|
289
|
-
i0.ɵɵelementStart(0, "div",
|
|
289
|
+
function DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
290
|
+
i0.ɵɵelementStart(0, "div", 83);
|
|
290
291
|
i0.ɵɵtext(1);
|
|
291
292
|
i0.ɵɵelementEnd();
|
|
292
293
|
} if (rf & 2) {
|
|
@@ -294,10 +295,10 @@ function DuplicateDetectionResourceComponent_Conditional_66_For_21_Conditional_1
|
|
|
294
295
|
i0.ɵɵadvance();
|
|
295
296
|
i0.ɵɵtextInterpolate1("+", group_r11.MatchCount - group_r11.TopMatchSummaries.length, " more");
|
|
296
297
|
} }
|
|
297
|
-
function
|
|
298
|
-
i0.ɵɵelementStart(0, "div",
|
|
299
|
-
i0.ɵɵrepeaterCreate(1,
|
|
300
|
-
i0.ɵɵconditionalCreate(3,
|
|
298
|
+
function DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
299
|
+
i0.ɵɵelementStart(0, "div", 73);
|
|
300
|
+
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_For_2_Template, 5, 2, "div", 82, _forTrack2);
|
|
301
|
+
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_Conditional_3_Template, 2, 1, "div", 83);
|
|
301
302
|
i0.ɵɵelementEnd();
|
|
302
303
|
} if (rf & 2) {
|
|
303
304
|
const group_r11 = i0.ɵɵnextContext().$implicit;
|
|
@@ -306,30 +307,30 @@ function DuplicateDetectionResourceComponent_Conditional_66_For_21_Conditional_1
|
|
|
306
307
|
i0.ɵɵadvance(2);
|
|
307
308
|
i0.ɵɵconditional(group_r11.MatchCount > group_r11.TopMatchSummaries.length ? 3 : -1);
|
|
308
309
|
} }
|
|
309
|
-
function
|
|
310
|
+
function DuplicateDetectionResourceComponent_Conditional_62_For_21_Template(rf, ctx) { if (rf & 1) {
|
|
310
311
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
311
|
-
i0.ɵɵelementStart(0, "div",
|
|
312
|
-
i0.ɵɵlistener("dragstart", function
|
|
313
|
-
i0.ɵɵelementStart(1, "div",
|
|
312
|
+
i0.ɵɵelementStart(0, "div", 64);
|
|
313
|
+
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", 65)(2, "div", 66)(3, "div", 67);
|
|
314
315
|
i0.ɵɵelement(4, "i");
|
|
315
316
|
i0.ɵɵelementEnd();
|
|
316
|
-
i0.ɵɵelementStart(5, "div",
|
|
317
|
+
i0.ɵɵelementStart(5, "div", 68)(6, "div", 69);
|
|
317
318
|
i0.ɵɵtext(7);
|
|
318
319
|
i0.ɵɵelementEnd();
|
|
319
|
-
i0.ɵɵelementStart(8, "span",
|
|
320
|
+
i0.ɵɵelementStart(8, "span", 70);
|
|
320
321
|
i0.ɵɵtext(9);
|
|
321
322
|
i0.ɵɵelementEnd()()();
|
|
322
|
-
i0.ɵɵelementStart(10, "span",
|
|
323
|
+
i0.ɵɵelementStart(10, "span", 71);
|
|
323
324
|
i0.ɵɵtext(11);
|
|
324
325
|
i0.ɵɵelementEnd()();
|
|
325
|
-
i0.ɵɵelementStart(12, "div",
|
|
326
|
-
i0.ɵɵconditionalCreate(13,
|
|
327
|
-
i0.ɵɵelementStart(14, "div",
|
|
328
|
-
i0.ɵɵelement(16, "i",
|
|
326
|
+
i0.ɵɵelementStart(12, "div", 72);
|
|
327
|
+
i0.ɵɵconditionalCreate(13, DuplicateDetectionResourceComponent_Conditional_62_For_21_Conditional_13_Template, 4, 1, "div", 73);
|
|
328
|
+
i0.ɵɵelementStart(14, "div", 74)(15, "span", 75);
|
|
329
|
+
i0.ɵɵelement(16, "i", 76);
|
|
329
330
|
i0.ɵɵtext(17);
|
|
330
331
|
i0.ɵɵelementEnd();
|
|
331
|
-
i0.ɵɵelementStart(18, "span",
|
|
332
|
-
i0.ɵɵelement(19, "i",
|
|
332
|
+
i0.ɵɵelementStart(18, "span", 75);
|
|
333
|
+
i0.ɵɵelement(19, "i", 77);
|
|
333
334
|
i0.ɵɵtext(20);
|
|
334
335
|
i0.ɵɵelementEnd()()()();
|
|
335
336
|
} if (rf & 2) {
|
|
@@ -354,18 +355,18 @@ function DuplicateDetectionResourceComponent_Conditional_66_For_21_Template(rf,
|
|
|
354
355
|
i0.ɵɵadvance(3);
|
|
355
356
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.FormatDate(group_r11.MatchedAt), " ");
|
|
356
357
|
} }
|
|
357
|
-
function
|
|
358
|
-
i0.ɵɵelementStart(0, "div",
|
|
359
|
-
i0.ɵɵelement(1, "i",
|
|
358
|
+
function DuplicateDetectionResourceComponent_Conditional_62_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
359
|
+
i0.ɵɵelementStart(0, "div", 59);
|
|
360
|
+
i0.ɵɵelement(1, "i", 86);
|
|
360
361
|
i0.ɵɵelementStart(2, "span");
|
|
361
362
|
i0.ɵɵtext(3, "No approved items");
|
|
362
363
|
i0.ɵɵelementEnd()();
|
|
363
364
|
} }
|
|
364
|
-
function
|
|
365
|
-
i0.ɵɵelementStart(0, "div",
|
|
365
|
+
function DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
366
|
+
i0.ɵɵelementStart(0, "div", 82)(1, "span", 84);
|
|
366
367
|
i0.ɵɵtext(2);
|
|
367
368
|
i0.ɵɵelementEnd();
|
|
368
|
-
i0.ɵɵelementStart(3, "span",
|
|
369
|
+
i0.ɵɵelementStart(3, "span", 85);
|
|
369
370
|
i0.ɵɵtext(4);
|
|
370
371
|
i0.ɵɵelementEnd()();
|
|
371
372
|
} if (rf & 2) {
|
|
@@ -375,8 +376,8 @@ function DuplicateDetectionResourceComponent_Conditional_66_For_32_Conditional_1
|
|
|
375
376
|
i0.ɵɵadvance(2);
|
|
376
377
|
i0.ɵɵtextInterpolate(ms_r15.Name);
|
|
377
378
|
} }
|
|
378
|
-
function
|
|
379
|
-
i0.ɵɵelementStart(0, "div",
|
|
379
|
+
function DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
380
|
+
i0.ɵɵelementStart(0, "div", 83);
|
|
380
381
|
i0.ɵɵtext(1);
|
|
381
382
|
i0.ɵɵelementEnd();
|
|
382
383
|
} if (rf & 2) {
|
|
@@ -384,10 +385,10 @@ function DuplicateDetectionResourceComponent_Conditional_66_For_32_Conditional_1
|
|
|
384
385
|
i0.ɵɵadvance();
|
|
385
386
|
i0.ɵɵtextInterpolate1("+", group_r14.MatchCount - group_r14.TopMatchSummaries.length, " more");
|
|
386
387
|
} }
|
|
387
|
-
function
|
|
388
|
-
i0.ɵɵelementStart(0, "div",
|
|
389
|
-
i0.ɵɵrepeaterCreate(1,
|
|
390
|
-
i0.ɵɵconditionalCreate(3,
|
|
388
|
+
function DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
389
|
+
i0.ɵɵelementStart(0, "div", 73);
|
|
390
|
+
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_For_2_Template, 5, 2, "div", 82, _forTrack2);
|
|
391
|
+
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_Conditional_3_Template, 2, 1, "div", 83);
|
|
391
392
|
i0.ɵɵelementEnd();
|
|
392
393
|
} if (rf & 2) {
|
|
393
394
|
const group_r14 = i0.ɵɵnextContext().$implicit;
|
|
@@ -396,30 +397,30 @@ function DuplicateDetectionResourceComponent_Conditional_66_For_32_Conditional_1
|
|
|
396
397
|
i0.ɵɵadvance(2);
|
|
397
398
|
i0.ɵɵconditional(group_r14.MatchCount > group_r14.TopMatchSummaries.length ? 3 : -1);
|
|
398
399
|
} }
|
|
399
|
-
function
|
|
400
|
+
function DuplicateDetectionResourceComponent_Conditional_62_For_32_Template(rf, ctx) { if (rf & 1) {
|
|
400
401
|
const _r13 = i0.ɵɵgetCurrentView();
|
|
401
|
-
i0.ɵɵelementStart(0, "div",
|
|
402
|
-
i0.ɵɵlistener("dragstart", function
|
|
403
|
-
i0.ɵɵelementStart(1, "div",
|
|
402
|
+
i0.ɵɵelementStart(0, "div", 64);
|
|
403
|
+
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", 65)(2, "div", 66)(3, "div", 67);
|
|
404
405
|
i0.ɵɵelement(4, "i");
|
|
405
406
|
i0.ɵɵelementEnd();
|
|
406
|
-
i0.ɵɵelementStart(5, "div",
|
|
407
|
+
i0.ɵɵelementStart(5, "div", 68)(6, "div", 69);
|
|
407
408
|
i0.ɵɵtext(7);
|
|
408
409
|
i0.ɵɵelementEnd();
|
|
409
|
-
i0.ɵɵelementStart(8, "span",
|
|
410
|
+
i0.ɵɵelementStart(8, "span", 70);
|
|
410
411
|
i0.ɵɵtext(9);
|
|
411
412
|
i0.ɵɵelementEnd()()();
|
|
412
|
-
i0.ɵɵelementStart(10, "span",
|
|
413
|
+
i0.ɵɵelementStart(10, "span", 71);
|
|
413
414
|
i0.ɵɵtext(11);
|
|
414
415
|
i0.ɵɵelementEnd()();
|
|
415
|
-
i0.ɵɵelementStart(12, "div",
|
|
416
|
-
i0.ɵɵconditionalCreate(13,
|
|
417
|
-
i0.ɵɵelementStart(14, "div",
|
|
418
|
-
i0.ɵɵelement(16, "i",
|
|
416
|
+
i0.ɵɵelementStart(12, "div", 72);
|
|
417
|
+
i0.ɵɵconditionalCreate(13, DuplicateDetectionResourceComponent_Conditional_62_For_32_Conditional_13_Template, 4, 1, "div", 73);
|
|
418
|
+
i0.ɵɵelementStart(14, "div", 74)(15, "span", 75);
|
|
419
|
+
i0.ɵɵelement(16, "i", 76);
|
|
419
420
|
i0.ɵɵtext(17);
|
|
420
421
|
i0.ɵɵelementEnd();
|
|
421
|
-
i0.ɵɵelementStart(18, "span",
|
|
422
|
-
i0.ɵɵelement(19, "i",
|
|
422
|
+
i0.ɵɵelementStart(18, "span", 75);
|
|
423
|
+
i0.ɵɵelement(19, "i", 77);
|
|
423
424
|
i0.ɵɵtext(20);
|
|
424
425
|
i0.ɵɵelementEnd()()()();
|
|
425
426
|
} if (rf & 2) {
|
|
@@ -444,53 +445,53 @@ function DuplicateDetectionResourceComponent_Conditional_66_For_32_Template(rf,
|
|
|
444
445
|
i0.ɵɵadvance(3);
|
|
445
446
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.FormatDate(group_r14.MatchedAt), " ");
|
|
446
447
|
} }
|
|
447
|
-
function
|
|
448
|
-
i0.ɵɵelementStart(0, "div",
|
|
449
|
-
i0.ɵɵelement(1, "i",
|
|
448
|
+
function DuplicateDetectionResourceComponent_Conditional_62_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
449
|
+
i0.ɵɵelementStart(0, "div", 59);
|
|
450
|
+
i0.ɵɵelement(1, "i", 86);
|
|
450
451
|
i0.ɵɵelementStart(2, "span");
|
|
451
452
|
i0.ɵɵtext(3, "No rejected items");
|
|
452
453
|
i0.ɵɵelementEnd()();
|
|
453
454
|
} }
|
|
454
|
-
function
|
|
455
|
+
function DuplicateDetectionResourceComponent_Conditional_62_Template(rf, ctx) { if (rf & 1) {
|
|
455
456
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
456
|
-
i0.ɵɵelementStart(0, "div",
|
|
457
|
-
i0.ɵɵelement(3, "i",
|
|
458
|
-
i0.ɵɵelementStart(4, "span",
|
|
457
|
+
i0.ɵɵelementStart(0, "div", 27)(1, "div", 52)(2, "div", 53);
|
|
458
|
+
i0.ɵɵelement(3, "i", 54);
|
|
459
|
+
i0.ɵɵelementStart(4, "span", 55);
|
|
459
460
|
i0.ɵɵtext(5, "Pending Review");
|
|
460
461
|
i0.ɵɵelementEnd();
|
|
461
|
-
i0.ɵɵelementStart(6, "span",
|
|
462
|
+
i0.ɵɵelementStart(6, "span", 56);
|
|
462
463
|
i0.ɵɵtext(7);
|
|
463
464
|
i0.ɵɵelementEnd()();
|
|
464
|
-
i0.ɵɵelementStart(8, "div",
|
|
465
|
-
i0.ɵɵlistener("dragover", function
|
|
466
|
-
i0.ɵɵrepeaterCreate(9,
|
|
467
|
-
i0.ɵɵconditionalCreate(11,
|
|
465
|
+
i0.ɵɵelementStart(8, "div", 57);
|
|
466
|
+
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", 58, _forTrack1);
|
|
468
|
+
i0.ɵɵconditionalCreate(11, DuplicateDetectionResourceComponent_Conditional_62_Conditional_11_Template, 4, 0, "div", 59);
|
|
468
469
|
i0.ɵɵelementEnd()();
|
|
469
|
-
i0.ɵɵelementStart(12, "div",
|
|
470
|
-
i0.ɵɵelement(14, "i",
|
|
471
|
-
i0.ɵɵelementStart(15, "span",
|
|
470
|
+
i0.ɵɵelementStart(12, "div", 52)(13, "div", 60);
|
|
471
|
+
i0.ɵɵelement(14, "i", 61);
|
|
472
|
+
i0.ɵɵelementStart(15, "span", 55);
|
|
472
473
|
i0.ɵɵtext(16, "Approved");
|
|
473
474
|
i0.ɵɵelementEnd();
|
|
474
|
-
i0.ɵɵelementStart(17, "span",
|
|
475
|
+
i0.ɵɵelementStart(17, "span", 56);
|
|
475
476
|
i0.ɵɵtext(18);
|
|
476
477
|
i0.ɵɵelementEnd()();
|
|
477
|
-
i0.ɵɵelementStart(19, "div",
|
|
478
|
-
i0.ɵɵlistener("dragover", function
|
|
479
|
-
i0.ɵɵrepeaterCreate(20,
|
|
480
|
-
i0.ɵɵconditionalCreate(22,
|
|
478
|
+
i0.ɵɵelementStart(19, "div", 57);
|
|
479
|
+
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", 58, _forTrack1);
|
|
481
|
+
i0.ɵɵconditionalCreate(22, DuplicateDetectionResourceComponent_Conditional_62_Conditional_22_Template, 4, 0, "div", 59);
|
|
481
482
|
i0.ɵɵelementEnd()();
|
|
482
|
-
i0.ɵɵelementStart(23, "div",
|
|
483
|
-
i0.ɵɵelement(25, "i",
|
|
484
|
-
i0.ɵɵelementStart(26, "span",
|
|
483
|
+
i0.ɵɵelementStart(23, "div", 52)(24, "div", 62);
|
|
484
|
+
i0.ɵɵelement(25, "i", 63);
|
|
485
|
+
i0.ɵɵelementStart(26, "span", 55);
|
|
485
486
|
i0.ɵɵtext(27, "Rejected");
|
|
486
487
|
i0.ɵɵelementEnd();
|
|
487
|
-
i0.ɵɵelementStart(28, "span",
|
|
488
|
+
i0.ɵɵelementStart(28, "span", 56);
|
|
488
489
|
i0.ɵɵtext(29);
|
|
489
490
|
i0.ɵɵelementEnd()();
|
|
490
|
-
i0.ɵɵelementStart(30, "div",
|
|
491
|
-
i0.ɵɵlistener("dragover", function
|
|
492
|
-
i0.ɵɵrepeaterCreate(31,
|
|
493
|
-
i0.ɵɵconditionalCreate(33,
|
|
491
|
+
i0.ɵɵelementStart(30, "div", 57);
|
|
492
|
+
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", 58, _forTrack1);
|
|
494
|
+
i0.ɵɵconditionalCreate(33, DuplicateDetectionResourceComponent_Conditional_62_Conditional_33_Template, 4, 0, "div", 59);
|
|
494
495
|
i0.ɵɵelementEnd()()();
|
|
495
496
|
} if (rf & 2) {
|
|
496
497
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -519,34 +520,34 @@ function DuplicateDetectionResourceComponent_Conditional_66_Template(rf, ctx) {
|
|
|
519
520
|
i0.ɵɵadvance(2);
|
|
520
521
|
i0.ɵɵconditional(ctx_r1.RejectedGroups.length === 0 ? 33 : -1);
|
|
521
522
|
} }
|
|
522
|
-
function
|
|
523
|
-
i0.ɵɵelementStart(0, "div",
|
|
524
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
523
|
+
function DuplicateDetectionResourceComponent_Conditional_63_Template(rf, ctx) { if (rf & 1) {
|
|
524
|
+
i0.ɵɵelementStart(0, "div", 28);
|
|
525
|
+
i0.ɵɵelement(1, "mj-loading", 87);
|
|
525
526
|
i0.ɵɵelementEnd();
|
|
526
527
|
} }
|
|
527
|
-
function
|
|
528
|
-
i0.ɵɵelementStart(0, "div",
|
|
529
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
528
|
+
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
529
|
+
i0.ɵɵelementStart(0, "div", 100);
|
|
530
|
+
i0.ɵɵelement(1, "mj-loading", 126);
|
|
530
531
|
i0.ɵɵelementEnd();
|
|
531
532
|
} }
|
|
532
|
-
function
|
|
533
|
-
i0.ɵɵelementStart(0, "span",
|
|
534
|
-
i0.ɵɵelement(1, "i",
|
|
533
|
+
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
534
|
+
i0.ɵɵelementStart(0, "span", 116);
|
|
535
|
+
i0.ɵɵelement(1, "i", 127);
|
|
535
536
|
i0.ɵɵtext(2, " Most deps");
|
|
536
537
|
i0.ɵɵelementEnd();
|
|
537
538
|
} }
|
|
538
|
-
function
|
|
539
|
-
i0.ɵɵelementStart(0, "div",
|
|
540
|
-
i0.ɵɵelement(1, "i",
|
|
539
|
+
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", 136);
|
|
541
|
+
i0.ɵɵelement(1, "i", 30);
|
|
541
542
|
i0.ɵɵtext(2, " Loading...");
|
|
542
543
|
i0.ɵɵelementEnd();
|
|
543
544
|
} }
|
|
544
|
-
function
|
|
545
|
+
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
545
546
|
const _r20 = i0.ɵɵgetCurrentView();
|
|
546
|
-
i0.ɵɵelementStart(0, "div",
|
|
547
|
-
i0.ɵɵlistener("click", function
|
|
548
|
-
i0.ɵɵelement(1, "i",
|
|
549
|
-
i0.ɵɵelementStart(2, "span",
|
|
547
|
+
i0.ɵɵelementStart(0, "div", 138);
|
|
548
|
+
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", 139);
|
|
550
|
+
i0.ɵɵelementStart(2, "span", 140);
|
|
550
551
|
i0.ɵɵtext(3);
|
|
551
552
|
i0.ɵɵelementEnd()();
|
|
552
553
|
} if (rf & 2) {
|
|
@@ -554,10 +555,10 @@ function DuplicateDetectionResourceComponent_Conditional_68_Conditional_45_Condi
|
|
|
554
555
|
i0.ɵɵadvance(3);
|
|
555
556
|
i0.ɵɵtextInterpolate(record_r21.Name);
|
|
556
557
|
} }
|
|
557
|
-
function
|
|
558
|
-
i0.ɵɵelementStart(0, "div",
|
|
559
|
-
i0.ɵɵconditionalCreate(1,
|
|
560
|
-
i0.ɵɵrepeaterCreate(2,
|
|
558
|
+
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
559
|
+
i0.ɵɵelementStart(0, "div", 135);
|
|
560
|
+
i0.ɵɵconditionalCreate(1, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_Conditional_1_Template, 3, 0, "div", 136);
|
|
561
|
+
i0.ɵɵrepeaterCreate(2, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_For_3_Template, 4, 1, "div", 137, i0.ɵɵrepeaterTrackByIndex);
|
|
561
562
|
i0.ɵɵelementEnd();
|
|
562
563
|
} if (rf & 2) {
|
|
563
564
|
const dep_r19 = i0.ɵɵnextContext().$implicit;
|
|
@@ -567,18 +568,18 @@ function DuplicateDetectionResourceComponent_Conditional_68_Conditional_45_Condi
|
|
|
567
568
|
i0.ɵɵadvance();
|
|
568
569
|
i0.ɵɵrepeater(ctx_r1.GetDepRecords(0, dep_r19.Entity));
|
|
569
570
|
} }
|
|
570
|
-
function
|
|
571
|
+
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
571
572
|
const _r18 = i0.ɵɵgetCurrentView();
|
|
572
|
-
i0.ɵɵelementStart(0, "div",
|
|
573
|
-
i0.ɵɵlistener("click", function
|
|
574
|
-
i0.ɵɵelementStart(2, "span",
|
|
575
|
-
i0.ɵɵelement(3, "i",
|
|
573
|
+
i0.ɵɵelementStart(0, "div", 130)(1, "div", 131);
|
|
574
|
+
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", 132);
|
|
576
|
+
i0.ɵɵelement(3, "i", 133);
|
|
576
577
|
i0.ɵɵtext(4);
|
|
577
578
|
i0.ɵɵelementEnd();
|
|
578
|
-
i0.ɵɵelementStart(5, "span",
|
|
579
|
+
i0.ɵɵelementStart(5, "span", 134);
|
|
579
580
|
i0.ɵɵtext(6);
|
|
580
581
|
i0.ɵɵelementEnd()();
|
|
581
|
-
i0.ɵɵconditionalCreate(7,
|
|
582
|
+
i0.ɵɵconditionalCreate(7, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Conditional_7_Template, 4, 1, "div", 135);
|
|
582
583
|
i0.ɵɵelementEnd();
|
|
583
584
|
} if (rf & 2) {
|
|
584
585
|
const dep_r19 = ctx.$implicit;
|
|
@@ -592,25 +593,25 @@ function DuplicateDetectionResourceComponent_Conditional_68_Conditional_45_Condi
|
|
|
592
593
|
i0.ɵɵadvance();
|
|
593
594
|
i0.ɵɵconditional(ctx_r1.IsDepEntityGroupExpanded(0, dep_r19.Entity) ? 7 : -1);
|
|
594
595
|
} }
|
|
595
|
-
function
|
|
596
|
-
i0.ɵɵelementStart(0, "div",
|
|
597
|
-
i0.ɵɵrepeaterCreate(1,
|
|
596
|
+
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
597
|
+
i0.ɵɵelementStart(0, "div", 129);
|
|
598
|
+
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_For_2_Template, 8, 7, "div", 130, _forTrack5);
|
|
598
599
|
i0.ɵɵelementEnd();
|
|
599
600
|
} if (rf & 2) {
|
|
600
601
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
601
602
|
i0.ɵɵadvance();
|
|
602
603
|
i0.ɵɵrepeater(ctx_r1.GetGroupedDeps(0));
|
|
603
604
|
} }
|
|
604
|
-
function
|
|
605
|
+
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
605
606
|
const _r17 = i0.ɵɵgetCurrentView();
|
|
606
|
-
i0.ɵɵelementStart(0, "div",
|
|
607
|
-
i0.ɵɵlistener("click", function
|
|
607
|
+
i0.ɵɵelementStart(0, "div", 128);
|
|
608
|
+
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)); });
|
|
608
609
|
i0.ɵɵelementStart(1, "span");
|
|
609
610
|
i0.ɵɵtext(2);
|
|
610
611
|
i0.ɵɵelementEnd();
|
|
611
|
-
i0.ɵɵelement(3, "i",
|
|
612
|
+
i0.ɵɵelement(3, "i", 111);
|
|
612
613
|
i0.ɵɵelementEnd();
|
|
613
|
-
i0.ɵɵconditionalCreate(4,
|
|
614
|
+
i0.ɵɵconditionalCreate(4, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Conditional_4_Template, 3, 0, "div", 129);
|
|
614
615
|
} if (rf & 2) {
|
|
615
616
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
616
617
|
i0.ɵɵadvance(2);
|
|
@@ -620,24 +621,24 @@ function DuplicateDetectionResourceComponent_Conditional_68_Conditional_45_Templ
|
|
|
620
621
|
i0.ɵɵadvance();
|
|
621
622
|
i0.ɵɵconditional(ctx_r1.IsDepsExpanded(0) ? 4 : -1);
|
|
622
623
|
} }
|
|
623
|
-
function
|
|
624
|
-
i0.ɵɵelementStart(0, "span",
|
|
625
|
-
i0.ɵɵelement(1, "i",
|
|
624
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
625
|
+
i0.ɵɵelementStart(0, "span", 116);
|
|
626
|
+
i0.ɵɵelement(1, "i", 127);
|
|
626
627
|
i0.ɵɵtext(2, " Most deps");
|
|
627
628
|
i0.ɵɵelementEnd();
|
|
628
629
|
} }
|
|
629
|
-
function
|
|
630
|
-
i0.ɵɵelementStart(0, "div",
|
|
631
|
-
i0.ɵɵelement(1, "i",
|
|
630
|
+
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", 136);
|
|
632
|
+
i0.ɵɵelement(1, "i", 30);
|
|
632
633
|
i0.ɵɵtext(2, " Loading...");
|
|
633
634
|
i0.ɵɵelementEnd();
|
|
634
635
|
} }
|
|
635
|
-
function
|
|
636
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
636
637
|
const _r27 = i0.ɵɵgetCurrentView();
|
|
637
|
-
i0.ɵɵelementStart(0, "div",
|
|
638
|
-
i0.ɵɵlistener("click", function
|
|
639
|
-
i0.ɵɵelement(1, "i",
|
|
640
|
-
i0.ɵɵelementStart(2, "span",
|
|
638
|
+
i0.ɵɵelementStart(0, "div", 138);
|
|
639
|
+
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", 139);
|
|
641
|
+
i0.ɵɵelementStart(2, "span", 140);
|
|
641
642
|
i0.ɵɵtext(3);
|
|
642
643
|
i0.ɵɵelementEnd()();
|
|
643
644
|
} if (rf & 2) {
|
|
@@ -645,98 +646,98 @@ function DuplicateDetectionResourceComponent_Conditional_68_For_47_Conditional_2
|
|
|
645
646
|
i0.ɵɵadvance(3);
|
|
646
647
|
i0.ɵɵtextInterpolate(record_r28.Name);
|
|
647
648
|
} }
|
|
648
|
-
function
|
|
649
|
-
i0.ɵɵelementStart(0, "div",
|
|
650
|
-
i0.ɵɵconditionalCreate(1,
|
|
651
|
-
i0.ɵɵrepeaterCreate(2,
|
|
649
|
+
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", 135);
|
|
651
|
+
i0.ɵɵconditionalCreate(1, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_Conditional_1_Template, 3, 0, "div", 136);
|
|
652
|
+
i0.ɵɵrepeaterCreate(2, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_For_3_Template, 4, 1, "div", 137, i0.ɵɵrepeaterTrackByIndex);
|
|
652
653
|
i0.ɵɵelementEnd();
|
|
653
654
|
} if (rf & 2) {
|
|
654
655
|
const dep_r26 = i0.ɵɵnextContext().$implicit;
|
|
655
|
-
const ɵ$
|
|
656
|
+
const ɵ$index_560_r23 = i0.ɵɵnextContext(3).$index;
|
|
656
657
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
657
658
|
i0.ɵɵadvance();
|
|
658
|
-
i0.ɵɵconditional(ctx_r1.IsDepRecordsLoading(ɵ$
|
|
659
|
+
i0.ɵɵconditional(ctx_r1.IsDepRecordsLoading(ɵ$index_560_r23 + 1, dep_r26.Entity) ? 1 : -1);
|
|
659
660
|
i0.ɵɵadvance();
|
|
660
|
-
i0.ɵɵrepeater(ctx_r1.GetDepRecords(ɵ$
|
|
661
|
+
i0.ɵɵrepeater(ctx_r1.GetDepRecords(ɵ$index_560_r23 + 1, dep_r26.Entity));
|
|
661
662
|
} }
|
|
662
|
-
function
|
|
663
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
663
664
|
const _r25 = i0.ɵɵgetCurrentView();
|
|
664
|
-
i0.ɵɵelementStart(0, "div",
|
|
665
|
-
i0.ɵɵlistener("click", function
|
|
666
|
-
i0.ɵɵelementStart(2, "span",
|
|
667
|
-
i0.ɵɵelement(3, "i",
|
|
665
|
+
i0.ɵɵelementStart(0, "div", 130)(1, "div", 131);
|
|
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 ɵ$index_560_r23 = i0.ɵɵnextContext(3).$index; const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.ToggleDepEntityGroup(ɵ$index_560_r23 + 1, dep_r26.Entity); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
667
|
+
i0.ɵɵelementStart(2, "span", 132);
|
|
668
|
+
i0.ɵɵelement(3, "i", 133);
|
|
668
669
|
i0.ɵɵtext(4);
|
|
669
670
|
i0.ɵɵelementEnd();
|
|
670
|
-
i0.ɵɵelementStart(5, "span",
|
|
671
|
+
i0.ɵɵelementStart(5, "span", 134);
|
|
671
672
|
i0.ɵɵtext(6);
|
|
672
673
|
i0.ɵɵelementEnd()();
|
|
673
|
-
i0.ɵɵconditionalCreate(7,
|
|
674
|
+
i0.ɵɵconditionalCreate(7, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Conditional_7_Template, 4, 1, "div", 135);
|
|
674
675
|
i0.ɵɵelementEnd();
|
|
675
676
|
} if (rf & 2) {
|
|
676
677
|
const dep_r26 = ctx.$implicit;
|
|
677
|
-
const ɵ$
|
|
678
|
+
const ɵ$index_560_r23 = i0.ɵɵnextContext(3).$index;
|
|
678
679
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
679
680
|
i0.ɵɵadvance(3);
|
|
680
|
-
i0.ɵɵclassProp("fa-chevron-right", !ctx_r1.IsDepEntityGroupExpanded(ɵ$
|
|
681
|
+
i0.ɵɵclassProp("fa-chevron-right", !ctx_r1.IsDepEntityGroupExpanded(ɵ$index_560_r23 + 1, dep_r26.Entity))("fa-chevron-down", ctx_r1.IsDepEntityGroupExpanded(ɵ$index_560_r23 + 1, dep_r26.Entity));
|
|
681
682
|
i0.ɵɵadvance();
|
|
682
683
|
i0.ɵɵtextInterpolate1(" ", dep_r26.Entity, " ");
|
|
683
684
|
i0.ɵɵadvance(2);
|
|
684
685
|
i0.ɵɵtextInterpolate(dep_r26.Count);
|
|
685
686
|
i0.ɵɵadvance();
|
|
686
|
-
i0.ɵɵconditional(ctx_r1.IsDepEntityGroupExpanded(ɵ$
|
|
687
|
+
i0.ɵɵconditional(ctx_r1.IsDepEntityGroupExpanded(ɵ$index_560_r23 + 1, dep_r26.Entity) ? 7 : -1);
|
|
687
688
|
} }
|
|
688
|
-
function
|
|
689
|
-
i0.ɵɵelementStart(0, "div",
|
|
690
|
-
i0.ɵɵrepeaterCreate(1,
|
|
689
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
690
|
+
i0.ɵɵelementStart(0, "div", 129);
|
|
691
|
+
i0.ɵɵrepeaterCreate(1, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_For_2_Template, 8, 7, "div", 130, _forTrack5);
|
|
691
692
|
i0.ɵɵelementEnd();
|
|
692
693
|
} if (rf & 2) {
|
|
693
|
-
const ɵ$
|
|
694
|
+
const ɵ$index_560_r23 = i0.ɵɵnextContext(2).$index;
|
|
694
695
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
695
696
|
i0.ɵɵadvance();
|
|
696
|
-
i0.ɵɵrepeater(ctx_r1.GetGroupedDeps(ɵ$
|
|
697
|
+
i0.ɵɵrepeater(ctx_r1.GetGroupedDeps(ɵ$index_560_r23 + 1));
|
|
697
698
|
} }
|
|
698
|
-
function
|
|
699
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
699
700
|
const _r24 = i0.ɵɵgetCurrentView();
|
|
700
|
-
i0.ɵɵelementStart(0, "div",
|
|
701
|
-
i0.ɵɵlistener("click", function
|
|
701
|
+
i0.ɵɵelementStart(0, "div", 128);
|
|
702
|
+
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r24); const ɵ$index_560_r23 = i0.ɵɵnextContext().$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleDepsExpanded(ɵ$index_560_r23 + 1)); });
|
|
702
703
|
i0.ɵɵelementStart(1, "span");
|
|
703
704
|
i0.ɵɵtext(2);
|
|
704
705
|
i0.ɵɵelementEnd();
|
|
705
|
-
i0.ɵɵelement(3, "i",
|
|
706
|
+
i0.ɵɵelement(3, "i", 111);
|
|
706
707
|
i0.ɵɵelementEnd();
|
|
707
|
-
i0.ɵɵconditionalCreate(4,
|
|
708
|
+
i0.ɵɵconditionalCreate(4, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Conditional_4_Template, 3, 0, "div", 129);
|
|
708
709
|
} if (rf & 2) {
|
|
709
|
-
const ɵ$
|
|
710
|
+
const ɵ$index_560_r23 = i0.ɵɵnextContext().$index;
|
|
710
711
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
711
712
|
i0.ɵɵadvance(2);
|
|
712
|
-
i0.ɵɵtextInterpolate(ctx_r1.IsDepsExpanded(ɵ$
|
|
713
|
+
i0.ɵɵtextInterpolate(ctx_r1.IsDepsExpanded(ɵ$index_560_r23 + 1) ? "Hide details" : "Show details");
|
|
713
714
|
i0.ɵɵadvance();
|
|
714
|
-
i0.ɵɵclassProp("fa-chevron-down", !ctx_r1.IsDepsExpanded(ɵ$
|
|
715
|
+
i0.ɵɵclassProp("fa-chevron-down", !ctx_r1.IsDepsExpanded(ɵ$index_560_r23 + 1))("fa-chevron-up", ctx_r1.IsDepsExpanded(ɵ$index_560_r23 + 1));
|
|
715
716
|
i0.ɵɵadvance();
|
|
716
|
-
i0.ɵɵconditional(ctx_r1.IsDepsExpanded(ɵ$
|
|
717
|
+
i0.ɵɵconditional(ctx_r1.IsDepsExpanded(ɵ$index_560_r23 + 1) ? 4 : -1);
|
|
717
718
|
} }
|
|
718
|
-
function
|
|
719
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
719
720
|
const _r29 = i0.ɵɵgetCurrentView();
|
|
720
|
-
i0.ɵɵelementStart(0, "button",
|
|
721
|
-
i0.ɵɵlistener("click", function
|
|
722
|
-
i0.ɵɵelement(1, "i",
|
|
721
|
+
i0.ɵɵelementStart(0, "button", 146);
|
|
722
|
+
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", 63);
|
|
723
724
|
i0.ɵɵtext(2, " Skip ");
|
|
724
725
|
i0.ɵɵelementEnd();
|
|
725
726
|
} }
|
|
726
|
-
function
|
|
727
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_25_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
727
728
|
const _r31 = i0.ɵɵgetCurrentView();
|
|
728
|
-
i0.ɵɵelementStart(0, "button",
|
|
729
|
-
i0.ɵɵlistener("click", function
|
|
730
|
-
i0.ɵɵelement(1, "i",
|
|
729
|
+
i0.ɵɵelementStart(0, "button", 149);
|
|
730
|
+
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", 150);
|
|
731
732
|
i0.ɵɵtext(2, " Undo ");
|
|
732
733
|
i0.ɵɵelementEnd();
|
|
733
734
|
} }
|
|
734
|
-
function
|
|
735
|
-
i0.ɵɵelementStart(0, "span",
|
|
736
|
-
i0.ɵɵelement(1, "i",
|
|
735
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
736
|
+
i0.ɵɵelementStart(0, "span", 147);
|
|
737
|
+
i0.ɵɵelement(1, "i", 111);
|
|
737
738
|
i0.ɵɵtext(2);
|
|
738
739
|
i0.ɵɵelementEnd();
|
|
739
|
-
i0.ɵɵconditionalCreate(3,
|
|
740
|
+
i0.ɵɵconditionalCreate(3, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_25_Conditional_3_Template, 3, 0, "button", 148);
|
|
740
741
|
} if (rf & 2) {
|
|
741
742
|
const match_r30 = i0.ɵɵnextContext().$implicit;
|
|
742
743
|
i0.ɵɵclassProp("status-approved", match_r30.Match.ApprovalStatus === "Approved")("status-rejected", match_r30.Match.ApprovalStatus === "Rejected");
|
|
@@ -747,44 +748,44 @@ function DuplicateDetectionResourceComponent_Conditional_68_For_47_Conditional_2
|
|
|
747
748
|
i0.ɵɵadvance();
|
|
748
749
|
i0.ɵɵconditional(match_r30.Match.ApprovalStatus === "Rejected" ? 3 : -1);
|
|
749
750
|
} }
|
|
750
|
-
function
|
|
751
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_47_Template(rf, ctx) { if (rf & 1) {
|
|
751
752
|
const _r22 = i0.ɵɵgetCurrentView();
|
|
752
|
-
i0.ɵɵelementStart(0, "div",
|
|
753
|
+
i0.ɵɵelementStart(0, "div", 141)(1, "div", 142)(2, "span", 106);
|
|
753
754
|
i0.ɵɵtext(3);
|
|
754
755
|
i0.ɵɵelementEnd();
|
|
755
|
-
i0.ɵɵelementStart(4, "span",
|
|
756
|
+
i0.ɵɵelementStart(4, "span", 71);
|
|
756
757
|
i0.ɵɵtext(5);
|
|
757
758
|
i0.ɵɵelementEnd()();
|
|
758
|
-
i0.ɵɵelementStart(6, "span",
|
|
759
|
+
i0.ɵɵelementStart(6, "span", 143);
|
|
759
760
|
i0.ɵɵtext(7);
|
|
760
761
|
i0.ɵɵelementEnd();
|
|
761
|
-
i0.ɵɵelementStart(8, "div",
|
|
762
|
-
i0.ɵɵlistener("change", function
|
|
762
|
+
i0.ɵɵelementStart(8, "div", 107)(9, "input", 108);
|
|
763
|
+
i0.ɵɵlistener("change", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Template_input_change_9_listener() { const ɵ$index_560_r23 = i0.ɵɵrestoreView(_r22).$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SetSurvivor(ɵ$index_560_r23 + 1)); });
|
|
763
764
|
i0.ɵɵelementEnd();
|
|
764
|
-
i0.ɵɵelementStart(10, "span",
|
|
765
|
+
i0.ɵɵelementStart(10, "span", 109);
|
|
765
766
|
i0.ɵɵtext(11);
|
|
766
767
|
i0.ɵɵelementEnd()();
|
|
767
|
-
i0.ɵɵelementStart(12, "button",
|
|
768
|
-
i0.ɵɵlistener("click", function
|
|
769
|
-
i0.ɵɵelement(13, "i",
|
|
768
|
+
i0.ɵɵelementStart(12, "button", 110);
|
|
769
|
+
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Conditional_64_For_47_Template_button_click_12_listener() { const ɵ$index_560_r23 = i0.ɵɵrestoreView(_r22).$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.UseAllFieldsFrom(ɵ$index_560_r23 + 1)); });
|
|
770
|
+
i0.ɵɵelement(13, "i", 111);
|
|
770
771
|
i0.ɵɵtext(14);
|
|
771
772
|
i0.ɵɵelementEnd();
|
|
772
|
-
i0.ɵɵelementStart(15, "div",
|
|
773
|
-
i0.ɵɵelement(17, "i",
|
|
774
|
-
i0.ɵɵelementStart(18, "span",
|
|
773
|
+
i0.ɵɵelementStart(15, "div", 112)(16, "div", 113);
|
|
774
|
+
i0.ɵɵelement(17, "i", 114);
|
|
775
|
+
i0.ɵɵelementStart(18, "span", 115);
|
|
775
776
|
i0.ɵɵtext(19);
|
|
776
777
|
i0.ɵɵelementEnd();
|
|
777
778
|
i0.ɵɵtext(20);
|
|
778
|
-
i0.ɵɵconditionalCreate(21,
|
|
779
|
+
i0.ɵɵconditionalCreate(21, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_21_Template, 3, 0, "span", 116);
|
|
779
780
|
i0.ɵɵelementEnd();
|
|
780
|
-
i0.ɵɵconditionalCreate(22,
|
|
781
|
+
i0.ɵɵconditionalCreate(22, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_22_Template, 5, 6);
|
|
781
782
|
i0.ɵɵelementEnd();
|
|
782
|
-
i0.ɵɵelementStart(23, "div",
|
|
783
|
-
i0.ɵɵconditionalCreate(24,
|
|
783
|
+
i0.ɵɵelementStart(23, "div", 144);
|
|
784
|
+
i0.ɵɵconditionalCreate(24, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_24_Template, 3, 0, "button", 145)(25, DuplicateDetectionResourceComponent_Conditional_64_For_47_Conditional_25_Template, 4, 10);
|
|
784
785
|
i0.ɵɵelementEnd()();
|
|
785
786
|
} if (rf & 2) {
|
|
786
787
|
const match_r30 = ctx.$implicit;
|
|
787
|
-
const ɵ$
|
|
788
|
+
const ɵ$index_560_r23 = ctx.$index;
|
|
788
789
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
789
790
|
i0.ɵɵclassProp("match-approved", match_r30.Match.ApprovalStatus === "Approved")("match-rejected", match_r30.Match.ApprovalStatus === "Rejected");
|
|
790
791
|
i0.ɵɵadvance(3);
|
|
@@ -796,111 +797,111 @@ function DuplicateDetectionResourceComponent_Conditional_68_For_47_Template(rf,
|
|
|
796
797
|
i0.ɵɵadvance(2);
|
|
797
798
|
i0.ɵɵtextInterpolate2("", match_r30.DiffCount, " difference", match_r30.DiffCount !== 1 ? "s" : "");
|
|
798
799
|
i0.ɵɵadvance(2);
|
|
799
|
-
i0.ɵɵproperty("checked", ctx_r1.SurvivorColumnIndex === ɵ$
|
|
800
|
+
i0.ɵɵproperty("checked", ctx_r1.SurvivorColumnIndex === ɵ$index_560_r23 + 1);
|
|
800
801
|
i0.ɵɵadvance();
|
|
801
|
-
i0.ɵɵclassProp("is-survivor", ctx_r1.SurvivorColumnIndex === ɵ$
|
|
802
|
+
i0.ɵɵclassProp("is-survivor", ctx_r1.SurvivorColumnIndex === ɵ$index_560_r23 + 1);
|
|
802
803
|
i0.ɵɵadvance();
|
|
803
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.SurvivorColumnIndex === ɵ$
|
|
804
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.SurvivorColumnIndex === ɵ$index_560_r23 + 1 ? "Surviving Record" : "Set as survivor", " ");
|
|
804
805
|
i0.ɵɵadvance();
|
|
805
|
-
i0.ɵɵclassProp("all-selected", ctx_r1.AllFieldsSelectedFrom(ɵ$
|
|
806
|
+
i0.ɵɵclassProp("all-selected", ctx_r1.AllFieldsSelectedFrom(ɵ$index_560_r23 + 1));
|
|
806
807
|
i0.ɵɵadvance();
|
|
807
|
-
i0.ɵɵclassProp("fa-check-double", ctx_r1.AllFieldsSelectedFrom(ɵ$
|
|
808
|
+
i0.ɵɵclassProp("fa-check-double", ctx_r1.AllFieldsSelectedFrom(ɵ$index_560_r23 + 1))("fa-clone", !ctx_r1.AllFieldsSelectedFrom(ɵ$index_560_r23 + 1));
|
|
808
809
|
i0.ɵɵadvance();
|
|
809
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.AllFieldsSelectedFrom(ɵ$
|
|
810
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.AllFieldsSelectedFrom(ɵ$index_560_r23 + 1) ? "Using all fields" : "Use all fields", " ");
|
|
810
811
|
i0.ɵɵadvance(5);
|
|
811
|
-
i0.ɵɵtextInterpolate(ctx_r1.GetTotalDeps(ɵ$
|
|
812
|
+
i0.ɵɵtextInterpolate(ctx_r1.GetTotalDeps(ɵ$index_560_r23 + 1));
|
|
812
813
|
i0.ɵɵadvance();
|
|
813
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.GetTotalDeps(ɵ$
|
|
814
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.GetTotalDeps(ɵ$index_560_r23 + 1) === 1 ? "dependency" : "dependencies", " ");
|
|
814
815
|
i0.ɵɵadvance();
|
|
815
|
-
i0.ɵɵconditional(ctx_r1.GetMaxDepsColumnIndex() === ɵ$
|
|
816
|
+
i0.ɵɵconditional(ctx_r1.GetMaxDepsColumnIndex() === ɵ$index_560_r23 + 1 && ctx_r1.GetTotalDeps(ɵ$index_560_r23 + 1) > 0 ? 21 : -1);
|
|
816
817
|
i0.ɵɵadvance();
|
|
817
|
-
i0.ɵɵconditional(ctx_r1.GetGroupedDeps(ɵ$
|
|
818
|
+
i0.ɵɵconditional(ctx_r1.GetGroupedDeps(ɵ$index_560_r23 + 1).length > 0 ? 22 : -1);
|
|
818
819
|
i0.ɵɵadvance(2);
|
|
819
820
|
i0.ɵɵconditional(match_r30.Match.ApprovalStatus === "Pending" ? 24 : 25);
|
|
820
821
|
} }
|
|
821
|
-
function
|
|
822
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
822
823
|
i0.ɵɵtext(0);
|
|
823
824
|
} if (rf & 2) {
|
|
824
825
|
const field_r33 = i0.ɵɵnextContext().$implicit;
|
|
825
826
|
i0.ɵɵtextInterpolate1(" ", field_r33.SourceValue, " ");
|
|
826
827
|
} }
|
|
827
|
-
function
|
|
828
|
-
i0.ɵɵelementStart(0, "span",
|
|
828
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
829
|
+
i0.ɵɵelementStart(0, "span", 153);
|
|
829
830
|
i0.ɵɵtext(1, "(not available)");
|
|
830
831
|
i0.ɵɵelementEnd();
|
|
831
832
|
} }
|
|
832
|
-
function
|
|
833
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
833
834
|
const _r34 = i0.ɵɵgetCurrentView();
|
|
834
|
-
i0.ɵɵelementStart(0, "input",
|
|
835
|
-
i0.ɵɵlistener("click", function
|
|
835
|
+
i0.ɵɵelementStart(0, "input", 156);
|
|
836
|
+
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)); });
|
|
836
837
|
i0.ɵɵelementEnd();
|
|
837
838
|
} if (rf & 2) {
|
|
838
839
|
const field_r33 = i0.ɵɵnextContext().$implicit;
|
|
839
840
|
i0.ɵɵproperty("name", "field-" + field_r33.FieldName)("checked", field_r33.SelectedColumnIndex === 0);
|
|
840
841
|
} }
|
|
841
|
-
function
|
|
842
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
842
843
|
const _r39 = i0.ɵɵgetCurrentView();
|
|
843
|
-
i0.ɵɵelementStart(0, "input",
|
|
844
|
-
i0.ɵɵlistener("click", function
|
|
844
|
+
i0.ɵɵelementStart(0, "input", 156);
|
|
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 ɵ$index_678_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_678_r38 + 1)); });
|
|
845
846
|
i0.ɵɵelementEnd();
|
|
846
847
|
} if (rf & 2) {
|
|
847
|
-
const ɵ$
|
|
848
|
+
const ɵ$index_678_r38 = i0.ɵɵnextContext(2).$index;
|
|
848
849
|
const field_r33 = i0.ɵɵnextContext().$implicit;
|
|
849
|
-
i0.ɵɵproperty("name", "field-" + field_r33.FieldName)("checked", field_r33.SelectedColumnIndex === ɵ$
|
|
850
|
+
i0.ɵɵproperty("name", "field-" + field_r33.FieldName)("checked", field_r33.SelectedColumnIndex === ɵ$index_678_r38 + 1);
|
|
850
851
|
} }
|
|
851
|
-
function
|
|
852
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
852
853
|
i0.ɵɵtext(0);
|
|
853
|
-
i0.ɵɵconditionalCreate(1,
|
|
854
|
+
i0.ɵɵconditionalCreate(1, DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_1_Conditional_1_Template, 1, 2, "input", 154);
|
|
854
855
|
} if (rf & 2) {
|
|
855
856
|
const ctx_r39 = i0.ɵɵnextContext();
|
|
856
857
|
const matchVal_r37 = ctx_r39.$implicit;
|
|
857
|
-
const ɵ$
|
|
858
|
+
const ɵ$index_678_r38 = ctx_r39.$index;
|
|
858
859
|
const field_r33 = i0.ɵɵnextContext().$implicit;
|
|
859
860
|
i0.ɵɵtextInterpolate1(" ", matchVal_r37, " ");
|
|
860
861
|
i0.ɵɵadvance();
|
|
861
|
-
i0.ɵɵconditional(field_r33.HasDifference || field_r33.SelectedColumnIndex === ɵ$
|
|
862
|
+
i0.ɵɵconditional(field_r33.HasDifference || field_r33.SelectedColumnIndex === ɵ$index_678_r38 + 1 ? 1 : -1);
|
|
862
863
|
} }
|
|
863
|
-
function
|
|
864
|
-
i0.ɵɵelementStart(0, "span",
|
|
864
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
865
|
+
i0.ɵɵelementStart(0, "span", 153);
|
|
865
866
|
i0.ɵɵtext(1, "(not available)");
|
|
866
867
|
i0.ɵɵelementEnd();
|
|
867
868
|
} }
|
|
868
|
-
function
|
|
869
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
869
870
|
const _r35 = i0.ɵɵgetCurrentView();
|
|
870
|
-
i0.ɵɵelementStart(0, "div",
|
|
871
|
-
i0.ɵɵlistener("click", function
|
|
872
|
-
i0.ɵɵconditionalCreate(1,
|
|
871
|
+
i0.ɵɵelementStart(0, "div", 157);
|
|
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 ɵ$index_678_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_678_r38 + 1) : null); });
|
|
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", 153);
|
|
873
874
|
i0.ɵɵelementEnd();
|
|
874
875
|
} if (rf & 2) {
|
|
875
876
|
const matchVal_r37 = ctx.$implicit;
|
|
876
|
-
const ɵ$
|
|
877
|
+
const ɵ$index_678_r38 = ctx.$index;
|
|
877
878
|
const ctx_r40 = i0.ɵɵnextContext();
|
|
878
879
|
const field_r33 = ctx_r40.$implicit;
|
|
879
|
-
const ɵ$
|
|
880
|
+
const ɵ$index_663_r42 = ctx_r40.$index;
|
|
880
881
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
881
|
-
i0.ɵɵclassProp("grid-row-odd", ɵ$
|
|
882
|
+
i0.ɵɵclassProp("grid-row-odd", ɵ$index_663_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_678_r38 + 1);
|
|
882
883
|
i0.ɵɵadvance();
|
|
883
884
|
i0.ɵɵconditional(matchVal_r37 != null ? 1 : 2);
|
|
884
885
|
} }
|
|
885
|
-
function
|
|
886
|
+
function DuplicateDetectionResourceComponent_Conditional_64_For_49_Template(rf, ctx) { if (rf & 1) {
|
|
886
887
|
const _r32 = i0.ɵɵgetCurrentView();
|
|
887
|
-
i0.ɵɵelementStart(0, "div",
|
|
888
|
+
i0.ɵɵelementStart(0, "div", 151);
|
|
888
889
|
i0.ɵɵtext(1);
|
|
889
890
|
i0.ɵɵelementEnd();
|
|
890
|
-
i0.ɵɵelementStart(2, "div",
|
|
891
|
-
i0.ɵɵlistener("click", function
|
|
892
|
-
i0.ɵɵconditionalCreate(3,
|
|
893
|
-
i0.ɵɵconditionalCreate(5,
|
|
891
|
+
i0.ɵɵelementStart(2, "div", 152);
|
|
892
|
+
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", 153);
|
|
894
|
+
i0.ɵɵconditionalCreate(5, DuplicateDetectionResourceComponent_Conditional_64_For_49_Conditional_5_Template, 1, 2, "input", 154);
|
|
894
895
|
i0.ɵɵelementEnd();
|
|
895
|
-
i0.ɵɵrepeaterCreate(6,
|
|
896
|
+
i0.ɵɵrepeaterCreate(6, DuplicateDetectionResourceComponent_Conditional_64_For_49_For_7_Template, 3, 9, "div", 155, i0.ɵɵrepeaterTrackByIndex);
|
|
896
897
|
} if (rf & 2) {
|
|
897
898
|
const field_r33 = ctx.$implicit;
|
|
898
|
-
const ɵ$
|
|
899
|
-
i0.ɵɵclassProp("grid-row-odd", ɵ$
|
|
899
|
+
const ɵ$index_663_r42 = ctx.$index;
|
|
900
|
+
i0.ɵɵclassProp("grid-row-odd", ɵ$index_663_r42 % 2 !== 0);
|
|
900
901
|
i0.ɵɵadvance();
|
|
901
902
|
i0.ɵɵtextInterpolate1(" ", field_r33.DisplayName, " ");
|
|
902
903
|
i0.ɵɵadvance();
|
|
903
|
-
i0.ɵɵclassProp("grid-row-odd", ɵ$
|
|
904
|
+
i0.ɵɵclassProp("grid-row-odd", ɵ$index_663_r42 % 2 !== 0)("has-diff-in-row", field_r33.HasDifference)("field-selected", field_r33.SelectedColumnIndex === 0);
|
|
904
905
|
i0.ɵɵadvance();
|
|
905
906
|
i0.ɵɵconditional(field_r33.SourceValue != null ? 3 : 4);
|
|
906
907
|
i0.ɵɵadvance(2);
|
|
@@ -908,105 +909,105 @@ function DuplicateDetectionResourceComponent_Conditional_68_For_49_Template(rf,
|
|
|
908
909
|
i0.ɵɵadvance();
|
|
909
910
|
i0.ɵɵrepeater(field_r33.MatchValues);
|
|
910
911
|
} }
|
|
911
|
-
function
|
|
912
|
+
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_59_Template(rf, ctx) { if (rf & 1) {
|
|
912
913
|
i0.ɵɵtext(0);
|
|
913
914
|
} if (rf & 2) {
|
|
914
915
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
915
916
|
i0.ɵɵtextInterpolate2(" \u00B7 ", ctx_r1.CherryPickedCount(), " field", ctx_r1.CherryPickedCount() !== 1 ? "s" : "", " cherry-picked ");
|
|
916
917
|
} }
|
|
917
|
-
function
|
|
918
|
-
i0.ɵɵelementStart(0, "span",
|
|
919
|
-
i0.ɵɵelement(1, "i",
|
|
918
|
+
function DuplicateDetectionResourceComponent_Conditional_64_Conditional_67_Template(rf, ctx) { if (rf & 1) {
|
|
919
|
+
i0.ɵɵelementStart(0, "span", 125);
|
|
920
|
+
i0.ɵɵelement(1, "i", 158);
|
|
920
921
|
i0.ɵɵtext(2, " Merging disabled for this entity");
|
|
921
922
|
i0.ɵɵelementEnd();
|
|
922
923
|
} }
|
|
923
|
-
function
|
|
924
|
+
function DuplicateDetectionResourceComponent_Conditional_64_Template(rf, ctx) { if (rf & 1) {
|
|
924
925
|
const _r16 = i0.ɵɵgetCurrentView();
|
|
925
|
-
i0.ɵɵelementStart(0, "div",
|
|
926
|
-
i0.ɵɵlistener("click", function
|
|
926
|
+
i0.ɵɵelementStart(0, "div", 88);
|
|
927
|
+
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()); });
|
|
927
928
|
i0.ɵɵelementEnd();
|
|
928
|
-
i0.ɵɵelementStart(1, "div",
|
|
929
|
-
i0.ɵɵlistener("click", function
|
|
930
|
-
i0.ɵɵelementStart(2, "div",
|
|
929
|
+
i0.ɵɵelementStart(1, "div", 89);
|
|
930
|
+
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", 90)(3, "div", 91)(4, "div", 92);
|
|
931
932
|
i0.ɵɵelement(5, "i");
|
|
932
933
|
i0.ɵɵelementEnd();
|
|
933
|
-
i0.ɵɵelementStart(6, "div")(7, "div",
|
|
934
|
+
i0.ɵɵelementStart(6, "div")(7, "div", 93);
|
|
934
935
|
i0.ɵɵtext(8);
|
|
935
936
|
i0.ɵɵelementEnd();
|
|
936
|
-
i0.ɵɵelementStart(9, "span",
|
|
937
|
+
i0.ɵɵelementStart(9, "span", 94);
|
|
937
938
|
i0.ɵɵtext(10);
|
|
938
939
|
i0.ɵɵelementEnd();
|
|
939
|
-
i0.ɵɵelementStart(11, "span",
|
|
940
|
+
i0.ɵɵelementStart(11, "span", 95);
|
|
940
941
|
i0.ɵɵtext(12);
|
|
941
942
|
i0.ɵɵelementEnd()()();
|
|
942
|
-
i0.ɵɵelementStart(13, "div",
|
|
943
|
-
i0.ɵɵlistener("click", function
|
|
943
|
+
i0.ɵɵelementStart(13, "div", 96)(14, "div", 97)(15, "button", 98);
|
|
944
|
+
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); });
|
|
944
945
|
i0.ɵɵtext(16, "All Fields");
|
|
945
946
|
i0.ɵɵelementEnd();
|
|
946
|
-
i0.ɵɵelementStart(17, "button",
|
|
947
|
-
i0.ɵɵlistener("click", function
|
|
947
|
+
i0.ɵɵelementStart(17, "button", 98);
|
|
948
|
+
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); });
|
|
948
949
|
i0.ɵɵtext(18, "Differences Only");
|
|
949
950
|
i0.ɵɵelementEnd()();
|
|
950
|
-
i0.ɵɵelementStart(19, "button",
|
|
951
|
-
i0.ɵɵlistener("click", function
|
|
952
|
-
i0.ɵɵelement(20, "i",
|
|
951
|
+
i0.ɵɵelementStart(19, "button", 99);
|
|
952
|
+
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", 46);
|
|
953
954
|
i0.ɵɵelementEnd()()();
|
|
954
|
-
i0.ɵɵconditionalCreate(21,
|
|
955
|
-
i0.ɵɵelementStart(22, "div",
|
|
955
|
+
i0.ɵɵconditionalCreate(21, DuplicateDetectionResourceComponent_Conditional_64_Conditional_21_Template, 2, 0, "div", 100);
|
|
956
|
+
i0.ɵɵelementStart(22, "div", 101)(23, "div", 102)(24, "div", 103);
|
|
956
957
|
i0.ɵɵtext(25, "Field");
|
|
957
958
|
i0.ɵɵelementEnd();
|
|
958
|
-
i0.ɵɵelementStart(26, "div",
|
|
959
|
+
i0.ɵɵelementStart(26, "div", 104)(27, "span", 105);
|
|
959
960
|
i0.ɵɵtext(28, "Source");
|
|
960
961
|
i0.ɵɵelementEnd();
|
|
961
|
-
i0.ɵɵelementStart(29, "span",
|
|
962
|
+
i0.ɵɵelementStart(29, "span", 106);
|
|
962
963
|
i0.ɵɵtext(30);
|
|
963
964
|
i0.ɵɵelementEnd();
|
|
964
|
-
i0.ɵɵelementStart(31, "div",
|
|
965
|
-
i0.ɵɵlistener("change", function
|
|
965
|
+
i0.ɵɵelementStart(31, "div", 107)(32, "input", 108);
|
|
966
|
+
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)); });
|
|
966
967
|
i0.ɵɵelementEnd();
|
|
967
|
-
i0.ɵɵelementStart(33, "span",
|
|
968
|
+
i0.ɵɵelementStart(33, "span", 109);
|
|
968
969
|
i0.ɵɵtext(34);
|
|
969
970
|
i0.ɵɵelementEnd()();
|
|
970
|
-
i0.ɵɵelementStart(35, "button",
|
|
971
|
-
i0.ɵɵlistener("click", function
|
|
972
|
-
i0.ɵɵelement(36, "i",
|
|
971
|
+
i0.ɵɵelementStart(35, "button", 110);
|
|
972
|
+
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", 111);
|
|
973
974
|
i0.ɵɵtext(37);
|
|
974
975
|
i0.ɵɵelementEnd();
|
|
975
|
-
i0.ɵɵelementStart(38, "div",
|
|
976
|
-
i0.ɵɵelement(40, "i",
|
|
977
|
-
i0.ɵɵelementStart(41, "span",
|
|
976
|
+
i0.ɵɵelementStart(38, "div", 112)(39, "div", 113);
|
|
977
|
+
i0.ɵɵelement(40, "i", 114);
|
|
978
|
+
i0.ɵɵelementStart(41, "span", 115);
|
|
978
979
|
i0.ɵɵtext(42);
|
|
979
980
|
i0.ɵɵelementEnd();
|
|
980
981
|
i0.ɵɵtext(43);
|
|
981
|
-
i0.ɵɵconditionalCreate(44,
|
|
982
|
+
i0.ɵɵconditionalCreate(44, DuplicateDetectionResourceComponent_Conditional_64_Conditional_44_Template, 3, 0, "span", 116);
|
|
982
983
|
i0.ɵɵelementEnd();
|
|
983
|
-
i0.ɵɵconditionalCreate(45,
|
|
984
|
+
i0.ɵɵconditionalCreate(45, DuplicateDetectionResourceComponent_Conditional_64_Conditional_45_Template, 5, 6);
|
|
984
985
|
i0.ɵɵelementEnd()();
|
|
985
|
-
i0.ɵɵrepeaterCreate(46,
|
|
986
|
-
i0.ɵɵrepeaterCreate(48,
|
|
986
|
+
i0.ɵɵrepeaterCreate(46, DuplicateDetectionResourceComponent_Conditional_64_For_47_Template, 26, 26, "div", 117, _forTrack3);
|
|
987
|
+
i0.ɵɵrepeaterCreate(48, DuplicateDetectionResourceComponent_Conditional_64_For_49_Template, 8, 11, null, null, _forTrack4);
|
|
987
988
|
i0.ɵɵelementEnd()();
|
|
988
|
-
i0.ɵɵelementStart(50, "div",
|
|
989
|
+
i0.ɵɵelementStart(50, "div", 118)(51, "div", 119)(52, "span", 120);
|
|
989
990
|
i0.ɵɵtext(53);
|
|
990
991
|
i0.ɵɵelementEnd();
|
|
991
|
-
i0.ɵɵelementStart(54, "span",
|
|
992
|
-
i0.ɵɵelement(55, "i",
|
|
992
|
+
i0.ɵɵelementStart(54, "span", 121);
|
|
993
|
+
i0.ɵɵelement(55, "i", 122);
|
|
993
994
|
i0.ɵɵtext(56, " Surviving: ");
|
|
994
995
|
i0.ɵɵelementStart(57, "strong");
|
|
995
996
|
i0.ɵɵtext(58);
|
|
996
997
|
i0.ɵɵelementEnd();
|
|
997
|
-
i0.ɵɵconditionalCreate(59,
|
|
998
|
+
i0.ɵɵconditionalCreate(59, DuplicateDetectionResourceComponent_Conditional_64_Conditional_59_Template, 1, 2);
|
|
998
999
|
i0.ɵɵelementEnd()();
|
|
999
|
-
i0.ɵɵelementStart(60, "div",
|
|
1000
|
-
i0.ɵɵlistener("click", function
|
|
1001
|
-
i0.ɵɵelement(62, "i",
|
|
1000
|
+
i0.ɵɵelementStart(60, "div", 123)(61, "button", 81);
|
|
1001
|
+
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", 46);
|
|
1002
1003
|
i0.ɵɵtext(63, " Reject All ");
|
|
1003
1004
|
i0.ɵɵelementEnd();
|
|
1004
|
-
i0.ɵɵelementStart(64, "button",
|
|
1005
|
-
i0.ɵɵlistener("click", function
|
|
1006
|
-
i0.ɵɵelement(65, "i",
|
|
1005
|
+
i0.ɵɵelementStart(64, "button", 124);
|
|
1006
|
+
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", 122);
|
|
1007
1008
|
i0.ɵɵtext(66, " Merge Records ");
|
|
1008
1009
|
i0.ɵɵelementEnd();
|
|
1009
|
-
i0.ɵɵconditionalCreate(67,
|
|
1010
|
+
i0.ɵɵconditionalCreate(67, DuplicateDetectionResourceComponent_Conditional_64_Conditional_67_Template, 3, 0, "span", 125);
|
|
1010
1011
|
i0.ɵɵelementEnd()()();
|
|
1011
1012
|
} if (rf & 2) {
|
|
1012
1013
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -1070,14 +1071,14 @@ function DuplicateDetectionResourceComponent_Conditional_68_Template(rf, ctx) {
|
|
|
1070
1071
|
i0.ɵɵadvance(3);
|
|
1071
1072
|
i0.ɵɵconditional(!ctx_r1.MergeEnabled ? 67 : -1);
|
|
1072
1073
|
} }
|
|
1073
|
-
function
|
|
1074
|
-
i0.ɵɵelementStart(0, "div",
|
|
1074
|
+
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_22_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
1075
|
+
i0.ɵɵelementStart(0, "div", 183)(1, "span", 184);
|
|
1075
1076
|
i0.ɵɵtext(2);
|
|
1076
1077
|
i0.ɵɵelementEnd();
|
|
1077
|
-
i0.ɵɵelementStart(3, "span",
|
|
1078
|
+
i0.ɵɵelementStart(3, "span", 185);
|
|
1078
1079
|
i0.ɵɵtext(4);
|
|
1079
1080
|
i0.ɵɵelementEnd();
|
|
1080
|
-
i0.ɵɵelementStart(5, "span",
|
|
1081
|
+
i0.ɵɵelementStart(5, "span", 186);
|
|
1081
1082
|
i0.ɵɵtext(6);
|
|
1082
1083
|
i0.ɵɵelementEnd()();
|
|
1083
1084
|
} if (rf & 2) {
|
|
@@ -1089,11 +1090,11 @@ function DuplicateDetectionResourceComponent_Conditional_69_Conditional_22_For_4
|
|
|
1089
1090
|
i0.ɵɵadvance(2);
|
|
1090
1091
|
i0.ɵɵtextInterpolate1("from ", field_r44.SourceName);
|
|
1091
1092
|
} }
|
|
1092
|
-
function
|
|
1093
|
-
i0.ɵɵelementStart(0, "div")(1, "div",
|
|
1093
|
+
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
1094
|
+
i0.ɵɵelementStart(0, "div")(1, "div", 182);
|
|
1094
1095
|
i0.ɵɵtext(2);
|
|
1095
1096
|
i0.ɵɵelementEnd();
|
|
1096
|
-
i0.ɵɵrepeaterCreate(3,
|
|
1097
|
+
i0.ɵɵrepeaterCreate(3, DuplicateDetectionResourceComponent_Conditional_65_Conditional_22_For_4_Template, 7, 3, "div", 183, _forTrack4);
|
|
1097
1098
|
i0.ɵɵelementEnd();
|
|
1098
1099
|
} if (rf & 2) {
|
|
1099
1100
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1102,7 +1103,7 @@ function DuplicateDetectionResourceComponent_Conditional_69_Conditional_22_Templ
|
|
|
1102
1103
|
i0.ɵɵadvance();
|
|
1103
1104
|
i0.ɵɵrepeater(ctx_r1.GetCherryPickedFields());
|
|
1104
1105
|
} }
|
|
1105
|
-
function
|
|
1106
|
+
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_For_5_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
1106
1107
|
i0.ɵɵelementStart(0, "strong");
|
|
1107
1108
|
i0.ɵɵtext(1);
|
|
1108
1109
|
i0.ɵɵelementEnd();
|
|
@@ -1123,7 +1124,7 @@ function DuplicateDetectionResourceComponent_Conditional_69_Conditional_23_For_5
|
|
|
1123
1124
|
i0.ɵɵadvance();
|
|
1124
1125
|
i0.ɵɵtextInterpolate1(" \u2192 ", ctx_r1.SurvivorName(), " ");
|
|
1125
1126
|
} }
|
|
1126
|
-
function
|
|
1127
|
+
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_For_5_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1127
1128
|
i0.ɵɵelementStart(0, "strong");
|
|
1128
1129
|
i0.ɵɵtext(1, "0");
|
|
1129
1130
|
i0.ɵɵelementEnd();
|
|
@@ -1136,44 +1137,44 @@ function DuplicateDetectionResourceComponent_Conditional_69_Conditional_23_For_5
|
|
|
1136
1137
|
i0.ɵɵadvance(4);
|
|
1137
1138
|
i0.ɵɵtextInterpolate(col_r45.Name);
|
|
1138
1139
|
} }
|
|
1139
|
-
function
|
|
1140
|
-
i0.ɵɵelementStart(0, "div",
|
|
1141
|
-
i0.ɵɵelement(1, "i",
|
|
1140
|
+
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
1141
|
+
i0.ɵɵelementStart(0, "div", 189);
|
|
1142
|
+
i0.ɵɵelement(1, "i", 190);
|
|
1142
1143
|
i0.ɵɵelementStart(2, "span");
|
|
1143
|
-
i0.ɵɵconditionalCreate(3,
|
|
1144
|
+
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);
|
|
1144
1145
|
i0.ɵɵelementEnd()();
|
|
1145
1146
|
} if (rf & 2) {
|
|
1146
1147
|
const col_r45 = ctx.$implicit;
|
|
1147
1148
|
i0.ɵɵadvance(3);
|
|
1148
1149
|
i0.ɵɵconditional(col_r45.DepCount > 0 ? 3 : 4);
|
|
1149
1150
|
} }
|
|
1150
|
-
function
|
|
1151
|
-
i0.ɵɵelementStart(0, "div",
|
|
1152
|
-
i0.ɵɵelement(2, "i",
|
|
1151
|
+
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
1152
|
+
i0.ɵɵelementStart(0, "div", 173)(1, "div", 187);
|
|
1153
|
+
i0.ɵɵelement(2, "i", 188);
|
|
1153
1154
|
i0.ɵɵtext(3, " Dependencies to Transfer");
|
|
1154
1155
|
i0.ɵɵelementEnd();
|
|
1155
|
-
i0.ɵɵrepeaterCreate(4,
|
|
1156
|
+
i0.ɵɵrepeaterCreate(4, DuplicateDetectionResourceComponent_Conditional_65_Conditional_23_For_5_Template, 5, 1, "div", 189, _forTrack6);
|
|
1156
1157
|
i0.ɵɵelementEnd();
|
|
1157
1158
|
} if (rf & 2) {
|
|
1158
1159
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1159
1160
|
i0.ɵɵadvance(4);
|
|
1160
1161
|
i0.ɵɵrepeater(ctx_r1.GetNonSurvivorColumns());
|
|
1161
1162
|
} }
|
|
1162
|
-
function
|
|
1163
|
+
function DuplicateDetectionResourceComponent_Conditional_65_For_29_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1163
1164
|
i0.ɵɵtext(0);
|
|
1164
1165
|
} if (rf & 2) {
|
|
1165
1166
|
const col_r46 = i0.ɵɵnextContext().$implicit;
|
|
1166
1167
|
i0.ɵɵtextInterpolate2(" ", col_r46.DepCount, " dep", col_r46.DepCount !== 1 ? "s" : "", " transferring ");
|
|
1167
1168
|
} }
|
|
1168
|
-
function
|
|
1169
|
+
function DuplicateDetectionResourceComponent_Conditional_65_For_29_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
1169
1170
|
i0.ɵɵtext(0, " no deps ");
|
|
1170
1171
|
} }
|
|
1171
|
-
function
|
|
1172
|
-
i0.ɵɵelementStart(0, "div",
|
|
1172
|
+
function DuplicateDetectionResourceComponent_Conditional_65_For_29_Template(rf, ctx) { if (rf & 1) {
|
|
1173
|
+
i0.ɵɵelementStart(0, "div", 177)(1, "span", 191);
|
|
1173
1174
|
i0.ɵɵtext(2);
|
|
1174
1175
|
i0.ɵɵelementEnd();
|
|
1175
|
-
i0.ɵɵelementStart(3, "span",
|
|
1176
|
-
i0.ɵɵconditionalCreate(4,
|
|
1176
|
+
i0.ɵɵelementStart(3, "span", 192);
|
|
1177
|
+
i0.ɵɵconditionalCreate(4, DuplicateDetectionResourceComponent_Conditional_65_For_29_Conditional_4_Template, 1, 2)(5, DuplicateDetectionResourceComponent_Conditional_65_For_29_Conditional_5_Template, 1, 0);
|
|
1177
1178
|
i0.ɵɵelementEnd()();
|
|
1178
1179
|
} if (rf & 2) {
|
|
1179
1180
|
const col_r46 = ctx.$implicit;
|
|
@@ -1182,63 +1183,63 @@ function DuplicateDetectionResourceComponent_Conditional_69_For_29_Template(rf,
|
|
|
1182
1183
|
i0.ɵɵadvance(2);
|
|
1183
1184
|
i0.ɵɵconditional(col_r46.DepCount > 0 ? 4 : 5);
|
|
1184
1185
|
} }
|
|
1185
|
-
function
|
|
1186
|
-
i0.ɵɵelement(0, "i",
|
|
1186
|
+
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
1187
|
+
i0.ɵɵelement(0, "i", 30);
|
|
1187
1188
|
i0.ɵɵtext(1, " Merging... ");
|
|
1188
1189
|
} }
|
|
1189
|
-
function
|
|
1190
|
-
i0.ɵɵelement(0, "i",
|
|
1190
|
+
function DuplicateDetectionResourceComponent_Conditional_65_Conditional_36_Template(rf, ctx) { if (rf & 1) {
|
|
1191
|
+
i0.ɵɵelement(0, "i", 122);
|
|
1191
1192
|
i0.ɵɵtext(1);
|
|
1192
1193
|
} if (rf & 2) {
|
|
1193
1194
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1194
1195
|
i0.ɵɵadvance();
|
|
1195
1196
|
i0.ɵɵtextInterpolate1(" Confirm Merge (", ctx_r1.GetNonSurvivorColumns().length + 1, " records \u2192 1) ");
|
|
1196
1197
|
} }
|
|
1197
|
-
function
|
|
1198
|
+
function DuplicateDetectionResourceComponent_Conditional_65_Template(rf, ctx) { if (rf & 1) {
|
|
1198
1199
|
const _r43 = i0.ɵɵgetCurrentView();
|
|
1199
|
-
i0.ɵɵelementStart(0, "div",
|
|
1200
|
-
i0.ɵɵlistener("click", function
|
|
1201
|
-
i0.ɵɵelementStart(1, "div",
|
|
1202
|
-
i0.ɵɵlistener("click", function
|
|
1203
|
-
i0.ɵɵelementStart(2, "div",
|
|
1204
|
-
i0.ɵɵelement(4, "i",
|
|
1205
|
-
i0.ɵɵelementEnd();
|
|
1206
|
-
i0.ɵɵelementStart(5, "div")(6, "div",
|
|
1200
|
+
i0.ɵɵelementStart(0, "div", 159);
|
|
1201
|
+
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", 160);
|
|
1203
|
+
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", 161)(3, "div", 162);
|
|
1205
|
+
i0.ɵɵelement(4, "i", 122);
|
|
1206
|
+
i0.ɵɵelementEnd();
|
|
1207
|
+
i0.ɵɵelementStart(5, "div")(6, "div", 163);
|
|
1207
1208
|
i0.ɵɵtext(7, "Confirm Record Merge");
|
|
1208
1209
|
i0.ɵɵelementEnd();
|
|
1209
|
-
i0.ɵɵelementStart(8, "div",
|
|
1210
|
+
i0.ɵɵelementStart(8, "div", 164);
|
|
1210
1211
|
i0.ɵɵtext(9, "This action cannot be undone. Please review carefully.");
|
|
1211
1212
|
i0.ɵɵelementEnd()()();
|
|
1212
|
-
i0.ɵɵelementStart(10, "div",
|
|
1213
|
-
i0.ɵɵelement(13, "i",
|
|
1213
|
+
i0.ɵɵelementStart(10, "div", 165)(11, "div", 166)(12, "div", 167);
|
|
1214
|
+
i0.ɵɵelement(13, "i", 168);
|
|
1214
1215
|
i0.ɵɵtext(14, " Surviving Record");
|
|
1215
1216
|
i0.ɵɵelementEnd();
|
|
1216
|
-
i0.ɵɵelementStart(15, "div",
|
|
1217
|
+
i0.ɵɵelementStart(15, "div", 169);
|
|
1217
1218
|
i0.ɵɵtext(16);
|
|
1218
1219
|
i0.ɵɵelementEnd();
|
|
1219
|
-
i0.ɵɵelementStart(17, "div",
|
|
1220
|
-
i0.ɵɵelement(18, "i",
|
|
1220
|
+
i0.ɵɵelementStart(17, "div", 170);
|
|
1221
|
+
i0.ɵɵelement(18, "i", 171);
|
|
1221
1222
|
i0.ɵɵtext(19);
|
|
1222
1223
|
i0.ɵɵelementEnd();
|
|
1223
|
-
i0.ɵɵelementStart(20, "div",
|
|
1224
|
+
i0.ɵɵelementStart(20, "div", 172);
|
|
1224
1225
|
i0.ɵɵtext(21, "This record's ID will be retained. All dependencies from merged records will be transferred here.");
|
|
1225
1226
|
i0.ɵɵelementEnd()();
|
|
1226
|
-
i0.ɵɵconditionalCreate(22,
|
|
1227
|
-
i0.ɵɵconditionalCreate(23,
|
|
1228
|
-
i0.ɵɵelementStart(24, "div",
|
|
1229
|
-
i0.ɵɵelement(26, "i",
|
|
1227
|
+
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", 173);
|
|
1229
|
+
i0.ɵɵelementStart(24, "div", 174)(25, "div", 175);
|
|
1230
|
+
i0.ɵɵelement(26, "i", 176);
|
|
1230
1231
|
i0.ɵɵtext(27, " Records to Delete After Merge");
|
|
1231
1232
|
i0.ɵɵelementEnd();
|
|
1232
|
-
i0.ɵɵrepeaterCreate(28,
|
|
1233
|
+
i0.ɵɵrepeaterCreate(28, DuplicateDetectionResourceComponent_Conditional_65_For_29_Template, 6, 2, "div", 177, _forTrack6);
|
|
1233
1234
|
i0.ɵɵelementEnd()();
|
|
1234
|
-
i0.ɵɵelementStart(30, "div",
|
|
1235
|
-
i0.ɵɵlistener("click", function
|
|
1236
|
-
i0.ɵɵelement(32, "i",
|
|
1235
|
+
i0.ɵɵelementStart(30, "div", 178)(31, "button", 179);
|
|
1236
|
+
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", 180);
|
|
1237
1238
|
i0.ɵɵtext(33, " Back ");
|
|
1238
1239
|
i0.ɵɵelementEnd();
|
|
1239
|
-
i0.ɵɵelementStart(34, "button",
|
|
1240
|
-
i0.ɵɵlistener("click", function
|
|
1241
|
-
i0.ɵɵconditionalCreate(35,
|
|
1240
|
+
i0.ɵɵelementStart(34, "button", 181);
|
|
1241
|
+
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
|
+
i0.ɵɵconditionalCreate(35, DuplicateDetectionResourceComponent_Conditional_65_Conditional_35_Template, 2, 0)(36, DuplicateDetectionResourceComponent_Conditional_65_Conditional_36_Template, 2, 1);
|
|
1242
1243
|
i0.ɵɵelementEnd()()()();
|
|
1243
1244
|
} if (rf & 2) {
|
|
1244
1245
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -1350,8 +1351,11 @@ let DuplicateDetectionResourceComponent = class DuplicateDetectionResourceCompon
|
|
|
1350
1351
|
this.RunAbsoluteThreshold = doc.AbsoluteMatchThreshold;
|
|
1351
1352
|
}
|
|
1352
1353
|
}
|
|
1353
|
-
/**
|
|
1354
|
-
|
|
1354
|
+
/**
|
|
1355
|
+
* When true, renders only the body content (no chrome). Set by parent shells
|
|
1356
|
+
* that embed this resource. See plans/explorer-chrome-conventions.md Section 5.
|
|
1357
|
+
*/
|
|
1358
|
+
HideToolbar = false;
|
|
1355
1359
|
/** View mode: 'kanban' (card board) or 'table' (paged grid) */
|
|
1356
1360
|
DisplayMode = 'kanban';
|
|
1357
1361
|
/** Page size for table view */
|
|
@@ -2800,92 +2804,89 @@ let DuplicateDetectionResourceComponent = class DuplicateDetectionResourceCompon
|
|
|
2800
2804
|
static ɵfac = /*@__PURE__*/ (() => { let ɵDuplicateDetectionResourceComponent_BaseFactory; return function DuplicateDetectionResourceComponent_Factory(__ngFactoryType__) { return (ɵDuplicateDetectionResourceComponent_BaseFactory || (ɵDuplicateDetectionResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(DuplicateDetectionResourceComponent)))(__ngFactoryType__ || DuplicateDetectionResourceComponent); }; })();
|
|
2801
2805
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DuplicateDetectionResourceComponent, selectors: [["app-duplicate-detection-resource"]], hostBindings: function DuplicateDetectionResourceComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
2802
2806
|
i0.ɵɵlistener("keydown.escape", function DuplicateDetectionResourceComponent_keydown_escape_HostBindingHandler() { return ctx.OnEscapeKey(); }, i0.ɵɵresolveDocument);
|
|
2803
|
-
} }, inputs: {
|
|
2804
|
-
i0.ɵɵelementStart(0, "
|
|
2805
|
-
i0.ɵɵ
|
|
2806
|
-
i0.ɵɵ
|
|
2807
|
-
i0.ɵɵ
|
|
2808
|
-
i0.ɵɵelementStart(6, "div", 5)(7, "div", 6)(8, "select", 7);
|
|
2809
|
-
i0.ɵɵtwoWayListener("ngModelChange", function DuplicateDetectionResourceComponent_Template_select_ngModelChange_8_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.SelectedEntityDocumentID, $event) || (ctx.SelectedEntityDocumentID = $event); return $event; });
|
|
2810
|
-
i0.ɵɵelementStart(9, "option", 8);
|
|
2811
|
-
i0.ɵɵtext(10, "Select entity document...");
|
|
2807
|
+
} }, inputs: { HideToolbar: "HideToolbar" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 66, vars: 30, consts: [["Title", "Duplicate Detection", "Icon", "fa-solid fa-clone", "Subtitle", "Find and merge near-duplicate 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, "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
|
+
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1)(3, "select", 2);
|
|
2809
|
+
i0.ɵɵtwoWayListener("ngModelChange", function DuplicateDetectionResourceComponent_Template_select_ngModelChange_3_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.SelectedEntityDocumentID, $event) || (ctx.SelectedEntityDocumentID = $event); return $event; });
|
|
2810
|
+
i0.ɵɵelementStart(4, "option", 3);
|
|
2811
|
+
i0.ɵɵtext(5, "Select entity document\u2026");
|
|
2812
2812
|
i0.ɵɵelementEnd();
|
|
2813
|
-
i0.ɵɵrepeaterCreate(
|
|
2813
|
+
i0.ɵɵrepeaterCreate(6, DuplicateDetectionResourceComponent_For_7_Template, 2, 3, "option", 4, _forTrack0);
|
|
2814
2814
|
i0.ɵɵelementEnd();
|
|
2815
|
-
i0.ɵɵelementStart(
|
|
2816
|
-
i0.ɵɵlistener("click", function
|
|
2817
|
-
i0.ɵɵconditionalCreate(
|
|
2818
|
-
i0.ɵɵelementEnd()()()
|
|
2819
|
-
i0.ɵɵ
|
|
2820
|
-
i0.ɵɵconditionalCreate(
|
|
2821
|
-
i0.ɵɵ
|
|
2822
|
-
i0.ɵɵ
|
|
2815
|
+
i0.ɵɵelementStart(8, "button", 5);
|
|
2816
|
+
i0.ɵɵlistener("click", function DuplicateDetectionResourceComponent_Template_button_click_8_listener() { return ctx.RunDetection(); });
|
|
2817
|
+
i0.ɵɵconditionalCreate(9, DuplicateDetectionResourceComponent_Conditional_9_Template, 2, 0)(10, DuplicateDetectionResourceComponent_Conditional_10_Template, 2, 0);
|
|
2818
|
+
i0.ɵɵelementEnd()()();
|
|
2819
|
+
i0.ɵɵelementStart(11, "mj-page-body", 6);
|
|
2820
|
+
i0.ɵɵconditionalCreate(12, DuplicateDetectionResourceComponent_Conditional_12_Template, 10, 5, "div", 7);
|
|
2821
|
+
i0.ɵɵconditionalCreate(13, DuplicateDetectionResourceComponent_Conditional_13_Template, 19, 12, "div", 8);
|
|
2822
|
+
i0.ɵɵelementStart(14, "div", 9)(15, "div", 10)(16, "div", 11);
|
|
2823
|
+
i0.ɵɵtext(17);
|
|
2823
2824
|
i0.ɵɵelementEnd();
|
|
2824
|
-
i0.ɵɵelementStart(
|
|
2825
|
-
i0.ɵɵtext(
|
|
2825
|
+
i0.ɵɵelementStart(18, "div", 12);
|
|
2826
|
+
i0.ɵɵtext(19, "Total Groups");
|
|
2826
2827
|
i0.ɵɵelementEnd()();
|
|
2827
|
-
i0.ɵɵelementStart(
|
|
2828
|
-
i0.ɵɵtext(
|
|
2828
|
+
i0.ɵɵelementStart(20, "div", 13)(21, "div", 11);
|
|
2829
|
+
i0.ɵɵtext(22);
|
|
2829
2830
|
i0.ɵɵelementEnd();
|
|
2830
|
-
i0.ɵɵelementStart(
|
|
2831
|
-
i0.ɵɵtext(
|
|
2831
|
+
i0.ɵɵelementStart(23, "div", 12);
|
|
2832
|
+
i0.ɵɵtext(24, "Pending");
|
|
2832
2833
|
i0.ɵɵelementEnd()();
|
|
2833
|
-
i0.ɵɵelementStart(
|
|
2834
|
-
i0.ɵɵtext(
|
|
2834
|
+
i0.ɵɵelementStart(25, "div", 14)(26, "div", 11);
|
|
2835
|
+
i0.ɵɵtext(27);
|
|
2835
2836
|
i0.ɵɵelementEnd();
|
|
2836
|
-
i0.ɵɵelementStart(
|
|
2837
|
-
i0.ɵɵtext(
|
|
2837
|
+
i0.ɵɵelementStart(28, "div", 12);
|
|
2838
|
+
i0.ɵɵtext(29, "Approved");
|
|
2838
2839
|
i0.ɵɵelementEnd()();
|
|
2839
|
-
i0.ɵɵelementStart(
|
|
2840
|
-
i0.ɵɵtext(
|
|
2840
|
+
i0.ɵɵelementStart(30, "div", 15)(31, "div", 11);
|
|
2841
|
+
i0.ɵɵtext(32);
|
|
2841
2842
|
i0.ɵɵelementEnd();
|
|
2842
|
-
i0.ɵɵelementStart(
|
|
2843
|
-
i0.ɵɵtext(
|
|
2843
|
+
i0.ɵɵelementStart(33, "div", 12);
|
|
2844
|
+
i0.ɵɵtext(34, "Rejected");
|
|
2844
2845
|
i0.ɵɵelementEnd()()();
|
|
2845
|
-
i0.ɵɵelementStart(
|
|
2846
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
2847
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
2848
|
-
i0.ɵɵconditionalCreate(
|
|
2849
|
-
i0.ɵɵrepeaterCreate(
|
|
2846
|
+
i0.ɵɵelementStart(35, "div", 16)(36, "div", 17)(37, "select", 18);
|
|
2847
|
+
i0.ɵɵtwoWayListener("ngModelChange", function DuplicateDetectionResourceComponent_Template_select_ngModelChange_37_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Filters.EntityName, $event) || (ctx.Filters.EntityName = $event); return $event; });
|
|
2848
|
+
i0.ɵɵlistener("ngModelChange", function DuplicateDetectionResourceComponent_Template_select_ngModelChange_37_listener() { return ctx.OnFilterChange(); });
|
|
2849
|
+
i0.ɵɵconditionalCreate(38, DuplicateDetectionResourceComponent_Conditional_38_Template, 2, 0, "option", 3);
|
|
2850
|
+
i0.ɵɵrepeaterCreate(39, DuplicateDetectionResourceComponent_For_40_Template, 2, 2, "option", 4, i0.ɵɵrepeaterTrackByIdentity);
|
|
2851
|
+
i0.ɵɵelementEnd();
|
|
2852
|
+
i0.ɵɵelementStart(41, "div", 19)(42, "label", 20);
|
|
2853
|
+
i0.ɵɵtext(43, "Min Score");
|
|
2850
2854
|
i0.ɵɵelementEnd();
|
|
2851
|
-
i0.ɵɵelementStart(
|
|
2852
|
-
i0.ɵɵ
|
|
2855
|
+
i0.ɵɵelementStart(44, "input", 21);
|
|
2856
|
+
i0.ɵɵtwoWayListener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_44_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Filters.MinScore, $event) || (ctx.Filters.MinScore = $event); return $event; });
|
|
2857
|
+
i0.ɵɵlistener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_44_listener() { return ctx.OnFilterChange(); });
|
|
2858
|
+
i0.ɵɵelementEnd()();
|
|
2859
|
+
i0.ɵɵelementStart(45, "div", 19)(46, "label", 20);
|
|
2860
|
+
i0.ɵɵtext(47, "Max Score");
|
|
2853
2861
|
i0.ɵɵelementEnd();
|
|
2854
|
-
i0.ɵɵelementStart(48, "input",
|
|
2855
|
-
i0.ɵɵtwoWayListener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_48_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Filters.
|
|
2862
|
+
i0.ɵɵelementStart(48, "input", 21);
|
|
2863
|
+
i0.ɵɵtwoWayListener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_48_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Filters.MaxScore, $event) || (ctx.Filters.MaxScore = $event); return $event; });
|
|
2856
2864
|
i0.ɵɵlistener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_48_listener() { return ctx.OnFilterChange(); });
|
|
2857
2865
|
i0.ɵɵelementEnd()();
|
|
2858
|
-
i0.ɵɵelementStart(49, "div",
|
|
2859
|
-
i0.ɵɵtext(51, "
|
|
2866
|
+
i0.ɵɵelementStart(49, "div", 19)(50, "label", 20);
|
|
2867
|
+
i0.ɵɵtext(51, "From");
|
|
2860
2868
|
i0.ɵɵelementEnd();
|
|
2861
|
-
i0.ɵɵelementStart(52, "input",
|
|
2862
|
-
i0.ɵɵtwoWayListener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_52_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Filters.
|
|
2869
|
+
i0.ɵɵelementStart(52, "input", 22);
|
|
2870
|
+
i0.ɵɵtwoWayListener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_52_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Filters.DateFrom, $event) || (ctx.Filters.DateFrom = $event); return $event; });
|
|
2863
2871
|
i0.ɵɵlistener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_52_listener() { return ctx.OnFilterChange(); });
|
|
2864
2872
|
i0.ɵɵelementEnd()();
|
|
2865
|
-
i0.ɵɵelementStart(53, "div",
|
|
2866
|
-
i0.ɵɵtext(55, "
|
|
2873
|
+
i0.ɵɵelementStart(53, "div", 19)(54, "label", 20);
|
|
2874
|
+
i0.ɵɵtext(55, "To");
|
|
2867
2875
|
i0.ɵɵelementEnd();
|
|
2868
|
-
i0.ɵɵelementStart(56, "input",
|
|
2869
|
-
i0.ɵɵtwoWayListener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_56_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Filters.
|
|
2876
|
+
i0.ɵɵelementStart(56, "input", 22);
|
|
2877
|
+
i0.ɵɵtwoWayListener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_56_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Filters.DateTo, $event) || (ctx.Filters.DateTo = $event); return $event; });
|
|
2870
2878
|
i0.ɵɵlistener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_56_listener() { return ctx.OnFilterChange(); });
|
|
2871
|
-
i0.ɵɵelementEnd()();
|
|
2872
|
-
i0.ɵɵelementStart(57, "div", 23)(58, "label", 24);
|
|
2873
|
-
i0.ɵɵtext(59, "To");
|
|
2874
|
-
i0.ɵɵelementEnd();
|
|
2875
|
-
i0.ɵɵelementStart(60, "input", 26);
|
|
2876
|
-
i0.ɵɵtwoWayListener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_60_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Filters.DateTo, $event) || (ctx.Filters.DateTo = $event); return $event; });
|
|
2877
|
-
i0.ɵɵlistener("ngModelChange", function DuplicateDetectionResourceComponent_Template_input_ngModelChange_60_listener() { return ctx.OnFilterChange(); });
|
|
2878
2879
|
i0.ɵɵelementEnd()()();
|
|
2879
|
-
i0.ɵɵconditionalCreate(
|
|
2880
|
-
i0.ɵɵelementEnd();
|
|
2881
|
-
i0.ɵɵconditionalCreate(62, DuplicateDetectionResourceComponent_Conditional_62_Template, 3, 0, "div", 28);
|
|
2882
|
-
i0.ɵɵconditionalCreate(63, DuplicateDetectionResourceComponent_Conditional_63_Template, 2, 0, "div", 29)(64, DuplicateDetectionResourceComponent_Conditional_64_Template, 2, 0, "div", 29)(65, DuplicateDetectionResourceComponent_Conditional_65_Template, 6, 0, "div", 30)(66, DuplicateDetectionResourceComponent_Conditional_66_Template, 34, 12, "div", 31);
|
|
2883
|
-
i0.ɵɵconditionalCreate(67, DuplicateDetectionResourceComponent_Conditional_67_Template, 2, 0, "div", 32);
|
|
2884
|
-
i0.ɵɵconditionalCreate(68, DuplicateDetectionResourceComponent_Conditional_68_Template, 68, 42);
|
|
2885
|
-
i0.ɵɵconditionalCreate(69, DuplicateDetectionResourceComponent_Conditional_69_Template, 37, 7, "div", 33);
|
|
2880
|
+
i0.ɵɵconditionalCreate(57, DuplicateDetectionResourceComponent_Conditional_57_Template, 3, 0, "button", 23);
|
|
2886
2881
|
i0.ɵɵelementEnd();
|
|
2882
|
+
i0.ɵɵconditionalCreate(58, DuplicateDetectionResourceComponent_Conditional_58_Template, 3, 0, "div", 24);
|
|
2883
|
+
i0.ɵɵconditionalCreate(59, DuplicateDetectionResourceComponent_Conditional_59_Template, 2, 0, "div", 25)(60, DuplicateDetectionResourceComponent_Conditional_60_Template, 2, 0, "div", 25)(61, DuplicateDetectionResourceComponent_Conditional_61_Template, 6, 0, "div", 26)(62, DuplicateDetectionResourceComponent_Conditional_62_Template, 34, 12, "div", 27);
|
|
2884
|
+
i0.ɵɵconditionalCreate(63, DuplicateDetectionResourceComponent_Conditional_63_Template, 2, 0, "div", 28);
|
|
2885
|
+
i0.ɵɵconditionalCreate(64, DuplicateDetectionResourceComponent_Conditional_64_Template, 68, 42);
|
|
2886
|
+
i0.ɵɵconditionalCreate(65, DuplicateDetectionResourceComponent_Conditional_65_Template, 37, 7, "div", 29);
|
|
2887
|
+
i0.ɵɵelementEnd()();
|
|
2887
2888
|
} if (rf & 2) {
|
|
2888
|
-
i0.ɵɵadvance(
|
|
2889
|
+
i0.ɵɵadvance(3);
|
|
2889
2890
|
i0.ɵɵtwoWayProperty("ngModel", ctx.SelectedEntityDocumentID);
|
|
2890
2891
|
i0.ɵɵproperty("disabled", ctx.IsDetecting);
|
|
2891
2892
|
i0.ɵɵadvance(3);
|
|
@@ -2893,11 +2894,13 @@ let DuplicateDetectionResourceComponent = class DuplicateDetectionResourceCompon
|
|
|
2893
2894
|
i0.ɵɵadvance(2);
|
|
2894
2895
|
i0.ɵɵproperty("disabled", ctx.IsDetecting || !ctx.SelectedEntityDocumentID);
|
|
2895
2896
|
i0.ɵɵadvance();
|
|
2896
|
-
i0.ɵɵconditional(ctx.IsDetecting ?
|
|
2897
|
+
i0.ɵɵconditional(ctx.IsDetecting ? 9 : 10);
|
|
2897
2898
|
i0.ɵɵadvance(2);
|
|
2898
|
-
i0.ɵɵ
|
|
2899
|
+
i0.ɵɵproperty("Flex", true);
|
|
2900
|
+
i0.ɵɵadvance();
|
|
2901
|
+
i0.ɵɵconditional(ctx.IsDetecting ? 12 : -1);
|
|
2899
2902
|
i0.ɵɵadvance();
|
|
2900
|
-
i0.ɵɵconditional(ctx.SelectedDocumentThresholds ?
|
|
2903
|
+
i0.ɵɵconditional(ctx.SelectedDocumentThresholds ? 13 : -1);
|
|
2901
2904
|
i0.ɵɵadvance(4);
|
|
2902
2905
|
i0.ɵɵtextInterpolate(ctx.TotalGroupCount);
|
|
2903
2906
|
i0.ɵɵadvance(5);
|
|
@@ -2910,7 +2913,7 @@ let DuplicateDetectionResourceComponent = class DuplicateDetectionResourceCompon
|
|
|
2910
2913
|
i0.ɵɵtwoWayProperty("ngModel", ctx.Filters.EntityName);
|
|
2911
2914
|
i0.ɵɵproperty("disabled", ctx.EntityNames.length <= 1);
|
|
2912
2915
|
i0.ɵɵadvance();
|
|
2913
|
-
i0.ɵɵconditional(ctx.EntityNames.length > 1 ?
|
|
2916
|
+
i0.ɵɵconditional(ctx.EntityNames.length > 1 ? 38 : -1);
|
|
2914
2917
|
i0.ɵɵadvance();
|
|
2915
2918
|
i0.ɵɵrepeater(ctx.EntityNames);
|
|
2916
2919
|
i0.ɵɵadvance(5);
|
|
@@ -2926,18 +2929,18 @@ let DuplicateDetectionResourceComponent = class DuplicateDetectionResourceCompon
|
|
|
2926
2929
|
i0.ɵɵproperty("min", ctx.DataMinDate)("max", ctx.DataMaxDate);
|
|
2927
2930
|
i0.ɵɵtwoWayProperty("ngModel", ctx.Filters.DateTo);
|
|
2928
2931
|
i0.ɵɵadvance();
|
|
2929
|
-
i0.ɵɵconditional(ctx.HasActiveFilters ?
|
|
2932
|
+
i0.ɵɵconditional(ctx.HasActiveFilters ? 57 : -1);
|
|
2930
2933
|
i0.ɵɵadvance();
|
|
2931
|
-
i0.ɵɵconditional(ctx.ShowMergeWarningBanner ?
|
|
2934
|
+
i0.ɵɵconditional(ctx.ShowMergeWarningBanner ? 58 : -1);
|
|
2932
2935
|
i0.ɵɵadvance();
|
|
2933
|
-
i0.ɵɵconditional(ctx.IsLoading ?
|
|
2936
|
+
i0.ɵɵconditional(ctx.IsLoading ? 59 : ctx.IsLoadingResults ? 60 : ctx.TotalGroupCount === 0 ? 61 : 62);
|
|
2934
2937
|
i0.ɵɵadvance(4);
|
|
2935
|
-
i0.ɵɵconditional(ctx.IsSaving ?
|
|
2938
|
+
i0.ɵɵconditional(ctx.IsSaving ? 63 : -1);
|
|
2936
2939
|
i0.ɵɵadvance();
|
|
2937
|
-
i0.ɵɵconditional(ctx.ComparisonGroup ?
|
|
2940
|
+
i0.ɵɵconditional(ctx.ComparisonGroup ? 64 : -1);
|
|
2938
2941
|
i0.ɵɵadvance();
|
|
2939
|
-
i0.ɵɵconditional(ctx.ShowMergeConfirm && ctx.ComparisonGroup ?
|
|
2940
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.LoadingComponent], 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.duplicate-detection-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px 20px;\n background: var(--mj-bg-page);\n position: relative;\n overflow: hidden;\n}\n\n/* ---- Page Header ---- */\n\n.page-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n flex-shrink: 0;\n}\n\n.page-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.page-title i {\n color: var(--mj-brand-primary);\n}\n\n/* ---- Header Actions ---- */\n\n.header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.run-detection-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.entity-doc-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n min-width: 200px;\n}\n\n.entity-doc-select:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.run-detection-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n cursor: pointer;\n font-size: 13px;\n font-weight: 600;\n transition: background 0.15s;\n white-space: nowrap;\n}\n\n.run-detection-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.run-detection-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\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"], encapsulation: 2 });
|
|
2942
|
+
i0.ɵɵconditional(ctx.ShowMergeConfirm && ctx.ComparisonGroup ? 65 : -1);
|
|
2943
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.LoadingComponent, i3.MJButtonDirective, i3.MJPageHeaderComponent, i3.MJPageLayoutComponent, i3.MJPageBodyComponent], 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"], encapsulation: 2 });
|
|
2941
2944
|
};
|
|
2942
2945
|
DuplicateDetectionResourceComponent = __decorate([
|
|
2943
2946
|
RegisterClass(BaseResourceComponent, 'DuplicateDetectionResource')
|
|
@@ -2945,11 +2948,11 @@ DuplicateDetectionResourceComponent = __decorate([
|
|
|
2945
2948
|
export { DuplicateDetectionResourceComponent };
|
|
2946
2949
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DuplicateDetectionResourceComponent, [{
|
|
2947
2950
|
type: Component,
|
|
2948
|
-
args: [{ standalone: false, selector: 'app-duplicate-detection-resource', encapsulation: ViewEncapsulation.None, template: "<div class=\"duplicate-detection-container\">\n <!-- Header -->\n <div class=\"page-header\">\n <div class=\"header-left\">\n <h2 class=\"page-title\">\n <i class=\"fa-solid fa-clone\"></i> Duplicate Detection\n </h2>\n </div>\n <div class=\"header-actions\">\n <div class=\"run-detection-controls\">\n <select class=\"entity-doc-select\"\n [(ngModel)]=\"SelectedEntityDocumentID\"\n [disabled]=\"IsDetecting\">\n <option value=\"\">Select entity document...</option>\n @for (doc of EntityDocuments; track doc.ID) {\n <option [value]=\"doc.ID\">{{ doc.Name }} ({{ doc.EntityName }})</option>\n }\n </select>\n <button class=\"run-detection-btn\"\n (click)=\"RunDetection()\"\n [disabled]=\"IsDetecting || !SelectedEntityDocumentID\">\n @if (IsDetecting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Detecting...\n } @else {\n <i class=\"fa-solid fa-magnifying-glass\"></i> Run Detection\n }\n </button>\n </div>\n </div>\n </div>\n\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</div>\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.duplicate-detection-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px 20px;\n background: var(--mj-bg-page);\n position: relative;\n overflow: hidden;\n}\n\n/* ---- Page Header ---- */\n\n.page-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n flex-shrink: 0;\n}\n\n.page-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.page-title i {\n color: var(--mj-brand-primary);\n}\n\n/* ---- Header Actions ---- */\n\n.header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.run-detection-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.entity-doc-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n min-width: 200px;\n}\n\n.entity-doc-select:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.run-detection-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n cursor: pointer;\n font-size: 13px;\n font-weight: 600;\n transition: background 0.15s;\n white-space: nowrap;\n}\n\n.run-detection-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.run-detection-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\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"] }]
|
|
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"] }]
|
|
2949
2952
|
}], null, { OnEscapeKey: [{
|
|
2950
2953
|
type: HostListener,
|
|
2951
2954
|
args: ['document:keydown.escape']
|
|
2952
|
-
}],
|
|
2955
|
+
}], HideToolbar: [{
|
|
2953
2956
|
type: Input
|
|
2954
2957
|
}] }); })();
|
|
2955
2958
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DuplicateDetectionResourceComponent, { className: "DuplicateDetectionResourceComponent", filePath: "src/AI/components/duplicates/duplicate-detection-resource.component.ts", lineNumber: 105 }); })();
|