@memberjunction/ng-dashboards 5.11.0 → 5.12.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 (227) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +34 -2
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +586 -223
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +8 -0
  7. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  8. package/dist/AI/components/agents/agent-filter-panel.component.js +85 -52
  9. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  10. package/dist/AI/components/charts/performance-heatmap.component.d.ts +1 -0
  11. package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
  12. package/dist/AI/components/charts/performance-heatmap.component.js +27 -5
  13. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
  14. package/dist/AI/components/charts/time-series-chart.component.d.ts +5 -0
  15. package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
  16. package/dist/AI/components/charts/time-series-chart.component.js +23 -8
  17. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
  18. package/dist/AI/components/execution-monitoring.component.js +2 -2
  19. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  20. package/dist/AI/components/models/model-management.component.js +2 -2
  21. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
  22. package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
  23. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  24. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  25. package/dist/AI/components/prompts/prompt-version-control.component.js +2 -2
  26. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +83 -0
  27. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -0
  28. package/dist/AI/components/requests/agent-requests-resource.component.js +547 -0
  29. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -0
  30. package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
  31. package/dist/AI/components/system/system-configuration.component.js +2 -2
  32. package/dist/AI/components/widgets/kpi-card.component.js +7 -7
  33. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  34. package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
  35. package/dist/AI/components/widgets/live-execution-widget.component.js +6 -6
  36. package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
  37. package/dist/AI/index.d.ts +1 -0
  38. package/dist/AI/index.d.ts.map +1 -1
  39. package/dist/AI/index.js +2 -0
  40. package/dist/AI/index.js.map +1 -1
  41. package/dist/APIKeys/api-applications-panel.component.js +3 -3
  42. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  43. package/dist/APIKeys/api-key-create-dialog.component.js +3 -3
  44. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  45. package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
  46. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  47. package/dist/APIKeys/api-key-list.component.js +3 -3
  48. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  49. package/dist/APIKeys/api-keys-resource.component.js +1 -1
  50. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  51. package/dist/APIKeys/api-scopes-panel.component.js +2 -2
  52. package/dist/APIKeys/api-usage-panel.component.js +2 -2
  53. package/dist/Actions/components/actions-overview.component.js +2 -2
  54. package/dist/Actions/components/execution-monitoring.component.js +2 -2
  55. package/dist/Actions/components/explorer/action-breadcrumb.component.js +2 -2
  56. package/dist/Actions/components/explorer/action-card.component.js +2 -2
  57. package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
  58. package/dist/Actions/components/explorer/action-list-item.component.js +2 -2
  59. package/dist/Actions/components/explorer/action-toolbar.component.js +2 -2
  60. package/dist/Actions/components/explorer/action-tree-panel.component.js +2 -2
  61. package/dist/Actions/components/explorer/new-action-panel.component.js +2 -2
  62. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  63. package/dist/Actions/components/explorer/new-category-panel.component.js +2 -2
  64. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  65. package/dist/Communication/communication-dashboard.component.js +2 -2
  66. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  67. package/dist/Communication/communication-logs-resource.component.js +3 -3
  68. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  69. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  70. package/dist/Communication/communication-monitor-resource.component.js +5 -5
  71. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  72. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  73. package/dist/Communication/communication-providers-resource.component.js +3 -3
  74. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  75. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  76. package/dist/Communication/communication-runs-resource.component.js +3 -3
  77. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  78. package/dist/Communication/communication-templates-resource.component.js +2 -2
  79. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  80. package/dist/ComponentStudio/component-studio-dashboard.component.js +2 -2
  81. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +2 -2
  82. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +2 -2
  83. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -2
  84. package/dist/ComponentStudio/components/browser/component-browser.component.js +2 -2
  85. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +2 -2
  86. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  87. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +2 -2
  88. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  89. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +2 -2
  90. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  91. package/dist/ComponentStudio/components/editors/spec-editor.component.js +2 -2
  92. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +2 -2
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +2 -2
  95. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  96. package/dist/ComponentStudio/components/text-import-dialog.component.js +2 -2
  97. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  98. package/dist/ComponentStudio/components/workspace/component-preview.component.js +2 -2
  99. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +2 -2
  100. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  101. package/dist/Credentials/components/credentials-audit-resource.component.js +9 -9
  102. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  103. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  104. package/dist/Credentials/components/credentials-categories-resource.component.js +11 -3
  105. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  106. package/dist/Credentials/components/credentials-list-resource.component.js +2 -2
  107. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  108. package/dist/Credentials/components/credentials-overview-resource.component.js +12 -11
  109. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  110. package/dist/Credentials/components/credentials-types-resource.component.js +9 -9
  111. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  112. package/dist/Credentials/credentials-dashboard.component.js +2 -2
  113. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +2 -2
  114. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +2 -2
  115. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
  116. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +2 -2
  117. package/dist/DataExplorer/components/view-selector/view-selector.component.js +2 -2
  118. package/dist/DataExplorer/data-explorer-dashboard.component.js +4 -4
  119. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  120. package/dist/Home/home-dashboard.component.js +2 -2
  121. package/dist/Integration/components/activity/activity.component.d.ts +1 -1
  122. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  123. package/dist/Integration/components/activity/activity.component.js +5 -5
  124. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  125. package/dist/Integration/components/connections/connections.component.d.ts +31 -2
  126. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  127. package/dist/Integration/components/connections/connections.component.js +753 -412
  128. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  129. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -3
  130. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  131. package/dist/Integration/components/overview/overview.component.d.ts +0 -1
  132. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  133. package/dist/Integration/components/overview/overview.component.js +3 -6
  134. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  135. package/dist/Integration/components/pipelines/pipelines.component.js +3 -3
  136. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  137. package/dist/Integration/components/schedules/schedules.component.d.ts +20 -0
  138. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  139. package/dist/Integration/components/schedules/schedules.component.js +97 -5
  140. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  141. package/dist/Integration/components/visual-editor/visual-editor.component.js +2 -2
  142. package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
  143. package/dist/Integration/components/widgets/integration-card.component.js +5 -1
  144. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  145. package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
  146. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  147. package/dist/Integration/integration.module.d.ts +2 -1
  148. package/dist/Integration/integration.module.d.ts.map +1 -1
  149. package/dist/Integration/integration.module.js +7 -3
  150. package/dist/Integration/integration.module.js.map +1 -1
  151. package/dist/Integration/services/integration-data.service.d.ts +27 -2
  152. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  153. package/dist/Integration/services/integration-data.service.js +107 -4
  154. package/dist/Integration/services/integration-data.service.js.map +1 -1
  155. package/dist/Lists/components/lists-browse-resource.component.js +2 -2
  156. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  157. package/dist/Lists/components/lists-categories-resource.component.js +2 -2
  158. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  159. package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
  160. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  161. package/dist/Lists/components/lists-operations-resource.component.js +2 -2
  162. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  163. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +3 -3
  164. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  165. package/dist/MCP/components/mcp-connection-dialog.component.js +2 -2
  166. package/dist/MCP/components/mcp-log-detail-panel.component.js +2 -2
  167. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  168. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  169. package/dist/MCP/components/mcp-test-tool-dialog.component.js +2 -2
  170. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  171. package/dist/MCP/mcp-dashboard.component.js +2 -2
  172. package/dist/MCP/mcp-filter-panel.component.js +2 -2
  173. package/dist/QueryBrowser/query-browser-resource.component.js +7 -7
  174. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  175. package/dist/Scheduling/components/index.d.ts +0 -1
  176. package/dist/Scheduling/components/index.d.ts.map +1 -1
  177. package/dist/Scheduling/components/index.js +0 -1
  178. package/dist/Scheduling/components/index.js.map +1 -1
  179. package/dist/Scheduling/components/scheduling-activity.component.js +2 -2
  180. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +6 -9
  181. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  182. package/dist/Scheduling/components/scheduling-jobs.component.js +118 -110
  183. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  184. package/dist/Scheduling/components/scheduling-overview.component.js +3 -3
  185. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  186. package/dist/Scheduling/scheduling-dashboard.component.js +2 -2
  187. package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
  188. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  189. package/dist/Testing/components/testing-analytics.component.js +2 -2
  190. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  191. package/dist/Testing/components/testing-dashboard-tab.component.js +4 -4
  192. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  193. package/dist/Testing/components/testing-explorer.component.js +2 -2
  194. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  195. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  196. package/dist/Testing/components/testing-review.component.js +5 -5
  197. package/dist/Testing/components/testing-review.component.js.map +1 -1
  198. package/dist/Testing/components/testing-runs.component.js +2 -2
  199. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  200. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +2 -2
  201. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
  202. package/dist/Testing/components/widgets/suite-tree.component.js +4 -4
  203. package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
  204. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +2 -2
  205. package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
  206. package/dist/Testing/testing-dashboard.component.js +2 -2
  207. package/dist/VersionHistory/components/diff-resource.component.js +2 -2
  208. package/dist/VersionHistory/components/graph-resource.component.js +2 -2
  209. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  210. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  211. package/dist/VersionHistory/components/restore-resource.component.js +3 -3
  212. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  213. package/dist/__tests__/integration-data-service.test.js +1 -0
  214. package/dist/__tests__/integration-data-service.test.js.map +1 -1
  215. package/dist/module.d.ts +52 -49
  216. package/dist/module.d.ts.map +1 -1
  217. package/dist/module.js +25 -6
  218. package/dist/module.js.map +1 -1
  219. package/dist/public-api.d.ts +1 -1
  220. package/dist/public-api.d.ts.map +1 -1
  221. package/dist/public-api.js +1 -1
  222. package/dist/public-api.js.map +1 -1
  223. package/package.json +42 -40
  224. package/dist/Scheduling/components/job-slideout.component.d.ts +0 -45
  225. package/dist/Scheduling/components/job-slideout.component.d.ts.map +0 -1
  226. package/dist/Scheduling/components/job-slideout.component.js +0 -459
  227. package/dist/Scheduling/components/job-slideout.component.js.map +0 -1
