@memberjunction/ng-dashboards 5.34.1 → 5.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +399 -292
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
  6. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
  7. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
  8. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  9. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +75 -0
  10. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/analytics/ai-analytics-resource.component.js +400 -89
  12. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  13. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
  14. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
  15. package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
  16. package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
  17. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
  18. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  19. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
  20. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  21. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
  22. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
  23. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
  24. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
  25. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  26. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
  27. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  28. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
  29. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  30. package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
  31. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  32. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  33. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
  34. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  35. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  36. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
  37. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  38. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +990 -992
  39. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  40. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
  41. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  42. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
  43. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  44. package/dist/AI/components/models/model-management.component.d.ts +17 -0
  45. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  46. package/dist/AI/components/models/model-management.component.js +370 -425
  47. package/dist/AI/components/models/model-management.component.js.map +1 -1
  48. package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
  49. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  50. package/dist/AI/components/prompts/prompt-management.component.js +317 -357
  51. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  52. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
  53. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
  54. package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
  55. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  56. package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
  57. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  58. package/dist/AI/components/system/system-configuration.component.js +403 -362
  59. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  60. package/dist/AI/components/tags/tags-resource.component.js +781 -783
  61. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  62. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
  63. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  64. package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
  65. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  66. package/dist/Actions/components/actions-overview.component.d.ts +6 -0
  67. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  68. package/dist/Actions/components/actions-overview.component.js +79 -30
  69. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  70. package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
  71. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  72. package/dist/Actions/components/execution-monitoring.component.js +196 -142
  73. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  74. package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
  75. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  76. package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
  77. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  78. package/dist/Actions/components/explorer/index.d.ts +0 -1
  79. package/dist/Actions/components/explorer/index.d.ts.map +1 -1
  80. package/dist/Actions/components/explorer/index.js +0 -1
  81. package/dist/Actions/components/explorer/index.js.map +1 -1
  82. package/dist/Admin/admin-data-schema.component.js +32 -40
  83. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  84. package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
  85. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  86. package/dist/Admin/admin-identity-access.component.js +32 -40
  87. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  88. package/dist/Admin/admin-monitoring.component.js +32 -40
  89. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  90. package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
  91. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  92. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
  93. package/dist/Archiving/components/archive-config-resource.component.js +24 -5
  94. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
  95. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
  96. package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
  97. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
  98. package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
  99. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  100. package/dist/Communication/communication-logs-resource.component.js +80 -99
  101. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  102. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  103. package/dist/Communication/communication-monitor-resource.component.js +127 -106
  104. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  105. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  106. package/dist/Communication/communication-providers-resource.component.js +44 -45
  107. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  108. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  109. package/dist/Communication/communication-runs-resource.component.js +60 -58
  110. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  111. package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
  112. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  113. package/dist/Communication/communication-templates-resource.component.js +139 -162
  114. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  115. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
  116. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  117. package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
  118. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  119. package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
  120. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  121. package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
  122. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  123. package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
  124. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  125. package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
  126. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  127. package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
  128. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  129. package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
  130. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  131. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
  132. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
  133. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
  134. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  135. package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
  136. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  137. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  138. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  139. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
  140. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  141. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
  142. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  143. package/dist/Home/home-dashboard.component.d.ts +6 -0
  144. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  145. package/dist/Home/home-dashboard.component.js +521 -485
  146. package/dist/Home/home-dashboard.component.js.map +1 -1
  147. package/dist/Integration/components/activity/activity.component.d.ts +8 -0
  148. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  149. package/dist/Integration/components/activity/activity.component.js +309 -318
  150. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  151. package/dist/Integration/components/connections/connections.component.js +866 -847
  152. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  153. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
  154. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  155. package/dist/Integration/components/overview/overview.component.js +182 -163
  156. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  157. package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
  158. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  159. package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
  160. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  161. package/dist/Integration/components/schedules/schedules.component.js +241 -241
  162. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  163. package/dist/Integration/integration.module.d.ts +1 -1
  164. package/dist/Integration/integration.module.d.ts.map +1 -1
  165. package/dist/Integration/integration.module.js +28 -1
  166. package/dist/Integration/integration.module.js.map +1 -1
  167. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
  168. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  169. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
  170. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  171. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
  172. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  173. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
  174. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
  175. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
  176. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  177. package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
  178. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  179. package/dist/Lists/components/lists-browse-resource.component.js +486 -532
  180. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  181. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  182. package/dist/Lists/components/lists-categories-resource.component.js +152 -160
  183. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  184. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  185. package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
  186. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  187. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  188. package/dist/Lists/components/lists-operations-resource.component.js +234 -246
  189. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  190. package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
  191. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  192. package/dist/MCP/mcp-dashboard.component.js +1248 -1338
  193. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  194. package/dist/MCP/mcp.module.d.ts +1 -1
  195. package/dist/MCP/mcp.module.d.ts.map +1 -1
  196. package/dist/MCP/mcp.module.js +34 -1
  197. package/dist/MCP/mcp.module.js.map +1 -1
  198. package/dist/Permissions/audit-log-resource.component.js +76 -85
  199. package/dist/Permissions/audit-log-resource.component.js.map +1 -1
  200. package/dist/Permissions/resource-access-resource.component.js +64 -69
  201. package/dist/Permissions/resource-access-resource.component.js.map +1 -1
  202. package/dist/Permissions/user-access-resource.component.js +63 -74
  203. package/dist/Permissions/user-access-resource.component.js.map +1 -1
  204. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  205. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  206. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
  207. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  208. package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
  209. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  210. package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
  211. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  212. package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
  213. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  214. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
  215. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  216. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
  217. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  218. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
  219. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  220. package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
  221. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  222. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
  223. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  224. package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
  225. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  226. package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
  227. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
  228. package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
  229. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  230. package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
  231. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  232. package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
  233. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  234. package/dist/SystemDiagnostics/system-diagnostics.component.js +773 -783
  235. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  236. package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
  237. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  238. package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
  239. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  240. package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
  241. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  242. package/dist/Testing/components/testing-analytics.component.js +420 -393
  243. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  244. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  245. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  246. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
  247. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  248. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
  249. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  250. package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
  251. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  252. package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
  253. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  254. package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
  255. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  256. package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
  257. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  258. package/dist/Testing/components/testing-explorer.component.js +587 -608
  259. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  260. package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
  261. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  262. package/dist/Testing/components/testing-review-resource.component.js +9 -12
  263. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  264. package/dist/Testing/components/testing-review.component.d.ts +3 -1
  265. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  266. package/dist/Testing/components/testing-review.component.js +310 -274
  267. package/dist/Testing/components/testing-review.component.js.map +1 -1
  268. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  269. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  270. package/dist/Testing/components/testing-runs-resource.component.js +16 -19
  271. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  272. package/dist/Testing/components/testing-runs.component.d.ts +3 -1
  273. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  274. package/dist/Testing/components/testing-runs.component.js +307 -273
  275. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  276. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  277. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  278. package/dist/Testing/testing-dashboard.component.js +107 -93
  279. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  280. package/dist/VersionHistory/components/diff-resource.component.js +185 -188
  281. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  282. package/dist/VersionHistory/components/graph-resource.component.js +154 -184
  283. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  284. package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
  285. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  286. package/dist/VersionHistory/components/labels-resource.component.js +350 -354
  287. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  288. package/dist/VersionHistory/components/restore-resource.component.js +163 -169
  289. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  290. package/dist/actions-dashboards.module.d.ts +15 -16
  291. package/dist/actions-dashboards.module.d.ts.map +1 -1
  292. package/dist/actions-dashboards.module.js +34 -11
  293. package/dist/actions-dashboards.module.js.map +1 -1
  294. package/dist/ai-dashboards.module.d.ts +45 -48
  295. package/dist/ai-dashboards.module.d.ts.map +1 -1
  296. package/dist/ai-dashboards.module.js +36 -10
  297. package/dist/ai-dashboards.module.js.map +1 -1
  298. package/dist/archiving-dashboards.module.d.ts +2 -1
  299. package/dist/archiving-dashboards.module.d.ts.map +1 -1
  300. package/dist/archiving-dashboards.module.js +12 -2
  301. package/dist/archiving-dashboards.module.js.map +1 -1
  302. package/dist/communication-dashboards.module.d.ts +2 -1
  303. package/dist/communication-dashboards.module.d.ts.map +1 -1
  304. package/dist/communication-dashboards.module.js +24 -3
  305. package/dist/communication-dashboards.module.js.map +1 -1
  306. package/dist/core-dashboards.module.d.ts +1 -1
  307. package/dist/core-dashboards.module.d.ts.map +1 -1
  308. package/dist/core-dashboards.module.js +31 -1
  309. package/dist/core-dashboards.module.js.map +1 -1
  310. package/dist/credentials-dashboards.module.d.ts +1 -1
  311. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  312. package/dist/credentials-dashboards.module.js +28 -1
  313. package/dist/credentials-dashboards.module.js.map +1 -1
  314. package/dist/lists-dashboards.module.d.ts +1 -1
  315. package/dist/lists-dashboards.module.d.ts.map +1 -1
  316. package/dist/lists-dashboards.module.js +28 -1
  317. package/dist/lists-dashboards.module.js.map +1 -1
  318. package/dist/public-api.d.ts +2 -2
  319. package/dist/public-api.d.ts.map +1 -1
  320. package/dist/public-api.js +3 -3
  321. package/dist/public-api.js.map +1 -1
  322. package/dist/scheduling-dashboards.module.d.ts +1 -1
  323. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  324. package/dist/scheduling-dashboards.module.js +31 -1
  325. package/dist/scheduling-dashboards.module.js.map +1 -1
  326. package/dist/testing-dashboards.module.d.ts +8 -7
  327. package/dist/testing-dashboards.module.d.ts.map +1 -1
  328. package/dist/testing-dashboards.module.js +30 -0
  329. package/dist/testing-dashboards.module.js.map +1 -1
  330. package/package.json +52 -52
  331. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
  332. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
  333. package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
  334. package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
  335. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
  336. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
  337. package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
  338. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
  339. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
  340. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
  341. package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
  342. package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
  343. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
  344. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
  345. package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
  346. package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
@@ -5,186 +5,222 @@ import * as i1 from "../services/scheduling-instrumentation.service";
5
5
  import * as i2 from "@angular/common";
6
6
  import * as i3 from "@memberjunction/ng-ui-components";
7
7
  import * as i4 from "@memberjunction/ng-shared-generic";
8
- function SchedulingOverviewComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
9
- i0.ɵɵelementStart(0, "div", 7);
10
- i0.ɵɵelement(1, "mj-loading", 9);
8
+ function SchedulingOverviewComponent_Conditional_0_ng_container_0_Template(rf, ctx) { if (rf & 1) {
9
+ i0.ɵɵelementContainer(0);
10
+ } }
11
+ function SchedulingOverviewComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
12
+ i0.ɵɵtemplate(0, SchedulingOverviewComponent_Conditional_0_ng_container_0_Template, 1, 0, "ng-container", 1);
13
+ } if (rf & 2) {
14
+ i0.ɵɵnextContext();
15
+ const content_r1 = i0.ɵɵreference(3);
16
+ i0.ɵɵproperty("ngTemplateOutlet", content_r1);
17
+ } }
18
+ function SchedulingOverviewComponent_Conditional_1_ng_container_8_Template(rf, ctx) { if (rf & 1) {
19
+ i0.ɵɵelementContainer(0);
20
+ } }
21
+ function SchedulingOverviewComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
22
+ const _r2 = i0.ɵɵgetCurrentView();
23
+ i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 2)(2, "div", 3)(3, "mj-refresh-button", 4);
24
+ i0.ɵɵlistener("Clicked", function SchedulingOverviewComponent_Conditional_1_Template_mj_refresh_button_Clicked_3_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.Refresh()); });
25
+ i0.ɵɵelementEnd();
26
+ i0.ɵɵelementStart(4, "button", 5);
27
+ i0.ɵɵlistener("click", function SchedulingOverviewComponent_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ToggleAutoRefresh()); });
28
+ i0.ɵɵelement(5, "i", 6);
29
+ i0.ɵɵtext(6);
30
+ i0.ɵɵelementEnd()()();
31
+ i0.ɵɵelementStart(7, "mj-page-body");
32
+ i0.ɵɵtemplate(8, SchedulingOverviewComponent_Conditional_1_ng_container_8_Template, 1, 0, "ng-container", 1);
33
+ i0.ɵɵelementEnd()();
34
+ } if (rf & 2) {
35
+ const ctx_r2 = i0.ɵɵnextContext();
36
+ const content_r1 = i0.ɵɵreference(3);
37
+ i0.ɵɵadvance(4);
38
+ i0.ɵɵproperty("variant", ctx_r2.AutoRefreshEnabled ? "primary" : "secondary");
39
+ i0.ɵɵadvance(2);
40
+ i0.ɵɵtextInterpolate1(" Auto: ", ctx_r2.AutoRefreshEnabled ? "ON" : "OFF", " ");
41
+ i0.ɵɵadvance(2);
42
+ i0.ɵɵproperty("ngTemplateOutlet", content_r1);
43
+ } }
44
+ function SchedulingOverviewComponent_ng_template_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "div", 8);
46
+ i0.ɵɵelement(1, "mj-loading", 10);
11
47
  i0.ɵɵelementEnd();
