@memberjunction/ng-dashboards 5.37.0 → 5.39.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 (328) hide show
  1. package/README.md +46 -7
  2. package/dist/AI/components/agents/agent-configuration.component.js +199 -198
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
  8. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  9. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
  10. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  11. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  12. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
  13. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  14. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
  15. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  16. package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
  17. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  18. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
  19. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  20. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
  21. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  22. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
  23. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  24. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
  25. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  26. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +89 -842
  27. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1353 -7683
  29. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  30. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
  31. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
  32. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
  33. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
  34. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
  35. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
  36. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
  37. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
  38. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
  39. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
  40. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
  41. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
  42. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +235 -0
  43. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
  44. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1735 -0
  45. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
  46. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
  47. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
  48. package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
  49. package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
  50. package/dist/AI/components/autotagging/shared/classify.format.d.ts +43 -0
  51. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
  52. package/dist/AI/components/autotagging/shared/classify.format.js +209 -0
  53. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
  54. package/dist/AI/components/autotagging/shared/classify.types.d.ts +276 -0
  55. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
  56. package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
  57. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
  58. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
  59. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
  60. package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
  61. package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
  62. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +40 -0
  63. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
  64. package/dist/AI/components/autotagging/tabs/history-tab.component.js +402 -0
  65. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
  66. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
  67. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
  68. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
  69. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
  70. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +122 -0
  71. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
  72. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +752 -0
  73. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
  74. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +166 -0
  75. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
  76. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1384 -0
  77. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
  78. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +70 -0
  79. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
  80. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +448 -0
  81. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
  82. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
  83. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
  84. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
  85. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
  86. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +47 -0
  87. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
  88. package/dist/AI/components/autotagging/tabs/types-tab.component.js +220 -0
  89. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
  90. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +293 -289
  91. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  92. package/dist/AI/components/models/model-management.component.js +209 -208
  93. package/dist/AI/components/models/model-management.component.js.map +1 -1
  94. package/dist/AI/components/prompts/prompt-management.component.js +130 -128
  95. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  96. package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
  97. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  98. package/dist/AI/components/system/system-configuration.component.js +17 -17
  99. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  100. package/dist/AI/components/tags/tags-resource.component.js +550 -532
  101. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  102. package/dist/AI/components/vectors/vector-management-resource.component.js +1 -1
  103. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  104. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  105. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  106. package/dist/AI/services/ai-instrumentation.service.js +14 -2
  107. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  108. package/dist/AI/services/cache-metrics.d.ts +50 -0
  109. package/dist/AI/services/cache-metrics.d.ts.map +1 -0
  110. package/dist/AI/services/cache-metrics.js +43 -0
  111. package/dist/AI/services/cache-metrics.js.map +1 -0
  112. package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
  113. package/dist/APIKeys/api-keys-resource.component.js +132 -131
  114. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  115. package/dist/Actions/components/actions-overview.component.js +141 -141
  116. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  117. package/dist/Actions/components/execution-monitoring.component.js +15 -15
  118. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  119. package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
  120. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  121. package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
  122. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  123. package/dist/Admin/admin-data-schema.component.js +2 -2
  124. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  125. package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
  126. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  127. package/dist/Admin/admin-identity-access.component.js +2 -2
  128. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  129. package/dist/Admin/admin-monitoring.component.js +2 -2
  130. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  131. package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
  132. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  133. package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
  134. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  135. package/dist/Communication/communication-logs-resource.component.js +72 -50
  136. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  137. package/dist/Communication/communication-monitor-resource.component.js +103 -102
  138. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  139. package/dist/Communication/communication-providers-resource.component.js +52 -51
  140. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  141. package/dist/Communication/communication-runs-resource.component.js +39 -38
  142. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  143. package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
  144. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  145. package/dist/Communication/communication-templates-resource.component.js +92 -89
  146. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  147. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +73 -1
  148. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  149. package/dist/ComponentStudio/component-studio-dashboard.component.js +512 -127
  150. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  151. package/dist/ComponentStudio/component-studio-resource.component.d.ts +22 -0
  152. package/dist/ComponentStudio/component-studio-resource.component.d.ts.map +1 -0
  153. package/dist/ComponentStudio/component-studio-resource.component.js +55 -0
  154. package/dist/ComponentStudio/component-studio-resource.component.js.map +1 -0
  155. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +104 -45
  156. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
  157. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +234 -331
  158. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  159. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts +54 -0
  160. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts.map +1 -0
  161. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js +339 -0
  162. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js.map +1 -0
  163. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts +65 -0
  164. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts.map +1 -0
  165. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js +492 -0
  166. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js.map +1 -0
  167. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts +88 -0
  168. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts.map +1 -0
  169. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js +457 -0
  170. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js.map +1 -0
  171. package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +106 -0
  172. package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -0
  173. package/dist/ComponentStudio/components/form-override-dialog.component.js +478 -0
  174. package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -0
  175. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +54 -0
  176. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
  177. package/dist/ComponentStudio/components/workspace/component-preview.component.js +361 -50
  178. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
  179. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +10 -0
  180. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
  181. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +114 -45
  182. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  183. package/dist/ComponentStudio/services/canvas-to-code.d.ts +32 -0
  184. package/dist/ComponentStudio/services/canvas-to-code.d.ts.map +1 -0
  185. package/dist/ComponentStudio/services/canvas-to-code.js +347 -0
  186. package/dist/ComponentStudio/services/canvas-to-code.js.map +1 -0
  187. package/dist/ComponentStudio/services/code-to-canvas.d.ts +32 -0
  188. package/dist/ComponentStudio/services/code-to-canvas.d.ts.map +1 -0
  189. package/dist/ComponentStudio/services/code-to-canvas.js +92 -0
  190. package/dist/ComponentStudio/services/code-to-canvas.js.map +1 -0
  191. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +29 -0
  192. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
  193. package/dist/ComponentStudio/services/component-studio-state.service.js +76 -0
  194. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
  195. package/dist/ComponentStudio/services/entity-form-override.service.d.ts +86 -0
  196. package/dist/ComponentStudio/services/entity-form-override.service.d.ts.map +1 -0
  197. package/dist/ComponentStudio/services/entity-form-override.service.js +246 -0
  198. package/dist/ComponentStudio/services/entity-form-override.service.js.map +1 -0
  199. package/dist/ComponentStudio/services/field-binding-scanner.d.ts +29 -0
  200. package/dist/ComponentStudio/services/field-binding-scanner.d.ts.map +1 -0
  201. package/dist/ComponentStudio/services/field-binding-scanner.js +110 -0
  202. package/dist/ComponentStudio/services/field-binding-scanner.js.map +1 -0
  203. package/dist/ComponentStudio/services/form-canvas-model.d.ts +56 -0
  204. package/dist/ComponentStudio/services/form-canvas-model.d.ts.map +1 -0
  205. package/dist/ComponentStudio/services/form-canvas-model.js +35 -0
  206. package/dist/ComponentStudio/services/form-canvas-model.js.map +1 -0
  207. package/dist/ComponentStudio/services/form-host-props-fixture.d.ts +10 -0
  208. package/dist/ComponentStudio/services/form-host-props-fixture.d.ts.map +1 -0
  209. package/dist/ComponentStudio/services/form-host-props-fixture.js +10 -0
  210. package/dist/ComponentStudio/services/form-host-props-fixture.js.map +1 -0
  211. package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
  212. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  213. package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
  214. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  215. package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
  216. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  217. package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
  218. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  219. package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
  220. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  221. package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
  222. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  223. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
  224. package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
  225. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  226. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
  227. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  228. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
  229. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  230. package/dist/DevTools/app-state-inspector.component.js +18 -17
  231. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  232. package/dist/DevTools/class-registry.component.js +88 -85
  233. package/dist/DevTools/class-registry.component.js.map +1 -1
  234. package/dist/DevTools/event-monitor.component.js +155 -150
  235. package/dist/DevTools/event-monitor.component.js.map +1 -1
  236. package/dist/DevTools/graphql-console.component.js +245 -243
  237. package/dist/DevTools/graphql-console.component.js.map +1 -1
  238. package/dist/DevTools/layout-inspector.component.js +18 -17
  239. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  240. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
  241. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  242. package/dist/FormBuilder/form-builder-resource.component.d.ts +964 -0
  243. package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -0
  244. package/dist/FormBuilder/form-builder-resource.component.js +4487 -0
  245. package/dist/FormBuilder/form-builder-resource.component.js.map +1 -0
  246. package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts +55 -0
  247. package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts.map +1 -0
  248. package/dist/FormBuilder/form-builder-version-rail.helpers.js +73 -0
  249. package/dist/FormBuilder/form-builder-version-rail.helpers.js.map +1 -0
  250. package/dist/Home/home-application.d.ts +21 -1
  251. package/dist/Home/home-application.d.ts.map +1 -1
  252. package/dist/Home/home-application.js +60 -8
  253. package/dist/Home/home-application.js.map +1 -1
  254. package/dist/Home/home-dashboard.component.js +2 -2
  255. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  256. package/dist/Integration/components/activity/activity.component.js +236 -229
  257. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  258. package/dist/Integration/components/connections/connections.component.js +390 -389
  259. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  260. package/dist/Integration/components/overview/overview.component.js +2 -2
  261. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +2 -2
  262. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  263. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +45 -44
  264. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  265. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
  266. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  267. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
  268. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  269. package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
  270. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  271. package/dist/Lists/components/lists-browse-resource.component.js +525 -566
  272. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  273. package/dist/Lists/components/lists-categories-resource.component.js +135 -134
  274. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  275. package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
  276. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  277. package/dist/MCP/mcp-dashboard.component.js +443 -438
  278. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  279. package/dist/QueryBrowser/query-browser-resource.component.d.ts +14 -14
  280. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  281. package/dist/QueryBrowser/query-browser-resource.component.js +11 -10
  282. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  283. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  284. package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
  285. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  286. package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
  287. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  288. package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
  289. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  290. package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
  291. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  292. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
  293. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  294. package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
  295. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  296. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  297. package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
  298. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  299. package/dist/Testing/components/testing-explorer.component.js +436 -427
  300. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  301. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  302. package/dist/Testing/components/testing-runs.component.js +116 -115
  303. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  304. package/dist/Testing/testing-dashboard.component.js +6 -7
  305. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  306. package/dist/VersionHistory/components/labels-resource.component.js +173 -172
  307. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  308. package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
  309. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  310. package/dist/VersionHistory/components/restore-resource.component.js +116 -92
  311. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  312. package/dist/ai-dashboards.module.d.ts +47 -35
  313. package/dist/ai-dashboards.module.d.ts.map +1 -1
  314. package/dist/ai-dashboards.module.js +40 -1
  315. package/dist/ai-dashboards.module.js.map +1 -1
  316. package/dist/communication-dashboards.module.d.ts +1 -1
  317. package/dist/communication-dashboards.module.d.ts.map +1 -1
  318. package/dist/communication-dashboards.module.js +7 -1
  319. package/dist/communication-dashboards.module.js.map +1 -1
  320. package/dist/component-studio-dashboards.module.d.ts +34 -22
  321. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  322. package/dist/component-studio-dashboards.module.js +65 -9
  323. package/dist/component-studio-dashboards.module.js.map +1 -1
  324. package/dist/testing-dashboards.module.d.ts +4 -5
  325. package/dist/testing-dashboards.module.d.ts.map +1 -1
  326. package/dist/testing-dashboards.module.js +7 -5
  327. package/dist/testing-dashboards.module.js.map +1 -1
  328. package/package.json +55 -53
