@memberjunction/ng-dashboards 5.34.1 → 5.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +399 -292
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +75 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +400 -89
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +990 -992
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +17 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +370 -425
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +317 -357
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +403 -362
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +781 -783
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +6 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +79 -30
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +196 -142
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/index.d.ts +0 -1
- package/dist/Actions/components/explorer/index.d.ts.map +1 -1
- package/dist/Actions/components/explorer/index.js +0 -1
- package/dist/Actions/components/explorer/index.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +32 -40
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +32 -40
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +32 -40
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.js +24 -5
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +80 -99
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +127 -106
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +44 -45
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +60 -58
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +139 -162
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +6 -0
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +521 -485
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +8 -0
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +309 -318
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +866 -847
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +182 -163
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +241 -241
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +1 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +28 -1
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +486 -532
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +152 -160
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +234 -246
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +1248 -1338
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +1 -1
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +34 -1
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.js +76 -85
- package/dist/Permissions/audit-log-resource.component.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +64 -69
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +63 -74
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +773 -783
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +420 -393
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +587 -608
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +9 -12
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +3 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +310 -274
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +16 -19
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts +3 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +307 -273
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +107 -93
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +185 -188
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +154 -184
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +350 -354
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +163 -169
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/actions-dashboards.module.d.ts +15 -16
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +34 -11
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +45 -48
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +36 -10
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +2 -1
- package/dist/archiving-dashboards.module.d.ts.map +1 -1
- package/dist/archiving-dashboards.module.js +12 -2
- package/dist/archiving-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +2 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +24 -3
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +31 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +1 -1
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +28 -1
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +1 -1
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +28 -1
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -3
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +1 -1
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +31 -1
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +8 -7
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +30 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +52 -52
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing-analytics.component.js","sourceRoot":"","sources":["../../../src/Testing/components/testing-analytics.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, Input, Output, EventEmitter, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Observable, Subject, BehaviorSubject } from 'rxjs';\nimport { takeUntil, map, shareReplay } from 'rxjs/operators';\nimport {\n TestingInstrumentationService,\n TestTrendData,\n TestAnalytics,\n TestRunSummary,\n VersionMetrics\n} from '../services/testing-instrumentation.service';\n\n// ---------------------------------------------------------------------------\n// Local interfaces\n// ---------------------------------------------------------------------------\n\ninterface TimeRangeOption {\n label: string;\n days: number;\n}\n\ninterface ScoreDistributionBucket {\n label: string;\n color: string;\n count: number;\n percentage: number;\n}\n\ninterface VersionRow {\n version: string;\n gitCommitShort: string;\n agentVersion: string;\n date: Date;\n totalTests: number;\n passRate: number;\n totalCost: number;\n passRateDelta: number | null;\n costDelta: number | null;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n@Component({\n standalone: false,\n selector: 'app-testing-analytics',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"testing-analytics\">\n\n <!-- ===== 1. Page Header ===== -->\n <div class=\"page-header\">\n <div class=\"header-left\">\n <h2>\n <i class=\"fa-solid fa-chart-bar\"></i>\n Testing Analytics\n </h2>\n </div>\n <div class=\"header-actions\">\n <div class=\"time-range-pills\">\n @for (range of TimeRanges; track range.days) {\n <button\n class=\"pill\"\n [class.active]=\"SelectedDays === range.days\"\n (click)=\"OnTimeRangeSelect(range.days)\">\n {{ range.label }}\n </button>\n }\n </div>\n <button class=\"refresh-btn\" (click)=\"Refresh()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n <!-- ===== 2. Trend Overview (2-column CSS charts) ===== -->\n <div class=\"section-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Trend Overview\n </div>\n <div class=\"trend-grid\">\n\n <!-- Pass Rate Trend -->\n <div class=\"card trend-card\">\n <h4><i class=\"fa-solid fa-check-double\"></i> Pass Rate Trend</h4>\n @if (DisplayTrends$ | async; as trends) {\n @if (trends.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-chart-area\"></i><span>No trend data</span></div>\n } @else {\n <div class=\"bar-chart\">\n @for (t of trends; track trackTrend($index, t)) {\n <div class=\"bar-row\">\n <span class=\"bar-label\">{{ FormatBucketDate(t.timestamp) }}</span>\n <div class=\"bar-track\">\n <div class=\"bar-fill pass-rate-bar\" [style.width.%]=\"PassRate(t)\"></div>\n </div>\n <span class=\"bar-value\" [class]=\"PassRateClass(t)\">{{ PassRate(t) | number:'1.0-0' }}%</span>\n </div>\n }\n </div>\n <div class=\"trend-direction\">\n @if (PassRateTrendDirection$ | async; as dir) {\n @if (dir === 'up') {\n <i class=\"fa-solid fa-arrow-trend-up trend-up\"></i> <span class=\"trend-up\">Improving</span>\n } @else if (dir === 'down') {\n <i class=\"fa-solid fa-arrow-trend-down trend-down\"></i> <span class=\"trend-down\">Declining</span>\n } @else {\n <i class=\"fa-solid fa-minus trend-neutral\"></i> <span class=\"trend-neutral\">Stable</span>\n }\n }\n </div>\n }\n }\n </div>\n\n <!-- Run Volume -->\n <div class=\"card trend-card\">\n <h4><i class=\"fa-solid fa-layer-group\"></i> Run Volume</h4>\n @if (DisplayTrends$ | async; as trends) {\n @if (trends.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-chart-bar\"></i><span>No volume data</span></div>\n } @else {\n <div class=\"bar-chart\">\n @for (t of trends; track trackTrend($index, t)) {\n <div class=\"bar-row\">\n <span class=\"bar-label\">{{ FormatBucketDate(t.timestamp) }}</span>\n <div class=\"bar-track stacked\">\n <div class=\"bar-segment passed-seg\" [style.width.%]=\"SegmentPct(t, 'passed')\"></div>\n <div class=\"bar-segment failed-seg\" [style.width.%]=\"SegmentPct(t, 'failed')\"></div>\n <div class=\"bar-segment skipped-seg\" [style.width.%]=\"SegmentPct(t, 'skipped')\"></div>\n </div>\n <span class=\"bar-value\">{{ t.totalRuns }}</span>\n </div>\n }\n </div>\n <div class=\"legend-row\">\n <span class=\"legend-dot passed-seg\"></span> Passed\n <span class=\"legend-dot failed-seg\"></span> Failed\n <span class=\"legend-dot skipped-seg\"></span> Skipped\n </div>\n }\n }\n </div>\n\n <!-- Score Trend -->\n <div class=\"card trend-card\">\n <h4><i class=\"fa-solid fa-star-half-stroke\"></i> Score Trend</h4>\n @if (DisplayTrends$ | async; as trends) {\n @if (trends.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-star\"></i><span>No score data</span></div>\n } @else {\n <div class=\"bar-chart\">\n @for (t of trends; track trackTrend($index, t)) {\n <div class=\"bar-row\">\n <span class=\"bar-label\">{{ FormatBucketDate(t.timestamp) }}</span>\n <div class=\"bar-track\">\n <div class=\"bar-fill\" [class]=\"ScoreBarClass(t.averageScore)\" [style.width.%]=\"t.averageScore * 100\"></div>\n </div>\n <span class=\"bar-value\" [class]=\"ScoreTextClass(t.averageScore)\">{{ (t.averageScore * 100) | number:'1.0-0' }}%</span>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- Cost Trend -->\n <div class=\"card trend-card\">\n <h4><i class=\"fa-solid fa-dollar-sign\"></i> Cost Trend</h4>\n @if (DisplayTrends$ | async; as trends) {\n @if (trends.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-wallet\"></i><span>No cost data</span></div>\n } @else {\n <div class=\"bar-chart\">\n @for (t of trends; track trackTrend($index, t)) {\n <div class=\"bar-row\">\n <span class=\"bar-label\">{{ FormatBucketDate(t.timestamp) }}</span>\n <div class=\"bar-track\">\n <div class=\"bar-fill cost-bar\" [style.width.%]=\"CostBarPct(t, trends)\"></div>\n </div>\n <span class=\"bar-value\">\\${{ t.totalCost | number:'1.2-2' }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n\n <!-- ===== 3. Insights Section ===== -->\n <div class=\"section-title\">\n <i class=\"fa-solid fa-magnifying-glass-chart\"></i>\n Insights\n </div>\n <div class=\"insights-grid\">\n\n <!-- Top Failing Tests -->\n <div class=\"card insight-card\">\n <h4><i class=\"fa-solid fa-triangle-exclamation\"></i> Top Failing Tests</h4>\n @if (TopFailingTests$ | async; as tests) {\n @if (tests.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-circle-check\"></i><span>No failing tests</span></div>\n } @else {\n <div class=\"insight-list\">\n @for (t of tests; track t.testName) {\n <div class=\"insight-row\">\n <span class=\"insight-name\" [title]=\"t.testName\">{{ t.testName }}</span>\n <span class=\"badge-fail\">{{ t.failureCount }}</span>\n <span class=\"insight-secondary\">{{ t.failureRate | number:'1.0-1' }}%</span>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- Slowest Tests -->\n <div class=\"card insight-card\">\n <h4><i class=\"fa-solid fa-clock\"></i> Slowest Tests</h4>\n @if (SlowestTests$ | async; as tests) {\n @if (tests.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-bolt\"></i><span>No duration data</span></div>\n } @else {\n <div class=\"insight-list\">\n @for (t of tests; track t.testName) {\n <div class=\"insight-row\">\n <span class=\"insight-name\" [title]=\"t.testName\">{{ t.testName }}</span>\n <span class=\"insight-primary\">{{ FormatDuration(t.avgDuration) }}</span>\n <span class=\"insight-secondary\">max {{ FormatDuration(t.maxDuration) }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- Most Expensive Tests -->\n <div class=\"card insight-card\">\n <h4><i class=\"fa-solid fa-coins\"></i> Most Expensive Tests</h4>\n @if (MostExpensiveTests$ | async; as tests) {\n @if (tests.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-dollar-sign\"></i><span>No cost data</span></div>\n } @else {\n <div class=\"insight-list\">\n @for (t of tests; track t.testName) {\n <div class=\"insight-row\">\n <span class=\"insight-name\" [title]=\"t.testName\">{{ t.testName }}</span>\n <span class=\"insight-primary\">\\${{ t.totalCost | number:'1.2-2' }}</span>\n <span class=\"insight-secondary\">\\${{ t.avgCost | number:'1.4-4' }}/run</span>\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n\n <!-- ===== 4. Score Distribution ===== -->\n <div class=\"section-title\">\n <i class=\"fa-solid fa-chart-pie\"></i>\n Score Distribution\n </div>\n <div class=\"card distribution-card\">\n @if (ScoreDistribution$ | async; as buckets) {\n @if (buckets.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-chart-simple\"></i><span>No score data available</span></div>\n } @else {\n <div class=\"distribution-bars\">\n @for (b of buckets; track b.label) {\n <div class=\"dist-row\">\n <span class=\"dist-label\">{{ b.label }}</span>\n <div class=\"dist-track\">\n <div class=\"dist-fill\" [style.width.%]=\"b.percentage\" [style.background]=\"b.color\"></div>\n </div>\n <span class=\"dist-count\">{{ b.count }}</span>\n <span class=\"dist-pct\">{{ b.percentage | number:'1.0-1' }}%</span>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- ===== 5. Version Comparison ===== -->\n <div class=\"section-title\">\n <i class=\"fa-solid fa-code-compare\"></i>\n Version Comparison\n <span class=\"section-subtitle\">Compare metrics across different builds</span>\n </div>\n <div class=\"card version-card\">\n @if (IsLoadingVersions) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-spinner fa-spin\"></i><span>Loading versions...</span></div>\n } @else if (VersionRows.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-code-branch\"></i><span>No version data available</span></div>\n } @else {\n <div class=\"version-table-wrap\">\n <table class=\"version-table\">\n <thead>\n <tr>\n <th>Version</th>\n <th>Date</th>\n <th class=\"num\">Tests</th>\n <th class=\"num\">Pass Rate</th>\n <th class=\"num\">Cost</th>\n </tr>\n </thead>\n <tbody>\n @for (row of VersionRows; track row.version) {\n <tr>\n <td>\n <span class=\"version-label\">{{ row.gitCommitShort }}</span>\n <span class=\"version-agent\">{{ row.agentVersion }}</span>\n </td>\n <td>{{ row.date | date:'mediumDate' }}</td>\n <td class=\"num\">{{ row.totalTests }}</td>\n <td class=\"num\">\n <span>{{ row.passRate | number:'1.1-1' }}%</span>\n @if (row.passRateDelta !== null) {\n <span class=\"delta\" [class.delta-up]=\"row.passRateDelta > 0\" [class.delta-down]=\"row.passRateDelta < 0\" [class.delta-neutral]=\"row.passRateDelta === 0\">\n @if (row.passRateDelta > 0) {\n <i class=\"fa-solid fa-arrow-up\"></i>\n } @else if (row.passRateDelta < 0) {\n <i class=\"fa-solid fa-arrow-down\"></i>\n }\n {{ AbsNum(row.passRateDelta) | number:'1.1-1' }}%\n </span>\n }\n </td>\n <td class=\"num\">\n <span>\\${{ row.totalCost | number:'1.2-2' }}</span>\n @if (row.costDelta !== null) {\n <span class=\"delta\" [class.delta-up]=\"row.costDelta < 0\" [class.delta-down]=\"row.costDelta > 0\" [class.delta-neutral]=\"row.costDelta === 0\">\n @if (row.costDelta > 0) {\n <i class=\"fa-solid fa-arrow-up\"></i>\n } @else if (row.costDelta < 0) {\n <i class=\"fa-solid fa-arrow-down\"></i>\n }\n {{ AbsNum(row.costDelta) | number:'1.1-1' }}%\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n /* ------------------------------------------------------------------ */\n /* Layout & page */\n /* ------------------------------------------------------------------ */\n .testing-analytics {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n }\n\n /* ------------------------------------------------------------------ */\n /* Page header */\n /* ------------------------------------------------------------------ */\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 12px;\n background: var(--mj-bg-surface);\n padding: 20px 24px;\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n margin-bottom: 24px;\n }\n .header-left h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n }\n .header-left h2 i { color: var(--mj-brand-primary); }\n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n /* time-range pills */\n .time-range-pills {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n }\n .pill {\n padding: 6px 14px;\n border: none;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: transparent;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n .pill:hover { background: var(--mj-border-default); }\n .pill.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .refresh-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n .refresh-btn:hover { background: var(--mj-bg-surface-card); border-color: var(--mj-border-strong); }\n\n /* ------------------------------------------------------------------ */\n /* Section titles */\n /* ------------------------------------------------------------------ */\n .section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 14px;\n }\n .section-title i { color: var(--mj-brand-primary); }\n .section-subtitle {\n font-size: 12px;\n font-weight: 400;\n color: var(--mj-text-disabled);\n margin-left: 4px;\n }\n\n /* ------------------------------------------------------------------ */\n /* Cards */\n /* ------------------------------------------------------------------ */\n .card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n padding: 20px;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n .card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n .card h4 {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .card h4 i { color: var(--mj-brand-primary); font-size: 14px; }\n\n /* ------------------------------------------------------------------ */\n /* Trend grid (2 columns) */\n /* ------------------------------------------------------------------ */\n .trend-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n margin-bottom: 28px;\n }\n\n /* CSS bar charts */\n .bar-chart {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .bar-row {\n display: grid;\n grid-template-columns: 60px 1fr 52px;\n align-items: center;\n gap: 8px;\n }\n .bar-label {\n font-size: 10px;\n color: var(--mj-text-disabled);\n font-weight: 500;\n text-align: right;\n white-space: nowrap;\n }\n .bar-track {\n height: 14px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 7px;\n overflow: hidden;\n position: relative;\n }\n .bar-track.stacked {\n display: flex;\n }\n .bar-fill {\n height: 100%;\n border-radius: 7px;\n transition: width 0.4s ease;\n }\n .bar-value {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-align: right;\n }\n\n /* colour classes for bars */\n .pass-rate-bar {\n background: var(--mj-status-success);\n }\n .cost-bar {\n background: var(--mj-status-warning);\n }\n .score-excellent { background: var(--mj-status-success); }\n .score-good { background: var(--mj-brand-primary); }\n .score-fair { background: var(--mj-status-warning); }\n .score-poor { background: var(--mj-status-error); }\n\n /* text colour classes */\n .text-excellent { color: var(--mj-status-success); }\n .text-good { color: var(--mj-brand-primary); }\n .text-fair { color: var(--mj-status-warning); }\n .text-poor { color: var(--mj-status-error); }\n .text-pass-good { color: var(--mj-status-success); }\n .text-pass-warn { color: var(--mj-status-warning); }\n .text-pass-bad { color: var(--mj-status-error); }\n\n /* stacked segments */\n .bar-segment { height: 100%; transition: width 0.4s ease; }\n .passed-seg { background: var(--mj-status-success); }\n .failed-seg { background: var(--mj-status-error); }\n .skipped-seg { background: var(--mj-text-disabled); }\n\n .legend-row {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 8px;\n font-size: 10px;\n color: var(--mj-text-disabled);\n }\n .legend-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n display: inline-block;\n margin-left: 8px;\n }\n .legend-dot:first-child { margin-left: 0; }\n .legend-dot.passed-seg { background: var(--mj-status-success); }\n .legend-dot.failed-seg { background: var(--mj-status-error); }\n .legend-dot.skipped-seg { background: var(--mj-text-disabled); }\n\n .trend-direction {\n margin-top: 10px;\n font-size: 12px;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .trend-up { color: var(--mj-status-success); }\n .trend-down { color: var(--mj-status-error); }\n .trend-neutral { color: var(--mj-text-disabled); }\n\n /* ------------------------------------------------------------------ */\n /* Insights grid (3 columns) */\n /* ------------------------------------------------------------------ */\n .insights-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n margin-bottom: 28px;\n }\n\n .insight-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .insight-row {\n display: grid;\n grid-template-columns: 1fr auto auto;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n transition: background 0.15s ease;\n }\n .insight-row:hover { background: var(--mj-bg-surface-card); }\n .insight-name {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .badge-fail {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n font-size: 11px;\n font-weight: 700;\n padding: 2px 8px;\n border-radius: 10px;\n }\n .insight-primary {\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-brand-primary);\n }\n .insight-secondary {\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-disabled);\n }\n\n /* ------------------------------------------------------------------ */\n /* Score Distribution */\n /* ------------------------------------------------------------------ */\n .distribution-card {\n margin-bottom: 28px;\n }\n .distribution-bars {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .dist-row {\n display: grid;\n grid-template-columns: 110px 1fr 40px 50px;\n align-items: center;\n gap: 10px;\n }\n .dist-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n }\n .dist-track {\n height: 22px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n overflow: hidden;\n }\n .dist-fill {\n height: 100%;\n border-radius: 6px;\n transition: width 0.4s ease;\n }\n .dist-count {\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-primary);\n text-align: right;\n }\n .dist-pct {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-align: right;\n }\n\n /* ------------------------------------------------------------------ */\n /* Version Comparison */\n /* ------------------------------------------------------------------ */\n .version-card {\n margin-bottom: 28px;\n }\n .version-table-wrap {\n overflow-x: auto;\n }\n .version-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n .version-table th {\n text-align: left;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n padding: 10px 12px;\n border-bottom: 2px solid var(--mj-border-default);\n }\n .version-table th.num,\n .version-table td.num { text-align: right; }\n .version-table td {\n padding: 10px 12px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n vertical-align: middle;\n }\n .version-table tbody tr:hover { background: var(--mj-bg-surface-card); }\n .version-label {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-weight: 600;\n font-size: 12px;\n color: var(--mj-brand-primary);\n }\n .version-agent {\n display: block;\n font-size: 11px;\n color: var(--mj-text-disabled);\n margin-top: 2px;\n }\n\n .delta {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-size: 11px;\n font-weight: 600;\n margin-left: 6px;\n padding: 1px 6px;\n border-radius: 4px;\n }\n .delta i { font-size: 9px; }\n .delta-up { background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface)); color: var(--mj-status-success); }\n .delta-down { background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface)); color: var(--mj-status-error); }\n .delta-neutral { background: var(--mj-bg-surface-card); color: var(--mj-text-disabled); }\n\n /* ------------------------------------------------------------------ */\n /* Empty / mini empty states */\n /* ------------------------------------------------------------------ */\n .empty-mini {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 16px;\n color: var(--mj-border-strong);\n gap: 8px;\n }\n .empty-mini i { font-size: 28px; opacity: 0.5; }\n .empty-mini span { font-size: 12px; }\n\n /* ------------------------------------------------------------------ */\n /* Responsive */\n /* ------------------------------------------------------------------ */\n @media (max-width: 1100px) {\n .trend-grid { grid-template-columns: 1fr; }\n .insights-grid { grid-template-columns: 1fr 1fr; }\n }\n @media (max-width: 720px) {\n .page-header { flex-direction: column; align-items: flex-start; }\n .insights-grid { grid-template-columns: 1fr; }\n .dist-row { grid-template-columns: 80px 1fr 32px 42px; }\n }\n `]\n})\nexport class TestingAnalyticsComponent implements OnInit, OnDestroy {\n\n // ------- Inputs / Outputs -------\n @Input() initialState: Record<string, unknown> | null = null;\n @Output() stateChange = new EventEmitter<Record<string, unknown>>();\n\n // ------- Public state -------\n TimeRanges: TimeRangeOption[] = [\n { label: '7 Days', days: 7 },\n { label: '30 Days', days: 30 },\n { label: '90 Days', days: 90 }\n ];\n SelectedDays = 30;\n VersionRows: VersionRow[] = [];\n IsLoadingVersions = false;\n\n // ------- Observables -------\n DisplayTrends$!: Observable<TestTrendData[]>;\n PassRateTrendDirection$!: Observable<'up' | 'down' | 'stable'>;\n TopFailingTests$!: Observable<TestAnalytics['topFailingTests']>;\n SlowestTests$!: Observable<TestAnalytics['slowestTests']>;\n MostExpensiveTests$!: Observable<TestAnalytics['mostExpensiveTests']>;\n ScoreDistribution$!: Observable<ScoreDistributionBucket[]>;\n\n // ------- Private -------\n private destroy$ = new Subject<void>();\n private maxTrendRuns = 0; // cached for cost bar scaling\n\n constructor(\n private instrumentationService: TestingInstrumentationService,\n private cdr: ChangeDetectorRef\n ) {}\n\n // ===================================================================\n // Lifecycle\n // ===================================================================\n\n ngOnInit(): void {\n this.restoreState();\n this.setupObservables();\n this.loadVersionMetrics();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ===================================================================\n // Public methods (template-bound)\n // ===================================================================\n\n OnTimeRangeSelect(days: number): void {\n this.SelectedDays = days;\n const end = new Date();\n const start = new Date(end.getTime() - days * 24 * 60 * 60 * 1000);\n this.instrumentationService.setDateRange(start, end);\n this.loadVersionMetrics();\n this.emitState();\n }\n\n Refresh(): void {\n this.instrumentationService.refresh();\n this.loadVersionMetrics();\n }\n\n // -- Trend helpers (called from template) --\n\n PassRate(t: TestTrendData): number {\n return t.totalRuns === 0 ? 0 : (t.passed / t.totalRuns) * 100;\n }\n\n PassRateClass(t: TestTrendData): string {\n const rate = this.PassRate(t);\n if (rate >= 80) return 'text-pass-good';\n if (rate >= 60) return 'text-pass-warn';\n return 'text-pass-bad';\n }\n\n SegmentPct(t: TestTrendData, segment: 'passed' | 'failed' | 'skipped'): number {\n if (t.totalRuns === 0) return 0;\n const value = segment === 'passed' ? t.passed : segment === 'failed' ? t.failed : t.skipped;\n return (value / t.totalRuns) * 100;\n }\n\n ScoreBarClass(score: number): string {\n if (score >= 0.9) return 'bar-fill score-excellent';\n if (score >= 0.7) return 'bar-fill score-good';\n if (score >= 0.5) return 'bar-fill score-fair';\n return 'bar-fill score-poor';\n }\n\n ScoreTextClass(score: number): string {\n if (score >= 0.9) return 'text-excellent';\n if (score >= 0.7) return 'text-good';\n if (score >= 0.5) return 'text-fair';\n return 'text-poor';\n }\n\n CostBarPct(t: TestTrendData, all: TestTrendData[]): number {\n const maxCost = Math.max(...all.map(x => x.totalCost), 0.01);\n return (t.totalCost / maxCost) * 100;\n }\n\n FormatBucketDate(d: Date): string {\n const dt = d instanceof Date ? d : new Date(d);\n return `${dt.getMonth() + 1}/${dt.getDate()}`;\n }\n\n FormatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n if (m > 0) return `${m}m ${s % 60}s`;\n return `${s}s`;\n }\n\n AbsNum(n: number): number {\n return Math.abs(n);\n }\n\n /** trackBy for trend @for loops */\n trackTrend(index: number, t: TestTrendData): number {\n return index;\n }\n\n // ===================================================================\n // Private helpers\n // ===================================================================\n\n private restoreState(): void {\n if (this.initialState != null) {\n if (typeof this.initialState['selectedDays'] === 'number') {\n this.SelectedDays = this.initialState['selectedDays'] as number;\n }\n }\n // Apply initial date range\n const end = new Date();\n const start = new Date(end.getTime() - this.SelectedDays * 24 * 60 * 60 * 1000);\n this.instrumentationService.setDateRange(start, end);\n }\n\n private setupObservables(): void {\n // Limit trends to last 10 buckets for readability\n this.DisplayTrends$ = this.instrumentationService.trends$.pipe(\n map(trends => trends.slice(-10)),\n shareReplay(1)\n );\n\n this.PassRateTrendDirection$ = this.DisplayTrends$.pipe(\n map(trends => this.calculateTrendDirection(trends)),\n shareReplay(1)\n );\n\n const analytics$ = this.instrumentationService.analytics$;\n\n this.TopFailingTests$ = analytics$.pipe(\n map(a => a.topFailingTests.slice(0, 5)),\n shareReplay(1)\n );\n\n this.SlowestTests$ = analytics$.pipe(\n map(a => a.slowestTests.slice(0, 5)),\n shareReplay(1)\n );\n\n this.MostExpensiveTests$ = analytics$.pipe(\n map(a => a.mostExpensiveTests.slice(0, 5)),\n shareReplay(1)\n );\n\n this.ScoreDistribution$ = this.instrumentationService.testRuns$.pipe(\n map(runs => this.buildScoreDistribution(runs)),\n shareReplay(1)\n );\n }\n\n private calculateTrendDirection(trends: TestTrendData[]): 'up' | 'down' | 'stable' {\n if (trends.length < 2) return 'stable';\n const recentHalf = trends.slice(Math.floor(trends.length / 2));\n const olderHalf = trends.slice(0, Math.floor(trends.length / 2));\n\n const avgRecent = this.averagePassRate(recentHalf);\n const avgOlder = this.averagePassRate(olderHalf);\n const diff = avgRecent - avgOlder;\n\n if (diff > 2) return 'up';\n if (diff < -2) return 'down';\n return 'stable';\n }\n\n private averagePassRate(trends: TestTrendData[]): number {\n const withRuns = trends.filter(t => t.totalRuns > 0);\n if (withRuns.length === 0) return 0;\n return withRuns.reduce((s, t) => s + (t.passed / t.totalRuns) * 100, 0) / withRuns.length;\n }\n\n private buildScoreDistribution(runs: TestRunSummary[]): ScoreDistributionBucket[] {\n const defs: Array<{ label: string; color: string; min: number; max: number }> = [\n { label: 'Excellent (>=0.9)', color: '#43a047', min: 0.9, max: 1.01 },\n { label: 'Good (0.7-0.89)', color: '#1e88e5', min: 0.7, max: 0.9 },\n { label: 'Fair (0.5-0.69)', color: '#f57c00', min: 0.5, max: 0.7 },\n { label: 'Poor (0.3-0.49)', color: '#e64a19', min: 0.3, max: 0.5 },\n { label: 'Fail (<0.3)', color: '#e53935', min: 0, max: 0.3 }\n ];\n\n const total = runs.length || 1;\n\n return defs.map(d => {\n const count = runs.filter(r => r.score >= d.min && r.score < d.max).length;\n return {\n label: d.label,\n color: d.color,\n count,\n percentage: (count / total) * 100\n };\n });\n }\n\n private async loadVersionMetrics(): Promise<void> {\n this.IsLoadingVersions = true;\n this.cdr.markForCheck();\n\n try {\n const metrics = await this.instrumentationService.getVersionMetrics();\n this.VersionRows = this.buildVersionRows(metrics);\n } catch {\n this.VersionRows = [];\n } finally {\n this.IsLoadingVersions = false;\n this.cdr.markForCheck();\n }\n }\n\n private buildVersionRows(metrics: VersionMetrics[]): VersionRow[] {\n // metrics are already sorted newest-first by the service\n return metrics.map((m, i) => {\n const prev = i < metrics.length - 1 ? metrics[i + 1] : null;\n\n let passRateDelta: number | null = null;\n let costDelta: number | null = null;\n\n if (prev) {\n passRateDelta = m.passRate - prev.passRate;\n costDelta = prev.totalCost !== 0\n ? ((m.totalCost - prev.totalCost) / prev.totalCost) * 100\n : null;\n }\n\n return {\n version: m.version,\n gitCommitShort: m.gitCommit.length > 7 ? m.gitCommit.substring(0, 7) : m.gitCommit,\n agentVersion: m.agentVersion,\n date: m.runDate,\n totalTests: m.totalTests,\n passRate: m.passRate,\n totalCost: m.totalCost,\n passRateDelta,\n costDelta\n };\n });\n }\n\n private emitState(): void {\n this.stateChange.emit({\n selectedDays: this.SelectedDays\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"testing-analytics.component.js","sourceRoot":"","sources":["../../../src/Testing/components/testing-analytics.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, Input, Output, EventEmitter, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Observable, Subject, BehaviorSubject } from 'rxjs';\nimport { takeUntil, map, shareReplay } from 'rxjs/operators';\nimport {\n TestingInstrumentationService,\n TestTrendData,\n TestAnalytics,\n TestRunSummary,\n VersionMetrics\n} from '../services/testing-instrumentation.service';\n\n// ---------------------------------------------------------------------------\n// Local interfaces\n// ---------------------------------------------------------------------------\n\ninterface TimeRangeOption {\n label: string;\n days: number;\n}\n\ninterface ScoreDistributionBucket {\n label: string;\n color: string;\n count: number;\n percentage: number;\n}\n\ninterface VersionRow {\n version: string;\n gitCommitShort: string;\n agentVersion: string;\n date: Date;\n totalTests: number;\n passRate: number;\n totalCost: number;\n passRateDelta: number | null;\n costDelta: number | null;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n@Component({\n standalone: false,\n selector: 'app-testing-analytics',\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=\"Testing Analytics\"\n Icon=\"fa-solid fa-chart-bar\"\n Subtitle=\"Test trends, pass rates, and version metrics\">\n <div actions>\n @for (range of TimeRanges; track range.days) {\n <mj-filter-chip\n [Label]=\"range.label\"\n [Active]=\"SelectedDays === range.days\"\n (Clicked)=\"OnTimeRangeSelect(range.days)\">\n </mj-filter-chip>\n }\n <mj-refresh-button (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 <div class=\"testing-analytics\">\n\n <!-- ===== 2. Trend Overview (2-column CSS charts) ===== -->\n <div class=\"section-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Trend Overview\n </div>\n <div class=\"trend-grid\">\n\n <!-- Pass Rate Trend -->\n <div class=\"card trend-card\">\n <h4><i class=\"fa-solid fa-check-double\"></i> Pass Rate Trend</h4>\n @if (DisplayTrends$ | async; as trends) {\n @if (trends.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-chart-area\"></i><span>No trend data</span></div>\n } @else {\n <div class=\"bar-chart\">\n @for (t of trends; track trackTrend($index, t)) {\n <div class=\"bar-row\">\n <span class=\"bar-label\">{{ FormatBucketDate(t.timestamp) }}</span>\n <div class=\"bar-track\">\n <div class=\"bar-fill pass-rate-bar\" [style.width.%]=\"PassRate(t)\"></div>\n </div>\n <span class=\"bar-value\" [class]=\"PassRateClass(t)\">{{ PassRate(t) | number:'1.0-0' }}%</span>\n </div>\n }\n </div>\n <div class=\"trend-direction\">\n @if (PassRateTrendDirection$ | async; as dir) {\n @if (dir === 'up') {\n <i class=\"fa-solid fa-arrow-trend-up trend-up\"></i> <span class=\"trend-up\">Improving</span>\n } @else if (dir === 'down') {\n <i class=\"fa-solid fa-arrow-trend-down trend-down\"></i> <span class=\"trend-down\">Declining</span>\n } @else {\n <i class=\"fa-solid fa-minus trend-neutral\"></i> <span class=\"trend-neutral\">Stable</span>\n }\n }\n </div>\n }\n }\n </div>\n\n <!-- Run Volume -->\n <div class=\"card trend-card\">\n <h4><i class=\"fa-solid fa-layer-group\"></i> Run Volume</h4>\n @if (DisplayTrends$ | async; as trends) {\n @if (trends.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-chart-bar\"></i><span>No volume data</span></div>\n } @else {\n <div class=\"bar-chart\">\n @for (t of trends; track trackTrend($index, t)) {\n <div class=\"bar-row\">\n <span class=\"bar-label\">{{ FormatBucketDate(t.timestamp) }}</span>\n <div class=\"bar-track stacked\">\n <div class=\"bar-segment passed-seg\" [style.width.%]=\"SegmentPct(t, 'passed')\"></div>\n <div class=\"bar-segment failed-seg\" [style.width.%]=\"SegmentPct(t, 'failed')\"></div>\n <div class=\"bar-segment skipped-seg\" [style.width.%]=\"SegmentPct(t, 'skipped')\"></div>\n </div>\n <span class=\"bar-value\">{{ t.totalRuns }}</span>\n </div>\n }\n </div>\n <div class=\"legend-row\">\n <span class=\"legend-dot passed-seg\"></span> Passed\n <span class=\"legend-dot failed-seg\"></span> Failed\n <span class=\"legend-dot skipped-seg\"></span> Skipped\n </div>\n }\n }\n </div>\n\n <!-- Score Trend -->\n <div class=\"card trend-card\">\n <h4><i class=\"fa-solid fa-star-half-stroke\"></i> Score Trend</h4>\n @if (DisplayTrends$ | async; as trends) {\n @if (trends.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-star\"></i><span>No score data</span></div>\n } @else {\n <div class=\"bar-chart\">\n @for (t of trends; track trackTrend($index, t)) {\n <div class=\"bar-row\">\n <span class=\"bar-label\">{{ FormatBucketDate(t.timestamp) }}</span>\n <div class=\"bar-track\">\n <div class=\"bar-fill\" [class]=\"ScoreBarClass(t.averageScore)\" [style.width.%]=\"t.averageScore * 100\"></div>\n </div>\n <span class=\"bar-value\" [class]=\"ScoreTextClass(t.averageScore)\">{{ (t.averageScore * 100) | number:'1.0-0' }}%</span>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- Cost Trend -->\n <div class=\"card trend-card\">\n <h4><i class=\"fa-solid fa-dollar-sign\"></i> Cost Trend</h4>\n @if (DisplayTrends$ | async; as trends) {\n @if (trends.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-wallet\"></i><span>No cost data</span></div>\n } @else {\n <div class=\"bar-chart\">\n @for (t of trends; track trackTrend($index, t)) {\n <div class=\"bar-row\">\n <span class=\"bar-label\">{{ FormatBucketDate(t.timestamp) }}</span>\n <div class=\"bar-track\">\n <div class=\"bar-fill cost-bar\" [style.width.%]=\"CostBarPct(t, trends)\"></div>\n </div>\n <span class=\"bar-value\">\\${{ t.totalCost | number:'1.2-2' }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n\n <!-- ===== 3. Insights Section ===== -->\n <div class=\"section-title\">\n <i class=\"fa-solid fa-magnifying-glass-chart\"></i>\n Insights\n </div>\n <div class=\"insights-grid\">\n\n <!-- Top Failing Tests -->\n <div class=\"card insight-card\">\n <h4><i class=\"fa-solid fa-triangle-exclamation\"></i> Top Failing Tests</h4>\n @if (TopFailingTests$ | async; as tests) {\n @if (tests.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-circle-check\"></i><span>No failing tests</span></div>\n } @else {\n <div class=\"insight-list\">\n @for (t of tests; track t.testName) {\n <div class=\"insight-row\">\n <span class=\"insight-name\" [title]=\"t.testName\">{{ t.testName }}</span>\n <span class=\"badge-fail\">{{ t.failureCount }}</span>\n <span class=\"insight-secondary\">{{ t.failureRate | number:'1.0-1' }}%</span>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- Slowest Tests -->\n <div class=\"card insight-card\">\n <h4><i class=\"fa-solid fa-clock\"></i> Slowest Tests</h4>\n @if (SlowestTests$ | async; as tests) {\n @if (tests.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-bolt\"></i><span>No duration data</span></div>\n } @else {\n <div class=\"insight-list\">\n @for (t of tests; track t.testName) {\n <div class=\"insight-row\">\n <span class=\"insight-name\" [title]=\"t.testName\">{{ t.testName }}</span>\n <span class=\"insight-primary\">{{ FormatDuration(t.avgDuration) }}</span>\n <span class=\"insight-secondary\">max {{ FormatDuration(t.maxDuration) }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- Most Expensive Tests -->\n <div class=\"card insight-card\">\n <h4><i class=\"fa-solid fa-coins\"></i> Most Expensive Tests</h4>\n @if (MostExpensiveTests$ | async; as tests) {\n @if (tests.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-dollar-sign\"></i><span>No cost data</span></div>\n } @else {\n <div class=\"insight-list\">\n @for (t of tests; track t.testName) {\n <div class=\"insight-row\">\n <span class=\"insight-name\" [title]=\"t.testName\">{{ t.testName }}</span>\n <span class=\"insight-primary\">\\${{ t.totalCost | number:'1.2-2' }}</span>\n <span class=\"insight-secondary\">\\${{ t.avgCost | number:'1.4-4' }}/run</span>\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n\n <!-- ===== 4. Score Distribution ===== -->\n <div class=\"section-title\">\n <i class=\"fa-solid fa-chart-pie\"></i>\n Score Distribution\n </div>\n <div class=\"card distribution-card\">\n @if (ScoreDistribution$ | async; as buckets) {\n @if (buckets.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-chart-simple\"></i><span>No score data available</span></div>\n } @else {\n <div class=\"distribution-bars\">\n @for (b of buckets; track b.label) {\n <div class=\"dist-row\">\n <span class=\"dist-label\">{{ b.label }}</span>\n <div class=\"dist-track\">\n <div class=\"dist-fill\" [style.width.%]=\"b.percentage\" [style.background]=\"b.color\"></div>\n </div>\n <span class=\"dist-count\">{{ b.count }}</span>\n <span class=\"dist-pct\">{{ b.percentage | number:'1.0-1' }}%</span>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- ===== 5. Version Comparison ===== -->\n <div class=\"section-title\">\n <i class=\"fa-solid fa-code-compare\"></i>\n Version Comparison\n <span class=\"section-subtitle\">Compare metrics across different builds</span>\n </div>\n <div class=\"card version-card\">\n @if (IsLoadingVersions) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-spinner fa-spin\"></i><span>Loading versions...</span></div>\n } @else if (VersionRows.length === 0) {\n <div class=\"empty-mini\"><i class=\"fa-solid fa-code-branch\"></i><span>No version data available</span></div>\n } @else {\n <div class=\"version-table-wrap\">\n <table class=\"version-table\">\n <thead>\n <tr>\n <th>Version</th>\n <th>Date</th>\n <th class=\"num\">Tests</th>\n <th class=\"num\">Pass Rate</th>\n <th class=\"num\">Cost</th>\n </tr>\n </thead>\n <tbody>\n @for (row of VersionRows; track row.version) {\n <tr>\n <td>\n <span class=\"version-label\">{{ row.gitCommitShort }}</span>\n <span class=\"version-agent\">{{ row.agentVersion }}</span>\n </td>\n <td>{{ row.date | date:'mediumDate' }}</td>\n <td class=\"num\">{{ row.totalTests }}</td>\n <td class=\"num\">\n <span>{{ row.passRate | number:'1.1-1' }}%</span>\n @if (row.passRateDelta !== null) {\n <span class=\"delta\" [class.delta-up]=\"row.passRateDelta > 0\" [class.delta-down]=\"row.passRateDelta < 0\" [class.delta-neutral]=\"row.passRateDelta === 0\">\n @if (row.passRateDelta > 0) {\n <i class=\"fa-solid fa-arrow-up\"></i>\n } @else if (row.passRateDelta < 0) {\n <i class=\"fa-solid fa-arrow-down\"></i>\n }\n {{ AbsNum(row.passRateDelta) | number:'1.1-1' }}%\n </span>\n }\n </td>\n <td class=\"num\">\n <span>\\${{ row.totalCost | number:'1.2-2' }}</span>\n @if (row.costDelta !== null) {\n <span class=\"delta\" [class.delta-up]=\"row.costDelta < 0\" [class.delta-down]=\"row.costDelta > 0\" [class.delta-neutral]=\"row.costDelta === 0\">\n @if (row.costDelta > 0) {\n <i class=\"fa-solid fa-arrow-up\"></i>\n } @else if (row.costDelta < 0) {\n <i class=\"fa-solid fa-arrow-down\"></i>\n }\n {{ AbsNum(row.costDelta) | number:'1.1-1' }}%\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </div>\n </ng-template>\n `,\n styles: [`\n /* ------------------------------------------------------------------ */\n /* Layout & page */\n /* ------------------------------------------------------------------ */\n .testing-analytics {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n }\n\n /* ------------------------------------------------------------------ */\n /* Page header */\n /* ------------------------------------------------------------------ */\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 12px;\n background: var(--mj-bg-surface);\n padding: 20px 24px;\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n margin-bottom: 24px;\n }\n .header-left h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n }\n .header-left h2 i { color: var(--mj-brand-primary); }\n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n /* time-range pills */\n .time-range-pills {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n }\n .pill {\n padding: 6px 14px;\n border: none;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: transparent;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n .pill:hover { background: var(--mj-border-default); }\n .pill.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .refresh-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n .refresh-btn:hover { background: var(--mj-bg-surface-card); border-color: var(--mj-border-strong); }\n\n /* ------------------------------------------------------------------ */\n /* Section titles */\n /* ------------------------------------------------------------------ */\n .section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 14px;\n }\n .section-title i { color: var(--mj-brand-primary); }\n .section-subtitle {\n font-size: 12px;\n font-weight: 400;\n color: var(--mj-text-disabled);\n margin-left: 4px;\n }\n\n /* ------------------------------------------------------------------ */\n /* Cards */\n /* ------------------------------------------------------------------ */\n .card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n padding: 20px;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n .card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n .card h4 {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .card h4 i { color: var(--mj-brand-primary); font-size: 14px; }\n\n /* ------------------------------------------------------------------ */\n /* Trend grid (2 columns) */\n /* ------------------------------------------------------------------ */\n .trend-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n margin-bottom: 28px;\n }\n\n /* CSS bar charts */\n .bar-chart {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .bar-row {\n display: grid;\n grid-template-columns: 60px 1fr 52px;\n align-items: center;\n gap: 8px;\n }\n .bar-label {\n font-size: 10px;\n color: var(--mj-text-disabled);\n font-weight: 500;\n text-align: right;\n white-space: nowrap;\n }\n .bar-track {\n height: 14px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 7px;\n overflow: hidden;\n position: relative;\n }\n .bar-track.stacked {\n display: flex;\n }\n .bar-fill {\n height: 100%;\n border-radius: 7px;\n transition: width 0.4s ease;\n }\n .bar-value {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-align: right;\n }\n\n /* colour classes for bars */\n .pass-rate-bar {\n background: var(--mj-status-success);\n }\n .cost-bar {\n background: var(--mj-status-warning);\n }\n .score-excellent { background: var(--mj-status-success); }\n .score-good { background: var(--mj-brand-primary); }\n .score-fair { background: var(--mj-status-warning); }\n .score-poor { background: var(--mj-status-error); }\n\n /* text colour classes */\n .text-excellent { color: var(--mj-status-success); }\n .text-good { color: var(--mj-brand-primary); }\n .text-fair { color: var(--mj-status-warning); }\n .text-poor { color: var(--mj-status-error); }\n .text-pass-good { color: var(--mj-status-success); }\n .text-pass-warn { color: var(--mj-status-warning); }\n .text-pass-bad { color: var(--mj-status-error); }\n\n /* stacked segments */\n .bar-segment { height: 100%; transition: width 0.4s ease; }\n .passed-seg { background: var(--mj-status-success); }\n .failed-seg { background: var(--mj-status-error); }\n .skipped-seg { background: var(--mj-text-disabled); }\n\n .legend-row {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 8px;\n font-size: 10px;\n color: var(--mj-text-disabled);\n }\n .legend-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n display: inline-block;\n margin-left: 8px;\n }\n .legend-dot:first-child { margin-left: 0; }\n .legend-dot.passed-seg { background: var(--mj-status-success); }\n .legend-dot.failed-seg { background: var(--mj-status-error); }\n .legend-dot.skipped-seg { background: var(--mj-text-disabled); }\n\n .trend-direction {\n margin-top: 10px;\n font-size: 12px;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .trend-up { color: var(--mj-status-success); }\n .trend-down { color: var(--mj-status-error); }\n .trend-neutral { color: var(--mj-text-disabled); }\n\n /* ------------------------------------------------------------------ */\n /* Insights grid (3 columns) */\n /* ------------------------------------------------------------------ */\n .insights-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n margin-bottom: 28px;\n }\n\n .insight-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .insight-row {\n display: grid;\n grid-template-columns: 1fr auto auto;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n transition: background 0.15s ease;\n }\n .insight-row:hover { background: var(--mj-bg-surface-card); }\n .insight-name {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .badge-fail {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n font-size: 11px;\n font-weight: 700;\n padding: 2px 8px;\n border-radius: 10px;\n }\n .insight-primary {\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-brand-primary);\n }\n .insight-secondary {\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-disabled);\n }\n\n /* ------------------------------------------------------------------ */\n /* Score Distribution */\n /* ------------------------------------------------------------------ */\n .distribution-card {\n margin-bottom: 28px;\n }\n .distribution-bars {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .dist-row {\n display: grid;\n grid-template-columns: 110px 1fr 40px 50px;\n align-items: center;\n gap: 10px;\n }\n .dist-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n }\n .dist-track {\n height: 22px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n overflow: hidden;\n }\n .dist-fill {\n height: 100%;\n border-radius: 6px;\n transition: width 0.4s ease;\n }\n .dist-count {\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-primary);\n text-align: right;\n }\n .dist-pct {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-align: right;\n }\n\n /* ------------------------------------------------------------------ */\n /* Version Comparison */\n /* ------------------------------------------------------------------ */\n .version-card {\n margin-bottom: 28px;\n }\n .version-table-wrap {\n overflow-x: auto;\n }\n .version-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n .version-table th {\n text-align: left;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n padding: 10px 12px;\n border-bottom: 2px solid var(--mj-border-default);\n }\n .version-table th.num,\n .version-table td.num { text-align: right; }\n .version-table td {\n padding: 10px 12px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n vertical-align: middle;\n }\n .version-table tbody tr:hover { background: var(--mj-bg-surface-card); }\n .version-label {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-weight: 600;\n font-size: 12px;\n color: var(--mj-brand-primary);\n }\n .version-agent {\n display: block;\n font-size: 11px;\n color: var(--mj-text-disabled);\n margin-top: 2px;\n }\n\n .delta {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-size: 11px;\n font-weight: 600;\n margin-left: 6px;\n padding: 1px 6px;\n border-radius: 4px;\n }\n .delta i { font-size: 9px; }\n .delta-up { background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface)); color: var(--mj-status-success); }\n .delta-down { background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface)); color: var(--mj-status-error); }\n .delta-neutral { background: var(--mj-bg-surface-card); color: var(--mj-text-disabled); }\n\n /* ------------------------------------------------------------------ */\n /* Empty / mini empty states */\n /* ------------------------------------------------------------------ */\n .empty-mini {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 16px;\n color: var(--mj-border-strong);\n gap: 8px;\n }\n .empty-mini i { font-size: 28px; opacity: 0.5; }\n .empty-mini span { font-size: 12px; }\n\n /* ------------------------------------------------------------------ */\n /* Responsive */\n /* ------------------------------------------------------------------ */\n @media (max-width: 1100px) {\n .trend-grid { grid-template-columns: 1fr; }\n .insights-grid { grid-template-columns: 1fr 1fr; }\n }\n @media (max-width: 720px) {\n .page-header { flex-direction: column; align-items: flex-start; }\n .insights-grid { grid-template-columns: 1fr; }\n .dist-row { grid-template-columns: 80px 1fr 32px 42px; }\n }\n `]\n})\nexport class TestingAnalyticsComponent implements OnInit, OnDestroy {\n\n // ------- Inputs / Outputs -------\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 // ------- Public state -------\n TimeRanges: TimeRangeOption[] = [\n { label: '7 Days', days: 7 },\n { label: '30 Days', days: 30 },\n { label: '90 Days', days: 90 }\n ];\n SelectedDays = 30;\n VersionRows: VersionRow[] = [];\n IsLoadingVersions = false;\n\n // ------- Observables -------\n DisplayTrends$!: Observable<TestTrendData[]>;\n PassRateTrendDirection$!: Observable<'up' | 'down' | 'stable'>;\n TopFailingTests$!: Observable<TestAnalytics['topFailingTests']>;\n SlowestTests$!: Observable<TestAnalytics['slowestTests']>;\n MostExpensiveTests$!: Observable<TestAnalytics['mostExpensiveTests']>;\n ScoreDistribution$!: Observable<ScoreDistributionBucket[]>;\n\n // ------- Private -------\n private destroy$ = new Subject<void>();\n private maxTrendRuns = 0; // cached for cost bar scaling\n\n constructor(\n private instrumentationService: TestingInstrumentationService,\n private cdr: ChangeDetectorRef\n ) {}\n\n // ===================================================================\n // Lifecycle\n // ===================================================================\n\n ngOnInit(): void {\n this.restoreState();\n this.setupObservables();\n this.loadVersionMetrics();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ===================================================================\n // Public methods (template-bound)\n // ===================================================================\n\n OnTimeRangeSelect(days: number): void {\n this.SelectedDays = days;\n const end = new Date();\n const start = new Date(end.getTime() - days * 24 * 60 * 60 * 1000);\n this.instrumentationService.setDateRange(start, end);\n this.loadVersionMetrics();\n this.emitState();\n }\n\n Refresh(): void {\n this.instrumentationService.refresh();\n this.loadVersionMetrics();\n }\n\n // -- Trend helpers (called from template) --\n\n PassRate(t: TestTrendData): number {\n return t.totalRuns === 0 ? 0 : (t.passed / t.totalRuns) * 100;\n }\n\n PassRateClass(t: TestTrendData): string {\n const rate = this.PassRate(t);\n if (rate >= 80) return 'text-pass-good';\n if (rate >= 60) return 'text-pass-warn';\n return 'text-pass-bad';\n }\n\n SegmentPct(t: TestTrendData, segment: 'passed' | 'failed' | 'skipped'): number {\n if (t.totalRuns === 0) return 0;\n const value = segment === 'passed' ? t.passed : segment === 'failed' ? t.failed : t.skipped;\n return (value / t.totalRuns) * 100;\n }\n\n ScoreBarClass(score: number): string {\n if (score >= 0.9) return 'bar-fill score-excellent';\n if (score >= 0.7) return 'bar-fill score-good';\n if (score >= 0.5) return 'bar-fill score-fair';\n return 'bar-fill score-poor';\n }\n\n ScoreTextClass(score: number): string {\n if (score >= 0.9) return 'text-excellent';\n if (score >= 0.7) return 'text-good';\n if (score >= 0.5) return 'text-fair';\n return 'text-poor';\n }\n\n CostBarPct(t: TestTrendData, all: TestTrendData[]): number {\n const maxCost = Math.max(...all.map(x => x.totalCost), 0.01);\n return (t.totalCost / maxCost) * 100;\n }\n\n FormatBucketDate(d: Date): string {\n const dt = d instanceof Date ? d : new Date(d);\n return `${dt.getMonth() + 1}/${dt.getDate()}`;\n }\n\n FormatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n if (m > 0) return `${m}m ${s % 60}s`;\n return `${s}s`;\n }\n\n AbsNum(n: number): number {\n return Math.abs(n);\n }\n\n /** trackBy for trend @for loops */\n trackTrend(index: number, t: TestTrendData): number {\n return index;\n }\n\n // ===================================================================\n // Private helpers\n // ===================================================================\n\n private restoreState(): void {\n if (this.initialState != null) {\n if (typeof this.initialState['selectedDays'] === 'number') {\n this.SelectedDays = this.initialState['selectedDays'] as number;\n }\n }\n // Apply initial date range\n const end = new Date();\n const start = new Date(end.getTime() - this.SelectedDays * 24 * 60 * 60 * 1000);\n this.instrumentationService.setDateRange(start, end);\n }\n\n private setupObservables(): void {\n // Limit trends to last 10 buckets for readability\n this.DisplayTrends$ = this.instrumentationService.trends$.pipe(\n map(trends => trends.slice(-10)),\n shareReplay(1)\n );\n\n this.PassRateTrendDirection$ = this.DisplayTrends$.pipe(\n map(trends => this.calculateTrendDirection(trends)),\n shareReplay(1)\n );\n\n const analytics$ = this.instrumentationService.analytics$;\n\n this.TopFailingTests$ = analytics$.pipe(\n map(a => a.topFailingTests.slice(0, 5)),\n shareReplay(1)\n );\n\n this.SlowestTests$ = analytics$.pipe(\n map(a => a.slowestTests.slice(0, 5)),\n shareReplay(1)\n );\n\n this.MostExpensiveTests$ = analytics$.pipe(\n map(a => a.mostExpensiveTests.slice(0, 5)),\n shareReplay(1)\n );\n\n this.ScoreDistribution$ = this.instrumentationService.testRuns$.pipe(\n map(runs => this.buildScoreDistribution(runs)),\n shareReplay(1)\n );\n }\n\n private calculateTrendDirection(trends: TestTrendData[]): 'up' | 'down' | 'stable' {\n if (trends.length < 2) return 'stable';\n const recentHalf = trends.slice(Math.floor(trends.length / 2));\n const olderHalf = trends.slice(0, Math.floor(trends.length / 2));\n\n const avgRecent = this.averagePassRate(recentHalf);\n const avgOlder = this.averagePassRate(olderHalf);\n const diff = avgRecent - avgOlder;\n\n if (diff > 2) return 'up';\n if (diff < -2) return 'down';\n return 'stable';\n }\n\n private averagePassRate(trends: TestTrendData[]): number {\n const withRuns = trends.filter(t => t.totalRuns > 0);\n if (withRuns.length === 0) return 0;\n return withRuns.reduce((s, t) => s + (t.passed / t.totalRuns) * 100, 0) / withRuns.length;\n }\n\n private buildScoreDistribution(runs: TestRunSummary[]): ScoreDistributionBucket[] {\n const defs: Array<{ label: string; color: string; min: number; max: number }> = [\n { label: 'Excellent (>=0.9)', color: '#43a047', min: 0.9, max: 1.01 },\n { label: 'Good (0.7-0.89)', color: '#1e88e5', min: 0.7, max: 0.9 },\n { label: 'Fair (0.5-0.69)', color: '#f57c00', min: 0.5, max: 0.7 },\n { label: 'Poor (0.3-0.49)', color: '#e64a19', min: 0.3, max: 0.5 },\n { label: 'Fail (<0.3)', color: '#e53935', min: 0, max: 0.3 }\n ];\n\n const total = runs.length || 1;\n\n return defs.map(d => {\n const count = runs.filter(r => r.score >= d.min && r.score < d.max).length;\n return {\n label: d.label,\n color: d.color,\n count,\n percentage: (count / total) * 100\n };\n });\n }\n\n private async loadVersionMetrics(): Promise<void> {\n this.IsLoadingVersions = true;\n this.cdr.markForCheck();\n\n try {\n const metrics = await this.instrumentationService.getVersionMetrics();\n this.VersionRows = this.buildVersionRows(metrics);\n } catch {\n this.VersionRows = [];\n } finally {\n this.IsLoadingVersions = false;\n this.cdr.markForCheck();\n }\n }\n\n private buildVersionRows(metrics: VersionMetrics[]): VersionRow[] {\n // metrics are already sorted newest-first by the service\n return metrics.map((m, i) => {\n const prev = i < metrics.length - 1 ? metrics[i + 1] : null;\n\n let passRateDelta: number | null = null;\n let costDelta: number | null = null;\n\n if (prev) {\n passRateDelta = m.passRate - prev.passRate;\n costDelta = prev.totalCost !== 0\n ? ((m.totalCost - prev.totalCost) / prev.totalCost) * 100\n : null;\n }\n\n return {\n version: m.version,\n gitCommitShort: m.gitCommit.length > 7 ? m.gitCommit.substring(0, 7) : m.gitCommit,\n agentVersion: m.agentVersion,\n date: m.runDate,\n totalTests: m.totalTests,\n passRate: m.passRate,\n totalCost: m.totalCost,\n passRateDelta,\n costDelta\n };\n });\n }\n\n private emitState(): void {\n this.stateChange.emit({\n selectedDays: this.SelectedDays\n });\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 Dashboard Tab Resource
|
|
8
|
+
* Testing Dashboard Tab 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 TestingDashboardTabResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {
|
|
11
12
|
testingDialogService: TestingDialogService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing-dashboard-tab-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Testing/components/testing-dashboard-tab-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-dashboard-tab-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Testing/components/testing-dashboard-tab-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,oCAAqC,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAIjG,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,oCAAoC;2CAApC,oCAAoC;CAuChD"}
|
|
@@ -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-dashboard-tab.component";
|
|
16
|
-
function
|
|
16
|
+
function TestingDashboardTabResourceComponent_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 TestingDashboardTabResourceComponent_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 TestingDashboardTabResourceComponent_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 TestingDashboardTabResourceComponent_Conditional_2_Template(rf, ctx) {
|
|
|
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 Dashboard Tab Resource
|
|
30
|
+
* Testing Dashboard Tab 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 TestingDashboardTabResourceComponent = class TestingDashboardTabResourceComponent extends BaseResourceComponent {
|
|
33
34
|
testingDialogService;
|
|
@@ -61,15 +62,13 @@ let TestingDashboardTabResourceComponent = class TestingDashboardTabResourceComp
|
|
|
61
62
|
return 'fa-solid fa-gauge-high';
|
|
62
63
|
}
|
|
63
64
|
static ɵfac = function TestingDashboardTabResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TestingDashboardTabResourceComponent)(i0.ɵɵdirectiveInject(i1.TestingDialogService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
64
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestingDashboardTabResourceComponent, selectors: [["mj-testing-dashboard-tab-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
65
|
-
i0.ɵɵ
|
|
66
|
-
i0.ɵɵ
|
|
67
|
-
i0.ɵɵelementEnd();
|
|
68
|
-
i0.ɵɵconditionalCreate(2, TestingDashboardTabResourceComponent_Conditional_2_Template, 2, 6, "mj-slide-panel", 1);
|
|
65
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestingDashboardTabResourceComponent, selectors: [["mj-testing-dashboard-tab-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 TestingDashboardTabResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
66
|
+
i0.ɵɵelement(0, "app-testing-dashboard-tab");
|
|
67
|
+
i0.ɵɵconditionalCreate(1, TestingDashboardTabResourceComponent_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.TestingDashboardTabComponent], styles: ["
|
|
69
|
+
i0.ɵɵadvance();
|
|
70
|
+
i0.ɵɵconditional(ctx.testingDialogService.IsPanelOpen ? 1 : -1);
|
|
71
|
+
} }, dependencies: [i1.TestRunDialogComponent, i2.MjSlidePanelComponent, i3.TestingDashboardTabComponent], styles: ["[_nghost-%COMP%] { display: block; width: 100%; height: 100%; }"], changeDetection: 0 });
|
|
73
72
|
};
|
|
74
73
|
TestingDashboardTabResourceComponent = __decorate([
|
|
75
74
|
RegisterClass(BaseResourceComponent, 'TestingDashboardTabResource')
|
|
@@ -78,9 +77,7 @@ export { TestingDashboardTabResourceComponent };
|
|
|
78
77
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TestingDashboardTabResourceComponent, [{
|
|
79
78
|
type: Component,
|
|
80
79
|
args: [{ standalone: false, selector: 'mj-testing-dashboard-tab-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
81
|
-
<
|
|
82
|
-
<app-testing-dashboard-tab></app-testing-dashboard-tab>
|
|
83
|
-
</div>
|
|
80
|
+
<app-testing-dashboard-tab></app-testing-dashboard-tab>
|
|
84
81
|
|
|
85
82
|
<!-- Slide Panel for Test Execution -->
|
|
86
83
|
@if (testingDialogService.IsPanelOpen) {
|
|
@@ -98,7 +95,7 @@ export { TestingDashboardTabResourceComponent };
|
|
|
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(TestingDashboardTabResourceComponent, { className: "TestingDashboardTabResourceComponent", filePath: "src/Testing/components/testing-dashboard-tab-resource.component.ts", lineNumber:
|
|
100
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestingDashboardTabResourceComponent, { className: "TestingDashboardTabResourceComponent", filePath: "src/Testing/components/testing-dashboard-tab-resource.component.ts", lineNumber: 40 }); })();
|
|
104
101
|
//# sourceMappingURL=testing-dashboard-tab-resource.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing-dashboard-tab-resource.component.js","sourceRoot":"","sources":["../../../src/Testing/components/testing-dashboard-tab-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-dashboard-tab-resource.component.js","sourceRoot":"","sources":["../../../src/Testing/components/testing-dashboard-tab-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,kNAAU,sBAAe,KAAC;IAC1B,8CAKiC;IAA/B,+NAAc,sBAAe,KAAC;IAElC,AADE,iBAAsB,EACP;;;IATf,AADA,mKAAmF,mBACjE;IAGhB,cAAkB;IAGlB,AADA,AADA,AADA,gCAAkB,uIACkD,yIACE,gIACT;;AAvBvE;;;GAGG;AA4BI,IAAM,oCAAoC,GAA1C,MAAM,oCAAqC,SAAQ,qBAAqB;IAIpE;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,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QAC3C,OAAO,wBAAwB,CAAC;IAClC,CAAC;8HAtCU,oCAAoC;6DAApC,oCAAoC;YArB7C,4CAAuD;YAGvD,iHAAwC;;YAAxC,cAcC;YAdD,+DAcC;;;AAIQ,oCAAoC;IA3BhD,aAAa,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;GA2BvD,oCAAoC,CAuChD;;iFAvCY,oCAAoC;cA1BhD,SAAS;6BACI,KAAK,YACP,mCAAmC,mBAC5B,uBAAuB,CAAC,MAAM,YACrC;;;;;;;;;;;;;;;;;;;GAmBT;;kFAGU,oCAAoC","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 Dashboard Tab 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, 'TestingDashboardTabResource')\n@Component({\n standalone: false,\n selector: 'mj-testing-dashboard-tab-resource',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <app-testing-dashboard-tab></app-testing-dashboard-tab>\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 TestingDashboardTabResourceComponent 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 'Overview';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-gauge-high';\n }\n}\n"]}
|
|
@@ -20,6 +20,8 @@ export declare class TestingDashboardTabComponent implements OnInit, OnDestroy {
|
|
|
20
20
|
private testingDialogService;
|
|
21
21
|
private cdr;
|
|
22
22
|
initialState: Record<string, unknown> | null;
|
|
23
|
+
/** When true, the inner bespoke .page-header is hidden — the parent shell owns the chrome. */
|
|
24
|
+
HideToolbar: boolean;
|
|
23
25
|
stateChange: EventEmitter<Record<string, unknown>>;
|
|
24
26
|
private destroy$;
|
|
25
27
|
/** Resolved data for the template */
|
|
@@ -59,7 +61,7 @@ export declare class TestingDashboardTabComponent implements OnInit, OnDestroy {
|
|
|
59
61
|
private flattenAndSort;
|
|
60
62
|
private collectNodes;
|
|
61
63
|
static ɵfac: i0.ɵɵFactoryDeclaration<TestingDashboardTabComponent, never>;
|
|
62
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TestingDashboardTabComponent, "app-testing-dashboard-tab", never, { "initialState": { "alias": "initialState"; "required": false; }; }, { "stateChange": "stateChange"; }, never, never, false, never>;
|
|
64
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TestingDashboardTabComponent, "app-testing-dashboard-tab", never, { "initialState": { "alias": "initialState"; "required": false; }; "HideToolbar": { "alias": "HideToolbar"; "required": false; }; }, { "stateChange": "stateChange"; }, never, never, false, never>;
|
|
63
65
|
}
|
|
64
66
|
export {};
|
|
65
67
|
//# sourceMappingURL=testing-dashboard-tab.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing-dashboard-tab.component.d.ts","sourceRoot":"","sources":["../../../src/Testing/components/testing-dashboard-tab.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACM,MAAM,EAAE,SAAS,EAAiB,YAAY,EACzD,iBAAiB,EAClB,MAAM,eAAe,CAAC;AAKvB,OAAO,EACL,6BAA6B,EAE7B,cAAc,EACd,kBAAkB,EACnB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,gDAAgD,CAAC;AAE7E,OAAO,EAAE,uBAAuB,EAAa,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;;AAEtG,gDAAgD;AAChD,KAAK,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvF,wCAAwC;AACxC,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,GAAG,WAAW,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,IAAI,CAAC;CACnB;AAED,
|
|
1
|
+
{"version":3,"file":"testing-dashboard-tab.component.d.ts","sourceRoot":"","sources":["../../../src/Testing/components/testing-dashboard-tab.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACM,MAAM,EAAE,SAAS,EAAiB,YAAY,EACzD,iBAAiB,EAClB,MAAM,eAAe,CAAC;AAKvB,OAAO,EACL,6BAA6B,EAE7B,cAAc,EACd,kBAAkB,EACnB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,gDAAgD,CAAC;AAE7E,OAAO,EAAE,uBAAuB,EAAa,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;;AAEtG,gDAAgD;AAChD,KAAK,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvF,wCAAwC;AACxC,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,GAAG,WAAW,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,IAAI,CAAC;CACnB;AAED,qBAujBa,4BAA6B,YAAW,MAAM,EAAE,SAAS;IAoBlE,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,GAAG;IArBJ,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAQ;IAC7D,8FAA8F;IACrF,WAAW,UAAS;IACnB,WAAW,wCAA+C;IAEpE,OAAO,CAAC,QAAQ,CAAuB;IAEvC,qCAAqC;IACrC,SAAS,UAAS;IAClB,QAAQ,EAAE,WAAW,EAAE,CAAM;IAC7B,YAAY,EAAE,cAAc,EAAE,CAAM;IACpC,UAAU,EAAE,cAAc,EAAE,CAAM;IAClC,YAAY,EAAE,kBAAkB,EAAE,CAAM;IACxC,MAAM,EAAE,SAAS,EAAE,CAAM;IAEzB,OAAO,CAAC,aAAa,CAAgC;gBAG3C,sBAAsB,EAAE,6BAA6B,EACrD,gBAAgB,EAAE,uBAAuB,EACzC,oBAAoB,EAAE,oBAAoB,EAC1C,GAAG,EAAE,iBAAiB;IAO1B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,WAAW,IAAI,IAAI;IASnB,SAAS,IAAI,IAAI;IAIjB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAI5C,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAI5C,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAOxC,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAOpC,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAOnC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IASlC,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAenC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIhC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAUtC,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,aAAa;IAkDrB,OAAO,CAAC,WAAW;IAoBnB,qDAAqD;IACrD,OAAO,CAAC,iBAAiB;IAmCzB,uCAAuC;IACvC,OAAO,CAAC,eAAe;IAiBvB,6DAA6D;IAC7D,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,YAAY;yCApTT,4BAA4B;2CAA5B,4BAA4B;CA4TxC"}
|