@@ -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: '#6b7280'\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\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 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 await appScope.Save();\n } else if (selection.selected && existing) {\n // Update existing\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 await existing.Save();\n }\n } else if (!selection.selected && existing) {\n // Delete assignment\n await existing.Delete();\n }\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 kendoTextBox [(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 kendoTextArea [(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\" kendoCheckBox [(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 kendoButton [themeColor]=\"'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 kendoButton (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 kendoTextBox [(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 kendoTextArea [(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\" kendoCheckBox [(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\" kendoCheckBox\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\" kendoCheckBox\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 kendoTextBox [(ngModel)]=\"selection.pattern\"\n placeholder=\"*\"\n class=\"pattern-field\"\n title=\"Resource Pattern\" />\n <kendo-dropdownlist [(ngModel)]=\"selection.patternType\"\n [data]=\"['Include', 'Exclude']\"\n [valuePrimitive]=\"true\"\n class=\"type-field\"\n title=\"Pattern Type\">\n </kendo-dropdownlist>\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 kendoButton [themeColor]=\"'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 kendoButton (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 { 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\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 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 await appScope.Save();\n } else if (selection.selected && existing) {\n // Update existing\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 await existing.Save();\n }\n } else if (!selection.selected && existing) {\n // Delete assignment\n await existing.Delete();\n }\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 kendoTextBox [(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 kendoTextArea [(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\" kendoCheckBox [(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 kendoButton [themeColor]=\"'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 kendoButton (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 kendoTextBox [(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 kendoTextArea [(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\" kendoCheckBox [(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\" kendoCheckBox\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\" kendoCheckBox\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 kendoTextBox [(ngModel)]=\"selection.pattern\"\n placeholder=\"*\"\n class=\"pattern-field\"\n title=\"Resource Pattern\" />\n <kendo-dropdownlist [(ngModel)]=\"selection.patternType\"\n [data]=\"['Include', 'Exclude']\"\n [valuePrimitive]=\"true\"\n class=\"type-field\"\n title=\"Pattern Type\">\n </kendo-dropdownlist>\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 kendoButton [themeColor]=\"'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 kendoButton (click)=\"closePanel()\">Cancel</button>\n </div>\n </div>\n</div>\n"]}
@@ -468,7 +468,7 @@ export class APIKeyCreateDialogComponent {
468
468
  // Default UI config for categories without explicit configuration
469
469
  defaultUIConfig = {
470
470
  icon: 'fa-solid fa-ellipsis',
471
- color: '#6b7280'
471
+ color: 'var(--mj-text-muted)'
472
472
  };
473
473
  ngOnInit() {
474
474
  this.loadScopes();
@@ -742,11 +742,11 @@ export class APIKeyCreateDialogComponent {
742
742
  i0.ɵɵconditional(ctx.Step === "scopes" ? 15 : -1);
743
743
  i0.ɵɵadvance();
744
744
  i0.ɵɵconditional(ctx.Step === "success" ? 16 : -1);
745
- } }, dependencies: [i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.TextBoxDirective, i2.TextAreaDirective, i2.CheckBoxDirective, i3.DatePickerComponent, i4.ButtonComponent, i5.LoadingComponent, i6.DatePipe], styles: ["\n\n\n\n\n\n\n.slideout-backdrop[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 100;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.slideout-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 520px;\n height: 100%;\n max-height: 100%;\n background: var(--mj-bg-surface);\n box-shadow: -8px 0 32px var(--mj-bg-overlay);\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n\n.slideout-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n\n\n.slideout-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: var(--mj-bg-page);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n font-size: 17px;\n color: var(--mj-text-primary);\n flex: 1;\n min-width: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.slideout-close[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.slideout-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-color-neutral-700);\n}\n\n\n\n.slideout-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n}\n\n.step-panel[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.slideout-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-page);\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button {\n min-width: 100px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button-solid-primary {\n background: var(--mj-brand-primary);\n border: none;\n box-shadow: var(--mj-shadow-brand-sm);\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-brand-md);\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button i {\n margin: 0 5px;\n}\n\n\n\n.step-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, var(--mj-color-brand-100) 0%, var(--mj-color-brand-200) 100%);\n border-bottom: 1px solid var(--mj-color-accent-300);\n}\n\n.step[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n}\n\n.step-number[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-color-neutral-300);\n border-radius: 50%;\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.step.active[_ngcontent-%COMP%] .step-number[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.step.completed[_ngcontent-%COMP%] .step-number[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n border-color: var(--mj-status-success);\n color: var(--mj-text-inverse);\n}\n\n.step-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step.active[_ngcontent-%COMP%] .step-label[_ngcontent-%COMP%] {\n color: var(--mj-color-brand-800);\n font-weight: 600;\n}\n\n.step-connector[_ngcontent-%COMP%] {\n width: 80px;\n height: 2px;\n background: var(--mj-color-neutral-300);\n margin: 0 16px;\n margin-bottom: 20px;\n transition: background 0.2s ease;\n}\n\n.step-connector.active[_ngcontent-%COMP%] {\n background: linear-gradient(90deg, var(--mj-status-success), var(--mj-brand-primary));\n}\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n padding: 24px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.scopes-content[_ngcontent-%COMP%] {\n max-height: 450px;\n}\n\n\n\n.form-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.form-label[_ngcontent-%COMP%] {\n display: block;\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-color-neutral-700);\n margin-bottom: 8px;\n}\n\n.form-label.required[_ngcontent-%COMP%]::after {\n content: ' *';\n color: var(--mj-status-error);\n}\n\n.form-input[_ngcontent-%COMP%], \n.form-textarea[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 6px;\n}\n\n\n\n.expiration-options[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n color: var(--mj-color-neutral-700);\n}\n\n.preset-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.preset-btn[_ngcontent-%COMP%] {\n padding: 8px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-color-neutral-700);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.preset-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-color-brand-50);\n}\n\n.preset-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.custom-date[_ngcontent-%COMP%] {\n margin-top: 4px;\n}\n\n.expiration-preview[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--mj-color-success-50);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-color-success-600);\n}\n\n.expiration-preview[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: var(--mj-color-error-50);\n border: 1px solid var(--mj-status-error-border);\n border-radius: 8px;\n color: var(--mj-color-error-600);\n font-size: 14px;\n}\n\n\n\n.scopes-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n}\n\n.scopes-info[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.scopes-info[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.scopes-count[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-brand-primary);\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n}\n\n.scopes-count[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n font-weight: 700;\n}\n\n\n\n.scope-categories[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.scope-category[_ngcontent-%COMP%] {\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.category-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.category-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.category-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.category-left[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.category-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.category-badge[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: var(--mj-border-default);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.category-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.select-all-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.category-right[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.category-scopes[_ngcontent-%COMP%] {\n padding: 8px 16px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.scope-item[_ngcontent-%COMP%] {\n padding: 10px 0;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.scope-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.scope-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.scope-info[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.scope-name[_ngcontent-%COMP%] {\n display: block;\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-color-neutral-700);\n font-family: monospace;\n}\n\n.scope-desc[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 2px;\n}\n\n.scope-tip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: var(--mj-status-info-bg);\n border-radius: 8px;\n margin-top: 16px;\n font-size: 13px;\n color: var(--mj-status-info-text);\n}\n\n.scope-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-info);\n}\n\n.scope-tip[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: var(--mj-color-info-100);\n padding: 2px 6px;\n border-radius: 4px;\n font-family: monospace;\n}\n\n\n\n.no-scopes-warning[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, var(--mj-color-error-50) 0%, var(--mj-color-error-100) 100%);\n border: 1px solid var(--mj-status-error-border);\n border-radius: 10px;\n margin-top: 16px;\n font-size: 13px;\n color: var(--mj-color-error-700);\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--mj-color-error-600);\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n color: var(--mj-color-error-700);\n font-size: 14px;\n margin-bottom: 4px;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n line-height: 1.5;\n}\n\n\n\n.success-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.success-icon[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.success-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 64px;\n color: var(--mj-status-success);\n}\n\n.success-title[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n\n\n.key-display[_ngcontent-%COMP%] {\n background: var(--mj-color-neutral-800);\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 24px;\n}\n\n.key-warning[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 8px;\n margin-bottom: 16px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-color-accent-300);\n}\n\n.key-value[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n background: var(--mj-color-neutral-700);\n border-radius: 8px;\n padding: 12px 16px;\n}\n\n.key-value[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n flex: 1;\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 14px;\n color: var(--mj-status-success);\n word-break: break-all;\n text-align: left;\n}\n\n.copy-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-color-neutral-600);\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.copy-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-text-secondary);\n}\n\n.copy-btn.copied[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n\n\n\n.key-details[_ngcontent-%COMP%] {\n text-align: left;\n background: var(--mj-bg-page);\n border-radius: 10px;\n padding: 16px 20px;\n margin-bottom: 20px;\n}\n\n.detail-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.detail-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n\n\n.security-note[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n text-align: left;\n padding: 16px;\n background: linear-gradient(135deg, var(--mj-color-success-50) 0%, var(--mj-color-success-100) 100%);\n border-radius: 10px;\n font-size: 13px;\n color: var(--mj-color-success-800);\n}\n\n.security-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--mj-status-success);\n margin-top: 2px;\n}\n\n.security-note[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 4px;\n}\n\n\n\n[_nghost-%COMP%] .form-input .k-input, \n[_nghost-%COMP%] .form-textarea .k-input-inner, \n[_nghost-%COMP%] .k-datepicker .k-input {\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 14px;\n border-color: var(--mj-border-default);\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .form-input:focus-within, \n[_nghost-%COMP%] .form-textarea:focus-within, \n[_nghost-%COMP%] .k-datepicker:focus-within {\n box-shadow: var(--mj-focus-ring);\n}"] });
745
+ } }, dependencies: [i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.TextBoxDirective, i2.TextAreaDirective, i2.CheckBoxDirective, i3.DatePickerComponent, i4.ButtonComponent, i5.LoadingComponent, i6.DatePipe], styles: ["\n\n\n\n\n\n\n.slideout-backdrop[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 100;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.slideout-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 520px;\n height: 100%;\n max-height: 100%;\n background: var(--mj-bg-surface);\n box-shadow: -8px 0 32px var(--mj-bg-overlay);\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n\n.slideout-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n\n\n.slideout-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: var(--mj-bg-page);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n font-size: 17px;\n color: var(--mj-text-primary);\n flex: 1;\n min-width: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.slideout-close[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.slideout-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n\n\n.slideout-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n}\n\n.step-panel[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.slideout-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-page);\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button {\n min-width: 100px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button-solid-primary {\n background: var(--mj-brand-primary);\n border: none;\n box-shadow: var(--mj-shadow-brand-sm);\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-brand-md);\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button i {\n margin: 0 5px;\n}\n\n\n\n.step-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, var(--mj-color-brand-100) 0%, var(--mj-color-brand-200) 100%);\n border-bottom: 1px solid var(--mj-color-accent-300);\n}\n\n.step[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n}\n\n.step-number[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-color-neutral-300);\n border-radius: 50%;\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.step.active[_ngcontent-%COMP%] .step-number[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.step.completed[_ngcontent-%COMP%] .step-number[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n border-color: var(--mj-status-success);\n color: var(--mj-text-inverse);\n}\n\n.step-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step.active[_ngcontent-%COMP%] .step-label[_ngcontent-%COMP%] {\n color: var(--mj-color-brand-800);\n font-weight: 600;\n}\n\n.step-connector[_ngcontent-%COMP%] {\n width: 80px;\n height: 2px;\n background: var(--mj-color-neutral-300);\n margin: 0 16px;\n margin-bottom: 20px;\n transition: background 0.2s ease;\n}\n\n.step-connector.active[_ngcontent-%COMP%] {\n background: linear-gradient(90deg, var(--mj-status-success), var(--mj-brand-primary));\n}\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n padding: 24px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.scopes-content[_ngcontent-%COMP%] {\n max-height: 450px;\n}\n\n\n\n.form-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.form-label[_ngcontent-%COMP%] {\n display: block;\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin-bottom: 8px;\n}\n\n.form-label.required[_ngcontent-%COMP%]::after {\n content: ' *';\n color: var(--mj-status-error);\n}\n\n.form-input[_ngcontent-%COMP%], \n.form-textarea[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 6px;\n}\n\n\n\n.expiration-options[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.preset-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.preset-btn[_ngcontent-%COMP%] {\n padding: 8px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.preset-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-color-brand-50);\n}\n\n.preset-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.custom-date[_ngcontent-%COMP%] {\n margin-top: 4px;\n}\n\n.expiration-preview[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--mj-color-success-50);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-color-success-600);\n}\n\n.expiration-preview[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: var(--mj-color-error-50);\n border: 1px solid var(--mj-status-error-border);\n border-radius: 8px;\n color: var(--mj-color-error-600);\n font-size: 14px;\n}\n\n\n\n.scopes-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n}\n\n.scopes-info[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.scopes-info[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.scopes-count[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-brand-primary);\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n}\n\n.scopes-count[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n font-weight: 700;\n}\n\n\n\n.scope-categories[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.scope-category[_ngcontent-%COMP%] {\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.category-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.category-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.category-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.category-left[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.category-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.category-badge[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: var(--mj-border-default);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.category-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.select-all-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.category-right[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.category-scopes[_ngcontent-%COMP%] {\n padding: 8px 16px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.scope-item[_ngcontent-%COMP%] {\n padding: 10px 0;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.scope-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.scope-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.scope-info[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.scope-name[_ngcontent-%COMP%] {\n display: block;\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-family: monospace;\n}\n\n.scope-desc[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 2px;\n}\n\n.scope-tip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: var(--mj-status-info-bg);\n border-radius: 8px;\n margin-top: 16px;\n font-size: 13px;\n color: var(--mj-status-info-text);\n}\n\n.scope-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-info);\n}\n\n.scope-tip[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: var(--mj-color-info-100);\n padding: 2px 6px;\n border-radius: 4px;\n font-family: monospace;\n}\n\n\n\n.no-scopes-warning[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, var(--mj-color-error-50) 0%, var(--mj-color-error-100) 100%);\n border: 1px solid var(--mj-status-error-border);\n border-radius: 10px;\n margin-top: 16px;\n font-size: 13px;\n color: var(--mj-status-error);\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--mj-color-error-600);\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n color: var(--mj-status-error);\n font-size: 14px;\n margin-bottom: 4px;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n line-height: 1.5;\n}\n\n\n\n.success-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.success-icon[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.success-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 64px;\n color: var(--mj-status-success);\n}\n\n.success-title[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n\n\n.key-display[_ngcontent-%COMP%] {\n background: var(--mj-color-neutral-800);\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 24px;\n}\n\n.key-warning[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 8px;\n margin-bottom: 16px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-color-accent-300);\n}\n\n.key-value[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n padding: 12px 16px;\n}\n\n.key-value[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n flex: 1;\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 14px;\n color: var(--mj-status-success);\n word-break: break-all;\n text-align: left;\n}\n\n.copy-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-color-neutral-600);\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.copy-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-text-secondary);\n}\n\n.copy-btn.copied[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n\n\n\n.key-details[_ngcontent-%COMP%] {\n text-align: left;\n background: var(--mj-bg-page);\n border-radius: 10px;\n padding: 16px 20px;\n margin-bottom: 20px;\n}\n\n.detail-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.detail-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n\n\n.security-note[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n text-align: left;\n padding: 16px;\n background: linear-gradient(135deg, var(--mj-color-success-50) 0%, var(--mj-color-success-100) 100%);\n border-radius: 10px;\n font-size: 13px;\n color: var(--mj-color-success-800);\n}\n\n.security-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--mj-status-success);\n margin-top: 2px;\n}\n\n.security-note[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 4px;\n}\n\n\n\n[_nghost-%COMP%] .form-input .k-input, \n[_nghost-%COMP%] .form-textarea .k-input-inner, \n[_nghost-%COMP%] .k-datepicker .k-input {\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 14px;\n border-color: var(--mj-border-default);\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .form-input:focus-within, \n[_nghost-%COMP%] .form-textarea:focus-within, \n[_nghost-%COMP%] .k-datepicker:focus-within {\n box-shadow: var(--mj-focus-ring);\n}"] });
746
746
  }
