@memberjunction/ng-dashboards 5.0.0 → 5.2.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.
Files changed (285) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +12 -12
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +1 -1
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.d.ts +4 -4
  6. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  7. package/dist/AI/components/agents/agent-editor.component.js +1 -1
  8. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  9. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +3 -3
  10. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  11. package/dist/AI/components/agents/agent-filter-panel.component.js +1 -1
  12. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  13. package/dist/AI/components/charts/performance-heatmap.component.js +1 -1
  14. package/dist/AI/components/charts/time-series-chart.component.js +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +1 -1
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/models/model-management.component.d.ts +5 -5
  18. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  19. package/dist/AI/components/models/model-management.component.js +2 -2
  20. package/dist/AI/components/models/model-management.component.js.map +1 -1
  21. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +7 -7
  22. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  23. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +1 -1
  24. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  25. package/dist/AI/components/prompts/prompt-filter-panel.component.js +1 -1
  26. package/dist/AI/components/prompts/prompt-management.component.d.ts +4 -4
  27. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  28. package/dist/AI/components/prompts/prompt-management.component.js +2 -2
  29. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  30. package/dist/AI/components/prompts/prompt-version-control.component.d.ts +6 -6
  31. package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
  32. package/dist/AI/components/prompts/prompt-version-control.component.js +1 -1
  33. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  34. package/dist/AI/components/system/system-config-filter-panel.component.js +1 -1
  35. package/dist/AI/components/system/system-configuration.component.d.ts +4 -4
  36. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  37. package/dist/AI/components/system/system-configuration.component.js +1 -1
  38. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  39. package/dist/AI/components/widgets/kpi-card.component.js +1 -1
  40. package/dist/AI/components/widgets/live-execution-widget.component.js +1 -1
  41. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  42. package/dist/APIKeys/api-applications-panel.component.js +1 -1
  43. package/dist/APIKeys/api-key-create-dialog.component.js +1 -1
  44. package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
  45. package/dist/APIKeys/api-key-list.component.js +1 -1
  46. package/dist/APIKeys/api-keys-resource.component.js +1 -1
  47. package/dist/APIKeys/api-scopes-panel.component.js +1 -1
  48. package/dist/APIKeys/api-usage-panel.component.js +1 -1
  49. package/dist/Actions/components/actions-list-view.component.js +1 -1
  50. package/dist/Actions/components/actions-overview.component.js +1 -1
  51. package/dist/Actions/components/categories-list-view.component.js +1 -1
  52. package/dist/Actions/components/code-management.component.js +1 -1
  53. package/dist/Actions/components/entity-integration.component.js +1 -1
  54. package/dist/Actions/components/execution-monitoring.component.js +1 -1
  55. package/dist/Actions/components/executions-list-view.component.js +1 -1
  56. package/dist/Actions/components/explorer/action-breadcrumb.component.js +1 -1
  57. package/dist/Actions/components/explorer/action-card.component.d.ts +5 -5
  58. package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
  59. package/dist/Actions/components/explorer/action-card.component.js +1 -1
  60. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  61. package/dist/Actions/components/explorer/action-explorer.component.d.ts +6 -6
  62. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  63. package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
  64. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  65. package/dist/Actions/components/explorer/action-list-item.component.d.ts +5 -5
  66. package/dist/Actions/components/explorer/action-list-item.component.d.ts.map +1 -1
  67. package/dist/Actions/components/explorer/action-list-item.component.js +1 -1
  68. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  69. package/dist/Actions/components/explorer/action-toolbar.component.js +1 -1
  70. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts +2 -2
  71. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts.map +1 -1
  72. package/dist/Actions/components/explorer/action-tree-panel.component.js +1 -1
  73. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
  74. package/dist/Actions/components/explorer/new-action-panel.component.js +1 -1
  75. package/dist/Actions/components/explorer/new-category-panel.component.js +1 -1
  76. package/dist/Actions/components/scheduled-actions.component.js +1 -1
  77. package/dist/Actions/components/security-permissions.component.js +1 -1
  78. package/dist/Communication/communication-dashboard.component.js +1 -1
  79. package/dist/Communication/communication-logs-resource.component.js +1 -1
  80. package/dist/Communication/communication-monitor-resource.component.js +1 -1
  81. package/dist/Communication/communication-providers-resource.component.js +1 -1
  82. package/dist/Communication/communication-runs-resource.component.js +1 -1
  83. package/dist/Communication/communication-templates-resource.component.js +1 -1
  84. package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -1
  85. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +1 -1
  86. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -1
  87. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +1 -1
  88. package/dist/ComponentStudio/components/browser/component-browser.component.js +1 -1
  89. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +1 -1
  90. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +1 -1
  91. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +1 -1
  92. package/dist/ComponentStudio/components/editors/spec-editor.component.js +1 -1
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +1 -1
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +1 -1
  95. package/dist/ComponentStudio/components/text-import-dialog.component.js +1 -1
  96. package/dist/ComponentStudio/components/workspace/component-preview.component.js +1 -1
  97. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +1 -1
  98. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +3 -3
  99. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
  100. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
  101. package/dist/Credentials/components/credentials-audit-resource.component.js +1 -1
  102. package/dist/Credentials/components/credentials-categories-resource.component.js +1 -1
  103. package/dist/Credentials/components/credentials-list-resource.component.js +1 -1
  104. package/dist/Credentials/components/credentials-overview-resource.component.js +1 -1
  105. package/dist/Credentials/components/credentials-types-resource.component.js +1 -1
  106. package/dist/Credentials/credentials-dashboard.component.js +1 -1
  107. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +4 -0
  108. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  109. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +17 -1
  110. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  111. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +1 -1
  112. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +1 -1
  113. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +1 -1
  114. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +4 -4
  115. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  116. package/dist/DataExplorer/components/view-selector/view-selector.component.js +1 -1
  117. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  118. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +2 -2
  119. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  120. package/dist/DataExplorer/data-explorer-dashboard.component.js +1 -1
  121. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  122. package/dist/DataExplorer/data-explorer-resource.component.js +1 -1
  123. package/dist/EntityAdmin/entity-admin-dashboard.component.js +1 -1
  124. package/dist/Home/home-dashboard.component.js +1 -1
  125. package/dist/Lists/components/lists-browse-resource.component.js +1 -1
  126. package/dist/Lists/components/lists-categories-resource.component.js +1 -1
  127. package/dist/Lists/components/lists-my-lists-resource.component.js +1 -1
  128. package/dist/Lists/components/lists-operations-resource.component.js +1 -1
  129. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +1 -1
  130. package/dist/MCP/components/mcp-connection-dialog.component.js +1 -1
  131. package/dist/MCP/components/mcp-log-detail-panel.component.js +1 -1
  132. package/dist/MCP/components/mcp-server-dialog.component.js +1 -1
  133. package/dist/MCP/components/mcp-test-tool-dialog.component.js +1 -1
  134. package/dist/MCP/mcp-dashboard.component.js +1 -1
  135. package/dist/MCP/mcp-filter-panel.component.js +1 -1
  136. package/dist/MCP/mcp-resource.component.js +1 -1
  137. package/dist/QueryBrowser/query-browser-resource.component.d.ts +22 -2
  138. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  139. package/dist/QueryBrowser/query-browser-resource.component.js +147 -63
  140. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  141. package/dist/Scheduling/components/job-slideout.component.js +1 -1
  142. package/dist/Scheduling/components/scheduling-activity-resource.component.js +1 -1
  143. package/dist/Scheduling/components/scheduling-activity.component.js +1 -1
  144. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +1 -1
  145. package/dist/Scheduling/components/scheduling-jobs.component.js +1 -1
  146. package/dist/Scheduling/components/scheduling-overview-resource.component.js +1 -1
  147. package/dist/Scheduling/components/scheduling-overview.component.js +1 -1
  148. package/dist/Scheduling/scheduling-dashboard.component.js +1 -1
  149. package/dist/SystemDiagnostics/system-diagnostics.component.js +1 -1
  150. package/dist/Testing/components/testing-analytics-resource.component.js +1 -1
  151. package/dist/Testing/components/testing-analytics.component.js +1 -1
  152. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  153. package/dist/Testing/components/testing-dashboard-tab.component.js +1 -1
  154. package/dist/Testing/components/testing-explorer-resource.component.js +1 -1
  155. package/dist/Testing/components/testing-explorer.component.js +1 -1
  156. package/dist/Testing/components/testing-review-resource.component.js +1 -1
  157. package/dist/Testing/components/testing-review.component.js +1 -1
  158. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  159. package/dist/Testing/components/testing-runs.component.js +1 -1
  160. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +1 -1
  161. package/dist/Testing/components/widgets/suite-tree.component.js +2 -2
  162. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +1 -1
  163. package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
  164. package/dist/Testing/testing-dashboard.component.js +1 -1
  165. package/dist/VersionHistory/components/diff-resource.component.js +1 -1
  166. package/dist/VersionHistory/components/graph-resource.component.js +1 -1
  167. package/dist/VersionHistory/components/labels-resource.component.js +1 -1
  168. package/dist/VersionHistory/components/restore-resource.component.js +1 -1
  169. package/package.json +38 -38
  170. package/dist/AI/ai-dashboard.component.d.ts +0 -62
  171. package/dist/AI/ai-dashboard.component.d.ts.map +0 -1
  172. package/dist/AI/ai-dashboard.component.js +0 -338
  173. package/dist/AI/ai-dashboard.component.js.map +0 -1
  174. package/dist/AI/components/models/model-management-v2.component.d.ts +0 -96
  175. package/dist/AI/components/models/model-management-v2.component.d.ts.map +0 -1
  176. package/dist/AI/components/models/model-management-v2.component.js +0 -981
  177. package/dist/AI/components/models/model-management-v2.component.js.map +0 -1
  178. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +0 -97
  179. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +0 -1
  180. package/dist/AI/components/prompts/prompt-management-v2.component.js +0 -811
  181. package/dist/AI/components/prompts/prompt-management-v2.component.js.map +0 -1
  182. package/dist/Actions/actions-management-dashboard.component.d.ts +0 -52
  183. package/dist/Actions/actions-management-dashboard.component.d.ts.map +0 -1
  184. package/dist/Actions/actions-management-dashboard.component.js +0 -308
  185. package/dist/Actions/actions-management-dashboard.component.js.map +0 -1
  186. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts +0 -44
  187. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts.map +0 -1
  188. package/dist/Credentials/components/credential-category-edit-panel.component.js +0 -456
  189. package/dist/Credentials/components/credential-category-edit-panel.component.js.map +0 -1
  190. package/dist/Credentials/components/credential-edit-panel.component.d.ts +0 -70
  191. package/dist/Credentials/components/credential-edit-panel.component.d.ts.map +0 -1
  192. package/dist/Credentials/components/credential-edit-panel.component.js +0 -694
  193. package/dist/Credentials/components/credential-edit-panel.component.js.map +0 -1
  194. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts +0 -56
  195. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts.map +0 -1
  196. package/dist/Credentials/components/credential-type-edit-panel.component.js +0 -563
  197. package/dist/Credentials/components/credential-type-edit-panel.component.js.map +0 -1
  198. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts +0 -245
  199. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +0 -1
  200. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +0 -1143
  201. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +0 -1
  202. package/dist/EntityAdmin/components/entity-details.component.d.ts +0 -50
  203. package/dist/EntityAdmin/components/entity-details.component.d.ts.map +0 -1
  204. package/dist/EntityAdmin/components/entity-details.component.js +0 -680
  205. package/dist/EntityAdmin/components/entity-details.component.js.map +0 -1
  206. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts +0 -31
  207. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts.map +0 -1
  208. package/dist/EntityAdmin/components/entity-filter-panel.component.js +0 -160
  209. package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +0 -1
  210. package/dist/EntityAdmin/components/erd-composite.component.d.ts +0 -73
  211. package/dist/EntityAdmin/components/erd-composite.component.d.ts.map +0 -1
  212. package/dist/EntityAdmin/components/erd-composite.component.js +0 -271
  213. package/dist/EntityAdmin/components/erd-composite.component.js.map +0 -1
  214. package/dist/EntityAdmin/components/erd-diagram.component.d.ts +0 -47
  215. package/dist/EntityAdmin/components/erd-diagram.component.d.ts.map +0 -1
  216. package/dist/EntityAdmin/components/erd-diagram.component.js +0 -618
  217. package/dist/EntityAdmin/components/erd-diagram.component.js.map +0 -1
  218. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts +0 -20
  219. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts.map +0 -1
  220. package/dist/Scheduling/components/scheduling-health-resource.component.js +0 -55
  221. package/dist/Scheduling/components/scheduling-health-resource.component.js.map +0 -1
  222. package/dist/Scheduling/components/scheduling-health.component.d.ts +0 -30
  223. package/dist/Scheduling/components/scheduling-health.component.d.ts.map +0 -1
  224. package/dist/Scheduling/components/scheduling-health.component.js +0 -315
  225. package/dist/Scheduling/components/scheduling-health.component.js.map +0 -1
  226. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts +0 -20
  227. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts.map +0 -1
  228. package/dist/Scheduling/components/scheduling-history-resource.component.js +0 -55
  229. package/dist/Scheduling/components/scheduling-history-resource.component.js.map +0 -1
  230. package/dist/Scheduling/components/scheduling-history.component.d.ts +0 -48
  231. package/dist/Scheduling/components/scheduling-history.component.d.ts.map +0 -1
  232. package/dist/Scheduling/components/scheduling-history.component.js +0 -377
  233. package/dist/Scheduling/components/scheduling-history.component.js.map +0 -1
  234. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts +0 -20
  235. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts.map +0 -1
  236. package/dist/Scheduling/components/scheduling-monitor-resource.component.js +0 -55
  237. package/dist/Scheduling/components/scheduling-monitor-resource.component.js.map +0 -1
  238. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts +0 -37
  239. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts.map +0 -1
  240. package/dist/Scheduling/components/scheduling-monitoring.component.js +0 -488
  241. package/dist/Scheduling/components/scheduling-monitoring.component.js.map +0 -1
  242. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts +0 -20
  243. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts.map +0 -1
  244. package/dist/Scheduling/components/scheduling-types-resource.component.js +0 -55
  245. package/dist/Scheduling/components/scheduling-types-resource.component.js.map +0 -1
  246. package/dist/Scheduling/components/scheduling-types.component.d.ts +0 -22
  247. package/dist/Scheduling/components/scheduling-types.component.d.ts.map +0 -1
  248. package/dist/Scheduling/components/scheduling-types.component.js +0 -165
  249. package/dist/Scheduling/components/scheduling-types.component.js.map +0 -1
  250. package/dist/Testing/components/testing-execution-resource.component.d.ts +0 -20
  251. package/dist/Testing/components/testing-execution-resource.component.d.ts.map +0 -1
  252. package/dist/Testing/components/testing-execution-resource.component.js +0 -55
  253. package/dist/Testing/components/testing-execution-resource.component.js.map +0 -1
  254. package/dist/Testing/components/testing-execution.component.d.ts +0 -71
  255. package/dist/Testing/components/testing-execution.component.d.ts.map +0 -1
  256. package/dist/Testing/components/testing-execution.component.js +0 -845
  257. package/dist/Testing/components/testing-execution.component.js.map +0 -1
  258. package/dist/Testing/components/testing-feedback-resource.component.d.ts +0 -20
  259. package/dist/Testing/components/testing-feedback-resource.component.d.ts.map +0 -1
  260. package/dist/Testing/components/testing-feedback-resource.component.js +0 -55
  261. package/dist/Testing/components/testing-feedback-resource.component.js.map +0 -1
  262. package/dist/Testing/components/testing-feedback.component.d.ts +0 -111
  263. package/dist/Testing/components/testing-feedback.component.d.ts.map +0 -1
  264. package/dist/Testing/components/testing-feedback.component.js +0 -1486
  265. package/dist/Testing/components/testing-feedback.component.js.map +0 -1
  266. package/dist/Testing/components/testing-overview-resource.component.d.ts +0 -20
  267. package/dist/Testing/components/testing-overview-resource.component.d.ts.map +0 -1
  268. package/dist/Testing/components/testing-overview-resource.component.js +0 -55
  269. package/dist/Testing/components/testing-overview-resource.component.js.map +0 -1
  270. package/dist/Testing/components/testing-overview.component.d.ts +0 -30
  271. package/dist/Testing/components/testing-overview.component.d.ts.map +0 -1
  272. package/dist/Testing/components/testing-overview.component.js +0 -361
  273. package/dist/Testing/components/testing-overview.component.js.map +0 -1
  274. package/dist/Testing/components/testing-version-comparison.component.d.ts +0 -62
  275. package/dist/Testing/components/testing-version-comparison.component.d.ts.map +0 -1
  276. package/dist/Testing/components/testing-version-comparison.component.js +0 -815
  277. package/dist/Testing/components/testing-version-comparison.component.js.map +0 -1
  278. package/dist/Testing/components/testing-version-resource.component.d.ts +0 -20
  279. package/dist/Testing/components/testing-version-resource.component.d.ts.map +0 -1
  280. package/dist/Testing/components/testing-version-resource.component.js +0 -55
  281. package/dist/Testing/components/testing-version-resource.component.js.map +0 -1
  282. package/dist/generic/base-dashboard.d.ts +0 -65
  283. package/dist/generic/base-dashboard.d.ts.map +0 -1
  284. package/dist/generic/base-dashboard.js +0 -74
  285. package/dist/generic/base-dashboard.js.map +0 -1
