@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.
Files changed (123) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +4 -4
  2. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  3. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.js +5 -4
  5. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  6. package/dist/AI/components/models/model-management.component.js +3 -3
  7. package/dist/AI/components/models/model-management.component.js.map +1 -1
  8. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  9. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +8 -7
  10. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  11. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  12. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  13. package/dist/AI/components/system/system-configuration.component.js +4 -4
  14. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  15. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  16. package/dist/APIKeys/api-applications-panel.component.js +3 -2
  17. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  18. package/dist/APIKeys/api-keys-resource.component.js +2 -2
  19. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  20. package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-scopes-panel.component.js +4 -3
  22. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  23. package/dist/Actions/components/actions-overview.component.js +3 -3
  24. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  25. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  26. package/dist/Actions/components/categories-list-view.component.js +3 -2
  27. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  28. package/dist/Actions/components/execution-monitoring.component.js +2 -2
  29. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  30. package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
  31. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  32. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
  33. package/dist/Actions/components/explorer/new-action-panel.component.js +3 -2
  34. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  35. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
  36. package/dist/Actions/components/explorer/new-category-panel.component.js +3 -2
  37. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  38. package/dist/Communication/communication-templates-resource.component.js +2 -2
  39. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  40. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +6 -0
  41. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  42. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +19 -6
  43. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  44. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -0
  45. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  46. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +13 -4
  47. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  48. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -0
  49. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  50. package/dist/Credentials/components/credentials-categories-resource.component.js +13 -9
  51. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  52. package/dist/Credentials/components/credentials-list-resource.component.js +11 -11
  53. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  54. package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
  55. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  56. package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -0
  57. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  58. package/dist/Credentials/components/credentials-types-resource.component.js +13 -9
  59. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  60. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +11 -11
  61. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  62. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  63. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +4 -3
  64. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  65. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  66. package/dist/DataExplorer/components/view-selector/view-selector.component.js +4 -3
  67. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  68. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +11 -0
  69. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  70. package/dist/DataExplorer/data-explorer-dashboard.component.js +140 -108
  71. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  72. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  73. package/dist/DataExplorer/data-explorer-resource.component.js +4 -1
  74. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  75. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  76. package/dist/DataExplorer/services/explorer-state.service.js +9 -8
  77. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  78. package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
  79. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  80. package/dist/Home/home-application.js +2 -2
  81. package/dist/Home/home-application.js.map +1 -1
  82. package/dist/Lists/components/lists-browse-resource.component.js +3 -3
  83. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  84. package/dist/Lists/components/lists-categories-resource.component.d.ts +1 -0
  85. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  86. package/dist/Lists/components/lists-categories-resource.component.js +17 -14
  87. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  88. package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
  89. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  90. package/dist/Lists/components/lists-operations-resource.component.d.ts +1 -0
  91. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  92. package/dist/Lists/components/lists-operations-resource.component.js +15 -12
  93. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  94. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
  95. package/dist/MCP/components/mcp-connection-dialog.component.js +3 -2
  96. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  97. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -1
  98. package/dist/MCP/components/mcp-test-tool-dialog.component.js +8 -7
  99. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  100. package/dist/MCP/mcp-dashboard.component.js +22 -22
  101. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  102. package/dist/QueryBrowser/query-browser-resource.component.d.ts +2 -0
  103. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  104. package/dist/QueryBrowser/query-browser-resource.component.js +14 -10
  105. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  106. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  107. package/dist/Scheduling/services/scheduling-instrumentation.service.js +2 -1
  108. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  109. package/dist/Testing/components/testing-explorer.component.d.ts +1 -0
  110. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  111. package/dist/Testing/components/testing-explorer.component.js +22 -18
  112. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  113. package/dist/Testing/components/testing-review.component.d.ts +1 -0
  114. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  115. package/dist/Testing/components/testing-review.component.js +14 -10
  116. package/dist/Testing/components/testing-review.component.js.map +1 -1
  117. package/dist/VersionHistory/components/diff-resource.component.js +6 -6
  118. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  119. package/dist/VersionHistory/components/graph-resource.component.js +2 -2
  120. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  121. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  122. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  123. package/package.json +38 -38
