@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 +1 @@
1
- {"version":3,"file":"api-applications-panel.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-applications-panel.component.ts","../../src/APIKeys/api-applications-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, EventEmitter, Output, ChangeDetectorRef, HostListener } from '@angular/core';\nimport { Metadata } from '@memberjunction/core';\nimport { MJAPIApplicationEntity, MJAPIApplicationScopeEntity, MJAPIScopeEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nconst PANEL_WIDTH_SETTING_KEY = 'APIKeys.ApplicationsPanelWidth';\nconst DEFAULT_PANEL_WIDTH = 570;\nconst MIN_PANEL_WIDTH = 400;\nconst MAX_PANEL_WIDTH = 800;\n/** Application with scope count */\ninterface ApplicationWithScopes {\n application: MJAPIApplicationEntity;\n scopeCount: number;\n expanded: boolean;\n scopes: MJAPIApplicationScopeEntity[];\n}\n\n/** Scope with selection state for application assignment */\ninterface ScopeSelection {\n scope: MJAPIScopeEntity;\n selected: boolean;\n pattern: string;\n patternType: 'Include' | 'Exclude';\n isDeny: boolean;\n priority: number;\n displayName: string; // Computed display name\n}\n\n/** Scope category for grouping */\ninterface ScopeCategory {\n name: string;\n icon: string;\n color: string;\n scopes: ScopeSelection[];\n expanded: boolean;\n allSelected: boolean;\n}\n\n/**\n * API Applications Panel Component\n * Manages API Applications and their scope assignments\n */\n@Component({\n standalone: false,\n selector: 'mj-api-applications-panel',\n templateUrl: './api-applications-panel.component.html',\n styleUrls: ['./api-applications-panel.component.css']\n})\nexport class APIApplicationsPanelComponent implements OnInit, OnDestroy {\n @Output() ApplicationUpdated = 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 Applications: ApplicationWithScopes[] = [];\n public AllScopes: MJAPIScopeEntity[] = [];\n\n // Edit state\n public EditingApplication: MJAPIApplicationEntity | null = null;\n public EditName = '';\n public EditDescription = '';\n public EditIsActive = true;\n public ScopeSelections: ScopeSelection[] = [];\n\n // Panel states (slide-out panels)\n public ShowCreatePanel = false;\n public ShowEditPanel = false;\n public SelectedApplication: ApplicationWithScopes | null = null;\n public EditTab: 'details' | 'scopes' = 'details';\n\n // Panel width and resizing\n public PanelWidth = DEFAULT_PANEL_WIDTH;\n public IsResizing = false;\n private resizeStartX = 0;\n private resizeStartWidth = 0;\n private widthSaveTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Track dirty state for unified save\n private DetailsChanged = false;\n private ScopesChanged = false;\n\n // Scope categories for display\n public ScopeCategories: ScopeCategory[] = [];\n\n // Messages\n public SuccessMessage = '';\n public ErrorMessage = '';\n\n // Default UI config for categories without explicit configuration\n private readonly defaultUIConfig = {\n icon: 'fa-solid fa-ellipsis',\n color: 'var(--mj-text-muted)'\n };\n\n constructor(cdr: ChangeDetectorRef) {\n this.cdr = cdr;\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadPanelWidth();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n if (this.widthSaveTimeout) {\n clearTimeout(this.widthSaveTimeout);\n }\n }\n\n /**\n * Handle mouse move during resize\n */\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.IsResizing) return;\n\n event.preventDefault();\n const deltaX = this.resizeStartX - event.clientX;\n const newWidth = Math.min(MAX_PANEL_WIDTH, Math.max(MIN_PANEL_WIDTH, this.resizeStartWidth + deltaX));\n this.PanelWidth = newWidth;\n this.cdr.markForCheck();\n }\n\n /**\n * Handle mouse up to stop resize\n */\n @HostListener('document:mouseup')\n onMouseUp(): void {\n if (this.IsResizing) {\n this.IsResizing = false;\n this.debouncedSavePanelWidth();\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Start resizing the panel\n */\n public startResize(event: MouseEvent): void {\n event.preventDefault();\n this.IsResizing = true;\n this.resizeStartX = event.clientX;\n this.resizeStartWidth = this.PanelWidth;\n }\n\n /**\n * Load saved panel width from user settings\n */\n private async loadPanelWidth(): Promise<void> {\n try {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === PANEL_WIDTH_SETTING_KEY);\n if (setting?.Value) {\n const width = parseInt(setting.Value, 10);\n if (!isNaN(width) && width >= MIN_PANEL_WIDTH && width <= MAX_PANEL_WIDTH) {\n this.PanelWidth = width;\n }\n }\n } catch (error) {\n console.warn('Failed to load panel width setting:', error);\n }\n }\n\n /**\n * Debounced save of panel width\n */\n private debouncedSavePanelWidth(): void {\n if (this.widthSaveTimeout) {\n clearTimeout(this.widthSaveTimeout);\n }\n this.widthSaveTimeout = setTimeout(() => {\n this.savePanelWidth();\n }, 500);\n }\n\n /**\n * Save panel width to user settings\n */\n private async savePanelWidth(): Promise<void> {\n try {\n const userId = this.md.CurrentUser?.ID;\n if (!userId) return;\n\n const engine = UserInfoEngine.Instance;\n let setting = engine.UserSettings.find(s => s.Setting === PANEL_WIDTH_SETTING_KEY);\n\n if (!setting) {\n setting = await this.md.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n setting.UserID = userId;\n setting.Setting = PANEL_WIDTH_SETTING_KEY;\n }\n\n setting.Value = this.PanelWidth.toString();\n await setting.Save();\n } catch (error) {\n console.warn('Failed to save panel width setting:', error);\n }\n }\n\n /**\n * Load all applications and scopes\n * Uses cached data from APIKeysEngineBase for better performance\n */\n public loadData(): void {\n this.IsLoading = true;\n try {\n const base = APIKeysEngineBase.Instance;\n\n // Get cached applications and scopes\n const apps = base.Applications;\n this.AllScopes = base.Scopes;\n\n // Build application list with scope assignments from cache\n this.Applications = apps\n .sort((a, b) => a.Name.localeCompare(b.Name))\n .map(app => {\n const scopes = base.GetApplicationScopesByApplicationId(app.ID);\n return {\n application: app,\n scopeCount: scopes.length,\n expanded: false,\n scopes\n };\n });\n } catch (error) {\n console.error('Error loading applications:', error);\n this.ErrorMessage = 'Failed to load applications';\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Open create panel (slide-out)\n */\n public openCreatePanel(): void {\n this.EditName = '';\n this.EditDescription = '';\n this.EditIsActive = true;\n this.EditingApplication = null;\n this.DetailsChanged = false;\n this.ScopesChanged = false;\n this.ShowCreatePanel = true;\n }\n\n /**\n * Save application (create only - for create panel)\n */\n public async saveApplication(): Promise<void> {\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n const app = await this.md.GetEntityObject<MJAPIApplicationEntity>('MJ: API Applications');\n app.NewRecord();\n\n app.Name = this.EditName.trim();\n app.Description = this.EditDescription.trim() || null;\n app.IsActive = this.EditIsActive;\n\n const result = await app.Save();\n if (result) {\n this.SuccessMessage = 'Application created successfully';\n this.closePanel();\n // Refresh the cache before reloading display\n await APIKeysEngineBase.Instance.Config(true);\n this.loadData();\n this.ApplicationUpdated.emit();\n setTimeout(() => this.SuccessMessage = '', 3000);\n } else {\n this.ErrorMessage = 'Failed to create application';\n }\n } catch (error) {\n console.error('Error creating application:', error);\n this.ErrorMessage = 'An error occurred while creating';\n } finally {\n this.IsSaving = false;\n }\n }\n\n /**\n * Open edit panel (slide-out) with optional direct-to-scopes tab\n */\n public openEditPanel(appItem: ApplicationWithScopes, goToScopes = false): void {\n this.EditingApplication = appItem.application;\n this.SelectedApplication = appItem;\n this.EditName = appItem.application.Name;\n this.EditDescription = appItem.application.Description || '';\n this.EditIsActive = appItem.application.IsActive;\n this.EditTab = goToScopes ? 'scopes' : 'details';\n this.DetailsChanged = false;\n this.ScopesChanged = false;\n this.buildScopeCategories(appItem);\n this.ShowEditPanel = true;\n }\n\n /**\n * Build scope categories with proper display names.\n * Uses UIConfig from root scopes for category icons/colors.\n */\n private buildScopeCategories(appItem: ApplicationWithScopes): void {\n const assignedScopeIds = new Map(\n appItem.scopes.map(s => [s.ScopeID, s])\n );\n\n // Build a map for computing full paths\n const scopeMap = new Map<string, MJAPIScopeEntity>();\n for (const scope of this.AllScopes) {\n scopeMap.set(scope.ID, scope);\n }\n\n // Build a map of category -> root scope UIConfig\n // Root scopes (ParentID is null) define the UI appearance for their category\n const categoryUIConfigs = new Map<string, { icon: string; color: string }>();\n for (const scope of this.AllScopes) {\n if (!scope.ParentID) {\n const uiConfig = parseAPIScopeUIConfig(scope);\n categoryUIConfigs.set(scope.Category, {\n icon: uiConfig.icon || this.defaultUIConfig.icon,\n color: uiConfig.color || this.defaultUIConfig.color\n });\n }\n }\n\n // Compute display name for each scope\n const computeDisplayName = (scope: MJAPIScopeEntity): string => {\n // If FullPath is set and not empty, use it\n if (scope.FullPath && scope.FullPath.trim()) {\n return scope.FullPath;\n }\n // If Name is set, build the path by traversing parents\n if (scope.Name && scope.Name.trim()) {\n const parts: string[] = [scope.Name];\n let currentScope = scope;\n while (currentScope.ParentID) {\n const parent = scopeMap.get(currentScope.ParentID);\n if (parent && parent.Name) {\n parts.unshift(parent.Name);\n currentScope = parent;\n } else {\n break;\n }\n }\n return parts.join(':');\n }\n return `Scope-${scope.ID.slice(0, 8)}`;\n };\n\n // Create scope selections with computed display names\n this.ScopeSelections = this.AllScopes\n .filter(scope => {\n // Filter out scopes with no name/path (shouldn't happen but be safe)\n const displayName = computeDisplayName(scope);\n return displayName && displayName.length > 0;\n })\n .map(scope => {\n const assigned = assignedScopeIds.get(scope.ID);\n return {\n scope,\n selected: !!assigned,\n pattern: assigned?.ResourcePattern || '*',\n patternType: (assigned?.PatternType || 'Include') as 'Include' | 'Exclude',\n isDeny: assigned?.IsDeny || false,\n priority: assigned?.Priority || 0,\n displayName: computeDisplayName(scope)\n };\n });\n\n // Group by category\n const categoryMap = new Map<string, ScopeSelection[]>();\n for (const selection of this.ScopeSelections) {\n const category = selection.scope.Category || 'Other';\n if (!categoryMap.has(category)) {\n categoryMap.set(category, []);\n }\n categoryMap.get(category)!.push(selection);\n }\n\n // Build category objects - all collapsed by default\n this.ScopeCategories = Array.from(categoryMap.entries()).map(([name, scopes]) => {\n const config = categoryUIConfigs.get(name) || this.defaultUIConfig;\n const selectedCount = scopes.filter(s => s.selected).length;\n return {\n name,\n icon: config.icon,\n color: config.color,\n scopes: scopes.sort((a, b) => a.displayName.localeCompare(b.displayName)),\n expanded: false, // Always start collapsed - user can expand as needed\n allSelected: selectedCount === scopes.length && scopes.length > 0\n };\n }).sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Toggle category expansion\n */\n public toggleScopeCategory(category: ScopeCategory): void {\n category.expanded = !category.expanded;\n }\n\n /**\n * Toggle all scopes in a category\n */\n public toggleCategoryAll(category: ScopeCategory): void {\n const newState = !category.allSelected;\n for (const scope of category.scopes) {\n scope.selected = newState;\n }\n category.allSelected = newState;\n }\n\n /**\n * Update category state when individual scope changes\n */\n public updateCategoryState(category: ScopeCategory): void {\n const selectedCount = category.scopes.filter(s => s.selected).length;\n category.allSelected = selectedCount === category.scopes.length && category.scopes.length > 0;\n }\n\n /**\n * Get total selected scope count\n */\n public getSelectedScopeCount(): number {\n return this.ScopeSelections.filter(s => s.selected).length;\n }\n\n /**\n * Get selected scope count for a category\n */\n public getCategorySelectedCount(category: ScopeCategory): number {\n return category.scopes.filter(s => s.selected).length;\n }\n\n /**\n * Save scope assignments (legacy - now handled by saveAll)\n */\n public async saveScopeAssignments(): Promise<void> {\n if (!this.SelectedApplication) return;\n\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n await this.saveScopeAssignmentsInternal();\n\n this.SuccessMessage = 'Scope assignments saved successfully';\n this.closePanel();\n // Refresh the cache before reloading display\n await APIKeysEngineBase.Instance.Config(true);\n this.loadData();\n this.ApplicationUpdated.emit();\n setTimeout(() => this.SuccessMessage = '', 3000);\n } catch (error) {\n console.error('Error saving scope assignments:', error);\n this.ErrorMessage = 'Failed to save scope assignments';\n } finally {\n this.IsSaving = false;\n }\n }\n\n /**\n * Toggle application expansion\n */\n public toggleExpanded(appItem: ApplicationWithScopes): void {\n appItem.expanded = !appItem.expanded;\n }\n\n /**\n * Close all panels\n */\n public closePanel(): void {\n this.ShowCreatePanel = false;\n this.ShowEditPanel = false;\n this.EditingApplication = null;\n this.SelectedApplication = null;\n this.ScopeSelections = [];\n this.ScopeCategories = [];\n this.EditTab = 'details';\n this.DetailsChanged = false;\n this.ScopesChanged = false;\n }\n\n /**\n * Save all changes (both details and scopes)\n */\n public async saveAll(): Promise<void> {\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n // Save application details\n if (this.EditingApplication) {\n this.EditingApplication.Name = this.EditName.trim();\n this.EditingApplication.Description = this.EditDescription.trim() || null;\n this.EditingApplication.IsActive = this.EditIsActive;\n\n const result = await this.EditingApplication.Save();\n if (!result) {\n this.ErrorMessage = 'Failed to save application details';\n return;\n }\n }\n\n // Save scope assignments\n if (this.SelectedApplication) {\n await this.saveScopeAssignmentsInternal();\n }\n\n this.SuccessMessage = 'Application saved successfully';\n this.closePanel();\n // Refresh the cache before reloading display\n await APIKeysEngineBase.Instance.Config(true);\n this.loadData();\n this.ApplicationUpdated.emit();\n setTimeout(() => this.SuccessMessage = '', 3000);\n } catch (error) {\n console.error('Error saving application:', error);\n this.ErrorMessage = 'An error occurred while saving';\n } finally {\n this.IsSaving = false;\n }\n }\n\n /**\n * Internal method to save scope assignments atomically — any failure rolls back every change\n */\n private async saveScopeAssignmentsInternal(): Promise<void> {\n if (!this.SelectedApplication) return;\n\n const appId = this.SelectedApplication.application.ID;\n const existingScopes = new Map(\n this.SelectedApplication.scopes.map(s => [s.ScopeID, s])\n );\n\n const tg = await this.md.CreateTransactionGroup();\n let pendingOps = 0;\n\n for (const selection of this.ScopeSelections) {\n const existing = existingScopes.get(selection.scope.ID);\n\n if (selection.selected && !existing) {\n // Create new assignment\n const appScope = await this.md.GetEntityObject<MJAPIApplicationScopeEntity>('MJ: API Application Scopes');\n appScope.NewRecord();\n appScope.ApplicationID = appId;\n appScope.ScopeID = selection.scope.ID;\n appScope.ResourcePattern = selection.pattern;\n appScope.PatternType = selection.patternType;\n appScope.IsDeny = selection.isDeny;\n appScope.Priority = selection.priority;\n appScope.TransactionGroup = tg;\n await appScope.Save();\n pendingOps++;\n } else if (selection.selected && existing) {\n // Update existing (only if something actually changed)\n if (existing.ResourcePattern !== selection.pattern ||\n existing.PatternType !== selection.patternType ||\n existing.IsDeny !== selection.isDeny ||\n existing.Priority !== selection.priority) {\n existing.ResourcePattern = selection.pattern;\n existing.PatternType = selection.patternType;\n existing.IsDeny = selection.isDeny;\n existing.Priority = selection.priority;\n existing.TransactionGroup = tg;\n await existing.Save();\n pendingOps++;\n }\n } else if (!selection.selected && existing) {\n // Delete assignment\n existing.TransactionGroup = tg;\n await existing.Delete();\n pendingOps++;\n }\n }\n\n if (pendingOps === 0) return;\n\n if (!await tg.Submit()) {\n throw new Error('Failed to save scope assignments — all changes have been rolled back');\n }\n }\n\n /**\n * Get icon for pattern type\n */\n public getPatternIcon(patternType: string, isDeny: boolean): string {\n if (isDeny) return 'fa-solid fa-ban';\n return patternType === 'Include' ? 'fa-solid fa-check' : 'fa-solid fa-minus';\n }\n\n /**\n * Get class for pattern type\n */\n public getPatternClass(patternType: string, isDeny: boolean): string {\n if (isDeny) return 'pattern-deny';\n return patternType === 'Include' ? 'pattern-include' : 'pattern-exclude';\n }\n\n /**\n * Get scope name by ID\n */\n public getScopeName(scopeId: string): string {\n const scope = this.AllScopes.find(s => UUIDsEqual(s.ID, scopeId));\n return scope?.FullPath || scope?.Name || 'Unknown';\n }\n}\n","<div class=\"applications-panel\" [class.panel-open]=\"ShowEditPanel || ShowCreatePanel\">\n @if (IsLoading) {\n <mj-loading text=\"Loading applications...\"></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-cube\"></i>\n API Applications\n </h3>\n <p class=\"panel-subtitle\">Manage applications and their default scope permissions</p>\n </div>\n <button class=\"btn-create\" (click)=\"openCreatePanel()\">\n <i class=\"fa-solid fa-plus\"></i>\n New Application\n </button>\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 <!-- Applications Grid -->\n <div class=\"applications-grid\">\n @for (appItem of Applications; track appItem) {\n <div class=\"app-card\"\n [class.inactive]=\"!appItem.application.IsActive\"\n [class.expanded]=\"appItem.expanded\">\n <div class=\"app-header\">\n <div class=\"app-header-main\" (click)=\"toggleExpanded(appItem)\">\n <div class=\"app-icon\">\n <i class=\"fa-solid fa-cube\"></i>\n </div>\n <div class=\"app-info\">\n <div class=\"app-name\">\n {{appItem.application.Name}}\n <span class=\"status-badge\" [class.active]=\"appItem.application.IsActive\"\n [class.inactive]=\"!appItem.application.IsActive\">\n {{appItem.application.IsActive ? 'Active' : 'Inactive'}}\n </span>\n </div>\n @if (appItem.application.Description) {\n <div class=\"app-description\">\n {{appItem.application.Description}}\n </div>\n }\n </div>\n <div class=\"app-stats\">\n <div class=\"scope-count\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n {{appItem.scopeCount}} scopes\n </div>\n <i class=\"fa-solid expand-icon\"\n [class.fa-chevron-down]=\"!appItem.expanded\"\n [class.fa-chevron-up]=\"appItem.expanded\"></i>\n </div>\n </div>\n <button class=\"app-edit-btn\" (click)=\"openEditPanel(appItem); $event.stopPropagation()\" title=\"Edit Application\">\n <i class=\"fa-solid fa-pencil\"></i>\n </button>\n </div>\n <!-- Expanded Content -->\n @if (appItem.expanded) {\n <div class=\"app-details\">\n <div class=\"details-section\">\n <h4>Scope Ceiling Rules</h4>\n @if (appItem.scopes.length > 0) {\n <div class=\"scope-rules\">\n @for (scope of appItem.scopes; track scope) {\n <div class=\"scope-rule\">\n <div class=\"rule-icon\" [ngClass]=\"getPatternClass(scope.PatternType, scope.IsDeny)\">\n <i [class]=\"getPatternIcon(scope.PatternType, scope.IsDeny)\"></i>\n </div>\n <div class=\"rule-info\">\n <div class=\"rule-scope\">{{getScopeName(scope.ScopeID)}}</div>\n <div class=\"rule-pattern\">\n <code>{{scope.ResourcePattern}}</code>\n <span class=\"pattern-type\">{{scope.PatternType}}</span>\n @if (scope.Priority > 0) {\n <span class=\"priority\">\n Priority: {{scope.Priority}}\n </span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n @if (appItem.scopes.length === 0) {\n <div class=\"empty-scopes\">\n <i class=\"fa-solid fa-shield-xmark\"></i>\n <span>No scope rules defined - all access denied by default</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (Applications.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-cube\"></i>\n <span>No applications configured</span>\n <p>Create an application to define scope ceilings for API key access</p>\n </div>\n }\n </div>\n }\n\n <!-- Slide-out Backdrop -->\n @if (ShowEditPanel || ShowCreatePanel) {\n <div class=\"slideout-backdrop\" (click)=\"closePanel()\"></div>\n }\n\n <!-- Create Panel (Slide-out) -->\n <div class=\"slideout-panel\" [class.open]=\"ShowCreatePanel\">\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n <span>New Application</span>\n </div>\n <button class=\"slideout-close\" (click)=\"closePanel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <div class=\"slideout-content\">\n <div class=\"form-section\">\n <div class=\"form-field\">\n <label>Application Name *</label>\n <input class=\"mj-input\" [(ngModel)]=\"EditName\"\n placeholder=\"e.g., MJAPI, MCP Server, Portal\"\n class=\"form-input\" />\n </div>\n\n <div class=\"form-field\">\n <label>Description</label>\n <textarea class=\"mj-textarea\" [(ngModel)]=\"EditDescription\"\n placeholder=\"Describe the application's purpose...\"\n [rows]=\"3\"\n class=\"form-textarea\"></textarea>\n </div>\n\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 applications cannot be used with API keys</span>\n </div>\n </label>\n </div>\n </div>\n </div>\n\n <div class=\"slideout-footer\">\n <button mjButton variant=\"primary\"\n [disabled]=\"!EditName.trim() || IsSaving\"\n (click)=\"saveApplication()\">\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 Create Application\n </span>\n }\n </button>\n <button mjButton (click)=\"closePanel()\">Cancel</button>\n </div>\n </div>\n\n <!-- Edit Panel (Slide-out) -->\n <div class=\"slideout-panel\" [class.open]=\"ShowEditPanel\" [style.width.px]=\"PanelWidth\">\n <!-- Resize Handle -->\n <div class=\"slideout-resize-handle\"\n [class.resizing]=\"IsResizing\"\n (mousedown)=\"startResize($event)\"></div>\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i class=\"fa-solid fa-cube\"></i>\n <span>{{EditingApplication?.Name}}</span>\n <span class=\"status-pill\" [class.active]=\"EditIsActive\">\n {{EditIsActive ? 'Active' : 'Inactive'}}\n </span>\n </div>\n <button class=\"slideout-close\" (click)=\"closePanel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Tab Bar -->\n <div class=\"slideout-tabs\">\n <button class=\"slideout-tab\" [class.active]=\"EditTab === 'details'\"\n (click)=\"EditTab = 'details'\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Details\n </button>\n <button class=\"slideout-tab\" [class.active]=\"EditTab === 'scopes'\"\n (click)=\"EditTab = 'scopes'\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n Scopes\n <span class=\"tab-badge\">{{getSelectedScopeCount()}}</span>\n </button>\n </div>\n\n <div class=\"slideout-content\">\n <!-- Details Tab -->\n @if (EditTab === 'details') {\n <div class=\"tab-panel\">\n <div class=\"form-section\">\n <div class=\"form-field\">\n <label>Application Name *</label>\n <input class=\"mj-input\" [(ngModel)]=\"EditName\"\n placeholder=\"e.g., MJAPI, MCP Server, Portal\"\n class=\"form-input\" />\n </div>\n <div class=\"form-field\">\n <label>Description</label>\n <textarea class=\"mj-textarea\" [(ngModel)]=\"EditDescription\"\n placeholder=\"Describe the application's purpose...\"\n [rows]=\"4\"\n class=\"form-textarea\"></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 applications cannot be used with API keys</span>\n </div>\n </label>\n </div>\n </div>\n </div>\n }\n\n <!-- Scopes Tab -->\n @if (EditTab === 'scopes') {\n <div class=\"tab-panel scopes-panel\">\n <div class=\"scopes-intro\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Define the maximum permissions this application can grant to API keys.</span>\n </div>\n <div class=\"scope-categories-list\">\n @for (category of ScopeCategories; track category) {\n <div class=\"scope-category-card\">\n <div class=\"category-header\" (click)=\"toggleScopeCategory(category)\">\n <div class=\"category-left\">\n <i [class]=\"category.icon\" [style.color]=\"category.color\"></i>\n <span class=\"category-name\">{{category.name}}</span>\n <span class=\"category-count-badge\">\n {{getCategorySelectedCount(category)}}/{{category.scopes.length}}\n </span>\n </div>\n <div class=\"category-right\">\n <label class=\"category-all-toggle\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [checked]=\"category.allSelected\"\n (change)=\"toggleCategoryAll(category)\" />\n <span>All</span>\n </label>\n <i class=\"fa-solid category-chevron\"\n [class.fa-chevron-down]=\"!category.expanded\"\n [class.fa-chevron-up]=\"category.expanded\"></i>\n </div>\n </div>\n @if (category.expanded) {\n <div class=\"category-scopes-list\">\n @for (selection of category.scopes; track selection) {\n <div class=\"scope-row\"\n [class.selected]=\"selection.selected\">\n <label class=\"scope-select\">\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [(ngModel)]=\"selection.selected\"\n (change)=\"updateCategoryState(category)\" />\n <div class=\"scope-label\">\n <span class=\"scope-path\">{{selection.displayName || '(unnamed scope)'}}</span>\n @if (selection.scope.Description) {\n <span class=\"scope-description\">\n {{selection.scope.Description}}\n </span>\n }\n </div>\n </label>\n <!-- Read-only pattern display -->\n @if (selection.selected) {\n <div class=\"scope-pattern-display\">\n <span class=\"pattern-tag\" [class.include]=\"selection.patternType === 'Include'\"\n [class.exclude]=\"selection.patternType === 'Exclude'\">\n <i class=\"fa-solid\" [class.fa-check]=\"selection.patternType === 'Include'\"\n [class.fa-minus]=\"selection.patternType === 'Exclude'\"></i>\n {{selection.pattern || '*'}}\n </span>\n </div>\n }\n <!-- Editable pattern config - shown on hover -->\n @if (selection.selected) {\n <div class=\"scope-pattern-config\">\n <input class=\"mj-input\" [(ngModel)]=\"selection.pattern\"\n placeholder=\"*\"\n class=\"pattern-field\"\n title=\"Resource Pattern\" />\n <mj-dropdown [(ngModel)]=\"selection.patternType\"\n [Data]=\"['Include', 'Exclude']\"\n [ValuePrimitive]=\"true\"\n class=\"type-field\"\n title=\"Pattern Type\">\n </mj-dropdown>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n @if (ScopeCategories.length === 0) {\n <div class=\"empty-scopes-message\">\n <i class=\"fa-solid fa-shield-xmark\"></i>\n <span>No scopes available</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <div class=\"slideout-footer\">\n <button mjButton variant=\"primary\"\n [disabled]=\"!EditName.trim() || IsSaving\"\n (click)=\"saveAll()\">\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 Save Changes\n </span>\n }\n </button>\n <button mjButton (click)=\"closePanel()\">Cancel</button>\n </div>\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"api-applications-panel.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-applications-panel.component.ts","../../src/APIKeys/api-applications-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, EventEmitter, Output, ChangeDetectorRef, HostListener } from '@angular/core';\nimport { MJAPIApplicationEntity, MJAPIApplicationScopeEntity, MJAPIScopeEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nconst PANEL_WIDTH_SETTING_KEY = 'APIKeys.ApplicationsPanelWidth';\nconst DEFAULT_PANEL_WIDTH = 570;\nconst MIN_PANEL_WIDTH = 400;\nconst MAX_PANEL_WIDTH = 800;\n/** Application with scope count */\ninterface ApplicationWithScopes {\n application: MJAPIApplicationEntity;\n scopeCount: number;\n expanded: boolean;\n scopes: MJAPIApplicationScopeEntity[];\n}\n\n/** Scope with selection state for application assignment */\ninterface ScopeSelection {\n scope: MJAPIScopeEntity;\n selected: boolean;\n pattern: string;\n patternType: 'Include' | 'Exclude';\n isDeny: boolean;\n priority: number;\n displayName: string; // Computed display name\n}\n\n/** Scope category for grouping */\ninterface ScopeCategory {\n name: string;\n icon: string;\n color: string;\n scopes: ScopeSelection[];\n expanded: boolean;\n allSelected: boolean;\n}\n\n/**\n * API Applications Panel Component\n * Manages API Applications and their scope assignments\n */\n@Component({\n standalone: false,\n selector: 'mj-api-applications-panel',\n templateUrl: './api-applications-panel.component.html',\n styleUrls: ['./api-applications-panel.component.css']\n})\nexport class APIApplicationsPanelComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Output() ApplicationUpdated = 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 Applications: ApplicationWithScopes[] = [];\n public AllScopes: MJAPIScopeEntity[] = [];\n\n // Edit state\n public EditingApplication: MJAPIApplicationEntity | null = null;\n public EditName = '';\n public EditDescription = '';\n public EditIsActive = true;\n public ScopeSelections: ScopeSelection[] = [];\n\n // Panel states (slide-out panels)\n public ShowCreatePanel = false;\n public ShowEditPanel = false;\n public SelectedApplication: ApplicationWithScopes | null = null;\n public EditTab: 'details' | 'scopes' = 'details';\n\n // Panel width and resizing\n public PanelWidth = DEFAULT_PANEL_WIDTH;\n public IsResizing = false;\n private resizeStartX = 0;\n private resizeStartWidth = 0;\n private widthSaveTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Track dirty state for unified save\n private DetailsChanged = false;\n private ScopesChanged = false;\n\n // Scope categories for display\n public ScopeCategories: ScopeCategory[] = [];\n\n // Messages\n public SuccessMessage = '';\n public ErrorMessage = '';\n\n // Default UI config for categories without explicit configuration\n private readonly defaultUIConfig = {\n icon: 'fa-solid fa-ellipsis',\n color: 'var(--mj-text-muted)'\n };\n\n constructor(cdr: ChangeDetectorRef) {\n super();\n this.cdr = cdr;\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadPanelWidth();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n if (this.widthSaveTimeout) {\n clearTimeout(this.widthSaveTimeout);\n }\n }\n\n /**\n * Handle mouse move during resize\n */\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.IsResizing) return;\n\n event.preventDefault();\n const deltaX = this.resizeStartX - event.clientX;\n const newWidth = Math.min(MAX_PANEL_WIDTH, Math.max(MIN_PANEL_WIDTH, this.resizeStartWidth + deltaX));\n this.PanelWidth = newWidth;\n this.cdr.markForCheck();\n }\n\n /**\n * Handle mouse up to stop resize\n */\n @HostListener('document:mouseup')\n onMouseUp(): void {\n if (this.IsResizing) {\n this.IsResizing = false;\n this.debouncedSavePanelWidth();\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Start resizing the panel\n */\n public startResize(event: MouseEvent): void {\n event.preventDefault();\n this.IsResizing = true;\n this.resizeStartX = event.clientX;\n this.resizeStartWidth = this.PanelWidth;\n }\n\n /**\n * Load saved panel width from user settings\n */\n private async loadPanelWidth(): Promise<void> {\n try {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === PANEL_WIDTH_SETTING_KEY);\n if (setting?.Value) {\n const width = parseInt(setting.Value, 10);\n if (!isNaN(width) && width >= MIN_PANEL_WIDTH && width <= MAX_PANEL_WIDTH) {\n this.PanelWidth = width;\n }\n }\n } catch (error) {\n console.warn('Failed to load panel width setting:', error);\n }\n }\n\n /**\n * Debounced save of panel width\n */\n private debouncedSavePanelWidth(): void {\n if (this.widthSaveTimeout) {\n clearTimeout(this.widthSaveTimeout);\n }\n this.widthSaveTimeout = setTimeout(() => {\n this.savePanelWidth();\n }, 500);\n }\n\n /**\n * Save panel width to user settings\n */\n private async savePanelWidth(): Promise<void> {\n try {\n const userId = this.md.CurrentUser?.ID;\n if (!userId) return;\n\n const engine = UserInfoEngine.Instance;\n let setting = engine.UserSettings.find(s => s.Setting === PANEL_WIDTH_SETTING_KEY);\n\n if (!setting) {\n setting = await this.md.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n setting.UserID = userId;\n setting.Setting = PANEL_WIDTH_SETTING_KEY;\n }\n\n setting.Value = this.PanelWidth.toString();\n await setting.Save();\n } catch (error) {\n console.warn('Failed to save panel width setting:', error);\n }\n }\n\n /**\n * Load all applications and scopes\n * Uses cached data from APIKeysEngineBase for better performance\n */\n public loadData(): void {\n this.IsLoading = true;\n try {\n const base = APIKeysEngineBase.Instance;\n\n // Get cached applications and scopes\n const apps = base.Applications;\n this.AllScopes = base.Scopes;\n\n // Build application list with scope assignments from cache\n this.Applications = apps\n .sort((a, b) => a.Name.localeCompare(b.Name))\n .map(app => {\n const scopes = base.GetApplicationScopesByApplicationId(app.ID);\n return {\n application: app,\n scopeCount: scopes.length,\n expanded: false,\n scopes\n };\n });\n } catch (error) {\n console.error('Error loading applications:', error);\n this.ErrorMessage = 'Failed to load applications';\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Open create panel (slide-out)\n */\n public openCreatePanel(): void {\n this.EditName = '';\n this.EditDescription = '';\n this.EditIsActive = true;\n this.EditingApplication = null;\n this.DetailsChanged = false;\n this.ScopesChanged = false;\n this.ShowCreatePanel = true;\n }\n\n /**\n * Save application (create only - for create panel)\n */\n public async saveApplication(): Promise<void> {\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n const app = await this.md.GetEntityObject<MJAPIApplicationEntity>('MJ: API Applications');\n app.NewRecord();\n\n app.Name = this.EditName.trim();\n app.Description = this.EditDescription.trim() || null;\n app.IsActive = this.EditIsActive;\n\n const result = await app.Save();\n if (result) {\n this.SuccessMessage = 'Application created successfully';\n this.closePanel();\n // Refresh the cache before reloading display\n await APIKeysEngineBase.Instance.Config(true);\n this.loadData();\n this.ApplicationUpdated.emit();\n setTimeout(() => this.SuccessMessage = '', 3000);\n } else {\n this.ErrorMessage = 'Failed to create application';\n }\n } catch (error) {\n console.error('Error creating application:', error);\n this.ErrorMessage = 'An error occurred while creating';\n } finally {\n this.IsSaving = false;\n }\n }\n\n /**\n * Open edit panel (slide-out) with optional direct-to-scopes tab\n */\n public openEditPanel(appItem: ApplicationWithScopes, goToScopes = false): void {\n this.EditingApplication = appItem.application;\n this.SelectedApplication = appItem;\n this.EditName = appItem.application.Name;\n this.EditDescription = appItem.application.Description || '';\n this.EditIsActive = appItem.application.IsActive;\n this.EditTab = goToScopes ? 'scopes' : 'details';\n this.DetailsChanged = false;\n this.ScopesChanged = false;\n this.buildScopeCategories(appItem);\n this.ShowEditPanel = true;\n }\n\n /**\n * Build scope categories with proper display names.\n * Uses UIConfig from root scopes for category icons/colors.\n */\n private buildScopeCategories(appItem: ApplicationWithScopes): void {\n const assignedScopeIds = new Map(\n appItem.scopes.map(s => [s.ScopeID, s])\n );\n\n // Build a map for computing full paths\n const scopeMap = new Map<string, MJAPIScopeEntity>();\n for (const scope of this.AllScopes) {\n scopeMap.set(scope.ID, scope);\n }\n\n // Build a map of category -> root scope UIConfig\n // Root scopes (ParentID is null) define the UI appearance for their category\n const categoryUIConfigs = new Map<string, { icon: string; color: string }>();\n for (const scope of this.AllScopes) {\n if (!scope.ParentID) {\n const uiConfig = parseAPIScopeUIConfig(scope);\n categoryUIConfigs.set(scope.Category, {\n icon: uiConfig.icon || this.defaultUIConfig.icon,\n color: uiConfig.color || this.defaultUIConfig.color\n });\n }\n }\n\n // Compute display name for each scope\n const computeDisplayName = (scope: MJAPIScopeEntity): string => {\n // If FullPath is set and not empty, use it\n if (scope.FullPath && scope.FullPath.trim()) {\n return scope.FullPath;\n }\n // If Name is set, build the path by traversing parents\n if (scope.Name && scope.Name.trim()) {\n const parts: string[] = [scope.Name];\n let currentScope = scope;\n while (currentScope.ParentID) {\n const parent = scopeMap.get(currentScope.ParentID);\n if (parent && parent.Name) {\n parts.unshift(parent.Name);\n currentScope = parent;\n } else {\n break;\n }\n }\n return parts.join(':');\n }\n return `Scope-${scope.ID.slice(0, 8)}`;\n };\n\n // Create scope selections with computed display names\n this.ScopeSelections = this.AllScopes\n .filter(scope => {\n // Filter out scopes with no name/path (shouldn't happen but be safe)\n const displayName = computeDisplayName(scope);\n return displayName && displayName.length > 0;\n })\n .map(scope => {\n const assigned = assignedScopeIds.get(scope.ID);\n return {\n scope,\n selected: !!assigned,\n pattern: assigned?.ResourcePattern || '*',\n patternType: (assigned?.PatternType || 'Include') as 'Include' | 'Exclude',\n isDeny: assigned?.IsDeny || false,\n priority: assigned?.Priority || 0,\n displayName: computeDisplayName(scope)\n };\n });\n\n // Group by category\n const categoryMap = new Map<string, ScopeSelection[]>();\n for (const selection of this.ScopeSelections) {\n const category = selection.scope.Category || 'Other';\n if (!categoryMap.has(category)) {\n categoryMap.set(category, []);\n }\n categoryMap.get(category)!.push(selection);\n }\n\n // Build category objects - all collapsed by default\n this.ScopeCategories = Array.from(categoryMap.entries()).map(([name, scopes]) => {\n const config = categoryUIConfigs.get(name) || this.defaultUIConfig;\n const selectedCount = scopes.filter(s => s.selected).length;\n return {\n name,\n icon: config.icon,\n color: config.color,\n scopes: scopes.sort((a, b) => a.displayName.localeCompare(b.displayName)),\n expanded: false, // Always start collapsed - user can expand as needed\n allSelected: selectedCount === scopes.length && scopes.length > 0\n };\n }).sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Toggle category expansion\n */\n public toggleScopeCategory(category: ScopeCategory): void {\n category.expanded = !category.expanded;\n }\n\n /**\n * Toggle all scopes in a category\n */\n public toggleCategoryAll(category: ScopeCategory): void {\n const newState = !category.allSelected;\n for (const scope of category.scopes) {\n scope.selected = newState;\n }\n category.allSelected = newState;\n }\n\n /**\n * Update category state when individual scope changes\n */\n public updateCategoryState(category: ScopeCategory): void {\n const selectedCount = category.scopes.filter(s => s.selected).length;\n category.allSelected = selectedCount === category.scopes.length && category.scopes.length > 0;\n }\n\n /**\n * Get total selected scope count\n */\n public getSelectedScopeCount(): number {\n return this.ScopeSelections.filter(s => s.selected).length;\n }\n\n /**\n * Get selected scope count for a category\n */\n public getCategorySelectedCount(category: ScopeCategory): number {\n return category.scopes.filter(s => s.selected).length;\n }\n\n /**\n * Save scope assignments (legacy - now handled by saveAll)\n */\n public async saveScopeAssignments(): Promise<void> {\n if (!this.SelectedApplication) return;\n\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n await this.saveScopeAssignmentsInternal();\n\n this.SuccessMessage = 'Scope assignments saved successfully';\n this.closePanel();\n // Refresh the cache before reloading display\n await APIKeysEngineBase.Instance.Config(true);\n this.loadData();\n this.ApplicationUpdated.emit();\n setTimeout(() => this.SuccessMessage = '', 3000);\n } catch (error) {\n console.error('Error saving scope assignments:', error);\n this.ErrorMessage = 'Failed to save scope assignments';\n } finally {\n this.IsSaving = false;\n }\n }\n\n /**\n * Toggle application expansion\n */\n public toggleExpanded(appItem: ApplicationWithScopes): void {\n appItem.expanded = !appItem.expanded;\n }\n\n /**\n * Close all panels\n */\n public closePanel(): void {\n this.ShowCreatePanel = false;\n this.ShowEditPanel = false;\n this.EditingApplication = null;\n this.SelectedApplication = null;\n this.ScopeSelections = [];\n this.ScopeCategories = [];\n this.EditTab = 'details';\n this.DetailsChanged = false;\n this.ScopesChanged = false;\n }\n\n /**\n * Save all changes (both details and scopes)\n */\n public async saveAll(): Promise<void> {\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n // Save application details\n if (this.EditingApplication) {\n this.EditingApplication.Name = this.EditName.trim();\n this.EditingApplication.Description = this.EditDescription.trim() || null;\n this.EditingApplication.IsActive = this.EditIsActive;\n\n const result = await this.EditingApplication.Save();\n if (!result) {\n this.ErrorMessage = 'Failed to save application details';\n return;\n }\n }\n\n // Save scope assignments\n if (this.SelectedApplication) {\n await this.saveScopeAssignmentsInternal();\n }\n\n this.SuccessMessage = 'Application saved successfully';\n this.closePanel();\n // Refresh the cache before reloading display\n await APIKeysEngineBase.Instance.Config(true);\n this.loadData();\n this.ApplicationUpdated.emit();\n setTimeout(() => this.SuccessMessage = '', 3000);\n } catch (error) {\n console.error('Error saving application:', error);\n this.ErrorMessage = 'An error occurred while saving';\n } finally {\n this.IsSaving = false;\n }\n }\n\n /**\n * Internal method to save scope assignments atomically — any failure rolls back every change\n */\n private async saveScopeAssignmentsInternal(): Promise<void> {\n if (!this.SelectedApplication) return;\n\n const appId = this.SelectedApplication.application.ID;\n const existingScopes = new Map(\n this.SelectedApplication.scopes.map(s => [s.ScopeID, s])\n );\n\n const tg = await this.md.CreateTransactionGroup();\n let pendingOps = 0;\n\n for (const selection of this.ScopeSelections) {\n const existing = existingScopes.get(selection.scope.ID);\n\n if (selection.selected && !existing) {\n // Create new assignment\n const appScope = await this.md.GetEntityObject<MJAPIApplicationScopeEntity>('MJ: API Application Scopes');\n appScope.NewRecord();\n appScope.ApplicationID = appId;\n appScope.ScopeID = selection.scope.ID;\n appScope.ResourcePattern = selection.pattern;\n appScope.PatternType = selection.patternType;\n appScope.IsDeny = selection.isDeny;\n appScope.Priority = selection.priority;\n appScope.TransactionGroup = tg;\n await appScope.Save();\n pendingOps++;\n } else if (selection.selected && existing) {\n // Update existing (only if something actually changed)\n if (existing.ResourcePattern !== selection.pattern ||\n existing.PatternType !== selection.patternType ||\n existing.IsDeny !== selection.isDeny ||\n existing.Priority !== selection.priority) {\n existing.ResourcePattern = selection.pattern;\n existing.PatternType = selection.patternType;\n existing.IsDeny = selection.isDeny;\n existing.Priority = selection.priority;\n existing.TransactionGroup = tg;\n await existing.Save();\n pendingOps++;\n }\n } else if (!selection.selected && existing) {\n // Delete assignment\n existing.TransactionGroup = tg;\n await existing.Delete();\n pendingOps++;\n }\n }\n\n if (pendingOps === 0) return;\n\n if (!await tg.Submit()) {\n throw new Error('Failed to save scope assignments — all changes have been rolled back');\n }\n }\n\n /**\n * Get icon for pattern type\n */\n public getPatternIcon(patternType: string, isDeny: boolean): string {\n if (isDeny) return 'fa-solid fa-ban';\n return patternType === 'Include' ? 'fa-solid fa-check' : 'fa-solid fa-minus';\n }\n\n /**\n * Get class for pattern type\n */\n public getPatternClass(patternType: string, isDeny: boolean): string {\n if (isDeny) return 'pattern-deny';\n return patternType === 'Include' ? 'pattern-include' : 'pattern-exclude';\n }\n\n /**\n * Get scope name by ID\n */\n public getScopeName(scopeId: string): string {\n const scope = this.AllScopes.find(s => UUIDsEqual(s.ID, scopeId));\n return scope?.FullPath || scope?.Name || 'Unknown';\n }\n}\n","<div class=\"applications-panel\" [class.panel-open]=\"ShowEditPanel || ShowCreatePanel\">\n @if (IsLoading) {\n <mj-loading text=\"Loading applications...\"></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-cube\"></i>\n API Applications\n </h3>\n <p class=\"panel-subtitle\">Manage applications and their default scope permissions</p>\n </div>\n <button class=\"btn-create\" (click)=\"openCreatePanel()\">\n <i class=\"fa-solid fa-plus\"></i>\n New Application\n </button>\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 <!-- Applications Grid -->\n <div class=\"applications-grid\">\n @for (appItem of Applications; track appItem) {\n <div class=\"app-card\"\n [class.inactive]=\"!appItem.application.IsActive\"\n [class.expanded]=\"appItem.expanded\">\n <div class=\"app-header\">\n <div class=\"app-header-main\" (click)=\"toggleExpanded(appItem)\">\n <div class=\"app-icon\">\n <i class=\"fa-solid fa-cube\"></i>\n </div>\n <div class=\"app-info\">\n <div class=\"app-name\">\n {{appItem.application.Name}}\n <span class=\"status-badge\" [class.active]=\"appItem.application.IsActive\"\n [class.inactive]=\"!appItem.application.IsActive\">\n {{appItem.application.IsActive ? 'Active' : 'Inactive'}}\n </span>\n </div>\n @if (appItem.application.Description) {\n <div class=\"app-description\">\n {{appItem.application.Description}}\n </div>\n }\n </div>\n <div class=\"app-stats\">\n <div class=\"scope-count\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n {{appItem.scopeCount}} scopes\n </div>\n <i class=\"fa-solid expand-icon\"\n [class.fa-chevron-down]=\"!appItem.expanded\"\n [class.fa-chevron-up]=\"appItem.expanded\"></i>\n </div>\n </div>\n <button class=\"app-edit-btn\" (click)=\"openEditPanel(appItem); $event.stopPropagation()\" title=\"Edit Application\">\n <i class=\"fa-solid fa-pencil\"></i>\n </button>\n </div>\n <!-- Expanded Content -->\n @if (appItem.expanded) {\n <div class=\"app-details\">\n <div class=\"details-section\">\n <h4>Scope Ceiling Rules</h4>\n @if (appItem.scopes.length > 0) {\n <div class=\"scope-rules\">\n @for (scope of appItem.scopes; track scope) {\n <div class=\"scope-rule\">\n <div class=\"rule-icon\" [ngClass]=\"getPatternClass(scope.PatternType, scope.IsDeny)\">\n <i [class]=\"getPatternIcon(scope.PatternType, scope.IsDeny)\"></i>\n </div>\n <div class=\"rule-info\">\n <div class=\"rule-scope\">{{getScopeName(scope.ScopeID)}}</div>\n <div class=\"rule-pattern\">\n <code>{{scope.ResourcePattern}}</code>\n <span class=\"pattern-type\">{{scope.PatternType}}</span>\n @if (scope.Priority > 0) {\n <span class=\"priority\">\n Priority: {{scope.Priority}}\n </span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n @if (appItem.scopes.length === 0) {\n <div class=\"empty-scopes\">\n <i class=\"fa-solid fa-shield-xmark\"></i>\n <span>No scope rules defined - all access denied by default</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (Applications.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-cube\"></i>\n <span>No applications configured</span>\n <p>Create an application to define scope ceilings for API key access</p>\n </div>\n }\n </div>\n }\n\n <!-- Slide-out Backdrop -->\n @if (ShowEditPanel || ShowCreatePanel) {\n <div class=\"slideout-backdrop\" (click)=\"closePanel()\"></div>\n }\n\n <!-- Create Panel (Slide-out) -->\n <div class=\"slideout-panel\" [class.open]=\"ShowCreatePanel\">\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n <span>New Application</span>\n </div>\n <button class=\"slideout-close\" (click)=\"closePanel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <div class=\"slideout-content\">\n <div class=\"form-section\">\n <div class=\"form-field\">\n <label>Application Name *</label>\n <input class=\"mj-input\" [(ngModel)]=\"EditName\"\n placeholder=\"e.g., MJAPI, MCP Server, Portal\"\n class=\"form-input\" />\n </div>\n\n <div class=\"form-field\">\n <label>Description</label>\n <textarea class=\"mj-textarea\" [(ngModel)]=\"EditDescription\"\n placeholder=\"Describe the application's purpose...\"\n [rows]=\"3\"\n class=\"form-textarea\"></textarea>\n </div>\n\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 applications cannot be used with API keys</span>\n </div>\n </label>\n </div>\n </div>\n </div>\n\n <div class=\"slideout-footer\">\n <button mjButton variant=\"primary\"\n [disabled]=\"!EditName.trim() || IsSaving\"\n (click)=\"saveApplication()\">\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 Create Application\n </span>\n }\n </button>\n <button mjButton (click)=\"closePanel()\">Cancel</button>\n </div>\n </div>\n\n <!-- Edit Panel (Slide-out) -->\n <div class=\"slideout-panel\" [class.open]=\"ShowEditPanel\" [style.width.px]=\"PanelWidth\">\n <!-- Resize Handle -->\n <div class=\"slideout-resize-handle\"\n [class.resizing]=\"IsResizing\"\n (mousedown)=\"startResize($event)\"></div>\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i class=\"fa-solid fa-cube\"></i>\n <span>{{EditingApplication?.Name}}</span>\n <span class=\"status-pill\" [class.active]=\"EditIsActive\">\n {{EditIsActive ? 'Active' : 'Inactive'}}\n </span>\n </div>\n <button class=\"slideout-close\" (click)=\"closePanel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Tab Bar -->\n <div class=\"slideout-tabs\">\n <button class=\"slideout-tab\" [class.active]=\"EditTab === 'details'\"\n (click)=\"EditTab = 'details'\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Details\n </button>\n <button class=\"slideout-tab\" [class.active]=\"EditTab === 'scopes'\"\n (click)=\"EditTab = 'scopes'\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n Scopes\n <span class=\"tab-badge\">{{getSelectedScopeCount()}}</span>\n </button>\n </div>\n\n <div class=\"slideout-content\">\n <!-- Details Tab -->\n @if (EditTab === 'details') {\n <div class=\"tab-panel\">\n <div class=\"form-section\">\n <div class=\"form-field\">\n <label>Application Name *</label>\n <input class=\"mj-input\" [(ngModel)]=\"EditName\"\n placeholder=\"e.g., MJAPI, MCP Server, Portal\"\n class=\"form-input\" />\n </div>\n <div class=\"form-field\">\n <label>Description</label>\n <textarea class=\"mj-textarea\" [(ngModel)]=\"EditDescription\"\n placeholder=\"Describe the application's purpose...\"\n [rows]=\"4\"\n class=\"form-textarea\"></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 applications cannot be used with API keys</span>\n </div>\n </label>\n </div>\n </div>\n </div>\n }\n\n <!-- Scopes Tab -->\n @if (EditTab === 'scopes') {\n <div class=\"tab-panel scopes-panel\">\n <div class=\"scopes-intro\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Define the maximum permissions this application can grant to API keys.</span>\n </div>\n <div class=\"scope-categories-list\">\n @for (category of ScopeCategories; track category) {\n <div class=\"scope-category-card\">\n <div class=\"category-header\" (click)=\"toggleScopeCategory(category)\">\n <div class=\"category-left\">\n <i [class]=\"category.icon\" [style.color]=\"category.color\"></i>\n <span class=\"category-name\">{{category.name}}</span>\n <span class=\"category-count-badge\">\n {{getCategorySelectedCount(category)}}/{{category.scopes.length}}\n </span>\n </div>\n <div class=\"category-right\">\n <label class=\"category-all-toggle\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [checked]=\"category.allSelected\"\n (change)=\"toggleCategoryAll(category)\" />\n <span>All</span>\n </label>\n <i class=\"fa-solid category-chevron\"\n [class.fa-chevron-down]=\"!category.expanded\"\n [class.fa-chevron-up]=\"category.expanded\"></i>\n </div>\n </div>\n @if (category.expanded) {\n <div class=\"category-scopes-list\">\n @for (selection of category.scopes; track selection) {\n <div class=\"scope-row\"\n [class.selected]=\"selection.selected\">\n <label class=\"scope-select\">\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [(ngModel)]=\"selection.selected\"\n (change)=\"updateCategoryState(category)\" />\n <div class=\"scope-label\">\n <span class=\"scope-path\">{{selection.displayName || '(unnamed scope)'}}</span>\n @if (selection.scope.Description) {\n <span class=\"scope-description\">\n {{selection.scope.Description}}\n </span>\n }\n </div>\n </label>\n <!-- Read-only pattern display -->\n @if (selection.selected) {\n <div class=\"scope-pattern-display\">\n <span class=\"pattern-tag\" [class.include]=\"selection.patternType === 'Include'\"\n [class.exclude]=\"selection.patternType === 'Exclude'\">\n <i class=\"fa-solid\" [class.fa-check]=\"selection.patternType === 'Include'\"\n [class.fa-minus]=\"selection.patternType === 'Exclude'\"></i>\n {{selection.pattern || '*'}}\n </span>\n </div>\n }\n <!-- Editable pattern config - shown on hover -->\n @if (selection.selected) {\n <div class=\"scope-pattern-config\">\n <input class=\"mj-input\" [(ngModel)]=\"selection.pattern\"\n placeholder=\"*\"\n class=\"pattern-field\"\n title=\"Resource Pattern\" />\n <mj-dropdown [(ngModel)]=\"selection.patternType\"\n [Data]=\"['Include', 'Exclude']\"\n [ValuePrimitive]=\"true\"\n class=\"type-field\"\n title=\"Pattern Type\">\n </mj-dropdown>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n @if (ScopeCategories.length === 0) {\n <div class=\"empty-scopes-message\">\n <i class=\"fa-solid fa-shield-xmark\"></i>\n <span>No scopes available</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <div class=\"slideout-footer\">\n <button mjButton variant=\"primary\"\n [disabled]=\"!EditName.trim() || IsSaving\"\n (click)=\"saveAll()\">\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 Save Changes\n </span>\n }\n </button>\n <button mjButton (click)=\"closePanel()\">Cancel</button>\n </div>\n </div>\n</div>\n"]}
@@ -1,5 +1,6 @@
1
1
  import { EventEmitter, OnInit } 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 selection item */
5
6
  interface ScopeItem {
@@ -26,7 +27,7 @@ export interface APIKeyCreateResult {
26
27
  * Dialog for creating new API keys
27
28
  * Shows the raw key only once - it cannot be recovered after closing
28
29
  */
29
- export declare class APIKeyCreateDialogComponent implements OnInit {
30
+ export declare class APIKeyCreateDialogComponent extends BaseAngularComponent implements OnInit {
30
31
  Visible: boolean;
31
32
  VisibleChange: EventEmitter<boolean>;
32
33
  Created: EventEmitter<APIKeyCreateResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"api-key-create-dialog.component.d.ts","sourceRoot":"","sources":["../../src/APIKeys/api-key-create-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAuB,MAAM,EAAU,MAAM,eAAe,CAAC;AAE7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;;AAIjE,2BAA2B;AAC3B,UAAU,SAAS;IACf,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,iCAAiC;AACjC,UAAU,aAAa;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACxB;AAED,6BAA6B;AAC7B,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AACD;;;GAGG;AACH,qBAMa,2BAA4B,YAAW,MAAM;IAC7C,OAAO,UAAS;IACf,aAAa,wBAA+B;IAC5C,OAAO,mCAA0C;IACjD,MAAM,qBAA4B;IAGrC,KAAK,SAAM;IACX,WAAW,SAAM;IACjB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAQ;IAC9B,YAAY,UAAQ;IAGpB,iBAAiB;;;QAKtB;IACK,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAQ;IAG9D,eAAe,EAAE,aAAa,EAAE,CAAM;IACtC,eAAe,UAAQ;IAGvB,UAAU,UAAS;IACnB,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAe;IACvD,SAAS,SAAM;IACf,SAAS,UAAS;IAClB,KAAK,SAAM;IAGlB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAG9B;IAEF,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IAEI,WAAW,IAAI,IAAI;IAM1B;;;OAGG;IACH,OAAO,CAAC,UAAU;IAsDlB;;OAEG;IACI,cAAc,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAapE;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAOnC;;OAEG;IACI,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAIpD;;OAEG;IACI,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAOvD;;OAEG;IACI,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAIzD;;OAEG;IACI,qBAAqB,IAAI,MAAM;IAKtC;;OAEG;IACI,UAAU,IAAI,IAAI;IASzB;;OAEG;IACI,MAAM,IAAI,IAAI;IAIrB;;OAEG;IACU,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA0CvC;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrC;;OAEG;IACI,KAAK,IAAI,IAAI;IAOpB;;OAEG;IACH,OAAO,CAAC,KAAK;IAqBb;;OAEG;IACI,UAAU,IAAI,IAAI;yCA1RhB,2BAA2B;2CAA3B,2BAA2B;CA+RvC"}
1
+ {"version":3,"file":"api-key-create-dialog.component.d.ts","sourceRoot":"","sources":["../../src/APIKeys/api-key-create-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAuB,MAAM,EAAU,MAAM,eAAe,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAGrE,2BAA2B;AAC3B,UAAU,SAAS;IACf,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,iCAAiC;AACjC,UAAU,aAAa;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACxB;AAED,6BAA6B;AAC7B,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AACD;;;GAGG;AACH,qBAMa,2BAA4B,SAAQ,oBAAqB,YAAW,MAAM;IAC1E,OAAO,UAAS;IACf,aAAa,wBAA+B;IAC5C,OAAO,mCAA0C;IACjD,MAAM,qBAA4B;IAGrC,KAAK,SAAM;IACX,WAAW,SAAM;IACjB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAQ;IAC9B,YAAY,UAAQ;IAGpB,iBAAiB;;;QAKtB;IACK,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAQ;IAG9D,eAAe,EAAE,aAAa,EAAE,CAAM;IACtC,eAAe,UAAQ;IAGvB,UAAU,UAAS;IACnB,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAe;IACvD,SAAS,SAAM;IACf,SAAS,UAAS;IAClB,KAAK,SAAM;IAGlB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAG9B;IAEF,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IAEI,WAAW,IAAI,IAAI;IAM1B;;;OAGG;IACH,OAAO,CAAC,UAAU;IAsDlB;;OAEG;IACI,cAAc,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAapE;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAOnC;;OAEG;IACI,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAIpD;;OAEG;IACI,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAOvD;;OAEG;IACI,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAIzD;;OAEG;IACI,qBAAqB,IAAI,MAAM;IAKtC;;OAEG;IACI,UAAU,IAAI,IAAI;IASzB;;OAEG;IACI,MAAM,IAAI,IAAI;IAIrB;;OAEG;IACU,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA0CvC;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrC;;OAEG;IACI,KAAK,IAAI,IAAI;IAOpB;;OAEG;IACH,OAAO,CAAC,KAAK;IAqBb;;OAEG;IACI,UAAU,IAAI,IAAI;yCA1RhB,2BAA2B;2CAA3B,2BAA2B;CA+RvC"}
@@ -1,6 +1,6 @@
1
1
  import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
2
- import { Metadata } from '@memberjunction/core';
3
2
  import { GraphQLEncryptionClient } from '@memberjunction/graphql-dataprovider';
3
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
4
4
  import { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/forms";
@@ -432,7 +432,7 @@ function APIKeyCreateDialogComponent_Conditional_16_Template(rf, ctx) { if (rf &
432
432
  * Dialog for creating new API keys
433
433
  * Shows the raw key only once - it cannot be recovered after closing
434
434
  */
435
- export class APIKeyCreateDialogComponent {
435
+ export class APIKeyCreateDialogComponent extends BaseAngularComponent {
436
436
  Visible = false;
437
437
  VisibleChange = new EventEmitter();
438
438
  Created = new EventEmitter();
@@ -612,7 +612,7 @@ export class APIKeyCreateDialogComponent {
612
612
  .filter(s => s.selected)
613
613
  .map(s => s.scope.ID);
614
614
  // Get the GraphQL provider and create the encryption client
615
- const provider = Metadata.Provider;
615
+ const provider = this.ProviderToUse;
616
616
  const encryptionClient = new GraphQLEncryptionClient(provider);
617
617
  // Call the server to create the API key with proper crypto hashing
618
618
  const result = await encryptionClient.CreateAPIKey({
@@ -693,10 +693,10 @@ export class APIKeyCreateDialogComponent {
693
693
  tomorrow.setDate(tomorrow.getDate() + 1);
694
694
  return tomorrow;
695
695
  }
696
- static ɵfac = function APIKeyCreateDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || APIKeyCreateDialogComponent)(); };
696
+ static ɵfac = /*@__PURE__*/ (() => { let ɵAPIKeyCreateDialogComponent_BaseFactory; return function APIKeyCreateDialogComponent_Factory(__ngFactoryType__) { return (ɵAPIKeyCreateDialogComponent_BaseFactory || (ɵAPIKeyCreateDialogComponent_BaseFactory = i0.ɵɵgetInheritedFactory(APIKeyCreateDialogComponent)))(__ngFactoryType__ || APIKeyCreateDialogComponent); }; })();
697
697
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: APIKeyCreateDialogComponent, selectors: [["mj-api-key-create-dialog"]], hostBindings: function APIKeyCreateDialogComponent_HostBindings(rf, ctx) { if (rf & 1) {
698
698
  i0.ɵɵlistener("keydown.escape", function APIKeyCreateDialogComponent_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); }, i0.ɵɵresolveDocument);
699
- } }, inputs: { Visible: "Visible" }, outputs: { VisibleChange: "VisibleChange", Created: "Created", Closed: "Closed" }, standalone: false, decls: 17, vars: 11, consts: [[1, "slideout-backdrop"], [1, "slideout-panel"], [1, "slideout-header"], [1, "slideout-title"], [1, "fa-solid", "fa-key"], ["title", "Close (Esc)", 1, "slideout-close"], [1, "step-indicator"], [1, "slideout-content"], [1, "step-panel"], [1, "step-panel", "scopes-step"], [1, "step-panel", "success-step"], [1, "slideout-footer"], ["mjButton", "", "variant", "primary"], [1, "slideout-backdrop", 3, "click"], ["title", "Close (Esc)", 1, "slideout-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "step"], [1, "step-number"], [1, "step-label"], [1, "step-connector"], [1, "form-section"], [1, "form-label", "required"], ["placeholder", "e.g., ElevenLabs Integration, CI/CD Pipeline", 1, "mj-input", "form-input", 3, "ngModelChange", "ngModel"], [1, "form-hint"], [1, "form-label"], ["placeholder", "Optional notes about how this key will be used...", 1, "mj-textarea", "form-textarea", 3, "ngModelChange", "ngModel", "rows"], [1, "expiration-options"], [1, "checkbox-label"], ["type", "checkbox", 1, "mj-checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "preset-buttons"], [1, "custom-date"], [1, "expiration-preview"], [1, "error-message"], [1, "preset-btn", 3, "active"], [1, "preset-btn", 3, "click"], ["Format", "MMM d, yyyy", "Placeholder", "Select expiration date", 3, "ngModelChange", "ngModel", "Min"], [1, "fa-solid", "fa-calendar-check"], [1, "fa-solid", "fa-circle-exclamation"], [1, "scopes-header"], [1, "scopes-info"], [1, "scopes-count"], ["text", "Loading scopes..."], [1, "scope-categories"], [1, "scope-tip"], [1, "fa-solid", "fa-lightbulb"], [1, "no-scopes-warning"], [1, "count"], [1, "scope-category"], [1, "category-header", 3, "click"], [1, "category-left"], [1, "category-name"], [1, "category-badge"], [1, "category-right"], [1, "select-all-label", 3, "click"], ["type", "checkbox", 1, "mj-checkbox", 3, "change", "checked"], [1, "fa-solid"], [1, "category-scopes"], [1, "scope-item"], [1, "scope-label"], [1, "scope-info"], [1, "scope-name"], [1, "scope-desc"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "success-icon"], [1, "fa-solid", "fa-check-circle"], [1, "success-title"], [1, "key-display"], [1, "key-warning"], [1, "key-value"], [1, "copy-btn", 3, "click"], [1, "key-details"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value"], [1, "security-note"], [1, "fa-solid", "fa-shield-check"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-arrow-right"], ["mjButton", "", 3, "click"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["size", "small", 3, "showText"], [1, "fa-solid", "fa-arrow-left"], [1, "fa-solid", "fa-check"]], template: function APIKeyCreateDialogComponent_Template(rf, ctx) { if (rf & 1) {
699
+ } }, inputs: { Visible: "Visible" }, outputs: { VisibleChange: "VisibleChange", Created: "Created", Closed: "Closed" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 17, vars: 11, consts: [[1, "slideout-backdrop"], [1, "slideout-panel"], [1, "slideout-header"], [1, "slideout-title"], [1, "fa-solid", "fa-key"], ["title", "Close (Esc)", 1, "slideout-close"], [1, "step-indicator"], [1, "slideout-content"], [1, "step-panel"], [1, "step-panel", "scopes-step"], [1, "step-panel", "success-step"], [1, "slideout-footer"], ["mjButton", "", "variant", "primary"], [1, "slideout-backdrop", 3, "click"], ["title", "Close (Esc)", 1, "slideout-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "step"], [1, "step-number"], [1, "step-label"], [1, "step-connector"], [1, "form-section"], [1, "form-label", "required"], ["placeholder", "e.g., ElevenLabs Integration, CI/CD Pipeline", 1, "mj-input", "form-input", 3, "ngModelChange", "ngModel"], [1, "form-hint"], [1, "form-label"], ["placeholder", "Optional notes about how this key will be used...", 1, "mj-textarea", "form-textarea", 3, "ngModelChange", "ngModel", "rows"], [1, "expiration-options"], [1, "checkbox-label"], ["type", "checkbox", 1, "mj-checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "preset-buttons"], [1, "custom-date"], [1, "expiration-preview"], [1, "error-message"], [1, "preset-btn", 3, "active"], [1, "preset-btn", 3, "click"], ["Format", "MMM d, yyyy", "Placeholder", "Select expiration date", 3, "ngModelChange", "ngModel", "Min"], [1, "fa-solid", "fa-calendar-check"], [1, "fa-solid", "fa-circle-exclamation"], [1, "scopes-header"], [1, "scopes-info"], [1, "scopes-count"], ["text", "Loading scopes..."], [1, "scope-categories"], [1, "scope-tip"], [1, "fa-solid", "fa-lightbulb"], [1, "no-scopes-warning"], [1, "count"], [1, "scope-category"], [1, "category-header", 3, "click"], [1, "category-left"], [1, "category-name"], [1, "category-badge"], [1, "category-right"], [1, "select-all-label", 3, "click"], ["type", "checkbox", 1, "mj-checkbox", 3, "change", "checked"], [1, "fa-solid"], [1, "category-scopes"], [1, "scope-item"], [1, "scope-label"], [1, "scope-info"], [1, "scope-name"], [1, "scope-desc"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "success-icon"], [1, "fa-solid", "fa-check-circle"], [1, "success-title"], [1, "key-display"], [1, "key-warning"], [1, "key-value"], [1, "copy-btn", 3, "click"], [1, "key-details"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value"], [1, "security-note"], [1, "fa-solid", "fa-shield-check"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-arrow-right"], ["mjButton", "", 3, "click"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["size", "small", 3, "showText"], [1, "fa-solid", "fa-arrow-left"], [1, "fa-solid", "fa-check"]], template: function APIKeyCreateDialogComponent_Template(rf, ctx) { if (rf & 1) {
700
700
  i0.ɵɵconditionalCreate(0, APIKeyCreateDialogComponent_Conditional_0_Template, 1, 0, "div", 0);
701
701
  i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "div", 3);
702
702
  i0.ɵɵelement(4, "i", 4);
@@ -1 +1 @@
1
- {"version":3,"file":"api-key-create-dialog.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-key-create-dialog.component.ts","../../src/APIKeys/api-key-create-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, HostListener, Input, OnInit, Output } from '@angular/core';\nimport { Metadata } from '@memberjunction/core';\nimport { MJAPIScopeEntity } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, GraphQLEncryptionClient } from '@memberjunction/graphql-dataprovider';\nimport { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';\n\n/** Scope selection item */\ninterface ScopeItem {\n scope: MJAPIScopeEntity;\n selected: boolean;\n}\n\n/** Grouped scopes by category */\ninterface ScopeCategory {\n name: string;\n icon: string;\n color: string;\n scopes: ScopeItem[];\n expanded: boolean;\n allSelected: boolean;\n}\n\n/** Result of key creation */\nexport interface APIKeyCreateResult {\n success: boolean;\n apiKeyId?: string;\n rawKey?: string;\n error?: string;\n}\n/**\n * Dialog for creating new API keys\n * Shows the raw key only once - it cannot be recovered after closing\n */\n@Component({\n standalone: false,\n selector: 'mj-api-key-create-dialog',\n templateUrl: './api-key-create-dialog.component.html',\n styleUrls: ['./api-key-create-dialog.component.css']\n})\nexport class APIKeyCreateDialogComponent implements OnInit {\n @Input() Visible = false;\n @Output() VisibleChange = new EventEmitter<boolean>();\n @Output() Created = new EventEmitter<APIKeyCreateResult>();\n @Output() Closed = new EventEmitter<void>();\n\n // Form fields\n public Label = '';\n public Description = '';\n public ExpiresAt: Date | null = null;\n public NeverExpires = true;\n\n // Expiration presets\n public ExpirationPresets = [\n { label: '30 days', days: 30 },\n { label: '90 days', days: 90 },\n { label: '1 year', days: 365 },\n { label: 'Custom', days: -1 }\n ];\n public SelectedPreset: { label: string; days: number } | null = null;\n\n // Scopes\n public ScopeCategories: ScopeCategory[] = [];\n public IsLoadingScopes = true;\n\n // State\n public IsCreating = false;\n public Step: 'configure' | 'scopes' | 'success' = 'configure';\n public RawApiKey = '';\n public KeyCopied = false;\n public Error = '';\n\n // Default UI config for categories without explicit configuration\n private readonly defaultUIConfig = {\n icon: 'fa-solid fa-ellipsis',\n color: 'var(--mj-text-muted)'\n };\n\n ngOnInit(): void {\n this.loadScopes();\n }\n\n /**\n * Handle escape key to close dialog\n */\n @HostListener('document:keydown.escape')\n public onEscapeKey(): void {\n if (this.Visible && !this.IsCreating) {\n this.close();\n }\n }\n\n /**\n * Load available scopes from cached data.\n * Uses UIConfig from root scopes for category icons/colors.\n */\n private loadScopes(): void {\n this.IsLoadingScopes = true;\n try {\n const base = APIKeysEngineBase.Instance;\n const scopes = base.Scopes;\n\n // Build a map of category -> root scope UIConfig\n // Root scopes (ParentID is null) define the UI appearance for their category\n const categoryUIConfigs = new Map<string, { icon: string; color: string }>();\n for (const scope of scopes) {\n if (!scope.ParentID) {\n // This is a root scope - use its UIConfig for the category\n const uiConfig = parseAPIScopeUIConfig(scope);\n categoryUIConfigs.set(scope.Category, {\n icon: uiConfig.icon || this.defaultUIConfig.icon,\n color: uiConfig.color || this.defaultUIConfig.color\n });\n }\n }\n\n // Group scopes by category\n const categoryMap = new Map<string, ScopeItem[]>();\n for (const scope of scopes) {\n const category = scope.Category || 'Other';\n if (!categoryMap.has(category)) {\n categoryMap.set(category, []);\n }\n categoryMap.get(category)!.push({\n scope,\n selected: false\n });\n }\n\n // Build categories with UI config from root scopes\n this.ScopeCategories = Array.from(categoryMap.entries())\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, scopeItems]) => {\n const config = categoryUIConfigs.get(name) || this.defaultUIConfig;\n return {\n name,\n icon: config.icon,\n color: config.color,\n scopes: scopeItems.sort((a, b) => a.scope.Name.localeCompare(b.scope.Name)),\n expanded: false,\n allSelected: false\n };\n });\n } catch (error) {\n console.error('Error loading scopes:', error);\n } finally {\n this.IsLoadingScopes = false;\n }\n }\n\n /**\n * Handle expiration preset selection\n */\n public onPresetSelect(preset: { label: string; days: number }): void {\n this.SelectedPreset = preset;\n this.NeverExpires = false;\n\n if (preset.days > 0) {\n const date = new Date();\n date.setDate(date.getDate() + preset.days);\n this.ExpiresAt = date;\n } else {\n this.ExpiresAt = null;\n }\n }\n\n /**\n * Handle never expires toggle\n */\n public onNeverExpiresChange(): void {\n if (this.NeverExpires) {\n this.ExpiresAt = null;\n this.SelectedPreset = null;\n }\n }\n\n /**\n * Toggle category expansion\n */\n public toggleCategory(category: ScopeCategory): void {\n category.expanded = !category.expanded;\n }\n\n /**\n * Toggle all scopes in a category\n */\n public toggleCategoryAll(category: ScopeCategory): void {\n category.allSelected = !category.allSelected;\n for (const item of category.scopes) {\n item.selected = category.allSelected;\n }\n }\n\n /**\n * Update category allSelected state\n */\n public updateCategoryState(category: ScopeCategory): void {\n category.allSelected = category.scopes.every(s => s.selected);\n }\n\n /**\n * Get selected scope count\n */\n public getSelectedScopeCount(): number {\n return this.ScopeCategories.reduce((sum, cat) =>\n sum + cat.scopes.filter(s => s.selected).length, 0);\n }\n\n /**\n * Proceed to scopes step\n */\n public goToScopes(): void {\n if (!this.Label.trim()) {\n this.Error = 'Please enter a label for the API key';\n return;\n }\n this.Error = '';\n this.Step = 'scopes';\n }\n\n /**\n * Go back to configure step\n */\n public goBack(): void {\n this.Step = 'configure';\n }\n\n /**\n * Create the API key using server-side cryptographic hashing\n */\n public async createKey(): Promise<void> {\n this.IsCreating = true;\n this.Error = '';\n\n try {\n // Get selected scope IDs\n const selectedScopeIds = this.ScopeCategories\n .flatMap(cat => cat.scopes)\n .filter(s => s.selected)\n .map(s => s.scope.ID);\n\n // Get the GraphQL provider and create the encryption client\n const provider = Metadata.Provider as GraphQLDataProvider;\n const encryptionClient = new GraphQLEncryptionClient(provider);\n\n // Call the server to create the API key with proper crypto hashing\n const result = await encryptionClient.CreateAPIKey({\n Label: this.Label.trim(),\n Description: this.Description.trim() || undefined,\n ExpiresAt: this.NeverExpires ? undefined : (this.ExpiresAt || undefined),\n ScopeIDs: selectedScopeIds.length > 0 ? selectedScopeIds : undefined\n });\n\n if (result.Success && result.RawKey) {\n this.RawApiKey = result.RawKey;\n this.Step = 'success';\n\n this.Created.emit({\n success: true,\n rawKey: result.RawKey\n });\n } else {\n this.Error = result.Error || 'Failed to create API key. Please try again.';\n }\n } catch (error) {\n console.error('Error creating API key:', error);\n this.Error = 'An error occurred while creating the API key.';\n } finally {\n this.IsCreating = false;\n }\n }\n\n /**\n * Copy the API key to clipboard\n */\n public async copyKey(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.RawApiKey);\n this.KeyCopied = true;\n setTimeout(() => this.KeyCopied = false, 3000);\n } catch (error) {\n console.error('Failed to copy key:', error);\n }\n }\n\n /**\n * Close the dialog\n */\n public close(): void {\n this.reset();\n this.Visible = false;\n this.VisibleChange.emit(false);\n this.Closed.emit();\n }\n\n /**\n * Reset form state\n */\n private reset(): void {\n this.Label = '';\n this.Description = '';\n this.ExpiresAt = null;\n this.NeverExpires = true;\n this.SelectedPreset = null;\n this.Step = 'configure';\n this.RawApiKey = '';\n this.KeyCopied = false;\n this.Error = '';\n\n // Reset scope selections\n for (const category of this.ScopeCategories) {\n category.expanded = false;\n category.allSelected = false;\n for (const scope of category.scopes) {\n scope.selected = false;\n }\n }\n }\n\n /**\n * Get minimum date for expiration (tomorrow)\n */\n public getMinDate(): Date {\n const tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n return tomorrow;\n }\n}\n","<!-- Slide-out Backdrop -->\n@if (Visible) {\n <div class=\"slideout-backdrop\" (click)=\"Step !== 'success' ? close() : null\"></div>\n}\n\n<!-- Slide-out Panel -->\n<div class=\"slideout-panel\" [class.open]=\"Visible\">\n <!-- Header -->\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>Generate New API Key</span>\n </div>\n @if (Step !== 'success') {\n <button class=\"slideout-close\" (click)=\"close()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n\n <!-- Step Indicator -->\n @if (Step !== 'success') {\n <div class=\"step-indicator\">\n <div class=\"step\" [class.active]=\"Step === 'configure'\" [class.completed]=\"Step === 'scopes'\">\n <div class=\"step-number\">1</div>\n <div class=\"step-label\">Configure</div>\n </div>\n <div class=\"step-connector\" [class.active]=\"Step === 'scopes'\"></div>\n <div class=\"step\" [class.active]=\"Step === 'scopes'\">\n <div class=\"step-number\">2</div>\n <div class=\"step-label\">Permissions</div>\n </div>\n </div>\n }\n\n <div class=\"slideout-content\">\n <!-- Configure Step -->\n @if (Step === 'configure') {\n <div class=\"step-panel\">\n <div class=\"form-section\">\n <label class=\"form-label required\">Key Label</label>\n <input class=\"mj-input form-input\" [(ngModel)]=\"Label\"\n placeholder=\"e.g., ElevenLabs Integration, CI/CD Pipeline\" />\n <div class=\"form-hint\">A memorable name to identify this key's purpose</div>\n </div>\n <div class=\"form-section\">\n <label class=\"form-label\">Description</label>\n <textarea class=\"mj-textarea form-textarea\" [(ngModel)]=\"Description\"\n placeholder=\"Optional notes about how this key will be used...\"\n [rows]=\"3\"></textarea>\n </div>\n <div class=\"form-section\">\n <label class=\"form-label\">Expiration</label>\n <div class=\"expiration-options\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [(ngModel)]=\"NeverExpires\"\n (change)=\"onNeverExpiresChange()\" />\n <span>Never expires</span>\n </label>\n @if (!NeverExpires) {\n <div class=\"preset-buttons\">\n @for (preset of ExpirationPresets; track preset) {\n <button\n class=\"preset-btn\"\n [class.active]=\"SelectedPreset === preset\"\n (click)=\"onPresetSelect(preset)\">\n {{preset.label}}\n </button>\n }\n </div>\n }\n @if (!NeverExpires && SelectedPreset?.days === -1) {\n <div class=\"custom-date\">\n <mj-datepicker [(ngModel)]=\"ExpiresAt\"\n [Min]=\"getMinDate()\"\n Format=\"MMM d, yyyy\"\n Placeholder=\"Select expiration date\">\n </mj-datepicker>\n </div>\n }\n @if (!NeverExpires && ExpiresAt) {\n <div class=\"expiration-preview\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n <span>Key will expire on {{ExpiresAt | date:'MMMM d, yyyy'}}</span>\n </div>\n }\n </div>\n </div>\n @if (Error) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{Error}}\n </div>\n }\n </div>\n }\n\n <!-- Scopes Step -->\n @if (Step === 'scopes') {\n <div class=\"step-panel scopes-step\">\n <div class=\"scopes-header\">\n <div class=\"scopes-info\">\n <h4>Select Permission Scopes</h4>\n <p>Choose what this API key can access. You can always modify this later.</p>\n </div>\n @if (getSelectedScopeCount() > 0) {\n <div class=\"scopes-count\">\n <span class=\"count\">{{getSelectedScopeCount()}}</span> selected\n </div>\n }\n </div>\n @if (IsLoadingScopes) {\n <mj-loading text=\"Loading scopes...\"></mj-loading>\n }\n @if (!IsLoadingScopes) {\n <div class=\"scope-categories\">\n @for (category of ScopeCategories; track category) {\n <div class=\"scope-category\">\n <div class=\"category-header\" (click)=\"toggleCategory(category)\">\n <div class=\"category-left\">\n <i [class]=\"category.icon\" [style.color]=\"category.color\"></i>\n <span class=\"category-name\">{{category.name}}</span>\n <span class=\"category-badge\">{{category.scopes.length}}</span>\n </div>\n <div class=\"category-right\">\n <label class=\"select-all-label\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [checked]=\"category.allSelected\"\n (change)=\"toggleCategoryAll(category)\" />\n <span>All</span>\n </label>\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!category.expanded\"\n [class.fa-chevron-up]=\"category.expanded\"></i>\n </div>\n </div>\n @if (category.expanded) {\n <div class=\"category-scopes\">\n @for (item of category.scopes; track item) {\n <div class=\"scope-item\">\n <label class=\"scope-label\">\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [(ngModel)]=\"item.selected\"\n (change)=\"updateCategoryState(category)\" />\n <div class=\"scope-info\">\n <span class=\"scope-name\">{{item.scope.Name}}</span>\n @if (item.scope.Description) {\n <span class=\"scope-desc\">\n {{item.scope.Description}}\n </span>\n }\n </div>\n </label>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <div class=\"scope-tip\">\n <i class=\"fa-solid fa-lightbulb\"></i>\n <span>Tip: Use wildcards like <code>entities:*</code> for broad access within a category</span>\n </div>\n <!-- No Scopes Warning -->\n @if (!IsLoadingScopes && getSelectedScopeCount() === 0) {\n <div class=\"no-scopes-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div>\n <strong>Warning: No permissions selected</strong>\n <p>API keys without any assigned scopes will have <strong>no permissions</strong> and cannot perform any operations. This key will be rejected by all API endpoints until scopes are assigned.</p>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Success Step -->\n @if (Step === 'success') {\n <div class=\"step-panel success-step\">\n <div class=\"success-icon\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <h3 class=\"success-title\">API Key Created Successfully!</h3>\n <div class=\"key-display\">\n <div class=\"key-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>Copy this key now. It won't be shown again!</span>\n </div>\n <div class=\"key-value\">\n <code>{{RawApiKey}}</code>\n <button class=\"copy-btn\" (click)=\"copyKey()\" [class.copied]=\"KeyCopied\">\n <i class=\"fa-solid\" [class.fa-copy]=\"!KeyCopied\" [class.fa-check]=\"KeyCopied\"></i>\n <span>{{KeyCopied ? 'Copied!' : 'Copy'}}</span>\n </button>\n </div>\n </div>\n <div class=\"key-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Label:</span>\n <span class=\"detail-value\">{{Label}}</span>\n </div>\n @if (Description) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Description:</span>\n <span class=\"detail-value\">{{Description}}</span>\n </div>\n }\n <div class=\"detail-row\">\n <span class=\"detail-label\">Expires:</span>\n <span class=\"detail-value\">\n {{NeverExpires ? 'Never' : (ExpiresAt | date:'MMMM d, yyyy')}}\n </span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Scopes:</span>\n <span class=\"detail-value\">{{getSelectedScopeCount()}} permissions</span>\n </div>\n </div>\n <div class=\"security-note\">\n <i class=\"fa-solid fa-shield-check\"></i>\n <div>\n <strong>Security Note:</strong>\n Store this key securely. We only store a hash - the original key cannot be recovered.\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"slideout-footer\">\n @if (Step === 'configure') {\n <button mjButton variant=\"primary\" (click)=\"goToScopes()\">\n Next: Permissions\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n <button mjButton (click)=\"close()\">Cancel</button>\n }\n\n @if (Step === 'scopes') {\n <button mjButton variant=\"primary\"\n [disabled]=\"IsCreating\"\n (click)=\"createKey()\">\n @if (IsCreating) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsCreating) {\n <span>\n <i class=\"fa-solid fa-key\"></i>\n Generate Key\n </span>\n }\n </button>\n <button mjButton (click)=\"goBack()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back\n </button>\n }\n\n @if (Step === 'success') {\n <button mjButton variant=\"primary\" (click)=\"close()\">\n <i class=\"fa-solid fa-check\"></i>\n Done\n </button>\n }\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"api-key-create-dialog.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-key-create-dialog.component.ts","../../src/APIKeys/api-key-create-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, HostListener, Input, OnInit, Output } from '@angular/core';\nimport { MJAPIScopeEntity } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, GraphQLEncryptionClient } from '@memberjunction/graphql-dataprovider';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';\n\n/** Scope selection item */\ninterface ScopeItem {\n scope: MJAPIScopeEntity;\n selected: boolean;\n}\n\n/** Grouped scopes by category */\ninterface ScopeCategory {\n name: string;\n icon: string;\n color: string;\n scopes: ScopeItem[];\n expanded: boolean;\n allSelected: boolean;\n}\n\n/** Result of key creation */\nexport interface APIKeyCreateResult {\n success: boolean;\n apiKeyId?: string;\n rawKey?: string;\n error?: string;\n}\n/**\n * Dialog for creating new API keys\n * Shows the raw key only once - it cannot be recovered after closing\n */\n@Component({\n standalone: false,\n selector: 'mj-api-key-create-dialog',\n templateUrl: './api-key-create-dialog.component.html',\n styleUrls: ['./api-key-create-dialog.component.css']\n})\nexport class APIKeyCreateDialogComponent extends BaseAngularComponent implements OnInit {\n @Input() Visible = false;\n @Output() VisibleChange = new EventEmitter<boolean>();\n @Output() Created = new EventEmitter<APIKeyCreateResult>();\n @Output() Closed = new EventEmitter<void>();\n\n // Form fields\n public Label = '';\n public Description = '';\n public ExpiresAt: Date | null = null;\n public NeverExpires = true;\n\n // Expiration presets\n public ExpirationPresets = [\n { label: '30 days', days: 30 },\n { label: '90 days', days: 90 },\n { label: '1 year', days: 365 },\n { label: 'Custom', days: -1 }\n ];\n public SelectedPreset: { label: string; days: number } | null = null;\n\n // Scopes\n public ScopeCategories: ScopeCategory[] = [];\n public IsLoadingScopes = true;\n\n // State\n public IsCreating = false;\n public Step: 'configure' | 'scopes' | 'success' = 'configure';\n public RawApiKey = '';\n public KeyCopied = false;\n public Error = '';\n\n // Default UI config for categories without explicit configuration\n private readonly defaultUIConfig = {\n icon: 'fa-solid fa-ellipsis',\n color: 'var(--mj-text-muted)'\n };\n\n ngOnInit(): void {\n this.loadScopes();\n }\n\n /**\n * Handle escape key to close dialog\n */\n @HostListener('document:keydown.escape')\n public onEscapeKey(): void {\n if (this.Visible && !this.IsCreating) {\n this.close();\n }\n }\n\n /**\n * Load available scopes from cached data.\n * Uses UIConfig from root scopes for category icons/colors.\n */\n private loadScopes(): void {\n this.IsLoadingScopes = true;\n try {\n const base = APIKeysEngineBase.Instance;\n const scopes = base.Scopes;\n\n // Build a map of category -> root scope UIConfig\n // Root scopes (ParentID is null) define the UI appearance for their category\n const categoryUIConfigs = new Map<string, { icon: string; color: string }>();\n for (const scope of scopes) {\n if (!scope.ParentID) {\n // This is a root scope - use its UIConfig for the category\n const uiConfig = parseAPIScopeUIConfig(scope);\n categoryUIConfigs.set(scope.Category, {\n icon: uiConfig.icon || this.defaultUIConfig.icon,\n color: uiConfig.color || this.defaultUIConfig.color\n });\n }\n }\n\n // Group scopes by category\n const categoryMap = new Map<string, ScopeItem[]>();\n for (const scope of scopes) {\n const category = scope.Category || 'Other';\n if (!categoryMap.has(category)) {\n categoryMap.set(category, []);\n }\n categoryMap.get(category)!.push({\n scope,\n selected: false\n });\n }\n\n // Build categories with UI config from root scopes\n this.ScopeCategories = Array.from(categoryMap.entries())\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, scopeItems]) => {\n const config = categoryUIConfigs.get(name) || this.defaultUIConfig;\n return {\n name,\n icon: config.icon,\n color: config.color,\n scopes: scopeItems.sort((a, b) => a.scope.Name.localeCompare(b.scope.Name)),\n expanded: false,\n allSelected: false\n };\n });\n } catch (error) {\n console.error('Error loading scopes:', error);\n } finally {\n this.IsLoadingScopes = false;\n }\n }\n\n /**\n * Handle expiration preset selection\n */\n public onPresetSelect(preset: { label: string; days: number }): void {\n this.SelectedPreset = preset;\n this.NeverExpires = false;\n\n if (preset.days > 0) {\n const date = new Date();\n date.setDate(date.getDate() + preset.days);\n this.ExpiresAt = date;\n } else {\n this.ExpiresAt = null;\n }\n }\n\n /**\n * Handle never expires toggle\n */\n public onNeverExpiresChange(): void {\n if (this.NeverExpires) {\n this.ExpiresAt = null;\n this.SelectedPreset = null;\n }\n }\n\n /**\n * Toggle category expansion\n */\n public toggleCategory(category: ScopeCategory): void {\n category.expanded = !category.expanded;\n }\n\n /**\n * Toggle all scopes in a category\n */\n public toggleCategoryAll(category: ScopeCategory): void {\n category.allSelected = !category.allSelected;\n for (const item of category.scopes) {\n item.selected = category.allSelected;\n }\n }\n\n /**\n * Update category allSelected state\n */\n public updateCategoryState(category: ScopeCategory): void {\n category.allSelected = category.scopes.every(s => s.selected);\n }\n\n /**\n * Get selected scope count\n */\n public getSelectedScopeCount(): number {\n return this.ScopeCategories.reduce((sum, cat) =>\n sum + cat.scopes.filter(s => s.selected).length, 0);\n }\n\n /**\n * Proceed to scopes step\n */\n public goToScopes(): void {\n if (!this.Label.trim()) {\n this.Error = 'Please enter a label for the API key';\n return;\n }\n this.Error = '';\n this.Step = 'scopes';\n }\n\n /**\n * Go back to configure step\n */\n public goBack(): void {\n this.Step = 'configure';\n }\n\n /**\n * Create the API key using server-side cryptographic hashing\n */\n public async createKey(): Promise<void> {\n this.IsCreating = true;\n this.Error = '';\n\n try {\n // Get selected scope IDs\n const selectedScopeIds = this.ScopeCategories\n .flatMap(cat => cat.scopes)\n .filter(s => s.selected)\n .map(s => s.scope.ID);\n\n // Get the GraphQL provider and create the encryption client\n const provider = this.ProviderToUse as GraphQLDataProvider;\n const encryptionClient = new GraphQLEncryptionClient(provider);\n\n // Call the server to create the API key with proper crypto hashing\n const result = await encryptionClient.CreateAPIKey({\n Label: this.Label.trim(),\n Description: this.Description.trim() || undefined,\n ExpiresAt: this.NeverExpires ? undefined : (this.ExpiresAt || undefined),\n ScopeIDs: selectedScopeIds.length > 0 ? selectedScopeIds : undefined\n });\n\n if (result.Success && result.RawKey) {\n this.RawApiKey = result.RawKey;\n this.Step = 'success';\n\n this.Created.emit({\n success: true,\n rawKey: result.RawKey\n });\n } else {\n this.Error = result.Error || 'Failed to create API key. Please try again.';\n }\n } catch (error) {\n console.error('Error creating API key:', error);\n this.Error = 'An error occurred while creating the API key.';\n } finally {\n this.IsCreating = false;\n }\n }\n\n /**\n * Copy the API key to clipboard\n */\n public async copyKey(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.RawApiKey);\n this.KeyCopied = true;\n setTimeout(() => this.KeyCopied = false, 3000);\n } catch (error) {\n console.error('Failed to copy key:', error);\n }\n }\n\n /**\n * Close the dialog\n */\n public close(): void {\n this.reset();\n this.Visible = false;\n this.VisibleChange.emit(false);\n this.Closed.emit();\n }\n\n /**\n * Reset form state\n */\n private reset(): void {\n this.Label = '';\n this.Description = '';\n this.ExpiresAt = null;\n this.NeverExpires = true;\n this.SelectedPreset = null;\n this.Step = 'configure';\n this.RawApiKey = '';\n this.KeyCopied = false;\n this.Error = '';\n\n // Reset scope selections\n for (const category of this.ScopeCategories) {\n category.expanded = false;\n category.allSelected = false;\n for (const scope of category.scopes) {\n scope.selected = false;\n }\n }\n }\n\n /**\n * Get minimum date for expiration (tomorrow)\n */\n public getMinDate(): Date {\n const tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n return tomorrow;\n }\n}\n","<!-- Slide-out Backdrop -->\n@if (Visible) {\n <div class=\"slideout-backdrop\" (click)=\"Step !== 'success' ? close() : null\"></div>\n}\n\n<!-- Slide-out Panel -->\n<div class=\"slideout-panel\" [class.open]=\"Visible\">\n <!-- Header -->\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>Generate New API Key</span>\n </div>\n @if (Step !== 'success') {\n <button class=\"slideout-close\" (click)=\"close()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n\n <!-- Step Indicator -->\n @if (Step !== 'success') {\n <div class=\"step-indicator\">\n <div class=\"step\" [class.active]=\"Step === 'configure'\" [class.completed]=\"Step === 'scopes'\">\n <div class=\"step-number\">1</div>\n <div class=\"step-label\">Configure</div>\n </div>\n <div class=\"step-connector\" [class.active]=\"Step === 'scopes'\"></div>\n <div class=\"step\" [class.active]=\"Step === 'scopes'\">\n <div class=\"step-number\">2</div>\n <div class=\"step-label\">Permissions</div>\n </div>\n </div>\n }\n\n <div class=\"slideout-content\">\n <!-- Configure Step -->\n @if (Step === 'configure') {\n <div class=\"step-panel\">\n <div class=\"form-section\">\n <label class=\"form-label required\">Key Label</label>\n <input class=\"mj-input form-input\" [(ngModel)]=\"Label\"\n placeholder=\"e.g., ElevenLabs Integration, CI/CD Pipeline\" />\n <div class=\"form-hint\">A memorable name to identify this key's purpose</div>\n </div>\n <div class=\"form-section\">\n <label class=\"form-label\">Description</label>\n <textarea class=\"mj-textarea form-textarea\" [(ngModel)]=\"Description\"\n placeholder=\"Optional notes about how this key will be used...\"\n [rows]=\"3\"></textarea>\n </div>\n <div class=\"form-section\">\n <label class=\"form-label\">Expiration</label>\n <div class=\"expiration-options\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [(ngModel)]=\"NeverExpires\"\n (change)=\"onNeverExpiresChange()\" />\n <span>Never expires</span>\n </label>\n @if (!NeverExpires) {\n <div class=\"preset-buttons\">\n @for (preset of ExpirationPresets; track preset) {\n <button\n class=\"preset-btn\"\n [class.active]=\"SelectedPreset === preset\"\n (click)=\"onPresetSelect(preset)\">\n {{preset.label}}\n </button>\n }\n </div>\n }\n @if (!NeverExpires && SelectedPreset?.days === -1) {\n <div class=\"custom-date\">\n <mj-datepicker [(ngModel)]=\"ExpiresAt\"\n [Min]=\"getMinDate()\"\n Format=\"MMM d, yyyy\"\n Placeholder=\"Select expiration date\">\n </mj-datepicker>\n </div>\n }\n @if (!NeverExpires && ExpiresAt) {\n <div class=\"expiration-preview\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n <span>Key will expire on {{ExpiresAt | date:'MMMM d, yyyy'}}</span>\n </div>\n }\n </div>\n </div>\n @if (Error) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{Error}}\n </div>\n }\n </div>\n }\n\n <!-- Scopes Step -->\n @if (Step === 'scopes') {\n <div class=\"step-panel scopes-step\">\n <div class=\"scopes-header\">\n <div class=\"scopes-info\">\n <h4>Select Permission Scopes</h4>\n <p>Choose what this API key can access. You can always modify this later.</p>\n </div>\n @if (getSelectedScopeCount() > 0) {\n <div class=\"scopes-count\">\n <span class=\"count\">{{getSelectedScopeCount()}}</span> selected\n </div>\n }\n </div>\n @if (IsLoadingScopes) {\n <mj-loading text=\"Loading scopes...\"></mj-loading>\n }\n @if (!IsLoadingScopes) {\n <div class=\"scope-categories\">\n @for (category of ScopeCategories; track category) {\n <div class=\"scope-category\">\n <div class=\"category-header\" (click)=\"toggleCategory(category)\">\n <div class=\"category-left\">\n <i [class]=\"category.icon\" [style.color]=\"category.color\"></i>\n <span class=\"category-name\">{{category.name}}</span>\n <span class=\"category-badge\">{{category.scopes.length}}</span>\n </div>\n <div class=\"category-right\">\n <label class=\"select-all-label\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [checked]=\"category.allSelected\"\n (change)=\"toggleCategoryAll(category)\" />\n <span>All</span>\n </label>\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!category.expanded\"\n [class.fa-chevron-up]=\"category.expanded\"></i>\n </div>\n </div>\n @if (category.expanded) {\n <div class=\"category-scopes\">\n @for (item of category.scopes; track item) {\n <div class=\"scope-item\">\n <label class=\"scope-label\">\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [(ngModel)]=\"item.selected\"\n (change)=\"updateCategoryState(category)\" />\n <div class=\"scope-info\">\n <span class=\"scope-name\">{{item.scope.Name}}</span>\n @if (item.scope.Description) {\n <span class=\"scope-desc\">\n {{item.scope.Description}}\n </span>\n }\n </div>\n </label>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <div class=\"scope-tip\">\n <i class=\"fa-solid fa-lightbulb\"></i>\n <span>Tip: Use wildcards like <code>entities:*</code> for broad access within a category</span>\n </div>\n <!-- No Scopes Warning -->\n @if (!IsLoadingScopes && getSelectedScopeCount() === 0) {\n <div class=\"no-scopes-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div>\n <strong>Warning: No permissions selected</strong>\n <p>API keys without any assigned scopes will have <strong>no permissions</strong> and cannot perform any operations. This key will be rejected by all API endpoints until scopes are assigned.</p>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Success Step -->\n @if (Step === 'success') {\n <div class=\"step-panel success-step\">\n <div class=\"success-icon\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <h3 class=\"success-title\">API Key Created Successfully!</h3>\n <div class=\"key-display\">\n <div class=\"key-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>Copy this key now. It won't be shown again!</span>\n </div>\n <div class=\"key-value\">\n <code>{{RawApiKey}}</code>\n <button class=\"copy-btn\" (click)=\"copyKey()\" [class.copied]=\"KeyCopied\">\n <i class=\"fa-solid\" [class.fa-copy]=\"!KeyCopied\" [class.fa-check]=\"KeyCopied\"></i>\n <span>{{KeyCopied ? 'Copied!' : 'Copy'}}</span>\n </button>\n </div>\n </div>\n <div class=\"key-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Label:</span>\n <span class=\"detail-value\">{{Label}}</span>\n </div>\n @if (Description) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Description:</span>\n <span class=\"detail-value\">{{Description}}</span>\n </div>\n }\n <div class=\"detail-row\">\n <span class=\"detail-label\">Expires:</span>\n <span class=\"detail-value\">\n {{NeverExpires ? 'Never' : (ExpiresAt | date:'MMMM d, yyyy')}}\n </span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Scopes:</span>\n <span class=\"detail-value\">{{getSelectedScopeCount()}} permissions</span>\n </div>\n </div>\n <div class=\"security-note\">\n <i class=\"fa-solid fa-shield-check\"></i>\n <div>\n <strong>Security Note:</strong>\n Store this key securely. We only store a hash - the original key cannot be recovered.\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"slideout-footer\">\n @if (Step === 'configure') {\n <button mjButton variant=\"primary\" (click)=\"goToScopes()\">\n Next: Permissions\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n <button mjButton (click)=\"close()\">Cancel</button>\n }\n\n @if (Step === 'scopes') {\n <button mjButton variant=\"primary\"\n [disabled]=\"IsCreating\"\n (click)=\"createKey()\">\n @if (IsCreating) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsCreating) {\n <span>\n <i class=\"fa-solid fa-key\"></i>\n Generate Key\n </span>\n }\n </button>\n <button mjButton (click)=\"goBack()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back\n </button>\n }\n\n @if (Step === 'success') {\n <button mjButton variant=\"primary\" (click)=\"close()\">\n <i class=\"fa-solid fa-check\"></i>\n Done\n </button>\n }\n </div>\n</div>\n"]}
@@ -1,5 +1,6 @@
1
1
  import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import { MJAPIKeyEntity, MJAPIScopeEntity } from '@memberjunction/core-entities';
3
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
4
  import * as i0 from "@angular/core";
4
5
  /** Scope with selection state */
5
6
  interface ScopeItem {
@@ -28,14 +29,14 @@ interface UsageLogItem {
28
29
  /**
29
30
  * Panel for viewing and editing existing API keys
30
31
  */
31
- export declare class APIKeyEditPanelComponent implements OnChanges {
32
+ export declare class APIKeyEditPanelComponent extends BaseAngularComponent implements OnChanges {
32
33
  Visible: boolean;
33
34
  KeyId: string | null;
34
35
  VisibleChange: EventEmitter<boolean>;
35
36
  Updated: EventEmitter<MJAPIKeyEntity>;
36
37
  Revoked: EventEmitter<MJAPIKeyEntity>;
37
38
  Closed: EventEmitter<void>;
38
- private md;
39
+ private get md();
39
40
  APIKey: MJAPIKeyEntity | null;
40
41
  IsLoading: boolean;
41
42
  IsSaving: boolean;