@memberjunction/ng-dashboards 5.34.1 → 5.36.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 +96 -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 +453 -122
- 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.d.ts +28 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2084 -2079
- 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.d.ts +15 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +1423 -1438
- 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/APIKeys/api-keys-resource.component.d.ts +12 -8
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +329 -371
- package/dist/APIKeys/api-keys-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 +202 -158
- 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 +191 -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 +19 -79
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +19 -79
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +19 -79
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +19 -79
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/Admin/base-admin-container.component.d.ts +9 -7
- package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
- package/dist/Admin/base-admin-container.component.js +26 -17
- package/dist/Admin/base-admin-container.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +92 -91
- 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-new-message-resource.component.d.ts +93 -0
- package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
- package/dist/Communication/communication-new-message-resource.component.js +661 -0
- package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
- 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 +238 -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 +290 -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 +41 -21
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +148 -155
- 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 +25 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
- package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +46 -72
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -100
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +158 -168
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +257 -264
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.d.ts +5 -0
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +46 -64
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/DevTools/lazy-module-status.component.js +75 -84
- package/dist/DevTools/lazy-module-status.component.js.map +1 -1
- package/dist/DevTools/settings-explorer.component.js +76 -85
- package/dist/DevTools/settings-explorer.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +24 -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 +307 -318
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +654 -648
- 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 +595 -606
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +230 -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.d.ts +5 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1138 -1147
- 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.d.ts +11 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +684 -697
- 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 +120 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1239 -610
- 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 +133 -3
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +1460 -272
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/Lists/index.d.ts +1 -0
- package/dist/Lists/index.d.ts.map +1 -1
- package/dist/Lists/index.js +1 -0
- package/dist/Lists/index.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +236 -10
- package/dist/Lists/services/list-set-operations.service.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 +259 -103
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1009 -1264
- 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 +38 -6
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +679 -786
- 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 +114 -99
- 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 +51 -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 +9 -6
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +37 -7
- 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 +46 -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 +10 -9
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +40 -2
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +3 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -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 +42 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +53 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing-review.component.js","sourceRoot":"","sources":["../../../src/Testing/components/testing-review.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { Subject, Observable, combineLatest, BehaviorSubject } from 'rxjs';\nimport { takeUntil, map, shareReplay } from 'rxjs/operators';\nimport {\n TestingInstrumentationService,\n FeedbackPending,\n FeedbackStats,\n TestRunWithFeedbackSummary,\n EvaluationSummaryMetrics\n} from '../services/testing-instrumentation.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\ntype ViewMode = 'queue' | 'history';\ntype HistorySort = 'date' | 'rating' | 'test-name';\n\ninterface ReviewFormState {\n rating: number | null;\n isCorrect: boolean | null;\n comments: string;\n}\n\n@Component({\n standalone: false,\n selector: 'app-testing-review',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- Page Header -->\n <div class=\"review-page\">\n <div class=\"page-header\">\n <div class=\"header-left\">\n <h2>\n <i class=\"fa-solid fa-clipboard-check\"></i>\n Human Review\n </h2>\n @if (PendingCount > 0) {\n <div class=\"pending-badge\">\n <span class=\"badge-count\">{{ PendingCount }}</span>\n <span class=\"badge-text\">pending</span>\n </div>\n }\n </div>\n <button class=\"refresh-btn\" (click)=\"Refresh()\" [disabled]=\"IsRefreshing\">\n <i class=\"fa-solid fa-arrows-rotate\" [class.fa-spin]=\"IsRefreshing\"></i>\n {{ IsRefreshing ? 'Refreshing...' : 'Refresh' }}\n </button>\n </div>\n\n <!-- KPI Summary Row -->\n @if (Metrics) {\n <div class=\"kpi-row\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon orange\">\n <i class=\"fa-solid fa-hourglass-half\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ Metrics.humanPendingCount }}</div>\n <div class=\"kpi-label\">Pending Review</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon green\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ Metrics.humanReviewedCount }}</div>\n <div class=\"kpi-label\">Reviewed</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon gold\">\n <i class=\"fa-solid fa-star\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ FormatDecimal(Metrics.humanAvgRating, 1) }}<span class=\"kpi-unit\">/10</span></div>\n <div class=\"kpi-label\">Avg Rating</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon blue\">\n <i class=\"fa-solid fa-handshake\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ FormatDecimal(Metrics.agreementRate, 0) }}<span class=\"kpi-unit\">%</span></div>\n <div class=\"kpi-label\">Agreement Rate</div>\n </div>\n </div>\n </div>\n }\n\n <!-- View Mode Toggle -->\n <div class=\"view-toggle-bar\">\n <div class=\"toggle-group\">\n <button class=\"toggle-btn\" [class.active]=\"CurrentView === 'queue'\" (click)=\"SetView('queue')\">\n <i class=\"fa-solid fa-list-check\"></i>\n Review Queue\n </button>\n <button class=\"toggle-btn\" [class.active]=\"CurrentView === 'history'\" (click)=\"SetView('history')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n History\n </button>\n </div>\n </div>\n\n <!-- Review Queue View -->\n @if (CurrentView === 'queue') {\n <div class=\"content-card\">\n @if (PendingItems.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <h3>All caught up!</h3>\n <p>No tests currently require human review.</p>\n </div>\n } @else {\n <div class=\"queue-list\">\n @for (item of PendingItems; track item.testRunID) {\n <div class=\"queue-item\" [class.expanded]=\"IsItemExpanded(item.testRunID)\">\n <div class=\"queue-item-header\" (click)=\"ToggleExpand(item.testRunID)\">\n <div class=\"item-info\">\n <div class=\"item-name\">{{ item.testName }}</div>\n <div class=\"item-meta\">\n <span class=\"meta-time\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ FormatRelativeTime(item.runDateTime) }}\n </span>\n <app-score-indicator [score]=\"item.automatedScore\" [showBar]=\"true\"></app-score-indicator>\n <app-test-status-badge [status]=\"$any(item.automatedStatus)\"></app-test-status-badge>\n </div>\n </div>\n <div class=\"item-actions-area\">\n <span class=\"reason-badge\" [class]=\"'reason-' + item.reason\">\n @if (item.reason === 'no-feedback') {\n <i class=\"fa-solid fa-comment-slash\"></i> No Feedback\n } @else if (item.reason === 'high-score-failed') {\n <i class=\"fa-solid fa-triangle-exclamation\"></i> Score Mismatch\n } @else {\n <i class=\"fa-solid fa-circle-question\"></i> Needs Verification\n }\n </span>\n <button class=\"expand-toggle\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!IsItemExpanded(item.testRunID)\"\n [class.fa-chevron-up]=\"IsItemExpanded(item.testRunID)\"></i>\n </button>\n </div>\n </div>\n\n @if (IsItemExpanded(item.testRunID)) {\n <div class=\"review-form-panel\">\n <!-- Rating -->\n <div class=\"form-section\">\n <label class=\"form-label\">Rating</label>\n <div class=\"rating-row\">\n @for (n of RatingNumbers; track n) {\n <button class=\"rating-circle\"\n [class.selected]=\"FormState.rating != null && n <= FormState.rating\"\n [class.current]=\"FormState.rating === n\"\n (click)=\"SelectRating(n)\">\n {{ n }}\n </button>\n }\n @if (FormState.rating != null) {\n <span class=\"rating-display\">{{ FormState.rating }}/10</span>\n }\n </div>\n </div>\n\n <!-- Correctness -->\n <div class=\"form-section\">\n <label class=\"form-label\">Is the automated result correct?</label>\n <div class=\"correctness-row\">\n <button class=\"correctness-btn correct\"\n [class.active]=\"FormState.isCorrect === true\"\n (click)=\"SelectCorrectness(true)\">\n <i class=\"fa-solid fa-check\"></i> Correct\n </button>\n <button class=\"correctness-btn incorrect\"\n [class.active]=\"FormState.isCorrect === false\"\n (click)=\"SelectCorrectness(false)\">\n <i class=\"fa-solid fa-xmark\"></i> Incorrect\n </button>\n </div>\n </div>\n\n <!-- Notes -->\n <div class=\"form-section\">\n <label class=\"form-label\">Notes (optional)</label>\n <textarea class=\"notes-textarea\"\n rows=\"3\"\n placeholder=\"Add any comments about this evaluation...\"\n [value]=\"FormState.comments\"\n (input)=\"OnCommentsChange($event)\"></textarea>\n </div>\n\n <!-- Actions -->\n <div class=\"form-actions\">\n <button class=\"submit-btn\"\n [disabled]=\"!IsFormValid || IsSubmitting\"\n (click)=\"SubmitReview(item)\">\n <i class=\"fa-solid fa-paper-plane\"></i>\n {{ IsSubmitting ? 'Submitting...' : 'Submit' }}\n </button>\n <button class=\"skip-btn\" (click)=\"SkipItem()\">\n <i class=\"fa-solid fa-forward\"></i> Skip\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- History View -->\n @if (CurrentView === 'history') {\n <div class=\"content-card\">\n <!-- Filter Bar -->\n <div class=\"history-filters\">\n <div class=\"search-wrapper\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n placeholder=\"Search by test name...\"\n [value]=\"HistorySearchText\"\n (input)=\"OnHistorySearch($event)\" />\n </div>\n <div class=\"sort-control\">\n <label>Sort by:</label>\n <select [value]=\"HistorySortField\" (change)=\"OnHistorySortChange($event)\">\n <option value=\"date\">Date</option>\n <option value=\"rating\">Rating</option>\n <option value=\"test-name\">Test Name</option>\n </select>\n </div>\n </div>\n\n @if (FilteredHistoryItems.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <h3>No reviewed items</h3>\n <p>Reviewed tests will appear here once feedback is submitted.</p>\n </div>\n } @else {\n <div class=\"history-list\">\n @for (item of FilteredHistoryItems; track item.id) {\n <div class=\"history-item\">\n <div class=\"history-item-main\">\n <div class=\"history-name\">{{ item.testName }}</div>\n <div class=\"history-date\">\n <i class=\"fa-solid fa-calendar\"></i>\n {{ FormatRelativeTime(item.runDateTime) }}\n </div>\n </div>\n <div class=\"history-rating\">\n <div class=\"rating-dots\">\n @for (n of RatingNumbers; track n) {\n <span class=\"rating-dot\" [class.filled]=\"item.humanRating != null && n <= item.humanRating\"></span>\n }\n </div>\n <span class=\"rating-label\">{{ item.humanRating ?? 0 }}/10</span>\n </div>\n <div class=\"history-verdict\">\n @if (item.humanIsCorrect === true) {\n <span class=\"verdict correct\">\n <i class=\"fa-solid fa-check\"></i> Correct\n </span>\n } @else if (item.humanIsCorrect === false) {\n <span class=\"verdict incorrect\">\n <i class=\"fa-solid fa-xmark\"></i> Incorrect\n </span>\n }\n </div>\n <div class=\"history-auto-score\">\n <app-score-indicator [score]=\"item.score\" [showBar]=\"true\"></app-score-indicator>\n </div>\n @if (item.humanComments) {\n <div class=\"history-comments\"\n [class.expanded]=\"ExpandedHistoryId === item.id\"\n (click)=\"ToggleHistoryComment(item.id)\">\n <p>{{ item.humanComments }}</p>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Calibration Insights -->\n <div class=\"calibration-section\">\n <h3>\n <i class=\"fa-solid fa-scale-balanced\"></i>\n Human vs Auto Agreement\n </h3>\n <div class=\"calibration-body\">\n <div class=\"gauge-display\">\n <div class=\"gauge-ring\">\n <svg viewBox=\"0 0 120 120\" class=\"gauge-svg\">\n <circle cx=\"60\" cy=\"60\" r=\"52\" fill=\"none\" class=\"gauge-track\" stroke-width=\"10\" />\n <circle cx=\"60\" cy=\"60\" r=\"52\" fill=\"none\"\n [attr.stroke]=\"AgreementColor\"\n stroke-width=\"10\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"AgreementDash\"\n stroke-dashoffset=\"0\"\n transform=\"rotate(-90 60 60)\" />\n </svg>\n <div class=\"gauge-value\">{{ FormatDecimal(AgreementRate, 0) }}%</div>\n </div>\n </div>\n <div class=\"calibration-text\">\n <p class=\"calibration-description\">\n Measures how often human reviewers agree with automated evaluation scores.\n </p>\n @if (AgreementRate < 70) {\n <div class=\"calibration-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n Low agreement may indicate evaluation criteria need refinement.\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n }\n\n .review-page {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n /* Page Header */\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n background: var(--mj-bg-surface);\n padding: 20px;\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .header-left h2 {\n margin: 0;\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-left h2 i {\n color: var(--mj-brand-primary);\n }\n\n .pending-badge {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 14px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-warning);\n border-radius: 20px;\n }\n\n .badge-count {\n background: var(--mj-status-warning);\n color: var(--mj-text-inverse);\n min-width: 24px;\n height: 24px;\n padding: 0 6px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 700;\n }\n\n .badge-text {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-status-warning);\n }\n\n .refresh-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .refresh-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n }\n\n .refresh-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n /* KPI Row */\n .kpi-row {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 20px;\n }\n\n .kpi-card {\n background: var(--mj-bg-surface);\n padding: 20px;\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .kpi-icon {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n color: var(--mj-text-inverse);\n flex-shrink: 0;\n }\n\n .kpi-icon.orange { background: var(--mj-status-warning); }\n .kpi-icon.green { background: var(--mj-status-success); }\n .kpi-icon.gold { background: var(--mj-status-warning); }\n .kpi-icon.blue { background: var(--mj-brand-primary); }\n\n .kpi-content {\n flex: 1;\n min-width: 0;\n }\n\n .kpi-value {\n font-size: 26px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n margin-bottom: 4px;\n }\n\n .kpi-unit {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n }\n\n .kpi-label {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n /* View Toggle */\n .view-toggle-bar {\n margin-bottom: 20px;\n }\n\n .toggle-group {\n display: inline-flex;\n background: var(--mj-bg-surface);\n border-radius: 10px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n }\n\n .toggle-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 24px;\n border: none;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .toggle-btn:hover:not(.active) {\n background: var(--mj-bg-surface-card);\n }\n\n .toggle-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n /* Content Card */\n .content-card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n margin-bottom: 20px;\n }\n\n /* Queue List */\n .queue-list {\n max-height: 600px;\n overflow-y: auto;\n }\n\n .queue-item {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background 0.2s ease;\n }\n\n .queue-item.expanded {\n background: var(--mj-bg-surface-card);\n }\n\n .queue-item:last-child {\n border-bottom: none;\n }\n\n .queue-item-header {\n padding: 16px 20px;\n display: flex;\n align-items: center;\n gap: 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n }\n\n .queue-item-header:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-meta {\n display: flex;\n gap: 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n align-items: center;\n flex-wrap: wrap;\n }\n\n .meta-time {\n display: flex;\n align-items: center;\n gap: 5px;\n }\n\n .item-actions-area {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .reason-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n }\n\n .reason-no-feedback {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .reason-high-score-failed {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .reason-low-score-passed {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .expand-toggle {\n background: none;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n padding: 8px;\n border-radius: 6px;\n font-size: 14px;\n transition: all 0.2s ease;\n }\n\n .expand-toggle:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-muted);\n }\n\n /* Review Form */\n .review-form-panel {\n padding: 20px 20px 20px 36px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n }\n\n .form-section {\n margin-bottom: 20px;\n }\n\n .form-section:last-of-type {\n margin-bottom: 16px;\n }\n\n .form-label {\n display: block;\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 10px;\n }\n\n /* Rating Circles */\n .rating-row {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .rating-circle {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n border: 2px solid var(--mj-border-strong);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-disabled);\n font-size: 13px;\n font-weight: 700;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n }\n\n .rating-circle:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n transform: scale(1.1);\n }\n\n .rating-circle.selected {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .rating-circle.current {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .rating-display {\n margin-left: 12px;\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n /* Correctness Buttons */\n .correctness-row {\n display: flex;\n gap: 12px;\n }\n\n .correctness-btn {\n flex: 1;\n max-width: 200px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 10px;\n background: var(--mj-bg-surface-card);\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .correctness-btn.correct:hover,\n .correctness-btn.correct.active {\n border-color: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .correctness-btn.incorrect:hover,\n .correctness-btn.incorrect.active {\n border-color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n /* Notes */\n .notes-textarea {\n width: 100%;\n max-width: 500px;\n padding: 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n min-height: 72px;\n box-sizing: border-box;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n }\n\n .notes-textarea:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n /* Form Actions */\n .form-actions {\n display: flex;\n gap: 12px;\n }\n\n .submit-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 11px 22px;\n border: none;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .submit-btn:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .skip-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 11px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .skip-btn:hover {\n border-color: var(--mj-border-strong);\n background: var(--mj-bg-surface-card);\n }\n\n /* History Filters */\n .history-filters {\n display: flex;\n gap: 16px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n align-items: center;\n }\n\n .search-wrapper {\n flex: 1;\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .search-wrapper > i {\n position: absolute;\n left: 12px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n .search-wrapper input {\n width: 100%;\n padding: 10px 12px 10px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n }\n\n .search-wrapper input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .sort-control {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n }\n\n .sort-control select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n }\n\n /* History List */\n .history-list {\n max-height: 600px;\n overflow-y: auto;\n }\n\n .history-item {\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n }\n\n .history-item:last-child {\n border-bottom: none;\n }\n\n .history-item-main {\n flex: 1;\n min-width: 160px;\n }\n\n .history-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n }\n\n .history-date {\n font-size: 12px;\n color: var(--mj-text-disabled);\n display: flex;\n align-items: center;\n gap: 5px;\n }\n\n .history-rating {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .rating-dots {\n display: flex;\n gap: 3px;\n }\n\n .rating-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--mj-border-default);\n }\n\n .rating-dot.filled {\n background: var(--mj-status-warning);\n }\n\n .rating-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n }\n\n .history-verdict {\n flex-shrink: 0;\n }\n\n .verdict {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border-radius: 14px;\n font-size: 11px;\n font-weight: 600;\n }\n\n .verdict.correct {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .verdict.incorrect {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .history-auto-score {\n flex-shrink: 0;\n }\n\n .history-comments {\n width: 100%;\n margin-top: 8px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border-left: 3px solid var(--mj-brand-primary);\n cursor: pointer;\n }\n\n .history-comments p {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .history-comments.expanded p {\n white-space: normal;\n }\n\n /* Empty State */\n .empty-state {\n padding: 60px 20px;\n text-align: center;\n }\n\n .empty-state i {\n font-size: 52px;\n margin-bottom: 16px;\n color: var(--mj-status-success);\n }\n\n .empty-state h3 {\n font-size: 18px;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n font-weight: 600;\n }\n\n .empty-state p {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\n }\n\n /* Calibration Section */\n .calibration-section {\n background: var(--mj-bg-surface);\n padding: 24px;\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .calibration-section h3 {\n margin: 0 0 20px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .calibration-section h3 i {\n color: var(--mj-brand-primary);\n }\n\n .calibration-body {\n display: flex;\n align-items: center;\n gap: 32px;\n }\n\n .gauge-display {\n flex-shrink: 0;\n }\n\n .gauge-ring {\n position: relative;\n width: 120px;\n height: 120px;\n }\n\n .gauge-svg {\n width: 100%;\n height: 100%;\n }\n\n .gauge-track {\n stroke: var(--mj-border-default);\n }\n\n .gauge-value {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n font-weight: 800;\n color: var(--mj-text-primary);\n }\n\n .calibration-text {\n flex: 1;\n }\n\n .calibration-description {\n margin: 0 0 12px 0;\n font-size: 14px;\n color: var(--mj-text-muted);\n line-height: 1.6;\n }\n\n .calibration-warning {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-warning);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-status-warning);\n }\n\n .calibration-warning i {\n color: var(--mj-status-warning);\n font-size: 16px;\n flex-shrink: 0;\n }\n\n /* Success toast animation */\n .queue-item {\n animation: fadeIn 0.2s ease;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .review-page {\n padding: 16px;\n }\n\n .page-header {\n flex-direction: column;\n gap: 16px;\n align-items: flex-start;\n }\n\n .kpi-row {\n grid-template-columns: 1fr 1fr;\n }\n\n .kpi-card {\n padding: 16px;\n }\n\n .kpi-value {\n font-size: 22px;\n }\n\n .queue-item-header {\n flex-wrap: wrap;\n }\n\n .item-actions-area {\n width: 100%;\n justify-content: flex-end;\n margin-top: 8px;\n }\n\n .correctness-row {\n flex-direction: column;\n }\n\n .correctness-btn {\n max-width: 100%;\n }\n\n .history-item {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .calibration-body {\n flex-direction: column;\n align-items: center;\n text-align: center;\n }\n }\n `]\n})\nexport class TestingReviewComponent implements OnInit, OnDestroy {\n @Input() initialState: Record<string, unknown> | null = null;\n @Output() stateChange = new EventEmitter<Record<string, unknown>>();\n\n private destroy$ = new Subject<void>();\n\n // View state\n CurrentView: ViewMode = 'queue';\n ExpandedItemId: string | null = null;\n ExpandedHistoryId: string | null = null;\n IsRefreshing = false;\n IsSubmitting = false;\n HistorySearchText = '';\n HistorySortField: HistorySort = 'date';\n\n // Form state for active review\n FormState: ReviewFormState = { rating: null, isCorrect: null, comments: '' };\n\n // Data\n PendingItems: FeedbackPending[] = [];\n HistoryItems: TestRunWithFeedbackSummary[] = [];\n FilteredHistoryItems: TestRunWithFeedbackSummary[] = [];\n Metrics: EvaluationSummaryMetrics | null = null;\n PendingCount = 0;\n\n // Constants\n readonly RatingNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n\n constructor(\n private instrumentationService: TestingInstrumentationService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.restoreState();\n this.setupSubscriptions();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ------------------------------------------------------------------\n // Computed properties\n // ------------------------------------------------------------------\n\n get IsFormValid(): boolean {\n return this.FormState.rating != null && this.FormState.isCorrect != null;\n }\n\n get AgreementRate(): number {\n return this.Metrics?.agreementRate ?? 0;\n }\n\n get AgreementColor(): string {\n const rate = this.AgreementRate;\n if (rate >= 80) return '#22c55e';\n if (rate >= 60) return '#eab308';\n return '#ef4444';\n }\n\n get AgreementDash(): string {\n const circumference = 2 * Math.PI * 52; // r=52\n const filled = (this.AgreementRate / 100) * circumference;\n return `${filled} ${circumference}`;\n }\n\n // ------------------------------------------------------------------\n // Setup\n // ------------------------------------------------------------------\n\n private restoreState(): void {\n if (!this.initialState) return;\n const view = this.initialState['viewMode'] as string | undefined;\n if (view === 'queue' || view === 'history') {\n this.CurrentView = view;\n }\n }\n\n private setupSubscriptions(): void {\n this.instrumentationService.pendingFeedback$\n .pipe(takeUntil(this.destroy$))\n .subscribe(items => {\n this.PendingItems = items;\n this.PendingCount = items.length;\n this.cdr.markForCheck();\n });\n\n this.instrumentationService.evaluationMetrics$\n .pipe(takeUntil(this.destroy$))\n .subscribe(metrics => {\n this.Metrics = metrics;\n this.cdr.markForCheck();\n });\n\n this.instrumentationService.testRunsWithFeedback$\n .pipe(takeUntil(this.destroy$))\n .subscribe(runs => {\n this.HistoryItems = runs.filter(r => r.hasHumanFeedback);\n this.applyHistoryFilters();\n this.cdr.markForCheck();\n });\n }\n\n // ------------------------------------------------------------------\n // View toggling\n // ------------------------------------------------------------------\n\n SetView(mode: ViewMode): void {\n this.CurrentView = mode;\n this.ExpandedItemId = null;\n this.emitState();\n this.cdr.markForCheck();\n }\n\n // ------------------------------------------------------------------\n // Queue interactions\n // ------------------------------------------------------------------\n\n IsItemExpanded(testRunID: string): boolean {\n return UUIDsEqual(this.ExpandedItemId, testRunID);\n }\n\n ToggleExpand(testRunID: string): void {\n if (UUIDsEqual(this.ExpandedItemId, testRunID)) {\n this.ExpandedItemId = null;\n } else {\n this.ExpandedItemId = testRunID;\n this.resetForm();\n }\n this.cdr.markForCheck();\n }\n\n SelectRating(n: number): void {\n this.FormState = { ...this.FormState, rating: n };\n this.cdr.markForCheck();\n }\n\n SelectCorrectness(value: boolean): void {\n this.FormState = { ...this.FormState, isCorrect: value };\n this.cdr.markForCheck();\n }\n\n OnCommentsChange(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n this.FormState = { ...this.FormState, comments: target.value };\n }\n\n async SubmitReview(item: FeedbackPending): Promise<void> {\n if (!this.IsFormValid || this.IsSubmitting) return;\n\n this.IsSubmitting = true;\n this.cdr.markForCheck();\n\n try {\n const success = await this.instrumentationService.submitFeedback(\n item.testRunID,\n this.FormState.rating!,\n this.FormState.isCorrect!,\n this.FormState.comments\n );\n\n if (success) {\n this.ExpandedItemId = null;\n this.resetForm();\n }\n } finally {\n this.IsSubmitting = false;\n this.cdr.markForCheck();\n }\n }\n\n SkipItem(): void {\n const currentIndex = this.PendingItems.findIndex(\n i => UUIDsEqual(i.testRunID, this.ExpandedItemId)\n );\n this.ExpandedItemId = null;\n this.resetForm();\n\n // Expand the next item if available\n if (currentIndex >= 0 && currentIndex + 1 < this.PendingItems.length) {\n this.ExpandedItemId = this.PendingItems[currentIndex + 1].testRunID;\n }\n this.cdr.markForCheck();\n }\n\n // ------------------------------------------------------------------\n // History interactions\n // ------------------------------------------------------------------\n\n OnHistorySearch(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.HistorySearchText = target.value;\n this.applyHistoryFilters();\n this.cdr.markForCheck();\n }\n\n OnHistorySortChange(event: Event): void {\n const target = event.target as HTMLSelectElement;\n this.HistorySortField = target.value as HistorySort;\n this.applyHistoryFilters();\n this.cdr.markForCheck();\n }\n\n ToggleHistoryComment(id: string): void {\n this.ExpandedHistoryId = this.ExpandedHistoryId === id ? null : id;\n this.cdr.markForCheck();\n }\n\n // ------------------------------------------------------------------\n // Refresh\n // ------------------------------------------------------------------\n\n Refresh(): void {\n this.IsRefreshing = true;\n this.cdr.markForCheck();\n this.instrumentationService.refresh();\n\n setTimeout(() => {\n this.IsRefreshing = false;\n this.cdr.markForCheck();\n }, 1500);\n }\n\n // ------------------------------------------------------------------\n // Formatting helpers\n // ------------------------------------------------------------------\n\n FormatDecimal(value: number | undefined | null, decimals: number): string {\n if (value == null) return '0';\n return value.toFixed(decimals);\n }\n\n FormatRelativeTime(date: Date): string {\n const now = Date.now();\n const then = date instanceof Date ? date.getTime() : new Date(date).getTime();\n const diffMs = now - then;\n const diffMin = Math.floor(diffMs / 60000);\n\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return `${diffMin}m ago`;\n\n const diffHours = Math.floor(diffMin / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n\n const diffDays = Math.floor(diffHours / 24);\n if (diffDays < 7) return `${diffDays}d ago`;\n\n const diffWeeks = Math.floor(diffDays / 7);\n if (diffWeeks < 4) return `${diffWeeks}w ago`;\n\n const diffMonths = Math.floor(diffDays / 30);\n return `${diffMonths}mo ago`;\n }\n\n // ------------------------------------------------------------------\n // Private helpers\n // ------------------------------------------------------------------\n\n private resetForm(): void {\n this.FormState = { rating: null, isCorrect: null, comments: '' };\n }\n\n private applyHistoryFilters(): void {\n let items = [...this.HistoryItems];\n\n // Search filter\n if (this.HistorySearchText) {\n const term = this.HistorySearchText.toLowerCase();\n items = items.filter(i => i.testName.toLowerCase().includes(term));\n }\n\n // Sort\n items.sort((a, b) => {\n switch (this.HistorySortField) {\n case 'date':\n return b.runDateTime.getTime() - a.runDateTime.getTime();\n case 'rating':\n return (b.humanRating ?? 0) - (a.humanRating ?? 0);\n case 'test-name':\n return a.testName.localeCompare(b.testName);\n default:\n return 0;\n }\n });\n\n this.FilteredHistoryItems = items;\n }\n\n private emitState(): void {\n this.stateChange.emit({ viewMode: this.CurrentView });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"testing-review.component.js","sourceRoot":"","sources":["../../../src/Testing/components/testing-review.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { Subject, Observable, combineLatest, BehaviorSubject } from 'rxjs';\nimport { takeUntil, map, shareReplay } from 'rxjs/operators';\nimport {\n TestingInstrumentationService,\n FeedbackPending,\n FeedbackStats,\n TestRunWithFeedbackSummary,\n EvaluationSummaryMetrics\n} from '../services/testing-instrumentation.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\ntype ViewMode = 'queue' | 'history';\ntype HistorySort = 'date' | 'rating' | 'test-name';\n\ninterface ReviewFormState {\n rating: number | null;\n isCorrect: boolean | null;\n comments: string;\n}\n\n@Component({\n standalone: false,\n selector: 'app-testing-review',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (HideToolbar) {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n } @else {\n <mj-page-layout>\n <mj-page-header\n Title=\"Human Review\"\n Icon=\"fa-solid fa-clipboard-check\"\n Subtitle=\"Human-in-the-loop review for test outcomes\">\n <div meta>\n @if (PendingCount > 0) {\n <mj-stat-badge\n Icon=\"fa-solid fa-hourglass-half\"\n [Count]=\"PendingCount\"\n Label=\"pending\"\n Variant=\"warning\">\n </mj-stat-badge>\n }\n </div>\n <div actions>\n <mj-refresh-button [Loading]=\"IsRefreshing\" (Clicked)=\"Refresh()\"></mj-refresh-button>\n </div>\n </mj-page-header>\n <mj-page-body>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </mj-page-body>\n </mj-page-layout>\n }\n\n <ng-template #content>\n <!-- Inner page content -->\n <div class=\"review-page\">\n\n <!-- KPI Summary Row -->\n @if (Metrics) {\n <div class=\"kpi-row\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon orange\">\n <i class=\"fa-solid fa-hourglass-half\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ Metrics.humanPendingCount }}</div>\n <div class=\"kpi-label\">Pending Review</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon green\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ Metrics.humanReviewedCount }}</div>\n <div class=\"kpi-label\">Reviewed</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon gold\">\n <i class=\"fa-solid fa-star\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ FormatDecimal(Metrics.humanAvgRating, 1) }}<span class=\"kpi-unit\">/10</span></div>\n <div class=\"kpi-label\">Avg Rating</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon blue\">\n <i class=\"fa-solid fa-handshake\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ FormatDecimal(Metrics.agreementRate, 0) }}<span class=\"kpi-unit\">%</span></div>\n <div class=\"kpi-label\">Agreement Rate</div>\n </div>\n </div>\n </div>\n }\n\n <!-- View Mode Toggle -->\n <div class=\"view-toggle-bar\">\n <div class=\"toggle-group\">\n <button class=\"toggle-btn\" [class.active]=\"CurrentView === 'queue'\" (click)=\"SetView('queue')\">\n <i class=\"fa-solid fa-list-check\"></i>\n Review Queue\n </button>\n <button class=\"toggle-btn\" [class.active]=\"CurrentView === 'history'\" (click)=\"SetView('history')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n History\n </button>\n </div>\n </div>\n\n <!-- Review Queue View -->\n @if (CurrentView === 'queue') {\n <div class=\"content-card\">\n @if (PendingItems.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <h3>All caught up!</h3>\n <p>No tests currently require human review.</p>\n </div>\n } @else {\n <div class=\"queue-list\">\n @for (item of PendingItems; track item.testRunID) {\n <div class=\"queue-item\" [class.expanded]=\"IsItemExpanded(item.testRunID)\">\n <div class=\"queue-item-header\" (click)=\"ToggleExpand(item.testRunID)\">\n <div class=\"item-info\">\n <div class=\"item-name\">{{ item.testName }}</div>\n <div class=\"item-meta\">\n <span class=\"meta-time\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ FormatRelativeTime(item.runDateTime) }}\n </span>\n <app-score-indicator [score]=\"item.automatedScore\" [showBar]=\"true\"></app-score-indicator>\n <app-test-status-badge [status]=\"$any(item.automatedStatus)\"></app-test-status-badge>\n </div>\n </div>\n <div class=\"item-actions-area\">\n <span class=\"reason-badge\" [class]=\"'reason-' + item.reason\">\n @if (item.reason === 'no-feedback') {\n <i class=\"fa-solid fa-comment-slash\"></i> No Feedback\n } @else if (item.reason === 'high-score-failed') {\n <i class=\"fa-solid fa-triangle-exclamation\"></i> Score Mismatch\n } @else {\n <i class=\"fa-solid fa-circle-question\"></i> Needs Verification\n }\n </span>\n <button class=\"expand-toggle\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!IsItemExpanded(item.testRunID)\"\n [class.fa-chevron-up]=\"IsItemExpanded(item.testRunID)\"></i>\n </button>\n </div>\n </div>\n\n @if (IsItemExpanded(item.testRunID)) {\n <div class=\"review-form-panel\">\n <!-- Rating -->\n <div class=\"form-section\">\n <label class=\"form-label\">Rating</label>\n <div class=\"rating-row\">\n @for (n of RatingNumbers; track n) {\n <button class=\"rating-circle\"\n [class.selected]=\"FormState.rating != null && n <= FormState.rating\"\n [class.current]=\"FormState.rating === n\"\n (click)=\"SelectRating(n)\">\n {{ n }}\n </button>\n }\n @if (FormState.rating != null) {\n <span class=\"rating-display\">{{ FormState.rating }}/10</span>\n }\n </div>\n </div>\n\n <!-- Correctness -->\n <div class=\"form-section\">\n <label class=\"form-label\">Is the automated result correct?</label>\n <div class=\"correctness-row\">\n <button class=\"correctness-btn correct\"\n [class.active]=\"FormState.isCorrect === true\"\n (click)=\"SelectCorrectness(true)\">\n <i class=\"fa-solid fa-check\"></i> Correct\n </button>\n <button class=\"correctness-btn incorrect\"\n [class.active]=\"FormState.isCorrect === false\"\n (click)=\"SelectCorrectness(false)\">\n <i class=\"fa-solid fa-xmark\"></i> Incorrect\n </button>\n </div>\n </div>\n\n <!-- Notes -->\n <div class=\"form-section\">\n <label class=\"form-label\">Notes (optional)</label>\n <textarea class=\"notes-textarea\"\n rows=\"3\"\n placeholder=\"Add any comments about this evaluation...\"\n [value]=\"FormState.comments\"\n (input)=\"OnCommentsChange($event)\"></textarea>\n </div>\n\n <!-- Actions -->\n <div class=\"form-actions\">\n <button class=\"submit-btn\"\n [disabled]=\"!IsFormValid || IsSubmitting\"\n (click)=\"SubmitReview(item)\">\n <i class=\"fa-solid fa-paper-plane\"></i>\n {{ IsSubmitting ? 'Submitting...' : 'Submit' }}\n </button>\n <button class=\"skip-btn\" (click)=\"SkipItem()\">\n <i class=\"fa-solid fa-forward\"></i> Skip\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- History View -->\n @if (CurrentView === 'history') {\n <div class=\"content-card\">\n <!-- Filter Bar -->\n <div class=\"history-filters\">\n <div class=\"search-wrapper\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n placeholder=\"Search by test name...\"\n [value]=\"HistorySearchText\"\n (input)=\"OnHistorySearch($event)\" />\n </div>\n <div class=\"sort-control\">\n <label>Sort by:</label>\n <select [value]=\"HistorySortField\" (change)=\"OnHistorySortChange($event)\">\n <option value=\"date\">Date</option>\n <option value=\"rating\">Rating</option>\n <option value=\"test-name\">Test Name</option>\n </select>\n </div>\n </div>\n\n @if (FilteredHistoryItems.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <h3>No reviewed items</h3>\n <p>Reviewed tests will appear here once feedback is submitted.</p>\n </div>\n } @else {\n <div class=\"history-list\">\n @for (item of FilteredHistoryItems; track item.id) {\n <div class=\"history-item\">\n <div class=\"history-item-main\">\n <div class=\"history-name\">{{ item.testName }}</div>\n <div class=\"history-date\">\n <i class=\"fa-solid fa-calendar\"></i>\n {{ FormatRelativeTime(item.runDateTime) }}\n </div>\n </div>\n <div class=\"history-rating\">\n <div class=\"rating-dots\">\n @for (n of RatingNumbers; track n) {\n <span class=\"rating-dot\" [class.filled]=\"item.humanRating != null && n <= item.humanRating\"></span>\n }\n </div>\n <span class=\"rating-label\">{{ item.humanRating ?? 0 }}/10</span>\n </div>\n <div class=\"history-verdict\">\n @if (item.humanIsCorrect === true) {\n <span class=\"verdict correct\">\n <i class=\"fa-solid fa-check\"></i> Correct\n </span>\n } @else if (item.humanIsCorrect === false) {\n <span class=\"verdict incorrect\">\n <i class=\"fa-solid fa-xmark\"></i> Incorrect\n </span>\n }\n </div>\n <div class=\"history-auto-score\">\n <app-score-indicator [score]=\"item.score\" [showBar]=\"true\"></app-score-indicator>\n </div>\n @if (item.humanComments) {\n <div class=\"history-comments\"\n [class.expanded]=\"ExpandedHistoryId === item.id\"\n (click)=\"ToggleHistoryComment(item.id)\">\n <p>{{ item.humanComments }}</p>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Calibration Insights -->\n <div class=\"calibration-section\">\n <h3>\n <i class=\"fa-solid fa-scale-balanced\"></i>\n Human vs Auto Agreement\n </h3>\n <div class=\"calibration-body\">\n <div class=\"gauge-display\">\n <div class=\"gauge-ring\">\n <svg viewBox=\"0 0 120 120\" class=\"gauge-svg\">\n <circle cx=\"60\" cy=\"60\" r=\"52\" fill=\"none\" class=\"gauge-track\" stroke-width=\"10\" />\n <circle cx=\"60\" cy=\"60\" r=\"52\" fill=\"none\"\n [attr.stroke]=\"AgreementColor\"\n stroke-width=\"10\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"AgreementDash\"\n stroke-dashoffset=\"0\"\n transform=\"rotate(-90 60 60)\" />\n </svg>\n <div class=\"gauge-value\">{{ FormatDecimal(AgreementRate, 0) }}%</div>\n </div>\n </div>\n <div class=\"calibration-text\">\n <p class=\"calibration-description\">\n Measures how often human reviewers agree with automated evaluation scores.\n </p>\n @if (AgreementRate < 70) {\n <div class=\"calibration-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n Low agreement may indicate evaluation criteria need refinement.\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n }\n\n .review-page {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n /* Page Header */\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n background: var(--mj-bg-surface);\n padding: 20px;\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .header-left h2 {\n margin: 0;\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-left h2 i {\n color: var(--mj-brand-primary);\n }\n\n .pending-badge {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 14px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-warning);\n border-radius: 20px;\n }\n\n .badge-count {\n background: var(--mj-status-warning);\n color: var(--mj-text-inverse);\n min-width: 24px;\n height: 24px;\n padding: 0 6px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 700;\n }\n\n .badge-text {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-status-warning);\n }\n\n .refresh-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .refresh-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n }\n\n .refresh-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n /* KPI Row */\n .kpi-row {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 20px;\n }\n\n .kpi-card {\n background: var(--mj-bg-surface);\n padding: 20px;\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .kpi-icon {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n color: var(--mj-text-inverse);\n flex-shrink: 0;\n }\n\n .kpi-icon.orange { background: var(--mj-status-warning); }\n .kpi-icon.green { background: var(--mj-status-success); }\n .kpi-icon.gold { background: var(--mj-status-warning); }\n .kpi-icon.blue { background: var(--mj-brand-primary); }\n\n .kpi-content {\n flex: 1;\n min-width: 0;\n }\n\n .kpi-value {\n font-size: 26px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n margin-bottom: 4px;\n }\n\n .kpi-unit {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n }\n\n .kpi-label {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n /* View Toggle */\n .view-toggle-bar {\n margin-bottom: 20px;\n }\n\n .toggle-group {\n display: inline-flex;\n background: var(--mj-bg-surface);\n border-radius: 10px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n }\n\n .toggle-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 24px;\n border: none;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .toggle-btn:hover:not(.active) {\n background: var(--mj-bg-surface-card);\n }\n\n .toggle-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n /* Content Card */\n .content-card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n margin-bottom: 20px;\n }\n\n /* Queue List */\n .queue-list {\n max-height: 600px;\n overflow-y: auto;\n }\n\n .queue-item {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background 0.2s ease;\n }\n\n .queue-item.expanded {\n background: var(--mj-bg-surface-card);\n }\n\n .queue-item:last-child {\n border-bottom: none;\n }\n\n .queue-item-header {\n padding: 16px 20px;\n display: flex;\n align-items: center;\n gap: 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n }\n\n .queue-item-header:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-meta {\n display: flex;\n gap: 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n align-items: center;\n flex-wrap: wrap;\n }\n\n .meta-time {\n display: flex;\n align-items: center;\n gap: 5px;\n }\n\n .item-actions-area {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .reason-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n }\n\n .reason-no-feedback {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .reason-high-score-failed {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .reason-low-score-passed {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .expand-toggle {\n background: none;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n padding: 8px;\n border-radius: 6px;\n font-size: 14px;\n transition: all 0.2s ease;\n }\n\n .expand-toggle:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-muted);\n }\n\n /* Review Form */\n .review-form-panel {\n padding: 20px 20px 20px 36px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n }\n\n .form-section {\n margin-bottom: 20px;\n }\n\n .form-section:last-of-type {\n margin-bottom: 16px;\n }\n\n .form-label {\n display: block;\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 10px;\n }\n\n /* Rating Circles */\n .rating-row {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .rating-circle {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n border: 2px solid var(--mj-border-strong);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-disabled);\n font-size: 13px;\n font-weight: 700;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n }\n\n .rating-circle:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n transform: scale(1.1);\n }\n\n .rating-circle.selected {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .rating-circle.current {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .rating-display {\n margin-left: 12px;\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n /* Correctness Buttons */\n .correctness-row {\n display: flex;\n gap: 12px;\n }\n\n .correctness-btn {\n flex: 1;\n max-width: 200px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 10px;\n background: var(--mj-bg-surface-card);\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .correctness-btn.correct:hover,\n .correctness-btn.correct.active {\n border-color: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .correctness-btn.incorrect:hover,\n .correctness-btn.incorrect.active {\n border-color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n /* Notes */\n .notes-textarea {\n width: 100%;\n max-width: 500px;\n padding: 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n min-height: 72px;\n box-sizing: border-box;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n }\n\n .notes-textarea:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n /* Form Actions */\n .form-actions {\n display: flex;\n gap: 12px;\n }\n\n .submit-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 11px 22px;\n border: none;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .submit-btn:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .skip-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 11px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .skip-btn:hover {\n border-color: var(--mj-border-strong);\n background: var(--mj-bg-surface-card);\n }\n\n /* History Filters */\n .history-filters {\n display: flex;\n gap: 16px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n align-items: center;\n }\n\n .search-wrapper {\n flex: 1;\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .search-wrapper > i {\n position: absolute;\n left: 12px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n .search-wrapper input {\n width: 100%;\n padding: 10px 12px 10px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n }\n\n .search-wrapper input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .sort-control {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n }\n\n .sort-control select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n }\n\n /* History List */\n .history-list {\n max-height: 600px;\n overflow-y: auto;\n }\n\n .history-item {\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n }\n\n .history-item:last-child {\n border-bottom: none;\n }\n\n .history-item-main {\n flex: 1;\n min-width: 160px;\n }\n\n .history-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n }\n\n .history-date {\n font-size: 12px;\n color: var(--mj-text-disabled);\n display: flex;\n align-items: center;\n gap: 5px;\n }\n\n .history-rating {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .rating-dots {\n display: flex;\n gap: 3px;\n }\n\n .rating-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--mj-border-default);\n }\n\n .rating-dot.filled {\n background: var(--mj-status-warning);\n }\n\n .rating-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n }\n\n .history-verdict {\n flex-shrink: 0;\n }\n\n .verdict {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border-radius: 14px;\n font-size: 11px;\n font-weight: 600;\n }\n\n .verdict.correct {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .verdict.incorrect {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .history-auto-score {\n flex-shrink: 0;\n }\n\n .history-comments {\n width: 100%;\n margin-top: 8px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border-left: 3px solid var(--mj-brand-primary);\n cursor: pointer;\n }\n\n .history-comments p {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .history-comments.expanded p {\n white-space: normal;\n }\n\n /* Empty State */\n .empty-state {\n padding: 60px 20px;\n text-align: center;\n }\n\n .empty-state i {\n font-size: 52px;\n margin-bottom: 16px;\n color: var(--mj-status-success);\n }\n\n .empty-state h3 {\n font-size: 18px;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n font-weight: 600;\n }\n\n .empty-state p {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\n }\n\n /* Calibration Section */\n .calibration-section {\n background: var(--mj-bg-surface);\n padding: 24px;\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .calibration-section h3 {\n margin: 0 0 20px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .calibration-section h3 i {\n color: var(--mj-brand-primary);\n }\n\n .calibration-body {\n display: flex;\n align-items: center;\n gap: 32px;\n }\n\n .gauge-display {\n flex-shrink: 0;\n }\n\n .gauge-ring {\n position: relative;\n width: 120px;\n height: 120px;\n }\n\n .gauge-svg {\n width: 100%;\n height: 100%;\n }\n\n .gauge-track {\n stroke: var(--mj-border-default);\n }\n\n .gauge-value {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n font-weight: 800;\n color: var(--mj-text-primary);\n }\n\n .calibration-text {\n flex: 1;\n }\n\n .calibration-description {\n margin: 0 0 12px 0;\n font-size: 14px;\n color: var(--mj-text-muted);\n line-height: 1.6;\n }\n\n .calibration-warning {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-warning);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-status-warning);\n }\n\n .calibration-warning i {\n color: var(--mj-status-warning);\n font-size: 16px;\n flex-shrink: 0;\n }\n\n /* Success toast animation */\n .queue-item {\n animation: fadeIn 0.2s ease;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .review-page {\n padding: 16px;\n }\n\n .page-header {\n flex-direction: column;\n gap: 16px;\n align-items: flex-start;\n }\n\n .kpi-row {\n grid-template-columns: 1fr 1fr;\n }\n\n .kpi-card {\n padding: 16px;\n }\n\n .kpi-value {\n font-size: 22px;\n }\n\n .queue-item-header {\n flex-wrap: wrap;\n }\n\n .item-actions-area {\n width: 100%;\n justify-content: flex-end;\n margin-top: 8px;\n }\n\n .correctness-row {\n flex-direction: column;\n }\n\n .correctness-btn {\n max-width: 100%;\n }\n\n .history-item {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .calibration-body {\n flex-direction: column;\n align-items: center;\n text-align: center;\n }\n }\n `]\n})\nexport class TestingReviewComponent implements OnInit, OnDestroy {\n @Input() initialState: Record<string, unknown> | null = null;\n /** When true, the inner bespoke .page-header is hidden — the parent shell owns the chrome. */\n @Input() HideToolbar = false;\n @Output() stateChange = new EventEmitter<Record<string, unknown>>();\n\n private destroy$ = new Subject<void>();\n\n // View state\n CurrentView: ViewMode = 'queue';\n ExpandedItemId: string | null = null;\n ExpandedHistoryId: string | null = null;\n IsRefreshing = false;\n IsSubmitting = false;\n HistorySearchText = '';\n HistorySortField: HistorySort = 'date';\n\n // Form state for active review\n FormState: ReviewFormState = { rating: null, isCorrect: null, comments: '' };\n\n // Data\n PendingItems: FeedbackPending[] = [];\n HistoryItems: TestRunWithFeedbackSummary[] = [];\n FilteredHistoryItems: TestRunWithFeedbackSummary[] = [];\n Metrics: EvaluationSummaryMetrics | null = null;\n PendingCount = 0;\n\n // Constants\n readonly RatingNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n\n constructor(\n private instrumentationService: TestingInstrumentationService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.restoreState();\n this.setupSubscriptions();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ------------------------------------------------------------------\n // Computed properties\n // ------------------------------------------------------------------\n\n get IsFormValid(): boolean {\n return this.FormState.rating != null && this.FormState.isCorrect != null;\n }\n\n get AgreementRate(): number {\n return this.Metrics?.agreementRate ?? 0;\n }\n\n get AgreementColor(): string {\n const rate = this.AgreementRate;\n if (rate >= 80) return '#22c55e';\n if (rate >= 60) return '#eab308';\n return '#ef4444';\n }\n\n get AgreementDash(): string {\n const circumference = 2 * Math.PI * 52; // r=52\n const filled = (this.AgreementRate / 100) * circumference;\n return `${filled} ${circumference}`;\n }\n\n // ------------------------------------------------------------------\n // Setup\n // ------------------------------------------------------------------\n\n private restoreState(): void {\n if (!this.initialState) return;\n const view = this.initialState['viewMode'] as string | undefined;\n if (view === 'queue' || view === 'history') {\n this.CurrentView = view;\n }\n }\n\n private setupSubscriptions(): void {\n this.instrumentationService.pendingFeedback$\n .pipe(takeUntil(this.destroy$))\n .subscribe(items => {\n this.PendingItems = items;\n this.PendingCount = items.length;\n this.cdr.markForCheck();\n });\n\n this.instrumentationService.evaluationMetrics$\n .pipe(takeUntil(this.destroy$))\n .subscribe(metrics => {\n this.Metrics = metrics;\n this.cdr.markForCheck();\n });\n\n this.instrumentationService.testRunsWithFeedback$\n .pipe(takeUntil(this.destroy$))\n .subscribe(runs => {\n this.HistoryItems = runs.filter(r => r.hasHumanFeedback);\n this.applyHistoryFilters();\n this.cdr.markForCheck();\n });\n }\n\n // ------------------------------------------------------------------\n // View toggling\n // ------------------------------------------------------------------\n\n SetView(mode: ViewMode): void {\n this.CurrentView = mode;\n this.ExpandedItemId = null;\n this.emitState();\n this.cdr.markForCheck();\n }\n\n // ------------------------------------------------------------------\n // Queue interactions\n // ------------------------------------------------------------------\n\n IsItemExpanded(testRunID: string): boolean {\n return UUIDsEqual(this.ExpandedItemId, testRunID);\n }\n\n ToggleExpand(testRunID: string): void {\n if (UUIDsEqual(this.ExpandedItemId, testRunID)) {\n this.ExpandedItemId = null;\n } else {\n this.ExpandedItemId = testRunID;\n this.resetForm();\n }\n this.cdr.markForCheck();\n }\n\n SelectRating(n: number): void {\n this.FormState = { ...this.FormState, rating: n };\n this.cdr.markForCheck();\n }\n\n SelectCorrectness(value: boolean): void {\n this.FormState = { ...this.FormState, isCorrect: value };\n this.cdr.markForCheck();\n }\n\n OnCommentsChange(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n this.FormState = { ...this.FormState, comments: target.value };\n }\n\n async SubmitReview(item: FeedbackPending): Promise<void> {\n if (!this.IsFormValid || this.IsSubmitting) return;\n\n this.IsSubmitting = true;\n this.cdr.markForCheck();\n\n try {\n const success = await this.instrumentationService.submitFeedback(\n item.testRunID,\n this.FormState.rating!,\n this.FormState.isCorrect!,\n this.FormState.comments\n );\n\n if (success) {\n this.ExpandedItemId = null;\n this.resetForm();\n }\n } finally {\n this.IsSubmitting = false;\n this.cdr.markForCheck();\n }\n }\n\n SkipItem(): void {\n const currentIndex = this.PendingItems.findIndex(\n i => UUIDsEqual(i.testRunID, this.ExpandedItemId)\n );\n this.ExpandedItemId = null;\n this.resetForm();\n\n // Expand the next item if available\n if (currentIndex >= 0 && currentIndex + 1 < this.PendingItems.length) {\n this.ExpandedItemId = this.PendingItems[currentIndex + 1].testRunID;\n }\n this.cdr.markForCheck();\n }\n\n // ------------------------------------------------------------------\n // History interactions\n // ------------------------------------------------------------------\n\n OnHistorySearch(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.HistorySearchText = target.value;\n this.applyHistoryFilters();\n this.cdr.markForCheck();\n }\n\n OnHistorySortChange(event: Event): void {\n const target = event.target as HTMLSelectElement;\n this.HistorySortField = target.value as HistorySort;\n this.applyHistoryFilters();\n this.cdr.markForCheck();\n }\n\n ToggleHistoryComment(id: string): void {\n this.ExpandedHistoryId = this.ExpandedHistoryId === id ? null : id;\n this.cdr.markForCheck();\n }\n\n // ------------------------------------------------------------------\n // Refresh\n // ------------------------------------------------------------------\n\n Refresh(): void {\n this.IsRefreshing = true;\n this.cdr.markForCheck();\n this.instrumentationService.refresh();\n\n setTimeout(() => {\n this.IsRefreshing = false;\n this.cdr.markForCheck();\n }, 1500);\n }\n\n // ------------------------------------------------------------------\n // Formatting helpers\n // ------------------------------------------------------------------\n\n FormatDecimal(value: number | undefined | null, decimals: number): string {\n if (value == null) return '0';\n return value.toFixed(decimals);\n }\n\n FormatRelativeTime(date: Date): string {\n const now = Date.now();\n const then = date instanceof Date ? date.getTime() : new Date(date).getTime();\n const diffMs = now - then;\n const diffMin = Math.floor(diffMs / 60000);\n\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return `${diffMin}m ago`;\n\n const diffHours = Math.floor(diffMin / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n\n const diffDays = Math.floor(diffHours / 24);\n if (diffDays < 7) return `${diffDays}d ago`;\n\n const diffWeeks = Math.floor(diffDays / 7);\n if (diffWeeks < 4) return `${diffWeeks}w ago`;\n\n const diffMonths = Math.floor(diffDays / 30);\n return `${diffMonths}mo ago`;\n }\n\n // ------------------------------------------------------------------\n // Private helpers\n // ------------------------------------------------------------------\n\n private resetForm(): void {\n this.FormState = { rating: null, isCorrect: null, comments: '' };\n }\n\n private applyHistoryFilters(): void {\n let items = [...this.HistoryItems];\n\n // Search filter\n if (this.HistorySearchText) {\n const term = this.HistorySearchText.toLowerCase();\n items = items.filter(i => i.testName.toLowerCase().includes(term));\n }\n\n // Sort\n items.sort((a, b) => {\n switch (this.HistorySortField) {\n case 'date':\n return b.runDateTime.getTime() - a.runDateTime.getTime();\n case 'rating':\n return (b.humanRating ?? 0) - (a.humanRating ?? 0);\n case 'test-name':\n return a.testName.localeCompare(b.testName);\n default:\n return 0;\n }\n });\n\n this.FilteredHistoryItems = items;\n }\n\n private emitState(): void {\n this.stateChange.emit({ viewMode: this.CurrentView });\n }\n}\n"]}
|
|
@@ -5,7 +5,8 @@ import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
|
5
5
|
import { TestingDialogService } from '@memberjunction/ng-testing';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
/**
|
|
8
|
-
* Testing Runs Resource
|
|
8
|
+
* Testing Runs Resource — thin shim that renders the inner component.
|
|
9
|
+
* The inner owns its own <mj-page-layout> + <mj-page-header> when used standalone.
|
|
9
10
|
*/
|
|
10
11
|
export declare class TestingRunsResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {
|
|
11
12
|
testingDialogService: TestingDialogService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing-runs-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Testing/components/testing-runs-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAA2B,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;;AAElE
|
|
1
|
+
{"version":3,"file":"testing-runs-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Testing/components/testing-runs-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAA2B,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;;AAElE;;;GAGG;AACH,qBA2Ba,4BAA6B,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAIzF,oBAAoB,EAAE,oBAAoB;IACjD,OAAO,CAAC,GAAG;IAJb,UAAmB,QAAQ,gBAAuB;gBAGzC,oBAAoB,EAAE,oBAAoB,EACzC,GAAG,EAAE,iBAAiB;IAKhC,QAAQ,IAAI,IAAI;IAWhB,WAAW,IAAI,IAAI;IAMZ,aAAa,IAAI,IAAI;IAKtB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCApCpD,4BAA4B;2CAA5B,4BAA4B;CAuCxC"}
|
|
@@ -13,12 +13,12 @@ import * as i0 from "@angular/core";
|
|
|
13
13
|
import * as i1 from "@memberjunction/ng-testing";
|
|
14
14
|
import * as i2 from "@memberjunction/ng-versions";
|
|
15
15
|
import * as i3 from "./testing-runs.component";
|
|
16
|
-
function
|
|
16
|
+
function TestingRunsResourceComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
17
17
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
18
|
-
i0.ɵɵelementStart(0, "mj-slide-panel",
|
|
19
|
-
i0.ɵɵlistener("Closed", function
|
|
20
|
-
i0.ɵɵelementStart(1, "app-test-run-dialog",
|
|
21
|
-
i0.ɵɵlistener("PanelClose", function
|
|
18
|
+
i0.ɵɵelementStart(0, "mj-slide-panel", 1);
|
|
19
|
+
i0.ɵɵlistener("Closed", function TestingRunsResourceComponent_Conditional_1_Template_mj_slide_panel_Closed_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnPanelClosed()); });
|
|
20
|
+
i0.ɵɵelementStart(1, "app-test-run-dialog", 2);
|
|
21
|
+
i0.ɵɵlistener("PanelClose", function TestingRunsResourceComponent_Conditional_1_Template_app_test_run_dialog_PanelClose_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnPanelClosed()); });
|
|
22
22
|
i0.ɵɵelementEnd()();
|
|
23
23
|
} if (rf & 2) {
|
|
24
24
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -27,7 +27,8 @@ function TestingRunsResourceComponent_Conditional_2_Template(rf, ctx) { if (rf &
|
|
|
27
27
|
i0.ɵɵproperty("PanelMode", true)("selectedTestId", (ctx_r1.testingDialogService.PanelOptions == null ? null : ctx_r1.testingDialogService.PanelOptions.testId) ?? null)("selectedSuiteId", (ctx_r1.testingDialogService.PanelOptions == null ? null : ctx_r1.testingDialogService.PanelOptions.suiteId) ?? null)("runMode", (ctx_r1.testingDialogService.PanelOptions == null ? null : ctx_r1.testingDialogService.PanelOptions.mode) ?? "test");
|
|
28
28
|
} }
|
|
29
29
|
/**
|
|
30
|
-
* Testing Runs Resource
|
|
30
|
+
* Testing Runs Resource — thin shim that renders the inner component.
|
|
31
|
+
* The inner owns its own <mj-page-layout> + <mj-page-header> when used standalone.
|
|
31
32
|
*/
|
|
32
33
|
let TestingRunsResourceComponent = class TestingRunsResourceComponent extends BaseResourceComponent {
|
|
33
34
|
testingDialogService;
|
|
@@ -61,15 +62,13 @@ let TestingRunsResourceComponent = class TestingRunsResourceComponent extends Ba
|
|
|
61
62
|
return 'fa-solid fa-play-circle';
|
|
62
63
|
}
|
|
63
64
|
static ɵfac = function TestingRunsResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TestingRunsResourceComponent)(i0.ɵɵdirectiveInject(i1.TestingDialogService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
64
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestingRunsResourceComponent, selectors: [["mj-testing-runs-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
65
|
-
i0.ɵɵ
|
|
66
|
-
i0.ɵɵ
|
|
67
|
-
i0.ɵɵelementEnd();
|
|
68
|
-
i0.ɵɵconditionalCreate(2, TestingRunsResourceComponent_Conditional_2_Template, 2, 6, "mj-slide-panel", 1);
|
|
65
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestingRunsResourceComponent, selectors: [["mj-testing-runs-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [["Mode", "slide", 3, "Title", "Resizable"], ["Mode", "slide", 3, "Closed", "Title", "Resizable"], [3, "PanelClose", "PanelMode", "selectedTestId", "selectedSuiteId", "runMode"]], template: function TestingRunsResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
66
|
+
i0.ɵɵelement(0, "app-testing-runs");
|
|
67
|
+
i0.ɵɵconditionalCreate(1, TestingRunsResourceComponent_Conditional_1_Template, 2, 6, "mj-slide-panel", 0);
|
|
69
68
|
} if (rf & 2) {
|
|
70
|
-
i0.ɵɵadvance(
|
|
71
|
-
i0.ɵɵconditional(ctx.testingDialogService.IsPanelOpen ?
|
|
72
|
-
} }, dependencies: [i1.TestRunDialogComponent, i2.MjSlidePanelComponent, i3.TestingRunsComponent], styles: ["
|
|
69
|
+
i0.ɵɵadvance();
|
|
70
|
+
i0.ɵɵconditional(ctx.testingDialogService.IsPanelOpen ? 1 : -1);
|
|
71
|
+
} }, dependencies: [i1.TestRunDialogComponent, i2.MjSlidePanelComponent, i3.TestingRunsComponent], styles: ["[_nghost-%COMP%] { display: block; width: 100%; height: 100%; }"], changeDetection: 0 });
|
|
73
72
|
};
|
|
74
73
|
TestingRunsResourceComponent = __decorate([
|
|
75
74
|
RegisterClass(BaseResourceComponent, 'TestingRunsResource')
|
|
@@ -78,9 +77,7 @@ export { TestingRunsResourceComponent };
|
|
|
78
77
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TestingRunsResourceComponent, [{
|
|
79
78
|
type: Component,
|
|
80
79
|
args: [{ standalone: false, selector: 'mj-testing-runs-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
81
|
-
<
|
|
82
|
-
<app-testing-runs></app-testing-runs>
|
|
83
|
-
</div>
|
|
80
|
+
<app-testing-runs></app-testing-runs>
|
|
84
81
|
|
|
85
82
|
<!-- Slide Panel for Test Execution -->
|
|
86
83
|
@if (testingDialogService.IsPanelOpen) {
|
|
@@ -98,7 +95,7 @@ export { TestingRunsResourceComponent };
|
|
|
98
95
|
</app-test-run-dialog>
|
|
99
96
|
</mj-slide-panel>
|
|
100
97
|
}
|
|
101
|
-
`, styles: ["
|
|
98
|
+
`, styles: [":host { display: block; width: 100%; height: 100%; }"] }]
|
|
102
99
|
}], () => [{ type: i1.TestingDialogService }, { type: i0.ChangeDetectorRef }], null); })();
|
|
103
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestingRunsResourceComponent, { className: "TestingRunsResourceComponent", filePath: "src/Testing/components/testing-runs-resource.component.ts", lineNumber:
|
|
100
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestingRunsResourceComponent, { className: "TestingRunsResourceComponent", filePath: "src/Testing/components/testing-runs-resource.component.ts", lineNumber: 40 }); })();
|
|
104
101
|
//# sourceMappingURL=testing-runs-resource.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing-runs-resource.component.js","sourceRoot":"","sources":["../../../src/Testing/components/testing-runs-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAwC,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;;;;;;
|
|
1
|
+
{"version":3,"file":"testing-runs-resource.component.js","sourceRoot":"","sources":["../../../src/Testing/components/testing-runs-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAwC,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;;;;;;IAiB5D,yCAI6B;IAA3B,0MAAU,sBAAe,KAAC;IAC1B,8CAKiC;IAA/B,uNAAc,sBAAe,KAAC;IAElC,AADE,iBAAsB,EACP;;;IATf,AADA,mKAAmF,mBACjE;IAGhB,cAAkB;IAGlB,AADA,AADA,AADA,gCAAkB,uIACkD,yIACE,gIACT;;AAvBvE;;;GAGG;AA4BI,IAAM,4BAA4B,GAAlC,MAAM,4BAA6B,SAAQ,qBAAqB;IAI5D;IACC;IAJS,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAElD,YACS,oBAA0C,EACzC,GAAsB;QAE9B,KAAK,EAAE,CAAC;QAHD,yBAAoB,GAApB,oBAAoB,CAAsB;QACzC,QAAG,GAAH,GAAG,CAAmB;IAGhC,CAAC;IAED,QAAQ;QACN,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,IAAI,CAC/C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,WAAW;QACT,KAAK,CAAC,WAAW,EAAE,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAEM,aAAa;QAClB,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QAC3C,OAAO,yBAAyB,CAAC;IACnC,CAAC;sHAtCU,4BAA4B;6DAA5B,4BAA4B;YArBrC,mCAAqC;YAGrC,yGAAwC;;YAAxC,cAcC;YAdD,+DAcC;;;AAIQ,4BAA4B;IA3BxC,aAAa,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;GA2B/C,4BAA4B,CAuCxC;;iFAvCY,4BAA4B;cA1BxC,SAAS;6BACI,KAAK,YACP,0BAA0B,mBACnB,uBAAuB,CAAC,MAAM,YACrC;;;;;;;;;;;;;;;;;;;GAmBT;;kFAGU,4BAA4B","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { TestingDialogService } from '@memberjunction/ng-testing';\n\n/**\n * Testing Runs Resource — thin shim that renders the inner component.\n * The inner owns its own <mj-page-layout> + <mj-page-header> when used standalone.\n */\n@RegisterClass(BaseResourceComponent, 'TestingRunsResource')\n@Component({\n standalone: false,\n selector: 'mj-testing-runs-resource',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <app-testing-runs></app-testing-runs>\n\n <!-- Slide Panel for Test Execution -->\n @if (testingDialogService.IsPanelOpen) {\n <mj-slide-panel\n Mode=\"slide\"\n [Title]=\"testingDialogService.PanelOptions?.testId ? 'Test Execution' : 'Run Test'\"\n [Resizable]=\"true\"\n (Closed)=\"OnPanelClosed()\">\n <app-test-run-dialog\n [PanelMode]=\"true\"\n [selectedTestId]=\"testingDialogService.PanelOptions?.testId ?? null\"\n [selectedSuiteId]=\"testingDialogService.PanelOptions?.suiteId ?? null\"\n [runMode]=\"testingDialogService.PanelOptions?.mode ?? 'test'\"\n (PanelClose)=\"OnPanelClosed()\">\n </app-test-run-dialog>\n </mj-slide-panel>\n }\n `,\n styles: [`:host { display: block; width: 100%; height: 100%; }`]\n})\nexport class TestingRunsResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n constructor(\n public testingDialogService: TestingDialogService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.testingDialogService.PanelStateChanged$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.cdr.detectChanges();\n });\n\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n public OnPanelClosed(): void {\n this.testingDialogService.ClosePanel();\n this.cdr.markForCheck();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Runs';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-play-circle';\n }\n}\n"]}
|
|
@@ -23,6 +23,8 @@ export declare class TestingRunsComponent implements OnInit, OnDestroy {
|
|
|
23
23
|
private cdr;
|
|
24
24
|
private viewContainerRef;
|
|
25
25
|
initialState: Record<string, unknown> | null;
|
|
26
|
+
/** When true, the inner bespoke .page-header is hidden — the parent shell owns the chrome. */
|
|
27
|
+
HideToolbar: boolean;
|
|
26
28
|
stateChange: EventEmitter<Record<string, unknown>>;
|
|
27
29
|
private destroy$;
|
|
28
30
|
private filterTrigger$;
|
|
@@ -76,7 +78,7 @@ export declare class TestingRunsComponent implements OnInit, OnDestroy {
|
|
|
76
78
|
private resetFeedbackForm;
|
|
77
79
|
private formatShortDate;
|
|
78
80
|
static ɵfac: i0.ɵɵFactoryDeclaration<TestingRunsComponent, never>;
|
|
79
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TestingRunsComponent, "app-testing-runs", never, { "initialState": { "alias": "initialState"; "required": false; }; }, { "stateChange": "stateChange"; }, never, never, false, never>;
|
|
81
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TestingRunsComponent, "app-testing-runs", never, { "initialState": { "alias": "initialState"; "required": false; }; "HideToolbar": { "alias": "HideToolbar"; "required": false; }; }, { "stateChange": "stateChange"; }, never, never, false, never>;
|
|
80
82
|
}
|
|
81
83
|
export {};
|
|
82
84
|
//# sourceMappingURL=testing-runs.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing-runs.component.d.ts","sourceRoot":"","sources":["../../../src/Testing/components/testing-runs.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,EACN,SAAS,EAGT,YAAY,EACZ,iBAAiB,EAEjB,gBAAgB,EAEjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAA2C,MAAM,MAAM,CAAC;AAI3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAkC,MAAM,4BAA4B,CAAC;AACnG,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAE3B,MAAM,6CAA6C,CAAC;;AAErD,KAAK,YAAY,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AACtE,KAAK,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEvD,UAAU,eAAe;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,aAAa;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,
|
|
1
|
+
{"version":3,"file":"testing-runs.component.d.ts","sourceRoot":"","sources":["../../../src/Testing/components/testing-runs.component.ts"],"names":[],"mappings":"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"}
|