@memberjunction/ng-dashboards 5.21.0 → 5.23.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 (262) hide show
  1. package/README.md +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +364 -362
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +313 -0
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -0
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2792 -0
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -0
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +382 -0
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -0
  12. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +2683 -0
  13. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -0
  14. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +191 -197
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/models/model-management.component.js +9 -8
  18. package/dist/AI/components/models/model-management.component.js.map +1 -1
  19. package/dist/AI/components/prompts/prompt-management.component.js +305 -299
  20. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  21. package/dist/AI/components/system/system-configuration.component.js +319 -313
  22. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  23. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +240 -0
  24. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -0
  25. package/dist/AI/components/vectors/vector-management-resource.component.js +1767 -0
  26. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -0
  27. package/dist/AI/index.d.ts +3 -0
  28. package/dist/AI/index.d.ts.map +1 -1
  29. package/dist/AI/index.js +6 -0
  30. package/dist/AI/index.js.map +1 -1
  31. package/dist/AI/services/ai-instrumentation.service.d.ts +50 -7
  32. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  33. package/dist/AI/services/ai-instrumentation.service.js +161 -193
  34. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  35. package/dist/APIKeys/api-applications-panel.component.js +10 -12
  36. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  37. package/dist/APIKeys/api-key-create-dialog.component.js +13 -19
  38. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  39. package/dist/APIKeys/api-key-edit-panel.component.js +12 -14
  40. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  41. package/dist/APIKeys/api-scopes-panel.component.js +61 -68
  42. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  43. package/dist/APIKeys/api-usage-panel.component.js +10 -11
  44. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  45. package/dist/Actions/components/actions-list-view.component.js +82 -96
  46. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  47. package/dist/Actions/components/actions-overview.component.js +130 -134
  48. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  49. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  50. package/dist/Actions/components/categories-list-view.component.js +40 -46
  51. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  52. package/dist/Actions/components/code-management.component.js +2 -2
  53. package/dist/Actions/components/code-management.component.js.map +1 -1
  54. package/dist/Actions/components/entity-integration.component.js +2 -2
  55. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  56. package/dist/Actions/components/execution-monitoring.component.js +127 -132
  57. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  58. package/dist/Actions/components/executions-list-view.component.js +2 -2
  59. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  60. package/dist/Actions/components/explorer/action-card.component.js +11 -17
  61. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  62. package/dist/Actions/components/explorer/action-explorer.component.js +5 -11
  63. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  64. package/dist/Actions/components/explorer/action-list-item.component.js +8 -10
  65. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  66. package/dist/Actions/components/explorer/action-toolbar.component.js +112 -133
  67. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
  68. package/dist/Actions/components/explorer/action-tree-panel.component.js +63 -83
  69. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
  70. package/dist/Actions/components/explorer/new-action-panel.component.js +17 -21
  71. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  72. package/dist/Actions/components/explorer/new-category-panel.component.js +17 -21
  73. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  74. package/dist/Actions/components/scheduled-actions.component.js +2 -2
  75. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  76. package/dist/Actions/components/security-permissions.component.js +2 -2
  77. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  78. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +13 -5
  79. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  80. package/dist/ComponentStudio/component-studio-dashboard.component.js +168 -145
  81. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  82. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +4 -5
  83. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  84. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +197 -200
  85. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  86. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +5 -7
  87. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  88. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +142 -148
  89. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  90. package/dist/ComponentStudio/components/browser/component-browser.component.js +153 -166
  91. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
  92. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +15 -20
  93. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  94. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +16 -21
  95. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  96. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +18 -23
  97. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  98. package/dist/ComponentStudio/components/editors/spec-editor.component.js +25 -30
  99. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  100. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +10 -11
  101. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
  102. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
  103. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +24 -35
  104. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  105. package/dist/ComponentStudio/components/text-import-dialog.component.js +15 -17
  106. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  107. package/dist/Credentials/components/credentials-categories-resource.component.js +7 -6
  108. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  109. package/dist/Credentials/components/credentials-list-resource.component.js +6 -5
  110. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  111. package/dist/Credentials/components/credentials-types-resource.component.js +7 -6
  112. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  113. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +11 -0
  114. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  115. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +57 -0
  116. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  117. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -9
  118. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  119. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +1 -1
  120. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +10 -2
  121. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  122. package/dist/DataExplorer/data-explorer-dashboard.component.js +35 -11
  123. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  124. package/dist/DataExplorer/data-explorer-resource.component.d.ts +1 -0
  125. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  126. package/dist/DataExplorer/data-explorer-resource.component.js +8 -4
  127. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  128. package/dist/Home/home-dashboard.component.d.ts +181 -1
  129. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  130. package/dist/Home/home-dashboard.component.js +1704 -182
  131. package/dist/Home/home-dashboard.component.js.map +1 -1
  132. package/dist/Integration/components/connections/connections.component.js +4 -4
  133. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  134. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +246 -259
  135. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  136. package/dist/Integration/components/widgets/integration-card.component.js +7 -9
  137. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  138. package/dist/Integration/integration.module.d.ts +6 -10
  139. package/dist/Integration/integration.module.d.ts.map +1 -1
  140. package/dist/Integration/integration.module.js +12 -20
  141. package/dist/Integration/integration.module.js.map +1 -1
  142. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +106 -0
  143. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -0
  144. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +607 -0
  145. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -0
  146. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +126 -0
  147. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -0
  148. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +1086 -0
  149. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -0
  150. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts +56 -0
  151. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts.map +1 -0
  152. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js +291 -0
  153. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js.map +1 -0
  154. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +85 -0
  155. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -0
  156. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +461 -0
  157. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -0
  158. package/dist/KnowledgeHub/index.d.ts +5 -0
  159. package/dist/KnowledgeHub/index.d.ts.map +1 -0
  160. package/dist/KnowledgeHub/index.js +6 -0
  161. package/dist/KnowledgeHub/index.js.map +1 -0
  162. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  163. package/dist/Lists/components/lists-browse-resource.component.js +9 -7
  164. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  165. package/dist/Lists/components/lists-my-lists-resource.component.js +5 -4
  166. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  167. package/dist/Lists/components/lists-operations-resource.component.js +10 -9
  168. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  169. package/dist/MCP/components/mcp-connection-dialog.component.js +141 -132
  170. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  171. package/dist/MCP/components/mcp-log-detail-panel.component.js +4 -4
  172. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  173. package/dist/MCP/components/mcp-server-dialog.component.js +141 -128
  174. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  175. package/dist/MCP/components/mcp-test-tool-dialog.component.js +210 -218
  176. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  177. package/dist/MCP/mcp-dashboard.component.js +2 -2
  178. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  179. package/dist/MCP/mcp.module.d.ts +6 -9
  180. package/dist/MCP/mcp.module.d.ts.map +1 -1
  181. package/dist/MCP/mcp.module.js +20 -22
  182. package/dist/MCP/mcp.module.js.map +1 -1
  183. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  184. package/dist/QueryBrowser/query-browser-resource.component.js +5 -1
  185. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  186. package/dist/Scheduling/components/scheduling-activity.component.js +5 -4
  187. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  188. package/dist/Scheduling/components/scheduling-jobs.component.js +6 -5
  189. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  190. package/dist/Scheduling/components/scheduling-overview.component.js +93 -92
  191. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  192. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  193. package/dist/SystemDiagnostics/system-diagnostics.component.js +1 -0
  194. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  195. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +7 -1
  196. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  197. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +63 -8
  198. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  199. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +9 -1
  200. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  201. package/dist/Testing/components/testing-dashboard-tab.component.js +109 -62
  202. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  203. package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
  204. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  205. package/dist/Testing/components/testing-explorer.component.js +241 -200
  206. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  207. package/dist/Testing/components/testing-runs-resource.component.d.ts +7 -1
  208. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  209. package/dist/Testing/components/testing-runs-resource.component.js +63 -8
  210. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  211. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  212. package/dist/Testing/components/testing-runs.component.js +7 -5
  213. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  214. package/dist/Testing/testing-dashboard.component.d.ts +9 -1
  215. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  216. package/dist/Testing/testing-dashboard.component.js +122 -54
  217. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  218. package/dist/actions-dashboards.module.d.ts +8 -13
  219. package/dist/actions-dashboards.module.d.ts.map +1 -1
  220. package/dist/actions-dashboards.module.js +6 -27
  221. package/dist/actions-dashboards.module.js.map +1 -1
  222. package/dist/ai-dashboards.module.d.ts +14 -11
  223. package/dist/ai-dashboards.module.d.ts.map +1 -1
  224. package/dist/ai-dashboards.module.js +58 -44
  225. package/dist/ai-dashboards.module.js.map +1 -1
  226. package/dist/communication-dashboards.module.d.ts +4 -8
  227. package/dist/communication-dashboards.module.d.ts.map +1 -1
  228. package/dist/communication-dashboards.module.js +0 -19
  229. package/dist/communication-dashboards.module.js.map +1 -1
  230. package/dist/component-studio-dashboards.module.d.ts +7 -11
  231. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  232. package/dist/component-studio-dashboards.module.js +22 -34
  233. package/dist/component-studio-dashboards.module.js.map +1 -1
  234. package/dist/core-dashboards.module.d.ts +13 -18
  235. package/dist/core-dashboards.module.d.ts.map +1 -1
  236. package/dist/core-dashboards.module.js +18 -31
  237. package/dist/core-dashboards.module.js.map +1 -1
  238. package/dist/credentials-dashboards.module.d.ts +5 -8
  239. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  240. package/dist/credentials-dashboards.module.js +3 -19
  241. package/dist/credentials-dashboards.module.js.map +1 -1
  242. package/dist/data-explorer-dashboards.module.d.ts +7 -13
  243. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  244. package/dist/data-explorer-dashboards.module.js +0 -27
  245. package/dist/data-explorer-dashboards.module.js.map +1 -1
  246. package/dist/lists-dashboards.module.d.ts +5 -8
  247. package/dist/lists-dashboards.module.d.ts.map +1 -1
  248. package/dist/lists-dashboards.module.js +3 -19
  249. package/dist/lists-dashboards.module.js.map +1 -1
  250. package/dist/public-api.d.ts +5 -1
  251. package/dist/public-api.d.ts.map +1 -1
  252. package/dist/public-api.js +6 -1
  253. package/dist/public-api.js.map +1 -1
  254. package/dist/scheduling-dashboards.module.d.ts +6 -10
  255. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  256. package/dist/scheduling-dashboards.module.js +3 -23
  257. package/dist/scheduling-dashboards.module.js.map +1 -1
  258. package/dist/testing-dashboards.module.d.ts +7 -12
  259. package/dist/testing-dashboards.module.d.ts.map +1 -1
  260. package/dist/testing-dashboards.module.js +4 -27
  261. package/dist/testing-dashboards.module.js.map +1 -1
  262. package/package.json +47 -53