@@ -1,815 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
2
- import { Subject, combineLatest, of, BehaviorSubject } from 'rxjs';
3
- import { takeUntil, map, shareReplay, switchMap } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../services/testing-instrumentation.service";
6
- import * as i2 from "@angular/forms";
7
- import * as i3 from "@angular/common";
8
- const _forTrack0 = ($index, $item) => $item.version;
9
- const _forTrack1 = ($index, $item) => $item.testName;
10
- const _c0 = () => [];
11
- function TestingVersionComparisonComponent_For_18_Template(rf, ctx) { if (rf & 1) {
12
- i0.ɵɵelementStart(0, "option", 11);
13
- i0.ɵɵtext(1);
14
- i0.ɵɵelementEnd();
15
- } if (rf & 2) {
16
- const version_r1 = ctx.$implicit;
17
- i0.ɵɵproperty("value", version_r1.version);
18
- i0.ɵɵadvance();
19
- i0.ɵɵtextInterpolate2("", version_r1.version, " (", version_r1.totalTests, " tests)");
20
- } }
21
- function TestingVersionComparisonComponent_For_29_Template(rf, ctx) { if (rf & 1) {
22
- i0.ɵɵelementStart(0, "option", 11);
23
- i0.ɵɵtext(1);
24
- i0.ɵɵelementEnd();
25
- } if (rf & 2) {
26
- const version_r2 = ctx.$implicit;
27
- i0.ɵɵproperty("value", version_r2.version);
28
- i0.ɵɵadvance();
29
- i0.ɵɵtextInterpolate2("", version_r2.version, " (", version_r2.totalTests, " tests)");
30
- } }
31
- function TestingVersionComparisonComponent_Conditional_31_For_69_Conditional_26_Template(rf, ctx) { if (rf & 1) {
32
- i0.ɵɵelementStart(0, "span", 58);
33
- i0.ɵɵelement(1, "i", 61);
34
- i0.ɵɵtext(2, " Regression ");
35
- i0.ɵɵelementEnd();
36
- } }
37
- function TestingVersionComparisonComponent_Conditional_31_For_69_Conditional_27_Template(rf, ctx) { if (rf & 1) {
38
- i0.ɵɵelementStart(0, "span", 59);
39
- i0.ɵɵelement(1, "i", 62);
40
- i0.ɵɵtext(2, " Improved ");
41
- i0.ɵɵelementEnd();
42
- } }
43
- function TestingVersionComparisonComponent_Conditional_31_For_69_Conditional_28_Template(rf, ctx) { if (rf & 1) {
44
- i0.ɵɵelementStart(0, "span", 60);
45
- i0.ɵɵelement(1, "i", 63);
46
- i0.ɵɵtext(2, " Unchanged ");
47
- i0.ɵɵelementEnd();
48
- } }
49
- function TestingVersionComparisonComponent_Conditional_31_For_69_Template(rf, ctx) { if (rf & 1) {
50
- i0.ɵɵelementStart(0, "div", 49)(1, "div", 50)(2, "span", 51);
51
- i0.ɵɵtext(3);
52
- i0.ɵɵelementEnd()();
53
- i0.ɵɵelementStart(4, "div", 52)(5, "div", 53)(6, "span", 48);
54
- i0.ɵɵtext(7);
55
- i0.ɵɵelementEnd();
56
- i0.ɵɵelementStart(8, "span", 54);
57
- i0.ɵɵtext(9);
58
- i0.ɵɵelementEnd()()();
59
- i0.ɵɵelementStart(10, "div", 52)(11, "div", 53)(12, "span", 48);
60
- i0.ɵɵtext(13);
61
- i0.ɵɵelementEnd();
62
- i0.ɵɵelementStart(14, "span", 54);
63
- i0.ɵɵtext(15);
64
- i0.ɵɵelementEnd()()();
65
- i0.ɵɵelementStart(16, "div", 55)(17, "span", 56);
66
- i0.ɵɵtext(18);
67
- i0.ɵɵelementEnd()();
68
- i0.ɵɵelementStart(19, "div", 55)(20, "span", 56);
69
- i0.ɵɵtext(21);
70
- i0.ɵɵelementEnd()();
71
- i0.ɵɵelementStart(22, "div", 55)(23, "span", 56);
72
- i0.ɵɵtext(24);
73
- i0.ɵɵelementEnd()();
74
- i0.ɵɵelementStart(25, "div", 57);
75
- i0.ɵɵtemplate(26, TestingVersionComparisonComponent_Conditional_31_For_69_Conditional_26_Template, 3, 0, "span", 58)(27, TestingVersionComparisonComponent_Conditional_31_For_69_Conditional_27_Template, 3, 0, "span", 59)(28, TestingVersionComparisonComponent_Conditional_31_For_69_Conditional_28_Template, 3, 0, "span", 60);
76
- i0.ɵɵelementEnd()();
77
- } if (rf & 2) {
78
- const comparison_r5 = ctx.$implicit;
79
- i0.ɵɵclassProp("regression", comparison_r5.regression)("improvement", comparison_r5.improvement);
80
- i0.ɵɵadvance(3);
81
- i0.ɵɵtextInterpolate(comparison_r5.testName);
82
- i0.ɵɵadvance(4);
83
- i0.ɵɵtextInterpolate(comparison_r5.versionA.avgScore.toFixed(4));
84
- i0.ɵɵadvance(2);
85
- i0.ɵɵtextInterpolate2("", comparison_r5.versionA.passRate.toFixed(0), "% pass \u2022 ", comparison_r5.versionA.runCount, " runs");
86
- i0.ɵɵadvance(4);
87
- i0.ɵɵtextInterpolate(comparison_r5.versionB.avgScore.toFixed(4));
88
- i0.ɵɵadvance(2);
89
- i0.ɵɵtextInterpolate2("", comparison_r5.versionB.passRate.toFixed(0), "% pass \u2022 ", comparison_r5.versionB.runCount, " runs");
90
- i0.ɵɵadvance(2);
91
- i0.ɵɵclassProp("positive", comparison_r5.scoreDelta > 0)("negative", comparison_r5.scoreDelta < 0);
92
- i0.ɵɵadvance();
93
- i0.ɵɵtextInterpolate2(" ", comparison_r5.scoreDelta > 0 ? "+" : "", "", (comparison_r5.scoreDelta * 100).toFixed(1), "% ");
94
- i0.ɵɵadvance(2);
95
- i0.ɵɵclassProp("positive", comparison_r5.costDelta < 0)("negative", comparison_r5.costDelta > 0);
96
- i0.ɵɵadvance();
97
- i0.ɵɵtextInterpolate2(" ", comparison_r5.costDelta > 0 ? "+" : "", "", (comparison_r5.costDelta * 100).toFixed(1), "% ");
98
- i0.ɵɵadvance(2);
99
- i0.ɵɵclassProp("positive", comparison_r5.durationDelta < 0)("negative", comparison_r5.durationDelta > 0);
100
- i0.ɵɵadvance();
101
- i0.ɵɵtextInterpolate2(" ", comparison_r5.durationDelta > 0 ? "+" : "", "", (comparison_r5.durationDelta * 100).toFixed(1), "% ");
102
- i0.ɵɵadvance(2);
103
- i0.ɵɵconditional(comparison_r5.regression ? 26 : comparison_r5.improvement ? 27 : 28);
104
- } }
105
- function TestingVersionComparisonComponent_Conditional_31_ForEmpty_70_Template(rf, ctx) { if (rf & 1) {
106
- i0.ɵɵelementStart(0, "div", 42);
107
- i0.ɵɵelement(1, "i", 64);
108
- i0.ɵɵelementStart(2, "p");
109
- i0.ɵɵtext(3, "No test data available for comparison");
110
- i0.ɵɵelementEnd()();
111
- } }
112
- function TestingVersionComparisonComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
113
- const _r3 = i0.ɵɵgetCurrentView();
114
- i0.ɵɵelementStart(0, "div", 15)(1, "div", 16)(2, "div", 17);
115
- i0.ɵɵelement(3, "i", 18);
116
- i0.ɵɵelementEnd();
117
- i0.ɵɵelementStart(4, "div", 19)(5, "div", 20);
118
- i0.ɵɵtext(6);
119
- i0.ɵɵpipe(7, "async");
120
- i0.ɵɵelementEnd();
121
- i0.ɵɵelementStart(8, "div", 21);
122
- i0.ɵɵtext(9, "Regressions Detected");
123
- i0.ɵɵelementEnd()()();
124
- i0.ɵɵelementStart(10, "div", 16)(11, "div", 22);
125
- i0.ɵɵelement(12, "i", 23);
126
- i0.ɵɵelementEnd();
127
- i0.ɵɵelementStart(13, "div", 19)(14, "div", 20);
128
- i0.ɵɵtext(15);
129
- i0.ɵɵpipe(16, "async");
130
- i0.ɵɵelementEnd();
131
- i0.ɵɵelementStart(17, "div", 21);
132
- i0.ɵɵtext(18, "Improvements");
133
- i0.ɵɵelementEnd()()();
134
- i0.ɵɵelementStart(19, "div", 16)(20, "div", 24);
135
- i0.ɵɵelement(21, "i", 25);
136
- i0.ɵɵelementEnd();
137
- i0.ɵɵelementStart(22, "div", 19)(23, "div", 20);
138
- i0.ɵɵtext(24);
139
- i0.ɵɵpipe(25, "async");
140
- i0.ɵɵelementEnd();
141
- i0.ɵɵelementStart(26, "div", 21);
142
- i0.ɵɵtext(27, "Unchanged");
143
- i0.ɵɵelementEnd()()();
144
- i0.ɵɵelementStart(28, "div", 16)(29, "div", 26);
145
- i0.ɵɵelement(30, "i", 27);
146
- i0.ɵɵelementEnd();
147
- i0.ɵɵelementStart(31, "div", 19)(32, "div", 20);
148
- i0.ɵɵtext(33);
149
- i0.ɵɵpipe(34, "async");
150
- i0.ɵɵpipe(35, "number");
151
- i0.ɵɵelementEnd();
152
- i0.ɵɵelementStart(36, "div", 21);
153
- i0.ɵɵtext(37, "Cost Change");
154
- i0.ɵɵelementEnd()()()();
155
- i0.ɵɵelementStart(38, "div", 28)(39, "button", 29);
156
- i0.ɵɵlistener("click", function TestingVersionComparisonComponent_Conditional_31_Template_button_click_39_listener() { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.setFilter("all")); });
157
- i0.ɵɵelement(40, "i", 30);
158
- i0.ɵɵtext(41, " All Tests ");
159
- i0.ɵɵelementEnd();
160
- i0.ɵɵelementStart(42, "button", 31);
161
- i0.ɵɵlistener("click", function TestingVersionComparisonComponent_Conditional_31_Template_button_click_42_listener() { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.setFilter("regressions")); });
162
- i0.ɵɵelement(43, "i", 18);
163
- i0.ɵɵtext(44, " Regressions Only ");
164
- i0.ɵɵelementEnd();
165
- i0.ɵɵelementStart(45, "button", 32);
166
- i0.ɵɵlistener("click", function TestingVersionComparisonComponent_Conditional_31_Template_button_click_45_listener() { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.setFilter("improvements")); });
167
- i0.ɵɵelement(46, "i", 23);
168
- i0.ɵɵtext(47, " Improvements Only ");
169
- i0.ɵɵelementEnd();
170
- i0.ɵɵelementStart(48, "button", 33);
171
- i0.ɵɵlistener("click", function TestingVersionComparisonComponent_Conditional_31_Template_button_click_48_listener() { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.setFilter("unchanged")); });
172
- i0.ɵɵelement(49, "i", 25);
173
- i0.ɵɵtext(50, " Unchanged ");
174
- i0.ɵɵelementEnd()();
175
- i0.ɵɵelementStart(51, "div", 34)(52, "div", 35)(53, "div", 36)(54, "div", 37);
176
- i0.ɵɵtext(55, "Test Name");
177
- i0.ɵɵelementEnd();
178
- i0.ɵɵelementStart(56, "div", 38);
179
- i0.ɵɵtext(57);
180
- i0.ɵɵelementEnd();
181
- i0.ɵɵelementStart(58, "div", 38);
182
- i0.ɵɵtext(59);
183
- i0.ɵɵelementEnd();
184
- i0.ɵɵelementStart(60, "div", 39);
185
- i0.ɵɵtext(61, "Score \u0394");
186
- i0.ɵɵelementEnd();
187
- i0.ɵɵelementStart(62, "div", 39);
188
- i0.ɵɵtext(63, "Cost \u0394");
189
- i0.ɵɵelementEnd();
190
- i0.ɵɵelementStart(64, "div", 39);
191
- i0.ɵɵtext(65, "Duration \u0394");
192
- i0.ɵɵelementEnd();
193
- i0.ɵɵelementStart(66, "div", 40);
194
- i0.ɵɵtext(67, "Status");
195
- i0.ɵɵelementEnd()();
196
- i0.ɵɵrepeaterCreate(68, TestingVersionComparisonComponent_Conditional_31_For_69_Template, 29, 30, "div", 41, _forTrack1, false, TestingVersionComparisonComponent_Conditional_31_ForEmpty_70_Template, 4, 0, "div", 42);
197
- i0.ɵɵpipe(71, "async");
198
- i0.ɵɵelementEnd()();
199
- i0.ɵɵelementStart(72, "div", 43)(73, "div", 44)(74, "h3");
200
- i0.ɵɵtext(75);
201
- i0.ɵɵelementEnd();
202
- i0.ɵɵelementStart(76, "div", 45)(77, "div", 46)(78, "span", 47);
203
- i0.ɵɵtext(79, "Avg Score");
204
- i0.ɵɵelementEnd();
205
- i0.ɵɵelementStart(80, "span", 48);
206
- i0.ɵɵtext(81);
207
- i0.ɵɵpipe(82, "async");
208
- i0.ɵɵelementEnd()();
209
- i0.ɵɵelementStart(83, "div", 46)(84, "span", 47);
210
- i0.ɵɵtext(85, "Pass Rate");
211
- i0.ɵɵelementEnd();
212
- i0.ɵɵelementStart(86, "span", 48);
213
- i0.ɵɵtext(87);
214
- i0.ɵɵpipe(88, "async");
215
- i0.ɵɵelementEnd()();
216
- i0.ɵɵelementStart(89, "div", 46)(90, "span", 47);
217
- i0.ɵɵtext(91, "Total Cost");
218
- i0.ɵɵelementEnd();
219
- i0.ɵɵelementStart(92, "span", 48);
220
- i0.ɵɵtext(93);
221
- i0.ɵɵpipe(94, "async");
222
- i0.ɵɵelementEnd()();
223
- i0.ɵɵelementStart(95, "div", 46)(96, "span", 47);
224
- i0.ɵɵtext(97, "Avg Duration");
225
- i0.ɵɵelementEnd();
226
- i0.ɵɵelementStart(98, "span", 48);
227
- i0.ɵɵtext(99);
228
- i0.ɵɵpipe(100, "async");
229
- i0.ɵɵelementEnd()()()();
230
- i0.ɵɵelementStart(101, "div", 44)(102, "h3");
231
- i0.ɵɵtext(103);
232
- i0.ɵɵelementEnd();
233
- i0.ɵɵelementStart(104, "div", 45)(105, "div", 46)(106, "span", 47);
234
- i0.ɵɵtext(107, "Avg Score");
235
- i0.ɵɵelementEnd();
236
- i0.ɵɵelementStart(108, "span", 48);
237
- i0.ɵɵtext(109);
238
- i0.ɵɵpipe(110, "async");
239
- i0.ɵɵelementEnd()();
240
- i0.ɵɵelementStart(111, "div", 46)(112, "span", 47);
241
- i0.ɵɵtext(113, "Pass Rate");
242
- i0.ɵɵelementEnd();
243
- i0.ɵɵelementStart(114, "span", 48);
244
- i0.ɵɵtext(115);
245
- i0.ɵɵpipe(116, "async");
246
- i0.ɵɵelementEnd()();
247
- i0.ɵɵelementStart(117, "div", 46)(118, "span", 47);
248
- i0.ɵɵtext(119, "Total Cost");
249
- i0.ɵɵelementEnd();
250
- i0.ɵɵelementStart(120, "span", 48);
251
- i0.ɵɵtext(121);
252
- i0.ɵɵpipe(122, "async");
253
- i0.ɵɵelementEnd()();
254
- i0.ɵɵelementStart(123, "div", 46)(124, "span", 47);
255
- i0.ɵɵtext(125, "Avg Duration");
256
- i0.ɵɵelementEnd();
257
- i0.ɵɵelementStart(126, "span", 48);
258
- i0.ɵɵtext(127);
259
- i0.ɵɵpipe(128, "async");
260
- i0.ɵɵelementEnd()()()()();
261
- } if (rf & 2) {
262
- let tmp_11_0;
263
- let tmp_13_0;
264
- let tmp_14_0;
265
- let tmp_15_0;
266
- let tmp_16_0;
267
- let tmp_18_0;
268
- let tmp_19_0;
269
- let tmp_20_0;
270
- let tmp_21_0;
271
- const ctx_r3 = i0.ɵɵnextContext();
272
- i0.ɵɵadvance(6);
273
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(7, 25, ctx_r3.regressionCount$) || 0);
274
- i0.ɵɵadvance(9);
275
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(16, 27, ctx_r3.improvementCount$) || 0);
276
- i0.ɵɵadvance(9);
277
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(25, 29, ctx_r3.unchangedCount$) || 0);
278
- i0.ɵɵadvance(9);
279
- i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(35, 33, i0.ɵɵpipeBind1(34, 31, ctx_r3.totalCostDelta$) || 0, "1.2-2"), "%");
280
- i0.ɵɵadvance(6);
281
- i0.ɵɵclassProp("active", ctx_r3.filter === "all");
282
- i0.ɵɵadvance(3);
283
- i0.ɵɵclassProp("active", ctx_r3.filter === "regressions");
284
- i0.ɵɵadvance(3);
285
- i0.ɵɵclassProp("active", ctx_r3.filter === "improvements");
286
- i0.ɵɵadvance(3);
287
- i0.ɵɵclassProp("active", ctx_r3.filter === "unchanged");
288
- i0.ɵɵadvance(9);
289
- i0.ɵɵtextInterpolate(ctx_r3.versionA);
290
- i0.ɵɵadvance(2);
291
- i0.ɵɵtextInterpolate(ctx_r3.versionB);
292
- i0.ɵɵadvance(9);
293
- i0.ɵɵrepeater((tmp_11_0 = i0.ɵɵpipeBind1(71, 36, ctx_r3.filteredComparisons$)) !== null && tmp_11_0 !== undefined ? tmp_11_0 : i0.ɵɵpureFunction0(54, _c0));
294
- i0.ɵɵadvance(7);
295
- i0.ɵɵtextInterpolate1("", ctx_r3.versionA, " Metrics");
296
- i0.ɵɵadvance(6);
297
- i0.ɵɵtextInterpolate(((tmp_13_0 = i0.ɵɵpipeBind1(82, 38, ctx_r3.versionAMetrics$)) == null ? null : tmp_13_0.averageScore.toFixed(4)) || "0.0000");
298
- i0.ɵɵadvance(6);
299
- i0.ɵɵtextInterpolate1("", ((tmp_14_0 = i0.ɵɵpipeBind1(88, 40, ctx_r3.versionAMetrics$)) == null ? null : tmp_14_0.passRate.toFixed(1)) || "0.0", "%");
300
- i0.ɵɵadvance(6);
301
- i0.ɵɵtextInterpolate1("$", ((tmp_15_0 = i0.ɵɵpipeBind1(94, 42, ctx_r3.versionAMetrics$)) == null ? null : tmp_15_0.totalCost.toFixed(2)) || "0.00", "");
302
- i0.ɵɵadvance(6);
303
- i0.ɵɵtextInterpolate(ctx_r3.formatDuration(((tmp_16_0 = i0.ɵɵpipeBind1(100, 44, ctx_r3.versionAMetrics$)) == null ? null : tmp_16_0.avgDuration) || 0));
304
- i0.ɵɵadvance(4);
305
- i0.ɵɵtextInterpolate1("", ctx_r3.versionB, " Metrics");
306
- i0.ɵɵadvance(6);
307
- i0.ɵɵtextInterpolate(((tmp_18_0 = i0.ɵɵpipeBind1(110, 46, ctx_r3.versionBMetrics$)) == null ? null : tmp_18_0.averageScore.toFixed(4)) || "0.0000");
308
- i0.ɵɵadvance(6);
309
- i0.ɵɵtextInterpolate1("", ((tmp_19_0 = i0.ɵɵpipeBind1(116, 48, ctx_r3.versionBMetrics$)) == null ? null : tmp_19_0.passRate.toFixed(1)) || "0.0", "%");
310
- i0.ɵɵadvance(6);
311
- i0.ɵɵtextInterpolate1("$", ((tmp_20_0 = i0.ɵɵpipeBind1(122, 50, ctx_r3.versionBMetrics$)) == null ? null : tmp_20_0.totalCost.toFixed(2)) || "0.00", "");
312
- i0.ɵɵadvance(6);
313
- i0.ɵɵtextInterpolate(ctx_r3.formatDuration(((tmp_21_0 = i0.ɵɵpipeBind1(128, 52, ctx_r3.versionBMetrics$)) == null ? null : tmp_21_0.avgDuration) || 0));
314
- } }
315
- function TestingVersionComparisonComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
316
- i0.ɵɵelementStart(0, "div", 14);
317
- i0.ɵɵelement(1, "i", 3);
318
- i0.ɵɵelementStart(2, "h3");
319
- i0.ɵɵtext(3, "Select Two Versions to Compare");
320
- i0.ɵɵelementEnd();
321
- i0.ɵɵelementStart(4, "p");
322
- i0.ɵɵtext(5, "Choose a baseline version and a comparison version from the dropdowns above to analyze changes and detect regressions.");
323
- i0.ɵɵelementEnd()();
324
- } }
325
- export class TestingVersionComparisonComponent {
326
- instrumentationService;
327
- cdr;
328
- initialState;
329
- stateChange = new EventEmitter();
330
- destroy$ = new Subject();
331
- versionA = '';
332
- versionB = '';
333
- filter = 'all';
334
- // For reactive filtering of version dropdowns
335
- versionA$ = new BehaviorSubject('');
336
- versionB$ = new BehaviorSubject('');
337
- versions$;
338
- versionsForA$;
339
- versionsForB$;
340
- comparisons$;
341
- filteredComparisons$;
342
- regressionCount$;
343
- improvementCount$;
344
- unchangedCount$;
345
- totalCostDelta$;
346
- versionAMetrics$;
347
- versionBMetrics$;
348
- constructor(instrumentationService, cdr) {
349
- this.instrumentationService = instrumentationService;
350
- this.cdr = cdr;
351
- }
352
- ngOnInit() {
353
- this.setupObservables();
354
- if (this.initialState) {
355
- this.versionA = this.initialState.versionA || '';
356
- this.versionB = this.initialState.versionB || '';
357
- this.filter = this.initialState.filter || 'all';
358
- // Initialize BehaviorSubjects with restored state
359
- this.versionA$.next(this.versionA);
360
- this.versionB$.next(this.versionB);
361
- }
362
- }
363
- ngOnDestroy() {
364
- this.destroy$.next();
365
- this.destroy$.complete();
366
- }
367
- setupObservables() {
368
- // Load version metrics from the service method
369
- this.versions$ = of(this.instrumentationService.getVersionMetrics()).pipe(switchMap(promise => promise), shareReplay(1), takeUntil(this.destroy$));
370
- // Filter versions to exclude the currently selected version in the other dropdown
371
- this.versionsForA$ = combineLatest([this.versions$, this.versionB$]).pipe(map(([versions, selectedB]) => selectedB ? versions.filter(v => v.version !== selectedB) : versions), takeUntil(this.destroy$));
372
- this.versionsForB$ = combineLatest([this.versions$, this.versionA$]).pipe(map(([versions, selectedA]) => selectedA ? versions.filter(v => v.version !== selectedA) : versions), takeUntil(this.destroy$));
373
- this.comparisons$ = combineLatest([
374
- this.instrumentationService.testRuns$
375
- ]).pipe(map(() => this.generateComparisons()), takeUntil(this.destroy$));
376
- this.filteredComparisons$ = this.comparisons$.pipe(map(comparisons => this.filterComparisons(comparisons)));
377
- this.regressionCount$ = this.comparisons$.pipe(map(comparisons => comparisons.filter(c => c.regression).length));
378
- this.improvementCount$ = this.comparisons$.pipe(map(comparisons => comparisons.filter(c => c.improvement).length));
379
- this.unchangedCount$ = this.comparisons$.pipe(map(comparisons => comparisons.filter(c => !c.regression && !c.improvement).length));
380
- this.totalCostDelta$ = this.comparisons$.pipe(map(comparisons => {
381
- if (comparisons.length === 0)
382
- return 0;
383
- const avgDelta = comparisons.reduce((sum, c) => sum + c.costDelta, 0) / comparisons.length;
384
- return avgDelta * 100;
385
- }));
386
- this.versionAMetrics$ = this.instrumentationService.testRuns$.pipe(map(runs => this.calculateVersionMetrics(this.versionA, runs)));
387
- this.versionBMetrics$ = this.instrumentationService.testRuns$.pipe(map(runs => this.calculateVersionMetrics(this.versionB, runs)));
388
- }
389
- generateComparisons() {
390
- if (!this.versionA || !this.versionB)
391
- return [];
392
- const runsA = this.getRunsForVersion(this.versionA);
393
- const runsB = this.getRunsForVersion(this.versionB);
394
- const testNames = new Set([
395
- ...runsA.map(r => r.testName),
396
- ...runsB.map(r => r.testName)
397
- ]);
398
- return Array.from(testNames).map(testName => {
399
- const testRunsA = runsA.filter(r => r.testName === testName);
400
- const testRunsB = runsB.filter(r => r.testName === testName);
401
- const versionAData = this.aggregateTestData(testRunsA);
402
- const versionBData = this.aggregateTestData(testRunsB);
403
- const scoreDelta = versionBData.avgScore - versionAData.avgScore;
404
- const costDelta = versionBData.avgCost === 0 ? 0 : (versionBData.avgCost - versionAData.avgCost) / versionAData.avgCost;
405
- const durationDelta = versionBData.avgDuration === 0 ? 0 : (versionBData.avgDuration - versionAData.avgDuration) / versionAData.avgDuration;
406
- return {
407
- testName,
408
- versionA: versionAData,
409
- versionB: versionBData,
410
- regression: scoreDelta < -0.05 || (versionBData.passRate - versionAData.passRate) < -5,
411
- improvement: scoreDelta > 0.05 || (versionBData.passRate - versionAData.passRate) > 5,
412
- scoreDelta,
413
- costDelta,
414
- durationDelta
415
- };
416
- }).sort((a, b) => {
417
- if (a.regression && !b.regression)
418
- return -1;
419
- if (!a.regression && b.regression)
420
- return 1;
421
- return Math.abs(b.scoreDelta) - Math.abs(a.scoreDelta);
422
- });
423
- }
424
- getRunsForVersion(version) {
425
- return [];
426
- }
427
- aggregateTestData(runs) {
428
- if (runs.length === 0) {
429
- return {
430
- avgScore: 0,
431
- avgCost: 0,
432
- avgDuration: 0,
433
- passRate: 0,
434
- runCount: 0
435
- };
436
- }
437
- const passed = runs.filter(r => r.status === 'Passed').length;
438
- return {
439
- avgScore: runs.reduce((sum, r) => sum + r.score, 0) / runs.length,
440
- avgCost: runs.reduce((sum, r) => sum + r.cost, 0) / runs.length,
441
- avgDuration: runs.reduce((sum, r) => sum + r.duration, 0) / runs.length,
442
- passRate: (passed / runs.length) * 100,
443
- runCount: runs.length
444
- };
445
- }
446
- filterComparisons(comparisons) {
447
- if (this.filter === 'all')
448
- return comparisons;
449
- if (this.filter === 'regressions')
450
- return comparisons.filter(c => c.regression);
451
- if (this.filter === 'improvements')
452
- return comparisons.filter(c => c.improvement);
453
- if (this.filter === 'unchanged')
454
- return comparisons.filter(c => !c.regression && !c.improvement);
455
- return comparisons;
456
- }
457
- calculateVersionMetrics(version, allRuns) {
458
- const runs = allRuns.filter(r => r.testName === version);
459
- if (runs.length === 0) {
460
- return {
461
- averageScore: 0,
462
- passRate: 0,
463
- totalCost: 0,
464
- avgDuration: 0
465
- };
466
- }
467
- const passed = runs.filter(r => r.status === 'Passed').length;
468
- return {
469
- averageScore: runs.reduce((sum, r) => sum + r.score, 0) / runs.length,
470
- passRate: (passed / runs.length) * 100,
471
- totalCost: runs.reduce((sum, r) => sum + r.cost, 0),
472
- avgDuration: runs.reduce((sum, r) => sum + r.duration, 0) / runs.length
473
- };
474
- }
475
- onVersionChange() {
476
- // Update the BehaviorSubjects for reactive filtering
477
- this.versionA$.next(this.versionA);
478
- this.versionB$.next(this.versionB);
479
- this.emitStateChange();
480
- this.cdr.markForCheck();
481
- }
482
- setFilter(filter) {
483
- this.filter = filter;
484
- this.emitStateChange();
485
- this.cdr.markForCheck();
486
- }
487
- refresh() {
488
- this.instrumentationService.refresh();
489
- }
490
- formatDuration(milliseconds) {
491
- if (milliseconds < 1000)
492
- return `${milliseconds}ms`;
493
- const seconds = Math.floor(milliseconds / 1000);
494
- const minutes = Math.floor(seconds / 60);
495
- if (minutes > 0)
496
- return `${minutes}m ${seconds % 60}s`;
497
- return `${seconds}s`;
498
- }
499
- emitStateChange() {
500
- this.stateChange.emit({
501
- versionA: this.versionA,
502
- versionB: this.versionB,
503
- filter: this.filter
504
- });
505
- }
506
- static ɵfac = function TestingVersionComparisonComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TestingVersionComparisonComponent)(i0.ɵɵdirectiveInject(i1.TestingInstrumentationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
507
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestingVersionComparisonComponent, selectors: [["app-testing-version-comparison"]], inputs: { initialState: "initialState" }, outputs: { stateChange: "stateChange" }, decls: 33, vars: 9, consts: [[1, "testing-version-comparison"], [1, "version-header"], [1, "header-left"], [1, "fa-solid", "fa-code-compare"], [1, "header-actions"], [1, "action-btn", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "version-selector"], [1, "selector-group"], [1, "version-select", 3, "ngModelChange", "change", "ngModel"], ["value", ""], [3, "value"], [1, "selector-icon"], [1, "fa-solid", "fa-arrows-left-right"], [1, "empty-state"], [1, "comparison-summary"], [1, "summary-card"], [1, "card-icon", "regression"], [1, "fa-solid", "fa-arrow-trend-down"], [1, "card-content"], [1, "card-value"], [1, "card-label"], [1, "card-icon", "improvement"], [1, "fa-solid", "fa-arrow-trend-up"], [1, "card-icon", "neutral"], [1, "fa-solid", "fa-minus"], [1, "card-icon", "cost"], [1, "fa-solid", "fa-dollar-sign"], [1, "comparison-filters"], [1, "filter-btn", 3, "click"], [1, "fa-solid", "fa-list"], [1, "filter-btn", "regression", 3, "click"], [1, "filter-btn", "improvement", 3, "click"], [1, "filter-btn", "neutral", 3, "click"], [1, "comparison-content"], [1, "comparison-table"], [1, "table-header"], [1, "header-cell", "test-name"], [1, "header-cell", "version-data"], [1, "header-cell", "delta"], [1, "header-cell", "status"], [1, "table-row", 3, "regression", "improvement"], [1, "no-data"], [1, "metrics-overview"], [1, "overview-section"], [1, "metrics-grid"], [1, "metric-item"], [1, "metric-label"], [1, "metric-value"], [1, "table-row"], [1, "cell", "test-name"], [1, "test-name-text"], [1, "cell", "version-data"], [1, "version-metrics"], [1, "metric-meta"], [1, "cell", "delta"], [1, "delta-value"], [1, "cell", "status"], [1, "status-badge", "regression"], [1, "status-badge", "improvement"], [1, "status-badge", "neutral"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-minus-circle"], [1, "fa-solid", "fa-chart-simple"]], template: function TestingVersionComparisonComponent_Template(rf, ctx) { if (rf & 1) {
508
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h2");
509
- i0.ɵɵelement(4, "i", 3);
510
- i0.ɵɵtext(5, " Version Comparison ");
511
- i0.ɵɵelementEnd()();
512
- i0.ɵɵelementStart(6, "div", 4)(7, "button", 5);
513
- i0.ɵɵlistener("click", function TestingVersionComparisonComponent_Template_button_click_7_listener() { return ctx.refresh(); });
514
- i0.ɵɵelement(8, "i", 6);
515
- i0.ɵɵtext(9, " Refresh ");
516
- i0.ɵɵelementEnd()()();
517
- i0.ɵɵelementStart(10, "div", 7)(11, "div", 8)(12, "label");
518
- i0.ɵɵtext(13, "Version A (Baseline)");
519
- i0.ɵɵelementEnd();
520
- i0.ɵɵelementStart(14, "select", 9);
521
- i0.ɵɵtwoWayListener("ngModelChange", function TestingVersionComparisonComponent_Template_select_ngModelChange_14_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.versionA, $event) || (ctx.versionA = $event); return $event; });
522
- i0.ɵɵlistener("change", function TestingVersionComparisonComponent_Template_select_change_14_listener() { return ctx.onVersionChange(); });
523
- i0.ɵɵelementStart(15, "option", 10);
524
- i0.ɵɵtext(16, "Select Version...");
525
- i0.ɵɵelementEnd();
526
- i0.ɵɵrepeaterCreate(17, TestingVersionComparisonComponent_For_18_Template, 2, 3, "option", 11, _forTrack0);
527
- i0.ɵɵpipe(19, "async");
528
- i0.ɵɵelementEnd()();
529
- i0.ɵɵelementStart(20, "div", 12);
530
- i0.ɵɵelement(21, "i", 13);
531
- i0.ɵɵelementEnd();
532
- i0.ɵɵelementStart(22, "div", 8)(23, "label");
533
- i0.ɵɵtext(24, "Version B (Comparison)");
534
- i0.ɵɵelementEnd();
535
- i0.ɵɵelementStart(25, "select", 9);
536
- i0.ɵɵtwoWayListener("ngModelChange", function TestingVersionComparisonComponent_Template_select_ngModelChange_25_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.versionB, $event) || (ctx.versionB = $event); return $event; });
537
- i0.ɵɵlistener("change", function TestingVersionComparisonComponent_Template_select_change_25_listener() { return ctx.onVersionChange(); });
538
- i0.ɵɵelementStart(26, "option", 10);
539
- i0.ɵɵtext(27, "Select Version...");
540
- i0.ɵɵelementEnd();
541
- i0.ɵɵrepeaterCreate(28, TestingVersionComparisonComponent_For_29_Template, 2, 3, "option", 11, _forTrack0);
542
- i0.ɵɵpipe(30, "async");
543
- i0.ɵɵelementEnd()()();
544
- i0.ɵɵtemplate(31, TestingVersionComparisonComponent_Conditional_31_Template, 129, 55)(32, TestingVersionComparisonComponent_Conditional_32_Template, 6, 0, "div", 14);
545
- i0.ɵɵelementEnd();
546
- } if (rf & 2) {
547
- let tmp_1_0;
548
- let tmp_3_0;
549
- i0.ɵɵadvance(14);
550
- i0.ɵɵtwoWayProperty("ngModel", ctx.versionA);
551
- i0.ɵɵadvance(3);
552
- i0.ɵɵrepeater((tmp_1_0 = i0.ɵɵpipeBind1(19, 3, ctx.versionsForA$)) !== null && tmp_1_0 !== undefined ? tmp_1_0 : i0.ɵɵpureFunction0(7, _c0));
553
- i0.ɵɵadvance(8);
554
- i0.ɵɵtwoWayProperty("ngModel", ctx.versionB);
555
- i0.ɵɵadvance(3);
556
- i0.ɵɵrepeater((tmp_3_0 = i0.ɵɵpipeBind1(30, 5, ctx.versionsForB$)) !== null && tmp_3_0 !== undefined ? tmp_3_0 : i0.ɵɵpureFunction0(8, _c0));
557
- i0.ɵɵadvance(3);
558
- i0.ɵɵconditional(ctx.versionA && ctx.versionB ? 31 : 32);
559
- } }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.AsyncPipe, i3.DecimalPipe], styles: [".testing-version-comparison[_ngcontent-%COMP%] {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background: #f8f9fa;\n }\n\n .version-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 24px;\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .header-left[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-left[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n color: #666;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .action-btn[_ngcontent-%COMP%]:hover {\n background: #f5f5f5;\n }\n\n .version-selector[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr auto 1fr;\n gap: 20px;\n align-items: center;\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n margin-bottom: 24px;\n }\n\n .selector-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .selector-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n }\n\n .version-select[_ngcontent-%COMP%] {\n padding: 10px 14px;\n border: 2px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n cursor: pointer;\n transition: border-color 0.2s ease;\n }\n\n .version-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #2196f3;\n }\n\n .selector-icon[_ngcontent-%COMP%] {\n font-size: 24px;\n color: #2196f3;\n text-align: center;\n }\n\n .comparison-summary[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n margin-bottom: 24px;\n }\n\n .summary-card[_ngcontent-%COMP%] {\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .card-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n color: white;\n }\n\n .card-icon.regression[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f44336 0%, #d32f2f 100%);\n }\n\n .card-icon.improvement[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #4caf50 0%, #388e3c 100%);\n }\n\n .card-icon.neutral[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #9e9e9e 0%, #757575 100%);\n }\n\n .card-icon.cost[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%);\n }\n\n .card-content[_ngcontent-%COMP%] {\n flex: 1;\n }\n\n .card-value[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: #333;\n line-height: 1;\n margin-bottom: 6px;\n }\n\n .card-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #666;\n font-weight: 600;\n text-transform: uppercase;\n }\n\n .comparison-filters[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-bottom: 20px;\n background: white;\n padding: 16px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .filter-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: 2px solid #e0e0e0;\n border-radius: 6px;\n background: white;\n color: #666;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .filter-btn[_ngcontent-%COMP%]:hover {\n background: #f5f5f5;\n border-color: #bdbdbd;\n }\n\n .filter-btn.active[_ngcontent-%COMP%] {\n background: #2196f3;\n border-color: #2196f3;\n color: white;\n }\n\n .filter-btn.regression.active[_ngcontent-%COMP%] {\n background: #f44336;\n border-color: #f44336;\n }\n\n .filter-btn.improvement.active[_ngcontent-%COMP%] {\n background: #4caf50;\n border-color: #4caf50;\n }\n\n .filter-btn.neutral.active[_ngcontent-%COMP%] {\n background: #9e9e9e;\n border-color: #9e9e9e;\n }\n\n .comparison-content[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n margin-bottom: 24px;\n }\n\n .comparison-table[_ngcontent-%COMP%] {\n overflow-x: auto;\n }\n\n .table-header[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 2fr 1.5fr 1.5fr 100px 100px 100px 140px;\n gap: 16px;\n padding: 16px;\n background: #f8f9fa;\n border-bottom: 2px solid #e0e0e0;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n }\n\n .table-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 2fr 1.5fr 1.5fr 100px 100px 100px 140px;\n gap: 16px;\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n transition: background 0.2s ease;\n }\n\n .table-row[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n }\n\n .table-row.regression[_ngcontent-%COMP%] {\n border-left: 4px solid #f44336;\n }\n\n .table-row.improvement[_ngcontent-%COMP%] {\n border-left: 4px solid #4caf50;\n }\n\n .cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n font-size: 13px;\n color: #333;\n }\n\n .cell.test-name[_ngcontent-%COMP%] {\n font-weight: 500;\n }\n\n .version-metrics[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .metric-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n\n .metric-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #666;\n }\n\n .delta-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n padding: 4px 8px;\n border-radius: 4px;\n }\n\n .delta-value.positive[_ngcontent-%COMP%] {\n background: #e8f5e9;\n color: #4caf50;\n }\n\n .delta-value.negative[_ngcontent-%COMP%] {\n background: #ffebee;\n color: #f44336;\n }\n\n .status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n }\n\n .status-badge.regression[_ngcontent-%COMP%] {\n background: #ffebee;\n color: #f44336;\n }\n\n .status-badge.improvement[_ngcontent-%COMP%] {\n background: #e8f5e9;\n color: #4caf50;\n }\n\n .status-badge.neutral[_ngcontent-%COMP%] {\n background: #f5f5f5;\n color: #9e9e9e;\n }\n\n .metrics-overview[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n }\n\n .overview-section[_ngcontent-%COMP%] {\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .overview-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 16px 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n padding-bottom: 12px;\n border-bottom: 2px solid #f0f0f0;\n }\n\n .metrics-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n }\n\n .metric-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .metric-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n }\n\n .metric-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 700;\n color: #333;\n }\n\n .empty-state[_ngcontent-%COMP%], \n .no-data[_ngcontent-%COMP%] {\n padding: 80px 20px;\n text-align: center;\n color: #999;\n }\n\n .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n .no-data[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 64px;\n margin-bottom: 20px;\n opacity: 0.3;\n color: #2196f3;\n }\n\n .empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #666;\n margin: 0 0 12px 0;\n }\n\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n .no-data[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n margin: 0;\n max-width: 500px;\n margin: 0 auto;\n line-height: 1.6;\n }\n\n @media (max-width: 1200px) {\n .metrics-overview[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .version-selector[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .selector-icon[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n }\n }"], changeDetection: 0 });
560
- }
561
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TestingVersionComparisonComponent, [{
562
- type: Component,
563
- args: [{ selector: 'app-testing-version-comparison', changeDetection: ChangeDetectionStrategy.OnPush, template: `
564
- <div class="testing-version-comparison">
565
- <div class="version-header">
566
- <div class="header-left">
567
- <h2>
568
- <i class="fa-solid fa-code-compare"></i>
569
- Version Comparison
570
- </h2>
571
- </div>
572
- <div class="header-actions">
573
- <button class="action-btn" (click)="refresh()">
574
- <i class="fa-solid fa-refresh"></i>
575
- Refresh
576
- </button>
577
- </div>
578
- </div>
579
-
580
- <!-- Version Selector -->
581
- <div class="version-selector">
582
- <div class="selector-group">
583
- <label>Version A (Baseline)</label>
584
- <select [(ngModel)]="versionA" (change)="onVersionChange()" class="version-select">
585
- <option value="">Select Version...</option>
586
- @for (version of (versionsForA$ | async) ?? []; track version.version) {
587
- <option [value]="version.version">{{ version.version }} ({{ version.totalTests }} tests)</option>
588
- }
589
- </select>
590
- </div>
591
- <div class="selector-icon">
592
- <i class="fa-solid fa-arrows-left-right"></i>
593
- </div>
594
- <div class="selector-group">
595
- <label>Version B (Comparison)</label>
596
- <select [(ngModel)]="versionB" (change)="onVersionChange()" class="version-select">
597
- <option value="">Select Version...</option>
598
- @for (version of (versionsForB$ | async) ?? []; track version.version) {
599
- <option [value]="version.version">{{ version.version }} ({{ version.totalTests }} tests)</option>
600
- }
601
- </select>
602
- </div>
603
- </div>
604
-
605
- @if (versionA && versionB) {
606
- <!-- Summary Cards -->
607
- <div class="comparison-summary">
608
- <div class="summary-card">
609
- <div class="card-icon regression">
610
- <i class="fa-solid fa-arrow-trend-down"></i>
611
- </div>
612
- <div class="card-content">
613
- <div class="card-value">{{ (regressionCount$ | async) || 0 }}</div>
614
- <div class="card-label">Regressions Detected</div>
615
- </div>
616
- </div>
617
- <div class="summary-card">
618
- <div class="card-icon improvement">
619
- <i class="fa-solid fa-arrow-trend-up"></i>
620
- </div>
621
- <div class="card-content">
622
- <div class="card-value">{{ (improvementCount$ | async) || 0 }}</div>
623
- <div class="card-label">Improvements</div>
624
- </div>
625
- </div>
626
- <div class="summary-card">
627
- <div class="card-icon neutral">
628
- <i class="fa-solid fa-minus"></i>
629
- </div>
630
- <div class="card-content">
631
- <div class="card-value">{{ (unchangedCount$ | async) || 0 }}</div>
632
- <div class="card-label">Unchanged</div>
633
- </div>
634
- </div>
635
- <div class="summary-card">
636
- <div class="card-icon cost">
637
- <i class="fa-solid fa-dollar-sign"></i>
638
- </div>
639
- <div class="card-content">
640
- <div class="card-value">{{ (totalCostDelta$ | async) || 0 | number:'1.2-2' }}%</div>
641
- <div class="card-label">Cost Change</div>
642
- </div>
643
- </div>
644
- </div>
645
-
646
- <!-- Filters -->
647
- <div class="comparison-filters">
648
- <button
649
- class="filter-btn"
650
- [class.active]="filter === 'all'"
651
- (click)="setFilter('all')"
652
- >
653
- <i class="fa-solid fa-list"></i>
654
- All Tests
655
- </button>
656
- <button
657
- class="filter-btn regression"
658
- [class.active]="filter === 'regressions'"
659
- (click)="setFilter('regressions')"
660
- >
661
- <i class="fa-solid fa-arrow-trend-down"></i>
662
- Regressions Only
663
- </button>
664
- <button
665
- class="filter-btn improvement"
666
- [class.active]="filter === 'improvements'"
667
- (click)="setFilter('improvements')"
668
- >
669
- <i class="fa-solid fa-arrow-trend-up"></i>
670
- Improvements Only
671
- </button>
672
- <button
673
- class="filter-btn neutral"
674
- [class.active]="filter === 'unchanged'"
675
- (click)="setFilter('unchanged')"
676
- >
677
- <i class="fa-solid fa-minus"></i>
678
- Unchanged
679
- </button>
680
- </div>
681
-
682
- <!-- Comparison Table -->
683
- <div class="comparison-content">
684
- <div class="comparison-table">
685
- <div class="table-header">
686
- <div class="header-cell test-name">Test Name</div>
687
- <div class="header-cell version-data">{{ versionA }}</div>
688
- <div class="header-cell version-data">{{ versionB }}</div>
689
- <div class="header-cell delta">Score Δ</div>
690
- <div class="header-cell delta">Cost Δ</div>
691
- <div class="header-cell delta">Duration Δ</div>
692
- <div class="header-cell status">Status</div>
693
- </div>
694
-
695
- @for (comparison of (filteredComparisons$ | async) ?? []; track comparison.testName) {
696
- <div class="table-row" [class.regression]="comparison.regression" [class.improvement]="comparison.improvement">
697
- <div class="cell test-name">
698
- <span class="test-name-text">{{ comparison.testName }}</span>
699
- </div>
700
- <div class="cell version-data">
701
- <div class="version-metrics">
702
- <span class="metric-value">{{ comparison.versionA.avgScore.toFixed(4) }}</span>
703
- <span class="metric-meta">{{ comparison.versionA.passRate.toFixed(0) }}% pass • {{ comparison.versionA.runCount }} runs</span>
704
- </div>
705
- </div>
706
- <div class="cell version-data">
707
- <div class="version-metrics">
708
- <span class="metric-value">{{ comparison.versionB.avgScore.toFixed(4) }}</span>
709
- <span class="metric-meta">{{ comparison.versionB.passRate.toFixed(0) }}% pass • {{ comparison.versionB.runCount }} runs</span>
710
- </div>
711
- </div>
712
- <div class="cell delta">
713
- <span class="delta-value" [class.positive]="comparison.scoreDelta > 0" [class.negative]="comparison.scoreDelta < 0">
714
- {{ comparison.scoreDelta > 0 ? '+' : '' }}{{ (comparison.scoreDelta * 100).toFixed(1) }}%
715
- </span>
716
- </div>
717
- <div class="cell delta">
718
- <span class="delta-value" [class.positive]="comparison.costDelta < 0" [class.negative]="comparison.costDelta > 0">
719
- {{ comparison.costDelta > 0 ? '+' : '' }}{{ (comparison.costDelta * 100).toFixed(1) }}%
720
- </span>
721
- </div>
722
- <div class="cell delta">
723
- <span class="delta-value" [class.positive]="comparison.durationDelta < 0" [class.negative]="comparison.durationDelta > 0">
724
- {{ comparison.durationDelta > 0 ? '+' : '' }}{{ (comparison.durationDelta * 100).toFixed(1) }}%
725
- </span>
726
- </div>
727
- <div class="cell status">
728
- @if (comparison.regression) {
729
- <span class="status-badge regression">
730
- <i class="fa-solid fa-exclamation-triangle"></i>
731
- Regression
732
- </span>
733
- } @else if (comparison.improvement) {
734
- <span class="status-badge improvement">
735
- <i class="fa-solid fa-check-circle"></i>
736
- Improved
737
- </span>
738
- } @else {
739
- <span class="status-badge neutral">
740
- <i class="fa-solid fa-minus-circle"></i>
741
- Unchanged
742
- </span>
743
- }
744
- </div>
745
- </div>
746
- } @empty {
747
- <div class="no-data">
748
- <i class="fa-solid fa-chart-simple"></i>
749
- <p>No test data available for comparison</p>
750
- </div>
751
- }
752
- </div>
753
- </div>
754
-
755
- <!-- Version Metrics Overview -->
756
- <div class="metrics-overview">
757
- <div class="overview-section">
758
- <h3>{{ versionA }} Metrics</h3>
759
- <div class="metrics-grid">
760
- <div class="metric-item">
761
- <span class="metric-label">Avg Score</span>
762
- <span class="metric-value">{{ (versionAMetrics$ | async)?.averageScore.toFixed(4) || '0.0000' }}</span>
763
- </div>
764
- <div class="metric-item">
765
- <span class="metric-label">Pass Rate</span>
766
- <span class="metric-value">{{ (versionAMetrics$ | async)?.passRate.toFixed(1) || '0.0' }}%</span>
767
- </div>
768
- <div class="metric-item">
769
- <span class="metric-label">Total Cost</span>
770
- <span class="metric-value">\${{ (versionAMetrics$ | async)?.totalCost.toFixed(2) || '0.00' }}</span>
771
- </div>
772
- <div class="metric-item">
773
- <span class="metric-label">Avg Duration</span>
774
- <span class="metric-value">{{ formatDuration((versionAMetrics$ | async)?.avgDuration || 0) }}</span>
775
- </div>
776
- </div>
777
- </div>
778
- <div class="overview-section">
779
- <h3>{{ versionB }} Metrics</h3>
780
- <div class="metrics-grid">
781
- <div class="metric-item">
782
- <span class="metric-label">Avg Score</span>
783
- <span class="metric-value">{{ (versionBMetrics$ | async)?.averageScore.toFixed(4) || '0.0000' }}</span>
784
- </div>
785
- <div class="metric-item">
786
- <span class="metric-label">Pass Rate</span>
787
- <span class="metric-value">{{ (versionBMetrics$ | async)?.passRate.toFixed(1) || '0.0' }}%</span>
788
- </div>
789
- <div class="metric-item">
790
- <span class="metric-label">Total Cost</span>
791
- <span class="metric-value">\${{ (versionBMetrics$ | async)?.totalCost.toFixed(2) || '0.00' }}</span>
792
- </div>
793
- <div class="metric-item">
794
- <span class="metric-label">Avg Duration</span>
795
- <span class="metric-value">{{ formatDuration((versionBMetrics$ | async)?.avgDuration || 0) }}</span>
796
- </div>
797
- </div>
798
- </div>
799
- </div>
800
- } @else {
801
- <div class="empty-state">
802
- <i class="fa-solid fa-code-compare"></i>
803
- <h3>Select Two Versions to Compare</h3>
804
- <p>Choose a baseline version and a comparison version from the dropdowns above to analyze changes and detect regressions.</p>
805
- </div>
806
- }
807
- </div>
808
- `, styles: ["\n .testing-version-comparison {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background: #f8f9fa;\n }\n\n .version-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 24px;\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .header-left h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-left h2 i {\n color: #2196f3;\n }\n\n .action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n color: #666;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .action-btn:hover {\n background: #f5f5f5;\n }\n\n .version-selector {\n display: grid;\n grid-template-columns: 1fr auto 1fr;\n gap: 20px;\n align-items: center;\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n margin-bottom: 24px;\n }\n\n .selector-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .selector-group label {\n font-size: 12px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n }\n\n .version-select {\n padding: 10px 14px;\n border: 2px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n cursor: pointer;\n transition: border-color 0.2s ease;\n }\n\n .version-select:focus {\n outline: none;\n border-color: #2196f3;\n }\n\n .selector-icon {\n font-size: 24px;\n color: #2196f3;\n text-align: center;\n }\n\n .comparison-summary {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n margin-bottom: 24px;\n }\n\n .summary-card {\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .card-icon {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n color: white;\n }\n\n .card-icon.regression {\n background: linear-gradient(135deg, #f44336 0%, #d32f2f 100%);\n }\n\n .card-icon.improvement {\n background: linear-gradient(135deg, #4caf50 0%, #388e3c 100%);\n }\n\n .card-icon.neutral {\n background: linear-gradient(135deg, #9e9e9e 0%, #757575 100%);\n }\n\n .card-icon.cost {\n background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%);\n }\n\n .card-content {\n flex: 1;\n }\n\n .card-value {\n font-size: 28px;\n font-weight: 700;\n color: #333;\n line-height: 1;\n margin-bottom: 6px;\n }\n\n .card-label {\n font-size: 11px;\n color: #666;\n font-weight: 600;\n text-transform: uppercase;\n }\n\n .comparison-filters {\n display: flex;\n gap: 12px;\n margin-bottom: 20px;\n background: white;\n padding: 16px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .filter-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: 2px solid #e0e0e0;\n border-radius: 6px;\n background: white;\n color: #666;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .filter-btn:hover {\n background: #f5f5f5;\n border-color: #bdbdbd;\n }\n\n .filter-btn.active {\n background: #2196f3;\n border-color: #2196f3;\n color: white;\n }\n\n .filter-btn.regression.active {\n background: #f44336;\n border-color: #f44336;\n }\n\n .filter-btn.improvement.active {\n background: #4caf50;\n border-color: #4caf50;\n }\n\n .filter-btn.neutral.active {\n background: #9e9e9e;\n border-color: #9e9e9e;\n }\n\n .comparison-content {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n margin-bottom: 24px;\n }\n\n .comparison-table {\n overflow-x: auto;\n }\n\n .table-header {\n display: grid;\n grid-template-columns: 2fr 1.5fr 1.5fr 100px 100px 100px 140px;\n gap: 16px;\n padding: 16px;\n background: #f8f9fa;\n border-bottom: 2px solid #e0e0e0;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n }\n\n .table-row {\n display: grid;\n grid-template-columns: 2fr 1.5fr 1.5fr 100px 100px 100px 140px;\n gap: 16px;\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n transition: background 0.2s ease;\n }\n\n .table-row:hover {\n background: #f8f9fa;\n }\n\n .table-row.regression {\n border-left: 4px solid #f44336;\n }\n\n .table-row.improvement {\n border-left: 4px solid #4caf50;\n }\n\n .cell {\n display: flex;\n align-items: center;\n font-size: 13px;\n color: #333;\n }\n\n .cell.test-name {\n font-weight: 500;\n }\n\n .version-metrics {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .metric-value {\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n\n .metric-meta {\n font-size: 11px;\n color: #666;\n }\n\n .delta-value {\n font-size: 13px;\n font-weight: 600;\n padding: 4px 8px;\n border-radius: 4px;\n }\n\n .delta-value.positive {\n background: #e8f5e9;\n color: #4caf50;\n }\n\n .delta-value.negative {\n background: #ffebee;\n color: #f44336;\n }\n\n .status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n }\n\n .status-badge.regression {\n background: #ffebee;\n color: #f44336;\n }\n\n .status-badge.improvement {\n background: #e8f5e9;\n color: #4caf50;\n }\n\n .status-badge.neutral {\n background: #f5f5f5;\n color: #9e9e9e;\n }\n\n .metrics-overview {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n }\n\n .overview-section {\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .overview-section h3 {\n margin: 0 0 16px 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n padding-bottom: 12px;\n border-bottom: 2px solid #f0f0f0;\n }\n\n .metrics-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n }\n\n .metric-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .metric-label {\n font-size: 11px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n }\n\n .metric-value {\n font-size: 18px;\n font-weight: 700;\n color: #333;\n }\n\n .empty-state,\n .no-data {\n padding: 80px 20px;\n text-align: center;\n color: #999;\n }\n\n .empty-state i,\n .no-data i {\n font-size: 64px;\n margin-bottom: 20px;\n opacity: 0.3;\n color: #2196f3;\n }\n\n .empty-state h3 {\n font-size: 20px;\n color: #666;\n margin: 0 0 12px 0;\n }\n\n .empty-state p,\n .no-data p {\n font-size: 14px;\n margin: 0;\n max-width: 500px;\n margin: 0 auto;\n line-height: 1.6;\n }\n\n @media (max-width: 1200px) {\n .metrics-overview {\n grid-template-columns: 1fr;\n }\n\n .version-selector {\n grid-template-columns: 1fr;\n }\n\n .selector-icon {\n transform: rotate(90deg);\n }\n }\n "] }]
809
- }], () => [{ type: i1.TestingInstrumentationService }, { type: i0.ChangeDetectorRef }], { initialState: [{
810
- type: Input
811
- }], stateChange: [{
812
- type: Output
813
- }] }); })();
814
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestingVersionComparisonComponent, { className: "TestingVersionComparisonComponent" }); })();
815
- //# sourceMappingURL=testing-version-comparison.component.js.map