@memberjunction/ng-dashboards 5.30.0 → 5.31.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 (424) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  2. package/dist/AI/components/agents/agent-configuration.component.js +4 -4
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.d.ts +2 -1
  5. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  6. package/dist/AI/components/agents/agent-editor.component.js +8 -6
  7. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  8. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +2 -1
  9. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
  10. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +6 -5
  11. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  12. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +2 -1
  13. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  14. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +6 -5
  15. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  16. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +2 -1
  17. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
  18. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +6 -5
  19. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
  20. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +2 -1
  21. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  22. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +7 -4
  23. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  24. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +3 -2
  25. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  26. package/dist/AI/components/analytics/model-performance/model-performance.component.js +10 -6
  27. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  28. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +2 -1
  29. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  30. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +6 -5
  31. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  32. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +2 -1
  33. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  34. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +6 -5
  35. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  36. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  37. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +55 -52
  38. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  39. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -15
  40. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  41. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  42. package/dist/AI/components/execution-monitoring.component.js +4 -3
  43. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  44. package/dist/AI/components/models/model-management.component.js +2 -2
  45. package/dist/AI/components/models/model-management.component.js.map +1 -1
  46. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -1
  47. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  48. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +10 -8
  49. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  50. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  51. package/dist/AI/components/prompts/prompt-management.component.js +2 -2
  52. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  53. package/dist/AI/components/prompts/prompt-version-control.component.d.ts +2 -1
  54. package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
  55. package/dist/AI/components/prompts/prompt-version-control.component.js +13 -10
  56. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  57. package/dist/AI/components/requests/agent-requests-resource.component.js +1 -1
  58. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  59. package/dist/AI/components/tags/tags-resource.component.d.ts +1181 -0
  60. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -0
  61. package/dist/AI/components/tags/tags-resource.component.js +7487 -0
  62. package/dist/AI/components/tags/tags-resource.component.js.map +1 -0
  63. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  64. package/dist/AI/components/vectors/vector-management-resource.component.js +25 -21
  65. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  66. package/dist/AI/index.d.ts +1 -0
  67. package/dist/AI/index.d.ts.map +1 -1
  68. package/dist/AI/index.js +5 -0
  69. package/dist/AI/index.js.map +1 -1
  70. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  71. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  72. package/dist/AI/services/ai-instrumentation.service.js +12 -4
  73. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  74. package/dist/APIKeys/api-applications-panel.component.d.ts +3 -2
  75. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  76. package/dist/APIKeys/api-applications-panel.component.js +5 -4
  77. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  78. package/dist/APIKeys/api-key-create-dialog.component.d.ts +2 -1
  79. package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
  80. package/dist/APIKeys/api-key-create-dialog.component.js +5 -5
  81. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  82. package/dist/APIKeys/api-key-edit-panel.component.d.ts +3 -2
  83. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  84. package/dist/APIKeys/api-key-edit-panel.component.js +11 -10
  85. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  86. package/dist/APIKeys/api-key-list.component.d.ts +2 -1
  87. package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
  88. package/dist/APIKeys/api-key-list.component.js +6 -5
  89. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  90. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  91. package/dist/APIKeys/api-keys-resource.component.js +4 -4
  92. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  93. package/dist/APIKeys/api-scopes-panel.component.d.ts +3 -2
  94. package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
  95. package/dist/APIKeys/api-scopes-panel.component.js +8 -6
  96. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  97. package/dist/APIKeys/api-usage-panel.component.d.ts +3 -2
  98. package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -1
  99. package/dist/APIKeys/api-usage-panel.component.js +10 -8
  100. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  101. package/dist/Actions/components/actions-list-view.component.d.ts +2 -1
  102. package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
  103. package/dist/Actions/components/actions-list-view.component.js +6 -5
  104. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  105. package/dist/Actions/components/actions-overview.component.js +2 -2
  106. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  107. package/dist/Actions/components/categories-list-view.component.d.ts +2 -1
  108. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  109. package/dist/Actions/components/categories-list-view.component.js +6 -5
  110. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  111. package/dist/Actions/components/execution-monitoring.component.js +1 -1
  112. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  113. package/dist/Actions/components/explorer/action-card.component.d.ts +2 -1
  114. package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
  115. package/dist/Actions/components/explorer/action-card.component.js +6 -4
  116. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  117. package/dist/Actions/components/explorer/action-explorer.component.js +1 -1
  118. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  119. package/dist/Actions/components/explorer/new-action-panel.component.d.ts +2 -1
  120. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
  121. package/dist/Actions/components/explorer/new-action-panel.component.js +7 -5
  122. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  123. package/dist/Actions/components/explorer/new-category-panel.component.d.ts +2 -1
  124. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
  125. package/dist/Actions/components/explorer/new-category-panel.component.js +7 -5
  126. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  127. package/dist/ApplicationRoles/application-roles-resource.component.js +4 -4
  128. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  129. package/dist/Communication/communication-logs-resource.component.js +1 -1
  130. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  131. package/dist/Communication/communication-monitor-resource.component.js +1 -1
  132. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  133. package/dist/Communication/communication-providers-resource.component.js +3 -3
  134. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  135. package/dist/Communication/communication-runs-resource.component.js +1 -1
  136. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  137. package/dist/Communication/communication-templates-resource.component.js +3 -3
  138. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  139. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +1 -1
  140. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  141. package/dist/ComponentStudio/component-studio-dashboard.component.js +5 -4
  142. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  143. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +2 -1
  144. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
  145. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +6 -4
  146. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  147. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +11 -2
  148. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  149. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +61 -27
  150. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  151. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -2
  152. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  153. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +19 -11
  154. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  155. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts +4 -2
  156. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -1
  157. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +11 -3
  158. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  159. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +10 -1
  160. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
  161. package/dist/ComponentStudio/components/workspace/component-preview.component.js +18 -9
  162. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
  163. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +11 -1
  164. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
  165. package/dist/ComponentStudio/services/component-studio-state.service.js +23 -3
  166. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
  167. package/dist/ComponentStudio/services/component-version.service.d.ts +6 -1
  168. package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
  169. package/dist/ComponentStudio/services/component-version.service.js +16 -6
  170. package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
  171. package/dist/Credentials/components/credentials-audit-resource.component.js +1 -1
  172. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  173. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  174. package/dist/Credentials/components/credentials-categories-resource.component.js +3 -3
  175. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  176. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  177. package/dist/Credentials/components/credentials-list-resource.component.js +3 -3
  178. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  179. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  180. package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
  181. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  182. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  183. package/dist/Credentials/components/credentials-types-resource.component.js +3 -3
  184. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  185. package/dist/Credentials/credentials-dashboard.component.js +1 -1
  186. package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
  187. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +13 -13
  188. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  189. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +4 -0
  190. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -1
  191. package/dist/DashboardBrowser/dashboard-share-adapter.js +5 -2
  192. package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -1
  193. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +3 -1
  194. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  195. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -4
  196. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  197. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +3 -2
  198. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
  199. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +7 -6
  200. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  201. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +3 -2
  202. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  203. package/dist/DataExplorer/components/view-selector/view-selector.component.js +6 -5
  204. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  205. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  206. package/dist/DataExplorer/data-explorer-dashboard.component.js +10 -9
  207. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  208. package/dist/DataExplorer/services/explorer-state.service.d.ts +6 -1
  209. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  210. package/dist/DataExplorer/services/explorer-state.service.js +15 -5
  211. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  212. package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts +64 -0
  213. package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts.map +1 -0
  214. package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js +400 -0
  215. package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js.map +1 -0
  216. package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts +42 -0
  217. package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts.map +1 -0
  218. package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js +232 -0
  219. package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js.map +1 -0
  220. package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts +14 -0
  221. package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts.map +1 -0
  222. package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js +38 -0
  223. package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js.map +1 -0
  224. package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts +24 -0
  225. package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts.map +1 -0
  226. package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js +77 -0
  227. package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js.map +1 -0
  228. package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts +88 -0
  229. package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts.map +1 -0
  230. package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js +404 -0
  231. package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js.map +1 -0
  232. package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts +12 -0
  233. package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts.map +1 -0
  234. package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js +116 -0
  235. package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js.map +1 -0
  236. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +55 -0
  237. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -0
  238. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +204 -0
  239. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -0
  240. package/dist/DatabaseDesigner/components/entity-list.component.d.ts +61 -0
  241. package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -0
  242. package/dist/DatabaseDesigner/components/entity-list.component.js +485 -0
  243. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -0
  244. package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts +52 -0
  245. package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts.map +1 -0
  246. package/dist/DatabaseDesigner/components/modify/database-modify.component.js +320 -0
  247. package/dist/DatabaseDesigner/components/modify/database-modify.component.js.map +1 -0
  248. package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts +79 -0
  249. package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts.map +1 -0
  250. package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js +378 -0
  251. package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js.map +1 -0
  252. package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts +85 -0
  253. package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts.map +1 -0
  254. package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js +429 -0
  255. package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js.map +1 -0
  256. package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts +58 -0
  257. package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts.map +1 -0
  258. package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js +333 -0
  259. package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js.map +1 -0
  260. package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts +36 -0
  261. package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts.map +1 -0
  262. package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js +345 -0
  263. package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js.map +1 -0
  264. package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts +13 -0
  265. package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts.map +1 -0
  266. package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js +81 -0
  267. package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js.map +1 -0
  268. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +30 -0
  269. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -0
  270. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +131 -0
  271. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -0
  272. package/dist/DatabaseDesigner/database-designer-erd.d.ts +19 -0
  273. package/dist/DatabaseDesigner/database-designer-erd.d.ts.map +1 -0
  274. package/dist/DatabaseDesigner/database-designer-erd.js +84 -0
  275. package/dist/DatabaseDesigner/database-designer-erd.js.map +1 -0
  276. package/dist/DatabaseDesigner/database-designer.types.d.ts +167 -0
  277. package/dist/DatabaseDesigner/database-designer.types.d.ts.map +1 -0
  278. package/dist/DatabaseDesigner/database-designer.types.js +26 -0
  279. package/dist/DatabaseDesigner/database-designer.types.js.map +1 -0
  280. package/dist/DatabaseDesigner/services/database-designer.engine.d.ts +94 -0
  281. package/dist/DatabaseDesigner/services/database-designer.engine.d.ts.map +1 -0
  282. package/dist/DatabaseDesigner/services/database-designer.engine.js +392 -0
  283. package/dist/DatabaseDesigner/services/database-designer.engine.js.map +1 -0
  284. package/dist/DatabaseDesigner/services/database-designer.service.d.ts +78 -0
  285. package/dist/DatabaseDesigner/services/database-designer.service.d.ts.map +1 -0
  286. package/dist/DatabaseDesigner/services/database-designer.service.js +273 -0
  287. package/dist/DatabaseDesigner/services/database-designer.service.js.map +1 -0
  288. package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts +79 -0
  289. package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts.map +1 -0
  290. package/dist/DatabaseDesigner/services/entity-wizard-state.service.js +204 -0
  291. package/dist/DatabaseDesigner/services/entity-wizard-state.service.js.map +1 -0
  292. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  293. package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
  294. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  295. package/dist/Home/action-pin-config-dialog.component.d.ts +2 -1
  296. package/dist/Home/action-pin-config-dialog.component.d.ts.map +1 -1
  297. package/dist/Home/action-pin-config-dialog.component.js +6 -4
  298. package/dist/Home/action-pin-config-dialog.component.js.map +1 -1
  299. package/dist/Home/action-pin-runner-dialog.component.d.ts +2 -1
  300. package/dist/Home/action-pin-runner-dialog.component.d.ts.map +1 -1
  301. package/dist/Home/action-pin-runner-dialog.component.js +5 -4
  302. package/dist/Home/action-pin-runner-dialog.component.js.map +1 -1
  303. package/dist/Home/home-application.d.ts.map +1 -1
  304. package/dist/Home/home-application.js +10 -12
  305. package/dist/Home/home-application.js.map +1 -1
  306. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  307. package/dist/Home/home-dashboard.component.js +3 -3
  308. package/dist/Home/home-dashboard.component.js.map +1 -1
  309. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  310. package/dist/Integration/components/activity/activity.component.js +1 -0
  311. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  312. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  313. package/dist/Integration/components/connections/connections.component.js +11 -10
  314. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  315. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  316. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2 -2
  317. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  318. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  319. package/dist/Integration/components/overview/overview.component.js +1 -0
  320. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  321. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  322. package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
  323. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  324. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  325. package/dist/Integration/components/schedules/schedules.component.js +5 -4
  326. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  327. package/dist/Integration/services/integration-data.service.d.ts +5 -1
  328. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  329. package/dist/Integration/services/integration-data.service.js +27 -19
  330. package/dist/Integration/services/integration-data.service.js.map +1 -1
  331. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +6 -6
  332. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  333. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  334. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +8 -6
  335. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  336. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +6 -6
  337. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  338. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +3 -3
  339. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  340. package/dist/Lists/components/lists-browse-resource.component.js +6 -6
  341. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  342. package/dist/Lists/components/lists-categories-resource.component.js +4 -4
  343. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  344. package/dist/Lists/components/lists-my-lists-resource.component.js +6 -6
  345. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  346. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  347. package/dist/Lists/components/lists-operations-resource.component.js +11 -10
  348. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  349. package/dist/Lists/services/list-set-operations.service.d.ts +5 -0
  350. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  351. package/dist/Lists/services/list-set-operations.service.js +11 -3
  352. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  353. package/dist/MCP/components/mcp-connection-dialog.component.d.ts +2 -1
  354. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
  355. package/dist/MCP/components/mcp-connection-dialog.component.js +8 -6
  356. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  357. package/dist/MCP/components/mcp-server-dialog.component.d.ts +2 -1
  358. package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -1
  359. package/dist/MCP/components/mcp-server-dialog.component.js +7 -5
  360. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  361. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  362. package/dist/MCP/mcp-dashboard.component.js +12 -12
  363. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  364. package/dist/Permissions/permissions-shared.d.ts +3 -3
  365. package/dist/Permissions/permissions-shared.d.ts.map +1 -1
  366. package/dist/Permissions/permissions-shared.js +5 -5
  367. package/dist/Permissions/permissions-shared.js.map +1 -1
  368. package/dist/Permissions/resource-access-resource.component.js +1 -1
  369. package/dist/Permissions/resource-access-resource.component.js.map +1 -1
  370. package/dist/Permissions/user-access-resource.component.js +1 -2
  371. package/dist/Permissions/user-access-resource.component.js.map +1 -1
  372. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  373. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  374. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  375. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  376. package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
  377. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  378. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +5 -0
  379. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  380. package/dist/Scheduling/services/scheduling-instrumentation.service.js +21 -13
  381. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  382. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  383. package/dist/SystemDiagnostics/system-diagnostics.component.js +2 -2
  384. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  385. package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
  386. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  387. package/dist/Testing/components/testing-explorer.component.js +9 -7
  388. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  389. package/dist/Testing/services/testing-instrumentation.service.d.ts +6 -1
  390. package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -1
  391. package/dist/Testing/services/testing-instrumentation.service.js +21 -11
  392. package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
  393. package/dist/Testing/testing-dashboard.component.d.ts +3 -1
  394. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  395. package/dist/Testing/testing-dashboard.component.js +15 -11
  396. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  397. package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
  398. package/dist/VersionHistory/components/diff-resource.component.js +5 -5
  399. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  400. package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
  401. package/dist/VersionHistory/components/graph-resource.component.js +1 -2
  402. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  403. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  404. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  405. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  406. package/dist/VersionHistory/components/restore-resource.component.js +1 -1
  407. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  408. package/dist/ai-dashboards.module.d.ts +35 -34
  409. package/dist/ai-dashboards.module.d.ts.map +1 -1
  410. package/dist/ai-dashboards.module.js +6 -0
  411. package/dist/ai-dashboards.module.js.map +1 -1
  412. package/dist/module.d.ts +13 -12
  413. package/dist/module.d.ts.map +1 -1
  414. package/dist/module.js +7 -0
  415. package/dist/module.js.map +1 -1
  416. package/dist/public-api.d.ts +3 -1
  417. package/dist/public-api.d.ts.map +1 -1
  418. package/dist/public-api.js +3 -1
  419. package/dist/public-api.js.map +1 -1
  420. package/dist/shared/entity-field-display.d.ts +4 -3
  421. package/dist/shared/entity-field-display.d.ts.map +1 -1
  422. package/dist/shared/entity-field-display.js +9 -9
  423. package/dist/shared/entity-field-display.js.map +1 -1
  424. package/package.json +52 -51