@@ -1,13 +1,19 @@
1
- import { OnInit, OnDestroy } from '@angular/core';
1
+ import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
2
2
  import { ResourceData } from '@memberjunction/core-entities';
3
3
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
4
+ import { TestingDialogService } from '@memberjunction/ng-testing';
4
5
  import * as i0 from "@angular/core";
5
6
  /**
6
7
  * Testing Dashboard Tab Resource - displays the main dashboard overview
7
8
  */
8
9
  export declare class TestingDashboardTabResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {
10
+ testingDialogService: TestingDialogService;
11
+ private cdr;
12
+ private destroy$;
13
+ constructor(testingDialogService: TestingDialogService, cdr: ChangeDetectorRef);
9
14
  ngOnInit(): void;
10
15
  ngOnDestroy(): void;
16
+ OnPanelClosed(): void;
11
17
  GetResourceDisplayName(data: ResourceData): Promise<string>;
12
18
  GetResourceIconClass(data: ResourceData): Promise<string>;
13
19
  static ɵfac: i0.ɵɵFactoryDeclaration<TestingDashboardTabResourceComponent, never>;
@@ -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,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;AAElE;;GAEG;AACH,qBAiBa,oCAAqC,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAE1G,QAAQ,IAAI,IAAI;IAIhB,WAAW,IAAI,IAAI;IAGb,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAbpD,oCAAoC;2CAApC,oCAAoC;CAgBhD"}
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;AAGzG,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;;GAEG;AACH,qBAmCa,oCAAqC,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAIjG,oBAAoB,EAAE,oBAAoB;IACjD,OAAO,CAAC,GAAG;IAJb,OAAO,CAAC,QAAQ,CAAuB;gBAG9B,oBAAoB,EAAE,oBAAoB,EACzC,GAAG,EAAE,iBAAiB;IAKhC,QAAQ,IAAI,IAAI;IAUhB,WAAW,IAAI,IAAI;IAKZ,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;yCAlCpD,oCAAoC;2CAApC,oCAAoC;CAqChD"}
@@ -4,19 +4,53 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { Component } from '@angular/core';
7
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
8
+ import { Subject } from 'rxjs';
9
+ import { takeUntil } from 'rxjs/operators';
8
10
  import { RegisterClass } from '@memberjunction/global';
9
11
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
10
12
  import * as i0 from "@angular/core";
11
- import * as i1 from "./testing-dashboard-tab.component";
13
+ import * as i1 from "@memberjunction/ng-testing";
14
+ import * as i2 from "@memberjunction/ng-versions";
15
+ import * as i3 from "./testing-dashboard-tab.component";
16
+ function TestingDashboardTabResourceComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
17
+ const _r1 = i0.ɵɵgetCurrentView();
18
+ i0.ɵɵelementStart(0, "mj-slide-panel", 2);
19
+ i0.ɵɵlistener("Closed", function TestingDashboardTabResourceComponent_Conditional_2_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", 3);
21
+ i0.ɵɵlistener("PanelClose", function TestingDashboardTabResourceComponent_Conditional_2_Template_app_test_run_dialog_PanelClose_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnPanelClosed()); });
22
+ i0.ɵɵelementEnd()();
23
+ } if (rf & 2) {
24
+ const ctx_r1 = i0.ɵɵnextContext();
25
+ i0.ɵɵproperty("Title", (ctx_r1.testingDialogService.PanelOptions == null ? null : ctx_r1.testingDialogService.PanelOptions.testId) ? "Test Execution" : "Run Test")("Resizable", true);
26
+ i0.ɵɵadvance();
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
+ } }
12
29
  /**
13
30
  * Testing Dashboard Tab Resource - displays the main dashboard overview
14
31
  */
15
32
  let TestingDashboardTabResourceComponent = class TestingDashboardTabResourceComponent extends BaseResourceComponent {
33
+ testingDialogService;
34
+ cdr;
35
+ destroy$ = new Subject();
36
+ constructor(testingDialogService, cdr) {
37
+ super();
38
+ this.testingDialogService = testingDialogService;
39
+ this.cdr = cdr;
40
+ }
16
41
  ngOnInit() {
42
+ this.testingDialogService.PanelStateChanged$.pipe(takeUntil(this.destroy$)).subscribe(() => {
43
+ this.cdr.detectChanges();
44
+ });
17
45
  this.NotifyLoadComplete();
18
46
  }
19
47
  ngOnDestroy() {
48
+ this.destroy$.next();
49
+ this.destroy$.complete();
50
+ }
51
+ OnPanelClosed() {
52
+ this.testingDialogService.ClosePanel();
53
+ this.cdr.markForCheck();
20
54
  }
21
55
  async GetResourceDisplayName(data) {
22
56
  return 'Overview';
@@ -24,12 +58,16 @@ let TestingDashboardTabResourceComponent = class TestingDashboardTabResourceComp
24
58
  async GetResourceIconClass(data) {
25
59
  return 'fa-solid fa-gauge-high';
26
60
  }
27
- static ɵfac = /*@__PURE__*/ (() => { let ɵTestingDashboardTabResourceComponent_BaseFactory; return function TestingDashboardTabResourceComponent_Factory(__ngFactoryType__) { return (ɵTestingDashboardTabResourceComponent_BaseFactory || (ɵTestingDashboardTabResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(TestingDashboardTabResourceComponent)))(__ngFactoryType__ || TestingDashboardTabResourceComponent); }; })();
28
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestingDashboardTabResourceComponent, selectors: [["mj-testing-dashboard-tab-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 0, consts: [[1, "resource-container"]], template: function TestingDashboardTabResourceComponent_Template(rf, ctx) { if (rf & 1) {
61
+ static ɵfac = function TestingDashboardTabResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TestingDashboardTabResourceComponent)(i0.ɵɵdirectiveInject(i1.TestingDialogService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
62
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestingDashboardTabResourceComponent, selectors: [["mj-testing-dashboard-tab-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [[1, "resource-container"], ["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) {
29
63
  i0.ɵɵelementStart(0, "div", 0);
30
64
  i0.ɵɵelement(1, "app-testing-dashboard-tab");
31
65
  i0.ɵɵelementEnd();
32
- } }, dependencies: [i1.TestingDashboardTabComponent], styles: [".resource-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n overflow: auto;\n }"] });
66
+ i0.ɵɵconditionalCreate(2, TestingDashboardTabResourceComponent_Conditional_2_Template, 2, 6, "mj-slide-panel", 1);
67
+ } if (rf & 2) {
68
+ i0.ɵɵadvance(2);
69
+ i0.ɵɵconditional(ctx.testingDialogService.IsPanelOpen ? 2 : -1);
70
+ } }, dependencies: [i1.TestRunDialogComponent, i2.MjSlidePanelComponent, i3.TestingDashboardTabComponent], styles: [".resource-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n overflow: auto;\n }"], changeDetection: 0 });
33
71
  };
