@memberjunction/ng-dashboards 5.34.0 → 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 (348) 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.d.ts +4 -0
  235. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  236. package/dist/SystemDiagnostics/system-diagnostics.component.js +812 -784
  237. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  238. package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
  239. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  240. package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
  241. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  242. package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
  243. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  244. package/dist/Testing/components/testing-analytics.component.js +420 -393
  245. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  246. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  247. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  248. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
  249. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  250. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
  251. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  252. package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
  253. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  254. package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
  255. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  256. package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
  257. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  258. package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
  259. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  260. package/dist/Testing/components/testing-explorer.component.js +587 -608
  261. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  262. package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
  263. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  264. package/dist/Testing/components/testing-review-resource.component.js +9 -12
  265. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  266. package/dist/Testing/components/testing-review.component.d.ts +3 -1
  267. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  268. package/dist/Testing/components/testing-review.component.js +310 -274
  269. package/dist/Testing/components/testing-review.component.js.map +1 -1
  270. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  271. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  272. package/dist/Testing/components/testing-runs-resource.component.js +16 -19
  273. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  274. package/dist/Testing/components/testing-runs.component.d.ts +3 -1
  275. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  276. package/dist/Testing/components/testing-runs.component.js +307 -273
  277. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  278. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  279. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  280. package/dist/Testing/testing-dashboard.component.js +107 -93
  281. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  282. package/dist/VersionHistory/components/diff-resource.component.js +185 -188
  283. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  284. package/dist/VersionHistory/components/graph-resource.component.js +154 -184
  285. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  286. package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
  287. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  288. package/dist/VersionHistory/components/labels-resource.component.js +350 -354
  289. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  290. package/dist/VersionHistory/components/restore-resource.component.js +163 -169
  291. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  292. package/dist/actions-dashboards.module.d.ts +15 -16
  293. package/dist/actions-dashboards.module.d.ts.map +1 -1
  294. package/dist/actions-dashboards.module.js +34 -11
  295. package/dist/actions-dashboards.module.js.map +1 -1
  296. package/dist/ai-dashboards.module.d.ts +45 -48
  297. package/dist/ai-dashboards.module.d.ts.map +1 -1
  298. package/dist/ai-dashboards.module.js +36 -10
  299. package/dist/ai-dashboards.module.js.map +1 -1
  300. package/dist/archiving-dashboards.module.d.ts +2 -1
  301. package/dist/archiving-dashboards.module.d.ts.map +1 -1
  302. package/dist/archiving-dashboards.module.js +12 -2
  303. package/dist/archiving-dashboards.module.js.map +1 -1
  304. package/dist/communication-dashboards.module.d.ts +2 -1
  305. package/dist/communication-dashboards.module.d.ts.map +1 -1
  306. package/dist/communication-dashboards.module.js +24 -3
  307. package/dist/communication-dashboards.module.js.map +1 -1
  308. package/dist/core-dashboards.module.d.ts +1 -1
  309. package/dist/core-dashboards.module.d.ts.map +1 -1
  310. package/dist/core-dashboards.module.js +31 -1
  311. package/dist/core-dashboards.module.js.map +1 -1
  312. package/dist/credentials-dashboards.module.d.ts +1 -1
  313. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  314. package/dist/credentials-dashboards.module.js +28 -1
  315. package/dist/credentials-dashboards.module.js.map +1 -1
  316. package/dist/lists-dashboards.module.d.ts +1 -1
  317. package/dist/lists-dashboards.module.d.ts.map +1 -1
  318. package/dist/lists-dashboards.module.js +28 -1
  319. package/dist/lists-dashboards.module.js.map +1 -1
  320. package/dist/public-api.d.ts +2 -2
  321. package/dist/public-api.d.ts.map +1 -1
  322. package/dist/public-api.js +3 -3
  323. package/dist/public-api.js.map +1 -1
  324. package/dist/scheduling-dashboards.module.d.ts +1 -1
  325. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  326. package/dist/scheduling-dashboards.module.js +31 -1
  327. package/dist/scheduling-dashboards.module.js.map +1 -1
  328. package/dist/testing-dashboards.module.d.ts +8 -7
  329. package/dist/testing-dashboards.module.d.ts.map +1 -1
  330. package/dist/testing-dashboards.module.js +30 -0
  331. package/dist/testing-dashboards.module.js.map +1 -1
  332. package/package.json +52 -52
  333. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
  334. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
  335. package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
  336. package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
  337. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
  338. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
  339. package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
  340. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
  341. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
  342. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
  343. package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
  344. package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
  345. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
  346. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
  347. package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
  348. package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
@@ -10,43 +10,53 @@ import { RunView } from '@memberjunction/core';
10
10
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
11
11
  import { IntegrationDataService, ResolveIntegrationIcon } from '../../services/integration-data.service';
12
12
  import * as i0 from "@angular/core";
13
- import * as i1 from "@memberjunction/ng-shared-generic";
14
- import * as i2 from "@angular/common";
13
+ import * as i1 from "@memberjunction/ng-ui-components";
14
+ import * as i2 from "@memberjunction/ng-shared-generic";
15
+ import * as i3 from "@angular/common";
15
16
  const _forTrack0 = ($index, $item) => $item.Integration.ID;
16
17
  const _forTrack1 = ($index, $item) => $item.ID;
17
18
  const _forTrack2 = ($index, $item) => $item.Date;
18
19
  const _forTrack3 = ($index, $item) => $item.RunID;
19
- function OverviewComponent_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
20
- i0.ɵɵelement(0, "i", 5);
20
+ function OverviewComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelementStart(0, "div", 1);
22
+ i0.ɵɵelement(1, "mj-stat-badge", 8);
23
+ i0.ɵɵelementEnd();
24
+ } if (rf & 2) {
25
+ const ctx_r0 = i0.ɵɵnextContext();
26
+ i0.ɵɵadvance();
27
+ i0.ɵɵproperty("Count", ctx_r0.KPIs.TotalIntegrations);
21
28
  } }
22
- function OverviewComponent_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
23
- i0.ɵɵelement(0, "i", 6);
29
+ function OverviewComponent_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelement(0, "i", 10);
24
31
  } }
25
- function OverviewComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
26
- const _r1 = i0.ɵɵgetCurrentView();
27
- i0.ɵɵelementStart(0, "div", 4);
28
- i0.ɵɵconditionalCreate(1, OverviewComponent_Conditional_1_Conditional_1_Template, 1, 0, "i", 5)(2, OverviewComponent_Conditional_1_Conditional_2_Template, 1, 0, "i", 6);
29
- i0.ɵɵelementStart(3, "span", 7);
32
+ function OverviewComponent_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelement(0, "i", 11);
34
+ } }
35
+ function OverviewComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
36
+ const _r2 = i0.ɵɵgetCurrentView();
37
+ i0.ɵɵelementStart(0, "div", 9);
38
+ i0.ɵɵconditionalCreate(1, OverviewComponent_Conditional_7_Conditional_1_Template, 1, 0, "i", 10)(2, OverviewComponent_Conditional_7_Conditional_2_Template, 1, 0, "i", 11);
39
+ i0.ɵɵelementStart(3, "span", 12);
30
40
  i0.ɵɵtext(4);
31
41
  i0.ɵɵelementEnd();
32
- i0.ɵɵelementStart(5, "button", 8);
33
- i0.ɵɵlistener("click", function OverviewComponent_Conditional_1_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.DismissNotification()); });
34
- i0.ɵɵelement(6, "i", 9);
42
+ i0.ɵɵelementStart(5, "button", 13);
43
+ i0.ɵɵlistener("click", function OverviewComponent_Conditional_7_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.DismissNotification()); });
44
+ i0.ɵɵelement(6, "i", 14);
35
45
  i0.ɵɵelementEnd()();
36
46
  } if (rf & 2) {
37
- const ctx_r1 = i0.ɵɵnextContext();
38
- i0.ɵɵclassProp("notification-success", ctx_r1.Notification.Type === "success")("notification-error", ctx_r1.Notification.Type === "error");
47
+ const ctx_r0 = i0.ɵɵnextContext();
48
+ i0.ɵɵclassProp("notification-success", ctx_r0.Notification.Type === "success")("notification-error", ctx_r0.Notification.Type === "error");
39
49
  i0.ɵɵadvance();
40
- i0.ɵɵconditional(ctx_r1.Notification.Type === "success" ? 1 : 2);
50
+ i0.ɵɵconditional(ctx_r0.Notification.Type === "success" ? 1 : 2);
41
51
  i0.ɵɵadvance(3);
42
- i0.ɵɵtextInterpolate(ctx_r1.Notification.Message);
52
+ i0.ɵɵtextInterpolate(ctx_r0.Notification.Message);
43
53
  } }
44
- function OverviewComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
45
- i0.ɵɵelement(0, "mj-loading", 2);
54
+ function OverviewComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
55
+ i0.ɵɵelement(0, "mj-loading", 6);
46
56
  } }
47
- function OverviewComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
48
- i0.ɵɵelementStart(0, "div", 3);
49
- i0.ɵɵelement(1, "i", 10);
57
+ function OverviewComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
58
+ i0.ɵɵelementStart(0, "div", 7);
59
+ i0.ɵɵelement(1, "i", 15);
50
60
  i0.ɵɵelementStart(2, "h3");
51
61
  i0.ɵɵtext(3, "No Integrations Configured");
52
62
  i0.ɵɵelementEnd();
@@ -54,128 +64,128 @@ function OverviewComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
54
64
  i0.ɵɵtext(5, "Set up your first integration using the Connection Studio to start syncing data.");
55
65
  i0.ɵɵelementEnd()();
56
66
  } }
57
- function OverviewComponent_Conditional_4_Conditional_30_Template(rf, ctx) { if (rf & 1) {
58
- i0.ɵɵelement(0, "span", 26);
67
+ function OverviewComponent_Conditional_10_Conditional_30_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelement(0, "span", 31);
59
69
  } }