@@ -1 +1 @@
1
- {"version":3,"file":"api-usage-panel.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-usage-panel.component.ts","../../src/APIKeys/api-usage-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJAPIKeyEntity, MJAPIKeyUsageLogEntity } from '@memberjunction/core-entities';\n/** Time bucket for aggregation */\ninterface TimeBucket {\n label: string;\n date: Date;\n requests: number;\n errors: number;\n avgResponseTime: number;\n}\n\n/** Endpoint stats */\ninterface EndpointStats {\n endpoint: string;\n method: string;\n requests: number;\n avgResponseTime: number;\n errorRate: number;\n}\n\n/** Key stats */\ninterface KeyStats {\n keyId: string;\n label: string;\n requests: number;\n lastUsed: Date | null;\n}\n\n/** Status code group */\ninterface StatusGroup {\n label: string;\n code: string;\n count: number;\n percentage: number;\n color: string;\n}\n\n/** Usage log item for display */\ninterface UsageLogItem {\n id: string;\n timestamp: Date;\n endpoint: string;\n method: string;\n statusCode: number;\n responseTime: number;\n keyLabel: string;\n keyId: string;\n}\n\n/**\n * API Usage Analytics Panel Component\n * Comprehensive usage statistics and drill-down capabilities\n */\n@Component({\n standalone: false,\n selector: 'mj-api-usage-panel',\n templateUrl: './api-usage-panel.component.html',\n styleUrls: ['./api-usage-panel.component.css']\n})\nexport class APIUsagePanelComponent implements OnInit {\n private md = new Metadata();\n private cdr: ChangeDetectorRef;\n\n // Loading states\n public IsLoading = true;\n public IsLoadingLogs = false;\n\n // Time range filter\n public TimeRange: 'day' | 'week' | 'month' | 'all' = 'week';\n\n // Summary KPIs\n public TotalRequests = 0;\n public TotalErrors = 0;\n public AvgResponseTime = 0;\n public SuccessRate = 0;\n public UniqueKeys = 0;\n public UniqueEndpoints = 0;\n\n // Trend data (vs previous period)\n public RequestsTrend = 0;\n public ErrorsTrend = 0;\n public ResponseTimeTrend = 0;\n\n // Chart data\n public TimeBuckets: TimeBucket[] = [];\n public MaxRequests = 0;\n public MaxErrors = 0;\n\n // Breakdown data\n public TopEndpoints: EndpointStats[] = [];\n public TopKeys: KeyStats[] = [];\n public StatusGroups: StatusGroup[] = [];\n\n // Recent logs\n public RecentLogs: UsageLogItem[] = [];\n public ShowLogsPanel = false;\n public LogsFilter: { endpoint?: string; keyId?: string } = {};\n\n // Key map for labels\n public KeyMap = new Map<string, string>();\n\n // Expose Math for template\n public Math = Math;\n\n constructor(cdr: ChangeDetectorRef) {\n this.cdr = cdr;\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadData();\n }\n\n /**\n * Load all usage data\n */\n public async loadData(): Promise<void> {\n this.IsLoading = true;\n try {\n // Load keys for label lookup\n await this.loadKeys();\n // Load usage data\n await this.loadUsageStats();\n } catch (error) {\n console.error('Error loading usage data:', error);\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load API keys for label lookup\n */\n private async loadKeys(): Promise<void> {\n const rv = new RunView();\n const result = await rv.RunView<MJAPIKeyEntity>({\n EntityName: 'MJ: API Keys',\n Fields: ['ID', 'Label'],\n ResultType: 'simple'\n });\n if (result.Success) {\n for (const key of result.Results) {\n this.KeyMap.set(key.ID, key.Label);\n }\n }\n }\n\n /**\n * Load usage statistics based on time range\n */\n private async loadUsageStats(): Promise<void> {\n const rv = new RunView();\n const filter = this.getTimeFilter();\n\n const result = await rv.RunView<MJAPIKeyUsageLogEntity>({\n EntityName: 'MJ: API Key Usage Logs',\n ExtraFilter: filter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 5000,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n const logs = result.Results;\n this.calculateSummaryKPIs(logs);\n this.buildTimeBuckets(logs);\n this.buildEndpointStats(logs);\n this.buildKeyStats(logs);\n this.buildStatusGroups(logs);\n this.RecentLogs = logs.slice(0, 20).map(log => this.mapLogToItem(log));\n }\n }\n\n /**\n * Get time filter for RunView based on selected range\n */\n private getTimeFilter(): string {\n const now = new Date();\n let startDate: Date;\n\n switch (this.TimeRange) {\n case 'day':\n startDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case 'week':\n startDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case 'month':\n startDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case 'all':\n default:\n return '';\n }\n\n return `__mj_CreatedAt >= '${startDate.toISOString()}'`;\n }\n\n /**\n * Calculate summary KPIs\n */\n private calculateSummaryKPIs(logs: MJAPIKeyUsageLogEntity[]): void {\n this.TotalRequests = logs.length;\n\n // Count errors (4xx and 5xx status codes)\n this.TotalErrors = logs.filter(l => l.StatusCode >= 400).length;\n\n // Calculate average response time\n const totalResponseTime = logs.reduce((sum, l) => sum + (l.ResponseTimeMs || 0), 0);\n this.AvgResponseTime = this.TotalRequests > 0\n ? Math.round(totalResponseTime / this.TotalRequests)\n : 0;\n\n // Success rate\n this.SuccessRate = this.TotalRequests > 0\n ? Math.round(((this.TotalRequests - this.TotalErrors) / this.TotalRequests) * 100)\n : 100;\n\n // Unique counts\n const keySet = new Set(logs.map(l => l.APIKeyID));\n const endpointSet = new Set(logs.map(l => l.Endpoint));\n this.UniqueKeys = keySet.size;\n this.UniqueEndpoints = endpointSet.size;\n }\n\n /**\n * Build time buckets for chart\n */\n private buildTimeBuckets(logs: MJAPIKeyUsageLogEntity[]): void {\n const bucketCount = this.TimeRange === 'day' ? 24 : this.TimeRange === 'week' ? 7 : 30;\n const bucketDuration = this.TimeRange === 'day' ? 60 * 60 * 1000 : 24 * 60 * 60 * 1000;\n\n const now = new Date();\n const buckets: TimeBucket[] = [];\n\n for (let i = bucketCount - 1; i >= 0; i--) {\n const bucketDate = new Date(now.getTime() - i * bucketDuration);\n const bucketLogs = logs.filter(l => {\n const logDate = new Date(l.__mj_CreatedAt);\n const nextBucket = new Date(bucketDate.getTime() + bucketDuration);\n return logDate >= bucketDate && logDate < nextBucket;\n });\n\n const errors = bucketLogs.filter(l => l.StatusCode >= 400).length;\n const totalTime = bucketLogs.reduce((sum, l) => sum + (l.ResponseTimeMs || 0), 0);\n\n buckets.push({\n label: this.formatBucketLabel(bucketDate),\n date: bucketDate,\n requests: bucketLogs.length,\n errors,\n avgResponseTime: bucketLogs.length > 0 ? Math.round(totalTime / bucketLogs.length) : 0\n });\n }\n\n this.TimeBuckets = buckets;\n this.MaxRequests = Math.max(...buckets.map(b => b.requests), 1);\n this.MaxErrors = Math.max(...buckets.map(b => b.errors), 1);\n }\n\n /**\n * Format bucket label based on time range\n */\n private formatBucketLabel(date: Date): string {\n if (this.TimeRange === 'day') {\n return date.toLocaleTimeString('en-US', { hour: 'numeric' });\n }\n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n }\n\n /**\n * Build endpoint statistics\n */\n private buildEndpointStats(logs: MJAPIKeyUsageLogEntity[]): void {\n const endpointMap = new Map<string, {\n endpoint: string;\n method: string;\n requests: number;\n totalTime: number;\n errors: number\n }>();\n\n for (const log of logs) {\n const key = `${log.Method}:${log.Endpoint}`;\n const existing = endpointMap.get(key);\n if (existing) {\n existing.requests++;\n existing.totalTime += log.ResponseTimeMs || 0;\n if (log.StatusCode >= 400) existing.errors++;\n } else {\n endpointMap.set(key, {\n endpoint: log.Endpoint,\n method: log.Method,\n requests: 1,\n totalTime: log.ResponseTimeMs || 0,\n errors: log.StatusCode >= 400 ? 1 : 0\n });\n }\n }\n\n this.TopEndpoints = Array.from(endpointMap.values())\n .map(e => ({\n endpoint: e.endpoint,\n method: e.method,\n requests: e.requests,\n avgResponseTime: Math.round(e.totalTime / e.requests),\n errorRate: Math.round((e.errors / e.requests) * 100)\n }))\n .sort((a, b) => b.requests - a.requests)\n .slice(0, 10);\n }\n\n /**\n * Build key statistics\n */\n private buildKeyStats(logs: MJAPIKeyUsageLogEntity[]): void {\n const keyMap = new Map<string, { requests: number; lastUsed: Date | null }>();\n\n for (const log of logs) {\n const existing = keyMap.get(log.APIKeyID);\n const logDate = new Date(log.__mj_CreatedAt);\n if (existing) {\n existing.requests++;\n if (!existing.lastUsed || logDate > existing.lastUsed) {\n existing.lastUsed = logDate;\n }\n } else {\n keyMap.set(log.APIKeyID, {\n requests: 1,\n lastUsed: logDate\n });\n }\n }\n\n this.TopKeys = Array.from(keyMap.entries())\n .map(([keyId, stats]) => ({\n keyId,\n label: this.KeyMap.get(keyId) || 'Unknown Key',\n requests: stats.requests,\n lastUsed: stats.lastUsed\n }))\n .sort((a, b) => b.requests - a.requests)\n .slice(0, 10);\n }\n\n /**\n * Build status code groups\n */\n private buildStatusGroups(logs: MJAPIKeyUsageLogEntity[]): void {\n const groups: Record<string, { count: number; label: string; color: string }> = {\n '2xx': { count: 0, label: 'Success (2xx)', color: '#10b981' },\n '3xx': { count: 0, label: 'Redirect (3xx)', color: '#3b82f6' },\n '4xx': { count: 0, label: 'Client Error (4xx)', color: '#f59e0b' },\n '5xx': { count: 0, label: 'Server Error (5xx)', color: '#ef4444' }\n };\n\n for (const log of logs) {\n const code = Math.floor(log.StatusCode / 100);\n const key = `${code}xx`;\n if (groups[key]) {\n groups[key].count++;\n }\n }\n\n this.StatusGroups = Object.entries(groups)\n .filter(([_, v]) => v.count > 0)\n .map(([code, v]) => ({\n code,\n label: v.label,\n count: v.count,\n percentage: this.TotalRequests > 0 ? Math.round((v.count / this.TotalRequests) * 100) : 0,\n color: v.color\n }));\n }\n\n /**\n * Map log entity to display item\n */\n private mapLogToItem(log: MJAPIKeyUsageLogEntity): UsageLogItem {\n return {\n id: log.ID,\n timestamp: new Date(log.__mj_CreatedAt),\n endpoint: log.Endpoint,\n method: log.Method,\n statusCode: log.StatusCode,\n responseTime: log.ResponseTimeMs || 0,\n keyLabel: this.KeyMap.get(log.APIKeyID) || 'Unknown',\n keyId: log.APIKeyID\n };\n }\n\n /**\n * Change time range and reload\n */\n public async setTimeRange(range: 'day' | 'week' | 'month' | 'all'): Promise<void> {\n this.TimeRange = range;\n await this.loadData();\n }\n\n /**\n * Get bar height percentage for chart\n */\n public getBarHeight(value: number): number {\n if (this.MaxRequests === 0) return 0;\n return Math.max(2, (value / this.MaxRequests) * 100);\n }\n\n /**\n * Get error bar height for chart\n */\n public getErrorBarHeight(bucket: TimeBucket): number {\n if (bucket.requests === 0) return 0;\n return (bucket.errors / bucket.requests) * 100;\n }\n\n /**\n * Drill down into endpoint\n */\n public drillDownEndpoint(endpoint: EndpointStats): void {\n this.LogsFilter = { endpoint: endpoint.endpoint };\n this.loadFilteredLogs();\n this.ShowLogsPanel = true;\n }\n\n /**\n * Drill down into key\n */\n public drillDownKey(key: KeyStats): void {\n this.LogsFilter = { keyId: key.keyId };\n this.loadFilteredLogs();\n this.ShowLogsPanel = true;\n }\n\n /**\n * Load filtered logs for drill-down\n */\n private async loadFilteredLogs(): Promise<void> {\n this.IsLoadingLogs = true;\n const rv = new RunView();\n let filter = this.getTimeFilter();\n\n if (this.LogsFilter.endpoint) {\n filter += filter ? ' AND ' : '';\n filter += `Endpoint = '${this.LogsFilter.endpoint}'`;\n }\n if (this.LogsFilter.keyId) {\n filter += filter ? ' AND ' : '';\n filter += `APIKeyID = '${this.LogsFilter.keyId}'`;\n }\n\n const result = await rv.RunView<MJAPIKeyUsageLogEntity>({\n EntityName: 'MJ: API Key Usage Logs',\n ExtraFilter: filter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.RecentLogs = result.Results.map(log => this.mapLogToItem(log));\n }\n\n this.IsLoadingLogs = false;\n this.cdr.markForCheck();\n }\n\n /**\n * Close logs panel\n */\n public closeLogsPanel(): void {\n this.ShowLogsPanel = false;\n this.LogsFilter = {};\n }\n\n /**\n * Get status class for HTTP status code\n */\n public getStatusClass(statusCode: number): string {\n if (statusCode >= 200 && statusCode < 300) return 'status-success';\n if (statusCode >= 300 && statusCode < 400) return 'status-info';\n if (statusCode >= 400 && statusCode < 500) return 'status-warning';\n if (statusCode >= 500) return 'status-error';\n return '';\n }\n\n /**\n * Get method badge class\n */\n public getMethodClass(method: string): string {\n const m = method.toUpperCase();\n if (m === 'GET') return 'method-get';\n if (m === 'POST') return 'method-post';\n if (m === 'PUT' || m === 'PATCH') return 'method-put';\n if (m === 'DELETE') return 'method-delete';\n return 'method-other';\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date | null): string {\n if (!date) return 'Never';\n const d = new Date(date);\n const now = new Date();\n const diff = now.getTime() - d.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n\n if (minutes < 1) return 'Just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n }\n\n /**\n * Format number with K/M suffix\n */\n public formatNumber(num: number): string {\n if (num >= 1000000) return (num / 1000000).toFixed(1) + 'M';\n if (num >= 1000) return (num / 1000).toFixed(1) + 'K';\n return num.toString();\n }\n}\n","<div class=\"usage-panel\">\n @if (IsLoading) {\n <mj-loading text=\"Loading usage analytics...\"></mj-loading>\n }\n\n @if (!IsLoading) {\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"header-left\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n API Usage Analytics\n </h3>\n <p class=\"panel-subtitle\">Monitor API key usage, performance, and trends</p>\n </div>\n <div class=\"time-filters\">\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'day'\"\n (click)=\"setTimeRange('day')\">24 Hours</button>\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'week'\"\n (click)=\"setTimeRange('week')\">7 Days</button>\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'month'\"\n (click)=\"setTimeRange('month')\">30 Days</button>\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'all'\"\n (click)=\"setTimeRange('all')\">All Time</button>\n </div>\n </div>\n <!-- Summary KPIs -->\n <div class=\"kpi-grid\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon requests\">\n <i class=\"fa-solid fa-arrow-right-arrow-left\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{formatNumber(TotalRequests)}}</div>\n <div class=\"kpi-label\">Total Requests</div>\n </div>\n </div>\n <div class=\"kpi-card\" [class.success]=\"SuccessRate >= 95\">\n <div class=\"kpi-icon success-rate\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{SuccessRate}}%</div>\n <div class=\"kpi-label\">Success Rate</div>\n </div>\n </div>\n <div class=\"kpi-card\" [class.warning]=\"TotalErrors > 0\">\n <div class=\"kpi-icon errors\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{formatNumber(TotalErrors)}}</div>\n <div class=\"kpi-label\">Errors</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon response-time\">\n <i class=\"fa-solid fa-gauge-high\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{AvgResponseTime}}ms</div>\n <div class=\"kpi-label\">Avg Response Time</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon keys\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{UniqueKeys}}</div>\n <div class=\"kpi-label\">Active Keys</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon endpoints\">\n <i class=\"fa-solid fa-code-branch\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{UniqueEndpoints}}</div>\n <div class=\"kpi-label\">Unique Endpoints</div>\n </div>\n </div>\n </div>\n <!-- Usage Chart -->\n <div class=\"chart-section\">\n <div class=\"chart-header\">\n <h4>Request Volume</h4>\n <div class=\"chart-legend\">\n <span class=\"legend-item\">\n <span class=\"legend-color requests\"></span> Requests\n </span>\n <span class=\"legend-item\">\n <span class=\"legend-color errors\"></span> Errors\n </span>\n </div>\n </div>\n @if (TimeBuckets.length > 0) {\n <div class=\"chart-container\">\n <div class=\"chart-bars\">\n @for (bucket of TimeBuckets; track bucket) {\n <div class=\"bar-group\" [title]=\"bucket.requests + ' requests, ' + bucket.errors + ' errors'\">\n <div class=\"bar-wrapper\">\n <div class=\"bar requests-bar\"\n [style.height.%]=\"getBarHeight(bucket.requests)\">\n @if (bucket.errors > 0) {\n <div class=\"bar errors-bar\"\n [style.height.%]=\"getErrorBarHeight(bucket)\"\n >\n </div>\n }\n </div>\n </div>\n <div class=\"bar-label\">{{bucket.label}}</div>\n </div>\n }\n </div>\n <div class=\"chart-y-axis\">\n <span>{{formatNumber(MaxRequests)}}</span>\n <span>{{formatNumber(Math.round(MaxRequests / 2))}}</span>\n <span>0</span>\n </div>\n </div>\n }\n @if (TimeBuckets.length === 0) {\n <div class=\"empty-chart\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <span>No usage data available</span>\n </div>\n }\n </div>\n <!-- Breakdown Grid -->\n <div class=\"breakdown-grid\">\n <!-- Top Endpoints -->\n <div class=\"breakdown-card\">\n <div class=\"breakdown-header\">\n <h4>\n <i class=\"fa-solid fa-code-branch\"></i>\n Top Endpoints\n </h4>\n </div>\n <div class=\"breakdown-content\">\n @if (TopEndpoints.length > 0) {\n <div class=\"endpoint-list\">\n @for (ep of TopEndpoints; track ep) {\n <div class=\"endpoint-item\"\n (click)=\"drillDownEndpoint(ep)\">\n <div class=\"endpoint-info\">\n <span class=\"method-badge\" [ngClass]=\"getMethodClass(ep.method)\">\n {{ep.method}}\n </span>\n <span class=\"endpoint-path\">{{ep.endpoint}}</span>\n </div>\n <div class=\"endpoint-stats\">\n <span class=\"endpoint-requests\">{{formatNumber(ep.requests)}}</span>\n <span class=\"endpoint-time\">{{ep.avgResponseTime}}ms</span>\n <span class=\"endpoint-error\" [class.has-errors]=\"ep.errorRate > 0\">\n {{ep.errorRate}}% err\n </span>\n </div>\n </div>\n }\n </div>\n }\n @if (TopEndpoints.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-code-branch\"></i>\n <span>No endpoint data</span>\n </div>\n }\n </div>\n </div>\n <!-- Top Keys -->\n <div class=\"breakdown-card\">\n <div class=\"breakdown-header\">\n <h4>\n <i class=\"fa-solid fa-key\"></i>\n Most Active Keys\n </h4>\n </div>\n <div class=\"breakdown-content\">\n @if (TopKeys.length > 0) {\n <div class=\"key-list\">\n @for (key of TopKeys; track key) {\n <div class=\"key-item\"\n (click)=\"drillDownKey(key)\">\n <div class=\"key-info\">\n <span class=\"key-label\">{{key.label}}</span>\n <span class=\"key-last-used\">{{formatDate(key.lastUsed)}}</span>\n </div>\n <div class=\"key-requests\">{{formatNumber(key.requests)}}</div>\n </div>\n }\n </div>\n }\n @if (TopKeys.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-key\"></i>\n <span>No key data</span>\n </div>\n }\n </div>\n </div>\n <!-- Status Distribution -->\n <div class=\"breakdown-card\">\n <div class=\"breakdown-header\">\n <h4>\n <i class=\"fa-solid fa-circle-half-stroke\"></i>\n Status Distribution\n </h4>\n </div>\n <div class=\"breakdown-content\">\n @if (StatusGroups.length > 0) {\n <div class=\"status-distribution\">\n <div class=\"status-bar\">\n @for (group of StatusGroups; track group) {\n <div class=\"status-segment\"\n [style.width.%]=\"group.percentage\"\n [style.backgroundColor]=\"group.color\"\n [title]=\"group.label + ': ' + group.count + ' (' + group.percentage + '%)'\">\n </div>\n }\n </div>\n <div class=\"status-legend\">\n @for (group of StatusGroups; track group) {\n <div class=\"status-legend-item\">\n <span class=\"status-color\" [style.backgroundColor]=\"group.color\"></span>\n <span class=\"status-label\">{{group.label}}</span>\n <span class=\"status-count\">{{formatNumber(group.count)}} ({{group.percentage}}%)</span>\n </div>\n }\n </div>\n </div>\n }\n @if (StatusGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-circle-half-stroke\"></i>\n <span>No status data</span>\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Recent Logs -->\n <div class=\"logs-section\">\n <div class=\"logs-header\">\n <h4>\n <i class=\"fa-solid fa-list\"></i>\n Recent Requests\n </h4>\n </div>\n @if (RecentLogs.length > 0) {\n <div class=\"logs-table\">\n <div class=\"logs-table-header\">\n <span class=\"col-time\">Time</span>\n <span class=\"col-key\">API Key</span>\n <span class=\"col-method\">Method</span>\n <span class=\"col-endpoint\">Endpoint</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-duration\">Duration</span>\n </div>\n <div class=\"logs-table-body\">\n @for (log of RecentLogs; track log) {\n <div class=\"log-row\">\n <span class=\"col-time\">{{formatDate(log.timestamp)}}</span>\n <span class=\"col-key\">{{log.keyLabel}}</span>\n <span class=\"col-method\">\n <span class=\"method-badge\" [ngClass]=\"getMethodClass(log.method)\">\n {{log.method}}\n </span>\n </span>\n <span class=\"col-endpoint\">{{log.endpoint}}</span>\n <span class=\"col-status\" [ngClass]=\"getStatusClass(log.statusCode)\">\n {{log.statusCode}}\n </span>\n <span class=\"col-duration\">{{log.responseTime}}ms</span>\n </div>\n }\n </div>\n </div>\n }\n @if (RecentLogs.length === 0) {\n <div class=\"empty-state large\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No requests logged yet</span>\n <p>API usage will appear here once keys are used</p>\n </div>\n }\n </div>\n }\n\n <!-- Drill-down Panel -->\n @if (ShowLogsPanel) {\n <mj-window\n [Width]=\"800\"\n [MinWidth]=\"600\"\n [Height]=\"500\"\n [MinHeight]=\"400\"\n [Resizable]=\"true\"\n [Draggable]=\"true\"\n [Top]=\"80\"\n [Visible]=\"true\"\n (Close)=\"closeLogsPanel()\">\n <mj-window-titlebar>\n <div class=\"drilldown-title\">\n <i class=\"fa-solid fa-magnifying-glass-chart\"></i>\n <span>Request Details</span>\n @if (LogsFilter.endpoint) {\n <span class=\"filter-badge\">\n {{LogsFilter.endpoint}}\n </span>\n }\n @if (LogsFilter.keyId) {\n <span class=\"filter-badge\">\n Key: {{KeyMap.get(LogsFilter.keyId) || 'Unknown'}}\n </span>\n }\n </div>\n <button mjButton variant=\"flat\" (click)=\"closeLogsPanel()\" class=\"window-close-btn\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </mj-window-titlebar>\n <div class=\"drilldown-content\">\n @if (IsLoadingLogs) {\n <mj-loading text=\"Loading requests...\"></mj-loading>\n }\n @if (!IsLoadingLogs) {\n <div class=\"drilldown-logs\">\n <div class=\"logs-table\">\n <div class=\"logs-table-header\">\n <span class=\"col-time\">Time</span>\n <span class=\"col-key\">API Key</span>\n <span class=\"col-method\">Method</span>\n <span class=\"col-endpoint\">Endpoint</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-duration\">Duration</span>\n </div>\n <div class=\"logs-table-body scrollable\">\n @for (log of RecentLogs; track log) {\n <div class=\"log-row\">\n <span class=\"col-time\">{{formatDate(log.timestamp)}}</span>\n <span class=\"col-key\">{{log.keyLabel}}</span>\n <span class=\"col-method\">\n <span class=\"method-badge\" [ngClass]=\"getMethodClass(log.method)\">\n {{log.method}}\n </span>\n </span>\n <span class=\"col-endpoint\">{{log.endpoint}}</span>\n <span class=\"col-status\" [ngClass]=\"getStatusClass(log.statusCode)\">\n {{log.statusCode}}\n </span>\n <span class=\"col-duration\">{{log.responseTime}}ms</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </mj-window>\n }\n</div>\n"]}
1
+ {"version":3,"file":"api-usage-panel.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-usage-panel.component.ts","../../src/APIKeys/api-usage-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { RunView } from '@memberjunction/core';\nimport { MJAPIKeyEntity, MJAPIKeyUsageLogEntity } from '@memberjunction/core-entities';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n/** Time bucket for aggregation */\ninterface TimeBucket {\n label: string;\n date: Date;\n requests: number;\n errors: number;\n avgResponseTime: number;\n}\n\n/** Endpoint stats */\ninterface EndpointStats {\n endpoint: string;\n method: string;\n requests: number;\n avgResponseTime: number;\n errorRate: number;\n}\n\n/** Key stats */\ninterface KeyStats {\n keyId: string;\n label: string;\n requests: number;\n lastUsed: Date | null;\n}\n\n/** Status code group */\ninterface StatusGroup {\n label: string;\n code: string;\n count: number;\n percentage: number;\n color: string;\n}\n\n/** Usage log item for display */\ninterface UsageLogItem {\n id: string;\n timestamp: Date;\n endpoint: string;\n method: string;\n statusCode: number;\n responseTime: number;\n keyLabel: string;\n keyId: string;\n}\n\n/**\n * API Usage Analytics Panel Component\n * Comprehensive usage statistics and drill-down capabilities\n */\n@Component({\n standalone: false,\n selector: 'mj-api-usage-panel',\n templateUrl: './api-usage-panel.component.html',\n styleUrls: ['./api-usage-panel.component.css']\n})\nexport class APIUsagePanelComponent extends BaseAngularComponent implements OnInit {\n private get md() { return this.ProviderToUse; }\n private cdr: ChangeDetectorRef;\n\n // Loading states\n public IsLoading = true;\n public IsLoadingLogs = false;\n\n // Time range filter\n public TimeRange: 'day' | 'week' | 'month' | 'all' = 'week';\n\n // Summary KPIs\n public TotalRequests = 0;\n public TotalErrors = 0;\n public AvgResponseTime = 0;\n public SuccessRate = 0;\n public UniqueKeys = 0;\n public UniqueEndpoints = 0;\n\n // Trend data (vs previous period)\n public RequestsTrend = 0;\n public ErrorsTrend = 0;\n public ResponseTimeTrend = 0;\n\n // Chart data\n public TimeBuckets: TimeBucket[] = [];\n public MaxRequests = 0;\n public MaxErrors = 0;\n\n // Breakdown data\n public TopEndpoints: EndpointStats[] = [];\n public TopKeys: KeyStats[] = [];\n public StatusGroups: StatusGroup[] = [];\n\n // Recent logs\n public RecentLogs: UsageLogItem[] = [];\n public ShowLogsPanel = false;\n public LogsFilter: { endpoint?: string; keyId?: string } = {};\n\n // Key map for labels\n public KeyMap = new Map<string, string>();\n\n // Expose Math for template\n public Math = Math;\n\n constructor(cdr: ChangeDetectorRef) {\n super();\n this.cdr = cdr;\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadData();\n }\n\n /**\n * Load all usage data\n */\n public async loadData(): Promise<void> {\n this.IsLoading = true;\n try {\n // Load keys for label lookup\n await this.loadKeys();\n // Load usage data\n await this.loadUsageStats();\n } catch (error) {\n console.error('Error loading usage data:', error);\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load API keys for label lookup\n */\n private async loadKeys(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJAPIKeyEntity>({\n EntityName: 'MJ: API Keys',\n Fields: ['ID', 'Label'],\n ResultType: 'simple'\n });\n if (result.Success) {\n for (const key of result.Results) {\n this.KeyMap.set(key.ID, key.Label);\n }\n }\n }\n\n /**\n * Load usage statistics based on time range\n */\n private async loadUsageStats(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter = this.getTimeFilter();\n\n const result = await rv.RunView<MJAPIKeyUsageLogEntity>({\n EntityName: 'MJ: API Key Usage Logs',\n ExtraFilter: filter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 5000,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n const logs = result.Results;\n this.calculateSummaryKPIs(logs);\n this.buildTimeBuckets(logs);\n this.buildEndpointStats(logs);\n this.buildKeyStats(logs);\n this.buildStatusGroups(logs);\n this.RecentLogs = logs.slice(0, 20).map(log => this.mapLogToItem(log));\n }\n }\n\n /**\n * Get time filter for RunView based on selected range\n */\n private getTimeFilter(): string {\n const now = new Date();\n let startDate: Date;\n\n switch (this.TimeRange) {\n case 'day':\n startDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case 'week':\n startDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case 'month':\n startDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case 'all':\n default:\n return '';\n }\n\n return `__mj_CreatedAt >= '${startDate.toISOString()}'`;\n }\n\n /**\n * Calculate summary KPIs\n */\n private calculateSummaryKPIs(logs: MJAPIKeyUsageLogEntity[]): void {\n this.TotalRequests = logs.length;\n\n // Count errors (4xx and 5xx status codes)\n this.TotalErrors = logs.filter(l => l.StatusCode >= 400).length;\n\n // Calculate average response time\n const totalResponseTime = logs.reduce((sum, l) => sum + (l.ResponseTimeMs || 0), 0);\n this.AvgResponseTime = this.TotalRequests > 0\n ? Math.round(totalResponseTime / this.TotalRequests)\n : 0;\n\n // Success rate\n this.SuccessRate = this.TotalRequests > 0\n ? Math.round(((this.TotalRequests - this.TotalErrors) / this.TotalRequests) * 100)\n : 100;\n\n // Unique counts\n const keySet = new Set(logs.map(l => l.APIKeyID));\n const endpointSet = new Set(logs.map(l => l.Endpoint));\n this.UniqueKeys = keySet.size;\n this.UniqueEndpoints = endpointSet.size;\n }\n\n /**\n * Build time buckets for chart\n */\n private buildTimeBuckets(logs: MJAPIKeyUsageLogEntity[]): void {\n const bucketCount = this.TimeRange === 'day' ? 24 : this.TimeRange === 'week' ? 7 : 30;\n const bucketDuration = this.TimeRange === 'day' ? 60 * 60 * 1000 : 24 * 60 * 60 * 1000;\n\n const now = new Date();\n const buckets: TimeBucket[] = [];\n\n for (let i = bucketCount - 1; i >= 0; i--) {\n const bucketDate = new Date(now.getTime() - i * bucketDuration);\n const bucketLogs = logs.filter(l => {\n const logDate = new Date(l.__mj_CreatedAt);\n const nextBucket = new Date(bucketDate.getTime() + bucketDuration);\n return logDate >= bucketDate && logDate < nextBucket;\n });\n\n const errors = bucketLogs.filter(l => l.StatusCode >= 400).length;\n const totalTime = bucketLogs.reduce((sum, l) => sum + (l.ResponseTimeMs || 0), 0);\n\n buckets.push({\n label: this.formatBucketLabel(bucketDate),\n date: bucketDate,\n requests: bucketLogs.length,\n errors,\n avgResponseTime: bucketLogs.length > 0 ? Math.round(totalTime / bucketLogs.length) : 0\n });\n }\n\n this.TimeBuckets = buckets;\n this.MaxRequests = Math.max(...buckets.map(b => b.requests), 1);\n this.MaxErrors = Math.max(...buckets.map(b => b.errors), 1);\n }\n\n /**\n * Format bucket label based on time range\n */\n private formatBucketLabel(date: Date): string {\n if (this.TimeRange === 'day') {\n return date.toLocaleTimeString('en-US', { hour: 'numeric' });\n }\n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n }\n\n /**\n * Build endpoint statistics\n */\n private buildEndpointStats(logs: MJAPIKeyUsageLogEntity[]): void {\n const endpointMap = new Map<string, {\n endpoint: string;\n method: string;\n requests: number;\n totalTime: number;\n errors: number\n }>();\n\n for (const log of logs) {\n const key = `${log.Method}:${log.Endpoint}`;\n const existing = endpointMap.get(key);\n if (existing) {\n existing.requests++;\n existing.totalTime += log.ResponseTimeMs || 0;\n if (log.StatusCode >= 400) existing.errors++;\n } else {\n endpointMap.set(key, {\n endpoint: log.Endpoint,\n method: log.Method,\n requests: 1,\n totalTime: log.ResponseTimeMs || 0,\n errors: log.StatusCode >= 400 ? 1 : 0\n });\n }\n }\n\n this.TopEndpoints = Array.from(endpointMap.values())\n .map(e => ({\n endpoint: e.endpoint,\n method: e.method,\n requests: e.requests,\n avgResponseTime: Math.round(e.totalTime / e.requests),\n errorRate: Math.round((e.errors / e.requests) * 100)\n }))\n .sort((a, b) => b.requests - a.requests)\n .slice(0, 10);\n }\n\n /**\n * Build key statistics\n */\n private buildKeyStats(logs: MJAPIKeyUsageLogEntity[]): void {\n const keyMap = new Map<string, { requests: number; lastUsed: Date | null }>();\n\n for (const log of logs) {\n const existing = keyMap.get(log.APIKeyID);\n const logDate = new Date(log.__mj_CreatedAt);\n if (existing) {\n existing.requests++;\n if (!existing.lastUsed || logDate > existing.lastUsed) {\n existing.lastUsed = logDate;\n }\n } else {\n keyMap.set(log.APIKeyID, {\n requests: 1,\n lastUsed: logDate\n });\n }\n }\n\n this.TopKeys = Array.from(keyMap.entries())\n .map(([keyId, stats]) => ({\n keyId,\n label: this.KeyMap.get(keyId) || 'Unknown Key',\n requests: stats.requests,\n lastUsed: stats.lastUsed\n }))\n .sort((a, b) => b.requests - a.requests)\n .slice(0, 10);\n }\n\n /**\n * Build status code groups\n */\n private buildStatusGroups(logs: MJAPIKeyUsageLogEntity[]): void {\n const groups: Record<string, { count: number; label: string; color: string }> = {\n '2xx': { count: 0, label: 'Success (2xx)', color: '#10b981' },\n '3xx': { count: 0, label: 'Redirect (3xx)', color: '#3b82f6' },\n '4xx': { count: 0, label: 'Client Error (4xx)', color: '#f59e0b' },\n '5xx': { count: 0, label: 'Server Error (5xx)', color: '#ef4444' }\n };\n\n for (const log of logs) {\n const code = Math.floor(log.StatusCode / 100);\n const key = `${code}xx`;\n if (groups[key]) {\n groups[key].count++;\n }\n }\n\n this.StatusGroups = Object.entries(groups)\n .filter(([_, v]) => v.count > 0)\n .map(([code, v]) => ({\n code,\n label: v.label,\n count: v.count,\n percentage: this.TotalRequests > 0 ? Math.round((v.count / this.TotalRequests) * 100) : 0,\n color: v.color\n }));\n }\n\n /**\n * Map log entity to display item\n */\n private mapLogToItem(log: MJAPIKeyUsageLogEntity): UsageLogItem {\n return {\n id: log.ID,\n timestamp: new Date(log.__mj_CreatedAt),\n endpoint: log.Endpoint,\n method: log.Method,\n statusCode: log.StatusCode,\n responseTime: log.ResponseTimeMs || 0,\n keyLabel: this.KeyMap.get(log.APIKeyID) || 'Unknown',\n keyId: log.APIKeyID\n };\n }\n\n /**\n * Change time range and reload\n */\n public async setTimeRange(range: 'day' | 'week' | 'month' | 'all'): Promise<void> {\n this.TimeRange = range;\n await this.loadData();\n }\n\n /**\n * Get bar height percentage for chart\n */\n public getBarHeight(value: number): number {\n if (this.MaxRequests === 0) return 0;\n return Math.max(2, (value / this.MaxRequests) * 100);\n }\n\n /**\n * Get error bar height for chart\n */\n public getErrorBarHeight(bucket: TimeBucket): number {\n if (bucket.requests === 0) return 0;\n return (bucket.errors / bucket.requests) * 100;\n }\n\n /**\n * Drill down into endpoint\n */\n public drillDownEndpoint(endpoint: EndpointStats): void {\n this.LogsFilter = { endpoint: endpoint.endpoint };\n this.loadFilteredLogs();\n this.ShowLogsPanel = true;\n }\n\n /**\n * Drill down into key\n */\n public drillDownKey(key: KeyStats): void {\n this.LogsFilter = { keyId: key.keyId };\n this.loadFilteredLogs();\n this.ShowLogsPanel = true;\n }\n\n /**\n * Load filtered logs for drill-down\n */\n private async loadFilteredLogs(): Promise<void> {\n this.IsLoadingLogs = true;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n let filter = this.getTimeFilter();\n\n if (this.LogsFilter.endpoint) {\n filter += filter ? ' AND ' : '';\n filter += `Endpoint = '${this.LogsFilter.endpoint}'`;\n }\n if (this.LogsFilter.keyId) {\n filter += filter ? ' AND ' : '';\n filter += `APIKeyID = '${this.LogsFilter.keyId}'`;\n }\n\n const result = await rv.RunView<MJAPIKeyUsageLogEntity>({\n EntityName: 'MJ: API Key Usage Logs',\n ExtraFilter: filter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.RecentLogs = result.Results.map(log => this.mapLogToItem(log));\n }\n\n this.IsLoadingLogs = false;\n this.cdr.markForCheck();\n }\n\n /**\n * Close logs panel\n */\n public closeLogsPanel(): void {\n this.ShowLogsPanel = false;\n this.LogsFilter = {};\n }\n\n /**\n * Get status class for HTTP status code\n */\n public getStatusClass(statusCode: number): string {\n if (statusCode >= 200 && statusCode < 300) return 'status-success';\n if (statusCode >= 300 && statusCode < 400) return 'status-info';\n if (statusCode >= 400 && statusCode < 500) return 'status-warning';\n if (statusCode >= 500) return 'status-error';\n return '';\n }\n\n /**\n * Get method badge class\n */\n public getMethodClass(method: string): string {\n const m = method.toUpperCase();\n if (m === 'GET') return 'method-get';\n if (m === 'POST') return 'method-post';\n if (m === 'PUT' || m === 'PATCH') return 'method-put';\n if (m === 'DELETE') return 'method-delete';\n return 'method-other';\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date | null): string {\n if (!date) return 'Never';\n const d = new Date(date);\n const now = new Date();\n const diff = now.getTime() - d.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n\n if (minutes < 1) return 'Just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n }\n\n /**\n * Format number with K/M suffix\n */\n public formatNumber(num: number): string {\n if (num >= 1000000) return (num / 1000000).toFixed(1) + 'M';\n if (num >= 1000) return (num / 1000).toFixed(1) + 'K';\n return num.toString();\n }\n}\n","<div class=\"usage-panel\">\n @if (IsLoading) {\n <mj-loading text=\"Loading usage analytics...\"></mj-loading>\n }\n\n @if (!IsLoading) {\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"header-left\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n API Usage Analytics\n </h3>\n <p class=\"panel-subtitle\">Monitor API key usage, performance, and trends</p>\n </div>\n <div class=\"time-filters\">\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'day'\"\n (click)=\"setTimeRange('day')\">24 Hours</button>\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'week'\"\n (click)=\"setTimeRange('week')\">7 Days</button>\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'month'\"\n (click)=\"setTimeRange('month')\">30 Days</button>\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'all'\"\n (click)=\"setTimeRange('all')\">All Time</button>\n </div>\n </div>\n <!-- Summary KPIs -->\n <div class=\"kpi-grid\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon requests\">\n <i class=\"fa-solid fa-arrow-right-arrow-left\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{formatNumber(TotalRequests)}}</div>\n <div class=\"kpi-label\">Total Requests</div>\n </div>\n </div>\n <div class=\"kpi-card\" [class.success]=\"SuccessRate >= 95\">\n <div class=\"kpi-icon success-rate\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{SuccessRate}}%</div>\n <div class=\"kpi-label\">Success Rate</div>\n </div>\n </div>\n <div class=\"kpi-card\" [class.warning]=\"TotalErrors > 0\">\n <div class=\"kpi-icon errors\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{formatNumber(TotalErrors)}}</div>\n <div class=\"kpi-label\">Errors</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon response-time\">\n <i class=\"fa-solid fa-gauge-high\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{AvgResponseTime}}ms</div>\n <div class=\"kpi-label\">Avg Response Time</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon keys\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{UniqueKeys}}</div>\n <div class=\"kpi-label\">Active Keys</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon endpoints\">\n <i class=\"fa-solid fa-code-branch\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{UniqueEndpoints}}</div>\n <div class=\"kpi-label\">Unique Endpoints</div>\n </div>\n </div>\n </div>\n <!-- Usage Chart -->\n <div class=\"chart-section\">\n <div class=\"chart-header\">\n <h4>Request Volume</h4>\n <div class=\"chart-legend\">\n <span class=\"legend-item\">\n <span class=\"legend-color requests\"></span> Requests\n </span>\n <span class=\"legend-item\">\n <span class=\"legend-color errors\"></span> Errors\n </span>\n </div>\n </div>\n @if (TimeBuckets.length > 0) {\n <div class=\"chart-container\">\n <div class=\"chart-bars\">\n @for (bucket of TimeBuckets; track bucket) {\n <div class=\"bar-group\" [title]=\"bucket.requests + ' requests, ' + bucket.errors + ' errors'\">\n <div class=\"bar-wrapper\">\n <div class=\"bar requests-bar\"\n [style.height.%]=\"getBarHeight(bucket.requests)\">\n @if (bucket.errors > 0) {\n <div class=\"bar errors-bar\"\n [style.height.%]=\"getErrorBarHeight(bucket)\"\n >\n </div>\n }\n </div>\n </div>\n <div class=\"bar-label\">{{bucket.label}}</div>\n </div>\n }\n </div>\n <div class=\"chart-y-axis\">\n <span>{{formatNumber(MaxRequests)}}</span>\n <span>{{formatNumber(Math.round(MaxRequests / 2))}}</span>\n <span>0</span>\n </div>\n </div>\n }\n @if (TimeBuckets.length === 0) {\n <div class=\"empty-chart\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <span>No usage data available</span>\n </div>\n }\n </div>\n <!-- Breakdown Grid -->\n <div class=\"breakdown-grid\">\n <!-- Top Endpoints -->\n <div class=\"breakdown-card\">\n <div class=\"breakdown-header\">\n <h4>\n <i class=\"fa-solid fa-code-branch\"></i>\n Top Endpoints\n </h4>\n </div>\n <div class=\"breakdown-content\">\n @if (TopEndpoints.length > 0) {\n <div class=\"endpoint-list\">\n @for (ep of TopEndpoints; track ep) {\n <div class=\"endpoint-item\"\n (click)=\"drillDownEndpoint(ep)\">\n <div class=\"endpoint-info\">\n <span class=\"method-badge\" [ngClass]=\"getMethodClass(ep.method)\">\n {{ep.method}}\n </span>\n <span class=\"endpoint-path\">{{ep.endpoint}}</span>\n </div>\n <div class=\"endpoint-stats\">\n <span class=\"endpoint-requests\">{{formatNumber(ep.requests)}}</span>\n <span class=\"endpoint-time\">{{ep.avgResponseTime}}ms</span>\n <span class=\"endpoint-error\" [class.has-errors]=\"ep.errorRate > 0\">\n {{ep.errorRate}}% err\n </span>\n </div>\n </div>\n }\n </div>\n }\n @if (TopEndpoints.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-code-branch\"></i>\n <span>No endpoint data</span>\n </div>\n }\n </div>\n </div>\n <!-- Top Keys -->\n <div class=\"breakdown-card\">\n <div class=\"breakdown-header\">\n <h4>\n <i class=\"fa-solid fa-key\"></i>\n Most Active Keys\n </h4>\n </div>\n <div class=\"breakdown-content\">\n @if (TopKeys.length > 0) {\n <div class=\"key-list\">\n @for (key of TopKeys; track key) {\n <div class=\"key-item\"\n (click)=\"drillDownKey(key)\">\n <div class=\"key-info\">\n <span class=\"key-label\">{{key.label}}</span>\n <span class=\"key-last-used\">{{formatDate(key.lastUsed)}}</span>\n </div>\n <div class=\"key-requests\">{{formatNumber(key.requests)}}</div>\n </div>\n }\n </div>\n }\n @if (TopKeys.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-key\"></i>\n <span>No key data</span>\n </div>\n }\n </div>\n </div>\n <!-- Status Distribution -->\n <div class=\"breakdown-card\">\n <div class=\"breakdown-header\">\n <h4>\n <i class=\"fa-solid fa-circle-half-stroke\"></i>\n Status Distribution\n </h4>\n </div>\n <div class=\"breakdown-content\">\n @if (StatusGroups.length > 0) {\n <div class=\"status-distribution\">\n <div class=\"status-bar\">\n @for (group of StatusGroups; track group) {\n <div class=\"status-segment\"\n [style.width.%]=\"group.percentage\"\n [style.backgroundColor]=\"group.color\"\n [title]=\"group.label + ': ' + group.count + ' (' + group.percentage + '%)'\">\n </div>\n }\n </div>\n <div class=\"status-legend\">\n @for (group of StatusGroups; track group) {\n <div class=\"status-legend-item\">\n <span class=\"status-color\" [style.backgroundColor]=\"group.color\"></span>\n <span class=\"status-label\">{{group.label}}</span>\n <span class=\"status-count\">{{formatNumber(group.count)}} ({{group.percentage}}%)</span>\n </div>\n }\n </div>\n </div>\n }\n @if (StatusGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-circle-half-stroke\"></i>\n <span>No status data</span>\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Recent Logs -->\n <div class=\"logs-section\">\n <div class=\"logs-header\">\n <h4>\n <i class=\"fa-solid fa-list\"></i>\n Recent Requests\n </h4>\n </div>\n @if (RecentLogs.length > 0) {\n <div class=\"logs-table\">\n <div class=\"logs-table-header\">\n <span class=\"col-time\">Time</span>\n <span class=\"col-key\">API Key</span>\n <span class=\"col-method\">Method</span>\n <span class=\"col-endpoint\">Endpoint</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-duration\">Duration</span>\n </div>\n <div class=\"logs-table-body\">\n @for (log of RecentLogs; track log) {\n <div class=\"log-row\">\n <span class=\"col-time\">{{formatDate(log.timestamp)}}</span>\n <span class=\"col-key\">{{log.keyLabel}}</span>\n <span class=\"col-method\">\n <span class=\"method-badge\" [ngClass]=\"getMethodClass(log.method)\">\n {{log.method}}\n </span>\n </span>\n <span class=\"col-endpoint\">{{log.endpoint}}</span>\n <span class=\"col-status\" [ngClass]=\"getStatusClass(log.statusCode)\">\n {{log.statusCode}}\n </span>\n <span class=\"col-duration\">{{log.responseTime}}ms</span>\n </div>\n }\n </div>\n </div>\n }\n @if (RecentLogs.length === 0) {\n <div class=\"empty-state large\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No requests logged yet</span>\n <p>API usage will appear here once keys are used</p>\n </div>\n }\n </div>\n }\n\n <!-- Drill-down Panel -->\n @if (ShowLogsPanel) {\n <mj-window\n [Width]=\"800\"\n [MinWidth]=\"600\"\n [Height]=\"500\"\n [MinHeight]=\"400\"\n [Resizable]=\"true\"\n [Draggable]=\"true\"\n [Top]=\"80\"\n [Visible]=\"true\"\n (Close)=\"closeLogsPanel()\">\n <mj-window-titlebar>\n <div class=\"drilldown-title\">\n <i class=\"fa-solid fa-magnifying-glass-chart\"></i>\n <span>Request Details</span>\n @if (LogsFilter.endpoint) {\n <span class=\"filter-badge\">\n {{LogsFilter.endpoint}}\n </span>\n }\n @if (LogsFilter.keyId) {\n <span class=\"filter-badge\">\n Key: {{KeyMap.get(LogsFilter.keyId) || 'Unknown'}}\n </span>\n }\n </div>\n <button mjButton variant=\"flat\" (click)=\"closeLogsPanel()\" class=\"window-close-btn\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </mj-window-titlebar>\n <div class=\"drilldown-content\">\n @if (IsLoadingLogs) {\n <mj-loading text=\"Loading requests...\"></mj-loading>\n }\n @if (!IsLoadingLogs) {\n <div class=\"drilldown-logs\">\n <div class=\"logs-table\">\n <div class=\"logs-table-header\">\n <span class=\"col-time\">Time</span>\n <span class=\"col-key\">API Key</span>\n <span class=\"col-method\">Method</span>\n <span class=\"col-endpoint\">Endpoint</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-duration\">Duration</span>\n </div>\n <div class=\"logs-table-body scrollable\">\n @for (log of RecentLogs; track log) {\n <div class=\"log-row\">\n <span class=\"col-time\">{{formatDate(log.timestamp)}}</span>\n <span class=\"col-key\">{{log.keyLabel}}</span>\n <span class=\"col-method\">\n <span class=\"method-badge\" [ngClass]=\"getMethodClass(log.method)\">\n {{log.method}}\n </span>\n </span>\n <span class=\"col-endpoint\">{{log.endpoint}}</span>\n <span class=\"col-status\" [ngClass]=\"getStatusClass(log.statusCode)\">\n {{log.statusCode}}\n </span>\n <span class=\"col-duration\">{{log.responseTime}}ms</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </mj-window>\n }\n</div>\n"]}
@@ -1,13 +1,14 @@
1
1
  import { OnInit, OnDestroy, EventEmitter } from '@angular/core';
