@memberjunction/ng-dashboards 3.2.0 → 3.4.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 (402) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +24 -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 +198 -111
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/models/model-management.component.d.ts +23 -0
  6. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  7. package/dist/AI/components/models/model-management.component.js +189 -83
  8. package/dist/AI/components/models/model-management.component.js.map +1 -1
  9. package/dist/AI/components/prompts/prompt-management.component.d.ts +23 -0
  10. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  11. package/dist/AI/components/prompts/prompt-management.component.js +135 -30
  12. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  13. package/dist/APIKeys/api-applications-panel.component.d.ts +169 -0
  14. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -0
  15. package/dist/APIKeys/api-applications-panel.component.js +1058 -0
  16. package/dist/APIKeys/api-applications-panel.component.js.map +1 -0
  17. package/dist/APIKeys/api-key-create-dialog.component.d.ts +125 -0
  18. package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -0
  19. package/dist/APIKeys/api-key-create-dialog.component.js +768 -0
  20. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -0
  21. package/dist/APIKeys/api-key-edit-panel.component.d.ts +149 -0
  22. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -0
  23. package/dist/APIKeys/api-key-edit-panel.component.js +1074 -0
  24. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -0
  25. package/dist/APIKeys/api-key-list.component.d.ts +131 -0
  26. package/dist/APIKeys/api-key-list.component.d.ts.map +1 -0
  27. package/dist/APIKeys/api-key-list.component.js +818 -0
  28. package/dist/APIKeys/api-key-list.component.js.map +1 -0
  29. package/dist/APIKeys/api-keys-resource.component.d.ts +211 -0
  30. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -0
  31. package/dist/APIKeys/api-keys-resource.component.js +1150 -0
  32. package/dist/APIKeys/api-keys-resource.component.js.map +1 -0
  33. package/dist/APIKeys/api-scopes-panel.component.d.ts +98 -0
  34. package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -0
  35. package/dist/APIKeys/api-scopes-panel.component.js +652 -0
  36. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -0
  37. package/dist/APIKeys/api-usage-panel.component.d.ts +174 -0
  38. package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -0
  39. package/dist/APIKeys/api-usage-panel.component.js +1013 -0
  40. package/dist/APIKeys/api-usage-panel.component.js.map +1 -0
  41. package/dist/APIKeys/index.d.ts +7 -0
  42. package/dist/APIKeys/index.d.ts.map +1 -0
  43. package/dist/APIKeys/index.js +8 -0
  44. package/dist/APIKeys/index.js.map +1 -0
  45. package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts +22 -0
  46. package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts.map +1 -0
  47. package/dist/Actions/components/explorer/action-breadcrumb.component.js +139 -0
  48. package/dist/Actions/components/explorer/action-breadcrumb.component.js.map +1 -0
  49. package/dist/Actions/components/explorer/action-card.component.d.ts +39 -0
  50. package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -0
  51. package/dist/Actions/components/explorer/action-card.component.js +410 -0
  52. package/dist/Actions/components/explorer/action-card.component.js.map +1 -0
  53. package/dist/Actions/components/explorer/action-explorer.component.d.ts +62 -0
  54. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -0
  55. package/dist/Actions/components/explorer/action-explorer.component.js +527 -0
  56. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -0
  57. package/dist/Actions/components/explorer/action-list-item.component.d.ts +24 -0
  58. package/dist/Actions/components/explorer/action-list-item.component.d.ts.map +1 -0
  59. package/dist/Actions/components/explorer/action-list-item.component.js +210 -0
  60. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -0
  61. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +63 -0
  62. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +1 -0
  63. package/dist/Actions/components/explorer/action-toolbar.component.js +483 -0
  64. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -0
  65. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts +57 -0
  66. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts.map +1 -0
  67. package/dist/Actions/components/explorer/action-tree-panel.component.js +454 -0
  68. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -0
  69. package/dist/Actions/components/explorer/index.d.ts +10 -0
  70. package/dist/Actions/components/explorer/index.d.ts.map +1 -0
  71. package/dist/Actions/components/explorer/index.js +14 -0
  72. package/dist/Actions/components/explorer/index.js.map +1 -0
  73. package/dist/Actions/components/explorer/new-action-panel.component.d.ts +49 -0
  74. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -0
  75. package/dist/Actions/components/explorer/new-action-panel.component.js +359 -0
  76. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -0
  77. package/dist/Actions/components/explorer/new-category-panel.component.d.ts +37 -0
  78. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -0
  79. package/dist/Actions/components/explorer/new-category-panel.component.js +282 -0
  80. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -0
  81. package/dist/Actions/index.d.ts +3 -0
  82. package/dist/Actions/index.d.ts.map +1 -1
  83. package/dist/Actions/index.js +5 -0
  84. package/dist/Actions/index.js.map +1 -1
  85. package/dist/Actions/services/action-explorer-state.service.d.ts +104 -0
  86. package/dist/Actions/services/action-explorer-state.service.d.ts.map +1 -0
  87. package/dist/Actions/services/action-explorer-state.service.js +352 -0
  88. package/dist/Actions/services/action-explorer-state.service.js.map +1 -0
  89. package/dist/Communication/communication-dashboard.component.d.ts +2 -6
  90. package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
  91. package/dist/Communication/communication-dashboard.component.js +142 -93
  92. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  93. package/dist/Communication/communication-logs-resource.component.d.ts +10 -4
  94. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  95. package/dist/Communication/communication-logs-resource.component.js +253 -121
  96. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  97. package/dist/Communication/communication-monitor-resource.component.d.ts +38 -3
  98. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  99. package/dist/Communication/communication-monitor-resource.component.js +431 -157
  100. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  101. package/dist/Communication/communication-providers-resource.component.d.ts +16 -5
  102. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  103. package/dist/Communication/communication-providers-resource.component.js +229 -118
  104. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  105. package/dist/Communication/communication-runs-resource.component.d.ts +4 -2
  106. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  107. package/dist/Communication/communication-runs-resource.component.js +155 -149
  108. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  109. package/dist/Communication/communication-templates-resource.component.d.ts +43 -0
  110. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -0
  111. package/dist/Communication/communication-templates-resource.component.js +371 -0
  112. package/dist/Communication/communication-templates-resource.component.js.map +1 -0
  113. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +69 -267
  114. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  115. package/dist/ComponentStudio/component-studio-dashboard.component.js +698 -1802
  116. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  117. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +68 -0
  118. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -0
  119. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +401 -0
  120. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -0
  121. package/dist/ComponentStudio/components/browser/component-browser.component.d.ts +44 -0
  122. package/dist/ComponentStudio/components/browser/component-browser.component.d.ts.map +1 -0
  123. package/dist/ComponentStudio/components/browser/component-browser.component.js +636 -0
  124. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -0
  125. package/dist/ComponentStudio/components/editors/code-editor-panel.component.d.ts +35 -0
  126. package/dist/ComponentStudio/components/editors/code-editor-panel.component.d.ts.map +1 -0
  127. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +380 -0
  128. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -0
  129. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts +24 -0
  130. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -0
  131. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +221 -0
  132. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -0
  133. package/dist/ComponentStudio/components/editors/requirements-editor.component.d.ts +28 -0
  134. package/dist/ComponentStudio/components/editors/requirements-editor.component.d.ts.map +1 -0
  135. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +263 -0
  136. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -0
  137. package/dist/ComponentStudio/components/editors/spec-editor.component.d.ts +34 -0
  138. package/dist/ComponentStudio/components/editors/spec-editor.component.d.ts.map +1 -0
  139. package/dist/ComponentStudio/components/editors/spec-editor.component.js +307 -0
  140. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -0
  141. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.d.ts +29 -0
  142. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.d.ts.map +1 -0
  143. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +159 -0
  144. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -0
  145. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts +20 -0
  146. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -0
  147. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +192 -0
  148. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -0
  149. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +57 -0
  150. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -0
  151. package/dist/ComponentStudio/components/workspace/component-preview.component.js +342 -0
  152. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -0
  153. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +15 -0
  154. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -0
  155. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +144 -0
  156. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -0
  157. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +203 -0
  158. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -0
  159. package/dist/ComponentStudio/services/component-studio-state.service.js +651 -0
  160. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -0
  161. package/dist/ComponentStudio/services/component-version.service.d.ts +120 -0
  162. package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -0
  163. package/dist/ComponentStudio/services/component-version.service.js +394 -0
  164. package/dist/ComponentStudio/services/component-version.service.js.map +1 -0
  165. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +1 -1
  166. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  167. package/dist/Credentials/components/credentials-categories-resource.component.js +1 -1
  168. package/dist/Credentials/components/credentials-list-resource.component.d.ts +1 -1
  169. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  170. package/dist/Credentials/components/credentials-list-resource.component.js +1 -1
  171. package/dist/Credentials/components/credentials-types-resource.component.d.ts +1 -1
  172. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  173. package/dist/Credentials/components/credentials-types-resource.component.js +1 -1
  174. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  175. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +4 -2
  176. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  177. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +2 -2
  178. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +3 -3
  179. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  180. package/dist/DataExplorer/data-explorer-dashboard.component.js +22 -6
  181. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  182. package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
  183. package/dist/MCP/components/mcp-connection-dialog.component.d.ts +72 -0
  184. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -0
  185. package/dist/MCP/components/mcp-connection-dialog.component.js +529 -0
  186. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -0
  187. package/dist/MCP/components/mcp-log-detail-panel.component.d.ts +77 -0
  188. package/dist/MCP/components/mcp-log-detail-panel.component.d.ts.map +1 -0
  189. package/dist/MCP/components/mcp-log-detail-panel.component.js +535 -0
  190. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -0
  191. package/dist/MCP/components/mcp-server-dialog.component.d.ts +77 -0
  192. package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -0
  193. package/dist/MCP/components/mcp-server-dialog.component.js +437 -0
  194. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -0
  195. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts +271 -0
  196. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -0
  197. package/dist/MCP/components/mcp-test-tool-dialog.component.js +1300 -0
  198. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -0
  199. package/dist/MCP/index.d.ts +11 -0
  200. package/dist/MCP/index.d.ts.map +1 -0
  201. package/dist/MCP/index.js +15 -0
  202. package/dist/MCP/index.js.map +1 -0
  203. package/dist/MCP/mcp-dashboard.component.d.ts +409 -0
  204. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -0
  205. package/dist/MCP/mcp-dashboard.component.js +2486 -0
  206. package/dist/MCP/mcp-dashboard.component.js.map +1 -0
  207. package/dist/MCP/mcp-resource.component.d.ts +20 -0
  208. package/dist/MCP/mcp-resource.component.d.ts.map +1 -0
  209. package/dist/MCP/mcp-resource.component.js +55 -0
  210. package/dist/MCP/mcp-resource.component.js.map +1 -0
  211. package/dist/MCP/mcp.module.d.ts +27 -0
  212. package/dist/MCP/mcp.module.d.ts.map +1 -0
  213. package/dist/MCP/mcp.module.js +122 -0
  214. package/dist/MCP/mcp.module.js.map +1 -0
  215. package/dist/MCP/services/mcp-tools.service.d.ts +109 -0
  216. package/dist/MCP/services/mcp-tools.service.d.ts.map +1 -0
  217. package/dist/MCP/services/mcp-tools.service.js +222 -0
  218. package/dist/MCP/services/mcp-tools.service.js.map +1 -0
  219. package/dist/Scheduling/components/index.d.ts +5 -8
  220. package/dist/Scheduling/components/index.d.ts.map +1 -1
  221. package/dist/Scheduling/components/index.js +6 -9
  222. package/dist/Scheduling/components/index.js.map +1 -1
  223. package/dist/Scheduling/components/job-slideout.component.d.ts +45 -0
  224. package/dist/Scheduling/components/job-slideout.component.d.ts.map +1 -0
  225. package/dist/Scheduling/components/job-slideout.component.js +458 -0
  226. package/dist/Scheduling/components/job-slideout.component.js.map +1 -0
  227. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +19 -0
  228. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -0
  229. package/dist/Scheduling/components/scheduling-activity-resource.component.js +51 -0
  230. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -0
  231. package/dist/Scheduling/components/scheduling-activity.component.d.ts +71 -0
  232. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -0
  233. package/dist/Scheduling/components/scheduling-activity.component.js +714 -0
  234. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -0
  235. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +3 -4
  236. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  237. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +3 -7
  238. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  239. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +52 -34
  240. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  241. package/dist/Scheduling/components/scheduling-jobs.component.js +446 -261
  242. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  243. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +19 -0
  244. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -0
  245. package/dist/Scheduling/components/scheduling-overview-resource.component.js +51 -0
  246. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -0
  247. package/dist/Scheduling/components/scheduling-overview.component.d.ts +43 -0
  248. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -0
  249. package/dist/Scheduling/components/scheduling-overview.component.js +595 -0
  250. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -0
  251. package/dist/Scheduling/scheduling-dashboard.component.d.ts +22 -32
  252. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  253. package/dist/Scheduling/scheduling-dashboard.component.js +175 -169
  254. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  255. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +49 -6
  256. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  257. package/dist/Scheduling/services/scheduling-instrumentation.service.js +218 -149
  258. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  259. package/dist/Testing/components/index.d.ts +7 -8
  260. package/dist/Testing/components/index.d.ts.map +1 -1
  261. package/dist/Testing/components/index.js +8 -9
  262. package/dist/Testing/components/index.js.map +1 -1
  263. package/dist/Testing/components/testing-analytics-resource.component.d.ts +0 -4
  264. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  265. package/dist/Testing/components/testing-analytics-resource.component.js +1 -7
  266. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  267. package/dist/Testing/components/testing-analytics.component.d.ts +52 -37
  268. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  269. package/dist/Testing/components/testing-analytics.component.js +1023 -569
  270. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  271. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +16 -0
  272. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -0
  273. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +47 -0
  274. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -0
  275. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +57 -0
  276. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -0
  277. package/dist/Testing/components/testing-dashboard-tab.component.js +649 -0
  278. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -0
  279. package/dist/{Scheduling/components/scheduling-types-resource.component.d.ts → Testing/components/testing-explorer-resource.component.d.ts} +5 -9
  280. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -0
  281. package/dist/Testing/components/testing-explorer-resource.component.js +47 -0
  282. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -0
  283. package/dist/Testing/components/testing-explorer.component.d.ts +193 -0
  284. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -0
  285. package/dist/Testing/components/testing-explorer.component.js +2212 -0
  286. package/dist/Testing/components/testing-explorer.component.js.map +1 -0
  287. package/dist/Testing/components/testing-review-resource.component.d.ts +16 -0
  288. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -0
  289. package/dist/Testing/components/testing-review-resource.component.js +47 -0
  290. package/dist/Testing/components/testing-review-resource.component.js.map +1 -0
  291. package/dist/Testing/components/testing-review.component.d.ts +60 -0
  292. package/dist/Testing/components/testing-review.component.d.ts.map +1 -0
  293. package/dist/Testing/components/testing-review.component.js +985 -0
  294. package/dist/Testing/components/testing-review.component.js.map +1 -0
  295. package/dist/Testing/components/testing-runs-resource.component.d.ts +16 -0
  296. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -0
  297. package/dist/Testing/components/testing-runs-resource.component.js +47 -0
  298. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -0
  299. package/dist/Testing/components/testing-runs.component.d.ts +82 -0
  300. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -0
  301. package/dist/Testing/components/testing-runs.component.js +1067 -0
  302. package/dist/Testing/components/testing-runs.component.js.map +1 -0
  303. package/dist/Testing/testing-dashboard.component.d.ts +12 -15
  304. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  305. package/dist/Testing/testing-dashboard.component.js +46 -68
  306. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  307. package/dist/module.d.ts +121 -97
  308. package/dist/module.d.ts.map +1 -1
  309. package/dist/module.js +227 -95
  310. package/dist/module.js.map +1 -1
  311. package/dist/public-api.d.ts +12 -3
  312. package/dist/public-api.d.ts.map +1 -1
  313. package/dist/public-api.js +47 -16
  314. package/dist/public-api.js.map +1 -1
  315. package/dist/shared/pipes/highlight-search.pipe.d.ts +17 -0
  316. package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -0
  317. package/dist/shared/pipes/highlight-search.pipe.js +40 -0
  318. package/dist/shared/pipes/highlight-search.pipe.js.map +1 -0
  319. package/dist/shared/pipes/index.d.ts +2 -0
  320. package/dist/shared/pipes/index.d.ts.map +1 -0
  321. package/dist/shared/pipes/index.js +2 -0
  322. package/dist/shared/pipes/index.js.map +1 -0
  323. package/dist/shared/shared-pipes.module.d.ts +11 -0
  324. package/dist/shared/shared-pipes.module.d.ts.map +1 -0
  325. package/dist/shared/shared-pipes.module.js +24 -0
  326. package/dist/shared/shared-pipes.module.js.map +1 -0
  327. package/package.json +39 -32
  328. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts +0 -44
  329. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts.map +0 -1
  330. package/dist/Credentials/components/credential-category-edit-panel.component.js +0 -456
  331. package/dist/Credentials/components/credential-category-edit-panel.component.js.map +0 -1
  332. package/dist/Credentials/components/credential-edit-panel.component.d.ts +0 -70
  333. package/dist/Credentials/components/credential-edit-panel.component.d.ts.map +0 -1
  334. package/dist/Credentials/components/credential-edit-panel.component.js +0 -694
  335. package/dist/Credentials/components/credential-edit-panel.component.js.map +0 -1
  336. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts +0 -56
  337. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts.map +0 -1
  338. package/dist/Credentials/components/credential-type-edit-panel.component.js +0 -563
  339. package/dist/Credentials/components/credential-type-edit-panel.component.js.map +0 -1
  340. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts +0 -20
  341. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts.map +0 -1
  342. package/dist/Scheduling/components/scheduling-health-resource.component.js +0 -55
  343. package/dist/Scheduling/components/scheduling-health-resource.component.js.map +0 -1
  344. package/dist/Scheduling/components/scheduling-health.component.d.ts +0 -30
  345. package/dist/Scheduling/components/scheduling-health.component.d.ts.map +0 -1
  346. package/dist/Scheduling/components/scheduling-health.component.js +0 -315
  347. package/dist/Scheduling/components/scheduling-health.component.js.map +0 -1
  348. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts +0 -20
  349. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts.map +0 -1
  350. package/dist/Scheduling/components/scheduling-history-resource.component.js +0 -55
  351. package/dist/Scheduling/components/scheduling-history-resource.component.js.map +0 -1
  352. package/dist/Scheduling/components/scheduling-history.component.d.ts +0 -48
  353. package/dist/Scheduling/components/scheduling-history.component.d.ts.map +0 -1
  354. package/dist/Scheduling/components/scheduling-history.component.js +0 -377
  355. package/dist/Scheduling/components/scheduling-history.component.js.map +0 -1
  356. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts +0 -20
  357. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts.map +0 -1
  358. package/dist/Scheduling/components/scheduling-monitor-resource.component.js +0 -55
  359. package/dist/Scheduling/components/scheduling-monitor-resource.component.js.map +0 -1
  360. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts +0 -37
  361. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts.map +0 -1
  362. package/dist/Scheduling/components/scheduling-monitoring.component.js +0 -488
  363. package/dist/Scheduling/components/scheduling-monitoring.component.js.map +0 -1
  364. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts.map +0 -1
  365. package/dist/Scheduling/components/scheduling-types-resource.component.js +0 -55
  366. package/dist/Scheduling/components/scheduling-types-resource.component.js.map +0 -1
  367. package/dist/Scheduling/components/scheduling-types.component.d.ts +0 -22
  368. package/dist/Scheduling/components/scheduling-types.component.d.ts.map +0 -1
  369. package/dist/Scheduling/components/scheduling-types.component.js +0 -165
  370. package/dist/Scheduling/components/scheduling-types.component.js.map +0 -1
  371. package/dist/Testing/components/testing-execution-resource.component.d.ts +0 -20
  372. package/dist/Testing/components/testing-execution-resource.component.d.ts.map +0 -1
  373. package/dist/Testing/components/testing-execution-resource.component.js +0 -55
  374. package/dist/Testing/components/testing-execution-resource.component.js.map +0 -1
  375. package/dist/Testing/components/testing-execution.component.d.ts +0 -71
  376. package/dist/Testing/components/testing-execution.component.d.ts.map +0 -1
  377. package/dist/Testing/components/testing-execution.component.js +0 -845
  378. package/dist/Testing/components/testing-execution.component.js.map +0 -1
  379. package/dist/Testing/components/testing-feedback-resource.component.d.ts +0 -20
  380. package/dist/Testing/components/testing-feedback-resource.component.d.ts.map +0 -1
  381. package/dist/Testing/components/testing-feedback-resource.component.js +0 -55
  382. package/dist/Testing/components/testing-feedback-resource.component.js.map +0 -1
  383. package/dist/Testing/components/testing-feedback.component.d.ts +0 -111
  384. package/dist/Testing/components/testing-feedback.component.d.ts.map +0 -1
  385. package/dist/Testing/components/testing-feedback.component.js +0 -1486
  386. package/dist/Testing/components/testing-feedback.component.js.map +0 -1
  387. package/dist/Testing/components/testing-overview-resource.component.d.ts +0 -20
  388. package/dist/Testing/components/testing-overview-resource.component.d.ts.map +0 -1
  389. package/dist/Testing/components/testing-overview-resource.component.js +0 -55
  390. package/dist/Testing/components/testing-overview-resource.component.js.map +0 -1
  391. package/dist/Testing/components/testing-overview.component.d.ts +0 -30
  392. package/dist/Testing/components/testing-overview.component.d.ts.map +0 -1
  393. package/dist/Testing/components/testing-overview.component.js +0 -361
  394. package/dist/Testing/components/testing-overview.component.js.map +0 -1
  395. package/dist/Testing/components/testing-version-comparison.component.d.ts +0 -62
  396. package/dist/Testing/components/testing-version-comparison.component.d.ts.map +0 -1
  397. package/dist/Testing/components/testing-version-comparison.component.js +0 -815
  398. package/dist/Testing/components/testing-version-comparison.component.js.map +0 -1
  399. package/dist/Testing/components/testing-version-resource.component.d.ts +0 -20
  400. package/dist/Testing/components/testing-version-resource.component.d.ts.map +0 -1
  401. package/dist/Testing/components/testing-version-resource.component.js +0 -55
  402. package/dist/Testing/components/testing-version-resource.component.js.map +0 -1