@@ -12,18 +12,18 @@ import * as i0 from "@angular/core";
12
12
  import * as i1 from "@angular/common";
13
13
  import * as i2 from "../AI/components/charts/time-series-chart.component";
14
14
  import * as i3 from "@memberjunction/ng-ui-components";
15
- function CommunicationMonitorResourceComponent_For_70_Template(rf, ctx) { if (rf & 1) {
16
- i0.ɵɵelementStart(0, "div", 32)(1, "div", 40);
15
+ function CommunicationMonitorResourceComponent_For_71_Template(rf, ctx) { if (rf & 1) {
16
+ i0.ɵɵelementStart(0, "div", 33)(1, "div", 41);
17
17
  i0.ɵɵelement(2, "i");
18
18
  i0.ɵɵelementEnd();
19
- i0.ɵɵelementStart(3, "div", 41)(4, "span", 42);
19
+ i0.ɵɵelementStart(3, "div", 42)(4, "span", 43);
20
20
  i0.ɵɵtext(5);
21
21
  i0.ɵɵelementEnd();
22
- i0.ɵɵelementStart(6, "span", 43);
22
+ i0.ɵɵelementStart(6, "span", 44);
23
23
  i0.ɵɵtext(7);
24
24
  i0.ɵɵpipe(8, "date");
25
25
  i0.ɵɵelementEnd()();
26
- i0.ɵɵelementStart(9, "span", 44);
26
+ i0.ɵɵelementStart(9, "span", 45);
27
27
  i0.ɵɵtext(10);
28
28
  i0.ɵɵelementEnd()();
29
29
  } if (rf & 2) {
@@ -42,29 +42,29 @@ function CommunicationMonitorResourceComponent_For_70_Template(rf, ctx) { if (rf
42
42
  i0.ɵɵadvance();
43
43
  i0.ɵɵtextInterpolate1(" ", log_r1.Status, " ");
44
44
  } }
45
- function CommunicationMonitorResourceComponent_Conditional_71_Template(rf, ctx) { if (rf & 1) {
46
- i0.ɵɵelementStart(0, "div", 33);
47
- i0.ɵɵelement(1, "i", 45);
45
+ function CommunicationMonitorResourceComponent_Conditional_72_Template(rf, ctx) { if (rf & 1) {
46
+ i0.ɵɵelementStart(0, "div", 34);
47
+ i0.ɵɵelement(1, "i", 46);
48
48
  i0.ɵɵelementStart(2, "p");
49
49
  i0.ɵɵtext(3, "No recent activity");
50
50
  i0.ɵɵelementEnd()();
51
51
  } }
52
- function CommunicationMonitorResourceComponent_For_81_Template(rf, ctx) { if (rf & 1) {
53
- i0.ɵɵelementStart(0, "div", 36);
54
- i0.ɵɵelement(1, "div", 46);
55
- i0.ɵɵelementStart(2, "div", 47);
52
+ function CommunicationMonitorResourceComponent_For_82_Template(rf, ctx) { if (rf & 1) {
53
+ i0.ɵɵelementStart(0, "div", 37);
54
+ i0.ɵɵelement(1, "div", 47);
55
+ i0.ɵɵelementStart(2, "div", 48);
56
56
  i0.ɵɵelement(3, "i");
57
57
  i0.ɵɵelementEnd();
58
- i0.ɵɵelementStart(4, "div", 48)(5, "div", 49);
58
+ i0.ɵɵelementStart(4, "div", 49)(5, "div", 50);
59
59
  i0.ɵɵtext(6);
60
60
  i0.ɵɵelementEnd();
61
- i0.ɵɵelementStart(7, "div", 50);
61
+ i0.ɵɵelementStart(7, "div", 51);
62
62
  i0.ɵɵtext(8);
63
63
  i0.ɵɵelementEnd()();
64
- i0.ɵɵelementStart(9, "div", 51);
65
- i0.ɵɵelement(10, "div", 52);
64
+ i0.ɵɵelementStart(9, "div", 52);
65
+ i0.ɵɵelement(10, "div", 53);
66
66
  i0.ɵɵelementEnd();
67
- i0.ɵɵelementStart(11, "span", 53);
67
+ i0.ɵɵelementStart(11, "span", 54);
68
68
  i0.ɵɵtext(12);
69
69
  i0.ɵɵelementEnd()();
70
70
  } if (rf & 2) {
@@ -88,28 +88,28 @@ function CommunicationMonitorResourceComponent_For_81_Template(rf, ctx) { if (rf
88
88
  i0.ɵɵadvance();
89
89
  i0.ɵɵtextInterpolate1("", provider_r3.SuccessRate, "%");
90
90
  } }
91
- function CommunicationMonitorResourceComponent_Conditional_82_Template(rf, ctx) { if (rf & 1) {
92
- i0.ɵɵelementStart(0, "div", 33);
93
- i0.ɵɵelement(1, "i", 54);
91
+ function CommunicationMonitorResourceComponent_Conditional_83_Template(rf, ctx) { if (rf & 1) {
92
+ i0.ɵɵelementStart(0, "div", 34);
93
+ i0.ɵɵelement(1, "i", 55);
94
94
  i0.ɵɵelementStart(2, "p");
95
95
  i0.ɵɵtext(3, "No providers configured");
96
96
  i0.ɵɵelementEnd()();
97
97
  } }
98
- function CommunicationMonitorResourceComponent_For_91_Template(rf, ctx) { if (rf & 1) {
99
- i0.ɵɵelementStart(0, "div", 39)(1, "div", 55);
98
+ function CommunicationMonitorResourceComponent_For_92_Template(rf, ctx) { if (rf & 1) {
99
+ i0.ɵɵelementStart(0, "div", 40)(1, "div", 56);
100
100
  i0.ɵɵelement(2, "i");
101
101
  i0.ɵɵelementEnd();
102
- i0.ɵɵelementStart(3, "div", 56)(4, "div", 57);
102
+ i0.ɵɵelementStart(3, "div", 57)(4, "div", 58);
103
103
  i0.ɵɵtext(5);
104
104
  i0.ɵɵelementEnd();
105
- i0.ɵɵelementStart(6, "div", 58);
105
+ i0.ɵɵelementStart(6, "div", 59);
106
106
  i0.ɵɵtext(7);
107
107
  i0.ɵɵpipe(8, "number");
108
108
  i0.ɵɵelementEnd()();
109
- i0.ɵɵelementStart(9, "div", 59);
110
- i0.ɵɵelement(10, "div", 60);
109
+ i0.ɵɵelementStart(9, "div", 60);
110
+ i0.ɵɵelement(10, "div", 61);
111
111
  i0.ɵɵelementEnd();
112
- i0.ɵɵelementStart(11, "span", 61);
112
+ i0.ɵɵelementStart(11, "span", 62);
113
113
  i0.ɵɵtext(12);
114
114
  i0.ɵɵelementEnd()();
115
115
  } if (rf & 2) {
@@ -127,9 +127,9 @@ function CommunicationMonitorResourceComponent_For_91_Template(rf, ctx) { if (rf
127
127
  i0.ɵɵadvance(2);
128
128
  i0.ɵɵtextInterpolate1("", channel_r4.Percentage, "%");
129
129
  } }
130
- function CommunicationMonitorResourceComponent_Conditional_92_Template(rf, ctx) { if (rf & 1) {
131
- i0.ɵɵelementStart(0, "div", 33);
132
- i0.ɵɵelement(1, "i", 37);
130
+ function CommunicationMonitorResourceComponent_Conditional_93_Template(rf, ctx) { if (rf & 1) {
131
+ i0.ɵɵelementStart(0, "div", 34);
132
+ i0.ɵɵelement(1, "i", 38);
133
133
  i0.ɵɵelementStart(2, "p");
134
134
  i0.ɵɵtext(3, "No channel data available");
135
135
  i0.ɵɵelementEnd()();
@@ -371,104 +371,105 @@ let CommunicationMonitorResourceComponent = class CommunicationMonitorResourceCo
371
371
  return 'fa-solid fa-chart-line';
372
372
  }
373
373
  static ɵfac = function CommunicationMonitorResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CommunicationMonitorResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
374
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CommunicationMonitorResourceComponent, selectors: [["mj-communication-monitor-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 93, vars: 35, consts: [["Title", "Monitor", "Icon", "fa-solid fa-chart-line", "Subtitle", "Live delivery health, provider status, and channel breakdown"], ["actions", ""], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Refresh", 3, "click", "disabled"], [1, "fa-solid", "fa-rotate"], [1, "kpi-strip"], [1, "kpi-card", "sent"], [1, "kpi-icon"], [1, "fa-solid", "fa-paper-plane"], [1, "kpi-body"], [1, "kpi-label"], [1, "kpi-value"], [1, "kpi-delta"], [1, "fa-solid"], [1, "kpi-card", "delivered"], [1, "fa-solid", "fa-check-double"], [1, "delivery-bar"], [1, "delivery-fill"], [1, "kpi-card", "pending"], [1, "fa-solid", "fa-clock"], [1, "kpi-delta", "neutral"], [1, "fa-solid", "fa-minus"], [1, "kpi-card", "failed"], [1, "fa-solid", "fa-circle-exclamation"], [1, "content-grid"], [1, "card"], [1, "card-header"], [1, "fa-solid", "fa-chart-bar"], [1, "chart-container-inner"], [3, "data", "showLegend", "showControls", "config"], [1, "fa-solid", "fa-bolt"], [1, "card-body", "no-padding"], [1, "activity-feed"], [1, "activity-item"], [1, "empty-state"], [1, "fa-solid", "fa-heart-pulse"], [1, "provider-health-list"], [1, "provider-row"], [1, "fa-solid", "fa-layer-group"], [1, "channel-breakdown"], [1, "channel-row"], [1, "activity-icon", 3, "ngClass"], [1, "activity-body"], [1, "activity-title"], [1, "activity-meta"], [1, "activity-status", 3, "ngClass"], [1, "fa-solid", "fa-inbox"], [1, "provider-status-dot"], [1, "provider-logo", 3, "ngClass"], [1, "provider-info"], [1, "provider-name"], [1, "provider-type"], [1, "provider-health-bar"], [1, "provider-health-fill", 3, "ngClass"], [1, "provider-rate", 3, "ngClass"], [1, "fa-solid", "fa-server"], [1, "channel-icon", 3, "ngClass"], [1, "channel-info"], [1, "channel-name"], [1, "channel-count"], [1, "channel-bar-wrapper"], [1, "channel-bar-fill"], [1, "channel-pct"]], template: function CommunicationMonitorResourceComponent_Template(rf, ctx) { if (rf & 1) {
374
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CommunicationMonitorResourceComponent, selectors: [["mj-communication-monitor-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 94, vars: 35, consts: [["Title", "Monitor", "Icon", "fa-solid fa-chart-line", "Subtitle", "Live delivery health, provider status, and channel breakdown"], ["actions", ""], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Refresh", 3, "click", "disabled"], [1, "fa-solid", "fa-rotate"], [1, "action-btn-label"], [1, "kpi-strip"], [1, "kpi-card", "sent"], [1, "kpi-icon"], [1, "fa-solid", "fa-paper-plane"], [1, "kpi-body"], [1, "kpi-label"], [1, "kpi-value"], [1, "kpi-delta"], [1, "fa-solid"], [1, "kpi-card", "delivered"], [1, "fa-solid", "fa-check-double"], [1, "delivery-bar"], [1, "delivery-fill"], [1, "kpi-card", "pending"], [1, "fa-solid", "fa-clock"], [1, "kpi-delta", "neutral"], [1, "fa-solid", "fa-minus"], [1, "kpi-card", "failed"], [1, "fa-solid", "fa-circle-exclamation"], [1, "content-grid"], [1, "card"], [1, "card-header"], [1, "fa-solid", "fa-chart-bar"], [1, "chart-container-inner"], [3, "data", "showLegend", "showControls", "config"], [1, "fa-solid", "fa-bolt"], [1, "card-body", "no-padding"], [1, "activity-feed"], [1, "activity-item"], [1, "empty-state"], [1, "fa-solid", "fa-heart-pulse"], [1, "provider-health-list"], [1, "provider-row"], [1, "fa-solid", "fa-layer-group"], [1, "channel-breakdown"], [1, "channel-row"], [1, "activity-icon", 3, "ngClass"], [1, "activity-body"], [1, "activity-title"], [1, "activity-meta"], [1, "activity-status", 3, "ngClass"], [1, "fa-solid", "fa-inbox"], [1, "provider-status-dot"], [1, "provider-logo", 3, "ngClass"], [1, "provider-info"], [1, "provider-name"], [1, "provider-type"], [1, "provider-health-bar"], [1, "provider-health-fill", 3, "ngClass"], [1, "provider-rate", 3, "ngClass"], [1, "fa-solid", "fa-server"], [1, "channel-icon", 3, "ngClass"], [1, "channel-info"], [1, "channel-name"], [1, "channel-count"], [1, "channel-bar-wrapper"], [1, "channel-bar-fill"], [1, "channel-pct"]], template: function CommunicationMonitorResourceComponent_Template(rf, ctx) { if (rf & 1) {
375
375
  i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1)(3, "button", 2);
376
376
  i0.ɵɵlistener("click", function CommunicationMonitorResourceComponent_Template_button_click_3_listener() { return ctx.loadData(); });
377
377
  i0.ɵɵelement(4, "i", 3);
378
- i0.ɵɵtext(5, " Refresh ");
379
- i0.ɵɵelementEnd()()();
380
- i0.ɵɵelementStart(6, "mj-page-body")(7, "div", 4)(8, "div", 5)(9, "div", 6);
381
- i0.ɵɵelement(10, "i", 7);
378
+ i0.ɵɵelementStart(5, "span", 4);
379
+ i0.ɵɵtext(6, "Refresh");
380
+ i0.ɵɵelementEnd()()()();
381
+ i0.ɵɵelementStart(7, "mj-page-body")(8, "div", 5)(9, "div", 6)(10, "div", 7);
382
+ i0.ɵɵelement(11, "i", 8);
382
383
  i0.ɵɵelementEnd();
383
- i0.ɵɵelementStart(11, "div", 8)(12, "span", 9);
384
- i0.ɵɵtext(13, "Total Sent");
384
+ i0.ɵɵelementStart(12, "div", 9)(13, "span", 10);
385
+ i0.ɵɵtext(14, "Total Sent");
385
386
  i0.ɵɵelementEnd();
386
- i0.ɵɵelementStart(14, "span", 10);
387
- i0.ɵɵtext(15);
388
- i0.ɵɵpipe(16, "number");
387
+ i0.ɵɵelementStart(15, "span", 11);
388
+ i0.ɵɵtext(16);
389
+ i0.ɵɵpipe(17, "number");
389
390
  i0.ɵɵelementEnd();
390
- i0.ɵɵelementStart(17, "span", 11);
391
- i0.ɵɵelement(18, "i", 12);
392
- i0.ɵɵtext(19, " Last 24 hours ");
391
+ i0.ɵɵelementStart(18, "span", 12);
392
+ i0.ɵɵelement(19, "i", 13);
393
+ i0.ɵɵtext(20, " Last 24 hours ");
393
394
  i0.ɵɵelementEnd()()();
394
- i0.ɵɵelementStart(20, "div", 13)(21, "div", 6);
395
- i0.ɵɵelement(22, "i", 14);
395
+ i0.ɵɵelementStart(21, "div", 14)(22, "div", 7);
396
+ i0.ɵɵelement(23, "i", 15);
396
397
  i0.ɵɵelementEnd();
397
- i0.ɵɵelementStart(23, "div", 8)(24, "span", 9);
398
- i0.ɵɵtext(25, "Delivery Rate");
398
+ i0.ɵɵelementStart(24, "div", 9)(25, "span", 10);
399
+ i0.ɵɵtext(26, "Delivery Rate");
399
400
  i0.ɵɵelementEnd();
400
- i0.ɵɵelementStart(26, "span", 10);
401
- i0.ɵɵtext(27);
401
+ i0.ɵɵelementStart(27, "span", 11);
402
+ i0.ɵɵtext(28);
402
403
  i0.ɵɵelementEnd();
403
- i0.ɵɵelementStart(28, "div", 15);
404
- i0.ɵɵelement(29, "div", 16);
404
+ i0.ɵɵelementStart(29, "div", 16);
405
+ i0.ɵɵelement(30, "div", 17);
405
406
  i0.ɵɵelementEnd()()();
406
- i0.ɵɵelementStart(30, "div", 17)(31, "div", 6);
407
- i0.ɵɵelement(32, "i", 18);
407
+ i0.ɵɵelementStart(31, "div", 18)(32, "div", 7);
408
+ i0.ɵɵelement(33, "i", 19);
408
409
  i0.ɵɵelementEnd();
409
- i0.ɵɵelementStart(33, "div", 8)(34, "span", 9);
410
- i0.ɵɵtext(35, "Pending");
410
+ i0.ɵɵelementStart(34, "div", 9)(35, "span", 10);
411
+ i0.ɵɵtext(36, "Pending");
411
412
  i0.ɵɵelementEnd();
412
- i0.ɵɵelementStart(36, "span", 10);
413
- i0.ɵɵtext(37);
414
- i0.ɵɵpipe(38, "number");
413
+ i0.ɵɵelementStart(37, "span", 11);
414
+ i0.ɵɵtext(38);
415
+ i0.ɵɵpipe(39, "number");
415
416
  i0.ɵɵelementEnd();
416
- i0.ɵɵelementStart(39, "span", 19);
417
- i0.ɵɵelement(40, "i", 20);
418
- i0.ɵɵtext(41, " Awaiting provider ");
417
+ i0.ɵɵelementStart(40, "span", 20);
418
+ i0.ɵɵelement(41, "i", 21);
419
+ i0.ɵɵtext(42, " Awaiting provider ");
419
420
  i0.ɵɵelementEnd()()();
420
- i0.ɵɵelementStart(42, "div", 21)(43, "div", 6);
421
- i0.ɵɵelement(44, "i", 22);
421
+ i0.ɵɵelementStart(43, "div", 22)(44, "div", 7);
422
+ i0.ɵɵelement(45, "i", 23);
422
423
  i0.ɵɵelementEnd();
423
- i0.ɵɵelementStart(45, "div", 8)(46, "span", 9);
424
- i0.ɵɵtext(47, "Failed");
424
+ i0.ɵɵelementStart(46, "div", 9)(47, "span", 10);
425
+ i0.ɵɵtext(48, "Failed");
425
426
  i0.ɵɵelementEnd();
426
- i0.ɵɵelementStart(48, "span", 10);
427
- i0.ɵɵtext(49);
428
- i0.ɵɵpipe(50, "number");
427
+ i0.ɵɵelementStart(49, "span", 11);
428
+ i0.ɵɵtext(50);
429
+ i0.ɵɵpipe(51, "number");
429
430
  i0.ɵɵelementEnd();
430
- i0.ɵɵelementStart(51, "span", 11);
431
- i0.ɵɵelement(52, "i", 12);
432
- i0.ɵɵtext(53);
431
+ i0.ɵɵelementStart(52, "span", 12);
432
+ i0.ɵɵelement(53, "i", 13);
433
+ i0.ɵɵtext(54);
433
434
  i0.ɵɵelementEnd()()()();
434
- i0.ɵɵelementStart(54, "div", 23)(55, "div", 24)(56, "div", 25)(57, "h3");
435
- i0.ɵɵelement(58, "i", 26);
436
- i0.ɵɵtext(59, " Delivery Volume");
435
+ i0.ɵɵelementStart(55, "div", 24)(56, "div", 25)(57, "div", 26)(58, "h3");
436
+ i0.ɵɵelement(59, "i", 27);
437
+ i0.ɵɵtext(60, " Delivery Volume");
437
438
  i0.ɵɵelementEnd()();
438
- i0.ɵɵelementStart(60, "div", 27);
439
- i0.ɵɵelement(61, "app-time-series-chart", 28);
439
+ i0.ɵɵelementStart(61, "div", 28);
440
+ i0.ɵɵelement(62, "app-time-series-chart", 29);
440
441
  i0.ɵɵelementEnd()();
441
- i0.ɵɵelementStart(62, "div", 24)(63, "div", 25)(64, "h3");
442
- i0.ɵɵelement(65, "i", 29);
443
- i0.ɵɵtext(66, " Recent Activity");
442
+ i0.ɵɵelementStart(63, "div", 25)(64, "div", 26)(65, "h3");
443
+ i0.ɵɵelement(66, "i", 30);
444
+ i0.ɵɵtext(67, " Recent Activity");
444
445
  i0.ɵɵelementEnd()();
445
- i0.ɵɵelementStart(67, "div", 30)(68, "div", 31);
446
- i0.ɵɵrepeaterCreate(69, CommunicationMonitorResourceComponent_For_70_Template, 11, 11, "div", 32, i0.ɵɵrepeaterTrackByIdentity);
447
- i0.ɵɵconditionalCreate(71, CommunicationMonitorResourceComponent_Conditional_71_Template, 4, 0, "div", 33);
446
+ i0.ɵɵelementStart(68, "div", 31)(69, "div", 32);
447
+ i0.ɵɵrepeaterCreate(70, CommunicationMonitorResourceComponent_For_71_Template, 11, 11, "div", 33, i0.ɵɵrepeaterTrackByIdentity);
448
+ i0.ɵɵconditionalCreate(72, CommunicationMonitorResourceComponent_Conditional_72_Template, 4, 0, "div", 34);
448
449
  i0.ɵɵelementEnd()()()();
449
- i0.ɵɵelementStart(72, "div", 23)(73, "div", 24)(74, "div", 25)(75, "h3");
450
- i0.ɵɵelement(76, "i", 34);
451
- i0.ɵɵtext(77, " Provider Health");
450
+ i0.ɵɵelementStart(73, "div", 24)(74, "div", 25)(75, "div", 26)(76, "h3");
451
+ i0.ɵɵelement(77, "i", 35);
452
+ i0.ɵɵtext(78, " Provider Health");
452
453
  i0.ɵɵelementEnd()();
453
- i0.ɵɵelementStart(78, "div", 30)(79, "div", 35);
454
- i0.ɵɵrepeaterCreate(80, CommunicationMonitorResourceComponent_For_81_Template, 13, 13, "div", 36, i0.ɵɵrepeaterTrackByIdentity);
455
- i0.ɵɵconditionalCreate(82, CommunicationMonitorResourceComponent_Conditional_82_Template, 4, 0, "div", 33);
454
+ i0.ɵɵelementStart(79, "div", 31)(80, "div", 36);
455
+ i0.ɵɵrepeaterCreate(81, CommunicationMonitorResourceComponent_For_82_Template, 13, 13, "div", 37, i0.ɵɵrepeaterTrackByIdentity);
456
+ i0.ɵɵconditionalCreate(83, CommunicationMonitorResourceComponent_Conditional_83_Template, 4, 0, "div", 34);
456
457
  i0.ɵɵelementEnd()()();
457
- i0.ɵɵelementStart(83, "div", 24)(84, "div", 25)(85, "h3");
458
- i0.ɵɵelement(86, "i", 37);
459
- i0.ɵɵtext(87, " Channel Breakdown");
458
+ i0.ɵɵelementStart(84, "div", 25)(85, "div", 26)(86, "h3");
459
+ i0.ɵɵelement(87, "i", 38);
460
+ i0.ɵɵtext(88, " Channel Breakdown");
460
461
  i0.ɵɵelementEnd()();
461
- i0.ɵɵelementStart(88, "div", 30)(89, "div", 38);
462
- i0.ɵɵrepeaterCreate(90, CommunicationMonitorResourceComponent_For_91_Template, 13, 12, "div", 39, i0.ɵɵrepeaterTrackByIdentity);
463
- i0.ɵɵconditionalCreate(92, CommunicationMonitorResourceComponent_Conditional_92_Template, 4, 0, "div", 33);
462
+ i0.ɵɵelementStart(89, "div", 31)(90, "div", 39);
463
+ i0.ɵɵrepeaterCreate(91, CommunicationMonitorResourceComponent_For_92_Template, 13, 12, "div", 40, i0.ɵɵrepeaterTrackByIdentity);
464
+ i0.ɵɵconditionalCreate(93, CommunicationMonitorResourceComponent_Conditional_93_Template, 4, 0, "div", 34);
464
465
  i0.ɵɵelementEnd()()()()()();
465
466
  } if (rf & 2) {
466
467
  i0.ɵɵadvance(3);
467
468
  i0.ɵɵproperty("disabled", ctx.isLoading);
468
469
  i0.ɵɵadvance();
469
470
  i0.ɵɵclassProp("spinning", ctx.isLoading);
470
- i0.ɵɵadvance(11);
471
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(16, 29, ctx.stats.totalSent));
471
+ i0.ɵɵadvance(12);
472
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(17, 29, ctx.stats.totalSent));
472
473
  i0.ɵɵadvance(2);
473
474
  i0.ɵɵclassMap(ctx.stats.totalSent > 0 ? "up" : "neutral");
474
475
  i0.ɵɵadvance();
@@ -478,9 +479,9 @@ let CommunicationMonitorResourceComponent = class CommunicationMonitorResourceCo
478
479
  i0.ɵɵadvance(2);
479
480
  i0.ɵɵstyleProp("width", ctx.stats.deliveryRate, "%");
480
481
  i0.ɵɵadvance(8);
481
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(38, 31, ctx.stats.pending));
482
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(39, 31, ctx.stats.pending));
482
483
  i0.ɵɵadvance(12);
483
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(50, 33, ctx.stats.failed));
484
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(51, 33, ctx.stats.failed));
484
485
  i0.ɵɵadvance(2);
485
486
  i0.ɵɵclassMap(ctx.stats.failed > 0 ? "down" : "neutral");
486
487
  i0.ɵɵadvance();
@@ -492,15 +493,15 @@ let CommunicationMonitorResourceComponent = class CommunicationMonitorResourceCo
492
493
  i0.ɵɵadvance(8);
493
494
  i0.ɵɵrepeater(ctx.recentLogs);
494
495
  i0.ɵɵadvance(2);
495
- i0.ɵɵconditional(ctx.recentLogs.length === 0 ? 71 : -1);
496
+ i0.ɵɵconditional(ctx.recentLogs.length === 0 ? 72 : -1);
496
497
  i0.ɵɵadvance(9);
497
498
  i0.ɵɵrepeater(ctx.providerHealth);
498
499
  i0.ɵɵadvance(2);
499
- i0.ɵɵconditional(ctx.providerHealth.length === 0 ? 82 : -1);
500
+ i0.ɵɵconditional(ctx.providerHealth.length === 0 ? 83 : -1);
500
501
  i0.ɵɵadvance(8);
501
502
  i0.ɵɵrepeater(ctx.channelBreakdown);
502
503
  i0.ɵɵadvance(2);
503
- i0.ɵɵconditional(ctx.channelBreakdown.length === 0 ? 92 : -1);
504
+ i0.ɵɵconditional(ctx.channelBreakdown.length === 0 ? 93 : -1);
504
505
  } }, dependencies: [i1.NgClass, i2.TimeSeriesChartComponent, i3.MJButtonDirective, i3.MJPageHeaderComponent, i3.MJPageLayoutComponent, i3.MJPageBodyComponent, i1.DecimalPipe, i1.DatePipe], styles: ["\n\n .kpi-strip[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n }\n .kpi-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n transition: all 0.15s ease;\n position: relative;\n overflow: hidden;\n }\n .kpi-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 2px 8px var(--mj-shadow-md);\n border-color: var(--mj-border-strong);\n }\n .kpi-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n top: 0; left: 0; right: 0;\n height: 3px;\n }\n .kpi-card.sent[_ngcontent-%COMP%]::before { background: var(--mj-brand-primary); }\n .kpi-card.delivered[_ngcontent-%COMP%]::before { background: var(--mj-status-success); }\n .kpi-card.pending[_ngcontent-%COMP%]::before { background: var(--mj-status-warning); }\n .kpi-card.failed[_ngcontent-%COMP%]::before { background: var(--mj-status-error); }\n\n .kpi-icon[_ngcontent-%COMP%] {\n width: 44px; height: 44px;\n border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .kpi-card.sent[_ngcontent-%COMP%] .kpi-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .kpi-card.delivered[_ngcontent-%COMP%] .kpi-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-card.pending[_ngcontent-%COMP%] .kpi-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n .kpi-card.failed[_ngcontent-%COMP%] .kpi-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .kpi-body[_ngcontent-%COMP%] { flex: 1; display: flex; flex-direction: column; gap: 2px; }\n .kpi-label[_ngcontent-%COMP%] {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n }\n .kpi-value[_ngcontent-%COMP%] {\n font-size: 28px; font-weight: 800;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em; line-height: 1.1;\n }\n .kpi-delta[_ngcontent-%COMP%] {\n display: inline-flex; align-items: center;\n gap: 4px; font-size: 11px; font-weight: 600;\n margin-top: 4px; padding: 2px 8px;\n border-radius: 10px; width: fit-content;\n }\n .kpi-delta.up[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-delta.down[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .kpi-delta.neutral[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .delivery-bar[_ngcontent-%COMP%] {\n height: 6px; margin-top: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .delivery-fill[_ngcontent-%COMP%] {\n height: 100%; border-radius: 3px;\n background: var(--mj-status-success); transition: width 0.6s ease;\n }\n\n \n\n .content-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1.6fr 1fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n .card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .card-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 13px; font-weight: 700;\n color: var(--mj-text-primary);\n display: flex; align-items: center; gap: 8px;\n margin: 0;\n }\n .card-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n .card-body[_ngcontent-%COMP%] { padding: 16px 20px; }\n .card-body.no-padding[_ngcontent-%COMP%] { padding: 0; }\n\n .chart-container-inner[_ngcontent-%COMP%] {\n padding: 16px 20px;\n min-height: 300px;\n }\n\n \n\n .activity-feed[_ngcontent-%COMP%] { max-height: 370px; overflow-y: auto; }\n .activity-item[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 12px;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease; cursor: pointer;\n }\n .activity-item[_ngcontent-%COMP%]:last-child { border-bottom: none; }\n .activity-item[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-sunken); }\n\n .activity-icon[_ngcontent-%COMP%] {\n width: 34px; height: 34px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; flex-shrink: 0;\n }\n .activity-icon.email[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .activity-icon.sms[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-icon.error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .activity-body[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n .activity-title[_ngcontent-%COMP%] {\n font-size: 12px; font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n display: block;\n }\n .activity-meta[_ngcontent-%COMP%] {\n font-size: 11px; color: var(--mj-text-muted); margin-top: 1px;\n display: block;\n }\n .activity-status[_ngcontent-%COMP%] {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.3px;\n padding: 3px 8px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n .activity-status.complete[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-status.failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .activity-status.pending[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n \n\n .provider-health-list[_ngcontent-%COMP%] { display: flex; flex-direction: column; }\n .provider-row[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease;\n }\n .provider-row[_ngcontent-%COMP%]:last-child { border-bottom: none; }\n .provider-row[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-sunken); }\n\n .provider-status-dot[_ngcontent-%COMP%] {\n width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;\n background: var(--mj-border-strong);\n }\n .provider-status-dot.active[_ngcontent-%COMP%] { background: var(--mj-status-success); }\n\n .provider-logo[_ngcontent-%COMP%] {\n width: 36px; height: 36px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .provider-logo.sendgrid[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n .provider-logo.twilio[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n .provider-logo.gmail[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n .provider-logo.msgraph[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n .provider-info[_ngcontent-%COMP%] { flex: 1; }\n .provider-name[_ngcontent-%COMP%] { font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n .provider-type[_ngcontent-%COMP%] { font-size: 11px; color: var(--mj-text-muted); }\n\n .provider-health-bar[_ngcontent-%COMP%] {\n width: 80px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .provider-health-fill[_ngcontent-%COMP%] {\n height: 100%; border-radius: 3px;\n transition: width 0.4s ease;\n }\n .provider-health-fill.excellent[_ngcontent-%COMP%] { background: var(--mj-status-success); }\n .provider-health-fill.good[_ngcontent-%COMP%] { background: var(--mj-status-success); }\n .provider-health-fill.warning[_ngcontent-%COMP%] { background: var(--mj-status-warning); }\n .provider-health-fill.critical[_ngcontent-%COMP%] { background: var(--mj-status-error); }\n\n .provider-rate[_ngcontent-%COMP%] {\n font-size: 12px; font-weight: 700;\n min-width: 44px; text-align: right;\n }\n .provider-rate.excellent[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n .provider-rate.good[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n .provider-rate.warning[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n .provider-rate.critical[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n\n \n\n .channel-breakdown[_ngcontent-%COMP%] { display: flex; flex-direction: column; }\n .channel-row[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .channel-row[_ngcontent-%COMP%]:last-child { border-bottom: none; }\n .channel-icon[_ngcontent-%COMP%] {\n width: 32px; height: 32px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 13px; flex-shrink: 0;\n }\n .channel-icon.email[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .channel-icon.sms[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .channel-info[_ngcontent-%COMP%] { flex: 1; }\n .channel-name[_ngcontent-%COMP%] { font-size: 12px; font-weight: 600; color: var(--mj-text-primary); }\n .channel-count[_ngcontent-%COMP%] { font-size: 11px; color: var(--mj-text-muted); }\n\n .channel-bar-wrapper[_ngcontent-%COMP%] {\n width: 100px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .channel-bar-fill[_ngcontent-%COMP%] { height: 100%; border-radius: 3px; }\n .channel-pct[_ngcontent-%COMP%] {\n font-size: 12px; font-weight: 700;\n color: var(--mj-text-primary);\n min-width: 36px; text-align: right;\n }\n\n \n\n .empty-state[_ngcontent-%COMP%] {\n display: flex; flex-direction: column;\n align-items: center; justify-content: center;\n padding: 40px 0; color: var(--mj-text-muted);\n }\n .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 2rem; margin-bottom: 12px; opacity: 0.5; }\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] { margin: 0; font-size: 13px; }\n\n @media (max-width: 1200px) {\n .kpi-strip[_ngcontent-%COMP%] { grid-template-columns: repeat(2, 1fr); }\n .content-grid[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n }"] });
505
506
  };
506
507
  CommunicationMonitorResourceComponent = __decorate([
@@ -517,7 +518,7 @@ export { CommunicationMonitorResourceComponent };
517
518
  Subtitle="Live delivery health, provider status, and channel breakdown">
518
519
  <div actions>
519
520
  <button mjButton variant="secondary" size="sm" (click)="loadData()" [disabled]="isLoading" title="Refresh">
520
- <i class="fa-solid fa-rotate" [class.spinning]="isLoading"></i> Refresh
521
+ <i class="fa-solid fa-rotate" [class.spinning]="isLoading"></i> <span class="action-btn-label">Refresh</span>
521
522
  </button>
522
523
  </div>
523
524
  </mj-page-header>
@@ -1 +1 @@
1
- {"version":3,"file":"communication-monitor-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-monitor-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { ResourceData, MJCommunicationLogEntity, MJCommunicationProviderEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RunView } from '@memberjunction/core';\n\ninterface ProviderHealth {\n Name: string;\n Type: string;\n SentCount: number;\n SuccessRate: number;\n IsActive: boolean;\n IconClass: string;\n ColorClass: string;\n}\n\ninterface ChannelBreakdown {\n Name: string;\n IconClass: string;\n Count: number;\n Percentage: number;\n ColorClass: string;\n}\n\ninterface HourlyBucket {\n timestamp: Date;\n executions: number;\n errors: number;\n cost: number;\n tokens: number;\n avgTime: number;\n}\n@RegisterClass(BaseResourceComponent, 'CommunicationMonitorResource')\n@Component({\n standalone: false,\n selector: 'mj-communication-monitor-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"Monitor\"\n Icon=\"fa-solid fa-chart-line\"\n Subtitle=\"Live delivery health, provider status, and channel breakdown\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"loadData()\" [disabled]=\"isLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\" [class.spinning]=\"isLoading\"></i> Refresh\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n <!-- KPI STRIP -->\n <div class=\"kpi-strip\">\n <div class=\"kpi-card sent\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-paper-plane\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Total Sent</span>\n <span class=\"kpi-value\">{{stats.totalSent | number}}</span>\n <span class=\"kpi-delta\" [class]=\"stats.totalSent > 0 ? 'up' : 'neutral'\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"stats.totalSent > 0\" [class.fa-minus]=\"stats.totalSent === 0\"></i>\n Last 24 hours\n </span>\n </div>\n </div>\n <div class=\"kpi-card delivered\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-check-double\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Delivery Rate</span>\n <span class=\"kpi-value\">{{stats.deliveryRate}}%</span>\n <div class=\"delivery-bar\">\n <div class=\"delivery-fill\" [style.width.%]=\"stats.deliveryRate\"></div>\n </div>\n </div>\n </div>\n <div class=\"kpi-card pending\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-clock\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Pending</span>\n <span class=\"kpi-value\">{{stats.pending | number}}</span>\n <span class=\"kpi-delta neutral\">\n <i class=\"fa-solid fa-minus\"></i> Awaiting provider\n </span>\n </div>\n </div>\n <div class=\"kpi-card failed\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-circle-exclamation\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Failed</span>\n <span class=\"kpi-value\">{{stats.failed | number}}</span>\n <span class=\"kpi-delta\" [class]=\"stats.failed > 0 ? 'down' : 'neutral'\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"stats.failed > 0\" [class.fa-minus]=\"stats.failed === 0\"></i>\n {{stats.failed > 0 ? 'Requires attention' : 'No failures'}}\n </span>\n </div>\n </div>\n </div>\n \n <!-- CHARTS + ACTIVITY ROW -->\n <div class=\"content-grid\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Delivery Volume</h3>\n </div>\n <div class=\"chart-container-inner\">\n <app-time-series-chart\n [data]=\"chartData\"\n [showLegend]=\"true\"\n [showControls]=\"false\"\n [config]=\"chartConfig\">\n </app-time-series-chart>\n </div>\n </div>\n \n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-bolt\"></i> Recent Activity</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"activity-feed\">\n @for (log of recentLogs; track log) {\n <div class=\"activity-item\">\n <div class=\"activity-icon\" [ngClass]=\"getActivityIconClass(log)\">\n <i [class]=\"getActivityIcon(log)\"></i>\n </div>\n <div class=\"activity-body\">\n <span class=\"activity-title\">{{log.CommunicationProviderMessageType || 'Message'}}</span>\n <span class=\"activity-meta\">{{log.CommunicationProvider}} &bull; {{log.MessageDate | date:'shortTime'}}</span>\n </div>\n <span class=\"activity-status\" [ngClass]=\"log.Status.toLowerCase()\">\n {{log.Status}}\n </span>\n </div>\n }\n @if (recentLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No recent activity</p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n \n <!-- PROVIDER HEALTH + CHANNEL BREAKDOWN -->\n <div class=\"content-grid\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-heart-pulse\"></i> Provider Health</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"provider-health-list\">\n @for (provider of providerHealth; track provider) {\n <div class=\"provider-row\">\n <div class=\"provider-status-dot\" [class.active]=\"provider.IsActive\"></div>\n <div class=\"provider-logo\" [ngClass]=\"provider.ColorClass\">\n <i [class]=\"provider.IconClass\"></i>\n </div>\n <div class=\"provider-info\">\n <div class=\"provider-name\">{{provider.Name}}</div>\n <div class=\"provider-type\">{{provider.Type}} &bull; {{provider.SentCount}} sent today</div>\n </div>\n <div class=\"provider-health-bar\">\n <div class=\"provider-health-fill\" [ngClass]=\"getHealthClass(provider.SuccessRate)\" [style.width.%]=\"provider.SuccessRate\"></div>\n </div>\n <span class=\"provider-rate\" [ngClass]=\"getHealthClass(provider.SuccessRate)\">{{provider.SuccessRate}}%</span>\n </div>\n }\n @if (providerHealth.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-server\"></i>\n <p>No providers configured</p>\n </div>\n }\n </div>\n </div>\n </div>\n \n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-layer-group\"></i> Channel Breakdown</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"channel-breakdown\">\n @for (channel of channelBreakdown; track channel) {\n <div class=\"channel-row\">\n <div class=\"channel-icon\" [ngClass]=\"channel.ColorClass\">\n <i [class]=\"channel.IconClass\"></i>\n </div>\n <div class=\"channel-info\">\n <div class=\"channel-name\">{{channel.Name}}</div>\n <div class=\"channel-count\">{{channel.Count | number}} messages</div>\n </div>\n <div class=\"channel-bar-wrapper\">\n <div class=\"channel-bar-fill\" [style.width.%]=\"channel.Percentage\" [style.background]=\"channel.ColorClass === 'email' ? 'var(--mj-brand-primary)' : 'var(--mj-status-success)'\"></div>\n </div>\n <span class=\"channel-pct\">{{channel.Percentage}}%</span>\n </div>\n }\n @if (channelBreakdown.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <p>No channel data available</p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n /* KPI STRIP */\n .kpi-strip {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n }\n .kpi-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n transition: all 0.15s ease;\n position: relative;\n overflow: hidden;\n }\n .kpi-card:hover {\n box-shadow: 0 2px 8px var(--mj-shadow-md);\n border-color: var(--mj-border-strong);\n }\n .kpi-card::before {\n content: '';\n position: absolute;\n top: 0; left: 0; right: 0;\n height: 3px;\n }\n .kpi-card.sent::before { background: var(--mj-brand-primary); }\n .kpi-card.delivered::before { background: var(--mj-status-success); }\n .kpi-card.pending::before { background: var(--mj-status-warning); }\n .kpi-card.failed::before { background: var(--mj-status-error); }\n\n .kpi-icon {\n width: 44px; height: 44px;\n border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .kpi-card.sent .kpi-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .kpi-card.delivered .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-card.pending .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n .kpi-card.failed .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .kpi-body { flex: 1; display: flex; flex-direction: column; gap: 2px; }\n .kpi-label {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n }\n .kpi-value {\n font-size: 28px; font-weight: 800;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em; line-height: 1.1;\n }\n .kpi-delta {\n display: inline-flex; align-items: center;\n gap: 4px; font-size: 11px; font-weight: 600;\n margin-top: 4px; padding: 2px 8px;\n border-radius: 10px; width: fit-content;\n }\n .kpi-delta.up {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-delta.down {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .kpi-delta.neutral {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .delivery-bar {\n height: 6px; margin-top: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .delivery-fill {\n height: 100%; border-radius: 3px;\n background: var(--mj-status-success); transition: width 0.6s ease;\n }\n\n /* CONTENT GRID */\n .content-grid {\n display: grid;\n grid-template-columns: 1.6fr 1fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .card-header h3 {\n font-size: 13px; font-weight: 700;\n color: var(--mj-text-primary);\n display: flex; align-items: center; gap: 8px;\n margin: 0;\n }\n .card-header h3 i {\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n .card-body { padding: 16px 20px; }\n .card-body.no-padding { padding: 0; }\n\n .chart-container-inner {\n padding: 16px 20px;\n min-height: 300px;\n }\n\n /* ACTIVITY FEED */\n .activity-feed { max-height: 370px; overflow-y: auto; }\n .activity-item {\n display: flex; align-items: center; gap: 12px;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease; cursor: pointer;\n }\n .activity-item:last-child { border-bottom: none; }\n .activity-item:hover { background: var(--mj-bg-surface-sunken); }\n\n .activity-icon {\n width: 34px; height: 34px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; flex-shrink: 0;\n }\n .activity-icon.email {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .activity-icon.sms {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-icon.error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .activity-body { flex: 1; min-width: 0; }\n .activity-title {\n font-size: 12px; font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n display: block;\n }\n .activity-meta {\n font-size: 11px; color: var(--mj-text-muted); margin-top: 1px;\n display: block;\n }\n .activity-status {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.3px;\n padding: 3px 8px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n .activity-status.complete {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-status.failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .activity-status.pending {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n /* PROVIDER HEALTH */\n .provider-health-list { display: flex; flex-direction: column; }\n .provider-row {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease;\n }\n .provider-row:last-child { border-bottom: none; }\n .provider-row:hover { background: var(--mj-bg-surface-sunken); }\n\n .provider-status-dot {\n width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;\n background: var(--mj-border-strong);\n }\n .provider-status-dot.active { background: var(--mj-status-success); }\n\n .provider-logo {\n width: 36px; height: 36px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .provider-logo.sendgrid { color: var(--mj-brand-primary); }\n .provider-logo.twilio { color: var(--mj-status-error); }\n .provider-logo.gmail { color: var(--mj-status-error); }\n .provider-logo.msgraph { color: var(--mj-brand-primary); }\n\n .provider-info { flex: 1; }\n .provider-name { font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n .provider-type { font-size: 11px; color: var(--mj-text-muted); }\n\n .provider-health-bar {\n width: 80px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .provider-health-fill {\n height: 100%; border-radius: 3px;\n transition: width 0.4s ease;\n }\n .provider-health-fill.excellent { background: var(--mj-status-success); }\n .provider-health-fill.good { background: var(--mj-status-success); }\n .provider-health-fill.warning { background: var(--mj-status-warning); }\n .provider-health-fill.critical { background: var(--mj-status-error); }\n\n .provider-rate {\n font-size: 12px; font-weight: 700;\n min-width: 44px; text-align: right;\n }\n .provider-rate.excellent { color: var(--mj-status-success); }\n .provider-rate.good { color: var(--mj-status-success); }\n .provider-rate.warning { color: var(--mj-status-warning); }\n .provider-rate.critical { color: var(--mj-status-error); }\n\n /* CHANNEL BREAKDOWN */\n .channel-breakdown { display: flex; flex-direction: column; }\n .channel-row {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .channel-row:last-child { border-bottom: none; }\n .channel-icon {\n width: 32px; height: 32px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 13px; flex-shrink: 0;\n }\n .channel-icon.email {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .channel-icon.sms {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .channel-info { flex: 1; }\n .channel-name { font-size: 12px; font-weight: 600; color: var(--mj-text-primary); }\n .channel-count { font-size: 11px; color: var(--mj-text-muted); }\n\n .channel-bar-wrapper {\n width: 100px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .channel-bar-fill { height: 100%; border-radius: 3px; }\n .channel-pct {\n font-size: 12px; font-weight: 700;\n color: var(--mj-text-primary);\n min-width: 36px; text-align: right;\n }\n\n /* EMPTY STATE */\n .empty-state {\n display: flex; flex-direction: column;\n align-items: center; justify-content: center;\n padding: 40px 0; color: var(--mj-text-muted);\n }\n .empty-state i { font-size: 2rem; margin-bottom: 12px; opacity: 0.5; }\n .empty-state p { margin: 0; font-size: 13px; }\n\n @media (max-width: 1200px) {\n .kpi-strip { grid-template-columns: repeat(2, 1fr); }\n .content-grid { grid-template-columns: 1fr; }\n }\n `]\n})\nexport class CommunicationMonitorResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = false;\n public stats = {\n totalSent: 0,\n deliveryRate: 0,\n pending: 0,\n failed: 0\n };\n public recentLogs: MJCommunicationLogEntity[] = [];\n public chartData: HourlyBucket[] = [];\n public chartConfig = {\n useDualAxis: false,\n showGrid: true,\n showTooltip: true,\n colors: ['#4f6bed', '#cf222e']\n };\n public providerHealth: ProviderHealth[] = [];\n public channelBreakdown: ChannelBreakdown[] = [];\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n public async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n const yesterdayIso = yesterday.toISOString();\n\n const [totalResult, failedResult, pendingResult, recentResult, allLogsResult, providersResult] = await Promise.all([\n rv.RunView({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n ResultType: 'count_only'\n }),\n rv.RunView({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}' AND Status = 'Failed'`,\n ResultType: 'count_only'\n }),\n rv.RunView({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `Status = 'Pending'`,\n ResultType: 'count_only'\n }),\n rv.RunView<MJCommunicationLogEntity>({\n EntityName: 'MJ: Communication Logs',\n OrderBy: 'MessageDate DESC',\n MaxRows: 8,\n ResultType: 'entity_object'\n }),\n rv.RunView<MJCommunicationLogEntity>({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n OrderBy: 'MessageDate ASC',\n ResultType: 'entity_object'\n }),\n rv.RunView<MJCommunicationProviderEntity>({\n EntityName: 'MJ: Communication Providers',\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n })\n ]);\n\n if (totalResult.Success) this.stats.totalSent = totalResult.TotalRowCount;\n if (failedResult.Success) this.stats.failed = failedResult.TotalRowCount;\n if (pendingResult.Success) this.stats.pending = pendingResult.TotalRowCount;\n\n this.stats.deliveryRate = this.stats.totalSent > 0\n ? parseFloat(((this.stats.totalSent - this.stats.failed) / this.stats.totalSent * 100).toFixed(1))\n : 100;\n\n if (recentResult.Success) {\n this.recentLogs = recentResult.Results;\n }\n\n if (allLogsResult.Success) {\n this.chartData = this.processTrendData(allLogsResult.Results, yesterday);\n this.channelBreakdown = this.buildChannelBreakdown(allLogsResult.Results);\n }\n\n if (providersResult.Success && allLogsResult.Success) {\n this.providerHealth = this.buildProviderHealth(providersResult.Results, allLogsResult.Results);\n }\n\n } catch (error) {\n console.error('Error loading monitor data:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public getActivityIconClass(log: MJCommunicationLogEntity): string {\n if (log.Status === 'Failed') return 'error';\n const type = (log.CommunicationProviderMessageType || '').toLowerCase();\n if (type.includes('sms')) return 'sms';\n return 'email';\n }\n\n public getActivityIcon(log: MJCommunicationLogEntity): string {\n if (log.Direction === 'Receiving') return 'fa-solid fa-arrow-down';\n const type = (log.CommunicationProviderMessageType || '').toLowerCase();\n if (type.includes('sms')) return 'fa-solid fa-comment-sms';\n return 'fa-solid fa-envelope';\n }\n\n public getHealthClass(rate: number): string {\n if (rate >= 98) return 'excellent';\n if (rate >= 95) return 'good';\n if (rate >= 85) return 'warning';\n return 'critical';\n }\n\n private processTrendData(logs: MJCommunicationLogEntity[], startTime: Date): HourlyBucket[] {\n const buckets: HourlyBucket[] = [];\n const now = new Date();\n const current = new Date(startTime);\n current.setMinutes(0, 0, 0);\n\n while (current <= now) {\n const bucketStart = new Date(current);\n const bucketEnd = new Date(current.getTime() + 60 * 60 * 1000);\n const bucketLogs = logs.filter(l => {\n const d = new Date(l.MessageDate);\n return d >= bucketStart && d < bucketEnd;\n });\n\n buckets.push({\n timestamp: bucketStart,\n executions: bucketLogs.length,\n errors: bucketLogs.filter(l => l.Status === 'Failed').length,\n cost: 0,\n tokens: 0,\n avgTime: 0\n });\n current.setHours(current.getHours() + 1);\n }\n return buckets;\n }\n\n private buildProviderHealth(providers: MJCommunicationProviderEntity[], logs: MJCommunicationLogEntity[]): ProviderHealth[] {\n return providers.map(p => {\n const providerLogs = logs.filter(l => l.CommunicationProvider === p.Name);\n const sent = providerLogs.length;\n const failed = providerLogs.filter(l => l.Status === 'Failed').length;\n const rate = sent > 0 ? parseFloat(((sent - failed) / sent * 100).toFixed(1)) : 100;\n\n return {\n Name: p.Name,\n Type: this.getProviderType(p.Name),\n SentCount: sent,\n SuccessRate: rate,\n IsActive: p.Status === 'Active',\n IconClass: this.getProviderIconClass(p.Name),\n ColorClass: this.getProviderColorClass(p.Name)\n };\n });\n }\n\n private buildChannelBreakdown(logs: MJCommunicationLogEntity[]): ChannelBreakdown[] {\n const total = logs.length;\n if (total === 0) return [];\n\n const emailLogs = logs.filter(l => {\n const type = (l.CommunicationProviderMessageType || '').toLowerCase();\n return type.includes('email') || (!type.includes('sms'));\n });\n const smsLogs = logs.filter(l => {\n const type = (l.CommunicationProviderMessageType || '').toLowerCase();\n return type.includes('sms');\n });\n\n const channels: ChannelBreakdown[] = [];\n if (emailLogs.length > 0) {\n channels.push({\n Name: 'Email',\n IconClass: 'fa-solid fa-envelope',\n Count: emailLogs.length,\n Percentage: Math.round((emailLogs.length / total) * 100),\n ColorClass: 'email'\n });\n }\n if (smsLogs.length > 0) {\n channels.push({\n Name: 'SMS',\n IconClass: 'fa-solid fa-comment-sms',\n Count: smsLogs.length,\n Percentage: Math.round((smsLogs.length / total) * 100),\n ColorClass: 'sms'\n });\n }\n return channels;\n }\n\n private getProviderType(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('twilio')) return 'SMS';\n return 'Email';\n }\n\n private getProviderIconClass(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('sendgrid')) return 'fa-solid fa-envelope';\n if (n.includes('twilio')) return 'fa-solid fa-comment-sms';\n if (n.includes('gmail') || n.includes('google')) return 'fa-brands fa-google';\n if (n.includes('microsoft') || n.includes('graph') || n.includes('outlook')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-server';\n }\n\n private getProviderColorClass(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('sendgrid')) return 'sendgrid';\n if (n.includes('twilio')) return 'twilio';\n if (n.includes('gmail') || n.includes('google')) return 'gmail';\n if (n.includes('microsoft') || n.includes('graph') || n.includes('outlook')) return 'msgraph';\n return '';\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Monitor';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n}\n"]}
1
+ {"version":3,"file":"communication-monitor-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-monitor-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { ResourceData, MJCommunicationLogEntity, MJCommunicationProviderEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RunView } from '@memberjunction/core';\n\ninterface ProviderHealth {\n Name: string;\n Type: string;\n SentCount: number;\n SuccessRate: number;\n IsActive: boolean;\n IconClass: string;\n ColorClass: string;\n}\n\ninterface ChannelBreakdown {\n Name: string;\n IconClass: string;\n Count: number;\n Percentage: number;\n ColorClass: string;\n}\n\ninterface HourlyBucket {\n timestamp: Date;\n executions: number;\n errors: number;\n cost: number;\n tokens: number;\n avgTime: number;\n}\n@RegisterClass(BaseResourceComponent, 'CommunicationMonitorResource')\n@Component({\n standalone: false,\n selector: 'mj-communication-monitor-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"Monitor\"\n Icon=\"fa-solid fa-chart-line\"\n Subtitle=\"Live delivery health, provider status, and channel breakdown\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"loadData()\" [disabled]=\"isLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\" [class.spinning]=\"isLoading\"></i> <span class=\"action-btn-label\">Refresh</span>\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n <!-- KPI STRIP -->\n <div class=\"kpi-strip\">\n <div class=\"kpi-card sent\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-paper-plane\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Total Sent</span>\n <span class=\"kpi-value\">{{stats.totalSent | number}}</span>\n <span class=\"kpi-delta\" [class]=\"stats.totalSent > 0 ? 'up' : 'neutral'\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"stats.totalSent > 0\" [class.fa-minus]=\"stats.totalSent === 0\"></i>\n Last 24 hours\n </span>\n </div>\n </div>\n <div class=\"kpi-card delivered\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-check-double\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Delivery Rate</span>\n <span class=\"kpi-value\">{{stats.deliveryRate}}%</span>\n <div class=\"delivery-bar\">\n <div class=\"delivery-fill\" [style.width.%]=\"stats.deliveryRate\"></div>\n </div>\n </div>\n </div>\n <div class=\"kpi-card pending\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-clock\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Pending</span>\n <span class=\"kpi-value\">{{stats.pending | number}}</span>\n <span class=\"kpi-delta neutral\">\n <i class=\"fa-solid fa-minus\"></i> Awaiting provider\n </span>\n </div>\n </div>\n <div class=\"kpi-card failed\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-circle-exclamation\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Failed</span>\n <span class=\"kpi-value\">{{stats.failed | number}}</span>\n <span class=\"kpi-delta\" [class]=\"stats.failed > 0 ? 'down' : 'neutral'\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"stats.failed > 0\" [class.fa-minus]=\"stats.failed === 0\"></i>\n {{stats.failed > 0 ? 'Requires attention' : 'No failures'}}\n </span>\n </div>\n </div>\n </div>\n \n <!-- CHARTS + ACTIVITY ROW -->\n <div class=\"content-grid\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Delivery Volume</h3>\n </div>\n <div class=\"chart-container-inner\">\n <app-time-series-chart\n [data]=\"chartData\"\n [showLegend]=\"true\"\n [showControls]=\"false\"\n [config]=\"chartConfig\">\n </app-time-series-chart>\n </div>\n </div>\n \n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-bolt\"></i> Recent Activity</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"activity-feed\">\n @for (log of recentLogs; track log) {\n <div class=\"activity-item\">\n <div class=\"activity-icon\" [ngClass]=\"getActivityIconClass(log)\">\n <i [class]=\"getActivityIcon(log)\"></i>\n </div>\n <div class=\"activity-body\">\n <span class=\"activity-title\">{{log.CommunicationProviderMessageType || 'Message'}}</span>\n <span class=\"activity-meta\">{{log.CommunicationProvider}} &bull; {{log.MessageDate | date:'shortTime'}}</span>\n </div>\n <span class=\"activity-status\" [ngClass]=\"log.Status.toLowerCase()\">\n {{log.Status}}\n </span>\n </div>\n }\n @if (recentLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No recent activity</p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n \n <!-- PROVIDER HEALTH + CHANNEL BREAKDOWN -->\n <div class=\"content-grid\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-heart-pulse\"></i> Provider Health</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"provider-health-list\">\n @for (provider of providerHealth; track provider) {\n <div class=\"provider-row\">\n <div class=\"provider-status-dot\" [class.active]=\"provider.IsActive\"></div>\n <div class=\"provider-logo\" [ngClass]=\"provider.ColorClass\">\n <i [class]=\"provider.IconClass\"></i>\n </div>\n <div class=\"provider-info\">\n <div class=\"provider-name\">{{provider.Name}}</div>\n <div class=\"provider-type\">{{provider.Type}} &bull; {{provider.SentCount}} sent today</div>\n </div>\n <div class=\"provider-health-bar\">\n <div class=\"provider-health-fill\" [ngClass]=\"getHealthClass(provider.SuccessRate)\" [style.width.%]=\"provider.SuccessRate\"></div>\n </div>\n <span class=\"provider-rate\" [ngClass]=\"getHealthClass(provider.SuccessRate)\">{{provider.SuccessRate}}%</span>\n </div>\n }\n @if (providerHealth.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-server\"></i>\n <p>No providers configured</p>\n </div>\n }\n </div>\n </div>\n </div>\n \n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-layer-group\"></i> Channel Breakdown</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"channel-breakdown\">\n @for (channel of channelBreakdown; track channel) {\n <div class=\"channel-row\">\n <div class=\"channel-icon\" [ngClass]=\"channel.ColorClass\">\n <i [class]=\"channel.IconClass\"></i>\n </div>\n <div class=\"channel-info\">\n <div class=\"channel-name\">{{channel.Name}}</div>\n <div class=\"channel-count\">{{channel.Count | number}} messages</div>\n </div>\n <div class=\"channel-bar-wrapper\">\n <div class=\"channel-bar-fill\" [style.width.%]=\"channel.Percentage\" [style.background]=\"channel.ColorClass === 'email' ? 'var(--mj-brand-primary)' : 'var(--mj-status-success)'\"></div>\n </div>\n <span class=\"channel-pct\">{{channel.Percentage}}%</span>\n </div>\n }\n @if (channelBreakdown.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <p>No channel data available</p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n /* KPI STRIP */\n .kpi-strip {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n }\n .kpi-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n transition: all 0.15s ease;\n position: relative;\n overflow: hidden;\n }\n .kpi-card:hover {\n box-shadow: 0 2px 8px var(--mj-shadow-md);\n border-color: var(--mj-border-strong);\n }\n .kpi-card::before {\n content: '';\n position: absolute;\n top: 0; left: 0; right: 0;\n height: 3px;\n }\n .kpi-card.sent::before { background: var(--mj-brand-primary); }\n .kpi-card.delivered::before { background: var(--mj-status-success); }\n .kpi-card.pending::before { background: var(--mj-status-warning); }\n .kpi-card.failed::before { background: var(--mj-status-error); }\n\n .kpi-icon {\n width: 44px; height: 44px;\n border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .kpi-card.sent .kpi-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .kpi-card.delivered .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-card.pending .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n .kpi-card.failed .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .kpi-body { flex: 1; display: flex; flex-direction: column; gap: 2px; }\n .kpi-label {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n }\n .kpi-value {\n font-size: 28px; font-weight: 800;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em; line-height: 1.1;\n }\n .kpi-delta {\n display: inline-flex; align-items: center;\n gap: 4px; font-size: 11px; font-weight: 600;\n margin-top: 4px; padding: 2px 8px;\n border-radius: 10px; width: fit-content;\n }\n .kpi-delta.up {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-delta.down {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .kpi-delta.neutral {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .delivery-bar {\n height: 6px; margin-top: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .delivery-fill {\n height: 100%; border-radius: 3px;\n background: var(--mj-status-success); transition: width 0.6s ease;\n }\n\n /* CONTENT GRID */\n .content-grid {\n display: grid;\n grid-template-columns: 1.6fr 1fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .card-header h3 {\n font-size: 13px; font-weight: 700;\n color: var(--mj-text-primary);\n display: flex; align-items: center; gap: 8px;\n margin: 0;\n }\n .card-header h3 i {\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n .card-body { padding: 16px 20px; }\n .card-body.no-padding { padding: 0; }\n\n .chart-container-inner {\n padding: 16px 20px;\n min-height: 300px;\n }\n\n /* ACTIVITY FEED */\n .activity-feed { max-height: 370px; overflow-y: auto; }\n .activity-item {\n display: flex; align-items: center; gap: 12px;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease; cursor: pointer;\n }\n .activity-item:last-child { border-bottom: none; }\n .activity-item:hover { background: var(--mj-bg-surface-sunken); }\n\n .activity-icon {\n width: 34px; height: 34px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; flex-shrink: 0;\n }\n .activity-icon.email {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .activity-icon.sms {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-icon.error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .activity-body { flex: 1; min-width: 0; }\n .activity-title {\n font-size: 12px; font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n display: block;\n }\n .activity-meta {\n font-size: 11px; color: var(--mj-text-muted); margin-top: 1px;\n display: block;\n }\n .activity-status {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.3px;\n padding: 3px 8px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n .activity-status.complete {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-status.failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .activity-status.pending {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n /* PROVIDER HEALTH */\n .provider-health-list { display: flex; flex-direction: column; }\n .provider-row {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease;\n }\n .provider-row:last-child { border-bottom: none; }\n .provider-row:hover { background: var(--mj-bg-surface-sunken); }\n\n .provider-status-dot {\n width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;\n background: var(--mj-border-strong);\n }\n .provider-status-dot.active { background: var(--mj-status-success); }\n\n .provider-logo {\n width: 36px; height: 36px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .provider-logo.sendgrid { color: var(--mj-brand-primary); }\n .provider-logo.twilio { color: var(--mj-status-error); }\n .provider-logo.gmail { color: var(--mj-status-error); }\n .provider-logo.msgraph { color: var(--mj-brand-primary); }\n\n .provider-info { flex: 1; }\n .provider-name { font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n .provider-type { font-size: 11px; color: var(--mj-text-muted); }\n\n .provider-health-bar {\n width: 80px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .provider-health-fill {\n height: 100%; border-radius: 3px;\n transition: width 0.4s ease;\n }\n .provider-health-fill.excellent { background: var(--mj-status-success); }\n .provider-health-fill.good { background: var(--mj-status-success); }\n .provider-health-fill.warning { background: var(--mj-status-warning); }\n .provider-health-fill.critical { background: var(--mj-status-error); }\n\n .provider-rate {\n font-size: 12px; font-weight: 700;\n min-width: 44px; text-align: right;\n }\n .provider-rate.excellent { color: var(--mj-status-success); }\n .provider-rate.good { color: var(--mj-status-success); }\n .provider-rate.warning { color: var(--mj-status-warning); }\n .provider-rate.critical { color: var(--mj-status-error); }\n\n /* CHANNEL BREAKDOWN */\n .channel-breakdown { display: flex; flex-direction: column; }\n .channel-row {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .channel-row:last-child { border-bottom: none; }\n .channel-icon {\n width: 32px; height: 32px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 13px; flex-shrink: 0;\n }\n .channel-icon.email {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .channel-icon.sms {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .channel-info { flex: 1; }\n .channel-name { font-size: 12px; font-weight: 600; color: var(--mj-text-primary); }\n .channel-count { font-size: 11px; color: var(--mj-text-muted); }\n\n .channel-bar-wrapper {\n width: 100px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .channel-bar-fill { height: 100%; border-radius: 3px; }\n .channel-pct {\n font-size: 12px; font-weight: 700;\n color: var(--mj-text-primary);\n min-width: 36px; text-align: right;\n }\n\n /* EMPTY STATE */\n .empty-state {\n display: flex; flex-direction: column;\n align-items: center; justify-content: center;\n padding: 40px 0; color: var(--mj-text-muted);\n }\n .empty-state i { font-size: 2rem; margin-bottom: 12px; opacity: 0.5; }\n .empty-state p { margin: 0; font-size: 13px; }\n\n @media (max-width: 1200px) {\n .kpi-strip { grid-template-columns: repeat(2, 1fr); }\n .content-grid { grid-template-columns: 1fr; }\n }\n `]\n})\nexport class CommunicationMonitorResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = false;\n public stats = {\n totalSent: 0,\n deliveryRate: 0,\n pending: 0,\n failed: 0\n };\n public recentLogs: MJCommunicationLogEntity[] = [];\n public chartData: HourlyBucket[] = [];\n public chartConfig = {\n useDualAxis: false,\n showGrid: true,\n showTooltip: true,\n colors: ['#4f6bed', '#cf222e']\n };\n public providerHealth: ProviderHealth[] = [];\n public channelBreakdown: ChannelBreakdown[] = [];\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n public async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n const yesterdayIso = yesterday.toISOString();\n\n const [totalResult, failedResult, pendingResult, recentResult, allLogsResult, providersResult] = await Promise.all([\n rv.RunView({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n ResultType: 'count_only'\n }),\n rv.RunView({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}' AND Status = 'Failed'`,\n ResultType: 'count_only'\n }),\n rv.RunView({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `Status = 'Pending'`,\n ResultType: 'count_only'\n }),\n rv.RunView<MJCommunicationLogEntity>({\n EntityName: 'MJ: Communication Logs',\n OrderBy: 'MessageDate DESC',\n MaxRows: 8,\n ResultType: 'entity_object'\n }),\n rv.RunView<MJCommunicationLogEntity>({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n OrderBy: 'MessageDate ASC',\n ResultType: 'entity_object'\n }),\n rv.RunView<MJCommunicationProviderEntity>({\n EntityName: 'MJ: Communication Providers',\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n })\n ]);\n\n if (totalResult.Success) this.stats.totalSent = totalResult.TotalRowCount;\n if (failedResult.Success) this.stats.failed = failedResult.TotalRowCount;\n if (pendingResult.Success) this.stats.pending = pendingResult.TotalRowCount;\n\n this.stats.deliveryRate = this.stats.totalSent > 0\n ? parseFloat(((this.stats.totalSent - this.stats.failed) / this.stats.totalSent * 100).toFixed(1))\n : 100;\n\n if (recentResult.Success) {\n this.recentLogs = recentResult.Results;\n }\n\n if (allLogsResult.Success) {\n this.chartData = this.processTrendData(allLogsResult.Results, yesterday);\n this.channelBreakdown = this.buildChannelBreakdown(allLogsResult.Results);\n }\n\n if (providersResult.Success && allLogsResult.Success) {\n this.providerHealth = this.buildProviderHealth(providersResult.Results, allLogsResult.Results);\n }\n\n } catch (error) {\n console.error('Error loading monitor data:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public getActivityIconClass(log: MJCommunicationLogEntity): string {\n if (log.Status === 'Failed') return 'error';\n const type = (log.CommunicationProviderMessageType || '').toLowerCase();\n if (type.includes('sms')) return 'sms';\n return 'email';\n }\n\n public getActivityIcon(log: MJCommunicationLogEntity): string {\n if (log.Direction === 'Receiving') return 'fa-solid fa-arrow-down';\n const type = (log.CommunicationProviderMessageType || '').toLowerCase();\n if (type.includes('sms')) return 'fa-solid fa-comment-sms';\n return 'fa-solid fa-envelope';\n }\n\n public getHealthClass(rate: number): string {\n if (rate >= 98) return 'excellent';\n if (rate >= 95) return 'good';\n if (rate >= 85) return 'warning';\n return 'critical';\n }\n\n private processTrendData(logs: MJCommunicationLogEntity[], startTime: Date): HourlyBucket[] {\n const buckets: HourlyBucket[] = [];\n const now = new Date();\n const current = new Date(startTime);\n current.setMinutes(0, 0, 0);\n\n while (current <= now) {\n const bucketStart = new Date(current);\n const bucketEnd = new Date(current.getTime() + 60 * 60 * 1000);\n const bucketLogs = logs.filter(l => {\n const d = new Date(l.MessageDate);\n return d >= bucketStart && d < bucketEnd;\n });\n\n buckets.push({\n timestamp: bucketStart,\n executions: bucketLogs.length,\n errors: bucketLogs.filter(l => l.Status === 'Failed').length,\n cost: 0,\n tokens: 0,\n avgTime: 0\n });\n current.setHours(current.getHours() + 1);\n }\n return buckets;\n }\n\n private buildProviderHealth(providers: MJCommunicationProviderEntity[], logs: MJCommunicationLogEntity[]): ProviderHealth[] {\n return providers.map(p => {\n const providerLogs = logs.filter(l => l.CommunicationProvider === p.Name);\n const sent = providerLogs.length;\n const failed = providerLogs.filter(l => l.Status === 'Failed').length;\n const rate = sent > 0 ? parseFloat(((sent - failed) / sent * 100).toFixed(1)) : 100;\n\n return {\n Name: p.Name,\n Type: this.getProviderType(p.Name),\n SentCount: sent,\n SuccessRate: rate,\n IsActive: p.Status === 'Active',\n IconClass: this.getProviderIconClass(p.Name),\n ColorClass: this.getProviderColorClass(p.Name)\n };\n });\n }\n\n private buildChannelBreakdown(logs: MJCommunicationLogEntity[]): ChannelBreakdown[] {\n const total = logs.length;\n if (total === 0) return [];\n\n const emailLogs = logs.filter(l => {\n const type = (l.CommunicationProviderMessageType || '').toLowerCase();\n return type.includes('email') || (!type.includes('sms'));\n });\n const smsLogs = logs.filter(l => {\n const type = (l.CommunicationProviderMessageType || '').toLowerCase();\n return type.includes('sms');\n });\n\n const channels: ChannelBreakdown[] = [];\n if (emailLogs.length > 0) {\n channels.push({\n Name: 'Email',\n IconClass: 'fa-solid fa-envelope',\n Count: emailLogs.length,\n Percentage: Math.round((emailLogs.length / total) * 100),\n ColorClass: 'email'\n });\n }\n if (smsLogs.length > 0) {\n channels.push({\n Name: 'SMS',\n IconClass: 'fa-solid fa-comment-sms',\n Count: smsLogs.length,\n Percentage: Math.round((smsLogs.length / total) * 100),\n ColorClass: 'sms'\n });\n }\n return channels;\n }\n\n private getProviderType(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('twilio')) return 'SMS';\n return 'Email';\n }\n\n private getProviderIconClass(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('sendgrid')) return 'fa-solid fa-envelope';\n if (n.includes('twilio')) return 'fa-solid fa-comment-sms';\n if (n.includes('gmail') || n.includes('google')) return 'fa-brands fa-google';\n if (n.includes('microsoft') || n.includes('graph') || n.includes('outlook')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-server';\n }\n\n private getProviderColorClass(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('sendgrid')) return 'sendgrid';\n if (n.includes('twilio')) return 'twilio';\n if (n.includes('gmail') || n.includes('google')) return 'gmail';\n if (n.includes('microsoft') || n.includes('graph') || n.includes('outlook')) return 'msgraph';\n return '';\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Monitor';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n}\n"]}