2
2
  import { MJActionEntity, MJActionCategoryEntity } from '@memberjunction/core-entities';
3
3
  import { BehaviorSubject } from 'rxjs';
4
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
4
5
  import * as i0 from "@angular/core";
5
6
  interface CategoryTreeNode {
6
7
  category: MJActionCategoryEntity;
7
8
  children: CategoryTreeNode[];
8
9
  level: number;
9
10
  }
10
- export declare class ActionsListViewComponent implements OnInit, OnDestroy {
11
+ export declare class ActionsListViewComponent extends BaseAngularComponent implements OnInit, OnDestroy {
11
12
  openEntityRecord: EventEmitter<{
12
13
  entityName: string;
13
14
  recordId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"actions-list-view.component.d.ts","sourceRoot":"","sources":["../../../src/Actions/components/actions-list-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAW,eAAe,EAAiB,MAAM,MAAM,CAAC;;AAG/D,UAAU,gBAAgB;IACxB,QAAQ,EAAE,sBAAsB,CAAC;IACjC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAMa,wBAAyB,YAAW,MAAM,EAAE,SAAS;IACtD,gBAAgB;oBAAiC,MAAM;kBAAY,MAAM;OAAK;IAEjF,SAAS,UAAQ;IACjB,OAAO,EAAE,cAAc,EAAE,CAAM;IAC/B,eAAe,EAAE,cAAc,EAAE,CAAM;IACvC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAa;IAC5D,YAAY,EAAE,gBAAgB,EAAE,CAAM;IACtC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAa;IAE1D,WAAW,0BAAmC;IAC9C,eAAe,0BAAsC;IACrD,aAAa,0BAAsC;IACnD,iBAAiB,0BAAsC;IACvD,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAE5C,aAAa;;;QAKlB;IAEK,WAAW;;;QAIhB;IAEK,eAAe,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAE1D;IAEF,OAAO,CAAC,QAAQ,CAAuB;;IAIvC,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAKnB,OAAO,CAAC,YAAY;YAaN,QAAQ;IA2CtB,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,iBAAiB;IAmCzB,OAAO,CAAC,sBAAsB;IA6B9B,OAAO,CAAC,YAAY;IA0Cb,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIxC,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI1C,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAItC,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIhD,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAOxC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAKlD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM;IASxE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQxC;;;OAGG;IACI,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAK7C,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQhD,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI/C,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIxC,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IASlD,gBAAgB,UAAS;IAEzB,kBAAkB,IAAI,IAAI;yCAzTtB,wBAAwB;2CAAxB,wBAAwB;CA4TpC"}
1
+ {"version":3,"file":"actions-list-view.component.d.ts","sourceRoot":"","sources":["../../../src/Actions/components/actions-list-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAW,eAAe,EAAiB,MAAM,MAAM,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAErE,UAAU,gBAAgB;IACxB,QAAQ,EAAE,sBAAsB,CAAC;IACjC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAMa,wBAAyB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IACnF,gBAAgB;oBAAiC,MAAM;kBAAY,MAAM;OAAK;IAEjF,SAAS,UAAQ;IACjB,OAAO,EAAE,cAAc,EAAE,CAAM;IAC/B,eAAe,EAAE,cAAc,EAAE,CAAM;IACvC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAa;IAC5D,YAAY,EAAE,gBAAgB,EAAE,CAAM;IACtC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAa;IAE1D,WAAW,0BAAmC;IAC9C,eAAe,0BAAsC;IACrD,aAAa,0BAAsC;IACnD,iBAAiB,0BAAsC;IACvD,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAE5C,aAAa;;;QAKlB;IAEK,WAAW;;;QAIhB;IAEK,eAAe,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAE1D;IAEF,OAAO,CAAC,QAAQ,CAAuB;;IAIvC,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAKnB,OAAO,CAAC,YAAY;YAaN,QAAQ;IA2CtB,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,iBAAiB;IAmCzB,OAAO,CAAC,sBAAsB;IA6B9B,OAAO,CAAC,YAAY;IA0Cb,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIxC,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI1C,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAItC,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIhD,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAOxC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAKlD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM;IASxE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQxC;;;OAGG;IACI,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAK7C,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQhD,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI/C,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIxC,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IASlD,gBAAgB,UAAS;IAEzB,kBAAkB,IAAI,IAAI;yCAzTtB,wBAAwB;2CAAxB,wBAAwB;CA4TpC"}
@@ -2,6 +2,7 @@ import { Component, Output, EventEmitter } from '@angular/core';
2
2
  import { RunView, LogError } from '@memberjunction/core';
3
3
  import { Subject, BehaviorSubject, combineLatest } from 'rxjs';
4
4
  import { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';
5
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "@angular/common";
7
8
  import * as i2 from "@angular/forms";
@@ -223,7 +224,7 @@ function ActionsListViewComponent_Conditional_26_Template(rf, ctx) { if (rf & 1)
223
224
  i0.ɵɵadvance();
224
225
  i0.ɵɵproperty("showText", false);
225
226
  } }
226
- export class ActionsListViewComponent {
227
+ export class ActionsListViewComponent extends BaseAngularComponent {
227
228
  openEntityRecord = new EventEmitter();
228
229
  isLoading = true;
229
230
  actions = [];
@@ -251,7 +252,7 @@ export class ActionsListViewComponent {
251
252
  { text: 'All Categories', value: 'all' }
252
253
  ];
253
254
  destroy$ = new Subject();
254
- constructor() { }
255
+ constructor() { super(); }
255
256
  ngOnInit() {
256
257
  this.setupFilters();
257
258
  this.loadData();
@@ -273,7 +274,7 @@ export class ActionsListViewComponent {
273
274
  async loadData() {
274
275
  try {
275
276
  this.isLoading = true;
276
- const rv = new RunView();
277
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
277
278
  const [actionsResult, categoriesResult] = await rv.RunViews([
278
279
  {
279
280
  EntityName: 'MJ: Actions',
@@ -486,7 +487,7 @@ export class ActionsListViewComponent {
486
487
  this.showCategoryTree = !this.showCategoryTree;
487
488
  }
488
489
  static ɵfac = function ActionsListViewComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ActionsListViewComponent)(); };
489
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActionsListViewComponent, selectors: [["mj-actions-list-view"]], outputs: { openEntityRecord: "openEntityRecord" }, standalone: false, decls: 27, vars: 14, consts: [["categoryTreeTemplate", ""], [1, "actions-list-view"], [1, "list-header"], [1, "header-title"], [1, "fa-solid", "fa-cogs"], [1, "results-count"], [1, "filters-row"], [1, "search-container"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search actions...", 1, "mj-input", 3, "input", "value"], [1, "filter-group"], ["TextField", "text", "ValueField", "value", 3, "ValueChange", "Data", "ValuePrimitive", "ngModel"], ["mjButton", "", "variant", "outline", 1, "category-filter-button", 3, "click"], [1, "fa-solid", "fa-folder-tree"], [1, "badge"], [1, "category-tree-panel"], [1, "actions-list"], [1, "empty-state"], [1, "loading-overlay"], [1, "tree-header"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "fa-solid", "fa-times"], [1, "tree-actions"], [1, "fa-solid", "fa-folder-open"], [1, "tree-content"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "tree-node", 3, "padding-left"], [1, "tree-node"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "tree-node-button", 3, "click"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "expand-button"], [1, "no-expand"], [1, "fa-solid", "fa-folder"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "expand-button", 3, "click"], [1, "fa-solid", "fa-chevron-down"], [1, "fa-solid", "fa-chevron-right"], [1, "action-card"], [1, "action-card", 3, "click"], [1, "action-icon"], [1, "action-main"], [1, "action-header"], [1, "action-name"], [1, "action-badges"], [1, "status-chip"], ["data-color", "info", 1, "status-chip"], [1, "action-description"], [1, "action-details"], [1, "detail-item"], [1, "action-actions"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fa-solid", "fa-ellipsis-vertical"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-clock"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-search"], ["size", "medium", 3, "showText"]], template: function ActionsListViewComponent_Template(rf, ctx) { if (rf & 1) {
490
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActionsListViewComponent, selectors: [["mj-actions-list-view"]], outputs: { openEntityRecord: "openEntityRecord" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 27, vars: 14, consts: [["categoryTreeTemplate", ""], [1, "actions-list-view"], [1, "list-header"], [1, "header-title"], [1, "fa-solid", "fa-cogs"], [1, "results-count"], [1, "filters-row"], [1, "search-container"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search actions...", 1, "mj-input", 3, "input", "value"], [1, "filter-group"], ["TextField", "text", "ValueField", "value", 3, "ValueChange", "Data", "ValuePrimitive", "ngModel"], ["mjButton", "", "variant", "outline", 1, "category-filter-button", 3, "click"], [1, "fa-solid", "fa-folder-tree"], [1, "badge"], [1, "category-tree-panel"], [1, "actions-list"], [1, "empty-state"], [1, "loading-overlay"], [1, "tree-header"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "fa-solid", "fa-times"], [1, "tree-actions"], [1, "fa-solid", "fa-folder-open"], [1, "tree-content"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "tree-node", 3, "padding-left"], [1, "tree-node"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "tree-node-button", 3, "click"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "expand-button"], [1, "no-expand"], [1, "fa-solid", "fa-folder"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "expand-button", 3, "click"], [1, "fa-solid", "fa-chevron-down"], [1, "fa-solid", "fa-chevron-right"], [1, "action-card"], [1, "action-card", 3, "click"], [1, "action-icon"], [1, "action-main"], [1, "action-header"], [1, "action-name"], [1, "action-badges"], [1, "status-chip"], ["data-color", "info", 1, "status-chip"], [1, "action-description"], [1, "action-details"], [1, "detail-item"], [1, "action-actions"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fa-solid", "fa-ellipsis-vertical"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-clock"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-search"], ["size", "medium", 3, "showText"]], template: function ActionsListViewComponent_Template(rf, ctx) { if (rf & 1) {
490
491
  i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "h2");
491
492
  i0.ɵɵelement(4, "i", 4);
492
493
  i0.ɵɵtext(5, " Actions");
@@ -545,5 +546,5 @@ export class ActionsListViewComponent {
545
546
  }], () => [], { openEntityRecord: [{
546
547
  type: Output
547
548
  }] }); })();
548
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ActionsListViewComponent, { className: "ActionsListViewComponent", filePath: "src/Actions/components/actions-list-view.component.ts", lineNumber: 19 }); })();
549
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ActionsListViewComponent, { className: "ActionsListViewComponent", filePath: "src/Actions/components/actions-list-view.component.ts", lineNumber: 20 }); })();
549
550
  //# sourceMappingURL=actions-list-view.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"actions-list-view.component.js","sourceRoot":"","sources":["../../../src/Actions/components/actions-list-view.component.ts","../../../src/Actions/components/actions-list-view.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;;;;;;;;;;ICwCnE,gCACF;;;IACE,YACF;;;IADE,uFACF;;;IAiCF,wBAAwG;;;IAoB5F,wBAAwC;;;IAExC,wBAAyC;;;;IAR7C,kCAI+E;IAA7E,+PAAS,kDAAwC,wBAAE,wBAAwB,KAAC;IAG1E,AAFF,2IAA4C,qHAEnC;IAGX,iBAAS;;;;IALP,cAIC;IAJD,wEAIC;;;IAGH,2BAA+B;;;IASjC,wBAAyG;;;IAAzG,8IAA0F;;;;;IAAnC,AAAxC,0DAAwC,yEAAiC;;;;IA7B1F,AADF,+BAAiE,iBAMlB;IAA3C,6OAAS,0CAAgC,KAAC;IAcxC,AAZF,kIAAgC,0GAYvB;IAIT,wBAAkC;IAClC,YACA;IAAA,gCAAoB;IAAA,YAA8C;IACpE,AADoE,iBAAO,EAClE;IAET,oIAAwE;IAG1E,iBAAM;;;;IAhCiB,wDAAyC;IAK5D,cAA+D;IAA/D,kFAA+D;IAG/D,cAcC;IAdD,qDAcC;IAGD,eACA;IADA,sDACA;IAAoB,eAA8C;IAA9C,wEAA8C;IAGpE,cAEC;IAFD,wGAEC;;;IAhCL,0HAkCC;;;IAlCD,uBAkCC;;;;IA5DD,AADF,AADF,+BAAiC,cACN,SACnB;IAAA,+BAAe;IAAA,iBAAK;IACxB,kCAGiC;IAA/B,6LAAS,2BAAoB,KAAC;IAC9B,wBAAiC;IAErC,AADE,iBAAS,EACL;IAGJ,AADF,+BAA0B,iBAK+B;IADrD,6LAAS,sBAAe,KAAK,CAAC,KAAC;IAE/B,wBAAuC;IACvC,gCACA;IAAA,iCAAoB;IAAA,aAAoB;IAE5C,AADE,AAD0C,iBAAO,EACxC,EACL;IAEN,gCAA0B;IACxB,6GAAyF;IAC3F,iBAAM;IAEN,2IAAqD;IAqCvD,iBAAM;;;;IAhDA,eAAoD;IAApD,oEAAoD;IAGhC,eAAoB;IAApB,2CAAoB;IAK3B,eAAwC;IAAA,AAAxC,0DAAwC,4EAAgC;;;IA4D7E,gCAA4C;IAC1C,wBAAiC;IAAC,8BACpC;IAAA,iBAAO;;;IAeT,+BAAyB;IACvB,wBAAiC;IACjC,4BAAM;IAAA,YAAwD;;IAChE,AADgE,iBAAO,EACjE;;;IADE,eAAwD;IAAxD,gGAAwD;;;IAIhE,+BAAyB;IACvB,wBAAwC;IACxC,4BAAM;IAAA,YAA+B;IACvC,AADuC,iBAAO,EACxC;;;IADE,eAA+B;IAA/B,kDAA+B;;;;IAtC/C,+BAAsD;IAA7B,6NAAS,4BAAkB,KAAC;IACnD,+BAAyB;IACvB,oBAAuC;IACzC,iBAAM;IAIF,AADF,AADF,+BAAyB,cACI,aACD;IAAA,YAAiB;IAAA,iBAAK;IAE5C,AADF,+BAA2B,eACmD;IAC1E,YACF;IAAA,iBAAO;IACP,mHAAmC;IAMvC,AADE,iBAAM,EACF;IAEN,gCAAgC;IAC9B,aACF;IAAA,iBAAM;IAGJ,AADF,gCAA4B,eACD;IACvB,yBAAkC;IAClC,6BAAM;IAAA,aAAwC;IAChD,AADgD,iBAAO,EACjD;IACN,kHAA6B;IAM7B,kHAAgE;IAOpE,AADE,iBAAM,EACF;IAGJ,AADF,gCAA4B,kBAGW;IAAnC,uKAAS,wBAAwB,KAAC;IAClC,yBAA6C;IAGnD,AADE,AADE,iBAAS,EACL,EACF;;;;IAjDC,eAA+B;IAA/B,8CAA+B;IAKR,eAAiB;IAAjB,oCAAiB;IAEb,eAAiD;;IACzE,cACF;IADE,iDACF;IACA,cAIC;IAJD,0DAIC;IAKH,eACF;IADE,oFACF;IAKU,eAAwC;IAAxC,kEAAwC;IAEhD,cAKC;IALD,oDAKC;IACD,cAKC;IALD,0FAKC;;;IAzCT,6GAqDC;;;IArDD,qCAqDC;;;IAED,+BAAyB;IACvB,wBAAkC;IAClC,0BAAI;IAAA,gCAAgB;IAAA,iBAAK;IACzB,yBAAG;IAAA,4DAA4C;IACjD,AADiD,iBAAI,EAC/C;;;IAKR,+BAA6B;IAC3B,iCAA0D;IAC5D,iBAAM;;IADQ,cAAkB;IAAlB,gCAAkB;;AD7KpC,MAAM,OAAO,wBAAwB;IACzB,gBAAgB,GAAG,IAAI,YAAY,EAA0C,CAAC;IAEjF,SAAS,GAAG,IAAI,CAAC;IACjB,OAAO,GAAqB,EAAE,CAAC;IAC/B,eAAe,GAAqB,EAAE,CAAC;IACvC,UAAU,GAAwC,IAAI,GAAG,EAAE,CAAC;IAC5D,YAAY,GAAuB,EAAE,CAAC;IACtC,mBAAmB,GAA6B,IAAI,GAAG,EAAE,CAAC;IAE1D,WAAW,GAAG,IAAI,eAAe,CAAS,EAAE,CAAC,CAAC;IAC9C,eAAe,GAAG,IAAI,eAAe,CAAS,KAAK,CAAC,CAAC;IACrD,aAAa,GAAG,IAAI,eAAe,CAAS,KAAK,CAAC,CAAC;IACnD,iBAAiB,GAAG,IAAI,eAAe,CAAS,KAAK,CAAC,CAAC;IACvD,kBAAkB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAE5C,aAAa,GAAG;QACrB,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE;QACtC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;QACnC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;QACrC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;KACxC,CAAC;IAEK,WAAW,GAAG;QACnB,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE;QACnC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE;QAC5C,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;KACpC,CAAC;IAEK,eAAe,GAAyC;QAC7D,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE;KACzC,CAAC;IAEM,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAEvC,gBAAe,CAAC;IAEhB,QAAQ;QACN,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,WAAW;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAEO,YAAY;QAClB,aAAa,CAAC;YACZ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,oBAAoB,EAAE,CAAC;YAChE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACjD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;SACpD,CAAC,CAAC,IAAI,CACL,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YAEtB,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YAEzB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC;gBAC1D;oBACE,UAAU,EAAE,aAAa;oBACzB,OAAO,EAAE,MAAM;iBAChB;gBACD;oBACE,UAAU,EAAE,uBAAuB;oBACnC,OAAO,EAAE,MAAM;iBAChB;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBACxD,MAAM,MAAM,GAAG,EAAE,CAAC;gBAClB,IAAI,CAAC,aAAa,CAAC,OAAO;oBACxB,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;gBACxD,IAAI,CAAC,gBAAgB,CAAC,OAAO;oBAC3B,MAAM,CAAC,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAC9D,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,aAAa,CAAC,OAAO,IAAI,EAAE,CAAqB,CAAC;YAClE,MAAM,UAAU,GAAG,CAAC,gBAAgB,CAAC,OAAO,IAAI,EAAE,CAA6B,CAAC;YAEhF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;YACvC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;YACtC,IAAI,CAAC,YAAY,EAAE,CAAC;QAEtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;YACzD,QAAQ,CAAC,kCAAkC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAGO,qBAAqB,CAAC,UAAoC;QAChE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEnC,mDAAmD;QACnD,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAEO,oBAAoB,CAAC,UAAoC;QAC/D,IAAI,CAAC,eAAe,GAAG;YACrB,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE;YACxC,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,KAAK,EAAE,QAAQ,CAAC,EAAE;aACnB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAEO,iBAAiB,CAAC,UAAoC;QAC5D,MAAM,WAAW,GAAG,IAAI,GAAG,EAA4B,CAAC;QAExD,+BAA+B;QAC/B,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC5B,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAC3B,QAAQ;gBACR,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,oCAAoC;QACpC,MAAM,SAAS,GAAuB,EAAE,CAAC;QACzC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACxC,IAAI,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;gBAC1C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,sCAAsC;QACtC,MAAM,YAAY,GAAG,CAAC,KAAyB,EAAE,EAAE;YACjD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACrE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC;QACF,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;IAChC,CAAC;IAEO,sBAAsB,CAAC,UAAoC;QACjE,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAEjC,uCAAuC;QACvC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC5B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,cAAc,GAAG,CAAC,UAAkB,EAAE,YAAoB,EAAE,EAAE;YAClE,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC7D,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC;QAEF,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC5B,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACtB,yDAAyD;gBACzD,IAAI,eAAe,GAAkB,QAAQ,CAAC,QAAQ,CAAC;gBACvD,OAAO,eAAe,EAAE,CAAC;oBACvB,cAAc,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;oBACpD,eAAe,GAAG,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,YAAY;QAClB,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjC,sBAAsB;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACxD,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAClC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC9C,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC9D,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAC1C,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACjE,CAAC;QAED,oBAAoB;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QACtC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC7D,CAAC;QAED,+CAA+C;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAChD,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YACzB,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC/D,IAAI,aAAa,EAAE,CAAC;gBAClB,gFAAgF;gBAChF,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAClC,MAAM,CAAC,UAAU,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAC1D,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,eAAe,UAAU,kCAAkC,CAAC,CAAC;gBAC1E,QAAQ,GAAG,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;IAClC,CAAC;IAEM,cAAc,CAAC,UAAkB;QACtC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAEM,oBAAoB,CAAC,MAAc;QACxC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAEM,kBAAkB,CAAC,IAAY;QACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAEM,sBAAsB,CAAC,UAAkB;QAC9C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAEM,UAAU,CAAC,MAAsB;QACtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACzB,UAAU,EAAE,aAAa;YACzB,QAAQ,EAAE,MAAM,CAAC,EAAE;SACpB,CAAC,CAAC;IACL,CAAC;IAEM,eAAe,CAAC,UAAyB;QAC9C,IAAI,CAAC,UAAU;YAAE,OAAO,aAAa,CAAC;QACtC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,IAAI,IAAI,kBAAkB,CAAC;IACrE,CAAC;IAEM,cAAc,CAAC,MAAc;QAClC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,QAAQ,CAAC,CAAC,OAAO,SAAS,CAAC;YAChC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;YACjC,KAAK,UAAU,CAAC,CAAC,OAAO,OAAO,CAAC;YAChC,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;QACzB,CAAC;IACH,CAAC;IAEM,WAAW,CAAC,IAAY;QAC7B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,WAAW,CAAC,CAAC,OAAO,mBAAmB,CAAC;YAC7C,KAAK,QAAQ,CAAC,CAAC,OAAO,kBAAkB,CAAC;YACzC,OAAO,CAAC,CAAC,OAAO,iBAAiB,CAAC;QACpC,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,aAAa,CAAC,MAAsB;QACzC,OAAO,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,oBAAoB;IACb,sBAAsB,CAAC,UAAkB;QAC9C,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAEM,kBAAkB,CAAC,UAAkB;QAC1C,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAEM,cAAc,CAAC,UAAkB;QACtC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAEM,sBAAsB,CAAC,UAAkB;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,CAAC,aAAa;YAAE,OAAO,CAAC,CAAC;QAE7B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAClC,MAAM,CAAC,UAAU,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAC1D,CAAC,MAAM,CAAC;IACX,CAAC;IAEM,gBAAgB,GAAG,KAAK,CAAC;IAEzB,kBAAkB;QACvB,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACjD,CAAC;kHA3TU,wBAAwB;6DAAxB,wBAAwB;YCd/B,AADF,AADF,AAFF,8BAAgC,aAEL,aACG,SACpB;YAAA,uBAAgC;YAAC,wBAAO;YAAA,iBAAK;YACjD,8BAA2B;YAAA,YAA4D;YACzF,AADyF,iBAAM,EACzF;YAIF,AADF,AADF,8BAAyB,aACO,cACM;YAChC,wBAA8C;YAC9C,kCAGwD;YAAtD,2GAAS,uCAAyC,IAAC;YAEzD,AADE,AAJE,iBAGwD,EACpD,EACF;YAGJ,AADF,gCAA0B,uBAO6B;YAAnD,6HAAe,gCAAkC,IAAC;YACpD,iBAAc;YAEd,wCAMmD;YAAjD,6HAAe,8BAAgC,IAAC;YAClD,iBAAc;YAEd,mCAGiC;YAD/B,sGAAS,wBAAoB,IAAC;YAE9B,yBAAuC;YAGrC,AAFF,kFAAyC,4DAEhC;YAGT,iCAAoB;YAAA,aAAqD;YAIjF,AADE,AADE,AADE,AAD2E,iBAAO,EACzE,EACL,EACF,EACF;YAGN,8FAAwB;YAqExB,gCAA0B;YAwDtB,AAvDF,kFAAkC,uEAuDT;YAO3B,iBAAM;YAEN,6FAAiB;YAKnB,iBAAM;;YA7L2B,eAA4D;YAA5D,6FAA4D;YASjF,eAA2B;YAA3B,6CAA2B;YAO7B,eAAsB;YAItB,AADA,AAHA,wCAAsB,wBAGC,sCACU;YAKjC,cAAoB;YAIpB,AADA,AAHA,sCAAoB,wBAGG,oCACQ;YAS/B,eAIC;YAJD,iEAIC;YACmB,eAAqD;YAArD,6EAAqD;YAOjF,cAkEC;YAlED,gDAkEC;YAIC,eA6DC;YA7DD,gFA6DC;YAGH,eAIC;YAJD,yCAIC;;;iFD/KU,wBAAwB;cANpC,SAAS;6BACI,KAAK,YACP,sBAAsB;;kBAK/B,MAAM;;kFADI,wBAAwB","sourcesContent":["import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport { RunView, LogError } from '@memberjunction/core';\nimport { MJActionEntity, MJActionCategoryEntity } from '@memberjunction/core-entities';\nimport { Subject, BehaviorSubject, combineLatest } from 'rxjs';\nimport { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';\n\ninterface CategoryTreeNode {\n category: MJActionCategoryEntity;\n children: CategoryTreeNode[];\n level: number;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-actions-list-view',\n templateUrl: './actions-list-view.component.html',\n styleUrls: ['./actions-list-view.component.css']\n})\nexport class ActionsListViewComponent implements OnInit, OnDestroy {\n @Output() openEntityRecord = new EventEmitter<{entityName: string; recordId: string}>();\n\n public isLoading = true;\n public actions: MJActionEntity[] = [];\n public filteredActions: MJActionEntity[] = [];\n public categories: Map<string, MJActionCategoryEntity> = new Map();\n public categoryTree: CategoryTreeNode[] = [];\n public categoryDescendants: Map<string, Set<string>> = new Map();\n\n public searchTerm$ = new BehaviorSubject<string>('');\n public selectedStatus$ = new BehaviorSubject<string>('all');\n public selectedType$ = new BehaviorSubject<string>('all');\n public selectedCategory$ = new BehaviorSubject<string>('all');\n public expandedCategories: Set<string> = new Set();\n\n public statusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Pending', value: 'Pending' },\n { text: 'Disabled', value: 'Disabled' }\n ];\n\n public typeOptions = [\n { text: 'All Types', value: 'all' },\n { text: 'AI Generated', value: 'Generated' },\n { text: 'Custom', value: 'Custom' }\n ];\n\n public categoryOptions: Array<{text: string; value: string}> = [\n { text: 'All Categories', value: 'all' }\n ];\n\n private destroy$ = new Subject<void>();\n\n constructor() {}\n\n ngOnInit(): void {\n this.setupFilters();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupFilters(): void {\n combineLatest([\n this.searchTerm$.pipe(debounceTime(300), distinctUntilChanged()),\n this.selectedStatus$.pipe(distinctUntilChanged()),\n this.selectedType$.pipe(distinctUntilChanged()),\n this.selectedCategory$.pipe(distinctUntilChanged())\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.applyFilters();\n });\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n \n const rv = new RunView();\n \n const [actionsResult, categoriesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Actions',\n OrderBy: 'Name'\n },\n {\n EntityName: 'MJ: Action Categories',\n OrderBy: 'Name'\n }\n ]);\n \n if (!actionsResult.Success || !categoriesResult.Success) {\n const errors = [];\n if (!actionsResult.Success) \n errors.push('Actions: ' + actionsResult.ErrorMessage);\n if (!categoriesResult.Success) \n errors.push('Categories: ' + categoriesResult.ErrorMessage);\n throw new Error('Failed to load data: ' + errors.join(', '));\n }\n \n const actions = (actionsResult.Results || []) as MJActionEntity[];\n const categories = (categoriesResult.Results || []) as MJActionCategoryEntity[];\n \n this.actions = actions;\n this.populateCategoriesMap(categories);\n this.buildCategoryOptions(categories);\n this.applyFilters();\n\n } catch (error) {\n console.error('Error loading actions list data:', error);\n LogError('Failed to load actions list data', undefined, error);\n } finally {\n this.isLoading = false;\n }\n }\n\n\n private populateCategoriesMap(categories: MJActionCategoryEntity[]): void {\n this.categories.clear();\n categories.forEach(category => {\n this.categories.set(category.ID, category);\n });\n \n // Build the category tree\n this.buildCategoryTree(categories);\n \n // Build descendant mapping for efficient filtering\n this.buildDescendantMapping(categories);\n }\n\n private buildCategoryOptions(categories: MJActionCategoryEntity[]): void {\n this.categoryOptions = [\n { text: 'All Categories', value: 'all' },\n ...categories.map(category => ({\n text: category.Name,\n value: category.ID\n }))\n ];\n }\n\n private buildCategoryTree(categories: MJActionCategoryEntity[]): void {\n const categoryMap = new Map<string, CategoryTreeNode>();\n \n // First pass: create all nodes\n categories.forEach(category => {\n categoryMap.set(category.ID, {\n category,\n children: [],\n level: 0\n });\n });\n \n // Second pass: build tree structure\n const rootNodes: CategoryTreeNode[] = [];\n categoryMap.forEach(node => {\n const parentId = node.category.ParentID;\n if (parentId && categoryMap.has(parentId)) {\n const parent = categoryMap.get(parentId)!;\n parent.children.push(node);\n node.level = parent.level + 1;\n } else {\n rootNodes.push(node);\n }\n });\n \n // Sort children at each level by name\n const sortChildren = (nodes: CategoryTreeNode[]) => {\n nodes.sort((a, b) => a.category.Name.localeCompare(b.category.Name));\n nodes.forEach(node => sortChildren(node.children));\n };\n sortChildren(rootNodes);\n \n this.categoryTree = rootNodes;\n }\n\n private buildDescendantMapping(categories: MJActionCategoryEntity[]): void {\n this.categoryDescendants.clear();\n \n // Initialize each category with itself\n categories.forEach(category => {\n this.categoryDescendants.set(category.ID, new Set([category.ID]));\n });\n \n // Build descendant sets\n const addDescendants = (categoryId: string, descendantId: string) => {\n const descendants = this.categoryDescendants.get(categoryId);\n if (descendants) {\n descendants.add(descendantId);\n }\n };\n \n categories.forEach(category => {\n if (category.ParentID) {\n // Add this category as a descendant of all its ancestors\n let currentParentId: string | null = category.ParentID;\n while (currentParentId) {\n addDescendants(currentParentId, category.ID);\n const parent = this.categories.get(currentParentId);\n currentParentId = parent?.ParentID || null;\n }\n }\n });\n }\n\n private applyFilters(): void {\n let filtered = [...this.actions];\n\n // Apply search filter\n const searchTerm = this.searchTerm$.value.toLowerCase();\n if (searchTerm) {\n filtered = filtered.filter(action => \n action.Name.toLowerCase().includes(searchTerm) ||\n (action.Description || '').toLowerCase().includes(searchTerm)\n );\n }\n\n // Apply status filter\n const status = this.selectedStatus$.value;\n if (status !== 'all') {\n filtered = filtered.filter(action => action.Status === status);\n }\n\n // Apply type filter\n const type = this.selectedType$.value;\n if (type !== 'all') {\n filtered = filtered.filter(action => action.Type === type);\n }\n\n // Apply category filter (includes descendants)\n const categoryId = this.selectedCategory$.value;\n if (categoryId !== 'all') {\n const descendantIds = this.categoryDescendants.get(categoryId);\n if (descendantIds) {\n // Filter actions that belong to the selected category or any of its descendants\n filtered = filtered.filter(action => \n action.CategoryID && descendantIds.has(action.CategoryID)\n );\n } else {\n console.warn(`Category ID ${categoryId} not found in category hierarchy`);\n filtered = [];\n }\n }\n\n this.filteredActions = filtered;\n }\n\n public onSearchChange(searchTerm: string): void {\n this.searchTerm$.next(searchTerm);\n }\n\n public onStatusFilterChange(status: string): void {\n this.selectedStatus$.next(status);\n }\n\n public onTypeFilterChange(type: string): void {\n this.selectedType$.next(type);\n }\n\n public onCategoryFilterChange(categoryId: string): void {\n this.selectedCategory$.next(categoryId);\n }\n\n public openAction(action: MJActionEntity): void {\n this.openEntityRecord.emit({\n entityName: 'MJ: Actions',\n recordId: action.ID\n });\n }\n\n public getCategoryName(categoryId: string | null): string {\n if (!categoryId) return 'No Category';\n return this.categories.get(categoryId)?.Name || 'Unknown Category';\n }\n\n public getStatusColor(status: string): 'success' | 'warning' | 'error' | 'info' {\n switch (status) {\n case 'Active': return 'success';\n case 'Pending': return 'warning';\n case 'Disabled': return 'error';\n default: return 'info';\n }\n }\n\n public getTypeIcon(type: string): string {\n switch (type) {\n case 'Generated': return 'fa-solid fa-robot';\n case 'Custom': return 'fa-solid fa-code';\n default: return 'fa-solid fa-cog';\n }\n }\n\n /**\n * Gets the icon class for an action\n * Falls back to type-based icon if no IconClass is set\n */\n public getActionIcon(action: MJActionEntity): string {\n return action?.IconClass || this.getTypeIcon(action.Type);\n }\n\n // Tree view methods\n public toggleCategoryExpanded(categoryId: string): void {\n if (this.expandedCategories.has(categoryId)) {\n this.expandedCategories.delete(categoryId);\n } else {\n this.expandedCategories.add(categoryId);\n }\n }\n\n public isCategoryExpanded(categoryId: string): boolean {\n return this.expandedCategories.has(categoryId);\n }\n\n public selectCategory(categoryId: string): void {\n this.selectedCategory$.next(categoryId);\n }\n\n public getCategoryActionCount(categoryId: string): number {\n const descendantIds = this.categoryDescendants.get(categoryId);\n if (!descendantIds) return 0;\n \n return this.actions.filter(action => \n action.CategoryID && descendantIds.has(action.CategoryID)\n ).length;\n }\n\n public showCategoryTree = false;\n\n public toggleCategoryTree(): void {\n this.showCategoryTree = !this.showCategoryTree;\n }\n}","<div class=\"actions-list-view\" >\n <!-- Header with filters -->\n <div class=\"list-header\">\n <div class=\"header-title\">\n <h2><i class=\"fa-solid fa-cogs\"></i> Actions</h2>\n <div class=\"results-count\">{{ filteredActions.length }} of {{ actions.length }} actions</div>\n </div>\n \n <div class=\"filters-row\">\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\" class=\"mj-input\"\n placeholder=\"Search actions...\"\n [value]=\"searchTerm$.value\"\n (input)=\"onSearchChange($any($event.target).value)\" />\n </div>\n </div>\n \n <div class=\"filter-group\">\n <mj-dropdown\n [Data]=\"statusOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedStatus$.value\"\n (ValueChange)=\"onStatusFilterChange($any($event))\">\n </mj-dropdown>\n\n <mj-dropdown\n [Data]=\"typeOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedType$.value\"\n (ValueChange)=\"onTypeFilterChange($any($event))\">\n </mj-dropdown>\n \n <button mjButton\n variant=\"outline\"\n (click)=\"toggleCategoryTree()\"\n class=\"category-filter-button\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n @if (selectedCategory$.value === 'all') {\n All Categories\n } @else {\n {{ getCategoryName(selectedCategory$.value) }}\n }\n <span class=\"badge\">{{ getCategoryActionCount(selectedCategory$.value) }}</span>\n </button>\n </div>\n </div>\n </div>\n \n <!-- Category Tree View Panel -->\n @if (showCategoryTree) {\n <div class=\"category-tree-panel\">\n <div class=\"tree-header\">\n <h3>Select Category</h3>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"toggleCategoryTree()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n \n <div class=\"tree-actions\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"selectCategory('all')\"\n [class.selected]=\"selectedCategory$.value === 'all'\">\n <i class=\"fa-solid fa-folder-open\"></i>\n All Categories\n <span class=\"badge\">{{ actions.length }}</span>\n </button>\n </div>\n \n <div class=\"tree-content\">\n <ng-container *ngTemplateOutlet=\"categoryTreeTemplate; context: { nodes: categoryTree }\"></ng-container>\n </div>\n \n <ng-template #categoryTreeTemplate let-nodes=\"nodes\">\n @for (node of nodes; track node.category.ID) {\n <div class=\"tree-node\" [style.padding-left.px]=\"node.level * 20\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n class=\"tree-node-button\"\n [class.selected]=\"selectedCategory$.value === node.category.ID\"\n (click)=\"selectCategory(node.category.ID)\">\n \n @if (node.children.length > 0) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n class=\"expand-button\"\n (click)=\"toggleCategoryExpanded(node.category.ID); $event.stopPropagation()\">\n @if (isCategoryExpanded(node.category.ID)) {\n <i class=\"fa-solid fa-chevron-down\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-right\"></i>\n }\n </button>\n } @else {\n <span class=\"no-expand\"></span>\n }\n \n <i class=\"fa-solid fa-folder\"></i>\n {{ node.category.Name }}\n <span class=\"badge\">{{ getCategoryActionCount(node.category.ID) }}</span>\n </button>\n \n @if (node.children.length > 0 && isCategoryExpanded(node.category.ID)) {\n <ng-container *ngTemplateOutlet=\"categoryTreeTemplate; context: { nodes: node.children }\"></ng-container>\n }\n </div>\n }\n </ng-template>\n </div>\n }\n\n <!-- Actions List -->\n <div class=\"actions-list\">\n @if (filteredActions.length > 0) {\n @for (action of filteredActions; track action.ID) {\n <div class=\"action-card\" (click)=\"openAction(action)\">\n <div class=\"action-icon\">\n <i [class]=\"getActionIcon(action)\"></i>\n </div>\n \n <div class=\"action-main\">\n <div class=\"action-header\">\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n <div class=\"action-badges\">\n <span class=\"status-chip\" [attr.data-color]=\"getStatusColor(action.Status)\">\n {{ action.Status }}\n </span>\n @if (action.Type === 'Generated') {\n <span class=\"status-chip\" data-color=\"info\">\n <i class=\"fa-solid fa-robot\"></i> AI Generated\n </span>\n }\n </div>\n </div>\n \n <div class=\"action-description\">\n {{ action.Description || 'No description available' }}\n </div>\n \n <div class=\"action-details\">\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>{{ getCategoryName(action.CategoryID) }}</span>\n </div>\n @if (action.__mj_UpdatedAt) {\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>Updated {{ action.__mj_UpdatedAt | date:'MMM d, yyyy' }}</span>\n </div>\n }\n @if (action.CodeApprovalStatus && action.Type === 'Generated') {\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>{{ action.CodeApprovalStatus }}</span>\n </div>\n }\n </div>\n </div>\n \n <div class=\"action-actions\">\n <button mjButton\n variant=\"flat\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n </div>\n </div>\n }\n } @else if (!isLoading) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search\"></i>\n <h3>No actions found</h3>\n <p>Try adjusting your search or filter criteria</p>\n </div>\n }\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading [showText]=\"false\" size=\"medium\"></mj-loading>\n </div>\n }\n</div>"]}
1
+ {"version":3,"file":"actions-list-view.component.js","sourceRoot":"","sources":["../../../src/Actions/components/actions-list-view.component.ts","../../../src/Actions/components/actions-list-view.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport { RunView, LogError } from '@memberjunction/core';\nimport { MJActionEntity, MJActionCategoryEntity } from '@memberjunction/core-entities';\nimport { Subject, BehaviorSubject, combineLatest } from 'rxjs';\nimport { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\ninterface CategoryTreeNode {\n category: MJActionCategoryEntity;\n children: CategoryTreeNode[];\n level: number;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-actions-list-view',\n templateUrl: './actions-list-view.component.html',\n styleUrls: ['./actions-list-view.component.css']\n})\nexport class ActionsListViewComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Output() openEntityRecord = new EventEmitter<{entityName: string; recordId: string}>();\n\n public isLoading = true;\n public actions: MJActionEntity[] = [];\n public filteredActions: MJActionEntity[] = [];\n public categories: Map<string, MJActionCategoryEntity> = new Map();\n public categoryTree: CategoryTreeNode[] = [];\n public categoryDescendants: Map<string, Set<string>> = new Map();\n\n public searchTerm$ = new BehaviorSubject<string>('');\n public selectedStatus$ = new BehaviorSubject<string>('all');\n public selectedType$ = new BehaviorSubject<string>('all');\n public selectedCategory$ = new BehaviorSubject<string>('all');\n public expandedCategories: Set<string> = new Set();\n\n public statusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Pending', value: 'Pending' },\n { text: 'Disabled', value: 'Disabled' }\n ];\n\n public typeOptions = [\n { text: 'All Types', value: 'all' },\n { text: 'AI Generated', value: 'Generated' },\n { text: 'Custom', value: 'Custom' }\n ];\n\n public categoryOptions: Array<{text: string; value: string}> = [\n { text: 'All Categories', value: 'all' }\n ];\n\n private destroy$ = new Subject<void>();\n\n constructor() { super(); }\n\n ngOnInit(): void {\n this.setupFilters();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupFilters(): void {\n combineLatest([\n this.searchTerm$.pipe(debounceTime(300), distinctUntilChanged()),\n this.selectedStatus$.pipe(distinctUntilChanged()),\n this.selectedType$.pipe(distinctUntilChanged()),\n this.selectedCategory$.pipe(distinctUntilChanged())\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.applyFilters();\n });\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n \n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n const [actionsResult, categoriesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Actions',\n OrderBy: 'Name'\n },\n {\n EntityName: 'MJ: Action Categories',\n OrderBy: 'Name'\n }\n ]);\n \n if (!actionsResult.Success || !categoriesResult.Success) {\n const errors = [];\n if (!actionsResult.Success) \n errors.push('Actions: ' + actionsResult.ErrorMessage);\n if (!categoriesResult.Success) \n errors.push('Categories: ' + categoriesResult.ErrorMessage);\n throw new Error('Failed to load data: ' + errors.join(', '));\n }\n \n const actions = (actionsResult.Results || []) as MJActionEntity[];\n const categories = (categoriesResult.Results || []) as MJActionCategoryEntity[];\n \n this.actions = actions;\n this.populateCategoriesMap(categories);\n this.buildCategoryOptions(categories);\n this.applyFilters();\n\n } catch (error) {\n console.error('Error loading actions list data:', error);\n LogError('Failed to load actions list data', undefined, error);\n } finally {\n this.isLoading = false;\n }\n }\n\n\n private populateCategoriesMap(categories: MJActionCategoryEntity[]): void {\n this.categories.clear();\n categories.forEach(category => {\n this.categories.set(category.ID, category);\n });\n \n // Build the category tree\n this.buildCategoryTree(categories);\n \n // Build descendant mapping for efficient filtering\n this.buildDescendantMapping(categories);\n }\n\n private buildCategoryOptions(categories: MJActionCategoryEntity[]): void {\n this.categoryOptions = [\n { text: 'All Categories', value: 'all' },\n ...categories.map(category => ({\n text: category.Name,\n value: category.ID\n }))\n ];\n }\n\n private buildCategoryTree(categories: MJActionCategoryEntity[]): void {\n const categoryMap = new Map<string, CategoryTreeNode>();\n \n // First pass: create all nodes\n categories.forEach(category => {\n categoryMap.set(category.ID, {\n category,\n children: [],\n level: 0\n });\n });\n \n // Second pass: build tree structure\n const rootNodes: CategoryTreeNode[] = [];\n categoryMap.forEach(node => {\n const parentId = node.category.ParentID;\n if (parentId && categoryMap.has(parentId)) {\n const parent = categoryMap.get(parentId)!;\n parent.children.push(node);\n node.level = parent.level + 1;\n } else {\n rootNodes.push(node);\n }\n });\n \n // Sort children at each level by name\n const sortChildren = (nodes: CategoryTreeNode[]) => {\n nodes.sort((a, b) => a.category.Name.localeCompare(b.category.Name));\n nodes.forEach(node => sortChildren(node.children));\n };\n sortChildren(rootNodes);\n \n this.categoryTree = rootNodes;\n }\n\n private buildDescendantMapping(categories: MJActionCategoryEntity[]): void {\n this.categoryDescendants.clear();\n \n // Initialize each category with itself\n categories.forEach(category => {\n this.categoryDescendants.set(category.ID, new Set([category.ID]));\n });\n \n // Build descendant sets\n const addDescendants = (categoryId: string, descendantId: string) => {\n const descendants = this.categoryDescendants.get(categoryId);\n if (descendants) {\n descendants.add(descendantId);\n }\n };\n \n categories.forEach(category => {\n if (category.ParentID) {\n // Add this category as a descendant of all its ancestors\n let currentParentId: string | null = category.ParentID;\n while (currentParentId) {\n addDescendants(currentParentId, category.ID);\n const parent = this.categories.get(currentParentId);\n currentParentId = parent?.ParentID || null;\n }\n }\n });\n }\n\n private applyFilters(): void {\n let filtered = [...this.actions];\n\n // Apply search filter\n const searchTerm = this.searchTerm$.value.toLowerCase();\n if (searchTerm) {\n filtered = filtered.filter(action => \n action.Name.toLowerCase().includes(searchTerm) ||\n (action.Description || '').toLowerCase().includes(searchTerm)\n );\n }\n\n // Apply status filter\n const status = this.selectedStatus$.value;\n if (status !== 'all') {\n filtered = filtered.filter(action => action.Status === status);\n }\n\n // Apply type filter\n const type = this.selectedType$.value;\n if (type !== 'all') {\n filtered = filtered.filter(action => action.Type === type);\n }\n\n // Apply category filter (includes descendants)\n const categoryId = this.selectedCategory$.value;\n if (categoryId !== 'all') {\n const descendantIds = this.categoryDescendants.get(categoryId);\n if (descendantIds) {\n // Filter actions that belong to the selected category or any of its descendants\n filtered = filtered.filter(action => \n action.CategoryID && descendantIds.has(action.CategoryID)\n );\n } else {\n console.warn(`Category ID ${categoryId} not found in category hierarchy`);\n filtered = [];\n }\n }\n\n this.filteredActions = filtered;\n }\n\n public onSearchChange(searchTerm: string): void {\n this.searchTerm$.next(searchTerm);\n }\n\n public onStatusFilterChange(status: string): void {\n this.selectedStatus$.next(status);\n }\n\n public onTypeFilterChange(type: string): void {\n this.selectedType$.next(type);\n }\n\n public onCategoryFilterChange(categoryId: string): void {\n this.selectedCategory$.next(categoryId);\n }\n\n public openAction(action: MJActionEntity): void {\n this.openEntityRecord.emit({\n entityName: 'MJ: Actions',\n recordId: action.ID\n });\n }\n\n public getCategoryName(categoryId: string | null): string {\n if (!categoryId) return 'No Category';\n return this.categories.get(categoryId)?.Name || 'Unknown Category';\n }\n\n public getStatusColor(status: string): 'success' | 'warning' | 'error' | 'info' {\n switch (status) {\n case 'Active': return 'success';\n case 'Pending': return 'warning';\n case 'Disabled': return 'error';\n default: return 'info';\n }\n }\n\n public getTypeIcon(type: string): string {\n switch (type) {\n case 'Generated': return 'fa-solid fa-robot';\n case 'Custom': return 'fa-solid fa-code';\n default: return 'fa-solid fa-cog';\n }\n }\n\n /**\n * Gets the icon class for an action\n * Falls back to type-based icon if no IconClass is set\n */\n public getActionIcon(action: MJActionEntity): string {\n return action?.IconClass || this.getTypeIcon(action.Type);\n }\n\n // Tree view methods\n public toggleCategoryExpanded(categoryId: string): void {\n if (this.expandedCategories.has(categoryId)) {\n this.expandedCategories.delete(categoryId);\n } else {\n this.expandedCategories.add(categoryId);\n }\n }\n\n public isCategoryExpanded(categoryId: string): boolean {\n return this.expandedCategories.has(categoryId);\n }\n\n public selectCategory(categoryId: string): void {\n this.selectedCategory$.next(categoryId);\n }\n\n public getCategoryActionCount(categoryId: string): number {\n const descendantIds = this.categoryDescendants.get(categoryId);\n if (!descendantIds) return 0;\n \n return this.actions.filter(action => \n action.CategoryID && descendantIds.has(action.CategoryID)\n ).length;\n }\n\n public showCategoryTree = false;\n\n public toggleCategoryTree(): void {\n this.showCategoryTree = !this.showCategoryTree;\n }\n}","<div class=\"actions-list-view\" >\n <!-- Header with filters -->\n <div class=\"list-header\">\n <div class=\"header-title\">\n <h2><i class=\"fa-solid fa-cogs\"></i> Actions</h2>\n <div class=\"results-count\">{{ filteredActions.length }} of {{ actions.length }} actions</div>\n </div>\n \n <div class=\"filters-row\">\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\" class=\"mj-input\"\n placeholder=\"Search actions...\"\n [value]=\"searchTerm$.value\"\n (input)=\"onSearchChange($any($event.target).value)\" />\n </div>\n </div>\n \n <div class=\"filter-group\">\n <mj-dropdown\n [Data]=\"statusOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedStatus$.value\"\n (ValueChange)=\"onStatusFilterChange($any($event))\">\n </mj-dropdown>\n\n <mj-dropdown\n [Data]=\"typeOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedType$.value\"\n (ValueChange)=\"onTypeFilterChange($any($event))\">\n </mj-dropdown>\n \n <button mjButton\n variant=\"outline\"\n (click)=\"toggleCategoryTree()\"\n class=\"category-filter-button\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n @if (selectedCategory$.value === 'all') {\n All Categories\n } @else {\n {{ getCategoryName(selectedCategory$.value) }}\n }\n <span class=\"badge\">{{ getCategoryActionCount(selectedCategory$.value) }}</span>\n </button>\n </div>\n </div>\n </div>\n \n <!-- Category Tree View Panel -->\n @if (showCategoryTree) {\n <div class=\"category-tree-panel\">\n <div class=\"tree-header\">\n <h3>Select Category</h3>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"toggleCategoryTree()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n \n <div class=\"tree-actions\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"selectCategory('all')\"\n [class.selected]=\"selectedCategory$.value === 'all'\">\n <i class=\"fa-solid fa-folder-open\"></i>\n All Categories\n <span class=\"badge\">{{ actions.length }}</span>\n </button>\n </div>\n \n <div class=\"tree-content\">\n <ng-container *ngTemplateOutlet=\"categoryTreeTemplate; context: { nodes: categoryTree }\"></ng-container>\n </div>\n \n <ng-template #categoryTreeTemplate let-nodes=\"nodes\">\n @for (node of nodes; track node.category.ID) {\n <div class=\"tree-node\" [style.padding-left.px]=\"node.level * 20\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n class=\"tree-node-button\"\n [class.selected]=\"selectedCategory$.value === node.category.ID\"\n (click)=\"selectCategory(node.category.ID)\">\n \n @if (node.children.length > 0) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n class=\"expand-button\"\n (click)=\"toggleCategoryExpanded(node.category.ID); $event.stopPropagation()\">\n @if (isCategoryExpanded(node.category.ID)) {\n <i class=\"fa-solid fa-chevron-down\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-right\"></i>\n }\n </button>\n } @else {\n <span class=\"no-expand\"></span>\n }\n \n <i class=\"fa-solid fa-folder\"></i>\n {{ node.category.Name }}\n <span class=\"badge\">{{ getCategoryActionCount(node.category.ID) }}</span>\n </button>\n \n @if (node.children.length > 0 && isCategoryExpanded(node.category.ID)) {\n <ng-container *ngTemplateOutlet=\"categoryTreeTemplate; context: { nodes: node.children }\"></ng-container>\n }\n </div>\n }\n </ng-template>\n </div>\n }\n\n <!-- Actions List -->\n <div class=\"actions-list\">\n @if (filteredActions.length > 0) {\n @for (action of filteredActions; track action.ID) {\n <div class=\"action-card\" (click)=\"openAction(action)\">\n <div class=\"action-icon\">\n <i [class]=\"getActionIcon(action)\"></i>\n </div>\n \n <div class=\"action-main\">\n <div class=\"action-header\">\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n <div class=\"action-badges\">\n <span class=\"status-chip\" [attr.data-color]=\"getStatusColor(action.Status)\">\n {{ action.Status }}\n </span>\n @if (action.Type === 'Generated') {\n <span class=\"status-chip\" data-color=\"info\">\n <i class=\"fa-solid fa-robot\"></i> AI Generated\n </span>\n }\n </div>\n </div>\n \n <div class=\"action-description\">\n {{ action.Description || 'No description available' }}\n </div>\n \n <div class=\"action-details\">\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>{{ getCategoryName(action.CategoryID) }}</span>\n </div>\n @if (action.__mj_UpdatedAt) {\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>Updated {{ action.__mj_UpdatedAt | date:'MMM d, yyyy' }}</span>\n </div>\n }\n @if (action.CodeApprovalStatus && action.Type === 'Generated') {\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>{{ action.CodeApprovalStatus }}</span>\n </div>\n }\n </div>\n </div>\n \n <div class=\"action-actions\">\n <button mjButton\n variant=\"flat\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n </div>\n </div>\n }\n } @else if (!isLoading) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search\"></i>\n <h3>No actions found</h3>\n <p>Try adjusting your search or filter criteria</p>\n </div>\n }\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading [showText]=\"false\" size=\"medium\"></mj-loading>\n </div>\n }\n</div>"]}
@@ -259,7 +259,7 @@ let ActionsOverviewComponent = class ActionsOverviewComponent extends BaseResour
259
259
  this.isLoading = true;
260
260
  this.cdr.detectChanges();
261
261
  // Load all data in a single batch using RunViews
262
- const rv = new RunView();
262
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
263
263
  const [actionsResult, categoriesResult, executionsResult] = await rv.RunViews([
264
264
  {
265
265
  EntityName: 'MJ: Actions',
@@ -361,7 +361,7 @@ let ActionsOverviewComponent = class ActionsOverviewComponent extends BaseResour
361
361
  extraFilter = filters.join(' AND ');
362
362
  }
363
363
  try {
364
- const rv = new RunView();
364
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
365
365
  const result = await rv.RunView({
366
366
  EntityName: 'MJ: Actions',
367
367
  ExtraFilter: extraFilter,