34
72
  TestingDashboardTabResourceComponent = __decorate([
35
73
  RegisterClass(BaseResourceComponent, 'TestingDashboardTabResource')
@@ -37,11 +75,28 @@ TestingDashboardTabResourceComponent = __decorate([
37
75
  export { TestingDashboardTabResourceComponent };
38
76
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TestingDashboardTabResourceComponent, [{
39
77
  type: Component,
40
- args: [{ standalone: false, selector: 'mj-testing-dashboard-tab-resource', template: `
78
+ args: [{ standalone: false, selector: 'mj-testing-dashboard-tab-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: `
41
79
  <div class="resource-container">
42
80
  <app-testing-dashboard-tab></app-testing-dashboard-tab>
43
81
  </div>
82
+
83
+ <!-- Slide Panel for Test Execution -->
84
+ @if (testingDialogService.IsPanelOpen) {
85
+ <mj-slide-panel
86
+ Mode="slide"
87
+ [Title]="testingDialogService.PanelOptions?.testId ? 'Test Execution' : 'Run Test'"
88
+ [Resizable]="true"
89
+ (Closed)="OnPanelClosed()">
90
+ <app-test-run-dialog
91
+ [PanelMode]="true"
92
+ [selectedTestId]="testingDialogService.PanelOptions?.testId ?? null"
93
+ [selectedSuiteId]="testingDialogService.PanelOptions?.suiteId ?? null"
94
+ [runMode]="testingDialogService.PanelOptions?.mode ?? 'test'"
95
+ (PanelClose)="OnPanelClosed()">
96
+ </app-test-run-dialog>
97
+ </mj-slide-panel>
98
+ }
44
99
  `, styles: ["\n .resource-container {\n width: 100%;\n height: 100%;\n overflow: auto;\n }\n "] }]
45
- }], null, null); })();
46
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestingDashboardTabResourceComponent, { className: "TestingDashboardTabResourceComponent", filePath: "src/Testing/components/testing-dashboard-tab-resource.component.ts", lineNumber: 26 }); })();
100
+ }], () => [{ type: i1.TestingDialogService }, { type: i0.ChangeDetectorRef }], null); })();
101
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestingDashboardTabResourceComponent, { className: "TestingDashboardTabResourceComponent", filePath: "src/Testing/components/testing-dashboard-tab-resource.component.ts", lineNumber: 47 }); })();
47
102
  //# 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,EAAqB,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;;AAElE;;GAEG;AAkBI,IAAM,oCAAoC,GAA1C,MAAM,oCAAqC,SAAQ,qBAAqB;IAE7E,QAAQ;QACN,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,WAAW;IACX,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;6TAfU,oCAAoC,yBAApC,oCAAoC;6DAApC,oCAAoC;YAZ7C,8BAAgC;YAC9B,4CAAuD;YACzD,iBAAM;;;AAUG,oCAAoC;IAjBhD,aAAa,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;GAiBvD,oCAAoC,CAgBhD;;iFAhBY,oCAAoC;cAhBhD,SAAS;6BACI,KAAK,YACP,mCAAmC,YACnC;;;;GAIT;;kFASU,oCAAoC","sourcesContent":["import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\n\n/**\n * Testing Dashboard Tab Resource - displays the main dashboard overview\n */\n@RegisterClass(BaseResourceComponent, 'TestingDashboardTabResource')\n@Component({\n standalone: false,\n selector: 'mj-testing-dashboard-tab-resource',\n template: `\n <div class=\"resource-container\">\n <app-testing-dashboard-tab></app-testing-dashboard-tab>\n </div>\n `,\n styles: [`\n .resource-container {\n width: 100%;\n height: 100%;\n overflow: auto;\n }\n `]\n})\nexport class TestingDashboardTabResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n ngOnInit(): void {\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\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"]}
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;;;;;;;IAkB5D,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;;AAxBvE;;GAEG;AAoCI,IAAM,oCAAoC,GAA1C,MAAM,oCAAqC,SAAQ,qBAAqB;IAIpE;IACC;IAJF,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAEvC,YACS,oBAA0C,EACzC,GAAsB;QAE9B,KAAK,EAAE,CAAC;QAHD,yBAAoB,GAApB,oBAAoB,CAAsB;QACzC,QAAG,GAAH,GAAG,CAAmB;IAGhC,CAAC;IAED,QAAQ;QACN,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,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;8HApCU,oCAAoC;6DAApC,oCAAoC;YA7B7C,8BAAgC;YAC9B,4CAAuD;YACzD,iBAAM;YAGN,iHAAwC;;YAAxC,eAcC;YAdD,+DAcC;;;AAUQ,oCAAoC;IAnChD,aAAa,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;GAmCvD,oCAAoC,CAqChD;;iFArCY,oCAAoC;cAlChD,SAAS;6BACI,KAAK,YACP,mCAAmC,mBAC5B,uBAAuB,CAAC,MAAM,YACrC;;;;;;;;;;;;;;;;;;;;;GAqBT;;kFASU,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 - displays the main dashboard overview\n */\n@RegisterClass(BaseResourceComponent, 'TestingDashboardTabResource')\n@Component({\n standalone: false,\n selector: 'mj-testing-dashboard-tab-resource',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"resource-container\">\n <app-testing-dashboard-tab></app-testing-dashboard-tab>\n </div>\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: [`\n .resource-container {\n width: 100%;\n height: 100%;\n overflow: auto;\n }\n `]\n})\nexport class TestingDashboardTabResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject<void>();\n\n constructor(\n public testingDialogService: TestingDialogService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n ngOnInit(): void {\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 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"]}
@@ -1,6 +1,7 @@
1
1
  import { OnInit, OnDestroy, EventEmitter, ChangeDetectorRef } from '@angular/core';
2
2
  import { TestingInstrumentationService, TestRunSummary, SuiteHierarchyNode } from '../services/testing-instrumentation.service';
3
3
  import { KPICardData } from '../../AI/components/widgets/kpi-card.component';
4
+ import { TestingExecutionService, TestingDialogService } from '@memberjunction/ng-testing';
4
5
  import * as i0 from "@angular/core";
5
6
  /** Status type union matching TestRunSummary */
6
7
  type TestRunStatus = 'Passed' | 'Failed' | 'Skipped' | 'Error' | 'Running' | 'Timeout';
@@ -15,6 +16,8 @@ interface TestAlert {
15
16
  }
16
17
  export declare class TestingDashboardTabComponent implements OnInit, OnDestroy {
17
18
  private instrumentationService;
19
+ private executionService;
20
+ private testingDialogService;
18
21
  private cdr;
19
22
  initialState: Record<string, unknown> | null;
20
23
  stateChange: EventEmitter<Record<string, unknown>>;
@@ -26,10 +29,14 @@ export declare class TestingDashboardTabComponent implements OnInit, OnDestroy {
26
29
  RecentRuns: TestRunSummary[];
27
30
  SortedSuites: SuiteHierarchyNode[];
28
31
  Alerts: TestAlert[];
29
- constructor(instrumentationService: TestingInstrumentationService, cdr: ChangeDetectorRef);
32
+ private activeRunsMap;
33
+ constructor(instrumentationService: TestingInstrumentationService, executionService: TestingExecutionService, testingDialogService: TestingDialogService, cdr: ChangeDetectorRef);
30
34
  ngOnInit(): Promise<void>;
31
35
  ngOnDestroy(): void;
32
36
  OnRefresh(): void;
37
+ OnViewRunningTest(run: TestRunSummary): void;
38
+ GetActiveRunProgress(testId: string): number;
39
+ GetActiveRunStep(testId: string): string;
33
40
  OnOpenRun(run: TestRunSummary): void;
34
41
  OnOpenAlert(alert: TestAlert): void;
35
42
  FormatDuration(ms: number): string;
@@ -37,6 +44,7 @@ export declare class TestingDashboardTabComponent implements OnInit, OnDestroy {
37
44
  FormatCost(cost: number): string;
38
45
  GetPassRateColor(rate: number): string;
39
46
  private subscribeToStreams;
47
+ private subscribeActiveRuns;
40
48
  private subscribeLoading;
41
49
  private subscribeKpis;
42
50
  private subscribeTestRuns;
@@ -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;;AAG7E,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,qBAwhBa,4BAA6B,YAAW,MAAM,EAAE,SAAS;IAgBlE,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,GAAG;IAfJ,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAQ;IACnD,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;gBAGf,sBAAsB,EAAE,6BAA6B,EACrD,GAAG,EAAE,iBAAiB;IAO1B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,WAAW,IAAI,IAAI;IASnB,SAAS,IAAI,IAAI;IAIjB,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;IAO1B,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;yCAlRT,4BAA4B;2CAA5B,4BAA4B;CA0RxC"}
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,qBA+iBa,4BAA6B,YAAW,MAAM,EAAE,SAAS;IAkBlE,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,GAAG;IAnBJ,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAQ;IACnD,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;yCAlTT,4BAA4B;2CAA5B,4BAA4B;CA0TxC"}
@@ -40,26 +40,41 @@ function TestingDashboardTabComponent_Conditional_1_Conditional_14_Template(rf,
40
40
  i0.ɵɵelementEnd();
41
41
  } }
42
42
  function TestingDashboardTabComponent_Conditional_1_Conditional_15_For_2_Template(rf, ctx) { if (rf & 1) {
43
- i0.ɵɵelementStart(0, "div", 30)(1, "div", 31);
44
- i0.ɵɵtext(2);
43
+ const _r4 = i0.ɵɵgetCurrentView();
44
+ i0.ɵɵelementStart(0, "div", 31);
45
+ i0.ɵɵlistener("click", function TestingDashboardTabComponent_Conditional_1_Conditional_15_For_2_Template_div_click_0_listener() { const run_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnViewRunningTest(run_r5)); });
46
+ i0.ɵɵelementStart(1, "div", 32)(2, "div", 33);
47
+ i0.ɵɵtext(3);
45
48
  i0.ɵɵelementEnd();
46
- i0.ɵɵelementStart(3, "div", 32)(4, "span", 33);
49
+ i0.ɵɵelementStart(4, "div", 34);
47
50
  i0.ɵɵtext(5);
51
+ i0.ɵɵelementEnd()();
52
+ i0.ɵɵelementStart(6, "div", 35)(7, "span", 36);
53
+ i0.ɵɵtext(8);
48
54
  i0.ɵɵelementEnd();
49
- i0.ɵɵelementStart(6, "span", 34);
50
- i0.ɵɵelement(7, "span", 35);
55
+ i0.ɵɵelementStart(9, "span", 37);
56
+ i0.ɵɵelement(10, "span", 38);
57
+ i0.ɵɵelementEnd();
58
+ i0.ɵɵelementStart(11, "span", 39);
59
+ i0.ɵɵtext(12);
51
60
  i0.ɵɵelementEnd()()();
52
61
  } if (rf & 2) {
53
- const run_r4 = ctx.$implicit;
62
+ const run_r5 = ctx.$implicit;
54
63
  const ctx_r1 = i0.ɵɵnextContext(3);
64
+ i0.ɵɵadvance(3);
65
+ i0.ɵɵtextInterpolate(run_r5.testName);
55
66
  i0.ɵɵadvance(2);
56
- i0.ɵɵtextInterpolate(run_r4.testName);
67
+ i0.ɵɵtextInterpolate(ctx_r1.GetActiveRunStep(run_r5.testId));
57
68
  i0.ɵɵadvance(3);
58
- i0.ɵɵtextInterpolate(ctx_r1.FormatDuration(run_r4.duration));
69
+ i0.ɵɵtextInterpolate(ctx_r1.FormatDuration(run_r5.duration));
70
+ i0.ɵɵadvance(2);
71
+ i0.ɵɵstyleProp("width", ctx_r1.GetActiveRunProgress(run_r5.testId), "%");
72
+ i0.ɵɵadvance(2);
73
+ i0.ɵɵtextInterpolate1("", ctx_r1.GetActiveRunProgress(run_r5.testId), "%");
59
74
  } }
60
75
  function TestingDashboardTabComponent_Conditional_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
61
76
  i0.ɵɵelementStart(0, "div", 12);
62
- i0.ɵɵrepeaterCreate(1, TestingDashboardTabComponent_Conditional_1_Conditional_15_For_2_Template, 8, 2, "div", 30, _forTrack1);
77
+ i0.ɵɵrepeaterCreate(1, TestingDashboardTabComponent_Conditional_1_Conditional_15_For_2_Template, 13, 6, "div", 30, _forTrack1);
63
78
  i0.ɵɵelementEnd();
64
79
  } if (rf & 2) {
65
80
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -67,37 +82,37 @@ function TestingDashboardTabComponent_Conditional_1_Conditional_15_Template(rf,
67
82
  i0.ɵɵrepeater(ctx_r1.RunningTests);
68
83
  } }
69
84
  function TestingDashboardTabComponent_Conditional_1_For_24_Template(rf, ctx) { if (rf & 1) {
70
- const _r5 = i0.ɵɵgetCurrentView();
71
- i0.ɵɵelementStart(0, "div", 36);
72
- i0.ɵɵlistener("click", function TestingDashboardTabComponent_Conditional_1_For_24_Template_div_click_0_listener() { const run_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnOpenRun(run_r6)); });
73
- i0.ɵɵelementStart(1, "div", 37)(2, "span", 38);
85
+ const _r6 = i0.ɵɵgetCurrentView();
86
+ i0.ɵɵelementStart(0, "div", 40);
87
+ i0.ɵɵlistener("click", function TestingDashboardTabComponent_Conditional_1_For_24_Template_div_click_0_listener() { const run_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnOpenRun(run_r7)); });
88
+ i0.ɵɵelementStart(1, "div", 41)(2, "span", 42);
74
89
  i0.ɵɵtext(3);
75
90
  i0.ɵɵelementEnd();
76
- i0.ɵɵelementStart(4, "span", 39);
91
+ i0.ɵɵelementStart(4, "span", 43);
77
92
  i0.ɵɵtext(5);
78
93
  i0.ɵɵelementEnd()();
79
- i0.ɵɵelementStart(6, "div", 40);
80
- i0.ɵɵelement(7, "app-test-status-badge", 41)(8, "app-score-indicator", 42);
81
- i0.ɵɵelementStart(9, "span", 43);
94
+ i0.ɵɵelementStart(6, "div", 44);
95
+ i0.ɵɵelement(7, "app-test-status-badge", 45)(8, "app-score-indicator", 46);
96
+ i0.ɵɵelementStart(9, "span", 47);
82
97
  i0.ɵɵtext(10);
83
98
  i0.ɵɵelementEnd();
84
- i0.ɵɵelement(11, "app-cost-display", 44);
99
+ i0.ɵɵelement(11, "app-cost-display", 48);
85
100
  i0.ɵɵelementEnd()();
86
101
  } if (rf & 2) {
87
- const run_r6 = ctx.$implicit;
102
+ const run_r7 = ctx.$implicit;
88
103
  const ctx_r1 = i0.ɵɵnextContext(2);
89
104
  i0.ɵɵadvance(3);
90
- i0.ɵɵtextInterpolate(run_r6.testName);
105
+ i0.ɵɵtextInterpolate(run_r7.testName);
91
106
  i0.ɵɵadvance(2);
92
- i0.ɵɵtextInterpolate(ctx_r1.FormatTimestamp(run_r6.runDateTime));
107
+ i0.ɵɵtextInterpolate(ctx_r1.FormatTimestamp(run_r7.runDateTime));
93
108
  i0.ɵɵadvance(2);
94
- i0.ɵɵproperty("status", run_r6.status);
109
+ i0.ɵɵproperty("status", run_r7.status);
95
110
  i0.ɵɵadvance();
96
- i0.ɵɵproperty("score", run_r6.score)("showBar", true);
111
+ i0.ɵɵproperty("score", run_r7.score)("showBar", true);
97
112
  i0.ɵɵadvance(2);
98
- i0.ɵɵtextInterpolate(ctx_r1.FormatDuration(run_r6.duration));
113
+ i0.ɵɵtextInterpolate(ctx_r1.FormatDuration(run_r7.duration));
99
114
  i0.ɵɵadvance();
100
- i0.ɵɵproperty("cost", run_r6.cost);
115
+ i0.ɵɵproperty("cost", run_r7.cost);
101
116
  } }
102
117
  function TestingDashboardTabComponent_Conditional_1_ForEmpty_25_Template(rf, ctx) { if (rf & 1) {
103
118
  i0.ɵɵelementStart(0, "div", 18);
@@ -105,32 +120,32 @@ function TestingDashboardTabComponent_Conditional_1_ForEmpty_25_Template(rf, ctx
105
120
  i0.ɵɵelementEnd();
106
121
  } }
107
122
  function TestingDashboardTabComponent_Conditional_1_For_34_Template(rf, ctx) { if (rf & 1) {
108
- i0.ɵɵelementStart(0, "div", 23)(1, "div", 45)(2, "span", 46);
123
+ i0.ɵɵelementStart(0, "div", 23)(1, "div", 49)(2, "span", 50);
109
124
  i0.ɵɵtext(3);
110
125
  i0.ɵɵelementEnd();
111
- i0.ɵɵelementStart(4, "span", 47);
126
+ i0.ɵɵelementStart(4, "span", 51);
112
127
  i0.ɵɵtext(5);
113
128
  i0.ɵɵelementEnd()();
114
- i0.ɵɵelementStart(6, "div", 48)(7, "div", 49);
115
- i0.ɵɵelement(8, "div", 50);
129
+ i0.ɵɵelementStart(6, "div", 52)(7, "div", 53);
130
+ i0.ɵɵelement(8, "div", 54);
116
131
  i0.ɵɵelementEnd();
117
- i0.ɵɵelementStart(9, "span", 51);
132
+ i0.ɵɵelementStart(9, "span", 55);
118
133
  i0.ɵɵtext(10);
119
134
  i0.ɵɵpipe(11, "number");
120
135
  i0.ɵɵelementEnd()()();
121
136
  } if (rf & 2) {
122
- const suite_r7 = ctx.$implicit;
137
+ const suite_r8 = ctx.$implicit;
123
138
  const ctx_r1 = i0.ɵɵnextContext(2);
124
139
  i0.ɵɵadvance(3);
125
- i0.ɵɵtextInterpolate(suite_r7.name);
140
+ i0.ɵɵtextInterpolate(suite_r8.name);
126
141
  i0.ɵɵadvance(2);
127
- i0.ɵɵtextInterpolate1("", suite_r7.testCount, " tests");
142
+ i0.ɵɵtextInterpolate1("", suite_r8.testCount, " tests");
128
143
  i0.ɵɵadvance(3);
129
- i0.ɵɵstyleProp("width", suite_r7.passRate, "%")("background", ctx_r1.GetPassRateColor(suite_r7.passRate));
144
+ i0.ɵɵstyleProp("width", suite_r8.passRate, "%")("background", ctx_r1.GetPassRateColor(suite_r8.passRate));
130
145
  i0.ɵɵadvance();
131
- i0.ɵɵstyleProp("color", ctx_r1.GetPassRateColor(suite_r7.passRate));
146
+ i0.ɵɵstyleProp("color", ctx_r1.GetPassRateColor(suite_r8.passRate));
132
147
  i0.ɵɵadvance();
133
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(11, 9, suite_r7.passRate, "1.0-0"), "% ");
148
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(11, 9, suite_r8.passRate, "1.0-0"), "% ");
134
149
  } }
135
150
  function TestingDashboardTabComponent_Conditional_1_ForEmpty_35_Template(rf, ctx) { if (rf & 1) {
136
151
  i0.ɵɵelementStart(0, "div", 18);
@@ -144,37 +159,37 @@ function TestingDashboardTabComponent_Conditional_1_For_43_Conditional_7_Templat
144
159
  i0.ɵɵtext(0);
145
160
  i0.ɵɵpipe(1, "number");
146
161
  } if (rf & 2) {
147
- const alert_r9 = i0.ɵɵnextContext().$implicit;
148
- i0.ɵɵtextInterpolate1(" Score below 0.5 (", i0.ɵɵpipeBind2(1, 1, alert_r9.score, "1.2-2"), ") ");
162
+ const alert_r10 = i0.ɵɵnextContext().$implicit;
163
+ i0.ɵɵtextInterpolate1(" Score below 0.5 (", i0.ɵɵpipeBind2(1, 1, alert_r10.score, "1.2-2"), ") ");
149
164
  } }
150
165
  function TestingDashboardTabComponent_Conditional_1_For_43_Template(rf, ctx) { if (rf & 1) {
151
- const _r8 = i0.ɵɵgetCurrentView();
152
- i0.ɵɵelementStart(0, "div", 52);
153
- i0.ɵɵlistener("click", function TestingDashboardTabComponent_Conditional_1_For_43_Template_div_click_0_listener() { const alert_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnOpenAlert(alert_r9)); });
154
- i0.ɵɵelement(1, "i", 53);
155
- i0.ɵɵelementStart(2, "div", 54)(3, "span", 55);
166
+ const _r9 = i0.ɵɵgetCurrentView();
167
+ i0.ɵɵelementStart(0, "div", 56);
168
+ i0.ɵɵlistener("click", function TestingDashboardTabComponent_Conditional_1_For_43_Template_div_click_0_listener() { const alert_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnOpenAlert(alert_r10)); });
169
+ i0.ɵɵelement(1, "i", 57);
170
+ i0.ɵɵelementStart(2, "div", 58)(3, "span", 59);
156
171
  i0.ɵɵtext(4);
157
172
  i0.ɵɵelementEnd();
158
- i0.ɵɵelementStart(5, "span", 56);
173
+ i0.ɵɵelementStart(5, "span", 60);
159
174
  i0.ɵɵconditionalCreate(6, TestingDashboardTabComponent_Conditional_1_For_43_Conditional_6_Template, 1, 0)(7, TestingDashboardTabComponent_Conditional_1_For_43_Conditional_7_Template, 2, 4);
160
175
  i0.ɵɵelementEnd()();
161
- i0.ɵɵelement(8, "app-test-status-badge", 41);
176
+ i0.ɵɵelement(8, "app-test-status-badge", 45);
162
177
  i0.ɵɵelementEnd();
163
178
  } if (rf & 2) {
164
- const alert_r9 = ctx.$implicit;
179
+ const alert_r10 = ctx.$implicit;
165
180
  i0.ɵɵadvance();
166
- i0.ɵɵstyleProp("color", alert_r9.reason === "regression" ? "#ef4444" : "#f59e0b");
167
- i0.ɵɵclassProp("fa-arrow-trend-down", alert_r9.reason === "regression")("fa-circle-exclamation", alert_r9.reason === "low-score");
181
+ i0.ɵɵstyleProp("color", alert_r10.reason === "regression" ? "#ef4444" : "#f59e0b");
182
+ i0.ɵɵclassProp("fa-arrow-trend-down", alert_r10.reason === "regression")("fa-circle-exclamation", alert_r10.reason === "low-score");
168
183
  i0.ɵɵadvance(3);
169
- i0.ɵɵtextInterpolate(alert_r9.testName);
184
+ i0.ɵɵtextInterpolate(alert_r10.testName);
170
185
  i0.ɵɵadvance(2);
171
- i0.ɵɵconditional(alert_r9.reason === "regression" ? 6 : 7);
186
+ i0.ɵɵconditional(alert_r10.reason === "regression" ? 6 : 7);
172
187
  i0.ɵɵadvance(2);
173
- i0.ɵɵproperty("status", alert_r9.status);
188
+ i0.ɵɵproperty("status", alert_r10.status);
174
189
  } }
175
190
  function TestingDashboardTabComponent_Conditional_1_ForEmpty_44_Template(rf, ctx) { if (rf & 1) {
176
191
  i0.ɵɵelementStart(0, "div", 18);
177
- i0.ɵɵelement(1, "i", 57);
192
+ i0.ɵɵelement(1, "i", 61);
178
193
  i0.ɵɵtext(2, " No alerts - all tests healthy ");
179
194
  i0.ɵɵelementEnd();
180
195
  } }
@@ -239,6 +254,8 @@ function TestingDashboardTabComponent_Conditional_1_Template(rf, ctx) { if (rf &
239
254
  } }
240
255
  export class TestingDashboardTabComponent {
241
256
  instrumentationService;
257
+ executionService;
258
+ testingDialogService;
242
259
  cdr;
243
260
  initialState = null;
244
261
  stateChange = new EventEmitter();
@@ -250,8 +267,11 @@ export class TestingDashboardTabComponent {
250
267
  RecentRuns = [];
251
268
  SortedSuites = [];
252
269
  Alerts = [];
253
- constructor(instrumentationService, cdr) {
270
+ activeRunsMap = new Map();
271
+ constructor(instrumentationService, executionService, testingDialogService, cdr) {
254
272
  this.instrumentationService = instrumentationService;
273
+ this.executionService = executionService;
274
+ this.testingDialogService = testingDialogService;
255
275
  this.cdr = cdr;
256
276
  }
257
277
  // ---------------------------------------------------------------------------
@@ -272,6 +292,19 @@ export class TestingDashboardTabComponent {
272
292
  OnRefresh() {
273
293
  this.instrumentationService.refresh();
274
294
  }
295
+ OnViewRunningTest(run) {
296
+ this.testingDialogService.OpenTestMonitor(run.testId);
297
+ }
298
+ GetActiveRunProgress(testId) {
299
+ return this.activeRunsMap.get(testId)?.Progress ?? 0;
300
+ }
301
+ GetActiveRunStep(testId) {
302
+ const step = this.activeRunsMap.get(testId)?.CurrentStep ?? '';
303
+ // Hide raw internal step identifiers (e.g. "driver_log", "loading_test")
304
+ if (step.includes('_'))
305
+ return '';
306
+ return step;
307
+ }
275
308
  OnOpenRun(run) {
276
309
  SharedService.Instance.OpenEntityRecord('MJ: Test Runs', CompositeKey.FromID(run.id));
277
310
  }
@@ -325,6 +358,16 @@ export class TestingDashboardTabComponent {
325
358
  this.subscribeKpis();
326
359
  this.subscribeTestRuns();
327
360
  this.subscribeSuites();
361
+ this.subscribeActiveRuns();
362
+ }
363
+ subscribeActiveRuns() {
364
+ this.executionService.ActiveRuns$.pipe(takeUntil(this.destroy$)).subscribe(runs => {
365
+ this.activeRunsMap.clear();
366
+ for (const run of runs) {
367
+ this.activeRunsMap.set(run.TestId, run);
368
+ }
369
+ this.cdr.markForCheck();
370
+ });
328
371
  }
329
372
  subscribeLoading() {
330
373
  this.instrumentationService.isLoading$.pipe(takeUntil(this.destroy$)).subscribe(loading => {
@@ -474,12 +517,12 @@ export class TestingDashboardTabComponent {
474
517
  }
475
518
  }
476
519
  }
477
- static ɵfac = function TestingDashboardTabComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TestingDashboardTabComponent)(i0.ɵɵdirectiveInject(i1.TestingInstrumentationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
478
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestingDashboardTabComponent, selectors: [["app-testing-dashboard-tab"]], inputs: { initialState: "initialState" }, outputs: { stateChange: "stateChange" }, standalone: false, decls: 2, vars: 1, consts: [[1, "full-page-loading"], [1, "dashboard-container"], ["text", "Loading Testing Dashboard..."], [1, "page-header"], [1, "page-title"], [1, "fa-solid", "fa-gauge-high"], [1, "refresh-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-refresh"], [1, "kpi-row"], [3, "data"], [1, "live-activity-card"], [1, "section-header"], [1, "running-tests-list"], [1, "lower-grid"], [1, "card", "recent-runs-card"], [1, "fa-solid", "fa-history"], [1, "runs-list"], [1, "run-row"], [1, "empty-state"], [1, "right-column"], [1, "card", "suite-health-card"], [1, "fa-solid", "fa-heartbeat"], [1, "suite-health-list"], [1, "suite-health-row"], [1, "card", "alerts-card"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "alerts-list"], [1, "alert-row"], [1, "live-dot"], [1, "fa-solid", "fa-circle-pause", "live-idle-icon"], [1, "running-test-item"], [1, "running-test-name"], [1, "running-test-meta"], [1, "running-elapsed"], [1, "running-progress-bar"], [1, "running-progress-fill"], [1, "run-row", 3, "click"], [1, "run-row-left"], [1, "run-row-name"], [1, "run-row-time"], [1, "run-row-right"], [3, "status"], [3, "score", "showBar"], [1, "run-row-duration"], [3, "cost"], [1, "suite-health-info"], [1, "suite-health-name"], [1, "suite-health-count"], [1, "suite-health-bar-wrapper"], [1, "suite-health-bar"], [1, "suite-health-bar-fill"], [1, "suite-health-pct"], [1, "alert-row", 3, "click"], [1, "fa-solid"], [1, "alert-info"], [1, "alert-name"], [1, "alert-reason"], [1, "fa-solid", "fa-check-circle", 2, "color", "var(--mj-status-success)", "margin-right", "6px"]], template: function TestingDashboardTabComponent_Template(rf, ctx) { if (rf & 1) {
520
+ static ɵfac = function TestingDashboardTabComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TestingDashboardTabComponent)(i0.ɵɵdirectiveInject(i1.TestingInstrumentationService), i0.ɵɵdirectiveInject(i2.TestingExecutionService), i0.ɵɵdirectiveInject(i2.TestingDialogService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
521
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestingDashboardTabComponent, selectors: [["app-testing-dashboard-tab"]], inputs: { initialState: "initialState" }, outputs: { stateChange: "stateChange" }, standalone: false, decls: 2, vars: 1, consts: [[1, "full-page-loading"], [1, "dashboard-container"], ["text", "Loading Testing Dashboard..."], [1, "page-header"], [1, "page-title"], [1, "fa-solid", "fa-gauge-high"], [1, "refresh-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-refresh"], [1, "kpi-row"], [3, "data"], [1, "live-activity-card"], [1, "section-header"], [1, "running-tests-list"], [1, "lower-grid"], [1, "card", "recent-runs-card"], [1, "fa-solid", "fa-history"], [1, "runs-list"], [1, "run-row"], [1, "empty-state"], [1, "right-column"], [1, "card", "suite-health-card"], [1, "fa-solid", "fa-heartbeat"], [1, "suite-health-list"], [1, "suite-health-row"], [1, "card", "alerts-card"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "alerts-list"], [1, "alert-row"], [1, "live-dot"], [1, "fa-solid", "fa-circle-pause", "live-idle-icon"], [1, "running-test-item"], [1, "running-test-item", 3, "click"], [1, "running-test-info"], [1, "running-test-name"], [1, "running-test-step"], [1, "running-test-meta"], [1, "running-elapsed"], [1, "running-progress-bar"], [1, "running-progress-fill"], [1, "running-progress-pct"], [1, "run-row", 3, "click"], [1, "run-row-left"], [1, "run-row-name"], [1, "run-row-time"], [1, "run-row-right"], [3, "status"], [3, "score", "showBar"], [1, "run-row-duration"], [3, "cost"], [1, "suite-health-info"], [1, "suite-health-name"], [1, "suite-health-count"], [1, "suite-health-bar-wrapper"], [1, "suite-health-bar"], [1, "suite-health-bar-fill"], [1, "suite-health-pct"], [1, "alert-row", 3, "click"], [1, "fa-solid"], [1, "alert-info"], [1, "alert-name"], [1, "alert-reason"], [1, "fa-solid", "fa-check-circle", 2, "color", "var(--mj-status-success)", "margin-right", "6px"]], template: function TestingDashboardTabComponent_Template(rf, ctx) { if (rf & 1) {
479
522
  i0.ɵɵconditionalCreate(0, TestingDashboardTabComponent_Conditional_0_Template, 2, 0, "div", 0)(1, TestingDashboardTabComponent_Conditional_1_Template, 45, 8, "div", 1);
480
523
  } if (rf & 2) {
481
524
  i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
482
- } }, dependencies: [i2.TestStatusBadgeComponent, i2.ScoreIndicatorComponent, i2.CostDisplayComponent, i3.LoadingComponent, i4.KPICardComponent, i5.DecimalPipe], styles: ["\n\n .full-page-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n min-height: 400px;\n background: var(--mj-bg-surface-card);\n }\n\n .dashboard-container[_ngcontent-%COMP%] {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n }\n\n \n\n .page-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 24px;\n }\n\n .page-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .page-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n .refresh-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 8px 18px;\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: background 0.2s ease;\n }\n\n .refresh-btn[_ngcontent-%COMP%]:hover:not(:disabled) { background: var(--mj-brand-primary-hover); }\n .refresh-btn[_ngcontent-%COMP%]:disabled { opacity: 0.6; cursor: not-allowed; }\n .refresh-btn[_ngcontent-%COMP%] i.spinning[_ngcontent-%COMP%] { animation: _ngcontent-%COMP%_spin 1s linear infinite; }\n\n @keyframes _ngcontent-%COMP%_spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n \n\n .kpi-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 16px;\n margin-bottom: 24px;\n }\n\n \n\n .card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n }\n\n .section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); font-size: 13px; }\n\n \n\n .live-activity-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n margin-bottom: 24px;\n overflow: hidden;\n }\n\n .live-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n background: var(--mj-status-success);\n border-radius: 50%;\n display: inline-block;\n animation: _ngcontent-%COMP%_pulse-dot 1.5s ease-in-out infinite;\n }\n\n @keyframes _ngcontent-%COMP%_pulse-dot {\n 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-status-success) 50%, transparent); }\n 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-status-success) 0%, transparent); }\n }\n\n .live-idle-icon[_ngcontent-%COMP%] { color: var(--mj-text-disabled); font-size: 14px; }\n\n .running-tests-list[_ngcontent-%COMP%] {\n padding: 0 20px 16px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .running-test-item[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 25%, var(--mj-bg-surface));\n }\n\n .running-test-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-status-success);\n }\n\n .running-test-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .running-elapsed[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-status-success);\n font-weight: 500;\n }\n\n .running-progress-bar[_ngcontent-%COMP%] {\n width: 60px;\n height: 4px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 2px;\n overflow: hidden;\n }\n\n .running-progress-fill[_ngcontent-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n background: var(--mj-status-success);\n animation: _ngcontent-%COMP%_progress-slide 1.2s ease-in-out infinite;\n border-radius: 2px;\n }\n\n @keyframes _ngcontent-%COMP%_progress-slide {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(100%); }\n }\n\n \n\n .lower-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n\n .right-column[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n \n\n .runs-list[_ngcontent-%COMP%] {\n max-height: 520px;\n overflow-y: auto;\n }\n\n .run-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .run-row[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-card); }\n\n .run-row-left[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .run-row-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .run-row-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n .run-row-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .run-row-duration[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n min-width: 44px;\n text-align: right;\n }\n\n \n\n .suite-health-list[_ngcontent-%COMP%] {\n padding: 8px 0;\n max-height: 260px;\n overflow-y: auto;\n }\n\n .suite-health-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n }\n\n .suite-health-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .suite-health-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .suite-health-count[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n .suite-health-bar-wrapper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .suite-health-bar[_ngcontent-%COMP%] {\n width: 80px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n }\n\n .suite-health-bar-fill[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 3px;\n transition: width 0.3s ease;\n }\n\n .suite-health-pct[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n min-width: 36px;\n text-align: right;\n }\n\n \n\n .alerts-list[_ngcontent-%COMP%] {\n max-height: 220px;\n overflow-y: auto;\n }\n\n .alert-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .alert-row[_ngcontent-%COMP%]:hover { background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface)); }\n\n .alert-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .alert-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .alert-reason[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n \n\n .empty-state[_ngcontent-%COMP%] {\n padding: 32px 20px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n \n\n @media (max-width: 900px) {\n .lower-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n }\n\n @media (max-width: 640px) {\n .dashboard-container[_ngcontent-%COMP%] { padding: 16px; }\n .kpi-row[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n }"], changeDetection: 0 });
525
+ } }, dependencies: [i2.TestStatusBadgeComponent, i2.ScoreIndicatorComponent, i2.CostDisplayComponent, i3.LoadingComponent, i4.KPICardComponent, i5.DecimalPipe], styles: ["\n\n .full-page-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n min-height: 400px;\n background: var(--mj-bg-surface-card);\n }\n\n .dashboard-container[_ngcontent-%COMP%] {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n }\n\n \n\n .page-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 24px;\n }\n\n .page-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .page-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n .refresh-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 8px 18px;\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: background 0.2s ease;\n }\n\n .refresh-btn[_ngcontent-%COMP%]:hover:not(:disabled) { background: var(--mj-brand-primary-hover); }\n .refresh-btn[_ngcontent-%COMP%]:disabled { opacity: 0.6; cursor: not-allowed; }\n .refresh-btn[_ngcontent-%COMP%] i.spinning[_ngcontent-%COMP%] { animation: _ngcontent-%COMP%_spin 1s linear infinite; }\n\n @keyframes _ngcontent-%COMP%_spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n \n\n .kpi-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 16px;\n margin-bottom: 24px;\n }\n\n \n\n .card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n }\n\n .section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); font-size: 13px; }\n\n \n\n .live-activity-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n margin-bottom: 24px;\n overflow: hidden;\n }\n\n .live-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n background: var(--mj-status-success);\n border-radius: 50%;\n display: inline-block;\n animation: _ngcontent-%COMP%_pulse-dot 1.5s ease-in-out infinite;\n }\n\n @keyframes _ngcontent-%COMP%_pulse-dot {\n 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-status-success) 50%, transparent); }\n 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-status-success) 0%, transparent); }\n }\n\n .live-idle-icon[_ngcontent-%COMP%] { color: var(--mj-text-disabled); font-size: 14px; }\n\n .running-tests-list[_ngcontent-%COMP%] {\n padding: 0 20px 16px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .running-test-item[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 25%, var(--mj-bg-surface));\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .running-test-item[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-success) 16%, var(--mj-bg-surface));\n }\n\n .running-test-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .running-test-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-status-success);\n }\n\n .running-test-step[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .running-test-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .running-elapsed[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-status-success);\n font-weight: 500;\n }\n\n .running-progress-bar[_ngcontent-%COMP%] {\n width: 80px;\n height: 4px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 2px;\n overflow: hidden;\n }\n\n .running-progress-fill[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n background: var(--mj-status-success);\n border-radius: 2px;\n transition: width 0.5s ease;\n }\n\n .running-progress-pct[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-status-success);\n min-width: 30px;\n text-align: right;\n }\n\n \n\n .lower-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n\n .right-column[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n \n\n .runs-list[_ngcontent-%COMP%] {\n max-height: 520px;\n overflow-y: auto;\n }\n\n .run-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .run-row[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-card); }\n\n .run-row-left[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .run-row-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .run-row-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n .run-row-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .run-row-duration[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n min-width: 44px;\n text-align: right;\n }\n\n \n\n .suite-health-list[_ngcontent-%COMP%] {\n padding: 8px 0;\n max-height: 260px;\n overflow-y: auto;\n }\n\n .suite-health-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n }\n\n .suite-health-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .suite-health-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .suite-health-count[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n .suite-health-bar-wrapper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .suite-health-bar[_ngcontent-%COMP%] {\n width: 80px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n }\n\n .suite-health-bar-fill[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 3px;\n transition: width 0.3s ease;\n }\n\n .suite-health-pct[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n min-width: 36px;\n text-align: right;\n }\n\n \n\n .alerts-list[_ngcontent-%COMP%] {\n max-height: 220px;\n overflow-y: auto;\n }\n\n .alert-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .alert-row[_ngcontent-%COMP%]:hover { background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface)); }\n\n .alert-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .alert-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .alert-reason[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n \n\n .empty-state[_ngcontent-%COMP%] {\n padding: 32px 20px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n \n\n @media (max-width: 900px) {\n .lower-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n }\n\n @media (max-width: 640px) {\n .dashboard-container[_ngcontent-%COMP%] { padding: 16px; }\n .kpi-row[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n }"], changeDetection: 0 });
483
526
  }
484
527
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TestingDashboardTabComponent, [{
485
528
  type: Component,
@@ -525,13 +568,17 @@ export class TestingDashboardTabComponent {
525
568
  @if (RunningTests.length > 0) {
526
569
  <div class="running-tests-list">
527
570
  @for (run of RunningTests; track run.id) {
528
- <div class="running-test-item">
529
- <div class="running-test-name">{{ run.testName }}</div>
571
+ <div class="running-test-item" (click)="OnViewRunningTest(run)">
572
+ <div class="running-test-info">
573
+ <div class="running-test-name">{{ run.testName }}</div>
574
+ <div class="running-test-step">{{ GetActiveRunStep(run.testId) }}</div>
575
+ </div>
530
576
  <div class="running-test-meta">
531
577
  <span class="running-elapsed">{{ FormatDuration(run.duration) }}</span>
532
578
  <span class="running-progress-bar">
533
- <span class="running-progress-fill"></span>
579
+ <span class="running-progress-fill" [style.width.%]="GetActiveRunProgress(run.testId)"></span>
534
580
  </span>
581
+ <span class="running-progress-pct">{{ GetActiveRunProgress(run.testId) }}%</span>
535
582
  </div>
536
583
  </div>
537
584
  }
@@ -639,11 +686,11 @@ export class TestingDashboardTabComponent {
639
686
  </div>
640
687
  </div>
641
688
  }
642
- `, styles: ["\n /* ===== Layout ===== */\n .full-page-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n min-height: 400px;\n background: var(--mj-bg-surface-card);\n }\n\n .dashboard-container {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n }\n\n /* ===== Page Header ===== */\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 24px;\n }\n\n .page-title {\n margin: 0;\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .page-title i { color: var(--mj-brand-primary); }\n\n .refresh-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 8px 18px;\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: background 0.2s ease;\n }\n\n .refresh-btn:hover:not(:disabled) { background: var(--mj-brand-primary-hover); }\n .refresh-btn:disabled { opacity: 0.6; cursor: not-allowed; }\n .refresh-btn i.spinning { animation: spin 1s linear infinite; }\n\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n /* ===== KPI Row ===== */\n .kpi-row {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 16px;\n margin-bottom: 24px;\n }\n\n /* ===== Card Base ===== */\n .card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n }\n\n .section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .section-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-header h3 i { color: var(--mj-brand-primary); font-size: 13px; }\n\n /* ===== Live Activity ===== */\n .live-activity-card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n margin-bottom: 24px;\n overflow: hidden;\n }\n\n .live-dot {\n width: 10px;\n height: 10px;\n background: var(--mj-status-success);\n border-radius: 50%;\n display: inline-block;\n animation: pulse-dot 1.5s ease-in-out infinite;\n }\n\n @keyframes pulse-dot {\n 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-status-success) 50%, transparent); }\n 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-status-success) 0%, transparent); }\n }\n\n .live-idle-icon { color: var(--mj-text-disabled); font-size: 14px; }\n\n .running-tests-list {\n padding: 0 20px 16px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .running-test-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 25%, var(--mj-bg-surface));\n }\n\n .running-test-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-status-success);\n }\n\n .running-test-meta {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .running-elapsed {\n font-size: 12px;\n color: var(--mj-status-success);\n font-weight: 500;\n }\n\n .running-progress-bar {\n width: 60px;\n height: 4px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 2px;\n overflow: hidden;\n }\n\n .running-progress-fill {\n display: block;\n width: 100%;\n height: 100%;\n background: var(--mj-status-success);\n animation: progress-slide 1.2s ease-in-out infinite;\n border-radius: 2px;\n }\n\n @keyframes progress-slide {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(100%); }\n }\n\n /* ===== Lower Grid ===== */\n .lower-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n\n .right-column {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n /* ===== Recent Runs ===== */\n .runs-list {\n max-height: 520px;\n overflow-y: auto;\n }\n\n .run-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .run-row:hover { background: var(--mj-bg-surface-card); }\n\n .run-row-left {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .run-row-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .run-row-time {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n .run-row-right {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .run-row-duration {\n font-size: 11px;\n color: var(--mj-text-muted);\n min-width: 44px;\n text-align: right;\n }\n\n /* ===== Suite Health ===== */\n .suite-health-list {\n padding: 8px 0;\n max-height: 260px;\n overflow-y: auto;\n }\n\n .suite-health-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n }\n\n .suite-health-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .suite-health-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .suite-health-count {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n .suite-health-bar-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .suite-health-bar {\n width: 80px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n }\n\n .suite-health-bar-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 0.3s ease;\n }\n\n .suite-health-pct {\n font-size: 12px;\n font-weight: 600;\n min-width: 36px;\n text-align: right;\n }\n\n /* ===== Alerts ===== */\n .alerts-list {\n max-height: 220px;\n overflow-y: auto;\n }\n\n .alert-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .alert-row:hover { background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface)); }\n\n .alert-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .alert-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .alert-reason {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n /* ===== Empty State ===== */\n .empty-state {\n padding: 32px 20px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* ===== Responsive ===== */\n @media (max-width: 900px) {\n .lower-grid {\n grid-template-columns: 1fr;\n }\n }\n\n @media (max-width: 640px) {\n .dashboard-container { padding: 16px; }\n .kpi-row { grid-template-columns: 1fr; }\n }\n "] }]
643
- }], () => [{ type: i1.TestingInstrumentationService }, { type: i0.ChangeDetectorRef }], { initialState: [{
689
+ `, styles: ["\n /* ===== Layout ===== */\n .full-page-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n min-height: 400px;\n background: var(--mj-bg-surface-card);\n }\n\n .dashboard-container {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n }\n\n /* ===== Page Header ===== */\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 24px;\n }\n\n .page-title {\n margin: 0;\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .page-title i { color: var(--mj-brand-primary); }\n\n .refresh-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 8px 18px;\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: background 0.2s ease;\n }\n\n .refresh-btn:hover:not(:disabled) { background: var(--mj-brand-primary-hover); }\n .refresh-btn:disabled { opacity: 0.6; cursor: not-allowed; }\n .refresh-btn i.spinning { animation: spin 1s linear infinite; }\n\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n /* ===== KPI Row ===== */\n .kpi-row {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 16px;\n margin-bottom: 24px;\n }\n\n /* ===== Card Base ===== */\n .card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n }\n\n .section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .section-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-header h3 i { color: var(--mj-brand-primary); font-size: 13px; }\n\n /* ===== Live Activity ===== */\n .live-activity-card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n margin-bottom: 24px;\n overflow: hidden;\n }\n\n .live-dot {\n width: 10px;\n height: 10px;\n background: var(--mj-status-success);\n border-radius: 50%;\n display: inline-block;\n animation: pulse-dot 1.5s ease-in-out infinite;\n }\n\n @keyframes pulse-dot {\n 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-status-success) 50%, transparent); }\n 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-status-success) 0%, transparent); }\n }\n\n .live-idle-icon { color: var(--mj-text-disabled); font-size: 14px; }\n\n .running-tests-list {\n padding: 0 20px 16px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .running-test-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 25%, var(--mj-bg-surface));\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .running-test-item:hover {\n background: color-mix(in srgb, var(--mj-status-success) 16%, var(--mj-bg-surface));\n }\n\n .running-test-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .running-test-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-status-success);\n }\n\n .running-test-step {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .running-test-meta {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .running-elapsed {\n font-size: 12px;\n color: var(--mj-status-success);\n font-weight: 500;\n }\n\n .running-progress-bar {\n width: 80px;\n height: 4px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 2px;\n overflow: hidden;\n }\n\n .running-progress-fill {\n display: block;\n height: 100%;\n background: var(--mj-status-success);\n border-radius: 2px;\n transition: width 0.5s ease;\n }\n\n .running-progress-pct {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-status-success);\n min-width: 30px;\n text-align: right;\n }\n\n /* ===== Lower Grid ===== */\n .lower-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n\n .right-column {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n /* ===== Recent Runs ===== */\n .runs-list {\n max-height: 520px;\n overflow-y: auto;\n }\n\n .run-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .run-row:hover { background: var(--mj-bg-surface-card); }\n\n .run-row-left {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .run-row-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .run-row-time {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n .run-row-right {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .run-row-duration {\n font-size: 11px;\n color: var(--mj-text-muted);\n min-width: 44px;\n text-align: right;\n }\n\n /* ===== Suite Health ===== */\n .suite-health-list {\n padding: 8px 0;\n max-height: 260px;\n overflow-y: auto;\n }\n\n .suite-health-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n }\n\n .suite-health-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .suite-health-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .suite-health-count {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n .suite-health-bar-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .suite-health-bar {\n width: 80px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n }\n\n .suite-health-bar-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 0.3s ease;\n }\n\n .suite-health-pct {\n font-size: 12px;\n font-weight: 600;\n min-width: 36px;\n text-align: right;\n }\n\n /* ===== Alerts ===== */\n .alerts-list {\n max-height: 220px;\n overflow-y: auto;\n }\n\n .alert-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .alert-row:hover { background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface)); }\n\n .alert-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .alert-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .alert-reason {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n /* ===== Empty State ===== */\n .empty-state {\n padding: 32px 20px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* ===== Responsive ===== */\n @media (max-width: 900px) {\n .lower-grid {\n grid-template-columns: 1fr;\n }\n }\n\n @media (max-width: 640px) {\n .dashboard-container { padding: 16px; }\n .kpi-row { grid-template-columns: 1fr; }\n }\n "] }]
690
+ }], () => [{ type: i1.TestingInstrumentationService }, { type: i2.TestingExecutionService }, { type: i2.TestingDialogService }, { type: i0.ChangeDetectorRef }], { initialState: [{
644
691
  type: Input
645
692
  }], stateChange: [{
646
693
  type: Output
647
694
  }] }); })();
648
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestingDashboardTabComponent, { className: "TestingDashboardTabComponent", filePath: "src/Testing/components/testing-dashboard-tab.component.ts", lineNumber: 567 }); })();
695
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestingDashboardTabComponent, { className: "TestingDashboardTabComponent", filePath: "src/Testing/components/testing-dashboard-tab.component.ts", lineNumber: 591 }); })();
649
696
  //# sourceMappingURL=testing-dashboard-tab.component.js.map