@@ -0,0 +1,985 @@
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { takeUntil } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../services/testing-instrumentation.service";
6
+ import * as i2 from "@angular/forms";
7
+ import * as i3 from "@memberjunction/ng-testing";
8
+ const _forTrack0 = ($index, $item) => $item.testRunID;
9
+ const _forTrack1 = ($index, $item) => $item.id;
10
+ function TestingReviewComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
11
+ i0.ɵɵelementStart(0, "div", 4)(1, "span", 26);
12
+ i0.ɵɵtext(2);
13
+ i0.ɵɵelementEnd();
14
+ i0.ɵɵelementStart(3, "span", 27);
15
+ i0.ɵɵtext(4, "pending");
16
+ i0.ɵɵelementEnd()();
17
+ } if (rf & 2) {
18
+ const ctx_r0 = i0.ɵɵnextContext();
19
+ i0.ɵɵadvance(2);
20
+ i0.ɵɵtextInterpolate(ctx_r0.PendingCount);
21
+ } }
22
+ function TestingReviewComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
23
+ i0.ɵɵelementStart(0, "div", 7)(1, "div", 28)(2, "div", 29);
24
+ i0.ɵɵelement(3, "i", 30);
25
+ i0.ɵɵelementEnd();
26
+ i0.ɵɵelementStart(4, "div", 31)(5, "div", 32);
27
+ i0.ɵɵtext(6);
28
+ i0.ɵɵelementEnd();
29
+ i0.ɵɵelementStart(7, "div", 33);
30
+ i0.ɵɵtext(8, "Pending Review");
31
+ i0.ɵɵelementEnd()()();
32
+ i0.ɵɵelementStart(9, "div", 28)(10, "div", 34);
33
+ i0.ɵɵelement(11, "i", 35);
34
+ i0.ɵɵelementEnd();
35
+ i0.ɵɵelementStart(12, "div", 31)(13, "div", 32);
36
+ i0.ɵɵtext(14);
37
+ i0.ɵɵelementEnd();
38
+ i0.ɵɵelementStart(15, "div", 33);
39
+ i0.ɵɵtext(16, "Reviewed");
40
+ i0.ɵɵelementEnd()()();
41
+ i0.ɵɵelementStart(17, "div", 28)(18, "div", 36);
42
+ i0.ɵɵelement(19, "i", 37);
43
+ i0.ɵɵelementEnd();
44
+ i0.ɵɵelementStart(20, "div", 31)(21, "div", 32);
45
+ i0.ɵɵtext(22);
46
+ i0.ɵɵelementStart(23, "span", 38);
47
+ i0.ɵɵtext(24, "/10");
48
+ i0.ɵɵelementEnd()();
49
+ i0.ɵɵelementStart(25, "div", 33);
50
+ i0.ɵɵtext(26, "Avg Rating");
51
+ i0.ɵɵelementEnd()()();
52
+ i0.ɵɵelementStart(27, "div", 28)(28, "div", 39);
53
+ i0.ɵɵelement(29, "i", 40);
54
+ i0.ɵɵelementEnd();
55
+ i0.ɵɵelementStart(30, "div", 31)(31, "div", 32);
56
+ i0.ɵɵtext(32);
57
+ i0.ɵɵelementStart(33, "span", 38);
58
+ i0.ɵɵtext(34, "%");
59
+ i0.ɵɵelementEnd()();
60
+ i0.ɵɵelementStart(35, "div", 33);
61
+ i0.ɵɵtext(36, "Agreement Rate");
62
+ i0.ɵɵelementEnd()()()();
63
+ } if (rf & 2) {
64
+ const ctx_r0 = i0.ɵɵnextContext();
65
+ i0.ɵɵadvance(6);
66
+ i0.ɵɵtextInterpolate(ctx_r0.Metrics.humanPendingCount);
67
+ i0.ɵɵadvance(8);
68
+ i0.ɵɵtextInterpolate(ctx_r0.Metrics.humanReviewedCount);
69
+ i0.ɵɵadvance(8);
70
+ i0.ɵɵtextInterpolate(ctx_r0.FormatDecimal(ctx_r0.Metrics.humanAvgRating, 1));
71
+ i0.ɵɵadvance(10);
72
+ i0.ɵɵtextInterpolate(ctx_r0.FormatDecimal(ctx_r0.Metrics.agreementRate, 0));
73
+ } }
74
+ function TestingReviewComponent_Conditional_19_Conditional_1_Template(rf, ctx) { if (rf & 1) {
75
+ i0.ɵɵelementStart(0, "div", 41);
76
+ i0.ɵɵelement(1, "i", 43);
77
+ i0.ɵɵelementStart(2, "h3");
78
+ i0.ɵɵtext(3, "All caught up!");
79
+ i0.ɵɵelementEnd();
80
+ i0.ɵɵelementStart(4, "p");
81
+ i0.ɵɵtext(5, "No tests currently require human review.");
82
+ i0.ɵɵelementEnd()();
83
+ } }
84
+ function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_13_Template(rf, ctx) { if (rf & 1) {
85
+ i0.ɵɵelement(0, "i", 59);
86
+ i0.ɵɵtext(1, " No Feedback ");
87
+ } }
88
+ function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
89
+ i0.ɵɵelement(0, "i", 60);
90
+ i0.ɵɵtext(1, " Score Mismatch ");
91
+ } }
92
+ function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_15_Template(rf, ctx) { if (rf & 1) {
93
+ i0.ɵɵelement(0, "i", 61);
94
+ i0.ɵɵtext(1, " Needs Verification ");
95
+ } }
96
+ function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_18_For_6_Template(rf, ctx) { if (rf & 1) {
97
+ const _r5 = i0.ɵɵgetCurrentView();
98
+ i0.ɵɵelementStart(0, "button", 78);
99
+ i0.ɵɵlistener("click", function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_18_For_6_Template_button_click_0_listener() { const n_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.SelectRating(n_r6)); });
100
+ i0.ɵɵtext(1);
101
+ i0.ɵɵelementEnd();
102
+ } if (rf & 2) {
103
+ const n_r6 = ctx.$implicit;
104
+ const ctx_r0 = i0.ɵɵnextContext(5);
105
+ i0.ɵɵclassProp("selected", ctx_r0.FormState.rating != null && n_r6 <= ctx_r0.FormState.rating)("current", ctx_r0.FormState.rating === n_r6);
106
+ i0.ɵɵadvance();
107
+ i0.ɵɵtextInterpolate1(" ", n_r6, " ");
108
+ } }
109
+ function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_18_Conditional_7_Template(rf, ctx) { if (rf & 1) {
110
+ i0.ɵɵelementStart(0, "span", 66);
111
+ i0.ɵɵtext(1);
112
+ i0.ɵɵelementEnd();
113
+ } if (rf & 2) {
114
+ const ctx_r0 = i0.ɵɵnextContext(5);
115
+ i0.ɵɵadvance();
116
+ i0.ɵɵtextInterpolate1("", ctx_r0.FormState.rating, "/10");
117
+ } }
118
+ function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_18_Template(rf, ctx) { if (rf & 1) {
119
+ const _r4 = i0.ɵɵgetCurrentView();
120
+ i0.ɵɵelementStart(0, "div", 58)(1, "div", 62)(2, "label", 63);
121
+ i0.ɵɵtext(3, "Rating");
122
+ i0.ɵɵelementEnd();
123
+ i0.ɵɵelementStart(4, "div", 64);
124
+ i0.ɵɵrepeaterCreate(5, TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_18_For_6_Template, 2, 5, "button", 65, i0.ɵɵrepeaterTrackByIdentity);
125
+ i0.ɵɵtemplate(7, TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_18_Conditional_7_Template, 2, 1, "span", 66);
126
+ i0.ɵɵelementEnd()();
127
+ i0.ɵɵelementStart(8, "div", 62)(9, "label", 63);
128
+ i0.ɵɵtext(10, "Is the automated result correct?");
129
+ i0.ɵɵelementEnd();
130
+ i0.ɵɵelementStart(11, "div", 67)(12, "button", 68);
131
+ i0.ɵɵlistener("click", function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_18_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.SelectCorrectness(true)); });
132
+ i0.ɵɵelement(13, "i", 69);
133
+ i0.ɵɵtext(14, " Correct ");
134
+ i0.ɵɵelementEnd();
135
+ i0.ɵɵelementStart(15, "button", 70);
136
+ i0.ɵɵlistener("click", function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_18_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.SelectCorrectness(false)); });
137
+ i0.ɵɵelement(16, "i", 71);
138
+ i0.ɵɵtext(17, " Incorrect ");
139
+ i0.ɵɵelementEnd()()();
140
+ i0.ɵɵelementStart(18, "div", 62)(19, "label", 63);
141
+ i0.ɵɵtext(20, "Notes (optional)");
142
+ i0.ɵɵelementEnd();
143
+ i0.ɵɵelementStart(21, "textarea", 72);
144
+ i0.ɵɵlistener("input", function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_18_Template_textarea_input_21_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnCommentsChange($event)); });
145
+ i0.ɵɵelementEnd()();
146
+ i0.ɵɵelementStart(22, "div", 73)(23, "button", 74);
147
+ i0.ɵɵlistener("click", function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_18_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r4); const item_r3 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.SubmitReview(item_r3)); });
148
+ i0.ɵɵelement(24, "i", 75);
149
+ i0.ɵɵtext(25);
150
+ i0.ɵɵelementEnd();
151
+ i0.ɵɵelementStart(26, "button", 76);
152
+ i0.ɵɵlistener("click", function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_18_Template_button_click_26_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.SkipItem()); });
153
+ i0.ɵɵelement(27, "i", 77);
154
+ i0.ɵɵtext(28, " Skip ");
155
+ i0.ɵɵelementEnd()()();
156
+ } if (rf & 2) {
157
+ const ctx_r0 = i0.ɵɵnextContext(4);
158
+ i0.ɵɵadvance(5);
159
+ i0.ɵɵrepeater(ctx_r0.RatingNumbers);
160
+ i0.ɵɵadvance(2);
161
+ i0.ɵɵconditional(ctx_r0.FormState.rating != null ? 7 : -1);
162
+ i0.ɵɵadvance(5);
163
+ i0.ɵɵclassProp("active", ctx_r0.FormState.isCorrect === true);
164
+ i0.ɵɵadvance(3);
165
+ i0.ɵɵclassProp("active", ctx_r0.FormState.isCorrect === false);
166
+ i0.ɵɵadvance(6);
167
+ i0.ɵɵproperty("value", ctx_r0.FormState.comments);
168
+ i0.ɵɵadvance(2);
169
+ i0.ɵɵproperty("disabled", !ctx_r0.IsFormValid || ctx_r0.IsSubmitting);
170
+ i0.ɵɵadvance(2);
171
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.IsSubmitting ? "Submitting..." : "Submit", " ");
172
+ } }
173
+ function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Template(rf, ctx) { if (rf & 1) {
174
+ const _r2 = i0.ɵɵgetCurrentView();
175
+ i0.ɵɵelementStart(0, "div", 45)(1, "div", 46);
176
+ i0.ɵɵlistener("click", function TestingReviewComponent_Conditional_19_Conditional_2_For_2_Template_div_click_1_listener() { const item_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.ToggleExpand(item_r3.testRunID)); });
177
+ i0.ɵɵelementStart(2, "div", 47)(3, "div", 48);
178
+ i0.ɵɵtext(4);
179
+ i0.ɵɵelementEnd();
180
+ i0.ɵɵelementStart(5, "div", 49)(6, "span", 50);
181
+ i0.ɵɵelement(7, "i", 51);
182
+ i0.ɵɵtext(8);
183
+ i0.ɵɵelementEnd();
184
+ i0.ɵɵelement(9, "app-score-indicator", 52)(10, "app-test-status-badge", 53);
185
+ i0.ɵɵelementEnd()();
186
+ i0.ɵɵelementStart(11, "div", 54)(12, "span", 55);
187
+ i0.ɵɵtemplate(13, TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_13_Template, 2, 0)(14, TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_14_Template, 2, 0)(15, TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_15_Template, 2, 0);
188
+ i0.ɵɵelementEnd();
189
+ i0.ɵɵelementStart(16, "button", 56);
190
+ i0.ɵɵelement(17, "i", 57);
191
+ i0.ɵɵelementEnd()()();
192
+ i0.ɵɵtemplate(18, TestingReviewComponent_Conditional_19_Conditional_2_For_2_Conditional_18_Template, 29, 8, "div", 58);
193
+ i0.ɵɵelementEnd();
194
+ } if (rf & 2) {
195
+ const item_r3 = ctx.$implicit;
196
+ const ctx_r0 = i0.ɵɵnextContext(3);
197
+ i0.ɵɵclassProp("expanded", ctx_r0.ExpandedItemId === item_r3.testRunID);
198
+ i0.ɵɵadvance(4);
199
+ i0.ɵɵtextInterpolate(item_r3.testName);
200
+ i0.ɵɵadvance(4);
201
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatRelativeTime(item_r3.runDateTime), " ");
202
+ i0.ɵɵadvance();
203
+ i0.ɵɵproperty("score", item_r3.automatedScore)("showBar", true);
204
+ i0.ɵɵadvance();
205
+ i0.ɵɵproperty("status", item_r3.automatedStatus);
206
+ i0.ɵɵadvance(2);
207
+ i0.ɵɵclassMap("reason-" + item_r3.reason);
208
+ i0.ɵɵadvance();
209
+ i0.ɵɵconditional(item_r3.reason === "no-feedback" ? 13 : item_r3.reason === "high-score-failed" ? 14 : 15);
210
+ i0.ɵɵadvance(4);
211
+ i0.ɵɵclassProp("fa-chevron-down", ctx_r0.ExpandedItemId !== item_r3.testRunID)("fa-chevron-up", ctx_r0.ExpandedItemId === item_r3.testRunID);
212
+ i0.ɵɵadvance();
213
+ i0.ɵɵconditional(ctx_r0.ExpandedItemId === item_r3.testRunID ? 18 : -1);
214
+ } }
215
+ function TestingReviewComponent_Conditional_19_Conditional_2_Template(rf, ctx) { if (rf & 1) {
216
+ i0.ɵɵelementStart(0, "div", 42);
217
+ i0.ɵɵrepeaterCreate(1, TestingReviewComponent_Conditional_19_Conditional_2_For_2_Template, 19, 15, "div", 44, _forTrack0);
218
+ i0.ɵɵelementEnd();
219
+ } if (rf & 2) {
220
+ const ctx_r0 = i0.ɵɵnextContext(2);
221
+ i0.ɵɵadvance();
222
+ i0.ɵɵrepeater(ctx_r0.PendingItems);
223
+ } }
224
+ function TestingReviewComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
225
+ i0.ɵɵelementStart(0, "div", 13);
226
+ i0.ɵɵtemplate(1, TestingReviewComponent_Conditional_19_Conditional_1_Template, 6, 0, "div", 41)(2, TestingReviewComponent_Conditional_19_Conditional_2_Template, 3, 0, "div", 42);
227
+ i0.ɵɵelementEnd();
228
+ } if (rf & 2) {
229
+ const ctx_r0 = i0.ɵɵnextContext();
230
+ i0.ɵɵadvance();
231
+ i0.ɵɵconditional(ctx_r0.PendingItems.length === 0 ? 1 : 2);
232
+ } }
233
+ function TestingReviewComponent_Conditional_20_Conditional_15_Template(rf, ctx) { if (rf & 1) {
234
+ i0.ɵɵelementStart(0, "div", 41);
235
+ i0.ɵɵelement(1, "i", 89);
236
+ i0.ɵɵelementStart(2, "h3");
237
+ i0.ɵɵtext(3, "No reviewed items");
238
+ i0.ɵɵelementEnd();
239
+ i0.ɵɵelementStart(4, "p");
240
+ i0.ɵɵtext(5, "Reviewed tests will appear here once feedback is submitted.");
241
+ i0.ɵɵelementEnd()();
242
+ } }
243
+ function TestingReviewComponent_Conditional_20_Conditional_16_For_2_For_10_Template(rf, ctx) { if (rf & 1) {
244
+ i0.ɵɵelement(0, "span", 104);
245
+ } if (rf & 2) {
246
+ const n_r8 = ctx.$implicit;
247
+ const item_r9 = i0.ɵɵnextContext().$implicit;
248
+ i0.ɵɵclassProp("filled", item_r9.humanRating != null && n_r8 <= item_r9.humanRating);
249
+ } }
250
+ function TestingReviewComponent_Conditional_20_Conditional_16_For_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
251
+ i0.ɵɵelementStart(0, "span", 100);
252
+ i0.ɵɵelement(1, "i", 69);
253
+ i0.ɵɵtext(2, " Correct ");
254
+ i0.ɵɵelementEnd();
255
+ } }
256
+ function TestingReviewComponent_Conditional_20_Conditional_16_For_2_Conditional_15_Template(rf, ctx) { if (rf & 1) {
257
+ i0.ɵɵelementStart(0, "span", 101);
258
+ i0.ɵɵelement(1, "i", 71);
259
+ i0.ɵɵtext(2, " Incorrect ");
260
+ i0.ɵɵelementEnd();
261
+ } }
262
+ function TestingReviewComponent_Conditional_20_Conditional_16_For_2_Conditional_18_Template(rf, ctx) { if (rf & 1) {
263
+ const _r10 = i0.ɵɵgetCurrentView();
264
+ i0.ɵɵelementStart(0, "div", 105);
265
+ i0.ɵɵlistener("click", function TestingReviewComponent_Conditional_20_Conditional_16_For_2_Conditional_18_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r10); const item_r9 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.ToggleHistoryComment(item_r9.id)); });
266
+ i0.ɵɵelementStart(1, "p");
267
+ i0.ɵɵtext(2);
268
+ i0.ɵɵelementEnd()();
269
+ } if (rf & 2) {
270
+ const item_r9 = i0.ɵɵnextContext().$implicit;
271
+ const ctx_r0 = i0.ɵɵnextContext(3);
272
+ i0.ɵɵclassProp("expanded", ctx_r0.ExpandedHistoryId === item_r9.id);
273
+ i0.ɵɵadvance(2);
274
+ i0.ɵɵtextInterpolate(item_r9.humanComments);
275
+ } }
276
+ function TestingReviewComponent_Conditional_20_Conditional_16_For_2_Template(rf, ctx) { if (rf & 1) {
277
+ i0.ɵɵelementStart(0, "div", 90)(1, "div", 91)(2, "div", 92);
278
+ i0.ɵɵtext(3);
279
+ i0.ɵɵelementEnd();
280
+ i0.ɵɵelementStart(4, "div", 93);
281
+ i0.ɵɵelement(5, "i", 94);
282
+ i0.ɵɵtext(6);
283
+ i0.ɵɵelementEnd()();
284
+ i0.ɵɵelementStart(7, "div", 95)(8, "div", 96);
285
+ i0.ɵɵrepeaterCreate(9, TestingReviewComponent_Conditional_20_Conditional_16_For_2_For_10_Template, 1, 2, "span", 97, i0.ɵɵrepeaterTrackByIdentity);
286
+ i0.ɵɵelementEnd();
287
+ i0.ɵɵelementStart(11, "span", 98);
288
+ i0.ɵɵtext(12);
289
+ i0.ɵɵelementEnd()();
290
+ i0.ɵɵelementStart(13, "div", 99);
291
+ i0.ɵɵtemplate(14, TestingReviewComponent_Conditional_20_Conditional_16_For_2_Conditional_14_Template, 3, 0, "span", 100)(15, TestingReviewComponent_Conditional_20_Conditional_16_For_2_Conditional_15_Template, 3, 0, "span", 101);
292
+ i0.ɵɵelementEnd();
293
+ i0.ɵɵelementStart(16, "div", 102);
294
+ i0.ɵɵelement(17, "app-score-indicator", 52);
295
+ i0.ɵɵelementEnd();
296
+ i0.ɵɵtemplate(18, TestingReviewComponent_Conditional_20_Conditional_16_For_2_Conditional_18_Template, 3, 3, "div", 103);
297
+ i0.ɵɵelementEnd();
298
+ } if (rf & 2) {
299
+ let tmp_15_0;
300
+ const item_r9 = ctx.$implicit;
301
+ const ctx_r0 = i0.ɵɵnextContext(3);
302
+ i0.ɵɵadvance(3);
303
+ i0.ɵɵtextInterpolate(item_r9.testName);
304
+ i0.ɵɵadvance(3);
305
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatRelativeTime(item_r9.runDateTime), " ");
306
+ i0.ɵɵadvance(3);
307
+ i0.ɵɵrepeater(ctx_r0.RatingNumbers);
308
+ i0.ɵɵadvance(3);
309
+ i0.ɵɵtextInterpolate1("", (tmp_15_0 = item_r9.humanRating) !== null && tmp_15_0 !== undefined ? tmp_15_0 : 0, "/10");
310
+ i0.ɵɵadvance(2);
311
+ i0.ɵɵconditional(item_r9.humanIsCorrect === true ? 14 : item_r9.humanIsCorrect === false ? 15 : -1);
312
+ i0.ɵɵadvance(3);
313
+ i0.ɵɵproperty("score", item_r9.score)("showBar", true);
314
+ i0.ɵɵadvance();
315
+ i0.ɵɵconditional(item_r9.humanComments ? 18 : -1);
316
+ } }
317
+ function TestingReviewComponent_Conditional_20_Conditional_16_Template(rf, ctx) { if (rf & 1) {
318
+ i0.ɵɵelementStart(0, "div", 88);
319
+ i0.ɵɵrepeaterCreate(1, TestingReviewComponent_Conditional_20_Conditional_16_For_2_Template, 19, 7, "div", 90, _forTrack1);
320
+ i0.ɵɵelementEnd();
321
+ } if (rf & 2) {
322
+ const ctx_r0 = i0.ɵɵnextContext(2);
323
+ i0.ɵɵadvance();
324
+ i0.ɵɵrepeater(ctx_r0.FilteredHistoryItems);
325
+ } }
326
+ function TestingReviewComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
327
+ const _r7 = i0.ɵɵgetCurrentView();
328
+ i0.ɵɵelementStart(0, "div", 13)(1, "div", 79)(2, "div", 80);
329
+ i0.ɵɵelement(3, "i", 81);
330
+ i0.ɵɵelementStart(4, "input", 82);
331
+ i0.ɵɵlistener("input", function TestingReviewComponent_Conditional_20_Template_input_input_4_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnHistorySearch($event)); });
332
+ i0.ɵɵelementEnd()();
333
+ i0.ɵɵelementStart(5, "div", 83)(6, "label");
334
+ i0.ɵɵtext(7, "Sort by:");
335
+ i0.ɵɵelementEnd();
336
+ i0.ɵɵelementStart(8, "select", 84);
337
+ i0.ɵɵlistener("change", function TestingReviewComponent_Conditional_20_Template_select_change_8_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnHistorySortChange($event)); });
338
+ i0.ɵɵelementStart(9, "option", 85);
339
+ i0.ɵɵtext(10, "Date");
340
+ i0.ɵɵelementEnd();
341
+ i0.ɵɵelementStart(11, "option", 86);
342
+ i0.ɵɵtext(12, "Rating");
343
+ i0.ɵɵelementEnd();
344
+ i0.ɵɵelementStart(13, "option", 87);
345
+ i0.ɵɵtext(14, "Test Name");
346
+ i0.ɵɵelementEnd()()()();
347
+ i0.ɵɵtemplate(15, TestingReviewComponent_Conditional_20_Conditional_15_Template, 6, 0, "div", 41)(16, TestingReviewComponent_Conditional_20_Conditional_16_Template, 3, 0, "div", 88);
348
+ i0.ɵɵelementEnd();
349
+ } if (rf & 2) {
350
+ const ctx_r0 = i0.ɵɵnextContext();
351
+ i0.ɵɵadvance(4);
352
+ i0.ɵɵproperty("value", ctx_r0.HistorySearchText);
353
+ i0.ɵɵadvance(4);
354
+ i0.ɵɵproperty("value", ctx_r0.HistorySortField);
355
+ i0.ɵɵadvance(7);
356
+ i0.ɵɵconditional(ctx_r0.FilteredHistoryItems.length === 0 ? 15 : 16);
357
+ } }
358
+ function TestingReviewComponent_Conditional_36_Template(rf, ctx) { if (rf & 1) {
359
+ i0.ɵɵelementStart(0, "div", 25);
360
+ i0.ɵɵelement(1, "i", 60);
361
+ i0.ɵɵtext(2, " Low agreement may indicate evaluation criteria need refinement. ");
362
+ i0.ɵɵelementEnd();
363
+ } }
364
+ export class TestingReviewComponent {
365
+ instrumentationService;
366
+ cdr;
367
+ initialState = null;
368
+ stateChange = new EventEmitter();
369
+ destroy$ = new Subject();
370
+ // View state
371
+ CurrentView = 'queue';
372
+ ExpandedItemId = null;
373
+ ExpandedHistoryId = null;
374
+ IsRefreshing = false;
375
+ IsSubmitting = false;
376
+ HistorySearchText = '';
377
+ HistorySortField = 'date';
378
+ // Form state for active review
379
+ FormState = { rating: null, isCorrect: null, comments: '' };
380
+ // Data
381
+ PendingItems = [];
382
+ HistoryItems = [];
383
+ FilteredHistoryItems = [];
384
+ Metrics = null;
385
+ PendingCount = 0;
386
+ // Constants
387
+ RatingNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
388
+ constructor(instrumentationService, cdr) {
389
+ this.instrumentationService = instrumentationService;
390
+ this.cdr = cdr;
391
+ }
392
+ ngOnInit() {
393
+ this.restoreState();
394
+ this.setupSubscriptions();
395
+ }
396
+ ngOnDestroy() {
397
+ this.destroy$.next();
398
+ this.destroy$.complete();
399
+ }
400
+ // ------------------------------------------------------------------
401
+ // Computed properties
402
+ // ------------------------------------------------------------------
403
+ get IsFormValid() {
404
+ return this.FormState.rating != null && this.FormState.isCorrect != null;
405
+ }
406
+ get AgreementRate() {
407
+ return this.Metrics?.agreementRate ?? 0;
408
+ }
409
+ get AgreementColor() {
410
+ const rate = this.AgreementRate;
411
+ if (rate >= 80)
412
+ return '#22c55e';
413
+ if (rate >= 60)
414
+ return '#eab308';
415
+ return '#ef4444';
416
+ }
417
+ get AgreementDash() {
418
+ const circumference = 2 * Math.PI * 52; // r=52
419
+ const filled = (this.AgreementRate / 100) * circumference;
420
+ return `${filled} ${circumference}`;
421
+ }
422
+ // ------------------------------------------------------------------
423
+ // Setup
424
+ // ------------------------------------------------------------------
425
+ restoreState() {
426
+ if (!this.initialState)
427
+ return;
428
+ const view = this.initialState['viewMode'];
429
+ if (view === 'queue' || view === 'history') {
430
+ this.CurrentView = view;
431
+ }
432
+ }
433
+ setupSubscriptions() {
434
+ this.instrumentationService.pendingFeedback$
435
+ .pipe(takeUntil(this.destroy$))
436
+ .subscribe(items => {
437
+ this.PendingItems = items;
438
+ this.PendingCount = items.length;
439
+ this.cdr.markForCheck();
440
+ });
441
+ this.instrumentationService.evaluationMetrics$
442
+ .pipe(takeUntil(this.destroy$))
443
+ .subscribe(metrics => {
444
+ this.Metrics = metrics;
445
+ this.cdr.markForCheck();
446
+ });
447
+ this.instrumentationService.testRunsWithFeedback$
448
+ .pipe(takeUntil(this.destroy$))
449
+ .subscribe(runs => {
450
+ this.HistoryItems = runs.filter(r => r.hasHumanFeedback);
451
+ this.applyHistoryFilters();
452
+ this.cdr.markForCheck();
453
+ });
454
+ }
455
+ // ------------------------------------------------------------------
456
+ // View toggling
457
+ // ------------------------------------------------------------------
458
+ SetView(mode) {
459
+ this.CurrentView = mode;
460
+ this.ExpandedItemId = null;
461
+ this.emitState();
462
+ this.cdr.markForCheck();
463
+ }
464
+ // ------------------------------------------------------------------
465
+ // Queue interactions
466
+ // ------------------------------------------------------------------
467
+ ToggleExpand(testRunID) {
468
+ if (this.ExpandedItemId === testRunID) {
469
+ this.ExpandedItemId = null;
470
+ }
471
+ else {
472
+ this.ExpandedItemId = testRunID;
473
+ this.resetForm();
474
+ }
475
+ this.cdr.markForCheck();
476
+ }
477
+ SelectRating(n) {
478
+ this.FormState = { ...this.FormState, rating: n };
479
+ this.cdr.markForCheck();
480
+ }
481
+ SelectCorrectness(value) {
482
+ this.FormState = { ...this.FormState, isCorrect: value };
483
+ this.cdr.markForCheck();
484
+ }
485
+ OnCommentsChange(event) {
486
+ const target = event.target;
487
+ this.FormState = { ...this.FormState, comments: target.value };
488
+ }
489
+ async SubmitReview(item) {
490
+ if (!this.IsFormValid || this.IsSubmitting)
491
+ return;
492
+ this.IsSubmitting = true;
493
+ this.cdr.markForCheck();
494
+ try {
495
+ const success = await this.instrumentationService.submitFeedback(item.testRunID, this.FormState.rating, this.FormState.isCorrect, this.FormState.comments);
496
+ if (success) {
497
+ this.ExpandedItemId = null;
498
+ this.resetForm();
499
+ }
500
+ }
501
+ finally {
502
+ this.IsSubmitting = false;
503
+ this.cdr.markForCheck();
504
+ }
505
+ }
506
+ SkipItem() {
507
+ const currentIndex = this.PendingItems.findIndex(i => i.testRunID === this.ExpandedItemId);
508
+ this.ExpandedItemId = null;
509
+ this.resetForm();
510
+ // Expand the next item if available
511
+ if (currentIndex >= 0 && currentIndex + 1 < this.PendingItems.length) {
512
+ this.ExpandedItemId = this.PendingItems[currentIndex + 1].testRunID;
513
+ }
514
+ this.cdr.markForCheck();
515
+ }
516
+ // ------------------------------------------------------------------
517
+ // History interactions
518
+ // ------------------------------------------------------------------
519
+ OnHistorySearch(event) {
520
+ const target = event.target;
521
+ this.HistorySearchText = target.value;
522
+ this.applyHistoryFilters();
523
+ this.cdr.markForCheck();
524
+ }
525
+ OnHistorySortChange(event) {
526
+ const target = event.target;
527
+ this.HistorySortField = target.value;
528
+ this.applyHistoryFilters();
529
+ this.cdr.markForCheck();
530
+ }
531
+ ToggleHistoryComment(id) {
532
+ this.ExpandedHistoryId = this.ExpandedHistoryId === id ? null : id;
533
+ this.cdr.markForCheck();
534
+ }
535
+ // ------------------------------------------------------------------
536
+ // Refresh
537
+ // ------------------------------------------------------------------
538
+ Refresh() {
539
+ this.IsRefreshing = true;
540
+ this.cdr.markForCheck();
541
+ this.instrumentationService.refresh();
542
+ setTimeout(() => {
543
+ this.IsRefreshing = false;
544
+ this.cdr.markForCheck();
545
+ }, 1500);
546
+ }
547
+ // ------------------------------------------------------------------
548
+ // Formatting helpers
549
+ // ------------------------------------------------------------------
550
+ FormatDecimal(value, decimals) {
551
+ if (value == null)
552
+ return '0';
553
+ return value.toFixed(decimals);
554
+ }
555
+ FormatRelativeTime(date) {
556
+ const now = Date.now();
557
+ const then = date instanceof Date ? date.getTime() : new Date(date).getTime();
558
+ const diffMs = now - then;
559
+ const diffMin = Math.floor(diffMs / 60000);
560
+ if (diffMin < 1)
561
+ return 'just now';
562
+ if (diffMin < 60)
563
+ return `${diffMin}m ago`;
564
+ const diffHours = Math.floor(diffMin / 60);
565
+ if (diffHours < 24)
566
+ return `${diffHours}h ago`;
567
+ const diffDays = Math.floor(diffHours / 24);
568
+ if (diffDays < 7)
569
+ return `${diffDays}d ago`;
570
+ const diffWeeks = Math.floor(diffDays / 7);
571
+ if (diffWeeks < 4)
572
+ return `${diffWeeks}w ago`;
573
+ const diffMonths = Math.floor(diffDays / 30);
574
+ return `${diffMonths}mo ago`;
575
+ }
576
+ // ------------------------------------------------------------------
577
+ // Private helpers
578
+ // ------------------------------------------------------------------
579
+ resetForm() {
580
+ this.FormState = { rating: null, isCorrect: null, comments: '' };
581
+ }
582
+ applyHistoryFilters() {
583
+ let items = [...this.HistoryItems];
584
+ // Search filter
585
+ if (this.HistorySearchText) {
586
+ const term = this.HistorySearchText.toLowerCase();
587
+ items = items.filter(i => i.testName.toLowerCase().includes(term));
588
+ }
589
+ // Sort
590
+ items.sort((a, b) => {
591
+ switch (this.HistorySortField) {
592
+ case 'date':
593
+ return b.runDateTime.getTime() - a.runDateTime.getTime();
594
+ case 'rating':
595
+ return (b.humanRating ?? 0) - (a.humanRating ?? 0);
596
+ case 'test-name':
597
+ return a.testName.localeCompare(b.testName);
598
+ default:
599
+ return 0;
600
+ }
601
+ });
602
+ this.FilteredHistoryItems = items;
603
+ }
604
+ emitState() {
605
+ this.stateChange.emit({ viewMode: this.CurrentView });
606
+ }
607
+ static ɵfac = function TestingReviewComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TestingReviewComponent)(i0.ɵɵdirectiveInject(i1.TestingInstrumentationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
608
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestingReviewComponent, selectors: [["app-testing-review"]], inputs: { initialState: "initialState" }, outputs: { stateChange: "stateChange" }, decls: 37, vars: 16, consts: [[1, "review-page"], [1, "page-header"], [1, "header-left"], [1, "fa-solid", "fa-clipboard-check"], [1, "pending-badge"], [1, "refresh-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-arrows-rotate"], [1, "kpi-row"], [1, "view-toggle-bar"], [1, "toggle-group"], [1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-list-check"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "content-card"], [1, "calibration-section"], [1, "fa-solid", "fa-scale-balanced"], [1, "calibration-body"], [1, "gauge-display"], [1, "gauge-ring"], ["viewBox", "0 0 120 120", 1, "gauge-svg"], ["cx", "60", "cy", "60", "r", "52", "fill", "none", "stroke", "#e2e8f0", "stroke-width", "10"], ["cx", "60", "cy", "60", "r", "52", "fill", "none", "stroke-width", "10", "stroke-linecap", "round", "stroke-dashoffset", "0", "transform", "rotate(-90 60 60)"], [1, "gauge-value"], [1, "calibration-text"], [1, "calibration-description"], [1, "calibration-warning"], [1, "badge-count"], [1, "badge-text"], [1, "kpi-card"], [1, "kpi-icon", "orange"], [1, "fa-solid", "fa-hourglass-half"], [1, "kpi-content"], [1, "kpi-value"], [1, "kpi-label"], [1, "kpi-icon", "green"], [1, "fa-solid", "fa-check-circle"], [1, "kpi-icon", "gold"], [1, "fa-solid", "fa-star"], [1, "kpi-unit"], [1, "kpi-icon", "blue"], [1, "fa-solid", "fa-handshake"], [1, "empty-state"], [1, "queue-list"], [1, "fa-solid", "fa-circle-check"], [1, "queue-item", 3, "expanded"], [1, "queue-item"], [1, "queue-item-header", 3, "click"], [1, "item-info"], [1, "item-name"], [1, "item-meta"], [1, "meta-time"], [1, "fa-solid", "fa-clock"], [3, "score", "showBar"], [3, "status"], [1, "item-actions-area"], [1, "reason-badge"], [1, "expand-toggle"], [1, "fa-solid"], [1, "review-form-panel"], [1, "fa-solid", "fa-comment-slash"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "fa-solid", "fa-circle-question"], [1, "form-section"], [1, "form-label"], [1, "rating-row"], [1, "rating-circle", 3, "selected", "current"], [1, "rating-display"], [1, "correctness-row"], [1, "correctness-btn", "correct", 3, "click"], [1, "fa-solid", "fa-check"], [1, "correctness-btn", "incorrect", 3, "click"], [1, "fa-solid", "fa-xmark"], ["rows", "3", "placeholder", "Add any comments about this evaluation...", 1, "notes-textarea", 3, "input", "value"], [1, "form-actions"], [1, "submit-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-paper-plane"], [1, "skip-btn", 3, "click"], [1, "fa-solid", "fa-forward"], [1, "rating-circle", 3, "click"], [1, "history-filters"], [1, "search-wrapper"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search by test name...", 3, "input", "value"], [1, "sort-control"], [3, "change", "value"], ["value", "date"], ["value", "rating"], ["value", "test-name"], [1, "history-list"], [1, "fa-solid", "fa-folder-open"], [1, "history-item"], [1, "history-item-main"], [1, "history-name"], [1, "history-date"], [1, "fa-solid", "fa-calendar"], [1, "history-rating"], [1, "rating-dots"], [1, "rating-dot", 3, "filled"], [1, "rating-label"], [1, "history-verdict"], [1, "verdict", "correct"], [1, "verdict", "incorrect"], [1, "history-auto-score"], [1, "history-comments", 3, "expanded"], [1, "rating-dot"], [1, "history-comments", 3, "click"]], template: function TestingReviewComponent_Template(rf, ctx) { if (rf & 1) {
609
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h2");
610
+ i0.ɵɵelement(4, "i", 3);
611
+ i0.ɵɵtext(5, " Human Review ");
612
+ i0.ɵɵelementEnd();
613
+ i0.ɵɵtemplate(6, TestingReviewComponent_Conditional_6_Template, 5, 1, "div", 4);
614
+ i0.ɵɵelementEnd();
615
+ i0.ɵɵelementStart(7, "button", 5);
616
+ i0.ɵɵlistener("click", function TestingReviewComponent_Template_button_click_7_listener() { return ctx.Refresh(); });
617
+ i0.ɵɵelement(8, "i", 6);
618
+ i0.ɵɵtext(9);
619
+ i0.ɵɵelementEnd()();
620
+ i0.ɵɵtemplate(10, TestingReviewComponent_Conditional_10_Template, 37, 4, "div", 7);
621
+ i0.ɵɵelementStart(11, "div", 8)(12, "div", 9)(13, "button", 10);
622
+ i0.ɵɵlistener("click", function TestingReviewComponent_Template_button_click_13_listener() { return ctx.SetView("queue"); });
623
+ i0.ɵɵelement(14, "i", 11);
624
+ i0.ɵɵtext(15, " Review Queue ");
625
+ i0.ɵɵelementEnd();
626
+ i0.ɵɵelementStart(16, "button", 10);
627
+ i0.ɵɵlistener("click", function TestingReviewComponent_Template_button_click_16_listener() { return ctx.SetView("history"); });
628
+ i0.ɵɵelement(17, "i", 12);
629
+ i0.ɵɵtext(18, " History ");
630
+ i0.ɵɵelementEnd()()();
631
+ i0.ɵɵtemplate(19, TestingReviewComponent_Conditional_19_Template, 3, 1, "div", 13)(20, TestingReviewComponent_Conditional_20_Template, 17, 3, "div", 13);
632
+ i0.ɵɵelementStart(21, "div", 14)(22, "h3");
633
+ i0.ɵɵelement(23, "i", 15);
634
+ i0.ɵɵtext(24, " Human vs Auto Agreement ");
635
+ i0.ɵɵelementEnd();
636
+ i0.ɵɵelementStart(25, "div", 16)(26, "div", 17)(27, "div", 18);
637
+ i0.ɵɵnamespaceSVG();
638
+ i0.ɵɵelementStart(28, "svg", 19);
639
+ i0.ɵɵelement(29, "circle", 20)(30, "circle", 21);
640
+ i0.ɵɵelementEnd();
641
+ i0.ɵɵnamespaceHTML();
642
+ i0.ɵɵelementStart(31, "div", 22);
643
+ i0.ɵɵtext(32);
644
+ i0.ɵɵelementEnd()()();
645
+ i0.ɵɵelementStart(33, "div", 23)(34, "p", 24);
646
+ i0.ɵɵtext(35, " Measures how often human reviewers agree with automated evaluation scores. ");
647
+ i0.ɵɵelementEnd();
648
+ i0.ɵɵtemplate(36, TestingReviewComponent_Conditional_36_Template, 3, 0, "div", 25);
649
+ i0.ɵɵelementEnd()()()();
650
+ } if (rf & 2) {
651
+ i0.ɵɵadvance(6);
652
+ i0.ɵɵconditional(ctx.PendingCount > 0 ? 6 : -1);
653
+ i0.ɵɵadvance();
654
+ i0.ɵɵproperty("disabled", ctx.IsRefreshing);
655
+ i0.ɵɵadvance();
656
+ i0.ɵɵclassProp("fa-spin", ctx.IsRefreshing);
657
+ i0.ɵɵadvance();
658
+ i0.ɵɵtextInterpolate1(" ", ctx.IsRefreshing ? "Refreshing..." : "Refresh", " ");
659
+ i0.ɵɵadvance();
660
+ i0.ɵɵconditional(ctx.Metrics ? 10 : -1);
661
+ i0.ɵɵadvance(3);
662
+ i0.ɵɵclassProp("active", ctx.CurrentView === "queue");
663
+ i0.ɵɵadvance(3);
664
+ i0.ɵɵclassProp("active", ctx.CurrentView === "history");
665
+ i0.ɵɵadvance(3);
666
+ i0.ɵɵconditional(ctx.CurrentView === "queue" ? 19 : -1);
667
+ i0.ɵɵadvance();
668
+ i0.ɵɵconditional(ctx.CurrentView === "history" ? 20 : -1);
669
+ i0.ɵɵadvance(10);
670
+ i0.ɵɵattribute("stroke", ctx.AgreementColor)("stroke-dasharray", ctx.AgreementDash);
671
+ i0.ɵɵadvance(2);
672
+ i0.ɵɵtextInterpolate1("", ctx.FormatDecimal(ctx.AgreementRate, 0), "%");
673
+ i0.ɵɵadvance(4);
674
+ i0.ɵɵconditional(ctx.AgreementRate < 70 ? 36 : -1);
675
+ } }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i3.TestStatusBadgeComponent, i3.ScoreIndicatorComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n }\n\n .review-page[_ngcontent-%COMP%] {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background: #f8f9fa;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n \n\n .page-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n background: white;\n padding: 20px;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n .header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .header-left[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 22px;\n font-weight: 700;\n color: #1e293b;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-left[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3b82f6;\n }\n\n .pending-badge[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 14px;\n background: linear-gradient(135deg, #fff7ed 0%, #ffedd5 100%);\n border: 1px solid #fb923c;\n border-radius: 20px;\n }\n\n .badge-count[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f97316 0%, #ea580c 100%);\n color: white;\n min-width: 24px;\n height: 24px;\n padding: 0 6px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 700;\n }\n\n .badge-text[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: #ea580c;\n }\n\n .refresh-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n background: white;\n color: #64748b;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .refresh-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #f8fafc;\n border-color: #cbd5e1;\n }\n\n .refresh-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n \n\n .kpi-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 20px;\n }\n\n .kpi-card[_ngcontent-%COMP%] {\n background: white;\n padding: 20px;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .kpi-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n color: white;\n flex-shrink: 0;\n }\n\n .kpi-icon.orange[_ngcontent-%COMP%] { background: linear-gradient(135deg, #f97316 0%, #ea580c 100%); }\n .kpi-icon.green[_ngcontent-%COMP%] { background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%); }\n .kpi-icon.gold[_ngcontent-%COMP%] { background: linear-gradient(135deg, #eab308 0%, #ca8a04 100%); }\n .kpi-icon.blue[_ngcontent-%COMP%] { background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%); }\n\n .kpi-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .kpi-value[_ngcontent-%COMP%] {\n font-size: 26px;\n font-weight: 700;\n color: #1e293b;\n line-height: 1;\n margin-bottom: 4px;\n }\n\n .kpi-unit[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #64748b;\n }\n\n .kpi-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #64748b;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n \n\n .view-toggle-bar[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n }\n\n .toggle-group[_ngcontent-%COMP%] {\n display: inline-flex;\n background: white;\n border-radius: 10px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n }\n\n .toggle-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 24px;\n border: none;\n background: white;\n color: #64748b;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .toggle-btn[_ngcontent-%COMP%]:hover:not(.active) {\n background: #f8fafc;\n }\n\n .toggle-btn.active[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);\n color: white;\n }\n\n \n\n .content-card[_ngcontent-%COMP%] {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n margin-bottom: 20px;\n }\n\n \n\n .queue-list[_ngcontent-%COMP%] {\n max-height: 600px;\n overflow-y: auto;\n }\n\n .queue-item[_ngcontent-%COMP%] {\n border-bottom: 1px solid #f1f5f9;\n transition: background 0.2s ease;\n }\n\n .queue-item.expanded[_ngcontent-%COMP%] {\n background: #f8fafc;\n }\n\n .queue-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .queue-item-header[_ngcontent-%COMP%] {\n padding: 16px 20px;\n display: flex;\n align-items: center;\n gap: 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n }\n\n .queue-item-header[_ngcontent-%COMP%]:hover {\n background: rgba(59, 130, 246, 0.04);\n }\n\n .item-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .item-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: #1e293b;\n margin-bottom: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 14px;\n font-size: 12px;\n color: #64748b;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .meta-time[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n }\n\n .item-actions-area[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .reason-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n }\n\n .reason-no-feedback[_ngcontent-%COMP%] {\n background: #dbeafe;\n color: #1e40af;\n }\n\n .reason-high-score-failed[_ngcontent-%COMP%] {\n background: #ffedd5;\n color: #c2410c;\n }\n\n .reason-low-score-passed[_ngcontent-%COMP%] {\n background: #fef9c3;\n color: #a16207;\n }\n\n .expand-toggle[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: #94a3b8;\n cursor: pointer;\n padding: 8px;\n border-radius: 6px;\n font-size: 14px;\n transition: all 0.2s ease;\n }\n\n .expand-toggle[_ngcontent-%COMP%]:hover {\n background: #e2e8f0;\n color: #64748b;\n }\n\n \n\n .review-form-panel[_ngcontent-%COMP%] {\n padding: 20px 20px 20px 36px;\n border-top: 1px solid #e2e8f0;\n background: white;\n }\n\n .form-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n }\n\n .form-section[_ngcontent-%COMP%]:last-of-type {\n margin-bottom: 16px;\n }\n\n .form-label[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n font-weight: 700;\n color: #475569;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 10px;\n }\n\n \n\n .rating-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .rating-circle[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n border: 2px solid #e2e8f0;\n background: white;\n color: #94a3b8;\n font-size: 13px;\n font-weight: 700;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n }\n\n .rating-circle[_ngcontent-%COMP%]:hover {\n border-color: #3b82f6;\n color: #3b82f6;\n transform: scale(1.1);\n }\n\n .rating-circle.selected[_ngcontent-%COMP%] {\n background: #3b82f6;\n border-color: #3b82f6;\n color: white;\n }\n\n .rating-circle.current[_ngcontent-%COMP%] {\n background: #2563eb;\n border-color: #1d4ed8;\n color: white;\n box-shadow: 0 2px 6px rgba(37, 99, 235, 0.35);\n }\n\n .rating-display[_ngcontent-%COMP%] {\n margin-left: 12px;\n font-size: 16px;\n font-weight: 700;\n color: #1e293b;\n }\n\n \n\n .correctness-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n }\n\n .correctness-btn[_ngcontent-%COMP%] {\n flex: 1;\n max-width: 200px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n border: 2px solid #e2e8f0;\n border-radius: 10px;\n background: white;\n font-size: 14px;\n font-weight: 600;\n color: #64748b;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .correctness-btn.correct[_ngcontent-%COMP%]:hover, \n .correctness-btn.correct.active[_ngcontent-%COMP%] {\n border-color: #22c55e;\n background: #f0fdf4;\n color: #166534;\n }\n\n .correctness-btn.incorrect[_ngcontent-%COMP%]:hover, \n .correctness-btn.incorrect.active[_ngcontent-%COMP%] {\n border-color: #ef4444;\n background: #fef2f2;\n color: #991b1b;\n }\n\n \n\n .notes-textarea[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 500px;\n padding: 12px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n min-height: 72px;\n box-sizing: border-box;\n }\n\n .notes-textarea[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n\n \n\n .form-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n }\n\n .submit-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 11px 22px;\n border: none;\n border-radius: 8px;\n background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);\n color: white;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .submit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3);\n }\n\n .submit-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .skip-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 11px 20px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n background: white;\n color: #64748b;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .skip-btn[_ngcontent-%COMP%]:hover {\n border-color: #cbd5e1;\n background: #f8fafc;\n }\n\n \n\n .history-filters[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n padding: 16px 20px;\n border-bottom: 1px solid #f1f5f9;\n align-items: center;\n }\n\n .search-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .search-wrapper[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n color: #94a3b8;\n font-size: 13px;\n }\n\n .search-wrapper[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px 10px 36px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 13px;\n }\n\n .search-wrapper[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n\n .sort-control[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #64748b;\n flex-shrink: 0;\n }\n\n .sort-control[_ngcontent-%COMP%] select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n font-size: 12px;\n background: white;\n }\n\n \n\n .history-list[_ngcontent-%COMP%] {\n max-height: 600px;\n overflow-y: auto;\n }\n\n .history-item[_ngcontent-%COMP%] {\n padding: 16px 20px;\n border-bottom: 1px solid #f1f5f9;\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n }\n\n .history-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .history-item-main[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 160px;\n }\n\n .history-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: #1e293b;\n margin-bottom: 4px;\n }\n\n .history-date[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #94a3b8;\n display: flex;\n align-items: center;\n gap: 5px;\n }\n\n .history-rating[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .rating-dots[_ngcontent-%COMP%] {\n display: flex;\n gap: 3px;\n }\n\n .rating-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: #e2e8f0;\n }\n\n .rating-dot.filled[_ngcontent-%COMP%] {\n background: #f59e0b;\n }\n\n .rating-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: #64748b;\n }\n\n .history-verdict[_ngcontent-%COMP%] {\n flex-shrink: 0;\n }\n\n .verdict[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border-radius: 14px;\n font-size: 11px;\n font-weight: 600;\n }\n\n .verdict.correct[_ngcontent-%COMP%] {\n background: #dcfce7;\n color: #166534;\n }\n\n .verdict.incorrect[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #991b1b;\n }\n\n .history-auto-score[_ngcontent-%COMP%] {\n flex-shrink: 0;\n }\n\n .history-comments[_ngcontent-%COMP%] {\n width: 100%;\n margin-top: 8px;\n padding: 10px 14px;\n background: #f8fafc;\n border-radius: 8px;\n border-left: 3px solid #3b82f6;\n cursor: pointer;\n }\n\n .history-comments[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #475569;\n line-height: 1.5;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .history-comments.expanded[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n white-space: normal;\n }\n\n \n\n .empty-state[_ngcontent-%COMP%] {\n padding: 60px 20px;\n text-align: center;\n }\n\n .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 52px;\n margin-bottom: 16px;\n color: #22c55e;\n }\n\n .empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 18px;\n color: #1e293b;\n margin: 0 0 8px 0;\n font-weight: 600;\n }\n\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #94a3b8;\n margin: 0;\n }\n\n \n\n .calibration-section[_ngcontent-%COMP%] {\n background: white;\n padding: 24px;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n .calibration-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 20px 0;\n font-size: 16px;\n font-weight: 600;\n color: #1e293b;\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .calibration-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3b82f6;\n }\n\n .calibration-body[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 32px;\n }\n\n .gauge-display[_ngcontent-%COMP%] {\n flex-shrink: 0;\n }\n\n .gauge-ring[_ngcontent-%COMP%] {\n position: relative;\n width: 120px;\n height: 120px;\n }\n\n .gauge-svg[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n }\n\n .gauge-value[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n font-weight: 800;\n color: #1e293b;\n }\n\n .calibration-text[_ngcontent-%COMP%] {\n flex: 1;\n }\n\n .calibration-description[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 14px;\n color: #64748b;\n line-height: 1.6;\n }\n\n .calibration-warning[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: #fef3c7;\n border: 1px solid #fbbf24;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: #92400e;\n }\n\n .calibration-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #d97706;\n font-size: 16px;\n flex-shrink: 0;\n }\n\n \n\n .queue-item[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n }\n\n @keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n \n\n @media (max-width: 1024px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .review-page[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .page-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n align-items: flex-start;\n }\n\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr 1fr;\n }\n\n .kpi-card[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .kpi-value[_ngcontent-%COMP%] {\n font-size: 22px;\n }\n\n .queue-item-header[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .item-actions-area[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: flex-end;\n margin-top: 8px;\n }\n\n .correctness-row[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .correctness-btn[_ngcontent-%COMP%] {\n max-width: 100%;\n }\n\n .history-item[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .calibration-body[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: center;\n text-align: center;\n }\n }"], changeDetection: 0 });
676
+ }
677
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TestingReviewComponent, [{
678
+ type: Component,
679
+ args: [{ selector: 'app-testing-review', changeDetection: ChangeDetectionStrategy.OnPush, template: `
680
+ <!-- Page Header -->
681
+ <div class="review-page">
682
+ <div class="page-header">
683
+ <div class="header-left">
684
+ <h2>
685
+ <i class="fa-solid fa-clipboard-check"></i>
686
+ Human Review
687
+ </h2>
688
+ @if (PendingCount > 0) {
689
+ <div class="pending-badge">
690
+ <span class="badge-count">{{ PendingCount }}</span>
691
+ <span class="badge-text">pending</span>
692
+ </div>
693
+ }
694
+ </div>
695
+ <button class="refresh-btn" (click)="Refresh()" [disabled]="IsRefreshing">
696
+ <i class="fa-solid fa-arrows-rotate" [class.fa-spin]="IsRefreshing"></i>
697
+ {{ IsRefreshing ? 'Refreshing...' : 'Refresh' }}
698
+ </button>
699
+ </div>
700
+
701
+ <!-- KPI Summary Row -->
702
+ @if (Metrics) {
703
+ <div class="kpi-row">
704
+ <div class="kpi-card">
705
+ <div class="kpi-icon orange">
706
+ <i class="fa-solid fa-hourglass-half"></i>
707
+ </div>
708
+ <div class="kpi-content">
709
+ <div class="kpi-value">{{ Metrics.humanPendingCount }}</div>
710
+ <div class="kpi-label">Pending Review</div>
711
+ </div>
712
+ </div>
713
+ <div class="kpi-card">
714
+ <div class="kpi-icon green">
715
+ <i class="fa-solid fa-check-circle"></i>
716
+ </div>
717
+ <div class="kpi-content">
718
+ <div class="kpi-value">{{ Metrics.humanReviewedCount }}</div>
719
+ <div class="kpi-label">Reviewed</div>
720
+ </div>
721
+ </div>
722
+ <div class="kpi-card">
723
+ <div class="kpi-icon gold">
724
+ <i class="fa-solid fa-star"></i>
725
+ </div>
726
+ <div class="kpi-content">
727
+ <div class="kpi-value">{{ FormatDecimal(Metrics.humanAvgRating, 1) }}<span class="kpi-unit">/10</span></div>
728
+ <div class="kpi-label">Avg Rating</div>
729
+ </div>
730
+ </div>
731
+ <div class="kpi-card">
732
+ <div class="kpi-icon blue">
733
+ <i class="fa-solid fa-handshake"></i>
734
+ </div>
735
+ <div class="kpi-content">
736
+ <div class="kpi-value">{{ FormatDecimal(Metrics.agreementRate, 0) }}<span class="kpi-unit">%</span></div>
737
+ <div class="kpi-label">Agreement Rate</div>
738
+ </div>
739
+ </div>
740
+ </div>
741
+ }
742
+
743
+ <!-- View Mode Toggle -->
744
+ <div class="view-toggle-bar">
745
+ <div class="toggle-group">
746
+ <button class="toggle-btn" [class.active]="CurrentView === 'queue'" (click)="SetView('queue')">
747
+ <i class="fa-solid fa-list-check"></i>
748
+ Review Queue
749
+ </button>
750
+ <button class="toggle-btn" [class.active]="CurrentView === 'history'" (click)="SetView('history')">
751
+ <i class="fa-solid fa-clock-rotate-left"></i>
752
+ History
753
+ </button>
754
+ </div>
755
+ </div>
756
+
757
+ <!-- Review Queue View -->
758
+ @if (CurrentView === 'queue') {
759
+ <div class="content-card">
760
+ @if (PendingItems.length === 0) {
761
+ <div class="empty-state">
762
+ <i class="fa-solid fa-circle-check"></i>
763
+ <h3>All caught up!</h3>
764
+ <p>No tests currently require human review.</p>
765
+ </div>
766
+ } @else {
767
+ <div class="queue-list">
768
+ @for (item of PendingItems; track item.testRunID) {
769
+ <div class="queue-item" [class.expanded]="ExpandedItemId === item.testRunID">
770
+ <div class="queue-item-header" (click)="ToggleExpand(item.testRunID)">
771
+ <div class="item-info">
772
+ <div class="item-name">{{ item.testName }}</div>
773
+ <div class="item-meta">
774
+ <span class="meta-time">
775
+ <i class="fa-solid fa-clock"></i>
776
+ {{ FormatRelativeTime(item.runDateTime) }}
777
+ </span>
778
+ <app-score-indicator [score]="item.automatedScore" [showBar]="true"></app-score-indicator>
779
+ <app-test-status-badge [status]="$any(item.automatedStatus)"></app-test-status-badge>
780
+ </div>
781
+ </div>
782
+ <div class="item-actions-area">
783
+ <span class="reason-badge" [class]="'reason-' + item.reason">
784
+ @if (item.reason === 'no-feedback') {
785
+ <i class="fa-solid fa-comment-slash"></i> No Feedback
786
+ } @else if (item.reason === 'high-score-failed') {
787
+ <i class="fa-solid fa-triangle-exclamation"></i> Score Mismatch
788
+ } @else {
789
+ <i class="fa-solid fa-circle-question"></i> Needs Verification
790
+ }
791
+ </span>
792
+ <button class="expand-toggle">
793
+ <i class="fa-solid" [class.fa-chevron-down]="ExpandedItemId !== item.testRunID"
794
+ [class.fa-chevron-up]="ExpandedItemId === item.testRunID"></i>
795
+ </button>
796
+ </div>
797
+ </div>
798
+
799
+ @if (ExpandedItemId === item.testRunID) {
800
+ <div class="review-form-panel">
801
+ <!-- Rating -->
802
+ <div class="form-section">
803
+ <label class="form-label">Rating</label>
804
+ <div class="rating-row">
805
+ @for (n of RatingNumbers; track n) {
806
+ <button class="rating-circle"
807
+ [class.selected]="FormState.rating != null && n <= FormState.rating"
808
+ [class.current]="FormState.rating === n"
809
+ (click)="SelectRating(n)">
810
+ {{ n }}
811
+ </button>
812
+ }
813
+ @if (FormState.rating != null) {
814
+ <span class="rating-display">{{ FormState.rating }}/10</span>
815
+ }
816
+ </div>
817
+ </div>
818
+
819
+ <!-- Correctness -->
820
+ <div class="form-section">
821
+ <label class="form-label">Is the automated result correct?</label>
822
+ <div class="correctness-row">
823
+ <button class="correctness-btn correct"
824
+ [class.active]="FormState.isCorrect === true"
825
+ (click)="SelectCorrectness(true)">
826
+ <i class="fa-solid fa-check"></i> Correct
827
+ </button>
828
+ <button class="correctness-btn incorrect"
829
+ [class.active]="FormState.isCorrect === false"
830
+ (click)="SelectCorrectness(false)">
831
+ <i class="fa-solid fa-xmark"></i> Incorrect
832
+ </button>
833
+ </div>
834
+ </div>
835
+
836
+ <!-- Notes -->
837
+ <div class="form-section">
838
+ <label class="form-label">Notes (optional)</label>
839
+ <textarea class="notes-textarea"
840
+ rows="3"
841
+ placeholder="Add any comments about this evaluation..."
842
+ [value]="FormState.comments"
843
+ (input)="OnCommentsChange($event)"></textarea>
844
+ </div>
845
+
846
+ <!-- Actions -->
847
+ <div class="form-actions">
848
+ <button class="submit-btn"
849
+ [disabled]="!IsFormValid || IsSubmitting"
850
+ (click)="SubmitReview(item)">
851
+ <i class="fa-solid fa-paper-plane"></i>
852
+ {{ IsSubmitting ? 'Submitting...' : 'Submit' }}
853
+ </button>
854
+ <button class="skip-btn" (click)="SkipItem()">
855
+ <i class="fa-solid fa-forward"></i> Skip
856
+ </button>
857
+ </div>
858
+ </div>
859
+ }
860
+ </div>
861
+ }
862
+ </div>
863
+ }
864
+ </div>
865
+ }
866
+
867
+ <!-- History View -->
868
+ @if (CurrentView === 'history') {
869
+ <div class="content-card">
870
+ <!-- Filter Bar -->
871
+ <div class="history-filters">
872
+ <div class="search-wrapper">
873
+ <i class="fa-solid fa-search"></i>
874
+ <input type="text"
875
+ placeholder="Search by test name..."
876
+ [value]="HistorySearchText"
877
+ (input)="OnHistorySearch($event)" />
878
+ </div>
879
+ <div class="sort-control">
880
+ <label>Sort by:</label>
881
+ <select [value]="HistorySortField" (change)="OnHistorySortChange($event)">
882
+ <option value="date">Date</option>
883
+ <option value="rating">Rating</option>
884
+ <option value="test-name">Test Name</option>
885
+ </select>
886
+ </div>
887
+ </div>
888
+
889
+ @if (FilteredHistoryItems.length === 0) {
890
+ <div class="empty-state">
891
+ <i class="fa-solid fa-folder-open"></i>
892
+ <h3>No reviewed items</h3>
893
+ <p>Reviewed tests will appear here once feedback is submitted.</p>
894
+ </div>
895
+ } @else {
896
+ <div class="history-list">
897
+ @for (item of FilteredHistoryItems; track item.id) {
898
+ <div class="history-item">
899
+ <div class="history-item-main">
900
+ <div class="history-name">{{ item.testName }}</div>
901
+ <div class="history-date">
902
+ <i class="fa-solid fa-calendar"></i>
903
+ {{ FormatRelativeTime(item.runDateTime) }}
904
+ </div>
905
+ </div>
906
+ <div class="history-rating">
907
+ <div class="rating-dots">
908
+ @for (n of RatingNumbers; track n) {
909
+ <span class="rating-dot" [class.filled]="item.humanRating != null && n <= item.humanRating"></span>
910
+ }
911
+ </div>
912
+ <span class="rating-label">{{ item.humanRating ?? 0 }}/10</span>
913
+ </div>
914
+ <div class="history-verdict">
915
+ @if (item.humanIsCorrect === true) {
916
+ <span class="verdict correct">
917
+ <i class="fa-solid fa-check"></i> Correct
918
+ </span>
919
+ } @else if (item.humanIsCorrect === false) {
920
+ <span class="verdict incorrect">
921
+ <i class="fa-solid fa-xmark"></i> Incorrect
922
+ </span>
923
+ }
924
+ </div>
925
+ <div class="history-auto-score">
926
+ <app-score-indicator [score]="item.score" [showBar]="true"></app-score-indicator>
927
+ </div>
928
+ @if (item.humanComments) {
929
+ <div class="history-comments"
930
+ [class.expanded]="ExpandedHistoryId === item.id"
931
+ (click)="ToggleHistoryComment(item.id)">
932
+ <p>{{ item.humanComments }}</p>
933
+ </div>
934
+ }
935
+ </div>
936
+ }
937
+ </div>
938
+ }
939
+ </div>
940
+ }
941
+
942
+ <!-- Calibration Insights -->
943
+ <div class="calibration-section">
944
+ <h3>
945
+ <i class="fa-solid fa-scale-balanced"></i>
946
+ Human vs Auto Agreement
947
+ </h3>
948
+ <div class="calibration-body">
949
+ <div class="gauge-display">
950
+ <div class="gauge-ring">
951
+ <svg viewBox="0 0 120 120" class="gauge-svg">
952
+ <circle cx="60" cy="60" r="52" fill="none" stroke="#e2e8f0" stroke-width="10" />
953
+ <circle cx="60" cy="60" r="52" fill="none"
954
+ [attr.stroke]="AgreementColor"
955
+ stroke-width="10"
956
+ stroke-linecap="round"
957
+ [attr.stroke-dasharray]="AgreementDash"
958
+ stroke-dashoffset="0"
959
+ transform="rotate(-90 60 60)" />
960
+ </svg>
961
+ <div class="gauge-value">{{ FormatDecimal(AgreementRate, 0) }}%</div>
962
+ </div>
963
+ </div>
964
+ <div class="calibration-text">
965
+ <p class="calibration-description">
966
+ Measures how often human reviewers agree with automated evaluation scores.
967
+ </p>
968
+ @if (AgreementRate < 70) {
969
+ <div class="calibration-warning">
970
+ <i class="fa-solid fa-triangle-exclamation"></i>
971
+ Low agreement may indicate evaluation criteria need refinement.
972
+ </div>
973
+ }
974
+ </div>
975
+ </div>
976
+ </div>
977
+ </div>
978
+ `, styles: ["\n :host {\n display: block;\n height: 100%;\n }\n\n .review-page {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background: #f8f9fa;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n /* Page Header */\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n background: white;\n padding: 20px;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .header-left h2 {\n margin: 0;\n font-size: 22px;\n font-weight: 700;\n color: #1e293b;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-left h2 i {\n color: #3b82f6;\n }\n\n .pending-badge {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 14px;\n background: linear-gradient(135deg, #fff7ed 0%, #ffedd5 100%);\n border: 1px solid #fb923c;\n border-radius: 20px;\n }\n\n .badge-count {\n background: linear-gradient(135deg, #f97316 0%, #ea580c 100%);\n color: white;\n min-width: 24px;\n height: 24px;\n padding: 0 6px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 700;\n }\n\n .badge-text {\n font-size: 12px;\n font-weight: 600;\n color: #ea580c;\n }\n\n .refresh-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n background: white;\n color: #64748b;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .refresh-btn:hover:not(:disabled) {\n background: #f8fafc;\n border-color: #cbd5e1;\n }\n\n .refresh-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n /* KPI Row */\n .kpi-row {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 20px;\n }\n\n .kpi-card {\n background: white;\n padding: 20px;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .kpi-icon {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n color: white;\n flex-shrink: 0;\n }\n\n .kpi-icon.orange { background: linear-gradient(135deg, #f97316 0%, #ea580c 100%); }\n .kpi-icon.green { background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%); }\n .kpi-icon.gold { background: linear-gradient(135deg, #eab308 0%, #ca8a04 100%); }\n .kpi-icon.blue { background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%); }\n\n .kpi-content {\n flex: 1;\n min-width: 0;\n }\n\n .kpi-value {\n font-size: 26px;\n font-weight: 700;\n color: #1e293b;\n line-height: 1;\n margin-bottom: 4px;\n }\n\n .kpi-unit {\n font-size: 14px;\n font-weight: 500;\n color: #64748b;\n }\n\n .kpi-label {\n font-size: 11px;\n color: #64748b;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n /* View Toggle */\n .view-toggle-bar {\n margin-bottom: 20px;\n }\n\n .toggle-group {\n display: inline-flex;\n background: white;\n border-radius: 10px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n }\n\n .toggle-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 24px;\n border: none;\n background: white;\n color: #64748b;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .toggle-btn:hover:not(.active) {\n background: #f8fafc;\n }\n\n .toggle-btn.active {\n background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);\n color: white;\n }\n\n /* Content Card */\n .content-card {\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n margin-bottom: 20px;\n }\n\n /* Queue List */\n .queue-list {\n max-height: 600px;\n overflow-y: auto;\n }\n\n .queue-item {\n border-bottom: 1px solid #f1f5f9;\n transition: background 0.2s ease;\n }\n\n .queue-item.expanded {\n background: #f8fafc;\n }\n\n .queue-item:last-child {\n border-bottom: none;\n }\n\n .queue-item-header {\n padding: 16px 20px;\n display: flex;\n align-items: center;\n gap: 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n }\n\n .queue-item-header:hover {\n background: rgba(59, 130, 246, 0.04);\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: 14px;\n font-weight: 600;\n color: #1e293b;\n margin-bottom: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-meta {\n display: flex;\n gap: 14px;\n font-size: 12px;\n color: #64748b;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .meta-time {\n display: flex;\n align-items: center;\n gap: 5px;\n }\n\n .item-actions-area {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .reason-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n }\n\n .reason-no-feedback {\n background: #dbeafe;\n color: #1e40af;\n }\n\n .reason-high-score-failed {\n background: #ffedd5;\n color: #c2410c;\n }\n\n .reason-low-score-passed {\n background: #fef9c3;\n color: #a16207;\n }\n\n .expand-toggle {\n background: none;\n border: none;\n color: #94a3b8;\n cursor: pointer;\n padding: 8px;\n border-radius: 6px;\n font-size: 14px;\n transition: all 0.2s ease;\n }\n\n .expand-toggle:hover {\n background: #e2e8f0;\n color: #64748b;\n }\n\n /* Review Form */\n .review-form-panel {\n padding: 20px 20px 20px 36px;\n border-top: 1px solid #e2e8f0;\n background: white;\n }\n\n .form-section {\n margin-bottom: 20px;\n }\n\n .form-section:last-of-type {\n margin-bottom: 16px;\n }\n\n .form-label {\n display: block;\n font-size: 12px;\n font-weight: 700;\n color: #475569;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 10px;\n }\n\n /* Rating Circles */\n .rating-row {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .rating-circle {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n border: 2px solid #e2e8f0;\n background: white;\n color: #94a3b8;\n font-size: 13px;\n font-weight: 700;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n }\n\n .rating-circle:hover {\n border-color: #3b82f6;\n color: #3b82f6;\n transform: scale(1.1);\n }\n\n .rating-circle.selected {\n background: #3b82f6;\n border-color: #3b82f6;\n color: white;\n }\n\n .rating-circle.current {\n background: #2563eb;\n border-color: #1d4ed8;\n color: white;\n box-shadow: 0 2px 6px rgba(37, 99, 235, 0.35);\n }\n\n .rating-display {\n margin-left: 12px;\n font-size: 16px;\n font-weight: 700;\n color: #1e293b;\n }\n\n /* Correctness Buttons */\n .correctness-row {\n display: flex;\n gap: 12px;\n }\n\n .correctness-btn {\n flex: 1;\n max-width: 200px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n border: 2px solid #e2e8f0;\n border-radius: 10px;\n background: white;\n font-size: 14px;\n font-weight: 600;\n color: #64748b;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .correctness-btn.correct:hover,\n .correctness-btn.correct.active {\n border-color: #22c55e;\n background: #f0fdf4;\n color: #166534;\n }\n\n .correctness-btn.incorrect:hover,\n .correctness-btn.incorrect.active {\n border-color: #ef4444;\n background: #fef2f2;\n color: #991b1b;\n }\n\n /* Notes */\n .notes-textarea {\n width: 100%;\n max-width: 500px;\n padding: 12px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n min-height: 72px;\n box-sizing: border-box;\n }\n\n .notes-textarea:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n\n /* Form Actions */\n .form-actions {\n display: flex;\n gap: 12px;\n }\n\n .submit-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 11px 22px;\n border: none;\n border-radius: 8px;\n background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);\n color: white;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .submit-btn:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3);\n }\n\n .submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .skip-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 11px 20px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n background: white;\n color: #64748b;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .skip-btn:hover {\n border-color: #cbd5e1;\n background: #f8fafc;\n }\n\n /* History Filters */\n .history-filters {\n display: flex;\n gap: 16px;\n padding: 16px 20px;\n border-bottom: 1px solid #f1f5f9;\n align-items: center;\n }\n\n .search-wrapper {\n flex: 1;\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .search-wrapper > i {\n position: absolute;\n left: 12px;\n color: #94a3b8;\n font-size: 13px;\n }\n\n .search-wrapper input {\n width: 100%;\n padding: 10px 12px 10px 36px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 13px;\n }\n\n .search-wrapper input:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n\n .sort-control {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #64748b;\n flex-shrink: 0;\n }\n\n .sort-control select {\n padding: 8px 12px;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n font-size: 12px;\n background: white;\n }\n\n /* History List */\n .history-list {\n max-height: 600px;\n overflow-y: auto;\n }\n\n .history-item {\n padding: 16px 20px;\n border-bottom: 1px solid #f1f5f9;\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n }\n\n .history-item:last-child {\n border-bottom: none;\n }\n\n .history-item-main {\n flex: 1;\n min-width: 160px;\n }\n\n .history-name {\n font-size: 14px;\n font-weight: 600;\n color: #1e293b;\n margin-bottom: 4px;\n }\n\n .history-date {\n font-size: 12px;\n color: #94a3b8;\n display: flex;\n align-items: center;\n gap: 5px;\n }\n\n .history-rating {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .rating-dots {\n display: flex;\n gap: 3px;\n }\n\n .rating-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: #e2e8f0;\n }\n\n .rating-dot.filled {\n background: #f59e0b;\n }\n\n .rating-label {\n font-size: 12px;\n font-weight: 600;\n color: #64748b;\n }\n\n .history-verdict {\n flex-shrink: 0;\n }\n\n .verdict {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border-radius: 14px;\n font-size: 11px;\n font-weight: 600;\n }\n\n .verdict.correct {\n background: #dcfce7;\n color: #166534;\n }\n\n .verdict.incorrect {\n background: #fee2e2;\n color: #991b1b;\n }\n\n .history-auto-score {\n flex-shrink: 0;\n }\n\n .history-comments {\n width: 100%;\n margin-top: 8px;\n padding: 10px 14px;\n background: #f8fafc;\n border-radius: 8px;\n border-left: 3px solid #3b82f6;\n cursor: pointer;\n }\n\n .history-comments p {\n margin: 0;\n font-size: 13px;\n color: #475569;\n line-height: 1.5;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .history-comments.expanded p {\n white-space: normal;\n }\n\n /* Empty State */\n .empty-state {\n padding: 60px 20px;\n text-align: center;\n }\n\n .empty-state i {\n font-size: 52px;\n margin-bottom: 16px;\n color: #22c55e;\n }\n\n .empty-state h3 {\n font-size: 18px;\n color: #1e293b;\n margin: 0 0 8px 0;\n font-weight: 600;\n }\n\n .empty-state p {\n font-size: 14px;\n color: #94a3b8;\n margin: 0;\n }\n\n /* Calibration Section */\n .calibration-section {\n background: white;\n padding: 24px;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n .calibration-section h3 {\n margin: 0 0 20px 0;\n font-size: 16px;\n font-weight: 600;\n color: #1e293b;\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .calibration-section h3 i {\n color: #3b82f6;\n }\n\n .calibration-body {\n display: flex;\n align-items: center;\n gap: 32px;\n }\n\n .gauge-display {\n flex-shrink: 0;\n }\n\n .gauge-ring {\n position: relative;\n width: 120px;\n height: 120px;\n }\n\n .gauge-svg {\n width: 100%;\n height: 100%;\n }\n\n .gauge-value {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n font-weight: 800;\n color: #1e293b;\n }\n\n .calibration-text {\n flex: 1;\n }\n\n .calibration-description {\n margin: 0 0 12px 0;\n font-size: 14px;\n color: #64748b;\n line-height: 1.6;\n }\n\n .calibration-warning {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: #fef3c7;\n border: 1px solid #fbbf24;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: #92400e;\n }\n\n .calibration-warning i {\n color: #d97706;\n font-size: 16px;\n flex-shrink: 0;\n }\n\n /* Success toast animation */\n .queue-item {\n animation: fadeIn 0.2s ease;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .review-page {\n padding: 16px;\n }\n\n .page-header {\n flex-direction: column;\n gap: 16px;\n align-items: flex-start;\n }\n\n .kpi-row {\n grid-template-columns: 1fr 1fr;\n }\n\n .kpi-card {\n padding: 16px;\n }\n\n .kpi-value {\n font-size: 22px;\n }\n\n .queue-item-header {\n flex-wrap: wrap;\n }\n\n .item-actions-area {\n width: 100%;\n justify-content: flex-end;\n margin-top: 8px;\n }\n\n .correctness-row {\n flex-direction: column;\n }\n\n .correctness-btn {\n max-width: 100%;\n }\n\n .history-item {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .calibration-body {\n flex-direction: column;\n align-items: center;\n text-align: center;\n }\n }\n "] }]
979
+ }], () => [{ type: i1.TestingInstrumentationService }, { type: i0.ChangeDetectorRef }], { initialState: [{
980
+ type: Input
981
+ }], stateChange: [{
982
+ type: Output
983
+ }] }); })();
984
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestingReviewComponent, { className: "TestingReviewComponent", filePath: "src/Testing/components/testing-review.component.ts", lineNumber: 1187 }); })();
985
+ //# sourceMappingURL=testing-review.component.js.map