@@ -1 +1 @@
1
- {"version":3,"file":"credentials-categories-resource.component.js","sourceRoot":"","sources":["../../../src/Credentials/components/credentials-categories-resource.component.ts","../../../src/Credentials/components/credentials-categories-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { ResourceData, MJCredentialCategoryEntity, MJCredentialTypeEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { RunView, Metadata } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CredentialCategoryEditPanelComponent } from '@memberjunction/ng-credentials';\ninterface CategoryNode {\n category: MJCredentialCategoryEntity;\n children: CategoryNode[];\n expanded: boolean;\n level: number;\n typeCount: number;\n}\n\n@RegisterClass(BaseResourceComponent, 'CredentialsCategoriesResource')\n@Component({\n standalone: false,\n selector: 'mj-credentials-categories-resource',\n templateUrl: './credentials-categories-resource.component.html',\n styleUrls: ['./credentials-categories-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CredentialsCategoriesResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = true;\n public categories: MJCredentialCategoryEntity[] = [];\n public categoryTree: CategoryNode[] = [];\n public types: MJCredentialTypeEntity[] = [];\n public selectedNode: CategoryNode | null = null;\n public searchText = '';\n\n // Permissions\n private _metadata = new Metadata();\n private _permissionCache = new Map<string, boolean>();\n\n @ViewChild('categoryEditPanel') categoryEditPanel!: CredentialCategoryEditPanelComponent;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private navigationService: NavigationService\n ) {\n super();\n }\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Categories';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-folder-tree';\n }\n\n // === Permission Checks ===\n\n public get UserCanCreate(): boolean {\n return this.checkEntityPermission('MJ: Credential Categories', 'Create');\n }\n\n public get UserCanUpdate(): boolean {\n return this.checkEntityPermission('MJ: Credential Categories', 'Update');\n }\n\n public get UserCanDelete(): boolean {\n return this.checkEntityPermission('MJ: Credential Categories', 'Delete');\n }\n\n private checkEntityPermission(entityName: string, permissionType: 'Create' | 'Read' | 'Update' | 'Delete'): boolean {\n const cacheKey = `${entityName}_${permissionType}`;\n\n if (this._permissionCache.has(cacheKey)) {\n return this._permissionCache.get(cacheKey)!;\n }\n\n try {\n const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);\n if (!entityInfo) {\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n\n const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);\n let hasPermission = false;\n\n switch (permissionType) {\n case 'Create': hasPermission = userPermissions.CanCreate; break;\n case 'Read': hasPermission = userPermissions.CanRead; break;\n case 'Update': hasPermission = userPermissions.CanUpdate; break;\n case 'Delete': hasPermission = userPermissions.CanDelete; break;\n }\n\n this._permissionCache.set(cacheKey, hasPermission);\n return hasPermission;\n } catch (error) {\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.markForCheck();\n\n const rv = new RunView();\n const [catResult, typeResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Credential Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Credential Types',\n ResultType: 'entity_object'\n }\n ]);\n\n if (catResult.Success) {\n this.categories = catResult.Results as MJCredentialCategoryEntity[];\n }\n\n if (typeResult.Success) {\n this.types = typeResult.Results as MJCredentialTypeEntity[];\n }\n\n this.buildTree();\n\n } catch (error) {\n console.error('Error loading credential categories:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error loading categories', 'error', 3000);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n private buildTree(): void {\n const categoryMap = new Map<string, CategoryNode>();\n\n // Create nodes for all categories with stats\n for (const category of this.categories) {\n const typesInCategory = this.types.filter(t => t.Category === category.Name);\n categoryMap.set(category.ID, {\n category,\n children: [],\n expanded: true,\n level: 0,\n typeCount: typesInCategory.length\n });\n }\n\n // Build tree structure\n const roots: CategoryNode[] = [];\n for (const category of this.categories) {\n const node = categoryMap.get(category.ID)!;\n if (category.ParentID) {\n const parent = categoryMap.get(category.ParentID);\n if (parent) {\n node.level = parent.level + 1;\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n } else {\n roots.push(node);\n }\n }\n\n // Sort children recursively\n const sortNodes = (nodes: CategoryNode[]): void => {\n nodes.sort((a, b) => a.category.Name.localeCompare(b.category.Name));\n for (const node of nodes) {\n sortNodes(node.children);\n }\n };\n sortNodes(roots);\n\n this.categoryTree = roots;\n }\n\n // === CRUD Operations ===\n\n public createNewCategory(): void {\n if (this.categoryEditPanel) {\n this.categoryEditPanel.open(null);\n }\n }\n\n public createChildCategory(parentNode: CategoryNode, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.categoryEditPanel) {\n this.categoryEditPanel.open(null, parentNode.category.ID);\n }\n }\n\n public editCategory(node: CategoryNode, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.categoryEditPanel) {\n this.categoryEditPanel.open(node.category);\n }\n }\n\n public async deleteCategory(node: CategoryNode, event?: Event): Promise<void> {\n if (event) {\n event.stopPropagation();\n }\n\n if (!this.UserCanDelete) {\n MJNotificationService.Instance.CreateSimpleNotification('You do not have permission to delete categories', 'warning', 3000);\n return;\n }\n\n if (node.children.length > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Cannot delete \"${node.category.Name}\" - it has ${node.children.length} subcategories`,\n 'warning',\n 4000\n );\n return;\n }\n\n if (node.typeCount > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Cannot delete \"${node.category.Name}\" - it has ${node.typeCount} credential type(s) using it`,\n 'warning',\n 4000\n );\n return;\n }\n\n const confirmed = confirm(`Are you sure you want to delete \"${node.category.Name}\"? This action cannot be undone.`);\n if (!confirmed) return;\n\n try {\n const success = await node.category.Delete();\n if (success) {\n MJNotificationService.Instance.CreateSimpleNotification(`Category \"${node.category.Name}\" deleted successfully`, 'success', 3000);\n this.categories = this.categories.filter(c => c.ID !== node.category.ID);\n if (this.selectedNode?.category.ID === node.category.ID) {\n this.selectedNode = null;\n }\n this.buildTree();\n this.cdr.markForCheck();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to delete category', 'error', 3000);\n }\n } catch (error) {\n console.error('Error deleting category:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error deleting category', 'error', 3000);\n }\n }\n\n // === Panel Event Handlers ===\n\n public onCategorySaved(category: MJCredentialCategoryEntity): void {\n const existingIndex = this.categories.findIndex(c => c.ID === category.ID);\n\n if (existingIndex >= 0) {\n this.categories[existingIndex] = category;\n } else {\n this.categories.push(category);\n }\n\n this.buildTree();\n this.cdr.markForCheck();\n }\n\n public onCategoryDeleted(categoryId: string): void {\n this.categories = this.categories.filter(c => c.ID !== categoryId);\n if (this.selectedNode?.category.ID === categoryId) {\n this.selectedNode = null;\n }\n this.buildTree();\n this.cdr.markForCheck();\n }\n\n // === Selection ===\n\n public selectNode(node: CategoryNode): void {\n this.selectedNode = this.selectedNode?.category.ID === node.category.ID ? null : node;\n this.cdr.markForCheck();\n }\n\n public toggleExpand(node: CategoryNode, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n node.expanded = !node.expanded;\n this.cdr.markForCheck();\n }\n\n // === Search ===\n\n public onSearchChange(value: string): void {\n this.searchText = value;\n if (value) {\n this.expandAll();\n }\n this.cdr.markForCheck();\n }\n\n public clearSearch(): void {\n this.searchText = '';\n this.cdr.markForCheck();\n }\n\n public expandAll(): void {\n const expand = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n node.expanded = true;\n expand(node.children);\n }\n };\n expand(this.categoryTree);\n this.cdr.markForCheck();\n }\n\n public collapseAll(): void {\n const collapse = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n node.expanded = false;\n collapse(node.children);\n }\n };\n collapse(this.categoryTree);\n this.cdr.markForCheck();\n }\n\n public getFlattenedNodes(): CategoryNode[] {\n const result: CategoryNode[] = [];\n const searchLower = this.searchText.toLowerCase().trim();\n\n const flatten = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n if (searchLower) {\n const matches = this.nodeMatchesSearch(node, searchLower);\n if (matches) {\n result.push(node);\n }\n } else {\n result.push(node);\n }\n\n if (node.expanded && node.children.length > 0) {\n flatten(node.children);\n }\n }\n };\n\n flatten(this.categoryTree);\n return result;\n }\n\n private nodeMatchesSearch(node: CategoryNode, searchLower: string): boolean {\n const nameMatch = node.category.Name.toLowerCase().includes(searchLower);\n const descMatch = node.category.Description?.toLowerCase().includes(searchLower);\n return nameMatch || descMatch || false;\n }\n\n public getTotalTypeCount(): number {\n return this.types.length;\n }\n\n public getTypesForCategory(categoryName: string): MJCredentialTypeEntity[] {\n return this.types.filter(t => t.Category === categoryName);\n }\n\n public createCredentialWithCategory(categoryId: string, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n // Navigate to Credentials nav item with the category pre-selected and create panel open\n this.navigationService.OpenNavItemByName('Credentials', {\n categoryId: categoryId,\n openCreatePanel: true\n });\n }\n\n public viewTypesForCategory(categoryName: string, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n // Navigate to Types nav item filtered by this category\n this.navigationService.OpenNavItemByName('Types', {\n categoryFilter: categoryName\n });\n }\n\n public getCategoryColor(index: number): string {\n const colors = ['#6366f1', '#8b5cf6', '#ec4899', '#f59e0b', '#10b981', '#3b82f6', '#06b6d4'];\n return colors[index % colors.length];\n }\n\n public refresh(): void {\n this.selectedNode = null;\n this.loadData();\n }\n}\n","<div class=\"categories-container\">\n @if (isLoading) {\n <mj-loading text=\"Loading categories...\"></mj-loading>\n }\n\n @if (!isLoading) {\n <!-- Header -->\n <div class=\"categories-header\">\n <div class=\"header-info\">\n <h2 class=\"categories-title\">Categories</h2>\n <div class=\"header-stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n {{categories.length}} categories\n </span>\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-shapes\"></i>\n {{getTotalTypeCount()}} types\n </span>\n </div>\n </div>\n <div class=\"header-actions\">\n @if (UserCanCreate) {\n <button class=\"btn-primary\" (click)=\"createNewCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Category</span>\n </button>\n }\n </div>\n </div>\n <!-- Toolbar -->\n <div class=\"toolbar\">\n <div class=\"toolbar-left\">\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Search categories...\"\n [value]=\"searchText\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n @if (searchText) {\n <button class=\"search-clear\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n <div class=\"toolbar-right\">\n <button class=\"btn-text\" (click)=\"expandAll()\" title=\"Expand All\">\n <i class=\"fa-solid fa-expand\"></i>\n </button>\n <button class=\"btn-text\" (click)=\"collapseAll()\" title=\"Collapse All\">\n <i class=\"fa-solid fa-compress\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n <div class=\"categories-layout\">\n <!-- Tree Container -->\n <div class=\"tree-panel\">\n @if (categoryTree.length > 0) {\n <div class=\"tree-container\">\n @for (node of getFlattenedNodes(); track node; let i = $index) {\n <div\n class=\"tree-node\"\n [class.selected]=\"selectedNode?.category?.ID === node.category.ID\"\n [style.padding-left.px]=\"12 + (node.level * 20)\"\n (click)=\"selectNode(node)\"\n >\n <div class=\"node-content\">\n @if (node.children.length > 0) {\n <button\n class=\"expand-btn\"\n (click)=\"toggleExpand(node, $event)\"\n >\n <i [class]=\"node.expanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n </button>\n }\n @if (node.children.length === 0) {\n <span class=\"expand-placeholder\"></span>\n }\n <div class=\"node-icon\" [style.backgroundColor]=\"getCategoryColor(i) + '15'\" [style.color]=\"getCategoryColor(i)\">\n <i [class]=\"node.category.IconClass || 'fa-solid fa-folder'\"></i>\n </div>\n <div class=\"node-info\">\n <div class=\"node-name\">{{node.category.Name}}</div>\n @if (node.category.Description) {\n <div class=\"node-description\">\n {{node.category.Description | slice:0:50}}{{node.category.Description.length > 50 ? '...' : ''}}\n </div>\n }\n </div>\n <div class=\"node-badges\">\n @if (node.typeCount > 0) {\n <span class=\"badge types\">\n <i class=\"fa-solid fa-shapes\"></i>\n {{node.typeCount}}\n </span>\n }\n @if (node.children.length > 0) {\n <span class=\"badge children\">\n <i class=\"fa-solid fa-folder\"></i>\n {{node.children.length}}\n </span>\n }\n </div>\n <div class=\"node-actions\">\n @if (UserCanUpdate) {\n <button\n class=\"action-btn\"\n (click)=\"editCategory(node, $event)\"\n title=\"Edit\"\n >\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete && node.children.length === 0 && node.typeCount === 0) {\n <button\n class=\"action-btn danger\"\n (click)=\"deleteCategory(node, $event)\"\n title=\"Delete\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n @if (categoryTree.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </div>\n <h3>No Categories</h3>\n @if (searchText) {\n <p>\n No categories match your search.\n <button class=\"btn-link\" (click)=\"clearSearch()\">Clear search</button>\n </p>\n }\n @if (!searchText) {\n <p>\n Get started by creating your first category.\n </p>\n }\n @if (UserCanCreate && !searchText) {\n <button class=\"btn-primary\" (click)=\"createNewCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Category\n </button>\n }\n </div>\n }\n </div>\n <!-- Detail Panel -->\n @if (selectedNode) {\n <div class=\"detail-panel\">\n <div class=\"detail-header\">\n <div class=\"detail-icon\" [style.backgroundColor]=\"getCategoryColor(0) + '15'\" [style.color]=\"getCategoryColor(0)\">\n <i [class]=\"selectedNode.category.IconClass || 'fa-solid fa-folder'\"></i>\n </div>\n <div class=\"detail-title\">\n <h2>{{selectedNode.category.Name}}</h2>\n @if (selectedNode.level > 0) {\n <span class=\"level-badge\">\n Level {{selectedNode.level + 1}}\n </span>\n }\n </div>\n <div class=\"detail-actions\">\n @if (UserCanUpdate) {\n <button class=\"action-btn\" (click)=\"editCategory(selectedNode)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n <button class=\"close-btn\" (click)=\"selectedNode = null\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"detail-body\">\n <!-- Stats -->\n <div class=\"detail-stats\">\n <div class=\"detail-stat\">\n <div class=\"stat-value\">{{selectedNode.typeCount}}</div>\n <div class=\"stat-label\">Credential Types</div>\n </div>\n <div class=\"detail-stat\">\n <div class=\"stat-value\">{{selectedNode.children.length}}</div>\n <div class=\"stat-label\">Subcategories</div>\n </div>\n </div>\n <!-- Description -->\n @if (selectedNode.category.Description) {\n <div class=\"description-section\">\n <h3>\n <i class=\"fa-solid fa-align-left\"></i>\n Description\n </h3>\n <p class=\"description\">{{selectedNode.category.Description}}</p>\n </div>\n }\n <!-- Types in Category -->\n @if (selectedNode.typeCount > 0) {\n <div class=\"types-section\">\n <h3>\n <i class=\"fa-solid fa-shapes\"></i>\n Credential Types\n </h3>\n <div class=\"type-list\">\n @for (type of getTypesForCategory(selectedNode.category.Name); track type) {\n <div class=\"type-item\">\n <div class=\"type-icon\">\n <i [class]=\"type.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"type-info\">\n <div class=\"type-name\">{{type.Name}}</div>\n @if (type.Description) {\n <div class=\"type-desc\">{{type.Description | slice:0:60}}</div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Subcategories -->\n @if (selectedNode.children.length > 0) {\n <div class=\"subcategories-section\">\n <h3>\n <i class=\"fa-solid fa-folder-tree\"></i>\n Subcategories\n </h3>\n <div class=\"subcategory-list\">\n @for (child of selectedNode.children; track child) {\n <div class=\"subcategory-item\" (click)=\"selectNode(child)\">\n <i [class]=\"child.category.IconClass || 'fa-solid fa-folder'\"></i>\n <span>{{child.category.Name}}</span>\n @if (child.typeCount > 0) {\n <span class=\"sub-type-count\">{{child.typeCount}} types</span>\n }\n </div>\n }\n </div>\n </div>\n }\n <!-- Quick Actions -->\n <div class=\"detail-quick-actions\">\n @if (selectedNode.typeCount > 0) {\n <button\n class=\"btn-secondary\"\n (click)=\"viewTypesForCategory(selectedNode.category.Name)\"\n >\n <i class=\"fa-solid fa-shapes\"></i>\n View Types\n </button>\n }\n <button\n class=\"btn-primary\"\n (click)=\"createCredentialWithCategory(selectedNode.category.ID)\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n Create Credential\n </button>\n </div>\n </div>\n </div>\n }\n <!-- No Selection -->\n @if (!selectedNode && categoryTree.length > 0) {\n <div class=\"no-selection\">\n <div class=\"no-selection-icon\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n </div>\n <h3>Select a Category</h3>\n <p>Click on a category to view its details and credential types</p>\n </div>\n }\n </div>\n }\n</div>\n\n<!-- Category Edit Panel -->\n<mj-credential-category-edit-panel\n #categoryEditPanel\n (saved)=\"onCategorySaved($any($event))\"\n (deleted)=\"onCategoryDeleted($any($event))\"\n></mj-credential-category-edit-panel>\n"]}
1
+ {"version":3,"file":"credentials-categories-resource.component.js","sourceRoot":"","sources":["../../../src/Credentials/components/credentials-categories-resource.component.ts","../../../src/Credentials/components/credentials-categories-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { ResourceData, MJCredentialCategoryEntity, MJCredentialTypeEntity } from '@memberjunction/core-entities';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { RunView, Metadata } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CredentialCategoryEditPanelComponent } from '@memberjunction/ng-credentials';\ninterface CategoryNode {\n category: MJCredentialCategoryEntity;\n children: CategoryNode[];\n expanded: boolean;\n level: number;\n typeCount: number;\n}\n\n@RegisterClass(BaseResourceComponent, 'CredentialsCategoriesResource')\n@Component({\n standalone: false,\n selector: 'mj-credentials-categories-resource',\n templateUrl: './credentials-categories-resource.component.html',\n styleUrls: ['./credentials-categories-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CredentialsCategoriesResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = true;\n public categories: MJCredentialCategoryEntity[] = [];\n public categoryTree: CategoryNode[] = [];\n public types: MJCredentialTypeEntity[] = [];\n public selectedNode: CategoryNode | null = null;\n public searchText = '';\n\n // Permissions\n private _metadata = new Metadata();\n private _permissionCache = new Map<string, boolean>();\n\n @ViewChild('categoryEditPanel') categoryEditPanel!: CredentialCategoryEditPanelComponent;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private navigationService: NavigationService\n ) {\n super();\n }\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Categories';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-folder-tree';\n }\n\n // === Permission Checks ===\n\n public get UserCanCreate(): boolean {\n return this.checkEntityPermission('MJ: Credential Categories', 'Create');\n }\n\n public get UserCanUpdate(): boolean {\n return this.checkEntityPermission('MJ: Credential Categories', 'Update');\n }\n\n public get UserCanDelete(): boolean {\n return this.checkEntityPermission('MJ: Credential Categories', 'Delete');\n }\n\n private checkEntityPermission(entityName: string, permissionType: 'Create' | 'Read' | 'Update' | 'Delete'): boolean {\n const cacheKey = `${entityName}_${permissionType}`;\n\n if (this._permissionCache.has(cacheKey)) {\n return this._permissionCache.get(cacheKey)!;\n }\n\n try {\n const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);\n if (!entityInfo) {\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n\n const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);\n let hasPermission = false;\n\n switch (permissionType) {\n case 'Create': hasPermission = userPermissions.CanCreate; break;\n case 'Read': hasPermission = userPermissions.CanRead; break;\n case 'Update': hasPermission = userPermissions.CanUpdate; break;\n case 'Delete': hasPermission = userPermissions.CanDelete; break;\n }\n\n this._permissionCache.set(cacheKey, hasPermission);\n return hasPermission;\n } catch (error) {\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.markForCheck();\n\n const rv = new RunView();\n const [catResult, typeResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Credential Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Credential Types',\n ResultType: 'entity_object'\n }\n ]);\n\n if (catResult.Success) {\n this.categories = catResult.Results as MJCredentialCategoryEntity[];\n }\n\n if (typeResult.Success) {\n this.types = typeResult.Results as MJCredentialTypeEntity[];\n }\n\n this.buildTree();\n\n } catch (error) {\n console.error('Error loading credential categories:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error loading categories', 'error', 3000);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n private buildTree(): void {\n const categoryMap = new Map<string, CategoryNode>();\n\n // Create nodes for all categories with stats\n for (const category of this.categories) {\n const typesInCategory = this.types.filter(t => t.Category === category.Name);\n categoryMap.set(category.ID, {\n category,\n children: [],\n expanded: true,\n level: 0,\n typeCount: typesInCategory.length\n });\n }\n\n // Build tree structure\n const roots: CategoryNode[] = [];\n for (const category of this.categories) {\n const node = categoryMap.get(category.ID)!;\n if (category.ParentID) {\n const parent = categoryMap.get(category.ParentID);\n if (parent) {\n node.level = parent.level + 1;\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n } else {\n roots.push(node);\n }\n }\n\n // Sort children recursively\n const sortNodes = (nodes: CategoryNode[]): void => {\n nodes.sort((a, b) => a.category.Name.localeCompare(b.category.Name));\n for (const node of nodes) {\n sortNodes(node.children);\n }\n };\n sortNodes(roots);\n\n this.categoryTree = roots;\n }\n\n // === CRUD Operations ===\n\n public createNewCategory(): void {\n if (this.categoryEditPanel) {\n this.categoryEditPanel.open(null);\n }\n }\n\n public createChildCategory(parentNode: CategoryNode, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.categoryEditPanel) {\n this.categoryEditPanel.open(null, parentNode.category.ID);\n }\n }\n\n public editCategory(node: CategoryNode, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.categoryEditPanel) {\n this.categoryEditPanel.open(node.category);\n }\n }\n\n public async deleteCategory(node: CategoryNode, event?: Event): Promise<void> {\n if (event) {\n event.stopPropagation();\n }\n\n if (!this.UserCanDelete) {\n MJNotificationService.Instance.CreateSimpleNotification('You do not have permission to delete categories', 'warning', 3000);\n return;\n }\n\n if (node.children.length > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Cannot delete \"${node.category.Name}\" - it has ${node.children.length} subcategories`,\n 'warning',\n 4000\n );\n return;\n }\n\n if (node.typeCount > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Cannot delete \"${node.category.Name}\" - it has ${node.typeCount} credential type(s) using it`,\n 'warning',\n 4000\n );\n return;\n }\n\n const confirmed = confirm(`Are you sure you want to delete \"${node.category.Name}\"? This action cannot be undone.`);\n if (!confirmed) return;\n\n try {\n const success = await node.category.Delete();\n if (success) {\n MJNotificationService.Instance.CreateSimpleNotification(`Category \"${node.category.Name}\" deleted successfully`, 'success', 3000);\n this.categories = this.categories.filter(c => !UUIDsEqual(c.ID, node.category.ID));\n if (UUIDsEqual(this.selectedNode?.category.ID, node.category.ID)) {\n this.selectedNode = null;\n }\n this.buildTree();\n this.cdr.markForCheck();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to delete category', 'error', 3000);\n }\n } catch (error) {\n console.error('Error deleting category:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error deleting category', 'error', 3000);\n }\n }\n\n // === Panel Event Handlers ===\n\n public onCategorySaved(category: MJCredentialCategoryEntity): void {\n const existingIndex = this.categories.findIndex(c => UUIDsEqual(c.ID, category.ID));\n\n if (existingIndex >= 0) {\n this.categories[existingIndex] = category;\n } else {\n this.categories.push(category);\n }\n\n this.buildTree();\n this.cdr.markForCheck();\n }\n\n public onCategoryDeleted(categoryId: string): void {\n this.categories = this.categories.filter(c => !UUIDsEqual(c.ID, categoryId));\n if (UUIDsEqual(this.selectedNode?.category.ID, categoryId)) {\n this.selectedNode = null;\n }\n this.buildTree();\n this.cdr.markForCheck();\n }\n\n // === Selection ===\n\n public selectNode(node: CategoryNode): void {\n this.selectedNode = UUIDsEqual(this.selectedNode?.category.ID, node.category.ID) ? null : node;\n this.cdr.markForCheck();\n }\n\n public toggleExpand(node: CategoryNode, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n node.expanded = !node.expanded;\n this.cdr.markForCheck();\n }\n\n // === Search ===\n\n public onSearchChange(value: string): void {\n this.searchText = value;\n if (value) {\n this.expandAll();\n }\n this.cdr.markForCheck();\n }\n\n public clearSearch(): void {\n this.searchText = '';\n this.cdr.markForCheck();\n }\n\n public expandAll(): void {\n const expand = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n node.expanded = true;\n expand(node.children);\n }\n };\n expand(this.categoryTree);\n this.cdr.markForCheck();\n }\n\n public collapseAll(): void {\n const collapse = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n node.expanded = false;\n collapse(node.children);\n }\n };\n collapse(this.categoryTree);\n this.cdr.markForCheck();\n }\n\n public getFlattenedNodes(): CategoryNode[] {\n const result: CategoryNode[] = [];\n const searchLower = this.searchText.toLowerCase().trim();\n\n const flatten = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n if (searchLower) {\n const matches = this.nodeMatchesSearch(node, searchLower);\n if (matches) {\n result.push(node);\n }\n } else {\n result.push(node);\n }\n\n if (node.expanded && node.children.length > 0) {\n flatten(node.children);\n }\n }\n };\n\n flatten(this.categoryTree);\n return result;\n }\n\n private nodeMatchesSearch(node: CategoryNode, searchLower: string): boolean {\n const nameMatch = node.category.Name.toLowerCase().includes(searchLower);\n const descMatch = node.category.Description?.toLowerCase().includes(searchLower);\n return nameMatch || descMatch || false;\n }\n\n public getTotalTypeCount(): number {\n return this.types.length;\n }\n\n public getTypesForCategory(categoryName: string): MJCredentialTypeEntity[] {\n return this.types.filter(t => t.Category === categoryName);\n }\n\n public createCredentialWithCategory(categoryId: string, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n // Navigate to Credentials nav item with the category pre-selected and create panel open\n this.navigationService.OpenNavItemByName('Credentials', {\n categoryId: categoryId,\n openCreatePanel: true\n });\n }\n\n public viewTypesForCategory(categoryName: string, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n // Navigate to Types nav item filtered by this category\n this.navigationService.OpenNavItemByName('Types', {\n categoryFilter: categoryName\n });\n }\n\n /** Case-insensitive UUID check whether a tree node is the currently selected node. */\n public IsNodeSelected(node: CategoryNode): boolean {\n return UUIDsEqual(this.selectedNode?.category?.ID, node.category.ID);\n }\n\n public getCategoryColor(index: number): string {\n const colors = ['#6366f1', '#8b5cf6', '#ec4899', '#f59e0b', '#10b981', '#3b82f6', '#06b6d4'];\n return colors[index % colors.length];\n }\n\n public refresh(): void {\n this.selectedNode = null;\n this.loadData();\n }\n}\n","<div class=\"categories-container\">\n @if (isLoading) {\n <mj-loading text=\"Loading categories...\"></mj-loading>\n }\n\n @if (!isLoading) {\n <!-- Header -->\n <div class=\"categories-header\">\n <div class=\"header-info\">\n <h2 class=\"categories-title\">Categories</h2>\n <div class=\"header-stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n {{categories.length}} categories\n </span>\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-shapes\"></i>\n {{getTotalTypeCount()}} types\n </span>\n </div>\n </div>\n <div class=\"header-actions\">\n @if (UserCanCreate) {\n <button class=\"btn-primary\" (click)=\"createNewCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Category</span>\n </button>\n }\n </div>\n </div>\n <!-- Toolbar -->\n <div class=\"toolbar\">\n <div class=\"toolbar-left\">\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Search categories...\"\n [value]=\"searchText\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n @if (searchText) {\n <button class=\"search-clear\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n <div class=\"toolbar-right\">\n <button class=\"btn-text\" (click)=\"expandAll()\" title=\"Expand All\">\n <i class=\"fa-solid fa-expand\"></i>\n </button>\n <button class=\"btn-text\" (click)=\"collapseAll()\" title=\"Collapse All\">\n <i class=\"fa-solid fa-compress\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n <div class=\"categories-layout\">\n <!-- Tree Container -->\n <div class=\"tree-panel\">\n @if (categoryTree.length > 0) {\n <div class=\"tree-container\">\n @for (node of getFlattenedNodes(); track node; let i = $index) {\n <div\n class=\"tree-node\"\n [class.selected]=\"IsNodeSelected(node)\"\n [style.padding-left.px]=\"12 + (node.level * 20)\"\n (click)=\"selectNode(node)\"\n >\n <div class=\"node-content\">\n @if (node.children.length > 0) {\n <button\n class=\"expand-btn\"\n (click)=\"toggleExpand(node, $event)\"\n >\n <i [class]=\"node.expanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n </button>\n }\n @if (node.children.length === 0) {\n <span class=\"expand-placeholder\"></span>\n }\n <div class=\"node-icon\" [style.backgroundColor]=\"getCategoryColor(i) + '15'\" [style.color]=\"getCategoryColor(i)\">\n <i [class]=\"node.category.IconClass || 'fa-solid fa-folder'\"></i>\n </div>\n <div class=\"node-info\">\n <div class=\"node-name\">{{node.category.Name}}</div>\n @if (node.category.Description) {\n <div class=\"node-description\">\n {{node.category.Description | slice:0:50}}{{node.category.Description.length > 50 ? '...' : ''}}\n </div>\n }\n </div>\n <div class=\"node-badges\">\n @if (node.typeCount > 0) {\n <span class=\"badge types\">\n <i class=\"fa-solid fa-shapes\"></i>\n {{node.typeCount}}\n </span>\n }\n @if (node.children.length > 0) {\n <span class=\"badge children\">\n <i class=\"fa-solid fa-folder\"></i>\n {{node.children.length}}\n </span>\n }\n </div>\n <div class=\"node-actions\">\n @if (UserCanUpdate) {\n <button\n class=\"action-btn\"\n (click)=\"editCategory(node, $event)\"\n title=\"Edit\"\n >\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete && node.children.length === 0 && node.typeCount === 0) {\n <button\n class=\"action-btn danger\"\n (click)=\"deleteCategory(node, $event)\"\n title=\"Delete\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n @if (categoryTree.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </div>\n <h3>No Categories</h3>\n @if (searchText) {\n <p>\n No categories match your search.\n <button class=\"btn-link\" (click)=\"clearSearch()\">Clear search</button>\n </p>\n }\n @if (!searchText) {\n <p>\n Get started by creating your first category.\n </p>\n }\n @if (UserCanCreate && !searchText) {\n <button class=\"btn-primary\" (click)=\"createNewCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Category\n </button>\n }\n </div>\n }\n </div>\n <!-- Detail Panel -->\n @if (selectedNode) {\n <div class=\"detail-panel\">\n <div class=\"detail-header\">\n <div class=\"detail-icon\" [style.backgroundColor]=\"getCategoryColor(0) + '15'\" [style.color]=\"getCategoryColor(0)\">\n <i [class]=\"selectedNode.category.IconClass || 'fa-solid fa-folder'\"></i>\n </div>\n <div class=\"detail-title\">\n <h2>{{selectedNode.category.Name}}</h2>\n @if (selectedNode.level > 0) {\n <span class=\"level-badge\">\n Level {{selectedNode.level + 1}}\n </span>\n }\n </div>\n <div class=\"detail-actions\">\n @if (UserCanUpdate) {\n <button class=\"action-btn\" (click)=\"editCategory(selectedNode)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n <button class=\"close-btn\" (click)=\"selectedNode = null\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"detail-body\">\n <!-- Stats -->\n <div class=\"detail-stats\">\n <div class=\"detail-stat\">\n <div class=\"stat-value\">{{selectedNode.typeCount}}</div>\n <div class=\"stat-label\">Credential Types</div>\n </div>\n <div class=\"detail-stat\">\n <div class=\"stat-value\">{{selectedNode.children.length}}</div>\n <div class=\"stat-label\">Subcategories</div>\n </div>\n </div>\n <!-- Description -->\n @if (selectedNode.category.Description) {\n <div class=\"description-section\">\n <h3>\n <i class=\"fa-solid fa-align-left\"></i>\n Description\n </h3>\n <p class=\"description\">{{selectedNode.category.Description}}</p>\n </div>\n }\n <!-- Types in Category -->\n @if (selectedNode.typeCount > 0) {\n <div class=\"types-section\">\n <h3>\n <i class=\"fa-solid fa-shapes\"></i>\n Credential Types\n </h3>\n <div class=\"type-list\">\n @for (type of getTypesForCategory(selectedNode.category.Name); track type) {\n <div class=\"type-item\">\n <div class=\"type-icon\">\n <i [class]=\"type.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"type-info\">\n <div class=\"type-name\">{{type.Name}}</div>\n @if (type.Description) {\n <div class=\"type-desc\">{{type.Description | slice:0:60}}</div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Subcategories -->\n @if (selectedNode.children.length > 0) {\n <div class=\"subcategories-section\">\n <h3>\n <i class=\"fa-solid fa-folder-tree\"></i>\n Subcategories\n </h3>\n <div class=\"subcategory-list\">\n @for (child of selectedNode.children; track child) {\n <div class=\"subcategory-item\" (click)=\"selectNode(child)\">\n <i [class]=\"child.category.IconClass || 'fa-solid fa-folder'\"></i>\n <span>{{child.category.Name}}</span>\n @if (child.typeCount > 0) {\n <span class=\"sub-type-count\">{{child.typeCount}} types</span>\n }\n </div>\n }\n </div>\n </div>\n }\n <!-- Quick Actions -->\n <div class=\"detail-quick-actions\">\n @if (selectedNode.typeCount > 0) {\n <button\n class=\"btn-secondary\"\n (click)=\"viewTypesForCategory(selectedNode.category.Name)\"\n >\n <i class=\"fa-solid fa-shapes\"></i>\n View Types\n </button>\n }\n <button\n class=\"btn-primary\"\n (click)=\"createCredentialWithCategory(selectedNode.category.ID)\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n Create Credential\n </button>\n </div>\n </div>\n </div>\n }\n <!-- No Selection -->\n @if (!selectedNode && categoryTree.length > 0) {\n <div class=\"no-selection\">\n <div class=\"no-selection-icon\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n </div>\n <h3>Select a Category</h3>\n <p>Click on a category to view its details and credential types</p>\n </div>\n }\n </div>\n }\n</div>\n\n<!-- Category Edit Panel -->\n<mj-credential-category-edit-panel\n #categoryEditPanel\n (saved)=\"onCategorySaved($any($event))\"\n (deleted)=\"onCategoryDeleted($any($event))\"\n></mj-credential-category-edit-panel>\n"]}
@@ -6,7 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { Component, ChangeDetectionStrategy, ViewChild } from '@angular/core';
8
8
  import { Subject } from 'rxjs';
