@memberjunction/ng-dashboards 5.30.1 → 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,5 +1,6 @@
1
1
  import { OnInit, EventEmitter, ChangeDetectorRef } from '@angular/core';
2
2
  import { MJAPIScopeEntity } from '@memberjunction/core-entities';
3
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
4
  import * as i0 from "@angular/core";
4
5
  /** Scope tree node structure */
5
6
  interface ScopeTreeNode {
@@ -12,9 +13,9 @@ interface ScopeTreeNode {
12
13
  * API Scopes Panel Component
13
14
  * Manages API Scopes in a hierarchical tree structure
14
15
  */
15
- export declare class APIScopesPanelComponent implements OnInit {
16
+ export declare class APIScopesPanelComponent extends BaseAngularComponent implements OnInit {
16
17
  ScopeUpdated: EventEmitter<void>;
17
- private md;
18
+ private get md();
18
19
  private cdr;
19
20
  IsLoading: boolean;
20
21
  IsSaving: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"api-scopes-panel.component.d.ts","sourceRoot":"","sources":["../../src/APIKeys/api-scopes-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,YAAY,EAAU,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;;AAEjE,gCAAgC;AAChC,UAAU,aAAa;IACnB,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,qBAMa,uBAAwB,YAAW,MAAM;IACxC,YAAY,qBAA4B;IAElD,OAAO,CAAC,EAAE,CAAkB;IAC5B,OAAO,CAAC,GAAG,CAAoB;IAGxB,SAAS,UAAQ;IACjB,QAAQ,UAAS;IAGjB,SAAS,EAAE,aAAa,EAAE,CAAM;IAChC,UAAU,EAAE,gBAAgB,EAAE,CAAM;IAGpC,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAC7C,QAAQ,SAAM;IACd,eAAe,SAAM;IACrB,YAAY,SAAM;IAClB,gBAAgB,SAAM;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IACnC,YAAY,UAAQ;IAGpB,gBAAgB,UAAS;IACzB,cAAc,UAAS;IACvB,mBAAmB,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAGpD,cAAc,SAAM;IACpB,YAAY,SAAM;IAGzB,SAAgB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASpD;IAGF,SAAgB,aAAa,WAAkF;IAC/G,SAAgB,UAAU,WAA8F;gBAE5G,GAAG,EAAE,iBAAiB;IAI5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBtC;;OAEG;IACH,OAAO,CAAC,SAAS;IA0CjB;;OAEG;IACI,gBAAgB,CAAC,WAAW,GAAE,gBAAgB,GAAG,IAAW,GAAG,IAAI;IAY1E;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAcpD;;OAEG;IACU,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA0CvC;;OAEG;IACI,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIhD;;OAEG;IACI,SAAS,IAAI,IAAI;IAUxB;;OAEG;IACI,WAAW,IAAI,IAAI;IAU1B;;OAEG;IACI,YAAY,IAAI,IAAI;IAO3B;;OAEG;IACI,gBAAgB,IAAI,gBAAgB,EAAE;IAoB7C;;OAEG;IACI,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAIxD;;OAEG;IACI,aAAa,IAAI,MAAM;IAI9B;;OAEG;IACI,cAAc,IAAI,MAAM;yCA/RtB,uBAAuB;2CAAvB,uBAAuB;CAkSnC"}
1
+ {"version":3,"file":"api-scopes-panel.component.d.ts","sourceRoot":"","sources":["../../src/APIKeys/api-scopes-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,YAAY,EAAU,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE,gCAAgC;AAChC,UAAU,aAAa;IACnB,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,qBAMa,uBAAwB,SAAQ,oBAAqB,YAAW,MAAM;IACrE,YAAY,qBAA4B;IAElD,OAAO,KAAK,EAAE,GAAiC;IAC/C,OAAO,CAAC,GAAG,CAAoB;IAGxB,SAAS,UAAQ;IACjB,QAAQ,UAAS;IAGjB,SAAS,EAAE,aAAa,EAAE,CAAM;IAChC,UAAU,EAAE,gBAAgB,EAAE,CAAM;IAGpC,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAC7C,QAAQ,SAAM;IACd,eAAe,SAAM;IACrB,YAAY,SAAM;IAClB,gBAAgB,SAAM;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IACnC,YAAY,UAAQ;IAGpB,gBAAgB,UAAS;IACzB,cAAc,UAAS;IACvB,mBAAmB,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAGpD,cAAc,SAAM;IACpB,YAAY,SAAM;IAGzB,SAAgB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASpD;IAGF,SAAgB,aAAa,WAAkF;IAC/G,SAAgB,UAAU,WAA8F;gBAE5G,GAAG,EAAE,iBAAiB;IAK5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBtC;;OAEG;IACH,OAAO,CAAC,SAAS;IA0CjB;;OAEG;IACI,gBAAgB,CAAC,WAAW,GAAE,gBAAgB,GAAG,IAAW,GAAG,IAAI;IAY1E;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAcpD;;OAEG;IACU,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA0CvC;;OAEG;IACI,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIhD;;OAEG;IACI,SAAS,IAAI,IAAI;IAUxB;;OAEG;IACI,WAAW,IAAI,IAAI;IAU1B;;OAEG;IACI,YAAY,IAAI,IAAI;IAO3B;;OAEG;IACI,gBAAgB,IAAI,gBAAgB,EAAE;IAoB7C;;OAEG;IACI,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAIxD;;OAEG;IACI,aAAa,IAAI,MAAM;IAI9B;;OAEG;IACI,cAAc,IAAI,MAAM;yCAhStB,uBAAuB;2CAAvB,uBAAuB;CAmSnC"}
@@ -1,6 +1,7 @@
1
1
  import { Component, EventEmitter, Output } from '@angular/core';
2
- import { Metadata, RunView } from '@memberjunction/core';
2
+ import { RunView } from '@memberjunction/core';
3
3
  import { UUIDsEqual } from '@memberjunction/global';
4
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "@angular/common";
6
7
  import * as i2 from "@angular/forms";
@@ -352,9 +353,9 @@ function APIScopesPanelComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
352
353
  * API Scopes Panel Component
353
354
  * Manages API Scopes in a hierarchical tree structure
354
355
  */
355
- export class APIScopesPanelComponent {
356
+ export class APIScopesPanelComponent extends BaseAngularComponent {
356
357
  ScopeUpdated = new EventEmitter();
357
- md = new Metadata();
358
+ get md() { return this.ProviderToUse; }
358
359
  cdr;
359
360
  // Loading states
360
361
  IsLoading = true;
@@ -392,6 +393,7 @@ export class APIScopesPanelComponent {
392
393
  ResourceTypes = ['Entity', 'Agent', 'Query', 'Mutation', 'Action', 'Report', 'Admin', 'Other'];
393
394
  Categories = ['Entities', 'Agents', 'Admin', 'Actions', 'Queries', 'Reports', 'Communication', 'Other'];
394
395
  constructor(cdr) {
396
+ super();
395
397
  this.cdr = cdr;
396
398
  }
397
399
  async ngOnInit() {
@@ -403,7 +405,7 @@ export class APIScopesPanelComponent {
403
405
  async loadData() {
404
406
  this.IsLoading = true;
405
407
  try {
406
- const rv = new RunView();
408
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
407
409
  const result = await rv.RunView({
408
410
  EntityName: 'MJ: API Scopes',
409
411
  OrderBy: 'FullPath',
@@ -617,7 +619,7 @@ export class APIScopesPanelComponent {
617
619
  return this.FlatScopes.filter(s => s.IsActive).length;
618
620
  }
619
621
  static ɵfac = function APIScopesPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || APIScopesPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
620
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: APIScopesPanelComponent, selectors: [["mj-api-scopes-panel"]], outputs: { ScopeUpdated: "ScopeUpdated" }, standalone: false, decls: 4, vars: 3, consts: [["scopeNode", ""], [1, "scopes-panel"], ["text", "Loading scopes..."], [3, "Width", "MinWidth", "MinHeight", "Resizable", "Draggable", "Visible", "Top"], [1, "panel-header"], [1, "header-left"], [1, "panel-title"], [1, "fa-solid", "fa-shield-halved"], [1, "panel-subtitle"], [1, "header-actions"], [1, "scope-stats"], [1, "stat"], [1, "fa-solid", "fa-shield"], [1, "stat", "active"], [1, "fa-solid", "fa-check-circle"], [1, "tree-controls"], ["title", "Expand All", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-plus-square"], ["title", "Collapse All", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-minus-square"], [1, "btn-create", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "message", "success"], [1, "message", "error"], [1, "scope-tree"], [1, "empty-state"], [1, "fa-solid", "fa-circle-exclamation"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "scope-node"], [1, "node-content"], [1, "expand-btn"], [1, "expand-placeholder"], [1, "scope-info", 3, "click"], [1, "scope-icon"], [1, "scope-details"], [1, "scope-name"], [1, "full-path"], [1, "status-badge"], [1, "scope-meta"], [1, "category"], [1, "resource-type"], [1, "description"], [1, "node-actions"], ["title", "Add Child Scope", 1, "btn-node-action", 3, "click"], ["title", "Edit Scope", 1, "btn-node-action", 3, "click"], [1, "fa-solid", "fa-pencil"], [1, "children"], [1, "expand-btn", 3, "click"], [1, "fa-solid"], [3, "Close", "Width", "MinWidth", "MinHeight", "Resizable", "Draggable", "Visible", "Top"], [1, "dialog-title"], [1, "dialog-content"], [1, "form-field"], ["placeholder", "e.g., runview, create, execute", 1, "mj-input", "form-input", 3, "ngModelChange", "ngModel"], [1, "field-hint"], ["TextField", "FullPath", "ValueField", "ID", 3, "ngModelChange", "ngModel", "Data", "ValuePrimitive", "DefaultItem"], [1, "form-row"], [1, "form-field", "half"], [3, "ngModelChange", "ngModel", "Data", "ValuePrimitive"], [3, "ngModelChange", "ngModel", "Data", "ValuePrimitive", "DefaultItem"], ["placeholder", "Describe what this scope allows...", 1, "mj-textarea", "form-textarea", 3, "ngModelChange", "ngModel", "rows"], [1, "checkbox-label"], ["type", "checkbox", 1, "mj-checkbox", 3, "ngModelChange", "ngModel"], [1, "checkbox-hint"], [1, "dialog-actions"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["size", "small", 3, "showText"], ["mjButton", "", 3, "click"], [1, "fa-solid", "fa-save"]], template: function APIScopesPanelComponent_Template(rf, ctx) { if (rf & 1) {
622
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: APIScopesPanelComponent, selectors: [["mj-api-scopes-panel"]], outputs: { ScopeUpdated: "ScopeUpdated" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 3, consts: [["scopeNode", ""], [1, "scopes-panel"], ["text", "Loading scopes..."], [3, "Width", "MinWidth", "MinHeight", "Resizable", "Draggable", "Visible", "Top"], [1, "panel-header"], [1, "header-left"], [1, "panel-title"], [1, "fa-solid", "fa-shield-halved"], [1, "panel-subtitle"], [1, "header-actions"], [1, "scope-stats"], [1, "stat"], [1, "fa-solid", "fa-shield"], [1, "stat", "active"], [1, "fa-solid", "fa-check-circle"], [1, "tree-controls"], ["title", "Expand All", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-plus-square"], ["title", "Collapse All", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-minus-square"], [1, "btn-create", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "message", "success"], [1, "message", "error"], [1, "scope-tree"], [1, "empty-state"], [1, "fa-solid", "fa-circle-exclamation"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "scope-node"], [1, "node-content"], [1, "expand-btn"], [1, "expand-placeholder"], [1, "scope-info", 3, "click"], [1, "scope-icon"], [1, "scope-details"], [1, "scope-name"], [1, "full-path"], [1, "status-badge"], [1, "scope-meta"], [1, "category"], [1, "resource-type"], [1, "description"], [1, "node-actions"], ["title", "Add Child Scope", 1, "btn-node-action", 3, "click"], ["title", "Edit Scope", 1, "btn-node-action", 3, "click"], [1, "fa-solid", "fa-pencil"], [1, "children"], [1, "expand-btn", 3, "click"], [1, "fa-solid"], [3, "Close", "Width", "MinWidth", "MinHeight", "Resizable", "Draggable", "Visible", "Top"], [1, "dialog-title"], [1, "dialog-content"], [1, "form-field"], ["placeholder", "e.g., runview, create, execute", 1, "mj-input", "form-input", 3, "ngModelChange", "ngModel"], [1, "field-hint"], ["TextField", "FullPath", "ValueField", "ID", 3, "ngModelChange", "ngModel", "Data", "ValuePrimitive", "DefaultItem"], [1, "form-row"], [1, "form-field", "half"], [3, "ngModelChange", "ngModel", "Data", "ValuePrimitive"], [3, "ngModelChange", "ngModel", "Data", "ValuePrimitive", "DefaultItem"], ["placeholder", "Describe what this scope allows...", 1, "mj-textarea", "form-textarea", 3, "ngModelChange", "ngModel", "rows"], [1, "checkbox-label"], ["type", "checkbox", 1, "mj-checkbox", 3, "ngModelChange", "ngModel"], [1, "checkbox-hint"], [1, "dialog-actions"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["size", "small", 3, "showText"], ["mjButton", "", 3, "click"], [1, "fa-solid", "fa-save"]], template: function APIScopesPanelComponent_Template(rf, ctx) { if (rf & 1) {
621
623
  i0.ɵɵelementStart(0, "div", 1);
622
624
  i0.ɵɵconditionalCreate(1, APIScopesPanelComponent_Conditional_1_Template, 1, 0, "mj-loading", 2);
623
625
  i0.ɵɵconditionalCreate(2, APIScopesPanelComponent_Conditional_2_Template, 31, 5);
@@ -638,5 +640,5 @@ export class APIScopesPanelComponent {
638
640
  }], () => [{ type: i0.ChangeDetectorRef }], { ScopeUpdated: [{
639
641
  type: Output
640
642
  }] }); })();
641
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(APIScopesPanelComponent, { className: "APIScopesPanelComponent", filePath: "src/APIKeys/api-scopes-panel.component.ts", lineNumber: 23 }); })();
643
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(APIScopesPanelComponent, { className: "APIScopesPanelComponent", filePath: "src/APIKeys/api-scopes-panel.component.ts", lineNumber: 24 }); })();
642
644
  //# sourceMappingURL=api-scopes-panel.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-scopes-panel.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-scopes-panel.component.ts","../../src/APIKeys/api-scopes-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, EventEmitter, Output, ChangeDetectorRef } from '@angular/core';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJAPIScopeEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n/** Scope tree node structure */\ninterface ScopeTreeNode {\n scope: MJAPIScopeEntity;\n children: ScopeTreeNode[];\n expanded: boolean;\n level: number;\n}\n\n/**\n * API Scopes Panel Component\n * Manages API Scopes in a hierarchical tree structure\n */\n@Component({\n standalone: false,\n selector: 'mj-api-scopes-panel',\n templateUrl: './api-scopes-panel.component.html',\n styleUrls: ['./api-scopes-panel.component.css']\n})\nexport class APIScopesPanelComponent implements OnInit {\n @Output() ScopeUpdated = new EventEmitter<void>();\n\n private md = new Metadata();\n private cdr: ChangeDetectorRef;\n\n // Loading states\n public IsLoading = true;\n public IsSaving = false;\n\n // Data\n public ScopeTree: ScopeTreeNode[] = [];\n public FlatScopes: MJAPIScopeEntity[] = [];\n\n // Edit state\n public EditingScope: MJAPIScopeEntity | null = null;\n public EditName = '';\n public EditDescription = '';\n public EditCategory = '';\n public EditResourceType = '';\n public EditParentId: string | null = null;\n public EditIsActive = true;\n\n // Dialog states\n public ShowCreateDialog = false;\n public ShowEditDialog = false;\n public SelectedParentScope: MJAPIScopeEntity | null = null;\n\n // Messages\n public SuccessMessage = '';\n public ErrorMessage = '';\n\n // Category colors\n public readonly CategoryColors: Record<string, string> = {\n 'Entities': '#6366f1',\n 'Agents': '#10b981',\n 'Admin': '#f59e0b',\n 'Actions': '#8b5cf6',\n 'Queries': '#3b82f6',\n 'Reports': '#ef4444',\n 'Communication': '#ec4899',\n 'Other': '#6b7280'\n };\n\n // Resource type options\n public readonly ResourceTypes = ['Entity', 'Agent', 'Query', 'Mutation', 'Action', 'Report', 'Admin', 'Other'];\n public readonly Categories = ['Entities', 'Agents', 'Admin', 'Actions', 'Queries', 'Reports', 'Communication', 'Other'];\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 scopes\n */\n public async loadData(): Promise<void> {\n this.IsLoading = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJAPIScopeEntity>({\n EntityName: 'MJ: API Scopes',\n OrderBy: 'FullPath',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.FlatScopes = result.Results;\n this.buildTree();\n }\n } catch (error) {\n console.error('Error loading scopes:', error);\n this.ErrorMessage = 'Failed to load scopes';\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Build tree structure from flat scopes\n */\n private buildTree(): void {\n const scopeMap = new Map<string, ScopeTreeNode>();\n const rootNodes: ScopeTreeNode[] = [];\n\n // Create nodes\n for (const scope of this.FlatScopes) {\n scopeMap.set(scope.ID, {\n scope,\n children: [],\n expanded: true,\n level: 0\n });\n }\n\n // Build hierarchy\n for (const scope of this.FlatScopes) {\n const node = scopeMap.get(scope.ID)!;\n if (scope.ParentID) {\n const parent = scopeMap.get(scope.ParentID);\n if (parent) {\n parent.children.push(node);\n node.level = parent.level + 1;\n } else {\n rootNodes.push(node);\n }\n } else {\n rootNodes.push(node);\n }\n }\n\n // Calculate levels recursively\n const calculateLevels = (nodes: ScopeTreeNode[], level: number) => {\n for (const node of nodes) {\n node.level = level;\n calculateLevels(node.children, level + 1);\n }\n };\n calculateLevels(rootNodes, 0);\n\n this.ScopeTree = rootNodes;\n }\n\n /**\n * Open create dialog for new scope\n */\n public openCreateDialog(parentScope: MJAPIScopeEntity | null = null): void {\n this.EditName = '';\n this.EditDescription = '';\n this.EditCategory = parentScope?.Category || 'Entities';\n this.EditResourceType = '';\n this.EditParentId = parentScope?.ID || null;\n this.EditIsActive = true;\n this.EditingScope = null;\n this.SelectedParentScope = parentScope;\n this.ShowCreateDialog = true;\n }\n\n /**\n * Open edit dialog for existing scope\n */\n public openEditDialog(scope: MJAPIScopeEntity): void {\n this.EditingScope = scope;\n this.EditName = scope.Name;\n this.EditDescription = scope.Description || '';\n this.EditCategory = scope.Category || 'Entities';\n this.EditResourceType = scope.ResourceType || '';\n this.EditParentId = scope.ParentID;\n this.EditIsActive = scope.IsActive;\n this.SelectedParentScope = scope.ParentID\n ? this.FlatScopes.find(s => UUIDsEqual(s.ID, scope.ParentID)) || null\n : null;\n this.ShowEditDialog = true;\n }\n\n /**\n * Save scope (create or update)\n */\n public async saveScope(): Promise<void> {\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n let scope: MJAPIScopeEntity;\n\n if (this.EditingScope) {\n scope = this.EditingScope;\n } else {\n scope = await this.md.GetEntityObject<MJAPIScopeEntity>('MJ: API Scopes');\n scope.NewRecord();\n }\n\n scope.Name = this.EditName.trim();\n scope.Description = this.EditDescription.trim() || null;\n scope.Category = this.EditCategory;\n scope.ResourceType = this.EditResourceType || null;\n scope.ParentID = this.EditParentId;\n scope.IsActive = this.EditIsActive;\n // FullPath is auto-computed by the trigger\n\n const result = await scope.Save();\n if (result) {\n this.SuccessMessage = this.EditingScope\n ? 'Scope updated successfully'\n : 'Scope created successfully';\n this.closeDialogs();\n await this.loadData();\n this.ScopeUpdated.emit();\n setTimeout(() => this.SuccessMessage = '', 3000);\n } else {\n this.ErrorMessage = 'Failed to save scope';\n }\n } catch (error) {\n console.error('Error saving scope:', error);\n this.ErrorMessage = 'An error occurred while saving';\n } finally {\n this.IsSaving = false;\n }\n }\n\n /**\n * Toggle node expansion\n */\n public toggleExpanded(node: ScopeTreeNode): void {\n node.expanded = !node.expanded;\n }\n\n /**\n * Expand all nodes\n */\n public expandAll(): void {\n const expand = (nodes: ScopeTreeNode[]) => {\n for (const node of nodes) {\n node.expanded = true;\n expand(node.children);\n }\n };\n expand(this.ScopeTree);\n }\n\n /**\n * Collapse all nodes\n */\n public collapseAll(): void {\n const collapse = (nodes: ScopeTreeNode[]) => {\n for (const node of nodes) {\n node.expanded = false;\n collapse(node.children);\n }\n };\n collapse(this.ScopeTree);\n }\n\n /**\n * Close all dialogs\n */\n public closeDialogs(): void {\n this.ShowCreateDialog = false;\n this.ShowEditDialog = false;\n this.EditingScope = null;\n this.SelectedParentScope = null;\n }\n\n /**\n * Get parent scopes for dropdown (exclude self and descendants)\n */\n public getParentOptions(): MJAPIScopeEntity[] {\n if (!this.EditingScope) {\n return this.FlatScopes;\n }\n\n // Exclude self and all descendants\n const excludeIds = new Set<string>([this.EditingScope.ID]);\n const addDescendants = (parentId: string) => {\n for (const scope of this.FlatScopes) {\n if (UUIDsEqual(scope.ParentID, parentId) && !excludeIds.has(scope.ID)) {\n excludeIds.add(scope.ID);\n addDescendants(scope.ID);\n }\n }\n };\n addDescendants(this.EditingScope.ID);\n\n return this.FlatScopes.filter(s => !excludeIds.has(s.ID));\n }\n\n /**\n * Get category color\n */\n public getCategoryColor(category: string | null): string {\n return this.CategoryColors[category || 'Other'] || this.CategoryColors['Other'];\n }\n\n /**\n * Get count of total scopes\n */\n public getTotalCount(): number {\n return this.FlatScopes.length;\n }\n\n /**\n * Get count of active scopes\n */\n public getActiveCount(): number {\n return this.FlatScopes.filter(s => s.IsActive).length;\n }\n}\n","<div class=\"scopes-panel\">\n @if (IsLoading) {\n <mj-loading text=\"Loading scopes...\"></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-shield-halved\"></i>\n API Scopes\n </h3>\n <p class=\"panel-subtitle\">Manage hierarchical permission scopes for API access</p>\n </div>\n <div class=\"header-actions\">\n <div class=\"scope-stats\">\n <span class=\"stat\">\n <i class=\"fa-solid fa-shield\"></i>\n {{getTotalCount()}} total\n </span>\n <span class=\"stat active\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{getActiveCount()}} active\n </span>\n </div>\n <div class=\"tree-controls\">\n <button class=\"btn-icon\" (click)=\"expandAll()\" title=\"Expand All\">\n <i class=\"fa-solid fa-plus-square\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"collapseAll()\" title=\"Collapse All\">\n <i class=\"fa-solid fa-minus-square\"></i>\n </button>\n </div>\n <button class=\"btn-create\" (click)=\"openCreateDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n New Scope\n </button>\n </div>\n </div>\n <!-- Messages -->\n @if (SuccessMessage) {\n <div class=\"message success\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{SuccessMessage}}\n </div>\n }\n @if (ErrorMessage) {\n <div class=\"message error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ErrorMessage}}\n </div>\n }\n <!-- Scope Tree -->\n <div class=\"scope-tree\">\n @for (node of ScopeTree; track node) {\n <ng-container *ngTemplateOutlet=\"scopeNode; context: { node: node }\"></ng-container>\n }\n <!-- Empty State -->\n @if (ScopeTree.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>No scopes configured</span>\n <p>Create scopes to define API access permissions</p>\n </div>\n }\n </div>\n <!-- Recursive Node Template -->\n <ng-template #scopeNode let-node=\"node\">\n <div class=\"scope-node\" [style.padding-left.px]=\"node.level * 24\">\n <div class=\"node-content\" [class.inactive]=\"!node.scope.IsActive\">\n @if (node.children.length > 0) {\n <button class=\"expand-btn\"\n (click)=\"toggleExpanded(node)\">\n <i class=\"fa-solid\"\n [class.fa-chevron-right]=\"!node.expanded\"\n [class.fa-chevron-down]=\"node.expanded\"></i>\n </button>\n }\n @if (node.children.length === 0) {\n <span class=\"expand-placeholder\"></span>\n }\n <div class=\"scope-info\" (click)=\"openEditDialog(node.scope)\">\n <div class=\"scope-icon\" [style.backgroundColor]=\"getCategoryColor(node.scope.Category)\">\n <i class=\"fa-solid fa-shield\"></i>\n </div>\n <div class=\"scope-details\">\n <div class=\"scope-name\">\n {{node.scope.Name}}\n @if (node.scope.FullPath && node.scope.FullPath !== node.scope.Name) {\n <span class=\"full-path\">\n {{node.scope.FullPath}}\n </span>\n }\n @if (!node.scope.IsActive) {\n <span class=\"status-badge\">Inactive</span>\n }\n </div>\n <div class=\"scope-meta\">\n <span class=\"category\" [style.color]=\"getCategoryColor(node.scope.Category)\">\n {{node.scope.Category}}\n </span>\n @if (node.scope.ResourceType) {\n <span class=\"resource-type\">\n {{node.scope.ResourceType}}\n </span>\n }\n @if (node.scope.Description) {\n <span class=\"description\">\n {{node.scope.Description}}\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"node-actions\">\n <button class=\"btn-node-action\" (click)=\"openCreateDialog(node.scope)\" title=\"Add Child Scope\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n <button class=\"btn-node-action\" (click)=\"openEditDialog(node.scope)\" title=\"Edit Scope\">\n <i class=\"fa-solid fa-pencil\"></i>\n </button>\n </div>\n </div>\n @if (node.expanded && node.children.length > 0) {\n <div class=\"children\">\n @for (child of node.children; track child) {\n <ng-container *ngTemplateOutlet=\"scopeNode; context: { node: child }\"></ng-container>\n }\n </div>\n }\n </div>\n </ng-template>\n }\n\n <!-- Create/Edit Dialog -->\n @if (ShowCreateDialog || ShowEditDialog) {\n <mj-window\n [Width]=\"560\"\n [MinWidth]=\"420\"\n [MinHeight]=\"480\"\n [Resizable]=\"true\"\n [Draggable]=\"true\"\n [Visible]=\"true\"\n [Top]=\"80\"\n (Close)=\"closeDialogs()\">\n <mj-window-titlebar>\n <div class=\"dialog-title\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>{{EditingScope ? 'Edit Scope' : 'New Scope'}}</span>\n </div>\n </mj-window-titlebar>\n <div class=\"dialog-content\">\n <div class=\"form-field\">\n <label>Scope Name *</label>\n <input class=\"mj-input form-input\" [(ngModel)]=\"EditName\"\n placeholder=\"e.g., runview, create, execute\" />\n <span class=\"field-hint\">Use lowercase, single word. Will be combined with parent for full path.</span>\n </div>\n <div class=\"form-field\">\n <label>Parent Scope</label>\n <mj-dropdown [(ngModel)]=\"EditParentId\"\n [Data]=\"getParentOptions()\"\n TextField=\"FullPath\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [DefaultItem]=\"{ FullPath: '(No Parent - Root Level)', ID: null }\">\n </mj-dropdown>\n @if (SelectedParentScope) {\n <span class=\"field-hint\">\n Full path will be: <code>{{SelectedParentScope.FullPath}}:{{EditName || '...'}}</code>\n </span>\n }\n </div>\n <div class=\"form-row\">\n <div class=\"form-field half\">\n <label>Category</label>\n <mj-dropdown [(ngModel)]=\"EditCategory\"\n [Data]=\"Categories\"\n [ValuePrimitive]=\"true\">\n </mj-dropdown>\n </div>\n <div class=\"form-field half\">\n <label>Resource Type</label>\n <mj-dropdown [(ngModel)]=\"EditResourceType\"\n [Data]=\"ResourceTypes\"\n [ValuePrimitive]=\"true\"\n [DefaultItem]=\"''\">\n </mj-dropdown>\n </div>\n </div>\n <div class=\"form-field\">\n <label>Description</label>\n <textarea class=\"mj-textarea form-textarea\" [(ngModel)]=\"EditDescription\"\n placeholder=\"Describe what this scope allows...\"\n [rows]=\"3\"></textarea>\n </div>\n <div class=\"form-field\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" class=\"mj-checkbox\" [(ngModel)]=\"EditIsActive\" />\n <div>\n <span>Active</span>\n <span class=\"checkbox-hint\">Inactive scopes cannot be assigned to keys or applications</span>\n </div>\n </label>\n </div>\n <div class=\"dialog-actions\">\n <button mjButton variant=\"primary\"\n [disabled]=\"!EditName.trim() || IsSaving\"\n (click)=\"saveScope()\">\n @if (IsSaving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsSaving) {\n <span>\n <i class=\"fa-solid fa-save\"></i>\n {{EditingScope ? 'Update' : 'Create'}}\n </span>\n }\n </button>\n <button mjButton (click)=\"closeDialogs()\">Cancel</button>\n </div>\n </div>\n </mj-window>\n }\n</div>\n"]}
1
+ {"version":3,"file":"api-scopes-panel.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-scopes-panel.component.ts","../../src/APIKeys/api-scopes-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, EventEmitter, Output, ChangeDetectorRef } from '@angular/core';\nimport { RunView } from '@memberjunction/core';\nimport { MJAPIScopeEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n/** Scope tree node structure */\ninterface ScopeTreeNode {\n scope: MJAPIScopeEntity;\n children: ScopeTreeNode[];\n expanded: boolean;\n level: number;\n}\n\n/**\n * API Scopes Panel Component\n * Manages API Scopes in a hierarchical tree structure\n */\n@Component({\n standalone: false,\n selector: 'mj-api-scopes-panel',\n templateUrl: './api-scopes-panel.component.html',\n styleUrls: ['./api-scopes-panel.component.css']\n})\nexport class APIScopesPanelComponent extends BaseAngularComponent implements OnInit {\n @Output() ScopeUpdated = new EventEmitter<void>();\n\n private get md() { return this.ProviderToUse; }\n private cdr: ChangeDetectorRef;\n\n // Loading states\n public IsLoading = true;\n public IsSaving = false;\n\n // Data\n public ScopeTree: ScopeTreeNode[] = [];\n public FlatScopes: MJAPIScopeEntity[] = [];\n\n // Edit state\n public EditingScope: MJAPIScopeEntity | null = null;\n public EditName = '';\n public EditDescription = '';\n public EditCategory = '';\n public EditResourceType = '';\n public EditParentId: string | null = null;\n public EditIsActive = true;\n\n // Dialog states\n public ShowCreateDialog = false;\n public ShowEditDialog = false;\n public SelectedParentScope: MJAPIScopeEntity | null = null;\n\n // Messages\n public SuccessMessage = '';\n public ErrorMessage = '';\n\n // Category colors\n public readonly CategoryColors: Record<string, string> = {\n 'Entities': '#6366f1',\n 'Agents': '#10b981',\n 'Admin': '#f59e0b',\n 'Actions': '#8b5cf6',\n 'Queries': '#3b82f6',\n 'Reports': '#ef4444',\n 'Communication': '#ec4899',\n 'Other': '#6b7280'\n };\n\n // Resource type options\n public readonly ResourceTypes = ['Entity', 'Agent', 'Query', 'Mutation', 'Action', 'Report', 'Admin', 'Other'];\n public readonly Categories = ['Entities', 'Agents', 'Admin', 'Actions', 'Queries', 'Reports', 'Communication', 'Other'];\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 scopes\n */\n public async loadData(): Promise<void> {\n this.IsLoading = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJAPIScopeEntity>({\n EntityName: 'MJ: API Scopes',\n OrderBy: 'FullPath',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.FlatScopes = result.Results;\n this.buildTree();\n }\n } catch (error) {\n console.error('Error loading scopes:', error);\n this.ErrorMessage = 'Failed to load scopes';\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Build tree structure from flat scopes\n */\n private buildTree(): void {\n const scopeMap = new Map<string, ScopeTreeNode>();\n const rootNodes: ScopeTreeNode[] = [];\n\n // Create nodes\n for (const scope of this.FlatScopes) {\n scopeMap.set(scope.ID, {\n scope,\n children: [],\n expanded: true,\n level: 0\n });\n }\n\n // Build hierarchy\n for (const scope of this.FlatScopes) {\n const node = scopeMap.get(scope.ID)!;\n if (scope.ParentID) {\n const parent = scopeMap.get(scope.ParentID);\n if (parent) {\n parent.children.push(node);\n node.level = parent.level + 1;\n } else {\n rootNodes.push(node);\n }\n } else {\n rootNodes.push(node);\n }\n }\n\n // Calculate levels recursively\n const calculateLevels = (nodes: ScopeTreeNode[], level: number) => {\n for (const node of nodes) {\n node.level = level;\n calculateLevels(node.children, level + 1);\n }\n };\n calculateLevels(rootNodes, 0);\n\n this.ScopeTree = rootNodes;\n }\n\n /**\n * Open create dialog for new scope\n */\n public openCreateDialog(parentScope: MJAPIScopeEntity | null = null): void {\n this.EditName = '';\n this.EditDescription = '';\n this.EditCategory = parentScope?.Category || 'Entities';\n this.EditResourceType = '';\n this.EditParentId = parentScope?.ID || null;\n this.EditIsActive = true;\n this.EditingScope = null;\n this.SelectedParentScope = parentScope;\n this.ShowCreateDialog = true;\n }\n\n /**\n * Open edit dialog for existing scope\n */\n public openEditDialog(scope: MJAPIScopeEntity): void {\n this.EditingScope = scope;\n this.EditName = scope.Name;\n this.EditDescription = scope.Description || '';\n this.EditCategory = scope.Category || 'Entities';\n this.EditResourceType = scope.ResourceType || '';\n this.EditParentId = scope.ParentID;\n this.EditIsActive = scope.IsActive;\n this.SelectedParentScope = scope.ParentID\n ? this.FlatScopes.find(s => UUIDsEqual(s.ID, scope.ParentID)) || null\n : null;\n this.ShowEditDialog = true;\n }\n\n /**\n * Save scope (create or update)\n */\n public async saveScope(): Promise<void> {\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n let scope: MJAPIScopeEntity;\n\n if (this.EditingScope) {\n scope = this.EditingScope;\n } else {\n scope = await this.md.GetEntityObject<MJAPIScopeEntity>('MJ: API Scopes');\n scope.NewRecord();\n }\n\n scope.Name = this.EditName.trim();\n scope.Description = this.EditDescription.trim() || null;\n scope.Category = this.EditCategory;\n scope.ResourceType = this.EditResourceType || null;\n scope.ParentID = this.EditParentId;\n scope.IsActive = this.EditIsActive;\n // FullPath is auto-computed by the trigger\n\n const result = await scope.Save();\n if (result) {\n this.SuccessMessage = this.EditingScope\n ? 'Scope updated successfully'\n : 'Scope created successfully';\n this.closeDialogs();\n await this.loadData();\n this.ScopeUpdated.emit();\n setTimeout(() => this.SuccessMessage = '', 3000);\n } else {\n this.ErrorMessage = 'Failed to save scope';\n }\n } catch (error) {\n console.error('Error saving scope:', error);\n this.ErrorMessage = 'An error occurred while saving';\n } finally {\n this.IsSaving = false;\n }\n }\n\n /**\n * Toggle node expansion\n */\n public toggleExpanded(node: ScopeTreeNode): void {\n node.expanded = !node.expanded;\n }\n\n /**\n * Expand all nodes\n */\n public expandAll(): void {\n const expand = (nodes: ScopeTreeNode[]) => {\n for (const node of nodes) {\n node.expanded = true;\n expand(node.children);\n }\n };\n expand(this.ScopeTree);\n }\n\n /**\n * Collapse all nodes\n */\n public collapseAll(): void {\n const collapse = (nodes: ScopeTreeNode[]) => {\n for (const node of nodes) {\n node.expanded = false;\n collapse(node.children);\n }\n };\n collapse(this.ScopeTree);\n }\n\n /**\n * Close all dialogs\n */\n public closeDialogs(): void {\n this.ShowCreateDialog = false;\n this.ShowEditDialog = false;\n this.EditingScope = null;\n this.SelectedParentScope = null;\n }\n\n /**\n * Get parent scopes for dropdown (exclude self and descendants)\n */\n public getParentOptions(): MJAPIScopeEntity[] {\n if (!this.EditingScope) {\n return this.FlatScopes;\n }\n\n // Exclude self and all descendants\n const excludeIds = new Set<string>([this.EditingScope.ID]);\n const addDescendants = (parentId: string) => {\n for (const scope of this.FlatScopes) {\n if (UUIDsEqual(scope.ParentID, parentId) && !excludeIds.has(scope.ID)) {\n excludeIds.add(scope.ID);\n addDescendants(scope.ID);\n }\n }\n };\n addDescendants(this.EditingScope.ID);\n\n return this.FlatScopes.filter(s => !excludeIds.has(s.ID));\n }\n\n /**\n * Get category color\n */\n public getCategoryColor(category: string | null): string {\n return this.CategoryColors[category || 'Other'] || this.CategoryColors['Other'];\n }\n\n /**\n * Get count of total scopes\n */\n public getTotalCount(): number {\n return this.FlatScopes.length;\n }\n\n /**\n * Get count of active scopes\n */\n public getActiveCount(): number {\n return this.FlatScopes.filter(s => s.IsActive).length;\n }\n}\n","<div class=\"scopes-panel\">\n @if (IsLoading) {\n <mj-loading text=\"Loading scopes...\"></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-shield-halved\"></i>\n API Scopes\n </h3>\n <p class=\"panel-subtitle\">Manage hierarchical permission scopes for API access</p>\n </div>\n <div class=\"header-actions\">\n <div class=\"scope-stats\">\n <span class=\"stat\">\n <i class=\"fa-solid fa-shield\"></i>\n {{getTotalCount()}} total\n </span>\n <span class=\"stat active\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{getActiveCount()}} active\n </span>\n </div>\n <div class=\"tree-controls\">\n <button class=\"btn-icon\" (click)=\"expandAll()\" title=\"Expand All\">\n <i class=\"fa-solid fa-plus-square\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"collapseAll()\" title=\"Collapse All\">\n <i class=\"fa-solid fa-minus-square\"></i>\n </button>\n </div>\n <button class=\"btn-create\" (click)=\"openCreateDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n New Scope\n </button>\n </div>\n </div>\n <!-- Messages -->\n @if (SuccessMessage) {\n <div class=\"message success\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{SuccessMessage}}\n </div>\n }\n @if (ErrorMessage) {\n <div class=\"message error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ErrorMessage}}\n </div>\n }\n <!-- Scope Tree -->\n <div class=\"scope-tree\">\n @for (node of ScopeTree; track node) {\n <ng-container *ngTemplateOutlet=\"scopeNode; context: { node: node }\"></ng-container>\n }\n <!-- Empty State -->\n @if (ScopeTree.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>No scopes configured</span>\n <p>Create scopes to define API access permissions</p>\n </div>\n }\n </div>\n <!-- Recursive Node Template -->\n <ng-template #scopeNode let-node=\"node\">\n <div class=\"scope-node\" [style.padding-left.px]=\"node.level * 24\">\n <div class=\"node-content\" [class.inactive]=\"!node.scope.IsActive\">\n @if (node.children.length > 0) {\n <button class=\"expand-btn\"\n (click)=\"toggleExpanded(node)\">\n <i class=\"fa-solid\"\n [class.fa-chevron-right]=\"!node.expanded\"\n [class.fa-chevron-down]=\"node.expanded\"></i>\n </button>\n }\n @if (node.children.length === 0) {\n <span class=\"expand-placeholder\"></span>\n }\n <div class=\"scope-info\" (click)=\"openEditDialog(node.scope)\">\n <div class=\"scope-icon\" [style.backgroundColor]=\"getCategoryColor(node.scope.Category)\">\n <i class=\"fa-solid fa-shield\"></i>\n </div>\n <div class=\"scope-details\">\n <div class=\"scope-name\">\n {{node.scope.Name}}\n @if (node.scope.FullPath && node.scope.FullPath !== node.scope.Name) {\n <span class=\"full-path\">\n {{node.scope.FullPath}}\n </span>\n }\n @if (!node.scope.IsActive) {\n <span class=\"status-badge\">Inactive</span>\n }\n </div>\n <div class=\"scope-meta\">\n <span class=\"category\" [style.color]=\"getCategoryColor(node.scope.Category)\">\n {{node.scope.Category}}\n </span>\n @if (node.scope.ResourceType) {\n <span class=\"resource-type\">\n {{node.scope.ResourceType}}\n </span>\n }\n @if (node.scope.Description) {\n <span class=\"description\">\n {{node.scope.Description}}\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"node-actions\">\n <button class=\"btn-node-action\" (click)=\"openCreateDialog(node.scope)\" title=\"Add Child Scope\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n <button class=\"btn-node-action\" (click)=\"openEditDialog(node.scope)\" title=\"Edit Scope\">\n <i class=\"fa-solid fa-pencil\"></i>\n </button>\n </div>\n </div>\n @if (node.expanded && node.children.length > 0) {\n <div class=\"children\">\n @for (child of node.children; track child) {\n <ng-container *ngTemplateOutlet=\"scopeNode; context: { node: child }\"></ng-container>\n }\n </div>\n }\n </div>\n </ng-template>\n }\n\n <!-- Create/Edit Dialog -->\n @if (ShowCreateDialog || ShowEditDialog) {\n <mj-window\n [Width]=\"560\"\n [MinWidth]=\"420\"\n [MinHeight]=\"480\"\n [Resizable]=\"true\"\n [Draggable]=\"true\"\n [Visible]=\"true\"\n [Top]=\"80\"\n (Close)=\"closeDialogs()\">\n <mj-window-titlebar>\n <div class=\"dialog-title\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>{{EditingScope ? 'Edit Scope' : 'New Scope'}}</span>\n </div>\n </mj-window-titlebar>\n <div class=\"dialog-content\">\n <div class=\"form-field\">\n <label>Scope Name *</label>\n <input class=\"mj-input form-input\" [(ngModel)]=\"EditName\"\n placeholder=\"e.g., runview, create, execute\" />\n <span class=\"field-hint\">Use lowercase, single word. Will be combined with parent for full path.</span>\n </div>\n <div class=\"form-field\">\n <label>Parent Scope</label>\n <mj-dropdown [(ngModel)]=\"EditParentId\"\n [Data]=\"getParentOptions()\"\n TextField=\"FullPath\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [DefaultItem]=\"{ FullPath: '(No Parent - Root Level)', ID: null }\">\n </mj-dropdown>\n @if (SelectedParentScope) {\n <span class=\"field-hint\">\n Full path will be: <code>{{SelectedParentScope.FullPath}}:{{EditName || '...'}}</code>\n </span>\n }\n </div>\n <div class=\"form-row\">\n <div class=\"form-field half\">\n <label>Category</label>\n <mj-dropdown [(ngModel)]=\"EditCategory\"\n [Data]=\"Categories\"\n [ValuePrimitive]=\"true\">\n </mj-dropdown>\n </div>\n <div class=\"form-field half\">\n <label>Resource Type</label>\n <mj-dropdown [(ngModel)]=\"EditResourceType\"\n [Data]=\"ResourceTypes\"\n [ValuePrimitive]=\"true\"\n [DefaultItem]=\"''\">\n </mj-dropdown>\n </div>\n </div>\n <div class=\"form-field\">\n <label>Description</label>\n <textarea class=\"mj-textarea form-textarea\" [(ngModel)]=\"EditDescription\"\n placeholder=\"Describe what this scope allows...\"\n [rows]=\"3\"></textarea>\n </div>\n <div class=\"form-field\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" class=\"mj-checkbox\" [(ngModel)]=\"EditIsActive\" />\n <div>\n <span>Active</span>\n <span class=\"checkbox-hint\">Inactive scopes cannot be assigned to keys or applications</span>\n </div>\n </label>\n </div>\n <div class=\"dialog-actions\">\n <button mjButton variant=\"primary\"\n [disabled]=\"!EditName.trim() || IsSaving\"\n (click)=\"saveScope()\">\n @if (IsSaving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsSaving) {\n <span>\n <i class=\"fa-solid fa-save\"></i>\n {{EditingScope ? 'Update' : 'Create'}}\n </span>\n }\n </button>\n <button mjButton (click)=\"closeDialogs()\">Cancel</button>\n </div>\n </div>\n </mj-window>\n }\n</div>\n"]}
@@ -1,4 +1,5 @@
1
1
  import { OnInit, ChangeDetectorRef } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
2
3
  import * as i0 from "@angular/core";
3
4
  /** Time bucket for aggregation */
4
5
  interface TimeBucket {
@@ -46,8 +47,8 @@ interface UsageLogItem {
46
47
  * API Usage Analytics Panel Component
47
48
  * Comprehensive usage statistics and drill-down capabilities
48
49
  */
49
- export declare class APIUsagePanelComponent implements OnInit {
50
- private md;
50
+ export declare class APIUsagePanelComponent extends BaseAngularComponent implements OnInit {
51
+ private get md();
51
52
  private cdr;
52
53
  IsLoading: boolean;
53
54
  IsLoadingLogs: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"api-usage-panel.component.d.ts","sourceRoot":"","sources":["../../src/APIKeys/api-usage-panel.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-usage-panel.component.d.ts","sourceRoot":"","sources":["../../src/APIKeys/api-usage-panel.component.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { Component } from '@angular/core';
2
- import { Metadata, RunView } from '@memberjunction/core';
2
+ import { RunView } from '@memberjunction/core';
3
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
4
  import * as i0 from "@angular/core";
4
5
  import * as i1 from "@angular/common";
5
6
  import * as i2 from "@memberjunction/ng-ui-components";
@@ -570,8 +571,8 @@ function APIUsagePanelComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
570
571
  * API Usage Analytics Panel Component
571
572
  * Comprehensive usage statistics and drill-down capabilities
572
573
  */
573
- export class APIUsagePanelComponent {
574
- md = new Metadata();
574
+ export class APIUsagePanelComponent extends BaseAngularComponent {
575
+ get md() { return this.ProviderToUse; }
575
576
  cdr;
576
577
  // Loading states
577
578
  IsLoading = true;
@@ -606,6 +607,7 @@ export class APIUsagePanelComponent {
606
607
  // Expose Math for template
607
608
  Math = Math;
608
609
  constructor(cdr) {
610
+ super();
609
611
  this.cdr = cdr;
610
612
  }
611
613
  async ngOnInit() {
@@ -634,7 +636,7 @@ export class APIUsagePanelComponent {
634
636
  * Load API keys for label lookup
635
637
  */
636
638
  async loadKeys() {
637
- const rv = new RunView();
639
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
638
640
  const result = await rv.RunView({
639
641
  EntityName: 'MJ: API Keys',
640
642
  Fields: ['ID', 'Label'],
@@ -650,7 +652,7 @@ export class APIUsagePanelComponent {
650
652
  * Load usage statistics based on time range
651
653
  */
652
654
  async loadUsageStats() {
653
- const rv = new RunView();
655
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
654
656
  const filter = this.getTimeFilter();
655
657
  const result = await rv.RunView({
656
658
  EntityName: 'MJ: API Key Usage Logs',
@@ -903,7 +905,7 @@ export class APIUsagePanelComponent {
903
905
  */
904
906
  async loadFilteredLogs() {
905
907
  this.IsLoadingLogs = true;
906
- const rv = new RunView();
908
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
907
909
  let filter = this.getTimeFilter();
908
910
  if (this.LogsFilter.endpoint) {
909
911
  filter += filter ? ' AND ' : '';
@@ -992,7 +994,7 @@ export class APIUsagePanelComponent {
992
994
  return num.toString();
993
995
  }
994
996
  static ɵfac = function APIUsagePanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || APIUsagePanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
995
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: APIUsagePanelComponent, selectors: [["mj-api-usage-panel"]], standalone: false, decls: 4, vars: 3, consts: [[1, "usage-panel"], ["text", "Loading usage analytics..."], [3, "Width", "MinWidth", "Height", "MinHeight", "Resizable", "Draggable", "Top", "Visible"], [1, "panel-header"], [1, "header-left"], [1, "panel-title"], [1, "fa-solid", "fa-chart-line"], [1, "panel-subtitle"], [1, "time-filters"], [1, "time-btn", 3, "click"], [1, "kpi-grid"], [1, "kpi-card"], [1, "kpi-icon", "requests"], [1, "fa-solid", "fa-arrow-right-arrow-left"], [1, "kpi-content"], [1, "kpi-value"], [1, "kpi-label"], [1, "kpi-icon", "success-rate"], [1, "fa-solid", "fa-check-circle"], [1, "kpi-icon", "errors"], [1, "fa-solid", "fa-circle-exclamation"], [1, "kpi-icon", "response-time"], [1, "fa-solid", "fa-gauge-high"], [1, "kpi-icon", "keys"], [1, "fa-solid", "fa-key"], [1, "kpi-icon", "endpoints"], [1, "fa-solid", "fa-code-branch"], [1, "chart-section"], [1, "chart-header"], [1, "chart-legend"], [1, "legend-item"], [1, "legend-color", "requests"], [1, "legend-color", "errors"], [1, "chart-container"], [1, "empty-chart"], [1, "breakdown-grid"], [1, "breakdown-card"], [1, "breakdown-header"], [1, "breakdown-content"], [1, "endpoint-list"], [1, "empty-state"], [1, "key-list"], [1, "fa-solid", "fa-circle-half-stroke"], [1, "status-distribution"], [1, "logs-section"], [1, "logs-header"], [1, "fa-solid", "fa-list"], [1, "logs-table"], [1, "empty-state", "large"], [1, "chart-bars"], [1, "bar-group", 3, "title"], [1, "chart-y-axis"], [1, "bar-wrapper"], [1, "bar", "requests-bar"], [1, "bar", "errors-bar", 3, "height"], [1, "bar-label"], [1, "bar", "errors-bar"], [1, "fa-solid", "fa-chart-area"], [1, "endpoint-item"], [1, "endpoint-item", 3, "click"], [1, "endpoint-info"], [1, "method-badge", 3, "ngClass"], [1, "endpoint-path"], [1, "endpoint-stats"], [1, "endpoint-requests"], [1, "endpoint-time"], [1, "endpoint-error"], [1, "key-item"], [1, "key-item", 3, "click"], [1, "key-info"], [1, "key-label"], [1, "key-last-used"], [1, "key-requests"], [1, "status-bar"], [1, "status-segment", 3, "width", "backgroundColor", "title"], [1, "status-legend"], [1, "status-legend-item"], [1, "status-segment", 3, "title"], [1, "status-color"], [1, "status-label"], [1, "status-count"], [1, "logs-table-header"], [1, "col-time"], [1, "col-key"], [1, "col-method"], [1, "col-endpoint"], [1, "col-status"], [1, "col-duration"], [1, "logs-table-body"], [1, "log-row"], [1, "col-status", 3, "ngClass"], [1, "fa-solid", "fa-inbox"], [3, "Close", "Width", "MinWidth", "Height", "MinHeight", "Resizable", "Draggable", "Top", "Visible"], [1, "drilldown-title"], [1, "fa-solid", "fa-magnifying-glass-chart"], [1, "filter-badge"], ["mjButton", "", "variant", "flat", 1, "window-close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "drilldown-content"], ["text", "Loading requests..."], [1, "drilldown-logs"], [1, "logs-table-body", "scrollable"]], template: function APIUsagePanelComponent_Template(rf, ctx) { if (rf & 1) {
997
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: APIUsagePanelComponent, selectors: [["mj-api-usage-panel"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 3, consts: [[1, "usage-panel"], ["text", "Loading usage analytics..."], [3, "Width", "MinWidth", "Height", "MinHeight", "Resizable", "Draggable", "Top", "Visible"], [1, "panel-header"], [1, "header-left"], [1, "panel-title"], [1, "fa-solid", "fa-chart-line"], [1, "panel-subtitle"], [1, "time-filters"], [1, "time-btn", 3, "click"], [1, "kpi-grid"], [1, "kpi-card"], [1, "kpi-icon", "requests"], [1, "fa-solid", "fa-arrow-right-arrow-left"], [1, "kpi-content"], [1, "kpi-value"], [1, "kpi-label"], [1, "kpi-icon", "success-rate"], [1, "fa-solid", "fa-check-circle"], [1, "kpi-icon", "errors"], [1, "fa-solid", "fa-circle-exclamation"], [1, "kpi-icon", "response-time"], [1, "fa-solid", "fa-gauge-high"], [1, "kpi-icon", "keys"], [1, "fa-solid", "fa-key"], [1, "kpi-icon", "endpoints"], [1, "fa-solid", "fa-code-branch"], [1, "chart-section"], [1, "chart-header"], [1, "chart-legend"], [1, "legend-item"], [1, "legend-color", "requests"], [1, "legend-color", "errors"], [1, "chart-container"], [1, "empty-chart"], [1, "breakdown-grid"], [1, "breakdown-card"], [1, "breakdown-header"], [1, "breakdown-content"], [1, "endpoint-list"], [1, "empty-state"], [1, "key-list"], [1, "fa-solid", "fa-circle-half-stroke"], [1, "status-distribution"], [1, "logs-section"], [1, "logs-header"], [1, "fa-solid", "fa-list"], [1, "logs-table"], [1, "empty-state", "large"], [1, "chart-bars"], [1, "bar-group", 3, "title"], [1, "chart-y-axis"], [1, "bar-wrapper"], [1, "bar", "requests-bar"], [1, "bar", "errors-bar", 3, "height"], [1, "bar-label"], [1, "bar", "errors-bar"], [1, "fa-solid", "fa-chart-area"], [1, "endpoint-item"], [1, "endpoint-item", 3, "click"], [1, "endpoint-info"], [1, "method-badge", 3, "ngClass"], [1, "endpoint-path"], [1, "endpoint-stats"], [1, "endpoint-requests"], [1, "endpoint-time"], [1, "endpoint-error"], [1, "key-item"], [1, "key-item", 3, "click"], [1, "key-info"], [1, "key-label"], [1, "key-last-used"], [1, "key-requests"], [1, "status-bar"], [1, "status-segment", 3, "width", "backgroundColor", "title"], [1, "status-legend"], [1, "status-legend-item"], [1, "status-segment", 3, "title"], [1, "status-color"], [1, "status-label"], [1, "status-count"], [1, "logs-table-header"], [1, "col-time"], [1, "col-key"], [1, "col-method"], [1, "col-endpoint"], [1, "col-status"], [1, "col-duration"], [1, "logs-table-body"], [1, "log-row"], [1, "col-status", 3, "ngClass"], [1, "fa-solid", "fa-inbox"], [3, "Close", "Width", "MinWidth", "Height", "MinHeight", "Resizable", "Draggable", "Top", "Visible"], [1, "drilldown-title"], [1, "fa-solid", "fa-magnifying-glass-chart"], [1, "filter-badge"], ["mjButton", "", "variant", "flat", 1, "window-close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "drilldown-content"], ["text", "Loading requests..."], [1, "drilldown-logs"], [1, "logs-table-body", "scrollable"]], template: function APIUsagePanelComponent_Template(rf, ctx) { if (rf & 1) {
996
998
  i0.ɵɵelementStart(0, "div", 0);
997
999
  i0.ɵɵconditionalCreate(1, APIUsagePanelComponent_Conditional_1_Template, 1, 0, "mj-loading", 1);
998
1000
  i0.ɵɵconditionalCreate(2, APIUsagePanelComponent_Conditional_2_Template, 110, 28);
@@ -1011,5 +1013,5 @@ export class APIUsagePanelComponent {
1011
1013
  type: Component,
1012
1014
  args: [{ standalone: false, selector: 'mj-api-usage-panel', template: "<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", styles: [".usage-panel {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n/* Header */\n.panel-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.header-left {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.panel-title i {\n color: var(--mj-color-indigo-500);\n}\n\n.panel-subtitle {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n/* Time Filters */\n.time-filters {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface);\n padding: 4px;\n border-radius: 10px;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.time-btn {\n padding: 8px 16px;\n background: transparent;\n border: none;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.time-btn:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.time-btn.active {\n background: linear-gradient(135deg, var(--mj-color-indigo-500) 0%, var(--mj-color-indigo-600) 100%);\n color: var(--mj-text-inverse);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-color-indigo-500) 30%, transparent);\n}\n\n/* KPI Grid */\n.kpi-grid {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 16px;\n}\n\n.kpi-card {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 18px 20px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.kpi-card:hover {\n box-shadow: var(--mj-shadow-lg);\n transform: translateY(-2px);\n}\n\n.kpi-card.success {\n background: var(--mj-status-success-bg);\n}\n\n.kpi-card.warning {\n background: linear-gradient(135deg, var(--mj-color-brand-100) 0%, var(--mj-color-brand-200) 100%);\n}\n\n.kpi-icon {\n width: 44px;\n height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n font-size: 18px;\n}\n\n.kpi-icon.requests {\n background: linear-gradient(135deg, var(--mj-color-info-100) 0%, var(--mj-color-info-100) 100%);\n color: var(--mj-color-info-600);\n}\n\n.kpi-icon.success-rate {\n background: linear-gradient(135deg, var(--mj-color-success-100) 0%, var(--mj-color-success-200) 100%);\n color: var(--mj-color-success-600);\n}\n\n.kpi-icon.errors {\n background: linear-gradient(135deg, var(--mj-color-error-100) 0%, var(--mj-color-error-200) 100%);\n color: var(--mj-color-error-600);\n}\n\n.kpi-icon.response-time {\n background: linear-gradient(135deg, var(--mj-color-indigo-100) 0%, var(--mj-color-indigo-200) 100%);\n color: var(--mj-color-indigo-600);\n}\n\n.kpi-icon.keys {\n background: linear-gradient(135deg, var(--mj-color-brand-100) 0%, var(--mj-color-brand-200) 100%);\n color: var(--mj-brand-primary-hover);\n}\n\n.kpi-icon.endpoints {\n background: linear-gradient(135deg, var(--mj-color-violet-50) 0%, var(--mj-color-violet-200) 100%);\n color: var(--mj-brand-primary);\n}\n\n.kpi-content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.kpi-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.kpi-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n/* Chart Section */\n.chart-section {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.chart-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.chart-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.chart-legend {\n display: flex;\n gap: 16px;\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.legend-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.requests {\n background: var(--mj-color-indigo-500);\n}\n\n.legend-color.errors {\n background: var(--mj-status-error);\n}\n\n.chart-container {\n display: flex;\n height: 200px;\n gap: 8px;\n}\n\n.chart-bars {\n flex: 1;\n display: flex;\n align-items: flex-end;\n gap: 4px;\n padding-bottom: 24px;\n}\n\n.bar-group {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 0;\n}\n\n.bar-wrapper {\n width: 100%;\n height: 160px;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n}\n\n.bar {\n width: 100%;\n max-width: 32px;\n border-radius: 4px 4px 0 0;\n transition: all 0.3s ease;\n position: relative;\n}\n\n.bar.requests-bar {\n background: linear-gradient(180deg, var(--mj-color-indigo-500) 0%, var(--mj-color-indigo-400) 100%);\n}\n\n.bar.requests-bar:hover {\n background: linear-gradient(180deg, var(--mj-color-indigo-600) 0%, var(--mj-color-indigo-500) 100%);\n}\n\n.bar.errors-bar {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n background: var(--mj-status-error);\n border-radius: 0;\n}\n\n.bar-label {\n margin-top: 8px;\n font-size: 10px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n max-width: 100%;\n}\n\n.chart-y-axis {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n padding-bottom: 24px;\n font-size: 10px;\n color: var(--mj-text-muted);\n text-align: right;\n min-width: 40px;\n}\n\n.empty-chart {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: var(--mj-text-muted);\n}\n\n.empty-chart i {\n font-size: 32px;\n margin-bottom: 8px;\n opacity: 0.5;\n}\n\n/* Breakdown Grid */\n.breakdown-grid {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 20px;\n}\n\n.breakdown-card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n}\n\n.breakdown-header {\n padding: 16px 20px;\n background: var(--mj-bg-page);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.breakdown-header h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.breakdown-header h4 i {\n color: var(--mj-text-secondary);\n}\n\n.breakdown-content {\n padding: 12px;\n max-height: 280px;\n overflow-y: auto;\n}\n\n/* Endpoint List */\n.endpoint-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.endpoint-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 12px;\n background: var(--mj-bg-page);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.endpoint-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.endpoint-info {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n flex: 1;\n}\n\n.method-badge {\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.method-get { background: var(--mj-status-info-bg); color: var(--mj-color-info-600); }\n.method-post { background: var(--mj-color-success-100); color: var(--mj-color-success-600); }\n.method-put { background: var(--mj-color-brand-100); color: var(--mj-brand-primary-hover); }\n.method-delete { background: var(--mj-color-error-100); color: var(--mj-color-error-600); }\n.method-other { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n\n.endpoint-path {\n font-size: 12px;\n font-family: 'Fira Code', monospace;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.endpoint-stats {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 11px;\n flex-shrink: 0;\n}\n\n.endpoint-requests {\n font-weight: 600;\n color: var(--mj-color-indigo-500);\n}\n\n.endpoint-time {\n color: var(--mj-text-secondary);\n}\n\n.endpoint-error {\n color: var(--mj-status-success);\n}\n\n.endpoint-error.has-errors {\n color: var(--mj-status-error);\n font-weight: 500;\n}\n\n/* Key List */\n.key-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.key-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 12px;\n background: var(--mj-bg-page);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.key-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.key-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.key-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.key-last-used {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.key-requests {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-color-indigo-500);\n}\n\n/* Status Distribution */\n.status-distribution {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.status-bar {\n display: flex;\n height: 24px;\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n}\n\n.status-segment {\n transition: all 0.3s ease;\n}\n\n.status-segment:hover {\n filter: brightness(1.1);\n}\n\n.status-legend {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.status-legend-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n}\n\n.status-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.status-label {\n flex: 1;\n color: var(--mj-text-secondary);\n}\n\n.status-count {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n/* Logs Section */\n.logs-section {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n}\n\n.logs-header {\n padding: 16px 20px;\n background: var(--mj-bg-page);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.logs-header h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.logs-header h4 i {\n color: var(--mj-text-secondary);\n}\n\n.logs-table {\n width: 100%;\n}\n\n.logs-table-header {\n display: grid;\n grid-template-columns: 100px 120px 70px 1fr 70px 80px;\n gap: 12px;\n padding: 12px 20px;\n background: var(--mj-bg-surface-sunken);\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.logs-table-body {\n max-height: 320px;\n overflow-y: auto;\n}\n\n.logs-table-body.scrollable {\n max-height: 380px;\n}\n\n.log-row {\n display: grid;\n grid-template-columns: 100px 120px 70px 1fr 70px 80px;\n gap: 12px;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n font-size: 13px;\n align-items: center;\n transition: background 0.2s ease;\n}\n\n.log-row:hover {\n background: var(--mj-bg-page);\n}\n\n.col-time {\n color: var(--mj-text-secondary);\n font-size: 12px;\n}\n\n.col-key {\n color: var(--mj-text-secondary);\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.col-endpoint {\n font-family: 'Fira Code', monospace;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.col-status {\n font-weight: 600;\n text-align: center;\n}\n\n.col-status.status-success { color: var(--mj-status-success); }\n.col-status.status-info { color: var(--mj-status-info); }\n.col-status.status-warning { color: var(--mj-color-warning-500); }\n.col-status.status-error { color: var(--mj-status-error); }\n\n.col-duration {\n color: var(--mj-text-secondary);\n text-align: right;\n}\n\n/* Empty States */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 20px;\n color: var(--mj-text-muted);\n text-align: center;\n}\n\n.empty-state i {\n font-size: 32px;\n margin-bottom: 8px;\n opacity: 0.5;\n}\n\n.empty-state span {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.empty-state.large {\n padding: 48px 24px;\n}\n\n.empty-state.large i {\n font-size: 48px;\n}\n\n.empty-state p {\n margin: 8px 0 0 0;\n font-size: 12px;\n}\n\n/* Drill-down Window */\n.drilldown-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n font-size: 15px;\n}\n\n.drilldown-title i {\n color: var(--mj-color-indigo-500);\n}\n\n.filter-badge {\n padding: 4px 10px;\n background: var(--mj-color-indigo-100);\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-color-indigo-600);\n}\n\n.window-close-btn {\n margin-left: auto;\n color: var(--mj-text-muted);\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n}\n\n.window-close-btn:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.drilldown-content {\n height: 100%;\n overflow: hidden;\n}\n\n.drilldown-logs {\n height: 100%;\n}\n\n/* MJ Window Styling */\n:host ::ng-deep mj-window .mj-window {\n border-radius: 12px !important;\n overflow: hidden;\n box-shadow: var(--mj-shadow-2xl) !important;\n}\n\n:host ::ng-deep mj-window .mj-window-content {\n padding: 0 !important;\n}\n\n:host ::ng-deep mj-window-titlebar {\n padding: 16px 20px !important;\n background: var(--mj-bg-page) !important;\n border-bottom: 1px solid var(--mj-border-default) !important;\n}\n\n/* Responsive */\n@media (max-width: 1400px) {\n .kpi-grid {\n grid-template-columns: repeat(3, 1fr);\n }\n}\n\n@media (max-width: 1200px) {\n .breakdown-grid {\n grid-template-columns: 1fr 1fr;\n }\n}\n\n@media (max-width: 900px) {\n .kpi-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .breakdown-grid {\n grid-template-columns: 1fr;\n }\n\n .logs-table-header,\n .log-row {\n grid-template-columns: 80px 100px 60px 1fr 60px;\n }\n\n .col-duration {\n display: none;\n }\n}\n\n@media (max-width: 600px) {\n .panel-header {\n flex-direction: column;\n }\n\n .time-filters {\n width: 100%;\n justify-content: center;\n }\n\n .kpi-grid {\n grid-template-columns: 1fr;\n }\n\n .logs-table-header,\n .log-row {\n grid-template-columns: 1fr 60px;\n }\n\n .col-key,\n .col-method,\n .col-endpoint {\n display: none;\n }\n}\n"] }]
1013
1015
  }], () => [{ type: i0.ChangeDetectorRef }], null); })();
1014
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(APIUsagePanelComponent, { className: "APIUsagePanelComponent", filePath: "src/APIKeys/api-usage-panel.component.ts", lineNumber: 61 }); })();
1016
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(APIUsagePanelComponent, { className: "APIUsagePanelComponent", filePath: "src/APIKeys/api-usage-panel.component.ts", lineNumber: 62 }); })();
1015
1017
  //# sourceMappingURL=api-usage-panel.component.js.map