@memberjunction/ng-dashboards 5.4.1 → 5.6.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.
- package/dist/AI/components/agents/agent-configuration.component.js +4 -4
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +5 -4
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +3 -3
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +8 -7
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +3 -3
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +4 -4
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +3 -2
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +2 -2
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +4 -3
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +3 -3
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +3 -2
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +2 -2
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.js +3 -2
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +3 -2
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +2 -2
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +6 -0
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +19 -6
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -0
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +13 -4
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -0
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +13 -9
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +11 -11
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +13 -9
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +11 -11
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +4 -3
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +4 -3
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +11 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +140 -108
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +4 -1
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +9 -8
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-application.js +2 -2
- package/dist/Home/home-application.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +3 -3
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts +1 -0
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +17 -14
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +1 -0
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +15 -12
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +3 -2
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +8 -7
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +22 -22
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +2 -0
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +14 -10
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +2 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +1 -0
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +22 -18
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +1 -0
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +14 -10
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +6 -6
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +2 -2
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +3 -3
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/package.json +38 -38
|
@@ -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';\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 => 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: '#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"]}
|
|
@@ -6,7 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { Component, ViewChild } from '@angular/core';
|
|
8
8
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
9
|
-
import { RegisterClass } from '@memberjunction/global';
|
|
9
|
+
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
10
10
|
import { Metadata, RunView } from '@memberjunction/core';
|
|
11
11
|
import { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';
|
|
12
12
|
import { Subject } from 'rxjs';
|
|
@@ -1059,7 +1059,7 @@ let APIKeysResourceComponent = class APIKeysResourceComponent extends BaseResour
|
|
|
1059
1059
|
* View activity for a key
|
|
1060
1060
|
*/
|
|
1061
1061
|
onActivityClick(activity) {
|
|
1062
|
-
const key = this.APIKeys.find(k => k.ID
|
|
1062
|
+
const key = this.APIKeys.find(k => UUIDsEqual(k.ID, activity.keyId));
|
|
1063
1063
|
if (key) {
|
|
1064
1064
|
this.openEditPanel(key);
|
|
1065
1065
|
}
|