12
48
  } }
13
- function SchedulingOverviewComponent_Conditional_10_Conditional_65_Template(rf, ctx) { if (rf & 1) {
14
- i0.ɵɵelementStart(0, "div", 43);
15
- i0.ɵɵelement(1, "i", 54);
49
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_65_Template(rf, ctx) { if (rf & 1) {
50
+ i0.ɵɵelementStart(0, "div", 44);
51
+ i0.ɵɵelement(1, "i", 55);
16
52
  i0.ɵɵelementStart(2, "span");
17
53
  i0.ɵɵtext(3, "No recent executions");
18
54
  i0.ɵɵelementEnd()();
19
55
  } }
20
- function SchedulingOverviewComponent_Conditional_10_For_67_Template(rf, ctx) { if (rf & 1) {
21
- i0.ɵɵelementStart(0, "div", 44)(1, "div", 55);
22
- i0.ɵɵelement(2, "i", 56);
56
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_67_Template(rf, ctx) { if (rf & 1) {
57
+ i0.ɵɵelementStart(0, "div", 45)(1, "div", 56);
58
+ i0.ɵɵelement(2, "i", 57);
23
59
  i0.ɵɵelementEnd();
24
- i0.ɵɵelementStart(3, "div", 57)(4, "div", 58);
60
+ i0.ɵɵelementStart(3, "div", 58)(4, "div", 59);
25
61
  i0.ɵɵtext(5);
26
62
  i0.ɵɵelementEnd();
27
- i0.ɵɵelementStart(6, "div", 59);
63
+ i0.ɵɵelementStart(6, "div", 60);
28
64
  i0.ɵɵtext(7);
29
65
  i0.ɵɵelementEnd()();
30
- i0.ɵɵelementStart(8, "div", 60);
66
+ i0.ɵɵelementStart(8, "div", 61);
31
67
  i0.ɵɵtext(9);
32
68
  i0.ɵɵelementEnd()();
33
69
  } if (rf & 2) {
34
- const exec_r1 = ctx.$implicit;
35
- const ctx_r1 = i0.ɵɵnextContext(2);
70
+ const exec_r4 = ctx.$implicit;
71
+ const ctx_r2 = i0.ɵɵnextContext(3);
36
72
  i0.ɵɵadvance(2);
37
- i0.ɵɵclassMap(ctx_r1.GetStatusIcon(exec_r1.status));
38
- i0.ɵɵproperty("ngClass", ctx_r1.GetStatusClass(exec_r1.status));
73
+ i0.ɵɵclassMap(ctx_r2.GetStatusIcon(exec_r4.status));
74
+ i0.ɵɵproperty("ngClass", ctx_r2.GetStatusClass(exec_r4.status));
39
75
  i0.ɵɵadvance(3);
40
- i0.ɵɵtextInterpolate(exec_r1.jobName);
76
+ i0.ɵɵtextInterpolate(exec_r4.jobName);
41
77
  i0.ɵɵadvance(2);
42
- i0.ɵɵtextInterpolate2("", ctx_r1.FormatTimeAgo(exec_r1.startedAt), " \u00B7 ", ctx_r1.FormatDuration(exec_r1.duration));
78
+ i0.ɵɵtextInterpolate2("", ctx_r2.FormatTimeAgo(exec_r4.startedAt), " \u00B7 ", ctx_r2.FormatDuration(exec_r4.duration));
43
79
  i0.ɵɵadvance();
44
- i0.ɵɵproperty("ngClass", ctx_r1.GetStatusClass(exec_r1.status));
80
+ i0.ɵɵproperty("ngClass", ctx_r2.GetStatusClass(exec_r4.status));
45
81
  i0.ɵɵadvance();
46
- i0.ɵɵtextInterpolate1(" ", exec_r1.status, " ");
82
+ i0.ɵɵtextInterpolate1(" ", exec_r4.status, " ");
47
83
  } }
48
- function SchedulingOverviewComponent_Conditional_10_Conditional_74_Template(rf, ctx) { if (rf & 1) {
49
- i0.ɵɵelementStart(0, "span", 47);
84
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_74_Template(rf, ctx) { if (rf & 1) {
85
+ i0.ɵɵelementStart(0, "span", 48);
50
86
  i0.ɵɵtext(1);
51
87
  i0.ɵɵelementEnd();
52
88
  } if (rf & 2) {
53
- const ctx_r1 = i0.ɵɵnextContext(2);
89
+ const ctx_r2 = i0.ɵɵnextContext(3);
54
90
  i0.ɵɵadvance();
55
- i0.ɵɵtextInterpolate(ctx_r1.Alerts.length);
91
+ i0.ɵɵtextInterpolate(ctx_r2.Alerts.length);
56
92
  } }
57
- function SchedulingOverviewComponent_Conditional_10_Conditional_75_Template(rf, ctx) { if (rf & 1) {
58
- i0.ɵɵelementStart(0, "span", 48);
93
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_75_Template(rf, ctx) { if (rf & 1) {
94
+ i0.ɵɵelementStart(0, "span", 49);
59
95
  i0.ɵɵtext(1, "0");
60
96
  i0.ɵɵelementEnd();
61
97
  } }
62
- function SchedulingOverviewComponent_Conditional_10_Conditional_77_Template(rf, ctx) { if (rf & 1) {
63
- i0.ɵɵelementStart(0, "div", 49);
64
- i0.ɵɵelement(1, "i", 61);
98
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_77_Template(rf, ctx) { if (rf & 1) {
99
+ i0.ɵɵelementStart(0, "div", 50);
100
+ i0.ɵɵelement(1, "i", 62);
65
101
  i0.ɵɵelementStart(2, "span");
66
102
  i0.ɵɵtext(3, "No active alerts");
67
103
  i0.ɵɵelementEnd()();
68
104
  } }
69
- function SchedulingOverviewComponent_Conditional_10_For_79_Conditional_7_Template(rf, ctx) { if (rf & 1) {
70
- const _r3 = i0.ɵɵgetCurrentView();
71
- i0.ɵɵelementStart(0, "button", 67);
72
- i0.ɵɵlistener("click", function SchedulingOverviewComponent_Conditional_10_For_79_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const alert_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ReleaseLock(alert_r4.jobId)); });
105
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Conditional_7_Template(rf, ctx) { if (rf & 1) {
106
+ const _r5 = i0.ɵɵgetCurrentView();
107
+ i0.ɵɵelementStart(0, "button", 68);
108
+ i0.ɵɵlistener("click", function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const alert_r6 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.ReleaseLock(alert_r6.jobId)); });
73
109
  i0.ɵɵtext(1, " Release ");
74
110
  i0.ɵɵelementEnd();
75
111
  } }
76
- function SchedulingOverviewComponent_Conditional_10_For_79_Template(rf, ctx) { if (rf & 1) {
77
- i0.ɵɵelementStart(0, "div", 50);
78
- i0.ɵɵelement(1, "i", 62);
79
- i0.ɵɵelementStart(2, "div", 63)(3, "div", 64);
112
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Template(rf, ctx) { if (rf & 1) {
113
+ i0.ɵɵelementStart(0, "div", 51);
114
+ i0.ɵɵelement(1, "i", 63);
115
+ i0.ɵɵelementStart(2, "div", 64)(3, "div", 65);
80
116
  i0.ɵɵtext(4);
81
117
  i0.ɵɵelementEnd();
82
- i0.ɵɵelementStart(5, "div", 65);
118
+ i0.ɵɵelementStart(5, "div", 66);
83
119
  i0.ɵɵtext(6);
84
120
  i0.ɵɵelementEnd()();
85
- i0.ɵɵconditionalCreate(7, SchedulingOverviewComponent_Conditional_10_For_79_Conditional_7_Template, 2, 0, "button", 66);
121
+ i0.ɵɵconditionalCreate(7, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Conditional_7_Template, 2, 0, "button", 67);
86
122
  i0.ɵɵelementEnd();
87
123
  } if (rf & 2) {
88
- const alert_r4 = ctx.$implicit;
89
- const ctx_r1 = i0.ɵɵnextContext(2);
90
- i0.ɵɵproperty("ngClass", "alert-" + alert_r4.severity);
124
+ const alert_r6 = ctx.$implicit;
125
+ const ctx_r2 = i0.ɵɵnextContext(3);
126
+ i0.ɵɵproperty("ngClass", "alert-" + alert_r6.severity);
91
127
  i0.ɵɵadvance();
92
- i0.ɵɵclassMap(ctx_r1.GetAlertIcon(alert_r4.severity));
128
+ i0.ɵɵclassMap(ctx_r2.GetAlertIcon(alert_r6.severity));
93
129
  i0.ɵɵadvance(3);
94
- i0.ɵɵtextInterpolate(alert_r4.title);
130
+ i0.ɵɵtextInterpolate(alert_r6.title);
95
131
  i0.ɵɵadvance(2);
96
- i0.ɵɵtextInterpolate(alert_r4.message);
132
+ i0.ɵɵtextInterpolate(alert_r6.message);
97
133
  i0.ɵɵadvance();
98
- i0.ɵɵconditional(alert_r4.type === "stale-lock" && alert_r4.jobId ? 7 : -1);
134
+ i0.ɵɵconditional(alert_r6.type === "stale-lock" && alert_r6.jobId ? 7 : -1);
99
135
  } }
100
- function SchedulingOverviewComponent_Conditional_10_Conditional_88_Template(rf, ctx) { if (rf & 1) {
101
- i0.ɵɵelementStart(0, "div", 43);
102
- i0.ɵɵelement(1, "i", 68);
136
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_88_Template(rf, ctx) { if (rf & 1) {
137
+ i0.ɵɵelementStart(0, "div", 44);
138
+ i0.ɵɵelement(1, "i", 69);
103
139
  i0.ɵɵelementStart(2, "span");
104
140
  i0.ɵɵtext(3, "No upcoming executions");
105
141
  i0.ɵɵelementEnd()();
106
142
  } }
107
- function SchedulingOverviewComponent_Conditional_10_For_90_Template(rf, ctx) { if (rf & 1) {
108
- i0.ɵɵelementStart(0, "div", 52)(1, "div", 69)(2, "div", 70);
143
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_For_90_Template(rf, ctx) { if (rf & 1) {
144
+ i0.ɵɵelementStart(0, "div", 53)(1, "div", 70)(2, "div", 71);
109
145
  i0.ɵɵtext(3);
110
146
  i0.ɵɵelementEnd();
111
- i0.ɵɵelementStart(4, "div", 71);
147
+ i0.ɵɵelementStart(4, "div", 72);
112
148
  i0.ɵɵtext(5);
113
- i0.ɵɵelementStart(6, "span", 72);
149
+ i0.ɵɵelementStart(6, "span", 73);
114
150
  i0.ɵɵtext(7);
115
151
  i0.ɵɵelementEnd()()();
116
- i0.ɵɵelementStart(8, "div", 73);
152
+ i0.ɵɵelementStart(8, "div", 74);
117
153
  i0.ɵɵtext(9);
118
154
  i0.ɵɵelementEnd()();
119
155
  } if (rf & 2) {
120
- const upcoming_r5 = ctx.$implicit;
121
- const ctx_r1 = i0.ɵɵnextContext(2);
156
+ const upcoming_r7 = ctx.$implicit;
157
+ const ctx_r2 = i0.ɵɵnextContext(3);
122
158
  i0.ɵɵadvance(3);
123
- i0.ɵɵtextInterpolate(upcoming_r5.jobName);
159
+ i0.ɵɵtextInterpolate(upcoming_r7.jobName);
124
160
  i0.ɵɵadvance(2);
125
- i0.ɵɵtextInterpolate1(" ", ctx_r1.FormatDateTime(upcoming_r5.nextRunAt), " ");
161
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.FormatDateTime(upcoming_r7.nextRunAt), " ");
126
162
  i0.ɵɵadvance(2);
127
- i0.ɵɵtextInterpolate(upcoming_r5.jobType);
163
+ i0.ɵɵtextInterpolate(upcoming_r7.jobType);
128
164
  i0.ɵɵadvance();
129
- i0.ɵɵclassProp("soon", ctx_r1.FormatTimeUntil(upcoming_r5.nextRunAt).includes("m") && !ctx_r1.FormatTimeUntil(upcoming_r5.nextRunAt).includes("h"));
165
+ i0.ɵɵclassProp("soon", ctx_r2.FormatTimeUntil(upcoming_r7.nextRunAt).includes("m") && !ctx_r2.FormatTimeUntil(upcoming_r7.nextRunAt).includes("h"));
130
166
  i0.ɵɵadvance();
131
- i0.ɵɵtextInterpolate1(" ", ctx_r1.FormatTimeUntil(upcoming_r5.nextRunAt), " ");
167
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.FormatTimeUntil(upcoming_r7.nextRunAt), " ");
132
168
  } }
133
- function SchedulingOverviewComponent_Conditional_10_Conditional_91_For_24_Conditional_13_Template(rf, ctx) { if (rf & 1) {
134
- const _r6 = i0.ɵɵgetCurrentView();
135
- i0.ɵɵelementStart(0, "button", 81);
136
- i0.ɵɵlistener("click", function SchedulingOverviewComponent_Conditional_10_Conditional_91_For_24_Conditional_13_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const lock_r7 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ReleaseLock(lock_r7.jobId)); });
137
- i0.ɵɵelement(1, "i", 82);
169
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Conditional_13_Template(rf, ctx) { if (rf & 1) {
170
+ const _r8 = i0.ɵɵgetCurrentView();
171
+ i0.ɵɵelementStart(0, "button", 82);
172
+ i0.ɵɵlistener("click", function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Conditional_13_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const lock_r9 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.ReleaseLock(lock_r9.jobId)); });
173
+ i0.ɵɵelement(1, "i", 83);
138
174
  i0.ɵɵtext(2, " Release ");
139
175
  i0.ɵɵelementEnd();
140
176
  } }
141
- function SchedulingOverviewComponent_Conditional_10_Conditional_91_For_24_Template(rf, ctx) { if (rf & 1) {
142
- i0.ɵɵelementStart(0, "tr")(1, "td", 77);
177
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Template(rf, ctx) { if (rf & 1) {
178
+ i0.ɵɵelementStart(0, "tr")(1, "td", 78);
143
179
  i0.ɵɵtext(2);
144
180
  i0.ɵɵelementEnd();
145
- i0.ɵɵelementStart(3, "td", 78);
181
+ i0.ɵɵelementStart(3, "td", 79);
146
182
  i0.ɵɵtext(4);
147
183
  i0.ɵɵelementEnd();
148
- i0.ɵɵelementStart(5, "td", 78);
184
+ i0.ɵɵelementStart(5, "td", 79);
149
185
  i0.ɵɵtext(6);
150
186
  i0.ɵɵelementEnd();
151
- i0.ɵɵelementStart(7, "td", 78);
187
+ i0.ɵɵelementStart(7, "td", 79);
152
188
  i0.ɵɵtext(8);
153
189
  i0.ɵɵelementEnd();
154
- i0.ɵɵelementStart(9, "td")(10, "span", 79);
190
+ i0.ɵɵelementStart(9, "td")(10, "span", 80);
155
191
  i0.ɵɵtext(11);
156
192
  i0.ɵɵelementEnd()();
157
193
  i0.ɵɵelementStart(12, "td");
158
- i0.ɵɵconditionalCreate(13, SchedulingOverviewComponent_Conditional_10_Conditional_91_For_24_Conditional_13_Template, 3, 0, "button", 80);
194
+ i0.ɵɵconditionalCreate(13, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Conditional_13_Template, 3, 0, "button", 81);
159
195
  i0.ɵɵelementEnd()();
160
196
  } if (rf & 2) {
161
- const lock_r7 = ctx.$implicit;
162
- const ctx_r1 = i0.ɵɵnextContext(3);
163
- i0.ɵɵclassProp("stale-row", lock_r7.isStale);
197
+ const lock_r9 = ctx.$implicit;
198
+ const ctx_r2 = i0.ɵɵnextContext(4);
199
+ i0.ɵɵclassProp("stale-row", lock_r9.isStale);
164
200
  i0.ɵɵadvance(2);
165
- i0.ɵɵtextInterpolate(lock_r7.jobName);
201
+ i0.ɵɵtextInterpolate(lock_r9.jobName);
166
202
  i0.ɵɵadvance(2);
167
- i0.ɵɵtextInterpolate(lock_r7.lockedBy);
203
+ i0.ɵɵtextInterpolate(lock_r9.lockedBy);
168
204
  i0.ɵɵadvance(2);
169
- i0.ɵɵtextInterpolate(ctx_r1.FormatTimeAgo(lock_r7.lockedAt));
205
+ i0.ɵɵtextInterpolate(ctx_r2.FormatTimeAgo(lock_r9.lockedAt));
170
206
  i0.ɵɵadvance(2);
171
- i0.ɵɵtextInterpolate(ctx_r1.FormatDateTime(lock_r7.expectedCompletion));
207
+ i0.ɵɵtextInterpolate(ctx_r2.FormatDateTime(lock_r9.expectedCompletion));
172
208
  i0.ɵɵadvance(2);
173
- i0.ɵɵclassProp("stale", lock_r7.isStale);
209
+ i0.ɵɵclassProp("stale", lock_r9.isStale);
174
210
  i0.ɵɵadvance();
175
- i0.ɵɵtextInterpolate1(" ", lock_r7.isStale ? "Stale" : "Active", " ");
211
+ i0.ɵɵtextInterpolate1(" ", lock_r9.isStale ? "Stale" : "Active", " ");
176
212
  i0.ɵɵadvance(2);
177
- i0.ɵɵconditional(lock_r7.isStale ? 13 : -1);
213
+ i0.ɵɵconditional(lock_r9.isStale ? 13 : -1);
178
214
  } }
179
- function SchedulingOverviewComponent_Conditional_10_Conditional_91_Template(rf, ctx) { if (rf & 1) {
180
- i0.ɵɵelementStart(0, "div", 53)(1, "div", 38)(2, "div", 39);
181
- i0.ɵɵelement(3, "i", 74);
215
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_Template(rf, ctx) { if (rf & 1) {
216
+ i0.ɵɵelementStart(0, "div", 54)(1, "div", 39)(2, "div", 40);
217
+ i0.ɵɵelement(3, "i", 75);
182
218
  i0.ɵɵtext(4, " Active Locks ");
183
219
  i0.ɵɵelementEnd();
184
- i0.ɵɵelementStart(5, "span", 41);
220
+ i0.ɵɵelementStart(5, "span", 42);
185
221
  i0.ɵɵtext(6);
186
222
  i0.ɵɵelementEnd()();
187
- i0.ɵɵelementStart(7, "div", 42)(8, "table", 75)(9, "thead")(10, "tr")(11, "th");
223
+ i0.ɵɵelementStart(7, "div", 43)(8, "table", 76)(9, "thead")(10, "tr")(11, "th");
188
224
  i0.ɵɵtext(12, "Job");
189
225
  i0.ɵɵelementEnd();
190
226
  i0.ɵɵelementStart(13, "th");
@@ -202,175 +238,189 @@ function SchedulingOverviewComponent_Conditional_10_Conditional_91_Template(rf,
202
238
  i0.ɵɵelement(21, "th");
203
239
  i0.ɵɵelementEnd()();
204
240
  i0.ɵɵelementStart(22, "tbody");
205
- i0.ɵɵrepeaterCreate(23, SchedulingOverviewComponent_Conditional_10_Conditional_91_For_24_Template, 14, 10, "tr", 76, i0.ɵɵrepeaterTrackByIdentity);
241
+ i0.ɵɵrepeaterCreate(23, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_For_24_Template, 14, 10, "tr", 77, i0.ɵɵrepeaterTrackByIdentity);
206
242
  i0.ɵɵelementEnd()()()();
207
243
  } if (rf & 2) {
208
- const ctx_r1 = i0.ɵɵnextContext(2);
244
+ const ctx_r2 = i0.ɵɵnextContext(3);
209
245
  i0.ɵɵadvance(6);
210
- i0.ɵɵtextInterpolate(ctx_r1.Locks.length);
246
+ i0.ɵɵtextInterpolate(ctx_r2.Locks.length);
211
247
  i0.ɵɵadvance(17);
212
- i0.ɵɵrepeater(ctx_r1.Locks);
248
+ i0.ɵɵrepeater(ctx_r2.Locks);
213
249
  } }
214
- function SchedulingOverviewComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
215
- i0.ɵɵelementStart(0, "div", 8)(1, "div", 10)(2, "div", 11);
250
+ function SchedulingOverviewComponent_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
251
+ i0.ɵɵelementStart(0, "div", 9)(1, "div", 11)(2, "div", 12);
216
252
  i0.ɵɵnamespaceSVG();
217
- i0.ɵɵelementStart(3, "svg", 12);
218
- i0.ɵɵelement(4, "circle", 13)(5, "circle", 14);
253
+ i0.ɵɵelementStart(3, "svg", 13);
254
+ i0.ɵɵelement(4, "circle", 14)(5, "circle", 15);
219
255
  i0.ɵɵelementEnd();
220
256
  i0.ɵɵnamespaceHTML();
221
- i0.ɵɵelementStart(6, "div", 15);
257
+ i0.ɵɵelementStart(6, "div", 16);
222
258
  i0.ɵɵtext(7);
223
259
  i0.ɵɵelementEnd()();
224
- i0.ɵɵelementStart(8, "div", 16)(9, "div", 17);
260
+ i0.ɵɵelementStart(8, "div", 17)(9, "div", 18);
225
261
  i0.ɵɵtext(10, "System Health");
226
262
  i0.ɵɵelementEnd();
227
- i0.ɵɵelementStart(11, "div", 18)(12, "span");
228
- i0.ɵɵelement(13, "i", 19);
263
+ i0.ɵɵelementStart(11, "div", 19)(12, "span");
264
+ i0.ɵɵelement(13, "i", 20);
229
265
  i0.ɵɵtext(14);
230
266
  i0.ɵɵelementEnd();
231
267
  i0.ɵɵelementStart(15, "span");
232
- i0.ɵɵelement(16, "i", 20);
268
+ i0.ɵɵelement(16, "i", 21);
233
269
  i0.ɵɵtext(17);
234
270
  i0.ɵɵelementEnd();
235
271
  i0.ɵɵelementStart(18, "span");
236
- i0.ɵɵelement(19, "i", 21);
272
+ i0.ɵɵelement(19, "i", 22);
237
273
  i0.ɵɵtext(20);
238
274
  i0.ɵɵelementEnd()()()();
239
- i0.ɵɵelementStart(21, "div", 22)(22, "div", 23)(23, "div", 24);
240
- i0.ɵɵelement(24, "i", 25);
275
+ i0.ɵɵelementStart(21, "div", 23)(22, "div", 24)(23, "div", 25);
276
+ i0.ɵɵelement(24, "i", 26);
241
277
  i0.ɵɵelementEnd();
242
- i0.ɵɵelementStart(25, "div", 26)(26, "div", 27);
278
+ i0.ɵɵelementStart(25, "div", 27)(26, "div", 28);
243
279
  i0.ɵɵtext(27);
244
280
  i0.ɵɵelementEnd();
245
- i0.ɵɵelementStart(28, "div", 28);
281
+ i0.ɵɵelementStart(28, "div", 29);
246
282
  i0.ɵɵtext(29, "Active Jobs");
247
283
  i0.ɵɵelementEnd()()();
248
- i0.ɵɵelementStart(30, "div", 23)(31, "div", 29);
249
- i0.ɵɵelement(32, "i", 30);
284
+ i0.ɵɵelementStart(30, "div", 24)(31, "div", 30);
285
+ i0.ɵɵelement(32, "i", 31);
250
286
  i0.ɵɵelementEnd();
251
- i0.ɵɵelementStart(33, "div", 26)(34, "div", 27);
287
+ i0.ɵɵelementStart(33, "div", 27)(34, "div", 28);
252
288
  i0.ɵɵtext(35);
253
289
  i0.ɵɵelementEnd();
254
- i0.ɵɵelementStart(36, "div", 28);
290
+ i0.ɵɵelementStart(36, "div", 29);
255
291
  i0.ɵɵtext(37, "Due Next Hour");
256
292
  i0.ɵɵelementEnd()()();
257
- i0.ɵɵelementStart(38, "div", 23)(39, "div", 31);
258
- i0.ɵɵelement(40, "i", 32);
293
+ i0.ɵɵelementStart(38, "div", 24)(39, "div", 32);
294
+ i0.ɵɵelement(40, "i", 33);
259
295
  i0.ɵɵelementEnd();
260
- i0.ɵɵelementStart(41, "div", 26)(42, "div", 27);
296
+ i0.ɵɵelementStart(41, "div", 27)(42, "div", 28);
261
297
  i0.ɵɵtext(43);
262
298
  i0.ɵɵelementEnd();
263
- i0.ɵɵelementStart(44, "div", 28);
299
+ i0.ɵɵelementStart(44, "div", 29);
264
300
  i0.ɵɵtext(45, "Runs (24h)");
265
301
  i0.ɵɵelementEnd();
266
- i0.ɵɵelementStart(46, "div", 33);
302
+ i0.ɵɵelementStart(46, "div", 34);
267
303
  i0.ɵɵtext(47);
268
304
  i0.ɵɵelementEnd()()();
269
- i0.ɵɵelementStart(48, "div", 23)(49, "div", 34);
270
- i0.ɵɵelement(50, "i", 35);
305
+ i0.ɵɵelementStart(48, "div", 24)(49, "div", 35);
306
+ i0.ɵɵelement(50, "i", 36);
271
307
  i0.ɵɵelementEnd();
272
- i0.ɵɵelementStart(51, "div", 26)(52, "div", 27);
308
+ i0.ɵɵelementStart(51, "div", 27)(52, "div", 28);
273
309
  i0.ɵɵtext(53);
274
310
  i0.ɵɵelementEnd();
275
- i0.ɵɵelementStart(54, "div", 28);
311
+ i0.ɵɵelementStart(54, "div", 29);
276
312
  i0.ɵɵtext(55, "Running Now");
277
313
  i0.ɵɵelementEnd()()()();
278
- i0.ɵɵelementStart(56, "div", 36)(57, "div", 37)(58, "div", 38)(59, "div", 39);
279
- i0.ɵɵelement(60, "i", 40);
314
+ i0.ɵɵelementStart(56, "div", 37)(57, "div", 38)(58, "div", 39)(59, "div", 40);
315
+ i0.ɵɵelement(60, "i", 41);
280
316
  i0.ɵɵtext(61, " Live Executions ");
281
317
  i0.ɵɵelementEnd();
282
- i0.ɵɵelementStart(62, "span", 41);
318
+ i0.ɵɵelementStart(62, "span", 42);
283
319
  i0.ɵɵtext(63);
284
320
  i0.ɵɵelementEnd()();
285
- i0.ɵɵelementStart(64, "div", 42);
286
- i0.ɵɵconditionalCreate(65, SchedulingOverviewComponent_Conditional_10_Conditional_65_Template, 4, 0, "div", 43);
287
- i0.ɵɵrepeaterCreate(66, SchedulingOverviewComponent_Conditional_10_For_67_Template, 10, 8, "div", 44, i0.ɵɵrepeaterTrackByIdentity);
321
+ i0.ɵɵelementStart(64, "div", 43);
322
+ i0.ɵɵconditionalCreate(65, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_65_Template, 4, 0, "div", 44);
323
+ i0.ɵɵrepeaterCreate(66, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_67_Template, 10, 8, "div", 45, i0.ɵɵrepeaterTrackByIdentity);
288
324
  i0.ɵɵelementEnd()();
289
- i0.ɵɵelementStart(68, "div", 45)(69, "div", 37)(70, "div", 46)(71, "div", 39);
325
+ i0.ɵɵelementStart(68, "div", 46)(69, "div", 38)(70, "div", 47)(71, "div", 40);
290
326
  i0.ɵɵelement(72, "i");
291
327
  i0.ɵɵtext(73);
292
328
  i0.ɵɵelementEnd();
293
- i0.ɵɵconditionalCreate(74, SchedulingOverviewComponent_Conditional_10_Conditional_74_Template, 2, 1, "span", 47);
294
- i0.ɵɵconditionalCreate(75, SchedulingOverviewComponent_Conditional_10_Conditional_75_Template, 2, 0, "span", 48);
329
+ i0.ɵɵconditionalCreate(74, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_74_Template, 2, 1, "span", 48);
330
+ i0.ɵɵconditionalCreate(75, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_75_Template, 2, 0, "span", 49);
295
331
  i0.ɵɵelementEnd();
296
- i0.ɵɵelementStart(76, "div", 42);
297
- i0.ɵɵconditionalCreate(77, SchedulingOverviewComponent_Conditional_10_Conditional_77_Template, 4, 0, "div", 49);
298
- i0.ɵɵrepeaterCreate(78, SchedulingOverviewComponent_Conditional_10_For_79_Template, 8, 6, "div", 50, i0.ɵɵrepeaterTrackByIdentity);
332
+ i0.ɵɵelementStart(76, "div", 43);
333
+ i0.ɵɵconditionalCreate(77, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_77_Template, 4, 0, "div", 50);
334
+ i0.ɵɵrepeaterCreate(78, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_79_Template, 8, 6, "div", 51, i0.ɵɵrepeaterTrackByIdentity);
299
335
  i0.ɵɵelementEnd()();
300
- i0.ɵɵelementStart(80, "div", 37)(81, "div", 38)(82, "div", 39);
301
- i0.ɵɵelement(83, "i", 51);
336
+ i0.ɵɵelementStart(80, "div", 38)(81, "div", 39)(82, "div", 40);
337
+ i0.ɵɵelement(83, "i", 52);
302
338
  i0.ɵɵtext(84, " Upcoming (24h) ");
303
339
  i0.ɵɵelementEnd();
304
- i0.ɵɵelementStart(85, "span", 41);
340
+ i0.ɵɵelementStart(85, "span", 42);
305
341
  i0.ɵɵtext(86);
306
342
  i0.ɵɵelementEnd()();
307
- i0.ɵɵelementStart(87, "div", 42);
308
- i0.ɵɵconditionalCreate(88, SchedulingOverviewComponent_Conditional_10_Conditional_88_Template, 4, 0, "div", 43);
309
- i0.ɵɵrepeaterCreate(89, SchedulingOverviewComponent_Conditional_10_For_90_Template, 10, 6, "div", 52, i0.ɵɵrepeaterTrackByIdentity);
343
+ i0.ɵɵelementStart(87, "div", 43);
344
+ i0.ɵɵconditionalCreate(88, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_88_Template, 4, 0, "div", 44);
345
+ i0.ɵɵrepeaterCreate(89, SchedulingOverviewComponent_ng_template_2_Conditional_2_For_90_Template, 10, 6, "div", 53, i0.ɵɵrepeaterTrackByIdentity);
310
346
  i0.ɵɵelementEnd()()()();
311
- i0.ɵɵconditionalCreate(91, SchedulingOverviewComponent_Conditional_10_Conditional_91_Template, 25, 1, "div", 53);
347
+ i0.ɵɵconditionalCreate(91, SchedulingOverviewComponent_ng_template_2_Conditional_2_Conditional_91_Template, 25, 1, "div", 54);
312
348
  i0.ɵɵelementEnd();
313
349
  } if (rf & 2) {
314
- const ctx_r1 = i0.ɵɵnextContext();
350
+ const ctx_r2 = i0.ɵɵnextContext(2);
315
351
  i0.ɵɵadvance();
316
- i0.ɵɵstyleProp("border-color", ctx_r1.GetHealthColor());
352
+ i0.ɵɵstyleProp("border-color", ctx_r2.GetHealthColor());
317
353
  i0.ɵɵadvance(4);
318
- i0.ɵɵattribute("stroke", ctx_r1.GetHealthColor())("stroke-dasharray", ctx_r1.GetHealthStrokeDasharray());
354
+ i0.ɵɵattribute("stroke", ctx_r2.GetHealthColor())("stroke-dasharray", ctx_r2.GetHealthStrokeDasharray());
319
355
  i0.ɵɵadvance();
320
- i0.ɵɵstyleProp("color", ctx_r1.GetHealthColor());
356
+ i0.ɵɵstyleProp("color", ctx_r2.GetHealthColor());
321
357
  i0.ɵɵadvance();
322
- i0.ɵɵtextInterpolate(ctx_r1.GetHealthScore());
358
+ i0.ɵɵtextInterpolate(ctx_r2.GetHealthScore());
323
359
  i0.ɵɵadvance(7);
324
- i0.ɵɵtextInterpolate1(" ", ctx_r1.Kpis.totalActiveJobs, " active");
360
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.Kpis.totalActiveJobs, " active");
325
361
  i0.ɵɵadvance(3);
326
- i0.ɵɵtextInterpolate1(" ", ctx_r1.Kpis.lockedJobs, " locked");
362
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.Kpis.lockedJobs, " locked");
327
363
  i0.ɵɵadvance(3);
328
- i0.ɵɵtextInterpolate1(" ", ctx_r1.Kpis.totalFailures7d, " failures (7d)");
364
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.Kpis.totalFailures7d, " failures (7d)");
329
365
  i0.ɵɵadvance(7);
330
- i0.ɵɵtextInterpolate(ctx_r1.Kpis.totalActiveJobs);
366
+ i0.ɵɵtextInterpolate(ctx_r2.Kpis.totalActiveJobs);
331
367
  i0.ɵɵadvance(8);
332
- i0.ɵɵtextInterpolate(ctx_r1.Kpis.jobsDueInNextHour);
368
+ i0.ɵɵtextInterpolate(ctx_r2.Kpis.jobsDueInNextHour);
333
369
  i0.ɵɵadvance(8);
334
- i0.ɵɵtextInterpolate(ctx_r1.Kpis.recentExecutions24h);
370
+ i0.ɵɵtextInterpolate(ctx_r2.Kpis.recentExecutions24h);
335
371
  i0.ɵɵadvance(3);
336
- i0.ɵɵstyleProp("color", ctx_r1.GetSuccessRateColor(ctx_r1.Kpis.successRate24h));
372
+ i0.ɵɵstyleProp("color", ctx_r2.GetSuccessRateColor(ctx_r2.Kpis.successRate24h));
337
373
  i0.ɵɵadvance();
338
- i0.ɵɵtextInterpolate1(" ", ctx_r1.FormatPercentage(ctx_r1.Kpis.successRate24h), " success ");
374
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.FormatPercentage(ctx_r2.Kpis.successRate24h), " success ");
339
375
  i0.ɵɵadvance(6);
340
- i0.ɵɵtextInterpolate(ctx_r1.Kpis.currentlyRunning);
376
+ i0.ɵɵtextInterpolate(ctx_r2.Kpis.currentlyRunning);
341
377
  i0.ɵɵadvance(10);
342
- i0.ɵɵtextInterpolate(ctx_r1.LiveExecutions.length);
378
+ i0.ɵɵtextInterpolate(ctx_r2.LiveExecutions.length);
343
379
  i0.ɵɵadvance(2);
344
- i0.ɵɵconditional(ctx_r1.LiveExecutions.length === 0 ? 65 : -1);
380
+ i0.ɵɵconditional(ctx_r2.LiveExecutions.length === 0 ? 65 : -1);
345
381
  i0.ɵɵadvance();
346
- i0.ɵɵrepeater(ctx_r1.LiveExecutions);
382
+ i0.ɵɵrepeater(ctx_r2.LiveExecutions);
347
383
  i0.ɵɵadvance(4);
348
- i0.ɵɵproperty("ngClass", ctx_r1.Alerts.length > 0 ? "alert-header" : "clear-header");
384
+ i0.ɵɵproperty("ngClass", ctx_r2.Alerts.length > 0 ? "alert-header" : "clear-header");
349
385
  i0.ɵɵadvance(2);
350
- i0.ɵɵclassMap(ctx_r1.Alerts.length > 0 ? "fa-solid fa-triangle-exclamation" : "fa-solid fa-shield-check");
386
+ i0.ɵɵclassMap(ctx_r2.Alerts.length > 0 ? "fa-solid fa-triangle-exclamation" : "fa-solid fa-shield-check");
351
387
  i0.ɵɵadvance();
352
- i0.ɵɵtextInterpolate1(" ", ctx_r1.Alerts.length > 0 ? "Alerts" : "All Clear", " ");
388
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.Alerts.length > 0 ? "Alerts" : "All Clear", " ");
353
389
  i0.ɵɵadvance();
354
- i0.ɵɵconditional(ctx_r1.Alerts.length > 0 ? 74 : -1);
390
+ i0.ɵɵconditional(ctx_r2.Alerts.length > 0 ? 74 : -1);
355
391
  i0.ɵɵadvance();
356
- i0.ɵɵconditional(ctx_r1.Alerts.length === 0 ? 75 : -1);
392
+ i0.ɵɵconditional(ctx_r2.Alerts.length === 0 ? 75 : -1);
357
393
  i0.ɵɵadvance(2);
358
- i0.ɵɵconditional(ctx_r1.Alerts.length === 0 ? 77 : -1);
394
+ i0.ɵɵconditional(ctx_r2.Alerts.length === 0 ? 77 : -1);
359
395
  i0.ɵɵadvance();
360
- i0.ɵɵrepeater(ctx_r1.Alerts);
396
+ i0.ɵɵrepeater(ctx_r2.Alerts);
361
397
  i0.ɵɵadvance(8);
362
- i0.ɵɵtextInterpolate(ctx_r1.UpcomingExecutions.length);
398
+ i0.ɵɵtextInterpolate(ctx_r2.UpcomingExecutions.length);
363
399
  i0.ɵɵadvance(2);
364
- i0.ɵɵconditional(ctx_r1.UpcomingExecutions.length === 0 ? 88 : -1);
400
+ i0.ɵɵconditional(ctx_r2.UpcomingExecutions.length === 0 ? 88 : -1);
365
401
  i0.ɵɵadvance();
366
- i0.ɵɵrepeater(ctx_r1.UpcomingExecutions);
402
+ i0.ɵɵrepeater(ctx_r2.UpcomingExecutions);
367
403
  i0.ɵɵadvance(2);
368
- i0.ɵɵconditional(ctx_r1.Locks.length > 0 ? 91 : -1);
404
+ i0.ɵɵconditional(ctx_r2.Locks.length > 0 ? 91 : -1);
405
+ } }
406
+ function SchedulingOverviewComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {
407
+ i0.ɵɵelementStart(0, "div", 7);
408
+ i0.ɵɵconditionalCreate(1, SchedulingOverviewComponent_ng_template_2_Conditional_1_Template, 2, 0, "div", 8);
409
+ i0.ɵɵconditionalCreate(2, SchedulingOverviewComponent_ng_template_2_Conditional_2_Template, 92, 29, "div", 9);
410
+ i0.ɵɵelementEnd();
411
+ } if (rf & 2) {
412
+ const ctx_r2 = i0.ɵɵnextContext();
413
+ i0.ɵɵadvance();
414
+ i0.ɵɵconditional(ctx_r2.IsLoading ? 1 : -1);
415
+ i0.ɵɵadvance();
416
+ i0.ɵɵconditional(!ctx_r2.IsLoading && ctx_r2.Kpis ? 2 : -1);
369
417
  } }
370
418
  export class SchedulingOverviewComponent {
371
419
  schedulingService;
372
420
  cdr;
373
421
  initialState = {};
422
+ /** When true, the inner toolbar is hidden — the parent shell is rendering it in `<mj-page-header>` instead. */
423
+ HideToolbar = false;
374
424
  stateChange = new EventEmitter();
375
425
  Kpis = null;
376
426
  LiveExecutions = [];
@@ -564,36 +614,20 @@ export class SchedulingOverviewComponent {
564
614
  });
565
615
  }
566
616
  static ɵfac = function SchedulingOverviewComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SchedulingOverviewComponent)(i0.ɵɵdirectiveInject(i1.SchedulingInstrumentationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
567
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SchedulingOverviewComponent, selectors: [["app-scheduling-overview"]], inputs: { initialState: "initialState" }, outputs: { stateChange: "stateChange" }, standalone: false, decls: 11, vars: 4, consts: [[1, "overview-container"], [1, "overview-header"], [1, "header-controls"], ["mjButton", "", "variant", "secondary", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], ["mjButton", "", 3, "click", "variant"], [1, "fa-solid", "fa-rotate"], [1, "loading-container"], [1, "overview-content"], ["text", "Loading dashboard...", "size", "medium"], [1, "health-banner"], [1, "health-ring"], ["viewBox", "0 0 80 80", 1, "health-svg"], ["cx", "40", "cy", "40", "r", "36", "fill", "none", "stroke-width", "6", 1, "health-ring-track"], ["cx", "40", "cy", "40", "r", "36", "fill", "none", "stroke-width", "6", "stroke-linecap", "round", "transform", "rotate(-90 40 40)"], [1, "health-score"], [1, "health-details"], [1, "health-title"], [1, "health-stats"], [1, "fa-solid", "fa-check-circle", "status-success"], [1, "fa-solid", "fa-lock", "status-warning"], [1, "fa-solid", "fa-xmark-circle", "status-error"], [1, "kpi-grid"], [1, "kpi-card"], [1, "kpi-icon", "blue"], [1, "fa-solid", "fa-calendar-check"], [1, "kpi-content"], [1, "kpi-value"], [1, "kpi-label"], [1, "kpi-icon", "amber"], [1, "fa-solid", "fa-clock"], [1, "kpi-icon", "purple"], [1, "fa-solid", "fa-chart-bar"], [1, "kpi-sub"], [1, "kpi-icon", "green"], [1, "fa-solid", "fa-play"], [1, "panels-grid"], [1, "panel"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-bolt"], [1, "panel-badge"], [1, "panel-body"], [1, "empty-state-small"], [1, "execution-item"], [1, "right-column"], [1, "panel-header", 3, "ngClass"], [1, "panel-badge", "error"], [1, "panel-badge", "clear"], [1, "empty-state-small", "all-clear"], [1, "alert-item", 3, "ngClass"], [1, "fa-solid", "fa-calendar-day"], [1, "upcoming-item"], [1, "panel", 2, "margin-top", "20px"], [1, "fa-solid", "fa-inbox"], [1, "exec-status"], [3, "ngClass"], [1, "exec-details"], [1, "exec-name"], [1, "exec-meta"], [1, "exec-status-badge", 3, "ngClass"], [1, "fa-solid", "fa-circle-check"], [1, "alert-icon"], [1, "alert-content"], [1, "alert-title"], [1, "alert-message"], [1, "alert-action-btn"], [1, "alert-action-btn", 3, "click"], [1, "fa-solid", "fa-calendar-xmark"], [1, "upcoming-info"], [1, "upcoming-name"], [1, "upcoming-meta"], [1, "upcoming-type"], [1, "upcoming-countdown"], [1, "fa-solid", "fa-lock"], [1, "data-table"], [3, "stale-row"], [1, "cell-name"], [1, "cell-meta"], [1, "lock-status-badge"], [1, "release-btn"], [1, "release-btn", 3, "click"], [1, "fa-solid", "fa-lock-open"]], template: function SchedulingOverviewComponent_Template(rf, ctx) { if (rf & 1) {
568
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "button", 3);
569
- i0.ɵɵlistener("click", function SchedulingOverviewComponent_Template_button_click_3_listener() { return ctx.Refresh(); });
570
- i0.ɵɵelement(4, "i", 4);
571
- i0.ɵɵtext(5, " Refresh ");
572
- i0.ɵɵelementEnd();
573
- i0.ɵɵelementStart(6, "button", 5);
574
- i0.ɵɵlistener("click", function SchedulingOverviewComponent_Template_button_click_6_listener() { return ctx.ToggleAutoRefresh(); });
575
- i0.ɵɵelement(7, "i", 6);
576
- i0.ɵɵtext(8);
577
- i0.ɵɵelementEnd()()();
578
- i0.ɵɵconditionalCreate(9, SchedulingOverviewComponent_Conditional_9_Template, 2, 0, "div", 7);
579
- i0.ɵɵconditionalCreate(10, SchedulingOverviewComponent_Conditional_10_Template, 92, 29, "div", 8);
580
- i0.ɵɵelementEnd();
617
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SchedulingOverviewComponent, selectors: [["app-scheduling-overview"]], inputs: { initialState: "initialState", HideToolbar: "HideToolbar" }, outputs: { stateChange: "stateChange" }, standalone: false, decls: 4, vars: 1, consts: [["content", ""], [4, "ngTemplateOutlet"], ["Title", "Scheduling Dashboard", "Icon", "fa-solid fa-gauge-high", "Subtitle", "System health, KPIs, and alerts"], ["actions", ""], [3, "Clicked"], ["mjButton", "", "size", "sm", "title", "Toggle auto-refresh", 3, "click", "variant"], [1, "fa-solid", "fa-rotate"], [1, "overview-container"], [1, "loading-container"], [1, "overview-content"], ["text", "Loading dashboard...", "size", "medium"], [1, "health-banner"], [1, "health-ring"], ["viewBox", "0 0 80 80", 1, "health-svg"], ["cx", "40", "cy", "40", "r", "36", "fill", "none", "stroke-width", "6", 1, "health-ring-track"], ["cx", "40", "cy", "40", "r", "36", "fill", "none", "stroke-width", "6", "stroke-linecap", "round", "transform", "rotate(-90 40 40)"], [1, "health-score"], [1, "health-details"], [1, "health-title"], [1, "health-stats"], [1, "fa-solid", "fa-check-circle", "status-success"], [1, "fa-solid", "fa-lock", "status-warning"], [1, "fa-solid", "fa-xmark-circle", "status-error"], [1, "kpi-grid"], [1, "kpi-card"], [1, "kpi-icon", "blue"], [1, "fa-solid", "fa-calendar-check"], [1, "kpi-content"], [1, "kpi-value"], [1, "kpi-label"], [1, "kpi-icon", "amber"], [1, "fa-solid", "fa-clock"], [1, "kpi-icon", "purple"], [1, "fa-solid", "fa-chart-bar"], [1, "kpi-sub"], [1, "kpi-icon", "green"], [1, "fa-solid", "fa-play"], [1, "panels-grid"], [1, "panel"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-bolt"], [1, "panel-badge"], [1, "panel-body"], [1, "empty-state-small"], [1, "execution-item"], [1, "right-column"], [1, "panel-header", 3, "ngClass"], [1, "panel-badge", "error"], [1, "panel-badge", "clear"], [1, "empty-state-small", "all-clear"], [1, "alert-item", 3, "ngClass"], [1, "fa-solid", "fa-calendar-day"], [1, "upcoming-item"], [1, "panel", 2, "margin-top", "20px"], [1, "fa-solid", "fa-inbox"], [1, "exec-status"], [3, "ngClass"], [1, "exec-details"], [1, "exec-name"], [1, "exec-meta"], [1, "exec-status-badge", 3, "ngClass"], [1, "fa-solid", "fa-circle-check"], [1, "alert-icon"], [1, "alert-content"], [1, "alert-title"], [1, "alert-message"], [1, "alert-action-btn"], [1, "alert-action-btn", 3, "click"], [1, "fa-solid", "fa-calendar-xmark"], [1, "upcoming-info"], [1, "upcoming-name"], [1, "upcoming-meta"], [1, "upcoming-type"], [1, "upcoming-countdown"], [1, "fa-solid", "fa-lock"], [1, "data-table"], [3, "stale-row"], [1, "cell-name"], [1, "cell-meta"], [1, "lock-status-badge"], [1, "release-btn"], [1, "release-btn", 3, "click"], [1, "fa-solid", "fa-lock-open"]], template: function SchedulingOverviewComponent_Template(rf, ctx) { if (rf & 1) {
618
+ i0.ɵɵconditionalCreate(0, SchedulingOverviewComponent_Conditional_0_Template, 1, 1, "ng-container")(1, SchedulingOverviewComponent_Conditional_1_Template, 9, 3, "mj-page-layout");
619
+ i0.ɵɵtemplate(2, SchedulingOverviewComponent_ng_template_2_Template, 3, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
581
620
  } if (rf & 2) {
582
- i0.ɵɵadvance(6);
583
- i0.ɵɵproperty("variant", ctx.AutoRefreshEnabled ? "primary" : "secondary");
584
- i0.ɵɵadvance(2);
585
- i0.ɵɵtextInterpolate1(" Auto-Refresh: ", ctx.AutoRefreshEnabled ? "ON" : "OFF", " ");
586
- i0.ɵɵadvance();
587
- i0.ɵɵconditional(ctx.IsLoading ? 9 : -1);
588
- i0.ɵɵadvance();
589
- i0.ɵɵconditional(!ctx.IsLoading && ctx.Kpis ? 10 : -1);
590
- } }, dependencies: [i2.NgClass, i3.MJButtonDirective, i4.LoadingComponent], styles: [".overview-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n height: 100%;\n}\n\n.overview-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n flex: 1;\n min-height: 0;\n}\n\n\n\n.overview-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.control-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.control-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.control-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n\n\n.health-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n border-left: 4px solid var(--mj-status-success);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.health-ring[_ngcontent-%COMP%] {\n position: relative;\n width: 80px;\n height: 80px;\n flex-shrink: 0;\n}\n\n.health-svg[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n}\n\n.health-ring-track[_ngcontent-%COMP%] {\n stroke: var(--mj-border-default);\n}\n\n.health-score[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 1.5rem;\n font-weight: 800;\n}\n\n.health-details[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.health-title[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n}\n\n.health-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n}\n\n.health-stats[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n\n\n.kpi-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.kpi-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.kpi-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-lg);\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: 1.2rem;\n flex-shrink: 0;\n}\n\n.kpi-icon.blue[_ngcontent-%COMP%] { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.amber[_ngcontent-%COMP%] { background: var(--mj-status-warning); color: var(--mj-text-inverse); }\n.kpi-icon.purple[_ngcontent-%COMP%] { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.green[_ngcontent-%COMP%] { background: var(--mj-status-success); color: var(--mj-text-inverse); }\n\n.kpi-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.kpi-value[_ngcontent-%COMP%] {\n font-size: 1.75rem;\n font-weight: 800;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.kpi-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.kpi-sub[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n font-weight: 600;\n margin-top: 2px;\n}\n\n\n\n.panels-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n flex: 1;\n min-height: 300px;\n}\n\n.right-column[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.panel-header.alert-header[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.panel-header.clear-header[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-success);\n}\n\n.clear-header[_ngcontent-%COMP%] .panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.panel-badge.clear[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.all-clear[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success) !important;\n}\n\n.all-clear[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n font-weight: 500;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n font-size: 0.95rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.alert-header[_ngcontent-%COMP%] .panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.panel-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 700;\n padding: 2px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.panel-badge.error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.panel-body[_ngcontent-%COMP%] {\n padding: 12px 20px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n\n\n.execution-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.execution-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.exec-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n}\n\n.exec-details[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.exec-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.exec-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.exec-status-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n}\n\n\n\n.status-running[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n.status-success[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n.status-error[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n.status-warning[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n\n.exec-status-badge.status-running[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface)); color: var(--mj-brand-primary); }\n.exec-status-badge.status-success[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface)); color: var(--mj-status-success); }\n.exec-status-badge.status-error[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface)); color: var(--mj-status-error); }\n.exec-status-badge.status-warning[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); color: var(--mj-status-warning); }\n\n\n\n.alert-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n border-radius: 10px;\n margin-bottom: 8px;\n}\n\n.alert-item[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.alert-item.alert-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.alert-item.alert-warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n.alert-icon[_ngcontent-%COMP%] {\n font-size: 1rem;\n margin-top: 2px;\n}\n\n.alert-error[_ngcontent-%COMP%] .alert-icon[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n.alert-warning[_ngcontent-%COMP%] .alert-icon[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n\n.alert-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.alert-title[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n}\n\n.alert-message[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n margin-top: 2px;\n}\n\n.alert-action-btn[_ngcontent-%COMP%] {\n padding: 4px 12px;\n font-size: 0.75rem;\n font-weight: 600;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.2s;\n}\n\n.alert-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error);\n}\n\n\n\n.upcoming-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.upcoming-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.upcoming-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.upcoming-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.upcoming-type[_ngcontent-%COMP%] {\n display: inline-flex;\n padding: 1px 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-left: 6px;\n}\n\n.upcoming-countdown[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.upcoming-countdown.soon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n.empty-state-small[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n\n.empty-state-small[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n color: var(--mj-border-strong);\n}\n\n.empty-state-small[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n}\n\n\n\n.data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 12px;\n font-size: 0.85rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.cell-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.cell-meta[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.stale-row[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.lock-status-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.lock-status-badge.stale[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.release-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n font-size: 0.75rem;\n font-weight: 600;\n background: transparent;\n color: var(--mj-status-error);\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.release-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n}\n\n\n\n@media (max-width: 1024px) {\n .panels-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .kpi-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .kpi-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .health-banner[_ngcontent-%COMP%] {\n flex-direction: column;\n text-align: center;\n }\n .health-stats[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 8px;\n align-items: center;\n }\n .data-table[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n }\n}"], changeDetection: 0 });
621
+ i0.ɵɵconditional(ctx.HideToolbar ? 0 : 1);
622
+ } }, dependencies: [i2.NgClass, i2.NgTemplateOutlet, i3.MJButtonDirective, i3.MJPageHeaderComponent, i3.MJPageLayoutComponent, i3.MJPageBodyComponent, i3.MJRefreshButtonComponent, i4.LoadingComponent], styles: [".overview-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n height: 100%;\n}\n\n.overview-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n flex: 1;\n min-height: 0;\n}\n\n\n\n.overview-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.control-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.control-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.control-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n\n\n.health-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n border-left: 4px solid var(--mj-status-success);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.health-ring[_ngcontent-%COMP%] {\n position: relative;\n width: 80px;\n height: 80px;\n flex-shrink: 0;\n}\n\n.health-svg[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n}\n\n.health-ring-track[_ngcontent-%COMP%] {\n stroke: var(--mj-border-default);\n}\n\n.health-score[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 1.5rem;\n font-weight: 800;\n}\n\n.health-details[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.health-title[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n}\n\n.health-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n}\n\n.health-stats[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n\n\n.kpi-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.kpi-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.kpi-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-lg);\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: 1.2rem;\n flex-shrink: 0;\n}\n\n.kpi-icon.blue[_ngcontent-%COMP%] { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.amber[_ngcontent-%COMP%] { background: var(--mj-status-warning); color: var(--mj-text-inverse); }\n.kpi-icon.purple[_ngcontent-%COMP%] { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.green[_ngcontent-%COMP%] { background: var(--mj-status-success); color: var(--mj-text-inverse); }\n\n.kpi-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.kpi-value[_ngcontent-%COMP%] {\n font-size: 1.75rem;\n font-weight: 800;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.kpi-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.kpi-sub[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n font-weight: 600;\n margin-top: 2px;\n}\n\n\n\n.panels-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n flex: 1;\n min-height: 300px;\n}\n\n.right-column[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.panel-header.alert-header[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.panel-header.clear-header[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-success);\n}\n\n.clear-header[_ngcontent-%COMP%] .panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.panel-badge.clear[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.all-clear[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success) !important;\n}\n\n.all-clear[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n font-weight: 500;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n font-size: 0.95rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.alert-header[_ngcontent-%COMP%] .panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.panel-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 700;\n padding: 2px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.panel-badge.error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.panel-body[_ngcontent-%COMP%] {\n padding: 12px 20px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n\n\n.execution-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.execution-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.exec-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n}\n\n.exec-details[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.exec-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.exec-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.exec-status-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n}\n\n\n\n.status-running[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n.status-success[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n.status-error[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n.status-warning[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n\n.exec-status-badge.status-running[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface)); color: var(--mj-brand-primary); }\n.exec-status-badge.status-success[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface)); color: var(--mj-status-success); }\n.exec-status-badge.status-error[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface)); color: var(--mj-status-error); }\n.exec-status-badge.status-warning[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); color: var(--mj-status-warning); }\n\n\n\n.alert-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n border-radius: 10px;\n margin-bottom: 8px;\n}\n\n.alert-item[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.alert-item.alert-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.alert-item.alert-warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n.alert-icon[_ngcontent-%COMP%] {\n font-size: 1rem;\n margin-top: 2px;\n}\n\n.alert-error[_ngcontent-%COMP%] .alert-icon[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n.alert-warning[_ngcontent-%COMP%] .alert-icon[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n\n.alert-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.alert-title[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n}\n\n.alert-message[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n margin-top: 2px;\n}\n\n.alert-action-btn[_ngcontent-%COMP%] {\n padding: 4px 12px;\n font-size: 0.75rem;\n font-weight: 600;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.2s;\n}\n\n.alert-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error);\n}\n\n\n\n.upcoming-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.upcoming-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.upcoming-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.upcoming-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.upcoming-type[_ngcontent-%COMP%] {\n display: inline-flex;\n padding: 1px 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-left: 6px;\n}\n\n.upcoming-countdown[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.upcoming-countdown.soon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n.empty-state-small[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n\n.empty-state-small[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n color: var(--mj-border-strong);\n}\n\n.empty-state-small[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n}\n\n\n\n.data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 12px;\n font-size: 0.85rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.cell-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.cell-meta[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.stale-row[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.lock-status-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.lock-status-badge.stale[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.release-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n font-size: 0.75rem;\n font-weight: 600;\n background: transparent;\n color: var(--mj-status-error);\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.release-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n}\n\n\n\n@media (max-width: 1024px) {\n .panels-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .kpi-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .kpi-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .health-banner[_ngcontent-%COMP%] {\n flex-direction: column;\n text-align: center;\n }\n .health-stats[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 8px;\n align-items: center;\n }\n .data-table[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n }\n}"], changeDetection: 0 });
591
623
  }
592
624
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SchedulingOverviewComponent, [{
593
625
  type: Component,
594
- args: [{ standalone: false, selector: 'app-scheduling-overview', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"overview-container\">\n <!-- Header Controls -->\n <div class=\"overview-header\">\n <div class=\"header-controls\">\n <button mjButton variant=\"secondary\" (click)=\"Refresh()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n <button mjButton [variant]=\"AutoRefreshEnabled ? 'primary' : 'secondary'\" (click)=\"ToggleAutoRefresh()\">\n <i class=\"fa-solid fa-rotate\"></i>\n Auto-Refresh: {{AutoRefreshEnabled ? 'ON' : 'OFF'}}\n </button>\n </div>\n </div>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading dashboard...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading && Kpis) {\n <div class=\"overview-content\">\n <!-- Health Banner -->\n <div class=\"health-banner\" [style.border-color]=\"GetHealthColor()\">\n <div class=\"health-ring\">\n <svg viewBox=\"0 0 80 80\" class=\"health-svg\">\n <circle cx=\"40\" cy=\"40\" r=\"36\" fill=\"none\" class=\"health-ring-track\" stroke-width=\"6\"/>\n <circle cx=\"40\" cy=\"40\" r=\"36\" fill=\"none\"\n [attr.stroke]=\"GetHealthColor()\"\n stroke-width=\"6\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"GetHealthStrokeDasharray()\"\n transform=\"rotate(-90 40 40)\"/>\n </svg>\n <div class=\"health-score\" [style.color]=\"GetHealthColor()\">{{GetHealthScore()}}</div>\n </div>\n <div class=\"health-details\">\n <div class=\"health-title\">System Health</div>\n <div class=\"health-stats\">\n <span><i class=\"fa-solid fa-check-circle status-success\"></i> {{Kpis.totalActiveJobs}} active</span>\n <span><i class=\"fa-solid fa-lock status-warning\"></i> {{Kpis.lockedJobs}} locked</span>\n <span><i class=\"fa-solid fa-xmark-circle status-error\"></i> {{Kpis.totalFailures7d}} failures (7d)</span>\n </div>\n </div>\n </div>\n <!-- KPI Cards -->\n <div class=\"kpi-grid\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon blue\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.totalActiveJobs}}</div>\n <div class=\"kpi-label\">Active Jobs</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon amber\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.jobsDueInNextHour}}</div>\n <div class=\"kpi-label\">Due Next Hour</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon purple\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.recentExecutions24h}}</div>\n <div class=\"kpi-label\">Runs (24h)</div>\n <div class=\"kpi-sub\" [style.color]=\"GetSuccessRateColor(Kpis.successRate24h)\">\n {{FormatPercentage(Kpis.successRate24h)}} success\n </div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon green\">\n <i class=\"fa-solid fa-play\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.currentlyRunning}}</div>\n <div class=\"kpi-label\">Running Now</div>\n </div>\n </div>\n </div>\n <!-- Two-Column Layout: Live Executions + Alerts/Upcoming -->\n <div class=\"panels-grid\">\n <!-- Live Executions -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-bolt\"></i> Live Executions\n </div>\n <span class=\"panel-badge\">{{LiveExecutions.length}}</span>\n </div>\n <div class=\"panel-body\">\n @if (LiveExecutions.length === 0) {\n <div class=\"empty-state-small\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No recent executions</span>\n </div>\n }\n @for (exec of LiveExecutions; track exec) {\n <div class=\"execution-item\">\n <div class=\"exec-status\">\n <i [class]=\"GetStatusIcon(exec.status)\" [ngClass]=\"GetStatusClass(exec.status)\"></i>\n </div>\n <div class=\"exec-details\">\n <div class=\"exec-name\">{{exec.jobName}}</div>\n <div class=\"exec-meta\">{{FormatTimeAgo(exec.startedAt)}} &middot; {{FormatDuration(exec.duration)}}</div>\n </div>\n <div class=\"exec-status-badge\" [ngClass]=\"GetStatusClass(exec.status)\">\n {{exec.status}}\n </div>\n </div>\n }\n </div>\n </div>\n <!-- Right Column: Alerts + Upcoming -->\n <div class=\"right-column\">\n <!-- Alerts -->\n <div class=\"panel\">\n <div class=\"panel-header\" [ngClass]=\"Alerts.length > 0 ? 'alert-header' : 'clear-header'\">\n <div class=\"panel-title\">\n <i [class]=\"Alerts.length > 0 ? 'fa-solid fa-triangle-exclamation' : 'fa-solid fa-shield-check'\"></i>\n {{Alerts.length > 0 ? 'Alerts' : 'All Clear'}}\n </div>\n @if (Alerts.length > 0) {\n <span class=\"panel-badge error\">{{Alerts.length}}</span>\n }\n @if (Alerts.length === 0) {\n <span class=\"panel-badge clear\">0</span>\n }\n </div>\n <div class=\"panel-body\">\n @if (Alerts.length === 0) {\n <div class=\"empty-state-small all-clear\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>No active alerts</span>\n </div>\n }\n @for (alert of Alerts; track alert) {\n <div class=\"alert-item\" [ngClass]=\"'alert-' + alert.severity\">\n <i [class]=\"GetAlertIcon(alert.severity)\" class=\"alert-icon\"></i>\n <div class=\"alert-content\">\n <div class=\"alert-title\">{{alert.title}}</div>\n <div class=\"alert-message\">{{alert.message}}</div>\n </div>\n @if (alert.type === 'stale-lock' && alert.jobId) {\n <button\n class=\"alert-action-btn\"\n (click)=\"ReleaseLock(alert.jobId!)\">\n Release\n </button>\n }\n </div>\n }\n </div>\n </div>\n <!-- Upcoming -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-calendar-day\"></i> Upcoming (24h)\n </div>\n <span class=\"panel-badge\">{{UpcomingExecutions.length}}</span>\n </div>\n <div class=\"panel-body\">\n @if (UpcomingExecutions.length === 0) {\n <div class=\"empty-state-small\">\n <i class=\"fa-solid fa-calendar-xmark\"></i>\n <span>No upcoming executions</span>\n </div>\n }\n @for (upcoming of UpcomingExecutions; track upcoming) {\n <div class=\"upcoming-item\">\n <div class=\"upcoming-info\">\n <div class=\"upcoming-name\">{{upcoming.jobName}}</div>\n <div class=\"upcoming-meta\">\n {{FormatDateTime(upcoming.nextRunAt)}}\n <span class=\"upcoming-type\">{{upcoming.jobType}}</span>\n </div>\n </div>\n <div class=\"upcoming-countdown\" [class.soon]=\"FormatTimeUntil(upcoming.nextRunAt).includes('m') && !FormatTimeUntil(upcoming.nextRunAt).includes('h')\">\n {{FormatTimeUntil(upcoming.nextRunAt)}}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n <!-- Locks Section -->\n @if (Locks.length > 0) {\n <div class=\"panel\" style=\"margin-top: 20px;\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-lock\"></i> Active Locks\n </div>\n <span class=\"panel-badge\">{{Locks.length}}</span>\n </div>\n <div class=\"panel-body\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Job</th>\n <th>Locked By</th>\n <th>Locked At</th>\n <th>Expected Completion</th>\n <th>Status</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (lock of Locks; track lock) {\n <tr [class.stale-row]=\"lock.isStale\">\n <td class=\"cell-name\">{{lock.jobName}}</td>\n <td class=\"cell-meta\">{{lock.lockedBy}}</td>\n <td class=\"cell-meta\">{{FormatTimeAgo(lock.lockedAt)}}</td>\n <td class=\"cell-meta\">{{FormatDateTime(lock.expectedCompletion)}}</td>\n <td>\n <span class=\"lock-status-badge\" [class.stale]=\"lock.isStale\">\n {{lock.isStale ? 'Stale' : 'Active'}}\n </span>\n </td>\n <td>\n @if (lock.isStale) {\n <button class=\"release-btn\" (click)=\"ReleaseLock(lock.jobId)\">\n <i class=\"fa-solid fa-lock-open\"></i> Release\n </button>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".overview-container {\n display: flex;\n flex-direction: column;\n gap: 20px;\n height: 100%;\n}\n\n.overview-content {\n display: flex;\n flex-direction: column;\n gap: 20px;\n flex: 1;\n min-height: 0;\n}\n\n/* \u2500\u2500 Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.overview-header {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n}\n\n.header-controls {\n display: flex;\n gap: 8px;\n}\n\n.control-btn {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.control-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.control-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n/* \u2500\u2500 Health Banner \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.health-banner {\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n border-left: 4px solid var(--mj-status-success);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.health-ring {\n position: relative;\n width: 80px;\n height: 80px;\n flex-shrink: 0;\n}\n\n.health-svg {\n width: 100%;\n height: 100%;\n}\n\n.health-ring-track {\n stroke: var(--mj-border-default);\n}\n\n.health-score {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 1.5rem;\n font-weight: 800;\n}\n\n.health-details {\n flex: 1;\n}\n\n.health-title {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n}\n\n.health-stats {\n display: flex;\n gap: 20px;\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n}\n\n.health-stats span {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n/* \u2500\u2500 KPI Cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.kpi-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.kpi-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-lg);\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: 1.2rem;\n flex-shrink: 0;\n}\n\n.kpi-icon.blue { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.amber { background: var(--mj-status-warning); color: var(--mj-text-inverse); }\n.kpi-icon.purple { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.green { background: var(--mj-status-success); color: var(--mj-text-inverse); }\n\n.kpi-content {\n flex: 1;\n}\n\n.kpi-value {\n font-size: 1.75rem;\n font-weight: 800;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.kpi-label {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.kpi-sub {\n font-size: 0.75rem;\n font-weight: 600;\n margin-top: 2px;\n}\n\n/* \u2500\u2500 Panels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.panels-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n flex: 1;\n min-height: 300px;\n}\n\n.right-column {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.panel {\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.panel-header.alert-header {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.panel-header.clear-header {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-success);\n}\n\n.clear-header .panel-title i {\n color: var(--mj-status-success);\n}\n\n.panel-badge.clear {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.all-clear i {\n color: var(--mj-status-success) !important;\n}\n\n.all-clear span {\n color: var(--mj-status-success);\n font-weight: 500;\n}\n\n.panel-title {\n font-size: 0.95rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n}\n\n.alert-header .panel-title i {\n color: var(--mj-status-error);\n}\n\n.panel-badge {\n font-size: 0.7rem;\n font-weight: 700;\n padding: 2px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.panel-badge.error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.panel-body {\n padding: 12px 20px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n/* \u2500\u2500 Execution Items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.execution-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.execution-item:last-child {\n border-bottom: none;\n}\n\n.exec-status i {\n font-size: 1.1rem;\n}\n\n.exec-details {\n flex: 1;\n}\n\n.exec-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.exec-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.exec-status-badge {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n}\n\n/* Status Colors */\n.status-running { color: var(--mj-brand-primary); }\n.status-success { color: var(--mj-status-success); }\n.status-error { color: var(--mj-status-error); }\n.status-warning { color: var(--mj-status-warning); }\n\n.exec-status-badge.status-running { background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface)); color: var(--mj-brand-primary); }\n.exec-status-badge.status-success { background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface)); color: var(--mj-status-success); }\n.exec-status-badge.status-error { background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface)); color: var(--mj-status-error); }\n.exec-status-badge.status-warning { background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); color: var(--mj-status-warning); }\n\n/* \u2500\u2500 Alert Items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.alert-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n border-radius: 10px;\n margin-bottom: 8px;\n}\n\n.alert-item:last-child {\n margin-bottom: 0;\n}\n\n.alert-item.alert-error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.alert-item.alert-warning {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n.alert-icon {\n font-size: 1rem;\n margin-top: 2px;\n}\n\n.alert-error .alert-icon { color: var(--mj-status-error); }\n.alert-warning .alert-icon { color: var(--mj-status-warning); }\n\n.alert-content {\n flex: 1;\n}\n\n.alert-title {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n}\n\n.alert-message {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n margin-top: 2px;\n}\n\n.alert-action-btn {\n padding: 4px 12px;\n font-size: 0.75rem;\n font-weight: 600;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.2s;\n}\n\n.alert-action-btn:hover {\n background: var(--mj-status-error);\n}\n\n/* \u2500\u2500 Upcoming Items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.upcoming-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.upcoming-item:last-child {\n border-bottom: none;\n}\n\n.upcoming-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.upcoming-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.upcoming-type {\n display: inline-flex;\n padding: 1px 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-left: 6px;\n}\n\n.upcoming-countdown {\n font-size: 0.85rem;\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.upcoming-countdown.soon {\n color: var(--mj-status-warning);\n}\n\n/* \u2500\u2500 Empty State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.empty-state-small {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n\n.empty-state-small i {\n font-size: 2rem;\n color: var(--mj-border-strong);\n}\n\n.empty-state-small span {\n font-size: 0.85rem;\n}\n\n/* \u2500\u2500 Data Table \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.data-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table th {\n text-align: left;\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table td {\n padding: 10px 12px;\n font-size: 0.85rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.cell-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.cell-meta {\n color: var(--mj-text-secondary);\n}\n\n.stale-row {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.lock-status-badge {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.lock-status-badge.stale {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.release-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n font-size: 0.75rem;\n font-weight: 600;\n background: transparent;\n color: var(--mj-status-error);\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.release-btn:hover {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n}\n\n/* \u2500\u2500 Responsive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (max-width: 1024px) {\n .panels-grid {\n grid-template-columns: 1fr;\n }\n .kpi-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .kpi-grid {\n grid-template-columns: 1fr;\n }\n .health-banner {\n flex-direction: column;\n text-align: center;\n }\n .health-stats {\n flex-direction: column;\n gap: 8px;\n align-items: center;\n }\n .data-table {\n font-size: 0.8rem;\n }\n}\n"] }]
626
+ args: [{ standalone: false, selector: 'app-scheduling-overview', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (HideToolbar) {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n} @else {\n <mj-page-layout>\n <mj-page-header\n Title=\"Scheduling Dashboard\"\n Icon=\"fa-solid fa-gauge-high\"\n Subtitle=\"System health, KPIs, and alerts\">\n <div actions>\n <mj-refresh-button (Clicked)=\"Refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"AutoRefreshEnabled ? 'primary' : 'secondary'\"\n size=\"sm\"\n (click)=\"ToggleAutoRefresh()\"\n title=\"Toggle auto-refresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n Auto: {{AutoRefreshEnabled ? 'ON' : 'OFF'}}\n </button>\n </div>\n </mj-page-header>\n <mj-page-body>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </mj-page-body>\n </mj-page-layout>\n}\n\n<ng-template #content>\n<div class=\"overview-container\">\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading dashboard...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading && Kpis) {\n <div class=\"overview-content\">\n <!-- Health Banner -->\n <div class=\"health-banner\" [style.border-color]=\"GetHealthColor()\">\n <div class=\"health-ring\">\n <svg viewBox=\"0 0 80 80\" class=\"health-svg\">\n <circle cx=\"40\" cy=\"40\" r=\"36\" fill=\"none\" class=\"health-ring-track\" stroke-width=\"6\"/>\n <circle cx=\"40\" cy=\"40\" r=\"36\" fill=\"none\"\n [attr.stroke]=\"GetHealthColor()\"\n stroke-width=\"6\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"GetHealthStrokeDasharray()\"\n transform=\"rotate(-90 40 40)\"/>\n </svg>\n <div class=\"health-score\" [style.color]=\"GetHealthColor()\">{{GetHealthScore()}}</div>\n </div>\n <div class=\"health-details\">\n <div class=\"health-title\">System Health</div>\n <div class=\"health-stats\">\n <span><i class=\"fa-solid fa-check-circle status-success\"></i> {{Kpis.totalActiveJobs}} active</span>\n <span><i class=\"fa-solid fa-lock status-warning\"></i> {{Kpis.lockedJobs}} locked</span>\n <span><i class=\"fa-solid fa-xmark-circle status-error\"></i> {{Kpis.totalFailures7d}} failures (7d)</span>\n </div>\n </div>\n </div>\n <!-- KPI Cards -->\n <div class=\"kpi-grid\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon blue\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.totalActiveJobs}}</div>\n <div class=\"kpi-label\">Active Jobs</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon amber\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.jobsDueInNextHour}}</div>\n <div class=\"kpi-label\">Due Next Hour</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon purple\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.recentExecutions24h}}</div>\n <div class=\"kpi-label\">Runs (24h)</div>\n <div class=\"kpi-sub\" [style.color]=\"GetSuccessRateColor(Kpis.successRate24h)\">\n {{FormatPercentage(Kpis.successRate24h)}} success\n </div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon green\">\n <i class=\"fa-solid fa-play\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{Kpis.currentlyRunning}}</div>\n <div class=\"kpi-label\">Running Now</div>\n </div>\n </div>\n </div>\n <!-- Two-Column Layout: Live Executions + Alerts/Upcoming -->\n <div class=\"panels-grid\">\n <!-- Live Executions -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-bolt\"></i> Live Executions\n </div>\n <span class=\"panel-badge\">{{LiveExecutions.length}}</span>\n </div>\n <div class=\"panel-body\">\n @if (LiveExecutions.length === 0) {\n <div class=\"empty-state-small\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No recent executions</span>\n </div>\n }\n @for (exec of LiveExecutions; track exec) {\n <div class=\"execution-item\">\n <div class=\"exec-status\">\n <i [class]=\"GetStatusIcon(exec.status)\" [ngClass]=\"GetStatusClass(exec.status)\"></i>\n </div>\n <div class=\"exec-details\">\n <div class=\"exec-name\">{{exec.jobName}}</div>\n <div class=\"exec-meta\">{{FormatTimeAgo(exec.startedAt)}} &middot; {{FormatDuration(exec.duration)}}</div>\n </div>\n <div class=\"exec-status-badge\" [ngClass]=\"GetStatusClass(exec.status)\">\n {{exec.status}}\n </div>\n </div>\n }\n </div>\n </div>\n <!-- Right Column: Alerts + Upcoming -->\n <div class=\"right-column\">\n <!-- Alerts -->\n <div class=\"panel\">\n <div class=\"panel-header\" [ngClass]=\"Alerts.length > 0 ? 'alert-header' : 'clear-header'\">\n <div class=\"panel-title\">\n <i [class]=\"Alerts.length > 0 ? 'fa-solid fa-triangle-exclamation' : 'fa-solid fa-shield-check'\"></i>\n {{Alerts.length > 0 ? 'Alerts' : 'All Clear'}}\n </div>\n @if (Alerts.length > 0) {\n <span class=\"panel-badge error\">{{Alerts.length}}</span>\n }\n @if (Alerts.length === 0) {\n <span class=\"panel-badge clear\">0</span>\n }\n </div>\n <div class=\"panel-body\">\n @if (Alerts.length === 0) {\n <div class=\"empty-state-small all-clear\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>No active alerts</span>\n </div>\n }\n @for (alert of Alerts; track alert) {\n <div class=\"alert-item\" [ngClass]=\"'alert-' + alert.severity\">\n <i [class]=\"GetAlertIcon(alert.severity)\" class=\"alert-icon\"></i>\n <div class=\"alert-content\">\n <div class=\"alert-title\">{{alert.title}}</div>\n <div class=\"alert-message\">{{alert.message}}</div>\n </div>\n @if (alert.type === 'stale-lock' && alert.jobId) {\n <button\n class=\"alert-action-btn\"\n (click)=\"ReleaseLock(alert.jobId!)\">\n Release\n </button>\n }\n </div>\n }\n </div>\n </div>\n <!-- Upcoming -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-calendar-day\"></i> Upcoming (24h)\n </div>\n <span class=\"panel-badge\">{{UpcomingExecutions.length}}</span>\n </div>\n <div class=\"panel-body\">\n @if (UpcomingExecutions.length === 0) {\n <div class=\"empty-state-small\">\n <i class=\"fa-solid fa-calendar-xmark\"></i>\n <span>No upcoming executions</span>\n </div>\n }\n @for (upcoming of UpcomingExecutions; track upcoming) {\n <div class=\"upcoming-item\">\n <div class=\"upcoming-info\">\n <div class=\"upcoming-name\">{{upcoming.jobName}}</div>\n <div class=\"upcoming-meta\">\n {{FormatDateTime(upcoming.nextRunAt)}}\n <span class=\"upcoming-type\">{{upcoming.jobType}}</span>\n </div>\n </div>\n <div class=\"upcoming-countdown\" [class.soon]=\"FormatTimeUntil(upcoming.nextRunAt).includes('m') && !FormatTimeUntil(upcoming.nextRunAt).includes('h')\">\n {{FormatTimeUntil(upcoming.nextRunAt)}}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n <!-- Locks Section -->\n @if (Locks.length > 0) {\n <div class=\"panel\" style=\"margin-top: 20px;\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-lock\"></i> Active Locks\n </div>\n <span class=\"panel-badge\">{{Locks.length}}</span>\n </div>\n <div class=\"panel-body\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Job</th>\n <th>Locked By</th>\n <th>Locked At</th>\n <th>Expected Completion</th>\n <th>Status</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (lock of Locks; track lock) {\n <tr [class.stale-row]=\"lock.isStale\">\n <td class=\"cell-name\">{{lock.jobName}}</td>\n <td class=\"cell-meta\">{{lock.lockedBy}}</td>\n <td class=\"cell-meta\">{{FormatTimeAgo(lock.lockedAt)}}</td>\n <td class=\"cell-meta\">{{FormatDateTime(lock.expectedCompletion)}}</td>\n <td>\n <span class=\"lock-status-badge\" [class.stale]=\"lock.isStale\">\n {{lock.isStale ? 'Stale' : 'Active'}}\n </span>\n </td>\n <td>\n @if (lock.isStale) {\n <button class=\"release-btn\" (click)=\"ReleaseLock(lock.jobId)\">\n <i class=\"fa-solid fa-lock-open\"></i> Release\n </button>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n </div>\n }\n</div>\n</ng-template>\n", styles: [".overview-container {\n display: flex;\n flex-direction: column;\n gap: 20px;\n height: 100%;\n}\n\n.overview-content {\n display: flex;\n flex-direction: column;\n gap: 20px;\n flex: 1;\n min-height: 0;\n}\n\n/* \u2500\u2500 Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.overview-header {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n}\n\n.header-controls {\n display: flex;\n gap: 8px;\n}\n\n.control-btn {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.control-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.control-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n/* \u2500\u2500 Health Banner \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.health-banner {\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n border-left: 4px solid var(--mj-status-success);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.health-ring {\n position: relative;\n width: 80px;\n height: 80px;\n flex-shrink: 0;\n}\n\n.health-svg {\n width: 100%;\n height: 100%;\n}\n\n.health-ring-track {\n stroke: var(--mj-border-default);\n}\n\n.health-score {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 1.5rem;\n font-weight: 800;\n}\n\n.health-details {\n flex: 1;\n}\n\n.health-title {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n}\n\n.health-stats {\n display: flex;\n gap: 20px;\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n}\n\n.health-stats span {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n/* \u2500\u2500 KPI Cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.kpi-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.kpi-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-lg);\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: 1.2rem;\n flex-shrink: 0;\n}\n\n.kpi-icon.blue { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.amber { background: var(--mj-status-warning); color: var(--mj-text-inverse); }\n.kpi-icon.purple { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n.kpi-icon.green { background: var(--mj-status-success); color: var(--mj-text-inverse); }\n\n.kpi-content {\n flex: 1;\n}\n\n.kpi-value {\n font-size: 1.75rem;\n font-weight: 800;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.kpi-label {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.kpi-sub {\n font-size: 0.75rem;\n font-weight: 600;\n margin-top: 2px;\n}\n\n/* \u2500\u2500 Panels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.panels-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n flex: 1;\n min-height: 300px;\n}\n\n.right-column {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.panel {\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.panel-header.alert-header {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.panel-header.clear-header {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-success);\n}\n\n.clear-header .panel-title i {\n color: var(--mj-status-success);\n}\n\n.panel-badge.clear {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.all-clear i {\n color: var(--mj-status-success) !important;\n}\n\n.all-clear span {\n color: var(--mj-status-success);\n font-weight: 500;\n}\n\n.panel-title {\n font-size: 0.95rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n}\n\n.alert-header .panel-title i {\n color: var(--mj-status-error);\n}\n\n.panel-badge {\n font-size: 0.7rem;\n font-weight: 700;\n padding: 2px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.panel-badge.error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.panel-body {\n padding: 12px 20px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n/* \u2500\u2500 Execution Items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.execution-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.execution-item:last-child {\n border-bottom: none;\n}\n\n.exec-status i {\n font-size: 1.1rem;\n}\n\n.exec-details {\n flex: 1;\n}\n\n.exec-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.exec-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.exec-status-badge {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n}\n\n/* Status Colors */\n.status-running { color: var(--mj-brand-primary); }\n.status-success { color: var(--mj-status-success); }\n.status-error { color: var(--mj-status-error); }\n.status-warning { color: var(--mj-status-warning); }\n\n.exec-status-badge.status-running { background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface)); color: var(--mj-brand-primary); }\n.exec-status-badge.status-success { background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface)); color: var(--mj-status-success); }\n.exec-status-badge.status-error { background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface)); color: var(--mj-status-error); }\n.exec-status-badge.status-warning { background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); color: var(--mj-status-warning); }\n\n/* \u2500\u2500 Alert Items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.alert-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n border-radius: 10px;\n margin-bottom: 8px;\n}\n\n.alert-item:last-child {\n margin-bottom: 0;\n}\n\n.alert-item.alert-error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.alert-item.alert-warning {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n.alert-icon {\n font-size: 1rem;\n margin-top: 2px;\n}\n\n.alert-error .alert-icon { color: var(--mj-status-error); }\n.alert-warning .alert-icon { color: var(--mj-status-warning); }\n\n.alert-content {\n flex: 1;\n}\n\n.alert-title {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n}\n\n.alert-message {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n margin-top: 2px;\n}\n\n.alert-action-btn {\n padding: 4px 12px;\n font-size: 0.75rem;\n font-weight: 600;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.2s;\n}\n\n.alert-action-btn:hover {\n background: var(--mj-status-error);\n}\n\n/* \u2500\u2500 Upcoming Items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.upcoming-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.upcoming-item:last-child {\n border-bottom: none;\n}\n\n.upcoming-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n}\n\n.upcoming-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.upcoming-type {\n display: inline-flex;\n padding: 1px 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-left: 6px;\n}\n\n.upcoming-countdown {\n font-size: 0.85rem;\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.upcoming-countdown.soon {\n color: var(--mj-status-warning);\n}\n\n/* \u2500\u2500 Empty State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.empty-state-small {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n\n.empty-state-small i {\n font-size: 2rem;\n color: var(--mj-border-strong);\n}\n\n.empty-state-small span {\n font-size: 0.85rem;\n}\n\n/* \u2500\u2500 Data Table \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.data-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table th {\n text-align: left;\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table td {\n padding: 10px 12px;\n font-size: 0.85rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.cell-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.cell-meta {\n color: var(--mj-text-secondary);\n}\n\n.stale-row {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.lock-status-badge {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.lock-status-badge.stale {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.release-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n font-size: 0.75rem;\n font-weight: 600;\n background: transparent;\n color: var(--mj-status-error);\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.release-btn:hover {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n}\n\n/* \u2500\u2500 Responsive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (max-width: 1024px) {\n .panels-grid {\n grid-template-columns: 1fr;\n }\n .kpi-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .kpi-grid {\n grid-template-columns: 1fr;\n }\n .health-banner {\n flex-direction: column;\n text-align: center;\n }\n .health-stats {\n flex-direction: column;\n gap: 8px;\n align-items: center;\n }\n .data-table {\n font-size: 0.8rem;\n }\n}\n"] }]
595
627
  }], () => [{ type: i1.SchedulingInstrumentationService }, { type: i0.ChangeDetectorRef }], { initialState: [{
596
628
  type: Input
629
+ }], HideToolbar: [{
630
+ type: Input
597
631
  }], stateChange: [{
598
632
  type: Output
599
633
  }] }); })();