9
- import { RegisterClass } from '@memberjunction/global';
9
+ import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
10
10
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
11
11
  import { RunView, Metadata } from '@memberjunction/core';
12
12
  import { MJNotificationService } from '@memberjunction/ng-notifications';
@@ -782,7 +782,7 @@ let CredentialsListResourceComponent = class CredentialsListResourceComponent ex
782
782
  }
783
783
  onCredentialSaved(credential) {
784
784
  // Check if it's a new credential or update
785
- const existingIndex = this.credentials.findIndex(c => c.ID === credential.ID);
785
+ const existingIndex = this.credentials.findIndex(c => UUIDsEqual(c.ID, credential.ID));
786
786
  if (existingIndex >= 0) {
787
787
  // Update existing
788
788
  this.credentials[existingIndex] = credential;
@@ -795,7 +795,7 @@ let CredentialsListResourceComponent = class CredentialsListResourceComponent ex
795
795
  this.cdr.markForCheck();
796
796
  }
797
797
  onCredentialDeleted(credentialId) {
798
- this.credentials = this.credentials.filter(c => c.ID !== credentialId);
798
+ this.credentials = this.credentials.filter(c => !UUIDsEqual(c.ID, credentialId));
799
799
  this.selectedCredentials.delete(credentialId);
800
800
  this.applyFilters();
801
801
  this.cdr.markForCheck();
@@ -815,7 +815,7 @@ let CredentialsListResourceComponent = class CredentialsListResourceComponent ex
815
815
  const success = await credential.Delete();
816
816
  if (success) {
817
817
  MJNotificationService.Instance.CreateSimpleNotification(`Credential "${credential.Name}" deleted successfully`, 'success', 3000);
818
- this.credentials = this.credentials.filter(c => c.ID !== credential.ID);
818
+ this.credentials = this.credentials.filter(c => !UUIDsEqual(c.ID, credential.ID));
819
819
  this.selectedCredentials.delete(credential.ID);
820
820
  this.applyFilters();
821
821
  }
@@ -906,13 +906,13 @@ let CredentialsListResourceComponent = class CredentialsListResourceComponent ex
906
906
  let successCount = 0;
907
907
  let failCount = 0;
908
908
  for (const credId of this.selectedCredentials) {
909
- const credential = this.credentials.find(c => c.ID === credId);
909
+ const credential = this.credentials.find(c => UUIDsEqual(c.ID, credId));
910
910
  if (credential) {
911
911
  try {
912
912
  const success = await credential.Delete();
913
913
  if (success) {
914
914
  successCount++;
915
- this.credentials = this.credentials.filter(c => c.ID !== credId);
915
+ this.credentials = this.credentials.filter(c => !UUIDsEqual(c.ID, credId));
916
916
  }
917
917
  else {
918
918
  failCount++;
@@ -986,7 +986,7 @@ let CredentialsListResourceComponent = class CredentialsListResourceComponent ex
986
986
  }
987
987
  // Filter by type
988
988
  if (this.selectedTypeFilter) {
989
- filtered = filtered.filter(c => c.CredentialTypeID === this.selectedTypeFilter);
989
+ filtered = filtered.filter(c => UUIDsEqual(c.CredentialTypeID, this.selectedTypeFilter));
990
990
  }
991
991
  // Filter by search text
992
992
  if (this.searchText.trim()) {
@@ -1006,7 +1006,7 @@ let CredentialsListResourceComponent = class CredentialsListResourceComponent ex
1006
1006
  }
1007
1007
  // === Helpers ===
1008
1008
  getTypeById(typeId) {
1009
- return this.types.find(t => t.ID === typeId);
1009
+ return this.types.find(t => UUIDsEqual(t.ID, typeId));
1010
1010
  }
1011
1011
  getTypesByCategory() {
1012
1012
  const grouped = new Map();
@@ -1161,7 +1161,7 @@ let CredentialsListResourceComponent = class CredentialsListResourceComponent ex
1161
1161
  let successCount = 0;
1162
1162
  let failCount = 0;
1163
1163
  for (const credId of this.selectedCredentials) {
1164
- const credential = this.credentials.find(c => c.ID === credId);
1164
+ const credential = this.credentials.find(c => UUIDsEqual(c.ID, credId));
1165
1165
  if (credential && credential.IsActive !== active) {
1166
1166
  try {
1167
1167
  credential.IsActive = active;
@@ -1200,13 +1200,13 @@ let CredentialsListResourceComponent = class CredentialsListResourceComponent ex
1200
1200
  let successCount = 0;
1201
1201
  let failCount = 0;
1202
1202
  for (const credId of this.selectedCredentials) {
1203
- const credential = this.credentials.find(c => c.ID === credId);
1203
+ const credential = this.credentials.find(c => UUIDsEqual(c.ID, credId));
1204
1204
  if (credential) {
1205
1205
  try {
1206
1206
  const success = await credential.Delete();
1207
1207
  if (success) {
1208
1208
  successCount++;
1209
- this.credentials = this.credentials.filter(c => c.ID !== credId);
1209
+ this.credentials = this.credentials.filter(c => !UUIDsEqual(c.ID, credId));
1210
1210
  }
1211
1211
  else {
1212
1212
  failCount++;