@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":"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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1209
|
+
this.credentials = this.credentials.filter(c => !UUIDsEqual(c.ID, credId));
|
|
1210
1210
|
}
|
|
1211
1211
|
else {
|
|
1212
1212
|
failCount++;
|