60
- function OverviewComponent_Conditional_4_For_53_Conditional_11_Template(rf, ctx) { if (rf & 1) {
61
- i0.ɵɵelement(0, "span", 51);
70
+ function OverviewComponent_Conditional_10_For_53_Conditional_11_Template(rf, ctx) { if (rf & 1) {
71
+ i0.ɵɵelement(0, "span", 56);
62
72
  } }
63
- function OverviewComponent_Conditional_4_For_53_For_48_Template(rf, ctx) { if (rf & 1) {
64
- i0.ɵɵelement(0, "span", 50);
73
+ function OverviewComponent_Conditional_10_For_53_For_48_Template(rf, ctx) { if (rf & 1) {
74
+ i0.ɵɵelement(0, "span", 55);
65
75
  } if (rf & 2) {
66
76
  const run_r4 = ctx.$implicit;
67
- const ctx_r1 = i0.ɵɵnextContext(3);
68
- i0.ɵɵclassMap(ctx_r1.GetSparklineDotClass(run_r4));
77
+ const ctx_r0 = i0.ɵɵnextContext(3);
78
+ i0.ɵɵclassMap(ctx_r0.GetSparklineDotClass(run_r4));
69
79
  i0.ɵɵproperty("title", run_r4.Status + " - " + (run_r4.StartedAt ?? "N/A"));
70
80
  } }
71
- function OverviewComponent_Conditional_4_For_53_Conditional_49_Template(rf, ctx) { if (rf & 1) {
72
- i0.ɵɵelementStart(0, "span", 67);
81
+ function OverviewComponent_Conditional_10_For_53_Conditional_49_Template(rf, ctx) { if (rf & 1) {
82
+ i0.ɵɵelementStart(0, "span", 72);
73
83
  i0.ɵɵtext(1, "No runs");
74
84
  i0.ɵɵelementEnd();
75
85
  } }
76
- function OverviewComponent_Conditional_4_For_53_Conditional_51_Template(rf, ctx) { if (rf & 1) {
77
- i0.ɵɵelementStart(0, "button", 69);
78
- i0.ɵɵelement(1, "i", 71);
86
+ function OverviewComponent_Conditional_10_For_53_Conditional_51_Template(rf, ctx) { if (rf & 1) {
87
+ i0.ɵɵelementStart(0, "button", 74);
88
+ i0.ɵɵelement(1, "i", 76);
79
89
  i0.ɵɵtext(2, " Running... ");
80
90
  i0.ɵɵelementEnd();
81
91
  } }
82
- function OverviewComponent_Conditional_4_For_53_Conditional_52_Template(rf, ctx) { if (rf & 1) {
92
+ function OverviewComponent_Conditional_10_For_53_Conditional_52_Template(rf, ctx) { if (rf & 1) {
83
93
  const _r5 = i0.ɵɵgetCurrentView();
84
- i0.ɵɵelementStart(0, "button", 72);
85
- i0.ɵɵlistener("click", function OverviewComponent_Conditional_4_For_53_Conditional_52_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const summary_r6 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.RunSync(summary_r6.Integration.ID)); });
86
- i0.ɵɵelement(1, "i", 73);
94
+ i0.ɵɵelementStart(0, "button", 77);
95
+ i0.ɵɵlistener("click", function OverviewComponent_Conditional_10_For_53_Conditional_52_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const summary_r6 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.RunSync(summary_r6.Integration.ID)); });
96
+ i0.ɵɵelement(1, "i", 78);
87
97
  i0.ɵɵtext(2, " Sync Now ");
88
98
  i0.ɵɵelementEnd();
89
99
  } if (rf & 2) {
90
100
  const summary_r6 = i0.ɵɵnextContext().$implicit;
91
- const ctx_r1 = i0.ɵɵnextContext(2);
92
- i0.ɵɵproperty("disabled", !summary_r6.Integration.IsActive || ctx_r1.RunningIntegrationID !== null);
101
+ const ctx_r0 = i0.ɵɵnextContext(2);
102
+ i0.ɵɵproperty("disabled", !summary_r6.Integration.IsActive || ctx_r0.RunningIntegrationID !== null);
93
103
  } }
94
- function OverviewComponent_Conditional_4_For_53_Template(rf, ctx) { if (rf & 1) {
95
- i0.ɵɵelementStart(0, "div")(1, "div", 44)(2, "div", 45)(3, "div", 46);
104
+ function OverviewComponent_Conditional_10_For_53_Template(rf, ctx) { if (rf & 1) {
105
+ i0.ɵɵelementStart(0, "div")(1, "div", 49)(2, "div", 50)(3, "div", 51);
96
106
  i0.ɵɵelement(4, "i");
97
107
  i0.ɵɵelementEnd();
98
- i0.ɵɵelementStart(5, "div", 47)(6, "span", 48);
108
+ i0.ɵɵelementStart(5, "div", 52)(6, "span", 53);
99
109
  i0.ɵɵtext(7);
100
110
  i0.ɵɵelementEnd();
101
- i0.ɵɵelementStart(8, "span", 49);
111
+ i0.ɵɵelementStart(8, "span", 54);
102
112
  i0.ɵɵtext(9);
103
113
  i0.ɵɵelementEnd()()();
104
- i0.ɵɵelementStart(10, "div", 50);
105
- i0.ɵɵconditionalCreate(11, OverviewComponent_Conditional_4_For_53_Conditional_11_Template, 1, 0, "span", 51);
114
+ i0.ɵɵelementStart(10, "div", 55);
115
+ i0.ɵɵconditionalCreate(11, OverviewComponent_Conditional_10_For_53_Conditional_11_Template, 1, 0, "span", 56);
106
116
  i0.ɵɵelementEnd()();
107
- i0.ɵɵelementStart(12, "div", 52)(13, "div", 53);
117
+ i0.ɵɵelementStart(12, "div", 57)(13, "div", 58);
108
118
  i0.ɵɵelement(14, "i");
109
119
  i0.ɵɵelementEnd();
110
- i0.ɵɵelementStart(15, "div", 54);
111
- i0.ɵɵelement(16, "div", 55);
112
- i0.ɵɵelementStart(17, "span", 56);
120
+ i0.ɵɵelementStart(15, "div", 59);
121
+ i0.ɵɵelement(16, "div", 60);
122
+ i0.ɵɵelementStart(17, "span", 61);
113
123
  i0.ɵɵtext(18);
114
124
  i0.ɵɵelementEnd();
115
- i0.ɵɵelement(19, "div", 55);
125
+ i0.ɵɵelement(19, "div", 60);
116
126
  i0.ɵɵelementEnd();
117
- i0.ɵɵelementStart(20, "div", 57);
118
- i0.ɵɵelement(21, "i", 58);
127
+ i0.ɵɵelementStart(20, "div", 62);
128
+ i0.ɵɵelement(21, "i", 63);
119
129
  i0.ɵɵelementEnd()();
120
- i0.ɵɵelementStart(22, "div", 59)(23, "div", 60)(24, "span", 61);
130
+ i0.ɵɵelementStart(22, "div", 64)(23, "div", 65)(24, "span", 66);
121
131
  i0.ɵɵtext(25, "Last sync");
122
132
  i0.ɵɵelementEnd();
123
- i0.ɵɵelementStart(26, "span", 62);
133
+ i0.ɵɵelementStart(26, "span", 67);
124
134
  i0.ɵɵtext(27);
125
135
  i0.ɵɵelementEnd()();
126
- i0.ɵɵelementStart(28, "div", 60)(29, "span", 61);
136
+ i0.ɵɵelementStart(28, "div", 65)(29, "span", 66);
127
137
  i0.ɵɵtext(30, "Records");
128
138
  i0.ɵɵelementEnd();
129
- i0.ɵɵelementStart(31, "span", 62);
139
+ i0.ɵɵelementStart(31, "span", 67);
130
140
  i0.ɵɵtext(32);
131
141
  i0.ɵɵelementEnd()();
132
- i0.ɵɵelementStart(33, "div", 60)(34, "span", 61);
142
+ i0.ɵɵelementStart(33, "div", 65)(34, "span", 66);
133
143
  i0.ɵɵtext(35, "Duration");
134
144
  i0.ɵɵelementEnd();
135
- i0.ɵɵelementStart(36, "span", 62);
145
+ i0.ɵɵelementStart(36, "span", 67);
136
146
  i0.ɵɵtext(37);
137
147
  i0.ɵɵelementEnd()();
138
- i0.ɵɵelementStart(38, "div", 60)(39, "span", 61);
148
+ i0.ɵɵelementStart(38, "div", 65)(39, "span", 66);
139
149
  i0.ɵɵtext(40, "Errors");
140
150
  i0.ɵɵelementEnd();
141
- i0.ɵɵelementStart(41, "span", 62);
151
+ i0.ɵɵelementStart(41, "span", 67);
142
152
  i0.ɵɵtext(42);
143
153
  i0.ɵɵelementEnd()()();
144
- i0.ɵɵelementStart(43, "div", 63)(44, "span", 64);
154
+ i0.ɵɵelementStart(43, "div", 68)(44, "span", 69);
145
155
  i0.ɵɵtext(45, "Recent runs");
146
156
  i0.ɵɵelementEnd();
147
- i0.ɵɵelementStart(46, "div", 65);
148
- i0.ɵɵrepeaterCreate(47, OverviewComponent_Conditional_4_For_53_For_48_Template, 1, 3, "span", 66, _forTrack1);
149
- i0.ɵɵconditionalCreate(49, OverviewComponent_Conditional_4_For_53_Conditional_49_Template, 2, 0, "span", 67);
157
+ i0.ɵɵelementStart(46, "div", 70);
158
+ i0.ɵɵrepeaterCreate(47, OverviewComponent_Conditional_10_For_53_For_48_Template, 1, 3, "span", 71, _forTrack1);
159
+ i0.ɵɵconditionalCreate(49, OverviewComponent_Conditional_10_For_53_Conditional_49_Template, 2, 0, "span", 72);
150
160
  i0.ɵɵelementEnd()();
151
- i0.ɵɵelementStart(50, "div", 68);
152
- i0.ɵɵconditionalCreate(51, OverviewComponent_Conditional_4_For_53_Conditional_51_Template, 3, 0, "button", 69)(52, OverviewComponent_Conditional_4_For_53_Conditional_52_Template, 3, 1, "button", 70);
161
+ i0.ɵɵelementStart(50, "div", 73);
162
+ i0.ɵɵconditionalCreate(51, OverviewComponent_Conditional_10_For_53_Conditional_51_Template, 3, 0, "button", 74)(52, OverviewComponent_Conditional_10_For_53_Conditional_52_Template, 3, 1, "button", 75);
153
163
  i0.ɵɵelementEnd()();
154
164
  } if (rf & 2) {
155
165
  const summary_r6 = ctx.$implicit;
156
- const ctx_r1 = i0.ɵɵnextContext(2);
157
- i0.ɵɵclassMap(ctx_r1.GetCardBorderClass(summary_r6.StatusColor));
166
+ const ctx_r0 = i0.ɵɵnextContext(2);
167
+ i0.ɵɵclassMap(ctx_r0.GetCardBorderClass(summary_r6.StatusColor));
158
168
  i0.ɵɵadvance(4);
159
- i0.ɵɵclassMap(ctx_r1.GetIntegrationIcon(summary_r6));
169
+ i0.ɵɵclassMap(ctx_r0.GetIntegrationIcon(summary_r6));
160
170
  i0.ɵɵadvance(3);
161
171
  i0.ɵɵtextInterpolate(summary_r6.Integration.Name);
162
172
  i0.ɵɵadvance(2);
163
173
  i0.ɵɵtextInterpolate((summary_r6.SourceType == null ? null : summary_r6.SourceType.Name) ?? "Custom");
164
174
  i0.ɵɵadvance();
165
- i0.ɵɵclassMap(ctx_r1.GetStatusDotClass(summary_r6.StatusColor));
166
- i0.ɵɵproperty("title", ctx_r1.GetStatusLabel(summary_r6.StatusColor));
175
+ i0.ɵɵclassMap(ctx_r0.GetStatusDotClass(summary_r6.StatusColor));
176
+ i0.ɵɵproperty("title", ctx_r0.GetStatusLabel(summary_r6.StatusColor));
167
177
  i0.ɵɵadvance();
168
178
  i0.ɵɵconditional((summary_r6.LatestRun == null ? null : summary_r6.LatestRun.Status) === "In Progress" ? 11 : -1);
169
179
  i0.ɵɵadvance(3);
170
- i0.ɵɵclassMap(ctx_r1.GetIntegrationIcon(summary_r6));
180
+ i0.ɵɵclassMap(ctx_r0.GetIntegrationIcon(summary_r6));
171
181
  i0.ɵɵadvance(4);
172
- i0.ɵɵtextInterpolate1("", ctx_r1.GetEntityMapCount(summary_r6.Integration.ID), " maps");
182
+ i0.ɵɵtextInterpolate1("", ctx_r0.GetEntityMapCount(summary_r6.Integration.ID), " maps");
173
183
  i0.ɵɵadvance(9);
174
184
  i0.ɵɵtextInterpolate(summary_r6.RelativeTime);
175
185
  i0.ɵɵadvance(5);
176
- i0.ɵɵtextInterpolate(ctx_r1.FormatNumber((summary_r6.LatestRun == null ? null : summary_r6.LatestRun.TotalRecords) ?? 0));
186
+ i0.ɵɵtextInterpolate(ctx_r0.FormatNumber((summary_r6.LatestRun == null ? null : summary_r6.LatestRun.TotalRecords) ?? 0));
177
187
  i0.ɵɵadvance(5);
178
- i0.ɵɵtextInterpolate(ctx_r1.FormatDuration(summary_r6.DurationMs));
188
+ i0.ɵɵtextInterpolate(ctx_r0.FormatDuration(summary_r6.DurationMs));
179
189
  i0.ɵɵadvance(4);
180
190
  i0.ɵɵclassProp("stat-error", summary_r6.TotalErrors > 0);
181
191
  i0.ɵɵadvance();
@@ -185,63 +195,63 @@ function OverviewComponent_Conditional_4_For_53_Template(rf, ctx) { if (rf & 1)
185
195
  i0.ɵɵadvance(2);
186
196
  i0.ɵɵconditional(summary_r6.RecentRuns.length === 0 ? 49 : -1);
187
197
  i0.ɵɵadvance(2);
188
- i0.ɵɵconditional(ctx_r1.IsRunning(summary_r6.Integration.ID) ? 51 : 52);
198
+ i0.ɵɵconditional(ctx_r0.IsRunning(summary_r6.Integration.ID) ? 51 : 52);
189
199
  } }
190
- function OverviewComponent_Conditional_4_Conditional_59_Template(rf, ctx) { if (rf & 1) {
191
- i0.ɵɵelementStart(0, "p", 39);
200
+ function OverviewComponent_Conditional_10_Conditional_59_Template(rf, ctx) { if (rf & 1) {
201
+ i0.ɵɵelementStart(0, "p", 44);
192
202
  i0.ɵɵtext(1, "No data available.");
193
203
  i0.ɵɵelementEnd();
194
204
  } }
195
- function OverviewComponent_Conditional_4_Conditional_60_For_2_Template(rf, ctx) { if (rf & 1) {
196
- i0.ɵɵelementStart(0, "div", 74)(1, "div", 75);
205
+ function OverviewComponent_Conditional_10_Conditional_60_For_2_Template(rf, ctx) { if (rf & 1) {
206
+ i0.ɵɵelementStart(0, "div", 79)(1, "div", 80);
197
207
  i0.ɵɵtext(2);
198
208
  i0.ɵɵelementEnd();
199
- i0.ɵɵelement(3, "div", 76);
200
- i0.ɵɵelementStart(4, "div", 77);
209
+ i0.ɵɵelement(3, "div", 81);
210
+ i0.ɵɵelementStart(4, "div", 82);
201
211
  i0.ɵɵtext(5);
202
212
  i0.ɵɵelementEnd()();
203
213
  } if (rf & 2) {
204
214
  const day_r7 = ctx.$implicit;
205
- const ctx_r1 = i0.ɵɵnextContext(3);
215
+ const ctx_r0 = i0.ɵɵnextContext(3);
206
216
  i0.ɵɵadvance(2);
207
- i0.ɵɵtextInterpolate(ctx_r1.FormatNumber(day_r7.Records));
217
+ i0.ɵɵtextInterpolate(ctx_r0.FormatNumber(day_r7.Records));
208
218
  i0.ɵɵadvance();
209
- i0.ɵɵstyleProp("height", ctx_r1.BarHeight(day_r7.Records), "%");
219
+ i0.ɵɵstyleProp("height", ctx_r0.BarHeight(day_r7.Records), "%");
210
220
  i0.ɵɵadvance(2);
211
221
  i0.ɵɵtextInterpolate(day_r7.Label);
212
222
  } }
213
- function OverviewComponent_Conditional_4_Conditional_60_Template(rf, ctx) { if (rf & 1) {
214
- i0.ɵɵelementStart(0, "div", 40);
215
- i0.ɵɵrepeaterCreate(1, OverviewComponent_Conditional_4_Conditional_60_For_2_Template, 6, 4, "div", 74, _forTrack2);
223
+ function OverviewComponent_Conditional_10_Conditional_60_Template(rf, ctx) { if (rf & 1) {
224
+ i0.ɵɵelementStart(0, "div", 45);
225
+ i0.ɵɵrepeaterCreate(1, OverviewComponent_Conditional_10_Conditional_60_For_2_Template, 6, 4, "div", 79, _forTrack2);
216
226
  i0.ɵɵelementEnd();
217
227
  } if (rf & 2) {
218
- const ctx_r1 = i0.ɵɵnextContext(2);
228
+ const ctx_r0 = i0.ɵɵnextContext(2);
219
229
  i0.ɵɵadvance();
220
- i0.ɵɵrepeater(ctx_r1.DailyCounts);
230
+ i0.ɵɵrepeater(ctx_r0.DailyCounts);
221
231
  } }
222
- function OverviewComponent_Conditional_4_Conditional_65_Template(rf, ctx) { if (rf & 1) {
223
- i0.ɵɵelementStart(0, "p", 39);
232
+ function OverviewComponent_Conditional_10_Conditional_65_Template(rf, ctx) { if (rf & 1) {
233
+ i0.ɵɵelementStart(0, "p", 44);
224
234
  i0.ɵɵtext(1, "No recent activity.");
225
235
  i0.ɵɵelementEnd();
226
236
  } }
227
- function OverviewComponent_Conditional_4_Conditional_66_For_2_Template(rf, ctx) { if (rf & 1) {
228
- i0.ɵɵelementStart(0, "div", 78);
237
+ function OverviewComponent_Conditional_10_Conditional_66_For_2_Template(rf, ctx) { if (rf & 1) {
238
+ i0.ɵɵelementStart(0, "div", 83);
229
239
  i0.ɵɵelement(1, "i");
230
- i0.ɵɵelementStart(2, "div", 79)(3, "span", 80);
240
+ i0.ɵɵelementStart(2, "div", 84)(3, "span", 85);
231
241
  i0.ɵɵtext(4);
232
242
  i0.ɵɵelementEnd();
233
- i0.ɵɵelementStart(5, "span", 81);
243
+ i0.ɵɵelementStart(5, "span", 86);
234
244
  i0.ɵɵtext(6);
235
245
  i0.ɵɵpipe(7, "number");
236
246
  i0.ɵɵelementEnd()();
237
- i0.ɵɵelementStart(8, "span", 82);
247
+ i0.ɵɵelementStart(8, "span", 87);
238
248
  i0.ɵɵtext(9);
239
249
  i0.ɵɵelementEnd()();
240
250
  } if (rf & 2) {
241
251
  const item_r8 = ctx.$implicit;
242
- const ctx_r1 = i0.ɵɵnextContext(3);
252
+ const ctx_r0 = i0.ɵɵnextContext(3);
243
253
  i0.ɵɵadvance();
244
- i0.ɵɵclassMap(ctx_r1.ActivityStatusIcon(item_r8.Status));
254
+ i0.ɵɵclassMap(ctx_r0.ActivityStatusIcon(item_r8.Status));
245
255
  i0.ɵɵclassProp("feed-icon-green", item_r8.StatusColor === "green")("feed-icon-red", item_r8.StatusColor === "red")("feed-icon-amber", item_r8.StatusColor === "amber");
246
256
  i0.ɵɵadvance(3);
247
257
  i0.ɵɵtextInterpolate(item_r8.IntegrationName);
@@ -252,111 +262,111 @@ function OverviewComponent_Conditional_4_Conditional_66_For_2_Template(rf, ctx)
252
262
  i0.ɵɵadvance();
253
263
  i0.ɵɵtextInterpolate1(" ", item_r8.Status, " ");
254
264
  } }
255
- function OverviewComponent_Conditional_4_Conditional_66_Template(rf, ctx) { if (rf & 1) {
256
- i0.ɵɵelementStart(0, "div", 43);
257
- i0.ɵɵrepeaterCreate(1, OverviewComponent_Conditional_4_Conditional_66_For_2_Template, 10, 16, "div", 78, _forTrack3);
265
+ function OverviewComponent_Conditional_10_Conditional_66_Template(rf, ctx) { if (rf & 1) {
266
+ i0.ɵɵelementStart(0, "div", 48);
267
+ i0.ɵɵrepeaterCreate(1, OverviewComponent_Conditional_10_Conditional_66_For_2_Template, 10, 16, "div", 83, _forTrack3);
258
268
  i0.ɵɵelementEnd();
259
269
  } if (rf & 2) {
260
- const ctx_r1 = i0.ɵɵnextContext(2);
270
+ const ctx_r0 = i0.ɵɵnextContext(2);
261
271
  i0.ɵɵadvance();
262
- i0.ɵɵrepeater(ctx_r1.ActivityFeed);
272
+ i0.ɵɵrepeater(ctx_r0.ActivityFeed);
263
273
  } }
264
- function OverviewComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
274
+ function OverviewComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
265
275
  const _r3 = i0.ɵɵgetCurrentView();
266
- i0.ɵɵelementStart(0, "div", 11)(1, "div", 12)(2, "div", 13);
267
- i0.ɵɵelement(3, "i", 14);
276
+ i0.ɵɵelementStart(0, "div", 16)(1, "div", 17)(2, "div", 18);
277
+ i0.ɵɵelement(3, "i", 19);
268
278
  i0.ɵɵelementEnd();
269
- i0.ɵɵelementStart(4, "div", 15)(5, "span", 16);
279
+ i0.ɵɵelementStart(4, "div", 20)(5, "span", 21);
270
280
  i0.ɵɵtext(6);
271
281
  i0.ɵɵelementEnd();
272
- i0.ɵɵelementStart(7, "span", 17);
282
+ i0.ɵɵelementStart(7, "span", 22);
273
283
  i0.ɵɵtext(8, "Total Pipelines");
274
284
  i0.ɵɵelementEnd()()();
275
- i0.ɵɵelementStart(9, "div", 12)(10, "div", 18);
276
- i0.ɵɵelement(11, "i", 19);
285
+ i0.ɵɵelementStart(9, "div", 17)(10, "div", 23);
286
+ i0.ɵɵelement(11, "i", 24);
277
287
  i0.ɵɵelementEnd();
278
- i0.ɵɵelementStart(12, "div", 15)(13, "span", 16);
288
+ i0.ɵɵelementStart(12, "div", 20)(13, "span", 21);
279
289
  i0.ɵɵtext(14);
280
290
  i0.ɵɵelementEnd();
281
- i0.ɵɵelementStart(15, "span", 17);
291
+ i0.ɵɵelementStart(15, "span", 22);
282
292
  i0.ɵɵtext(16, "Records Today");
283
293
  i0.ɵɵelementEnd()()();
284
- i0.ɵɵelementStart(17, "div", 12)(18, "div", 20)(19, "div", 21)(20, "span", 22);
294
+ i0.ɵɵelementStart(17, "div", 17)(18, "div", 25)(19, "div", 26)(20, "span", 27);
285
295
  i0.ɵɵtext(21);
286
296
  i0.ɵɵelementEnd()()();
287
- i0.ɵɵelementStart(22, "div", 15)(23, "span", 23);
297
+ i0.ɵɵelementStart(22, "div", 20)(23, "span", 28);
288
298
  i0.ɵɵtext(24);
289
299
  i0.ɵɵelementEnd();
290
- i0.ɵɵelementStart(25, "span", 17);
300
+ i0.ɵɵelementStart(25, "span", 22);
291
301
  i0.ɵɵtext(26, "Success Rate");
292
302
  i0.ɵɵelementEnd()()();
293
- i0.ɵɵelementStart(27, "div", 12)(28, "div", 24);
294
- i0.ɵɵelement(29, "i", 25);
295
- i0.ɵɵconditionalCreate(30, OverviewComponent_Conditional_4_Conditional_30_Template, 1, 0, "span", 26);
303
+ i0.ɵɵelementStart(27, "div", 17)(28, "div", 29);
304
+ i0.ɵɵelement(29, "i", 30);
305
+ i0.ɵɵconditionalCreate(30, OverviewComponent_Conditional_10_Conditional_30_Template, 1, 0, "span", 31);
296
306
  i0.ɵɵelementEnd();
297
- i0.ɵɵelementStart(31, "div", 15)(32, "span", 16);
307
+ i0.ɵɵelementStart(31, "div", 20)(32, "span", 21);
298
308
  i0.ɵɵtext(33);
299
309
  i0.ɵɵelementEnd();
300
- i0.ɵɵelementStart(34, "span", 17);
310
+ i0.ɵɵelementStart(34, "span", 22);
301
311
  i0.ɵɵtext(35, "Active Now");
302
312
  i0.ɵɵelementEnd()()();
303
- i0.ɵɵelementStart(36, "div", 12)(37, "div", 27);
304
- i0.ɵɵelement(38, "i", 28);
313
+ i0.ɵɵelementStart(36, "div", 17)(37, "div", 32);
314
+ i0.ɵɵelement(38, "i", 33);
305
315
  i0.ɵɵelementEnd();
306
- i0.ɵɵelementStart(39, "div", 15)(40, "span", 16);
316
+ i0.ɵɵelementStart(39, "div", 20)(40, "span", 21);
307
317
  i0.ɵɵtext(41);
308
318
  i0.ɵɵelementEnd();
309
- i0.ɵɵelementStart(42, "span", 17);
319
+ i0.ɵɵelementStart(42, "span", 22);
310
320
  i0.ɵɵtext(43, "Avg Duration");
311
321
  i0.ɵɵelementEnd()()()();
312
- i0.ɵɵelementStart(44, "div", 29)(45, "h3");
313
- i0.ɵɵelement(46, "i", 30);
322
+ i0.ɵɵelementStart(44, "div", 34)(45, "h3");
323
+ i0.ɵɵelement(46, "i", 35);
314
324
  i0.ɵɵtext(47, " Pipeline Health");
315
325
  i0.ɵɵelementEnd();
316
- i0.ɵɵelementStart(48, "button", 31);
317
- i0.ɵɵlistener("click", function OverviewComponent_Conditional_4_Template_button_click_48_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Refresh()); });
318
- i0.ɵɵelement(49, "i", 32);
326
+ i0.ɵɵelementStart(48, "button", 36);
327
+ i0.ɵɵlistener("click", function OverviewComponent_Conditional_10_Template_button_click_48_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.Refresh()); });
328
+ i0.ɵɵelement(49, "i", 37);
319
329
  i0.ɵɵtext(50, " Refresh ");
320
330
  i0.ɵɵelementEnd()();
321
- i0.ɵɵelementStart(51, "div", 33);
322
- i0.ɵɵrepeaterCreate(52, OverviewComponent_Conditional_4_For_53_Template, 53, 21, "div", 34, _forTrack0);
331
+ i0.ɵɵelementStart(51, "div", 38);
332
+ i0.ɵɵrepeaterCreate(52, OverviewComponent_Conditional_10_For_53_Template, 53, 21, "div", 39, _forTrack0);
323
333
  i0.ɵɵelementEnd();
324
- i0.ɵɵelementStart(54, "div", 35)(55, "div", 36)(56, "h3", 37);
325
- i0.ɵɵelement(57, "i", 38);
334
+ i0.ɵɵelementStart(54, "div", 40)(55, "div", 41)(56, "h3", 42);
335
+ i0.ɵɵelement(57, "i", 43);
326
336
  i0.ɵɵtext(58, " Records Synced (7 days)");
327
337
  i0.ɵɵelementEnd();
328
- i0.ɵɵconditionalCreate(59, OverviewComponent_Conditional_4_Conditional_59_Template, 2, 0, "p", 39)(60, OverviewComponent_Conditional_4_Conditional_60_Template, 3, 0, "div", 40);
338
+ i0.ɵɵconditionalCreate(59, OverviewComponent_Conditional_10_Conditional_59_Template, 2, 0, "p", 44)(60, OverviewComponent_Conditional_10_Conditional_60_Template, 3, 0, "div", 45);
329
339
  i0.ɵɵelementEnd();
330
- i0.ɵɵelementStart(61, "div", 41)(62, "h3", 37);
331
- i0.ɵɵelement(63, "i", 42);
340
+ i0.ɵɵelementStart(61, "div", 46)(62, "h3", 42);
341
+ i0.ɵɵelement(63, "i", 47);
332
342
  i0.ɵɵtext(64, " Recent Activity");
333
343
  i0.ɵɵelementEnd();
334
- i0.ɵɵconditionalCreate(65, OverviewComponent_Conditional_4_Conditional_65_Template, 2, 0, "p", 39)(66, OverviewComponent_Conditional_4_Conditional_66_Template, 3, 0, "div", 43);
344
+ i0.ɵɵconditionalCreate(65, OverviewComponent_Conditional_10_Conditional_65_Template, 2, 0, "p", 44)(66, OverviewComponent_Conditional_10_Conditional_66_Template, 3, 0, "div", 48);
335
345
  i0.ɵɵelementEnd()();
336
346
  } if (rf & 2) {
337
- const ctx_r1 = i0.ɵɵnextContext();
347
+ const ctx_r0 = i0.ɵɵnextContext();
338
348
  i0.ɵɵadvance(6);
339
- i0.ɵɵtextInterpolate(ctx_r1.KPIs.TotalIntegrations);
349
+ i0.ɵɵtextInterpolate(ctx_r0.KPIs.TotalIntegrations);
340
350
  i0.ɵɵadvance(8);
341
- i0.ɵɵtextInterpolate(ctx_r1.FormatNumber(ctx_r1.KPIs.RecordsSyncedToday));
351
+ i0.ɵɵtextInterpolate(ctx_r0.FormatNumber(ctx_r0.KPIs.RecordsSyncedToday));
342
352
  i0.ɵɵadvance(4);
343
- i0.ɵɵstyleProp("background", ctx_r1.SuccessRateGradient);
353
+ i0.ɵɵstyleProp("background", ctx_r0.SuccessRateGradient);
344
354
  i0.ɵɵadvance(3);
345
- i0.ɵɵtextInterpolate1("", ctx_r1.SuccessRate, "%");
355
+ i0.ɵɵtextInterpolate1("", ctx_r0.SuccessRate, "%");
346
356
  i0.ɵɵadvance(3);
347
- i0.ɵɵtextInterpolate1("", ctx_r1.SuccessRate, "%");
357
+ i0.ɵɵtextInterpolate1("", ctx_r0.SuccessRate, "%");
348
358
  i0.ɵɵadvance(6);
349
- i0.ɵɵconditional(ctx_r1.ActiveCount > 0 ? 30 : -1);
359
+ i0.ɵɵconditional(ctx_r0.ActiveCount > 0 ? 30 : -1);
350
360
  i0.ɵɵadvance(3);
351
- i0.ɵɵtextInterpolate(ctx_r1.ActiveCount);
361
+ i0.ɵɵtextInterpolate(ctx_r0.ActiveCount);
352
362
  i0.ɵɵadvance(8);
353
- i0.ɵɵtextInterpolate(ctx_r1.FormatDuration(ctx_r1.KPIs.AverageSyncDurationMs));
363
+ i0.ɵɵtextInterpolate(ctx_r0.FormatDuration(ctx_r0.KPIs.AverageSyncDurationMs));
354
364
  i0.ɵɵadvance(11);
355
- i0.ɵɵrepeater(ctx_r1.Summaries);
365
+ i0.ɵɵrepeater(ctx_r0.Summaries);
356
366
  i0.ɵɵadvance(7);
357
- i0.ɵɵconditional(ctx_r1.DailyCounts.length === 0 ? 59 : 60);
367
+ i0.ɵɵconditional(ctx_r0.DailyCounts.length === 0 ? 59 : 60);
358
368
  i0.ɵɵadvance(6);
359
- i0.ɵɵconditional(ctx_r1.ActivityFeed.length === 0 ? 65 : 66);
369
+ i0.ɵɵconditional(ctx_r0.ActivityFeed.length === 0 ? 65 : 66);
360
370
  } }
361
371
  let OverviewComponent = class OverviewComponent extends BaseResourceComponent {
362
372
  Summaries = [];
@@ -601,17 +611,26 @@ let OverviewComponent = class OverviewComponent extends BaseResourceComponent {
601
611
  }
602
612
  }
603
613
  static ɵfac = /*@__PURE__*/ (() => { let ɵOverviewComponent_BaseFactory; return function OverviewComponent_Factory(__ngFactoryType__) { return (ɵOverviewComponent_BaseFactory || (ɵOverviewComponent_BaseFactory = i0.ɵɵgetInheritedFactory(OverviewComponent)))(__ngFactoryType__ || OverviewComponent); }; })();
604
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: OverviewComponent, selectors: [["app-integration-overview"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 2, consts: [[1, "overview"], [1, "notification", 3, "notification-success", "notification-error"], ["text", "Loading integrations...", "size", "medium"], [1, "empty-state"], [1, "notification"], [1, "fa-solid", "fa-circle-check"], [1, "fa-solid", "fa-circle-xmark"], [1, "notification-message"], [1, "notification-dismiss", 3, "click"], [1, "fa-solid", "fa-times"], [1, "fa-solid", "fa-plug-circle-xmark"], [1, "metric-strip"], [1, "metric-card"], [1, "metric-icon", "metric-icon-blue"], [1, "fa-solid", "fa-diagram-project"], [1, "metric-body"], [1, "metric-value"], [1, "metric-label"], [1, "metric-icon", "metric-icon-green"], [1, "fa-solid", "fa-database"], [1, "metric-ring"], [1, "metric-ring-inner"], [1, "metric-ring-value"], [1, "metric-value", "metric-value-indigo"], [1, "metric-icon", "metric-icon-emerald"], [1, "fa-solid", "fa-bolt"], [1, "pulse-dot"], [1, "metric-icon", "metric-icon-orange"], [1, "fa-solid", "fa-clock"], [1, "section-heading"], [1, "fa-solid", "fa-heart-pulse"], [1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "pipeline-grid"], [3, "class"], [1, "bottom-split"], [1, "chart-panel"], [1, "panel-title"], [1, "fa-solid", "fa-chart-bar"], [1, "empty-hint"], [1, "bar-chart"], [1, "feed-panel"], [1, "fa-solid", "fa-stream"], [1, "feed-list"], [1, "card-header"], [1, "card-header-left"], [1, "card-icon-wrap"], [1, "card-title-wrap"], [1, "card-title"], [1, "card-subtitle"], [3, "title"], [1, "dot-pulse"], [1, "pipeline-flow"], [1, "flow-node"], [1, "flow-arrow"], [1, "flow-line"], [1, "flow-count"], [1, "flow-node", "flow-node-mj"], [1, "fa-solid", "fa-layer-group"], [1, "card-stats"], [1, "stat-item"], [1, "stat-label"], [1, "stat-value"], [1, "sparkline-row"], [1, "sparkline-label"], [1, "sparkline-dots"], [3, "class", "title"], [1, "sparkline-none"], [1, "card-footer"], ["disabled", "", 1, "btn-sync", "btn-sync-disabled"], [1, "btn-sync", 3, "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "btn-sync", 3, "click", "disabled"], [1, "fa-solid", "fa-play"], [1, "bar-column"], [1, "bar-count"], [1, "bar-fill"], [1, "bar-day"], [1, "feed-item"], [1, "feed-details"], [1, "feed-name"], [1, "feed-meta"], [1, "feed-badge"]], template: function OverviewComponent_Template(rf, ctx) { if (rf & 1) {
605
- i0.ɵɵelementStart(0, "div", 0);
606
- i0.ɵɵconditionalCreate(1, OverviewComponent_Conditional_1_Template, 7, 6, "div", 1);
607
- i0.ɵɵconditionalCreate(2, OverviewComponent_Conditional_2_Template, 1, 0, "mj-loading", 2)(3, OverviewComponent_Conditional_3_Template, 6, 0, "div", 3)(4, OverviewComponent_Conditional_4_Template, 67, 11);
608
- i0.ɵɵelementEnd();
614
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: OverviewComponent, selectors: [["app-integration-overview"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 11, vars: 4, consts: [["Title", "Integration Overview", "Icon", "fa-solid fa-gauge-high", "Subtitle", "Health, throughput, and activity across all integrations"], ["meta", ""], ["actions", ""], [3, "Clicked", "Loading"], [1, "overview"], [1, "notification", 3, "notification-success", "notification-error"], ["text", "Loading integrations...", "size", "medium"], [1, "empty-state"], ["Label", "integrations", 3, "Count"], [1, "notification"], [1, "fa-solid", "fa-circle-check"], [1, "fa-solid", "fa-circle-xmark"], [1, "notification-message"], [1, "notification-dismiss", 3, "click"], [1, "fa-solid", "fa-times"], [1, "fa-solid", "fa-plug-circle-xmark"], [1, "metric-strip"], [1, "metric-card"], [1, "metric-icon", "metric-icon-blue"], [1, "fa-solid", "fa-diagram-project"], [1, "metric-body"], [1, "metric-value"], [1, "metric-label"], [1, "metric-icon", "metric-icon-green"], [1, "fa-solid", "fa-database"], [1, "metric-ring"], [1, "metric-ring-inner"], [1, "metric-ring-value"], [1, "metric-value", "metric-value-indigo"], [1, "metric-icon", "metric-icon-emerald"], [1, "fa-solid", "fa-bolt"], [1, "pulse-dot"], [1, "metric-icon", "metric-icon-orange"], [1, "fa-solid", "fa-clock"], [1, "section-heading"], [1, "fa-solid", "fa-heart-pulse"], [1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "pipeline-grid"], [3, "class"], [1, "bottom-split"], [1, "chart-panel"], [1, "panel-title"], [1, "fa-solid", "fa-chart-bar"], [1, "empty-hint"], [1, "bar-chart"], [1, "feed-panel"], [1, "fa-solid", "fa-stream"], [1, "feed-list"], [1, "card-header"], [1, "card-header-left"], [1, "card-icon-wrap"], [1, "card-title-wrap"], [1, "card-title"], [1, "card-subtitle"], [3, "title"], [1, "dot-pulse"], [1, "pipeline-flow"], [1, "flow-node"], [1, "flow-arrow"], [1, "flow-line"], [1, "flow-count"], [1, "flow-node", "flow-node-mj"], [1, "fa-solid", "fa-layer-group"], [1, "card-stats"], [1, "stat-item"], [1, "stat-label"], [1, "stat-value"], [1, "sparkline-row"], [1, "sparkline-label"], [1, "sparkline-dots"], [3, "class", "title"], [1, "sparkline-none"], [1, "card-footer"], ["disabled", "", 1, "btn-sync", "btn-sync-disabled"], [1, "btn-sync", 3, "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "btn-sync", 3, "click", "disabled"], [1, "fa-solid", "fa-play"], [1, "bar-column"], [1, "bar-count"], [1, "bar-fill"], [1, "bar-day"], [1, "feed-item"], [1, "feed-details"], [1, "feed-name"], [1, "feed-meta"], [1, "feed-badge"]], template: function OverviewComponent_Template(rf, ctx) { if (rf & 1) {
615
+ i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0);
616
+ i0.ɵɵconditionalCreate(2, OverviewComponent_Conditional_2_Template, 2, 1, "div", 1);
617
+ i0.ɵɵelementStart(3, "div", 2)(4, "mj-refresh-button", 3);
618
+ i0.ɵɵlistener("Clicked", function OverviewComponent_Template_mj_refresh_button_Clicked_4_listener() { return ctx.Refresh(); });
619
+ i0.ɵɵelementEnd()()();
620
+ i0.ɵɵelementStart(5, "mj-page-body")(6, "div", 4);
621
+ i0.ɵɵconditionalCreate(7, OverviewComponent_Conditional_7_Template, 7, 6, "div", 5);
622
+ i0.ɵɵconditionalCreate(8, OverviewComponent_Conditional_8_Template, 1, 0, "mj-loading", 6)(9, OverviewComponent_Conditional_9_Template, 6, 0, "div", 7)(10, OverviewComponent_Conditional_10_Template, 67, 11);
623
+ i0.ɵɵelementEnd()()();
609
624
  } if (rf & 2) {
625
+ i0.ɵɵadvance(2);
626
+ i0.ɵɵconditional(ctx.Summaries.length > 0 ? 2 : -1);
627
+ i0.ɵɵadvance(2);
628
+ i0.ɵɵproperty("Loading", ctx.IsLoading);
629
+ i0.ɵɵadvance(3);
630
+ i0.ɵɵconditional(ctx.Notification ? 7 : -1);
610
631
  i0.ɵɵadvance();
611
- i0.ɵɵconditional(ctx.Notification ? 1 : -1);
612
- i0.ɵɵadvance();
613
- i0.ɵɵconditional(ctx.IsLoading ? 2 : ctx.Summaries.length === 0 ? 3 : 4);
614
- } }, dependencies: [i1.LoadingComponent, i2.DecimalPipe], styles: ["\n\n\n\n.overview[_ngcontent-%COMP%] {\n padding: 28px;\n max-width: 1440px;\n margin: 0 auto;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n\n\n\n\n.notification[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n border-radius: 10px;\n margin-bottom: 20px;\n font-size: 13px;\n font-weight: 500;\n animation: _ngcontent-%COMP%_slideDown 0.25s ease-out;\n}\n.notification[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child { font-size: 16px; }\n.notification-message[_ngcontent-%COMP%] { flex: 1; }\n.notification-success[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-color-success-800);\n border: 1px solid var(--mj-color-success-200);\n}\n.notification-error[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n border: 1px solid var(--mj-color-error-200);\n}\n.notification-dismiss[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n color: inherit;\n opacity: 0.5;\n font-size: 14px;\n padding: 4px;\n line-height: 1;\n}\n.notification-dismiss[_ngcontent-%COMP%]:hover { opacity: 1; }\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from { opacity: 0; transform: translateY(-8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 100px 20px;\n color: var(--mj-text-disabled);\n}\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 64px;\n margin-bottom: 20px;\n display: block;\n color: var(--mj-color-neutral-300);\n}\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 20px;\n color: var(--mj-text-secondary);\n}\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n margin-inline: auto;\n}\n\n\n\n\n\n.metric-strip[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(5, 1fr);\n gap: 16px;\n margin-bottom: 32px;\n}\n\n.metric-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 18px 16px;\n border-radius: 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n transition: box-shadow 0.2s, transform 0.2s;\n}\n.metric-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n transform: translateY(-1px);\n}\n\n.metric-icon[_ngcontent-%COMP%] {\n position: relative;\n width: 44px;\n height: 44px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n}\n.metric-icon-blue[_ngcontent-%COMP%] { background: var(--mj-status-info-bg); color: var(--mj-brand-primary); }\n.metric-icon-green[_ngcontent-%COMP%] { background: var(--mj-status-success-bg); color: var(--mj-color-success-600); }\n.metric-icon-emerald[_ngcontent-%COMP%] { background: var(--mj-status-success-bg); color: var(--mj-color-success-600); }\n.metric-icon-orange[_ngcontent-%COMP%] { background: var(--mj-color-warning-50); color: var(--mj-color-warning-600); }\n\n.metric-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 700;\n line-height: 1.2;\n color: var(--mj-text-primary);\n}\n.metric-value-indigo[_ngcontent-%COMP%] { color: var(--mj-color-indigo-500); }\n\n.metric-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n\n\n.metric-ring[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n.metric-ring-inner[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.metric-ring-value[_ngcontent-%COMP%] {\n font-size: 8px;\n font-weight: 700;\n color: var(--mj-color-indigo-500);\n}\n\n\n\n.pulse-dot[_ngcontent-%COMP%] {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--mj-color-success-600);\n animation: _ngcontent-%COMP%_pulse 1.5s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(1.4); }\n}\n\n\n\n\n\n.section-heading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n.section-heading[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.section-heading[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n.refresh-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, border-color 0.15s;\n}\n.refresh-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-color-info-200);\n}\n\n.pipeline-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n margin-bottom: 32px;\n}\n\n.pipeline-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n transition: box-shadow 0.2s, transform 0.2s;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n.pipeline-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1);\n transform: translateY(-2px);\n}\n\n.pipeline-card-error[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-error);\n}\n\n\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n}\n.card-header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n.card-icon-wrap[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n flex-shrink: 0;\n}\n.card-title-wrap[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.card-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.card-subtitle[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n}\n\n\n\n.status-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: 4px;\n position: relative;\n}\n.status-dot-green[_ngcontent-%COMP%] { background: var(--mj-color-success-600); }\n.status-dot-amber[_ngcontent-%COMP%] { background: var(--mj-status-warning); }\n.status-dot-red[_ngcontent-%COMP%] { background: var(--mj-status-error); }\n.status-dot-gray[_ngcontent-%COMP%] { background: var(--mj-color-neutral-300); }\n\n.dot-pulse[_ngcontent-%COMP%] {\n position: absolute;\n inset: -3px;\n border-radius: 50%;\n border: 2px solid var(--mj-status-warning);\n animation: _ngcontent-%COMP%_dotPulse 1.5s ease-in-out infinite;\n}\n@keyframes _ngcontent-%COMP%_dotPulse {\n 0%, 100% { opacity: 0.3; transform: scale(1); }\n 50% { opacity: 0; transform: scale(1.6); }\n}\n\n\n\n.pipeline-flow[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0;\n padding: 8px 0;\n}\n.flow-node[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n}\n.flow-node-mj[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n.flow-arrow[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 0;\n padding: 0 4px;\n}\n.flow-line[_ngcontent-%COMP%] {\n flex: 1;\n height: 2px;\n background: var(--mj-border-default);\n}\n.flow-count[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n padding: 2px 8px;\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-weight: 500;\n}\n\n\n\n.card-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 8px;\n}\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n}\n.stat-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-bottom: 2px;\n}\n.stat-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.stat-error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.sparkline-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.sparkline-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n white-space: nowrap;\n}\n.sparkline-dots[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n}\n.spark-dot[_ngcontent-%COMP%] {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n display: inline-block;\n}\n.spark-green[_ngcontent-%COMP%] { background: var(--mj-color-success-600); }\n.spark-red[_ngcontent-%COMP%] { background: var(--mj-status-error); }\n.spark-amber[_ngcontent-%COMP%] { background: var(--mj-status-warning); }\n.spark-gray[_ngcontent-%COMP%] { background: var(--mj-color-neutral-300); }\n.sparkline-none[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-color-neutral-300);\n font-style: italic;\n}\n\n\n\n.card-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n padding-top: 4px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.btn-sync[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n}\n.btn-sync[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-color-info-200);\n}\n.btn-sync[_ngcontent-%COMP%]:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n.btn-sync-disabled[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n border-color: var(--mj-border-default);\n}\n\n\n\n\n\n.bottom-split[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n margin: 0 0 16px 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n\n\n.chart-panel[_ngcontent-%COMP%] {\n flex: 6;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.bar-chart[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: 12px;\n height: 200px;\n padding-top: 24px;\n}\n.bar-column[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-end;\n height: 100%;\n position: relative;\n}\n.bar-count[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n}\n.bar-fill[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 40px;\n background: linear-gradient(180deg, var(--mj-brand-primary) 0%, var(--mj-color-accent-400) 100%);\n border-radius: 4px 4px 0 0;\n min-height: 2px;\n transition: height 0.3s ease;\n}\n.bar-day[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n margin-top: 6px;\n text-align: center;\n}\n\n\n\n.feed-panel[_ngcontent-%COMP%] {\n flex: 4;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n max-height: 340px;\n overflow-y: auto;\n}\n\n.feed-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.feed-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n transition: background 0.15s;\n}\n.feed-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-page);\n}\n\n.feed-icon-green[_ngcontent-%COMP%] { color: var(--mj-color-success-600); }\n.feed-icon-red[_ngcontent-%COMP%] { color: var(--mj-color-error-600); }\n.feed-icon-amber[_ngcontent-%COMP%] { color: var(--mj-color-warning-600); }\n\n.feed-details[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.feed-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.feed-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n}\n\n.feed-badge[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n text-transform: uppercase;\n white-space: nowrap;\n flex-shrink: 0;\n}\n.feed-badge-green[_ngcontent-%COMP%] { background: var(--mj-status-success-bg); color: var(--mj-color-success-800); }\n.feed-badge-amber[_ngcontent-%COMP%] { background: var(--mj-color-warning-50); color: var(--mj-color-warning-800); }\n.feed-badge-red[_ngcontent-%COMP%] { background: var(--mj-status-error-bg); color: var(--mj-status-error); }\n\n.empty-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 13px;\n font-style: italic;\n}\n\n\n\n\n\n@media (max-width: 1200px) {\n .pipeline-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n .metric-strip[_ngcontent-%COMP%] {\n grid-template-columns: repeat(3, 1fr);\n }\n}\n\n@media (max-width: 900px) {\n .pipeline-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .metric-strip[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n .bottom-split[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n .card-stats[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .overview[_ngcontent-%COMP%] {\n padding: 16px;\n }\n .metric-strip[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}"] });
632
+ i0.ɵɵconditional(ctx.IsLoading ? 8 : ctx.Summaries.length === 0 ? 9 : 10);
633
+ } }, dependencies: [i1.MJPageLayoutComponent, i1.MJPageHeaderComponent, i1.MJPageBodyComponent, i1.MJStatBadgeComponent, i1.MJRefreshButtonComponent, i2.LoadingComponent, i3.DecimalPipe], styles: ["\n\n\n\n.overview[_ngcontent-%COMP%] {\n \n\n\n max-width: 1440px;\n margin: 0 auto;\n}\n\n\n\n\n\n\n\n\n.notification[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n border-radius: 10px;\n margin-bottom: 20px;\n font-size: 13px;\n font-weight: 500;\n animation: _ngcontent-%COMP%_slideDown 0.25s ease-out;\n}\n.notification[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child { font-size: 16px; }\n.notification-message[_ngcontent-%COMP%] { flex: 1; }\n.notification-success[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-color-success-800);\n border: 1px solid var(--mj-color-success-200);\n}\n.notification-error[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n border: 1px solid var(--mj-color-error-200);\n}\n.notification-dismiss[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n color: inherit;\n opacity: 0.5;\n font-size: 14px;\n padding: 4px;\n line-height: 1;\n}\n.notification-dismiss[_ngcontent-%COMP%]:hover { opacity: 1; }\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from { opacity: 0; transform: translateY(-8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 100px 20px;\n color: var(--mj-text-disabled);\n}\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 64px;\n margin-bottom: 20px;\n display: block;\n color: var(--mj-color-neutral-300);\n}\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 20px;\n color: var(--mj-text-secondary);\n}\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n margin-inline: auto;\n}\n\n\n\n\n\n.metric-strip[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(5, 1fr);\n gap: 16px;\n margin-bottom: 32px;\n}\n\n.metric-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 18px 16px;\n border-radius: 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n transition: box-shadow 0.2s, transform 0.2s;\n}\n.metric-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n transform: translateY(-1px);\n}\n\n.metric-icon[_ngcontent-%COMP%] {\n position: relative;\n width: 44px;\n height: 44px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n}\n.metric-icon-blue[_ngcontent-%COMP%] { background: var(--mj-status-info-bg); color: var(--mj-brand-primary); }\n.metric-icon-green[_ngcontent-%COMP%] { background: var(--mj-status-success-bg); color: var(--mj-color-success-600); }\n.metric-icon-emerald[_ngcontent-%COMP%] { background: var(--mj-status-success-bg); color: var(--mj-color-success-600); }\n.metric-icon-orange[_ngcontent-%COMP%] { background: var(--mj-color-warning-50); color: var(--mj-color-warning-600); }\n\n.metric-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 700;\n line-height: 1.2;\n color: var(--mj-text-primary);\n}\n.metric-value-indigo[_ngcontent-%COMP%] { color: var(--mj-color-indigo-500); }\n\n.metric-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n\n\n.metric-ring[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n.metric-ring-inner[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.metric-ring-value[_ngcontent-%COMP%] {\n font-size: 8px;\n font-weight: 700;\n color: var(--mj-color-indigo-500);\n}\n\n\n\n.pulse-dot[_ngcontent-%COMP%] {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--mj-color-success-600);\n animation: _ngcontent-%COMP%_pulse 1.5s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(1.4); }\n}\n\n\n\n\n\n.section-heading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n.section-heading[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.section-heading[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n.refresh-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, border-color 0.15s;\n}\n.refresh-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-color-info-200);\n}\n\n.pipeline-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n margin-bottom: 32px;\n}\n\n.pipeline-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n transition: box-shadow 0.2s, transform 0.2s;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n.pipeline-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1);\n transform: translateY(-2px);\n}\n\n.pipeline-card-error[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-error);\n}\n\n\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n}\n.card-header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n.card-icon-wrap[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n flex-shrink: 0;\n}\n.card-title-wrap[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.card-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.card-subtitle[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n}\n\n\n\n.status-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: 4px;\n position: relative;\n}\n.status-dot-green[_ngcontent-%COMP%] { background: var(--mj-color-success-600); }\n.status-dot-amber[_ngcontent-%COMP%] { background: var(--mj-status-warning); }\n.status-dot-red[_ngcontent-%COMP%] { background: var(--mj-status-error); }\n.status-dot-gray[_ngcontent-%COMP%] { background: var(--mj-color-neutral-300); }\n\n.dot-pulse[_ngcontent-%COMP%] {\n position: absolute;\n inset: -3px;\n border-radius: 50%;\n border: 2px solid var(--mj-status-warning);\n animation: _ngcontent-%COMP%_dotPulse 1.5s ease-in-out infinite;\n}\n@keyframes _ngcontent-%COMP%_dotPulse {\n 0%, 100% { opacity: 0.3; transform: scale(1); }\n 50% { opacity: 0; transform: scale(1.6); }\n}\n\n\n\n.pipeline-flow[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0;\n padding: 8px 0;\n}\n.flow-node[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n}\n.flow-node-mj[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n.flow-arrow[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 0;\n padding: 0 4px;\n}\n.flow-line[_ngcontent-%COMP%] {\n flex: 1;\n height: 2px;\n background: var(--mj-border-default);\n}\n.flow-count[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n padding: 2px 8px;\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-weight: 500;\n}\n\n\n\n.card-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 8px;\n}\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n}\n.stat-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-bottom: 2px;\n}\n.stat-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.stat-error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.sparkline-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.sparkline-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n white-space: nowrap;\n}\n.sparkline-dots[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n}\n.spark-dot[_ngcontent-%COMP%] {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n display: inline-block;\n}\n.spark-green[_ngcontent-%COMP%] { background: var(--mj-color-success-600); }\n.spark-red[_ngcontent-%COMP%] { background: var(--mj-status-error); }\n.spark-amber[_ngcontent-%COMP%] { background: var(--mj-status-warning); }\n.spark-gray[_ngcontent-%COMP%] { background: var(--mj-color-neutral-300); }\n.sparkline-none[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-color-neutral-300);\n font-style: italic;\n}\n\n\n\n.card-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n padding-top: 4px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.btn-sync[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n}\n.btn-sync[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-color-info-200);\n}\n.btn-sync[_ngcontent-%COMP%]:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n.btn-sync-disabled[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n border-color: var(--mj-border-default);\n}\n\n\n\n\n\n.bottom-split[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n margin: 0 0 16px 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n\n\n.chart-panel[_ngcontent-%COMP%] {\n flex: 6;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.bar-chart[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: 12px;\n height: 200px;\n padding-top: 24px;\n}\n.bar-column[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-end;\n height: 100%;\n position: relative;\n}\n.bar-count[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n}\n.bar-fill[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 40px;\n background: linear-gradient(180deg, var(--mj-brand-primary) 0%, var(--mj-color-accent-400) 100%);\n border-radius: 4px 4px 0 0;\n min-height: 2px;\n transition: height 0.3s ease;\n}\n.bar-day[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n margin-top: 6px;\n text-align: center;\n}\n\n\n\n.feed-panel[_ngcontent-%COMP%] {\n flex: 4;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n max-height: 340px;\n overflow-y: auto;\n}\n\n.feed-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.feed-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n transition: background 0.15s;\n}\n.feed-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-page);\n}\n\n.feed-icon-green[_ngcontent-%COMP%] { color: var(--mj-color-success-600); }\n.feed-icon-red[_ngcontent-%COMP%] { color: var(--mj-color-error-600); }\n.feed-icon-amber[_ngcontent-%COMP%] { color: var(--mj-color-warning-600); }\n\n.feed-details[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.feed-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.feed-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n}\n\n.feed-badge[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n text-transform: uppercase;\n white-space: nowrap;\n flex-shrink: 0;\n}\n.feed-badge-green[_ngcontent-%COMP%] { background: var(--mj-status-success-bg); color: var(--mj-color-success-800); }\n.feed-badge-amber[_ngcontent-%COMP%] { background: var(--mj-color-warning-50); color: var(--mj-color-warning-800); }\n.feed-badge-red[_ngcontent-%COMP%] { background: var(--mj-status-error-bg); color: var(--mj-status-error); }\n\n.empty-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 13px;\n font-style: italic;\n}\n\n\n\n\n\n@media (max-width: 1200px) {\n .pipeline-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n .metric-strip[_ngcontent-%COMP%] {\n grid-template-columns: repeat(3, 1fr);\n }\n}\n\n@media (max-width: 900px) {\n .pipeline-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .metric-strip[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n .bottom-split[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n .card-stats[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .overview[_ngcontent-%COMP%] {\n padding: 16px;\n }\n .metric-strip[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}"] });
615
634
  };
616
635
  OverviewComponent = __decorate([
617
636
  RegisterClass(BaseResourceComponent, 'IntegrationOverview')
@@ -619,7 +638,7 @@ OverviewComponent = __decorate([
619
638
  export { OverviewComponent };
620
639
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(OverviewComponent, [{
621
640
  type: Component,
622
- args: [{ standalone: false, selector: 'app-integration-overview', template: "<div class=\"overview\">\n <!-- Notification Banner -->\n @if (Notification) {\n <div class=\"notification\" [class.notification-success]=\"Notification.Type === 'success'\"\n [class.notification-error]=\"Notification.Type === 'error'\">\n @if (Notification.Type === 'success') {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n <span class=\"notification-message\">{{ Notification.Message }}</span>\n <button class=\"notification-dismiss\" (click)=\"DismissNotification()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n\n @if (IsLoading) {\n <mj-loading text=\"Loading integrations...\" size=\"medium\"></mj-loading>\n } @else if (Summaries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-plug-circle-xmark\"></i>\n <h3>No Integrations Configured</h3>\n <p>Set up your first integration using the Connection Studio to start syncing data.</p>\n </div>\n } @else {\n <!-- ====================================================================\n SECTION 1: Metric Strip\n ==================================================================== -->\n <div class=\"metric-strip\">\n <!-- Total Pipelines -->\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-blue\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n </div>\n <div class=\"metric-body\">\n <span class=\"metric-value\">{{ KPIs.TotalIntegrations }}</span>\n <span class=\"metric-label\">Total Pipelines</span>\n </div>\n </div>\n\n <!-- Records Today -->\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-green\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"metric-body\">\n <span class=\"metric-value\">{{ FormatNumber(KPIs.RecordsSyncedToday) }}</span>\n <span class=\"metric-label\">Records Today</span>\n </div>\n </div>\n\n <!-- Success Rate (with conic gradient ring) -->\n <div class=\"metric-card\">\n <div class=\"metric-ring\" [style.background]=\"SuccessRateGradient\">\n <div class=\"metric-ring-inner\">\n <span class=\"metric-ring-value\">{{ SuccessRate }}%</span>\n </div>\n </div>\n <div class=\"metric-body\">\n <span class=\"metric-value metric-value-indigo\">{{ SuccessRate }}%</span>\n <span class=\"metric-label\">Success Rate</span>\n </div>\n </div>\n\n <!-- Active Now -->\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-emerald\">\n <i class=\"fa-solid fa-bolt\"></i>\n @if (ActiveCount > 0) {\n <span class=\"pulse-dot\"></span>\n }\n </div>\n <div class=\"metric-body\">\n <span class=\"metric-value\">{{ ActiveCount }}</span>\n <span class=\"metric-label\">Active Now</span>\n </div>\n </div>\n\n <!-- Avg Duration -->\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-orange\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"metric-body\">\n <span class=\"metric-value\">{{ FormatDuration(KPIs.AverageSyncDurationMs) }}</span>\n <span class=\"metric-label\">Avg Duration</span>\n </div>\n </div>\n </div>\n\n <!-- ====================================================================\n SECTION 2: Pipeline Health Grid\n ==================================================================== -->\n <div class=\"section-heading\">\n <h3><i class=\"fa-solid fa-heart-pulse\"></i> Pipeline Health</h3>\n <button class=\"refresh-btn\" (click)=\"Refresh()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n\n <div class=\"pipeline-grid\">\n @for (summary of Summaries; track summary.Integration.ID) {\n <div [class]=\"GetCardBorderClass(summary.StatusColor)\">\n <!-- Card Header -->\n <div class=\"card-header\">\n <div class=\"card-header-left\">\n <div class=\"card-icon-wrap\">\n <i [class]=\"GetIntegrationIcon(summary)\"></i>\n </div>\n <div class=\"card-title-wrap\">\n <span class=\"card-title\">{{ summary.Integration.Name }}</span>\n <span class=\"card-subtitle\">{{ summary.SourceType?.Name ?? 'Custom' }}</span>\n </div>\n </div>\n <div [class]=\"GetStatusDotClass(summary.StatusColor)\"\n [title]=\"GetStatusLabel(summary.StatusColor)\">\n @if (summary.LatestRun?.Status === 'In Progress') {\n <span class=\"dot-pulse\"></span>\n }\n </div>\n </div>\n\n <!-- Pipeline Flow Visual -->\n <div class=\"pipeline-flow\">\n <div class=\"flow-node\">\n <i [class]=\"GetIntegrationIcon(summary)\"></i>\n </div>\n <div class=\"flow-arrow\">\n <div class=\"flow-line\"></div>\n <span class=\"flow-count\">{{ GetEntityMapCount(summary.Integration.ID) }} maps</span>\n <div class=\"flow-line\"></div>\n </div>\n <div class=\"flow-node flow-node-mj\">\n <i class=\"fa-solid fa-layer-group\"></i>\n </div>\n </div>\n\n <!-- Stats Row -->\n <div class=\"card-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Last sync</span>\n <span class=\"stat-value\">{{ summary.RelativeTime }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Records</span>\n <span class=\"stat-value\">{{ FormatNumber(summary.LatestRun?.TotalRecords ?? 0) }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Duration</span>\n <span class=\"stat-value\">{{ FormatDuration(summary.DurationMs) }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Errors</span>\n <span class=\"stat-value\" [class.stat-error]=\"summary.TotalErrors > 0\">\n {{ summary.TotalErrors }}\n </span>\n </div>\n </div>\n\n <!-- Sparkline (last 5 runs) -->\n <div class=\"sparkline-row\">\n <span class=\"sparkline-label\">Recent runs</span>\n <div class=\"sparkline-dots\">\n @for (run of summary.RecentRuns; track run.ID) {\n <span [class]=\"GetSparklineDotClass(run)\"\n [title]=\"run.Status + ' - ' + (run.StartedAt ?? 'N/A')\"></span>\n }\n @if (summary.RecentRuns.length === 0) {\n <span class=\"sparkline-none\">No runs</span>\n }\n </div>\n </div>\n\n <!-- Card Footer -->\n <div class=\"card-footer\">\n @if (IsRunning(summary.Integration.ID)) {\n <button class=\"btn-sync btn-sync-disabled\" disabled>\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running...\n </button>\n } @else {\n <button class=\"btn-sync\"\n (click)=\"RunSync(summary.Integration.ID)\"\n [disabled]=\"!summary.Integration.IsActive || RunningIntegrationID !== null\">\n <i class=\"fa-solid fa-play\"></i> Sync Now\n </button>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- ====================================================================\n SECTION 3: Bottom - Bar Chart & Activity Feed\n ==================================================================== -->\n <div class=\"bottom-split\">\n <!-- Bar Chart (left, 60%) -->\n <div class=\"chart-panel\">\n <h3 class=\"panel-title\"><i class=\"fa-solid fa-chart-bar\"></i> Records Synced (7 days)</h3>\n @if (DailyCounts.length === 0) {\n <p class=\"empty-hint\">No data available.</p>\n } @else {\n <div class=\"bar-chart\">\n @for (day of DailyCounts; track day.Date) {\n <div class=\"bar-column\">\n <div class=\"bar-count\">{{ FormatNumber(day.Records) }}</div>\n <div class=\"bar-fill\" [style.height.%]=\"BarHeight(day.Records)\"></div>\n <div class=\"bar-day\">{{ day.Label }}</div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Activity Feed (right, 40%) -->\n <div class=\"feed-panel\">\n <h3 class=\"panel-title\"><i class=\"fa-solid fa-stream\"></i> Recent Activity</h3>\n @if (ActivityFeed.length === 0) {\n <p class=\"empty-hint\">No recent activity.</p>\n } @else {\n <div class=\"feed-list\">\n @for (item of ActivityFeed; track item.RunID) {\n <div class=\"feed-item\">\n <i [class]=\"ActivityStatusIcon(item.Status)\"\n [class.feed-icon-green]=\"item.StatusColor === 'green'\"\n [class.feed-icon-red]=\"item.StatusColor === 'red'\"\n [class.feed-icon-amber]=\"item.StatusColor === 'amber'\">\n </i>\n <div class=\"feed-details\">\n <span class=\"feed-name\">{{ item.IntegrationName }}</span>\n <span class=\"feed-meta\">{{ item.TotalRecords | number }} records &middot; {{ item.RelativeTime }}</span>\n </div>\n <span class=\"feed-badge\" [class]=\"'feed-badge-' + item.StatusColor\">\n {{ item.Status }}\n </span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n</div>\n", styles: ["/* ==========================================================================\n Integration Overview - Root\n ========================================================================== */\n.overview {\n padding: 28px;\n max-width: 1440px;\n margin: 0 auto;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n/* ==========================================================================\n Notification Banner\n ========================================================================== */\n.notification {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n border-radius: 10px;\n margin-bottom: 20px;\n font-size: 13px;\n font-weight: 500;\n animation: slideDown 0.25s ease-out;\n}\n.notification i:first-child { font-size: 16px; }\n.notification-message { flex: 1; }\n.notification-success {\n background: var(--mj-status-success-bg);\n color: var(--mj-color-success-800);\n border: 1px solid var(--mj-color-success-200);\n}\n.notification-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n border: 1px solid var(--mj-color-error-200);\n}\n.notification-dismiss {\n background: none;\n border: none;\n cursor: pointer;\n color: inherit;\n opacity: 0.5;\n font-size: 14px;\n padding: 4px;\n line-height: 1;\n}\n.notification-dismiss:hover { opacity: 1; }\n\n@keyframes slideDown {\n from { opacity: 0; transform: translateY(-8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* ==========================================================================\n Empty State\n ========================================================================== */\n.empty-state {\n text-align: center;\n padding: 100px 20px;\n color: var(--mj-text-disabled);\n}\n.empty-state i {\n font-size: 64px;\n margin-bottom: 20px;\n display: block;\n color: var(--mj-color-neutral-300);\n}\n.empty-state h3 {\n margin: 0 0 8px 0;\n font-size: 20px;\n color: var(--mj-text-secondary);\n}\n.empty-state p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n margin-inline: auto;\n}\n\n/* ==========================================================================\n SECTION 1: Metric Strip\n ========================================================================== */\n.metric-strip {\n display: grid;\n grid-template-columns: repeat(5, 1fr);\n gap: 16px;\n margin-bottom: 32px;\n}\n\n.metric-card {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 18px 16px;\n border-radius: 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n transition: box-shadow 0.2s, transform 0.2s;\n}\n.metric-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n transform: translateY(-1px);\n}\n\n.metric-icon {\n position: relative;\n width: 44px;\n height: 44px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n}\n.metric-icon-blue { background: var(--mj-status-info-bg); color: var(--mj-brand-primary); }\n.metric-icon-green { background: var(--mj-status-success-bg); color: var(--mj-color-success-600); }\n.metric-icon-emerald { background: var(--mj-status-success-bg); color: var(--mj-color-success-600); }\n.metric-icon-orange { background: var(--mj-color-warning-50); color: var(--mj-color-warning-600); }\n\n.metric-body {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.metric-value {\n font-size: 22px;\n font-weight: 700;\n line-height: 1.2;\n color: var(--mj-text-primary);\n}\n.metric-value-indigo { color: var(--mj-color-indigo-500); }\n\n.metric-label {\n font-size: 11px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Conic gradient ring for success rate */\n.metric-ring {\n width: 44px;\n height: 44px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n.metric-ring-inner {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.metric-ring-value {\n font-size: 8px;\n font-weight: 700;\n color: var(--mj-color-indigo-500);\n}\n\n/* Pulse dot for active syncs */\n.pulse-dot {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--mj-color-success-600);\n animation: pulse 1.5s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(1.4); }\n}\n\n/* ==========================================================================\n SECTION 2: Pipeline Health Grid\n ========================================================================== */\n.section-heading {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n.section-heading h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.section-heading h3 i {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n.refresh-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, border-color 0.15s;\n}\n.refresh-btn:hover {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-color-info-200);\n}\n\n.pipeline-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n margin-bottom: 32px;\n}\n\n.pipeline-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n transition: box-shadow 0.2s, transform 0.2s;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n.pipeline-card:hover {\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1);\n transform: translateY(-2px);\n}\n\n.pipeline-card-error {\n border-left: 3px solid var(--mj-status-error);\n}\n\n/* Card Header */\n.card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n}\n.card-header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n.card-icon-wrap {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n flex-shrink: 0;\n}\n.card-title-wrap {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.card-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.card-subtitle {\n font-size: 11px;\n color: var(--mj-text-disabled);\n}\n\n/* Status Dot */\n.status-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: 4px;\n position: relative;\n}\n.status-dot-green { background: var(--mj-color-success-600); }\n.status-dot-amber { background: var(--mj-status-warning); }\n.status-dot-red { background: var(--mj-status-error); }\n.status-dot-gray { background: var(--mj-color-neutral-300); }\n\n.dot-pulse {\n position: absolute;\n inset: -3px;\n border-radius: 50%;\n border: 2px solid var(--mj-status-warning);\n animation: dotPulse 1.5s ease-in-out infinite;\n}\n@keyframes dotPulse {\n 0%, 100% { opacity: 0.3; transform: scale(1); }\n 50% { opacity: 0; transform: scale(1.6); }\n}\n\n/* Pipeline Flow Visual */\n.pipeline-flow {\n display: flex;\n align-items: center;\n gap: 0;\n padding: 8px 0;\n}\n.flow-node {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n}\n.flow-node-mj {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n.flow-arrow {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 0;\n padding: 0 4px;\n}\n.flow-line {\n flex: 1;\n height: 2px;\n background: var(--mj-border-default);\n}\n.flow-count {\n font-size: 10px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n padding: 2px 8px;\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-weight: 500;\n}\n\n/* Card Stats */\n.card-stats {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 8px;\n}\n.stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n}\n.stat-label {\n font-size: 10px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-bottom: 2px;\n}\n.stat-value {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.stat-error {\n color: var(--mj-status-error);\n}\n\n/* Sparkline Row */\n.sparkline-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.sparkline-label {\n font-size: 10px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n white-space: nowrap;\n}\n.sparkline-dots {\n display: flex;\n align-items: center;\n gap: 5px;\n}\n.spark-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n display: inline-block;\n}\n.spark-green { background: var(--mj-color-success-600); }\n.spark-red { background: var(--mj-status-error); }\n.spark-amber { background: var(--mj-status-warning); }\n.spark-gray { background: var(--mj-color-neutral-300); }\n.sparkline-none {\n font-size: 10px;\n color: var(--mj-color-neutral-300);\n font-style: italic;\n}\n\n/* Card Footer */\n.card-footer {\n display: flex;\n justify-content: flex-end;\n padding-top: 4px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.btn-sync {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n}\n.btn-sync:hover:not(:disabled) {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-color-info-200);\n}\n.btn-sync:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n.btn-sync-disabled {\n color: var(--mj-text-disabled);\n border-color: var(--mj-border-default);\n}\n\n/* ==========================================================================\n SECTION 3: Bottom Split - Chart + Feed\n ========================================================================== */\n.bottom-split {\n display: flex;\n gap: 20px;\n}\n\n.panel-title {\n margin: 0 0 16px 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.panel-title i {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n/* Bar Chart Panel (left, 60%) */\n.chart-panel {\n flex: 6;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.bar-chart {\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: 12px;\n height: 200px;\n padding-top: 24px;\n}\n.bar-column {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-end;\n height: 100%;\n position: relative;\n}\n.bar-count {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n}\n.bar-fill {\n width: 100%;\n max-width: 40px;\n background: linear-gradient(180deg, var(--mj-brand-primary) 0%, var(--mj-color-accent-400) 100%);\n border-radius: 4px 4px 0 0;\n min-height: 2px;\n transition: height 0.3s ease;\n}\n.bar-day {\n font-size: 11px;\n color: var(--mj-text-disabled);\n margin-top: 6px;\n text-align: center;\n}\n\n/* Activity Feed Panel (right, 40%) */\n.feed-panel {\n flex: 4;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n max-height: 340px;\n overflow-y: auto;\n}\n\n.feed-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.feed-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n transition: background 0.15s;\n}\n.feed-item:hover {\n background: var(--mj-bg-page);\n}\n\n.feed-icon-green { color: var(--mj-color-success-600); }\n.feed-icon-red { color: var(--mj-color-error-600); }\n.feed-icon-amber { color: var(--mj-color-warning-600); }\n\n.feed-details {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.feed-name {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.feed-meta {\n font-size: 11px;\n color: var(--mj-text-disabled);\n}\n\n.feed-badge {\n font-size: 10px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n text-transform: uppercase;\n white-space: nowrap;\n flex-shrink: 0;\n}\n.feed-badge-green { background: var(--mj-status-success-bg); color: var(--mj-color-success-800); }\n.feed-badge-amber { background: var(--mj-color-warning-50); color: var(--mj-color-warning-800); }\n.feed-badge-red { background: var(--mj-status-error-bg); color: var(--mj-status-error); }\n\n.empty-hint {\n color: var(--mj-text-disabled);\n font-size: 13px;\n font-style: italic;\n}\n\n/* ==========================================================================\n Responsive\n ========================================================================== */\n@media (max-width: 1200px) {\n .pipeline-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n .metric-strip {\n grid-template-columns: repeat(3, 1fr);\n }\n}\n\n@media (max-width: 900px) {\n .pipeline-grid {\n grid-template-columns: 1fr;\n }\n .metric-strip {\n grid-template-columns: repeat(2, 1fr);\n }\n .bottom-split {\n flex-direction: column;\n }\n .card-stats {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .overview {\n padding: 16px;\n }\n .metric-strip {\n grid-template-columns: 1fr;\n }\n}\n"] }]
641
+ args: [{ standalone: false, selector: 'app-integration-overview', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Integration Overview\"\n Icon=\"fa-solid fa-gauge-high\"\n Subtitle=\"Health, throughput, and activity across all integrations\">\n @if (Summaries.length > 0) {\n <div meta>\n <mj-stat-badge [Count]=\"KPIs.TotalIntegrations\" Label=\"integrations\"></mj-stat-badge>\n </div>\n }\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"Refresh()\"></mj-refresh-button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n<div class=\"overview\">\n <!-- Notification Banner -->\n @if (Notification) {\n <div class=\"notification\" [class.notification-success]=\"Notification.Type === 'success'\"\n [class.notification-error]=\"Notification.Type === 'error'\">\n @if (Notification.Type === 'success') {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n <span class=\"notification-message\">{{ Notification.Message }}</span>\n <button class=\"notification-dismiss\" (click)=\"DismissNotification()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n\n @if (IsLoading) {\n <mj-loading text=\"Loading integrations...\" size=\"medium\"></mj-loading>\n } @else if (Summaries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-plug-circle-xmark\"></i>\n <h3>No Integrations Configured</h3>\n <p>Set up your first integration using the Connection Studio to start syncing data.</p>\n </div>\n } @else {\n <!-- ====================================================================\n SECTION 1: Metric Strip\n ==================================================================== -->\n <div class=\"metric-strip\">\n <!-- Total Pipelines -->\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-blue\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n </div>\n <div class=\"metric-body\">\n <span class=\"metric-value\">{{ KPIs.TotalIntegrations }}</span>\n <span class=\"metric-label\">Total Pipelines</span>\n </div>\n </div>\n\n <!-- Records Today -->\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-green\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"metric-body\">\n <span class=\"metric-value\">{{ FormatNumber(KPIs.RecordsSyncedToday) }}</span>\n <span class=\"metric-label\">Records Today</span>\n </div>\n </div>\n\n <!-- Success Rate (with conic gradient ring) -->\n <div class=\"metric-card\">\n <div class=\"metric-ring\" [style.background]=\"SuccessRateGradient\">\n <div class=\"metric-ring-inner\">\n <span class=\"metric-ring-value\">{{ SuccessRate }}%</span>\n </div>\n </div>\n <div class=\"metric-body\">\n <span class=\"metric-value metric-value-indigo\">{{ SuccessRate }}%</span>\n <span class=\"metric-label\">Success Rate</span>\n </div>\n </div>\n\n <!-- Active Now -->\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-emerald\">\n <i class=\"fa-solid fa-bolt\"></i>\n @if (ActiveCount > 0) {\n <span class=\"pulse-dot\"></span>\n }\n </div>\n <div class=\"metric-body\">\n <span class=\"metric-value\">{{ ActiveCount }}</span>\n <span class=\"metric-label\">Active Now</span>\n </div>\n </div>\n\n <!-- Avg Duration -->\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-orange\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"metric-body\">\n <span class=\"metric-value\">{{ FormatDuration(KPIs.AverageSyncDurationMs) }}</span>\n <span class=\"metric-label\">Avg Duration</span>\n </div>\n </div>\n </div>\n\n <!-- ====================================================================\n SECTION 2: Pipeline Health Grid\n ==================================================================== -->\n <div class=\"section-heading\">\n <h3><i class=\"fa-solid fa-heart-pulse\"></i> Pipeline Health</h3>\n <button class=\"refresh-btn\" (click)=\"Refresh()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n\n <div class=\"pipeline-grid\">\n @for (summary of Summaries; track summary.Integration.ID) {\n <div [class]=\"GetCardBorderClass(summary.StatusColor)\">\n <!-- Card Header -->\n <div class=\"card-header\">\n <div class=\"card-header-left\">\n <div class=\"card-icon-wrap\">\n <i [class]=\"GetIntegrationIcon(summary)\"></i>\n </div>\n <div class=\"card-title-wrap\">\n <span class=\"card-title\">{{ summary.Integration.Name }}</span>\n <span class=\"card-subtitle\">{{ summary.SourceType?.Name ?? 'Custom' }}</span>\n </div>\n </div>\n <div [class]=\"GetStatusDotClass(summary.StatusColor)\"\n [title]=\"GetStatusLabel(summary.StatusColor)\">\n @if (summary.LatestRun?.Status === 'In Progress') {\n <span class=\"dot-pulse\"></span>\n }\n </div>\n </div>\n\n <!-- Pipeline Flow Visual -->\n <div class=\"pipeline-flow\">\n <div class=\"flow-node\">\n <i [class]=\"GetIntegrationIcon(summary)\"></i>\n </div>\n <div class=\"flow-arrow\">\n <div class=\"flow-line\"></div>\n <span class=\"flow-count\">{{ GetEntityMapCount(summary.Integration.ID) }} maps</span>\n <div class=\"flow-line\"></div>\n </div>\n <div class=\"flow-node flow-node-mj\">\n <i class=\"fa-solid fa-layer-group\"></i>\n </div>\n </div>\n\n <!-- Stats Row -->\n <div class=\"card-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Last sync</span>\n <span class=\"stat-value\">{{ summary.RelativeTime }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Records</span>\n <span class=\"stat-value\">{{ FormatNumber(summary.LatestRun?.TotalRecords ?? 0) }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Duration</span>\n <span class=\"stat-value\">{{ FormatDuration(summary.DurationMs) }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Errors</span>\n <span class=\"stat-value\" [class.stat-error]=\"summary.TotalErrors > 0\">\n {{ summary.TotalErrors }}\n </span>\n </div>\n </div>\n\n <!-- Sparkline (last 5 runs) -->\n <div class=\"sparkline-row\">\n <span class=\"sparkline-label\">Recent runs</span>\n <div class=\"sparkline-dots\">\n @for (run of summary.RecentRuns; track run.ID) {\n <span [class]=\"GetSparklineDotClass(run)\"\n [title]=\"run.Status + ' - ' + (run.StartedAt ?? 'N/A')\"></span>\n }\n @if (summary.RecentRuns.length === 0) {\n <span class=\"sparkline-none\">No runs</span>\n }\n </div>\n </div>\n\n <!-- Card Footer -->\n <div class=\"card-footer\">\n @if (IsRunning(summary.Integration.ID)) {\n <button class=\"btn-sync btn-sync-disabled\" disabled>\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running...\n </button>\n } @else {\n <button class=\"btn-sync\"\n (click)=\"RunSync(summary.Integration.ID)\"\n [disabled]=\"!summary.Integration.IsActive || RunningIntegrationID !== null\">\n <i class=\"fa-solid fa-play\"></i> Sync Now\n </button>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- ====================================================================\n SECTION 3: Bottom - Bar Chart & Activity Feed\n ==================================================================== -->\n <div class=\"bottom-split\">\n <!-- Bar Chart (left, 60%) -->\n <div class=\"chart-panel\">\n <h3 class=\"panel-title\"><i class=\"fa-solid fa-chart-bar\"></i> Records Synced (7 days)</h3>\n @if (DailyCounts.length === 0) {\n <p class=\"empty-hint\">No data available.</p>\n } @else {\n <div class=\"bar-chart\">\n @for (day of DailyCounts; track day.Date) {\n <div class=\"bar-column\">\n <div class=\"bar-count\">{{ FormatNumber(day.Records) }}</div>\n <div class=\"bar-fill\" [style.height.%]=\"BarHeight(day.Records)\"></div>\n <div class=\"bar-day\">{{ day.Label }}</div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Activity Feed (right, 40%) -->\n <div class=\"feed-panel\">\n <h3 class=\"panel-title\"><i class=\"fa-solid fa-stream\"></i> Recent Activity</h3>\n @if (ActivityFeed.length === 0) {\n <p class=\"empty-hint\">No recent activity.</p>\n } @else {\n <div class=\"feed-list\">\n @for (item of ActivityFeed; track item.RunID) {\n <div class=\"feed-item\">\n <i [class]=\"ActivityStatusIcon(item.Status)\"\n [class.feed-icon-green]=\"item.StatusColor === 'green'\"\n [class.feed-icon-red]=\"item.StatusColor === 'red'\"\n [class.feed-icon-amber]=\"item.StatusColor === 'amber'\">\n </i>\n <div class=\"feed-details\">\n <span class=\"feed-name\">{{ item.IntegrationName }}</span>\n <span class=\"feed-meta\">{{ item.TotalRecords | number }} records &middot; {{ item.RelativeTime }}</span>\n </div>\n <span class=\"feed-badge\" [class]=\"'feed-badge-' + item.StatusColor\">\n {{ item.Status }}\n </span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n</div>\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* ==========================================================================\n Integration Overview - Root\n ========================================================================== */\n.overview {\n /* padding + flex/scroll now owned by <mj-page-body>; keep max-width for\n comfortable reading on ultra-wide displays. */\n max-width: 1440px;\n margin: 0 auto;\n}\n\n/* Slot passthrough now in <mj-page-header>; stat badges now via <mj-stat-badge>. */\n\n/* ==========================================================================\n Notification Banner\n ========================================================================== */\n.notification {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n border-radius: 10px;\n margin-bottom: 20px;\n font-size: 13px;\n font-weight: 500;\n animation: slideDown 0.25s ease-out;\n}\n.notification i:first-child { font-size: 16px; }\n.notification-message { flex: 1; }\n.notification-success {\n background: var(--mj-status-success-bg);\n color: var(--mj-color-success-800);\n border: 1px solid var(--mj-color-success-200);\n}\n.notification-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n border: 1px solid var(--mj-color-error-200);\n}\n.notification-dismiss {\n background: none;\n border: none;\n cursor: pointer;\n color: inherit;\n opacity: 0.5;\n font-size: 14px;\n padding: 4px;\n line-height: 1;\n}\n.notification-dismiss:hover { opacity: 1; }\n\n@keyframes slideDown {\n from { opacity: 0; transform: translateY(-8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* ==========================================================================\n Empty State\n ========================================================================== */\n.empty-state {\n text-align: center;\n padding: 100px 20px;\n color: var(--mj-text-disabled);\n}\n.empty-state i {\n font-size: 64px;\n margin-bottom: 20px;\n display: block;\n color: var(--mj-color-neutral-300);\n}\n.empty-state h3 {\n margin: 0 0 8px 0;\n font-size: 20px;\n color: var(--mj-text-secondary);\n}\n.empty-state p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n margin-inline: auto;\n}\n\n/* ==========================================================================\n SECTION 1: Metric Strip\n ========================================================================== */\n.metric-strip {\n display: grid;\n grid-template-columns: repeat(5, 1fr);\n gap: 16px;\n margin-bottom: 32px;\n}\n\n.metric-card {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 18px 16px;\n border-radius: 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n transition: box-shadow 0.2s, transform 0.2s;\n}\n.metric-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n transform: translateY(-1px);\n}\n\n.metric-icon {\n position: relative;\n width: 44px;\n height: 44px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n}\n.metric-icon-blue { background: var(--mj-status-info-bg); color: var(--mj-brand-primary); }\n.metric-icon-green { background: var(--mj-status-success-bg); color: var(--mj-color-success-600); }\n.metric-icon-emerald { background: var(--mj-status-success-bg); color: var(--mj-color-success-600); }\n.metric-icon-orange { background: var(--mj-color-warning-50); color: var(--mj-color-warning-600); }\n\n.metric-body {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.metric-value {\n font-size: 22px;\n font-weight: 700;\n line-height: 1.2;\n color: var(--mj-text-primary);\n}\n.metric-value-indigo { color: var(--mj-color-indigo-500); }\n\n.metric-label {\n font-size: 11px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Conic gradient ring for success rate */\n.metric-ring {\n width: 44px;\n height: 44px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n.metric-ring-inner {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.metric-ring-value {\n font-size: 8px;\n font-weight: 700;\n color: var(--mj-color-indigo-500);\n}\n\n/* Pulse dot for active syncs */\n.pulse-dot {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--mj-color-success-600);\n animation: pulse 1.5s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(1.4); }\n}\n\n/* ==========================================================================\n SECTION 2: Pipeline Health Grid\n ========================================================================== */\n.section-heading {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n.section-heading h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.section-heading h3 i {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n.refresh-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, border-color 0.15s;\n}\n.refresh-btn:hover {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-color-info-200);\n}\n\n.pipeline-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n margin-bottom: 32px;\n}\n\n.pipeline-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n transition: box-shadow 0.2s, transform 0.2s;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n.pipeline-card:hover {\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1);\n transform: translateY(-2px);\n}\n\n.pipeline-card-error {\n border-left: 3px solid var(--mj-status-error);\n}\n\n/* Card Header */\n.card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n}\n.card-header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n.card-icon-wrap {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n flex-shrink: 0;\n}\n.card-title-wrap {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.card-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.card-subtitle {\n font-size: 11px;\n color: var(--mj-text-disabled);\n}\n\n/* Status Dot */\n.status-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: 4px;\n position: relative;\n}\n.status-dot-green { background: var(--mj-color-success-600); }\n.status-dot-amber { background: var(--mj-status-warning); }\n.status-dot-red { background: var(--mj-status-error); }\n.status-dot-gray { background: var(--mj-color-neutral-300); }\n\n.dot-pulse {\n position: absolute;\n inset: -3px;\n border-radius: 50%;\n border: 2px solid var(--mj-status-warning);\n animation: dotPulse 1.5s ease-in-out infinite;\n}\n@keyframes dotPulse {\n 0%, 100% { opacity: 0.3; transform: scale(1); }\n 50% { opacity: 0; transform: scale(1.6); }\n}\n\n/* Pipeline Flow Visual */\n.pipeline-flow {\n display: flex;\n align-items: center;\n gap: 0;\n padding: 8px 0;\n}\n.flow-node {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n}\n.flow-node-mj {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n.flow-arrow {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 0;\n padding: 0 4px;\n}\n.flow-line {\n flex: 1;\n height: 2px;\n background: var(--mj-border-default);\n}\n.flow-count {\n font-size: 10px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n padding: 2px 8px;\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-weight: 500;\n}\n\n/* Card Stats */\n.card-stats {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 8px;\n}\n.stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n}\n.stat-label {\n font-size: 10px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-bottom: 2px;\n}\n.stat-value {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.stat-error {\n color: var(--mj-status-error);\n}\n\n/* Sparkline Row */\n.sparkline-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.sparkline-label {\n font-size: 10px;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n white-space: nowrap;\n}\n.sparkline-dots {\n display: flex;\n align-items: center;\n gap: 5px;\n}\n.spark-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n display: inline-block;\n}\n.spark-green { background: var(--mj-color-success-600); }\n.spark-red { background: var(--mj-status-error); }\n.spark-amber { background: var(--mj-status-warning); }\n.spark-gray { background: var(--mj-color-neutral-300); }\n.sparkline-none {\n font-size: 10px;\n color: var(--mj-color-neutral-300);\n font-style: italic;\n}\n\n/* Card Footer */\n.card-footer {\n display: flex;\n justify-content: flex-end;\n padding-top: 4px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.btn-sync {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n}\n.btn-sync:hover:not(:disabled) {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-color-info-200);\n}\n.btn-sync:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n.btn-sync-disabled {\n color: var(--mj-text-disabled);\n border-color: var(--mj-border-default);\n}\n\n/* ==========================================================================\n SECTION 3: Bottom Split - Chart + Feed\n ========================================================================== */\n.bottom-split {\n display: flex;\n gap: 20px;\n}\n\n.panel-title {\n margin: 0 0 16px 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.panel-title i {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n/* Bar Chart Panel (left, 60%) */\n.chart-panel {\n flex: 6;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.bar-chart {\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: 12px;\n height: 200px;\n padding-top: 24px;\n}\n.bar-column {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-end;\n height: 100%;\n position: relative;\n}\n.bar-count {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n}\n.bar-fill {\n width: 100%;\n max-width: 40px;\n background: linear-gradient(180deg, var(--mj-brand-primary) 0%, var(--mj-color-accent-400) 100%);\n border-radius: 4px 4px 0 0;\n min-height: 2px;\n transition: height 0.3s ease;\n}\n.bar-day {\n font-size: 11px;\n color: var(--mj-text-disabled);\n margin-top: 6px;\n text-align: center;\n}\n\n/* Activity Feed Panel (right, 40%) */\n.feed-panel {\n flex: 4;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n max-height: 340px;\n overflow-y: auto;\n}\n\n.feed-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.feed-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n transition: background 0.15s;\n}\n.feed-item:hover {\n background: var(--mj-bg-page);\n}\n\n.feed-icon-green { color: var(--mj-color-success-600); }\n.feed-icon-red { color: var(--mj-color-error-600); }\n.feed-icon-amber { color: var(--mj-color-warning-600); }\n\n.feed-details {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.feed-name {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.feed-meta {\n font-size: 11px;\n color: var(--mj-text-disabled);\n}\n\n.feed-badge {\n font-size: 10px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n text-transform: uppercase;\n white-space: nowrap;\n flex-shrink: 0;\n}\n.feed-badge-green { background: var(--mj-status-success-bg); color: var(--mj-color-success-800); }\n.feed-badge-amber { background: var(--mj-color-warning-50); color: var(--mj-color-warning-800); }\n.feed-badge-red { background: var(--mj-status-error-bg); color: var(--mj-status-error); }\n\n.empty-hint {\n color: var(--mj-text-disabled);\n font-size: 13px;\n font-style: italic;\n}\n\n/* ==========================================================================\n Responsive\n ========================================================================== */\n@media (max-width: 1200px) {\n .pipeline-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n .metric-strip {\n grid-template-columns: repeat(3, 1fr);\n }\n}\n\n@media (max-width: 900px) {\n .pipeline-grid {\n grid-template-columns: 1fr;\n }\n .metric-strip {\n grid-template-columns: repeat(2, 1fr);\n }\n .bottom-split {\n flex-direction: column;\n }\n .card-stats {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .overview {\n padding: 16px;\n }\n .metric-strip {\n grid-template-columns: 1fr;\n }\n}\n"] }]
623
642
  }], null, null); })();
624
643
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(OverviewComponent, { className: "OverviewComponent", filePath: "src/Integration/components/overview/overview.component.ts", lineNumber: 30 }); })();
625
644
  export function LoadOverviewComponent() {