747
747
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(APIKeyCreateDialogComponent, [{
748
748
  type: Component,
749
- args: [{ standalone: false, selector: 'mj-api-key-create-dialog', template: "<!-- 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 kendoTextBox [(ngModel)]=\"Label\"\n placeholder=\"e.g., ElevenLabs Integration, CI/CD Pipeline\"\n class=\"form-input\" />\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 kendoTextArea [(ngModel)]=\"Description\"\n placeholder=\"Optional notes about how this key will be used...\"\n [rows]=\"3\"\n class=\"form-textarea\"></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\" kendoCheckBox\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 <kendo-datepicker [(ngModel)]=\"ExpiresAt\"\n [min]=\"getMinDate()\"\n format=\"MMM d, yyyy\"\n placeholder=\"Select expiration date\">\n </kendo-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\" kendoCheckBox\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\" kendoCheckBox\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 kendoButton [themeColor]=\"'primary'\" (click)=\"goToScopes()\">\n Next: Permissions\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n <button kendoButton (click)=\"close()\">Cancel</button>\n }\n\n @if (Step === 'scopes') {\n <button kendoButton [themeColor]=\"'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 kendoButton (click)=\"goBack()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back\n </button>\n }\n\n @if (Step === 'success') {\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"close()\">\n <i class=\"fa-solid fa-check\"></i>\n Done\n </button>\n }\n </div>\n</div>\n", styles: ["/* ========================================\n Slide-out Panel Styles\n ======================================== */\n\n/* Backdrop */\n.slideout-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 100;\n animation: fadeIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Slide-out Panel */\n.slideout-panel {\n position: absolute;\n top: 0;\n right: 0;\n width: 520px;\n height: 100%;\n max-height: 100%;\n background: var(--mj-bg-surface);\n box-shadow: -8px 0 32px var(--mj-bg-overlay);\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n\n.slideout-panel.open {\n transform: translateX(0);\n}\n\n/* Panel Header */\n.slideout-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: var(--mj-bg-page);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.slideout-title {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n font-size: 17px;\n color: var(--mj-text-primary);\n flex: 1;\n min-width: 0;\n}\n\n.slideout-title i {\n color: var(--mj-brand-primary);\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.slideout-close {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.slideout-close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-color-neutral-700);\n}\n\n/* Panel Content */\n.slideout-content {\n flex: 1;\n overflow-y: auto;\n}\n\n.step-panel {\n padding: 24px;\n}\n\n/* Panel Footer */\n.slideout-footer {\n display: flex;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-page);\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n:host ::ng-deep .slideout-footer .k-button {\n min-width: 100px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .slideout-footer .k-button-solid-primary {\n background: var(--mj-brand-primary);\n border: none;\n box-shadow: var(--mj-shadow-brand-sm);\n}\n\n:host ::ng-deep .slideout-footer .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-brand-md);\n}\n\n:host ::ng-deep .slideout-footer .k-button i {\n margin: 0 5px;\n}\n\n/* Step Indicator */\n.step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, var(--mj-color-brand-100) 0%, var(--mj-color-brand-200) 100%);\n border-bottom: 1px solid var(--mj-color-accent-300);\n}\n\n.step {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n}\n\n.step-number {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-color-neutral-300);\n border-radius: 50%;\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.step.active .step-number {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.step.completed .step-number {\n background: var(--mj-status-success);\n border-color: var(--mj-status-success);\n color: var(--mj-text-inverse);\n}\n\n.step-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step.active .step-label {\n color: var(--mj-color-brand-800);\n font-weight: 600;\n}\n\n.step-connector {\n width: 80px;\n height: 2px;\n background: var(--mj-color-neutral-300);\n margin: 0 16px;\n margin-bottom: 20px;\n transition: background 0.2s ease;\n}\n\n.step-connector.active {\n background: linear-gradient(90deg, var(--mj-status-success), var(--mj-brand-primary));\n}\n\n/* Dialog Content */\n.dialog-content {\n padding: 24px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.scopes-content {\n max-height: 450px;\n}\n\n/* Form Sections */\n.form-section {\n margin-bottom: 24px;\n}\n\n.form-label {\n display: block;\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-color-neutral-700);\n margin-bottom: 8px;\n}\n\n.form-label.required::after {\n content: ' *';\n color: var(--mj-status-error);\n}\n\n.form-input,\n.form-textarea {\n width: 100%;\n}\n\n.form-hint {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 6px;\n}\n\n/* Expiration Options */\n.expiration-options {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.checkbox-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n color: var(--mj-color-neutral-700);\n}\n\n.preset-buttons {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.preset-btn {\n padding: 8px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-color-neutral-700);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.preset-btn:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-color-brand-50);\n}\n\n.preset-btn.active {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.custom-date {\n margin-top: 4px;\n}\n\n.expiration-preview {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--mj-color-success-50);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-color-success-600);\n}\n\n.expiration-preview i {\n color: var(--mj-status-success);\n}\n\n/* Error Message */\n.error-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: var(--mj-color-error-50);\n border: 1px solid var(--mj-status-error-border);\n border-radius: 8px;\n color: var(--mj-color-error-600);\n font-size: 14px;\n}\n\n/* Scopes */\n.scopes-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n}\n\n.scopes-info h4 {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.scopes-info p {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.scopes-count {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-brand-primary);\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n}\n\n.scopes-count .count {\n font-weight: 700;\n}\n\n/* Scope Categories */\n.scope-categories {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.scope-category {\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.category-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.category-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.category-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.category-left i {\n font-size: 16px;\n}\n\n.category-name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.category-badge {\n padding: 2px 8px;\n background: var(--mj-border-default);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.category-right {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.select-all-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.category-right > i {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.category-scopes {\n padding: 8px 16px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.scope-item {\n padding: 10px 0;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.scope-item:last-child {\n border-bottom: none;\n}\n\n.scope-label {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.scope-info {\n flex: 1;\n}\n\n.scope-name {\n display: block;\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-color-neutral-700);\n font-family: monospace;\n}\n\n.scope-desc {\n display: block;\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 2px;\n}\n\n.scope-tip {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: var(--mj-status-info-bg);\n border-radius: 8px;\n margin-top: 16px;\n font-size: 13px;\n color: var(--mj-status-info-text);\n}\n\n.scope-tip i {\n color: var(--mj-status-info);\n}\n\n.scope-tip code {\n background: var(--mj-color-info-100);\n padding: 2px 6px;\n border-radius: 4px;\n font-family: monospace;\n}\n\n/* No Scopes Warning */\n.no-scopes-warning {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, var(--mj-color-error-50) 0%, var(--mj-color-error-100) 100%);\n border: 1px solid var(--mj-status-error-border);\n border-radius: 10px;\n margin-top: 16px;\n font-size: 13px;\n color: var(--mj-color-error-700);\n}\n\n.no-scopes-warning i {\n font-size: 20px;\n color: var(--mj-color-error-600);\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.no-scopes-warning strong {\n display: block;\n color: var(--mj-color-error-700);\n font-size: 14px;\n margin-bottom: 4px;\n}\n\n.no-scopes-warning p {\n margin: 0;\n line-height: 1.5;\n}\n\n/* Success Content */\n.success-content {\n text-align: center;\n}\n\n.success-icon {\n margin-bottom: 16px;\n}\n\n.success-icon i {\n font-size: 64px;\n color: var(--mj-status-success);\n}\n\n.success-title {\n margin: 0 0 24px 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n/* Key Display */\n.key-display {\n background: var(--mj-color-neutral-800);\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 24px;\n}\n\n.key-warning {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 8px;\n margin-bottom: 16px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-color-accent-300);\n}\n\n.key-value {\n display: flex;\n align-items: center;\n gap: 12px;\n background: var(--mj-color-neutral-700);\n border-radius: 8px;\n padding: 12px 16px;\n}\n\n.key-value code {\n flex: 1;\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 14px;\n color: var(--mj-status-success);\n word-break: break-all;\n text-align: left;\n}\n\n.copy-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-color-neutral-600);\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.copy-btn:hover {\n background: var(--mj-text-secondary);\n}\n\n.copy-btn.copied {\n background: var(--mj-status-success);\n}\n\n/* Key Details */\n.key-details {\n text-align: left;\n background: var(--mj-bg-page);\n border-radius: 10px;\n padding: 16px 20px;\n margin-bottom: 20px;\n}\n\n.detail-row {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.detail-row:last-child {\n border-bottom: none;\n}\n\n.detail-label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.detail-value {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n/* Security Note */\n.security-note {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n text-align: left;\n padding: 16px;\n background: linear-gradient(135deg, var(--mj-color-success-50) 0%, var(--mj-color-success-100) 100%);\n border-radius: 10px;\n font-size: 13px;\n color: var(--mj-color-success-800);\n}\n\n.security-note i {\n font-size: 20px;\n color: var(--mj-status-success);\n margin-top: 2px;\n}\n\n.security-note strong {\n display: block;\n margin-bottom: 4px;\n}\n\n/* Form input styling */\n:host ::ng-deep .form-input .k-input,\n:host ::ng-deep .form-textarea .k-input-inner,\n:host ::ng-deep .k-datepicker .k-input {\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 14px;\n border-color: var(--mj-border-default);\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .form-input:focus-within,\n:host ::ng-deep .form-textarea:focus-within,\n:host ::ng-deep .k-datepicker:focus-within {\n box-shadow: var(--mj-focus-ring);\n}\n"] }]
749
+ args: [{ standalone: false, selector: 'mj-api-key-create-dialog', template: "<!-- 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 kendoTextBox [(ngModel)]=\"Label\"\n placeholder=\"e.g., ElevenLabs Integration, CI/CD Pipeline\"\n class=\"form-input\" />\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 kendoTextArea [(ngModel)]=\"Description\"\n placeholder=\"Optional notes about how this key will be used...\"\n [rows]=\"3\"\n class=\"form-textarea\"></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\" kendoCheckBox\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 <kendo-datepicker [(ngModel)]=\"ExpiresAt\"\n [min]=\"getMinDate()\"\n format=\"MMM d, yyyy\"\n placeholder=\"Select expiration date\">\n </kendo-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\" kendoCheckBox\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\" kendoCheckBox\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 kendoButton [themeColor]=\"'primary'\" (click)=\"goToScopes()\">\n Next: Permissions\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n <button kendoButton (click)=\"close()\">Cancel</button>\n }\n\n @if (Step === 'scopes') {\n <button kendoButton [themeColor]=\"'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 kendoButton (click)=\"goBack()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back\n </button>\n }\n\n @if (Step === 'success') {\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"close()\">\n <i class=\"fa-solid fa-check\"></i>\n Done\n </button>\n }\n </div>\n</div>\n", styles: ["/* ========================================\n Slide-out Panel Styles\n ======================================== */\n\n/* Backdrop */\n.slideout-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 100;\n animation: fadeIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Slide-out Panel */\n.slideout-panel {\n position: absolute;\n top: 0;\n right: 0;\n width: 520px;\n height: 100%;\n max-height: 100%;\n background: var(--mj-bg-surface);\n box-shadow: -8px 0 32px var(--mj-bg-overlay);\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n\n.slideout-panel.open {\n transform: translateX(0);\n}\n\n/* Panel Header */\n.slideout-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: var(--mj-bg-page);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.slideout-title {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n font-size: 17px;\n color: var(--mj-text-primary);\n flex: 1;\n min-width: 0;\n}\n\n.slideout-title i {\n color: var(--mj-brand-primary);\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.slideout-close {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.slideout-close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n/* Panel Content */\n.slideout-content {\n flex: 1;\n overflow-y: auto;\n}\n\n.step-panel {\n padding: 24px;\n}\n\n/* Panel Footer */\n.slideout-footer {\n display: flex;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-page);\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n:host ::ng-deep .slideout-footer .k-button {\n min-width: 100px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .slideout-footer .k-button-solid-primary {\n background: var(--mj-brand-primary);\n border: none;\n box-shadow: var(--mj-shadow-brand-sm);\n}\n\n:host ::ng-deep .slideout-footer .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-brand-md);\n}\n\n:host ::ng-deep .slideout-footer .k-button i {\n margin: 0 5px;\n}\n\n/* Step Indicator */\n.step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, var(--mj-color-brand-100) 0%, var(--mj-color-brand-200) 100%);\n border-bottom: 1px solid var(--mj-color-accent-300);\n}\n\n.step {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n}\n\n.step-number {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-color-neutral-300);\n border-radius: 50%;\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.step.active .step-number {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.step.completed .step-number {\n background: var(--mj-status-success);\n border-color: var(--mj-status-success);\n color: var(--mj-text-inverse);\n}\n\n.step-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step.active .step-label {\n color: var(--mj-color-brand-800);\n font-weight: 600;\n}\n\n.step-connector {\n width: 80px;\n height: 2px;\n background: var(--mj-color-neutral-300);\n margin: 0 16px;\n margin-bottom: 20px;\n transition: background 0.2s ease;\n}\n\n.step-connector.active {\n background: linear-gradient(90deg, var(--mj-status-success), var(--mj-brand-primary));\n}\n\n/* Dialog Content */\n.dialog-content {\n padding: 24px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.scopes-content {\n max-height: 450px;\n}\n\n/* Form Sections */\n.form-section {\n margin-bottom: 24px;\n}\n\n.form-label {\n display: block;\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin-bottom: 8px;\n}\n\n.form-label.required::after {\n content: ' *';\n color: var(--mj-status-error);\n}\n\n.form-input,\n.form-textarea {\n width: 100%;\n}\n\n.form-hint {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 6px;\n}\n\n/* Expiration Options */\n.expiration-options {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.checkbox-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.preset-buttons {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.preset-btn {\n padding: 8px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.preset-btn:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-color-brand-50);\n}\n\n.preset-btn.active {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.custom-date {\n margin-top: 4px;\n}\n\n.expiration-preview {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--mj-color-success-50);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-color-success-600);\n}\n\n.expiration-preview i {\n color: var(--mj-status-success);\n}\n\n/* Error Message */\n.error-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: var(--mj-color-error-50);\n border: 1px solid var(--mj-status-error-border);\n border-radius: 8px;\n color: var(--mj-color-error-600);\n font-size: 14px;\n}\n\n/* Scopes */\n.scopes-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n}\n\n.scopes-info h4 {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.scopes-info p {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.scopes-count {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-brand-primary);\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n}\n\n.scopes-count .count {\n font-weight: 700;\n}\n\n/* Scope Categories */\n.scope-categories {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.scope-category {\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.category-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.category-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.category-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.category-left i {\n font-size: 16px;\n}\n\n.category-name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.category-badge {\n padding: 2px 8px;\n background: var(--mj-border-default);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.category-right {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.select-all-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.category-right > i {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.category-scopes {\n padding: 8px 16px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.scope-item {\n padding: 10px 0;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.scope-item:last-child {\n border-bottom: none;\n}\n\n.scope-label {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.scope-info {\n flex: 1;\n}\n\n.scope-name {\n display: block;\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-family: monospace;\n}\n\n.scope-desc {\n display: block;\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 2px;\n}\n\n.scope-tip {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: var(--mj-status-info-bg);\n border-radius: 8px;\n margin-top: 16px;\n font-size: 13px;\n color: var(--mj-status-info-text);\n}\n\n.scope-tip i {\n color: var(--mj-status-info);\n}\n\n.scope-tip code {\n background: var(--mj-color-info-100);\n padding: 2px 6px;\n border-radius: 4px;\n font-family: monospace;\n}\n\n/* No Scopes Warning */\n.no-scopes-warning {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, var(--mj-color-error-50) 0%, var(--mj-color-error-100) 100%);\n border: 1px solid var(--mj-status-error-border);\n border-radius: 10px;\n margin-top: 16px;\n font-size: 13px;\n color: var(--mj-status-error);\n}\n\n.no-scopes-warning i {\n font-size: 20px;\n color: var(--mj-color-error-600);\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.no-scopes-warning strong {\n display: block;\n color: var(--mj-status-error);\n font-size: 14px;\n margin-bottom: 4px;\n}\n\n.no-scopes-warning p {\n margin: 0;\n line-height: 1.5;\n}\n\n/* Success Content */\n.success-content {\n text-align: center;\n}\n\n.success-icon {\n margin-bottom: 16px;\n}\n\n.success-icon i {\n font-size: 64px;\n color: var(--mj-status-success);\n}\n\n.success-title {\n margin: 0 0 24px 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n/* Key Display */\n.key-display {\n background: var(--mj-color-neutral-800);\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 24px;\n}\n\n.key-warning {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 8px;\n margin-bottom: 16px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-color-accent-300);\n}\n\n.key-value {\n display: flex;\n align-items: center;\n gap: 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n padding: 12px 16px;\n}\n\n.key-value code {\n flex: 1;\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 14px;\n color: var(--mj-status-success);\n word-break: break-all;\n text-align: left;\n}\n\n.copy-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-color-neutral-600);\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.copy-btn:hover {\n background: var(--mj-text-secondary);\n}\n\n.copy-btn.copied {\n background: var(--mj-status-success);\n}\n\n/* Key Details */\n.key-details {\n text-align: left;\n background: var(--mj-bg-page);\n border-radius: 10px;\n padding: 16px 20px;\n margin-bottom: 20px;\n}\n\n.detail-row {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.detail-row:last-child {\n border-bottom: none;\n}\n\n.detail-label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.detail-value {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n/* Security Note */\n.security-note {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n text-align: left;\n padding: 16px;\n background: linear-gradient(135deg, var(--mj-color-success-50) 0%, var(--mj-color-success-100) 100%);\n border-radius: 10px;\n font-size: 13px;\n color: var(--mj-color-success-800);\n}\n\n.security-note i {\n font-size: 20px;\n color: var(--mj-status-success);\n margin-top: 2px;\n}\n\n.security-note strong {\n display: block;\n margin-bottom: 4px;\n}\n\n/* Form input styling */\n:host ::ng-deep .form-input .k-input,\n:host ::ng-deep .form-textarea .k-input-inner,\n:host ::ng-deep .k-datepicker .k-input {\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 14px;\n border-color: var(--mj-border-default);\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .form-input:focus-within,\n:host ::ng-deep .form-textarea:focus-within,\n:host ::ng-deep .k-datepicker:focus-within {\n box-shadow: var(--mj-focus-ring);\n}\n"] }]
750
750
  }], null, { Visible: [{
751
751
  type: Input
752
752
  }], VisibleChange: [{