@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-types-resource.component.js","sourceRoot":"","sources":["../../../src/Credentials/components/credentials-types-resource.component.ts","../../../src/Credentials/components/credentials-types-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { ResourceData, MJCredentialTypeEntity, MJCredentialEntity } 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 { CredentialTypeEditPanelComponent } from '@memberjunction/ng-credentials';\ninterface FieldSchemaProperty {\n name: string;\n type: string;\n title: string;\n description: string;\n isSecret: boolean;\n required: boolean;\n}\n\ninterface TypeWithStats extends MJCredentialTypeEntity {\n credentialCount: number;\n activeCount: number;\n expiringCount: number;\n}\n\n@RegisterClass(BaseResourceComponent, 'CredentialsTypesResource')\n@Component({\n standalone: false,\n selector: 'mj-credentials-types-resource',\n templateUrl: './credentials-types-resource.component.html',\n styleUrls: ['./credentials-types-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CredentialsTypesResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = true;\n public types: TypeWithStats[] = [];\n public filteredTypes: TypeWithStats[] = [];\n public credentials: MJCredentialEntity[] = [];\n public selectedType: TypeWithStats | null = null;\n public schemaProperties: FieldSchemaProperty[] = [];\n\n // Filters\n public searchText = '';\n public selectedCategoryFilter = '';\n public categories: string[] = [];\n\n // Permissions\n private _metadata = new Metadata();\n private _permissionCache = new Map<string, boolean>();\n\n @ViewChild('typeEditPanel') typeEditPanel!: CredentialTypeEditPanelComponent;\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 'Credential Types';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-cubes';\n }\n\n // === Permission Checks ===\n\n public get UserCanCreate(): boolean {\n return this.checkEntityPermission('MJ: Credential Types', 'Create');\n }\n\n public get UserCanUpdate(): boolean {\n return this.checkEntityPermission('MJ: Credential Types', 'Update');\n }\n\n public get UserCanDelete(): boolean {\n return this.checkEntityPermission('MJ: Credential Types', 'Delete');\n }\n\n public get UserCanCreateCredential(): boolean {\n return this.checkEntityPermission('MJ: Credentials', 'Create');\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 [typeResult, credResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Credential Types',\n OrderBy: 'Category, Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Credentials',\n ResultType: 'entity_object'\n }\n ]);\n\n if (typeResult.Success) {\n const baseTypes = typeResult.Results as MJCredentialTypeEntity[];\n this.credentials = credResult.Success ? credResult.Results as MJCredentialEntity[] : [];\n\n // Calculate stats for each type\n this.types = baseTypes.map(type => this.enrichTypeWithStats(type));\n\n // Extract unique categories\n this.categories = [...new Set(this.types.map(t => t.Category))].sort();\n }\n\n // Apply any navigation config (e.g., category filter from Categories nav item)\n this.handleNavigationConfig();\n\n this.applyFilters();\n\n } catch (error) {\n console.error('Error loading credential types:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error loading credential types', 'error', 3000);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n private handleNavigationConfig(): void {\n const config = this.Data?.Configuration;\n if (!config) {\n return;\n }\n\n // Apply category filter from navigation config\n if (config.categoryFilter) {\n this.selectedCategoryFilter = config.categoryFilter as string;\n }\n }\n\n private enrichTypeWithStats(type: MJCredentialTypeEntity): TypeWithStats {\n const typeCredentials = this.credentials.filter(c => c.CredentialTypeID === type.ID);\n const now = new Date();\n const thirtyDaysFromNow = new Date();\n thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);\n\n // Add stats properties directly to the entity object\n const enrichedType = type as TypeWithStats;\n enrichedType.credentialCount = typeCredentials.length;\n enrichedType.activeCount = typeCredentials.filter(c => c.IsActive).length;\n enrichedType.expiringCount = typeCredentials.filter(c =>\n c.ExpiresAt &&\n new Date(c.ExpiresAt) >= now &&\n new Date(c.ExpiresAt) <= thirtyDaysFromNow\n ).length;\n\n return enrichedType;\n }\n\n // === CRUD Operations ===\n\n public createNewType(): void {\n if (this.typeEditPanel) {\n this.typeEditPanel.open(null);\n }\n }\n\n public editType(type: TypeWithStats, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.typeEditPanel) {\n this.typeEditPanel.open(type);\n }\n }\n\n public async deleteType(type: TypeWithStats, 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 credential types', 'warning', 3000);\n return;\n }\n\n if (type.credentialCount > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Cannot delete \"${type.Name}\" - it has ${type.credentialCount} credential(s) using it`,\n 'warning',\n 4000\n );\n return;\n }\n\n const confirmed = confirm(`Are you sure you want to delete \"${type.Name}\"? This action cannot be undone.`);\n if (!confirmed) return;\n\n try {\n const success = await type.Delete();\n if (success) {\n MJNotificationService.Instance.CreateSimpleNotification(`Credential type \"${type.Name}\" deleted successfully`, 'success', 3000);\n this.types = this.types.filter(t => t.ID !== type.ID);\n if (this.selectedType?.ID === type.ID) {\n this.closeDetail();\n }\n this.applyFilters();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credential type', 'error', 3000);\n }\n } catch (error) {\n console.error('Error deleting credential type:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error deleting credential type', 'error', 3000);\n }\n }\n\n public createCredentialForType(type: TypeWithStats, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n // Navigate to Credentials nav item with the type pre-selected and create panel open\n this.navigationService.OpenNavItemByName('Credentials', {\n typeId: type.ID,\n openCreatePanel: true\n });\n }\n\n // === Panel Event Handlers ===\n\n public onTypeSaved(type: MJCredentialTypeEntity): void {\n const existingIndex = this.types.findIndex(t => t.ID === type.ID);\n const enrichedType = this.enrichTypeWithStats(type);\n\n if (existingIndex >= 0) {\n this.types[existingIndex] = enrichedType;\n } else {\n this.types.unshift(enrichedType);\n }\n\n // Update categories if a new one was added\n if (!this.categories.includes(type.Category)) {\n this.categories = [...new Set(this.types.map(t => t.Category))].sort();\n }\n\n this.applyFilters();\n this.cdr.markForCheck();\n }\n\n public onTypeDeleted(typeId: string): void {\n this.types = this.types.filter(t => t.ID !== typeId);\n if (this.selectedType?.ID === typeId) {\n this.closeDetail();\n }\n this.applyFilters();\n this.cdr.markForCheck();\n }\n\n // === Filtering ===\n\n public onSearchChange(value: string): void {\n this.searchText = value;\n this.applyFilters();\n }\n\n public onCategoryFilterChange(category: string): void {\n this.selectedCategoryFilter = category;\n this.applyFilters();\n }\n\n public clearFilters(): void {\n this.searchText = '';\n this.selectedCategoryFilter = '';\n this.applyFilters();\n }\n\n private applyFilters(): void {\n let filtered = [...this.types];\n\n // Filter by category\n if (this.selectedCategoryFilter) {\n filtered = filtered.filter(t => t.Category === this.selectedCategoryFilter);\n }\n\n // Filter by search text\n if (this.searchText.trim()) {\n const search = this.searchText.toLowerCase().trim();\n filtered = filtered.filter(t =>\n t.Name.toLowerCase().includes(search) ||\n (t.Description && t.Description.toLowerCase().includes(search)) ||\n t.Category.toLowerCase().includes(search)\n );\n }\n\n this.filteredTypes = filtered;\n this.cdr.markForCheck();\n }\n\n // === Selection ===\n\n public selectType(type: TypeWithStats): void {\n this.selectedType = type;\n this.parseFieldSchema(type.FieldSchema);\n this.cdr.markForCheck();\n }\n\n public closeDetail(): void {\n this.selectedType = null;\n this.schemaProperties = [];\n this.cdr.markForCheck();\n }\n\n private parseFieldSchema(schemaJson: string): void {\n try {\n const schema = JSON.parse(schemaJson) as { properties?: Record<string, Record<string, unknown>>; required?: string[] };\n const properties = schema.properties || {};\n const required = schema.required || [];\n\n this.schemaProperties = Object.entries(properties).map(([name, prop]) => ({\n name,\n type: (prop.type as string) || 'string',\n title: (prop.title as string) || name,\n description: (prop.description as string) || '',\n isSecret: prop.isSecret === true,\n required: required.includes(name)\n }));\n\n // Sort by order if available, otherwise by name\n this.schemaProperties.sort((a, b) => {\n const propA = properties[a.name];\n const propB = properties[b.name];\n const orderA = typeof propA.order === 'number' ? propA.order : 999;\n const orderB = typeof propB.order === 'number' ? propB.order : 999;\n return orderA - orderB;\n });\n\n } catch (e) {\n console.error('Failed to parse field schema:', e);\n this.schemaProperties = [];\n }\n }\n\n // === Helpers ===\n\n public getCategoryIcon(category: string): string {\n const iconMap: Record<string, string> = {\n 'AI': 'fa-solid fa-brain',\n 'Communication': 'fa-solid fa-envelope',\n 'Storage': 'fa-solid fa-cloud',\n 'Database': 'fa-solid fa-database',\n 'Authentication': 'fa-solid fa-shield-halved',\n 'Integration': 'fa-solid fa-plug'\n };\n return iconMap[category] || 'fa-solid fa-key';\n }\n\n public getCategoryColor(category: string): string {\n const colorMap: Record<string, string> = {\n 'AI': '#8b5cf6',\n 'Communication': '#3b82f6',\n 'Storage': '#06b6d4',\n 'Database': '#f59e0b',\n 'Authentication': '#10b981',\n 'Integration': '#ec4899'\n };\n return colorMap[category] || '#6366f1';\n }\n\n public getTypesByCategory(): Map<string, TypeWithStats[]> {\n const grouped = new Map<string, TypeWithStats[]>();\n for (const type of this.filteredTypes) {\n const category = type.Category;\n if (!grouped.has(category)) {\n grouped.set(category, []);\n }\n grouped.get(category)!.push(type);\n }\n return grouped;\n }\n\n public getTotalCredentialCount(): number {\n return this.types.reduce((sum, t) => sum + t.credentialCount, 0);\n }\n\n public refresh(): void {\n this.loadData();\n }\n}\n","<div class=\"types-container\">\n @if (isLoading) {\n <mj-loading text=\"Loading credential types...\"></mj-loading>\n }\n\n @if (!isLoading) {\n <!-- Header -->\n <div class=\"types-header\">\n <div class=\"header-info\">\n <h2 class=\"types-title\">Credential Types</h2>\n <div class=\"header-stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-shapes\"></i>\n {{types.length}} types\n </span>\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-folder\"></i>\n {{categories.length}} categories\n </span>\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-key\"></i>\n {{getTotalCredentialCount()}} credentials\n </span>\n </div>\n </div>\n <div class=\"header-actions\">\n @if (UserCanCreate) {\n <button class=\"btn-primary\" (click)=\"createNewType()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Type</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 types...\"\n [value]=\"searchText\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n @if (searchText) {\n <button class=\"search-clear\" (click)=\"onSearchChange('')\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <select\n class=\"filter-select\"\n [value]=\"selectedCategoryFilter\"\n (change)=\"onCategoryFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Categories</option>\n @for (cat of categories; track cat) {\n <option [value]=\"cat\">{{cat}}</option>\n }\n </select>\n </div>\n <div class=\"toolbar-right\">\n <div class=\"results-info\">\n {{filteredTypes.length}} of {{types.length}} types\n </div>\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=\"types-layout\">\n <!-- Types List -->\n <div class=\"types-list\">\n @for (entry of getTypesByCategory() | keyvalue; track entry) {\n <div class=\"category-section\">\n <div class=\"category-header\" [style.borderLeftColor]=\"getCategoryColor(entry.key)\">\n <i [class]=\"getCategoryIcon(entry.key)\" [style.color]=\"getCategoryColor(entry.key)\"></i>\n <span class=\"category-name\">{{entry.key}}</span>\n <span class=\"count\">{{entry.value.length}}</span>\n </div>\n <div class=\"type-items\">\n @for (type of entry.value; track type) {\n <div\n class=\"type-item\"\n [class.selected]=\"selectedType?.ID === type.ID\"\n (click)=\"selectType(type)\"\n >\n <div class=\"type-icon\" [style.backgroundColor]=\"getCategoryColor(type.Category) + '15'\" [style.color]=\"getCategoryColor(type.Category)\">\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-description\">\n {{type.Description | slice:0:60}}{{type.Description.length > 60 ? '...' : ''}}\n </div>\n }\n <div class=\"type-meta\">\n @if (type.credentialCount > 0) {\n <span class=\"meta-badge\">\n <i class=\"fa-solid fa-key\"></i>\n {{type.credentialCount}}\n </span>\n }\n @if (type.activeCount > 0) {\n <span class=\"meta-badge active\">\n <i class=\"fa-solid fa-check\"></i>\n {{type.activeCount}} active\n </span>\n }\n @if (type.expiringCount > 0) {\n <span class=\"meta-badge warning\">\n <i class=\"fa-solid fa-clock\"></i>\n {{type.expiringCount}} expiring\n </span>\n }\n </div>\n </div>\n <div class=\"type-actions\">\n @if (UserCanCreateCredential) {\n <button\n class=\"action-btn\"\n (click)=\"createCredentialForType(type, $event)\"\n title=\"Add Credential\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n @if (UserCanUpdate) {\n <button\n class=\"action-btn\"\n (click)=\"editType(type, $event)\"\n title=\"Edit Type\"\n >\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete && type.credentialCount === 0) {\n <button\n class=\"action-btn danger\"\n (click)=\"deleteType(type, $event)\"\n title=\"Delete Type\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n <i class=\"fa-solid fa-chevron-right arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n @if (filteredTypes.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-cubes\"></i>\n </div>\n <h3>No Credential Types Found</h3>\n @if (searchText || selectedCategoryFilter) {\n <p>\n No types match your current filters.\n <button class=\"btn-link\" (click)=\"clearFilters()\">Clear filters</button>\n </p>\n }\n @if (!searchText && !selectedCategoryFilter) {\n <p>\n Get started by creating your first credential type.\n </p>\n }\n @if (UserCanCreate && !searchText && !selectedCategoryFilter) {\n <button class=\"btn-primary\" (click)=\"createNewType()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Type\n </button>\n }\n </div>\n }\n </div>\n <!-- Type Detail -->\n @if (selectedType) {\n <div class=\"type-detail\">\n <div class=\"detail-header\">\n <div class=\"detail-icon\" [style.backgroundColor]=\"getCategoryColor(selectedType.Category) + '15'\" [style.color]=\"getCategoryColor(selectedType.Category)\">\n <i [class]=\"selectedType.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"detail-title\">\n <h2>{{selectedType.Name}}</h2>\n <span class=\"category-badge\" [style.backgroundColor]=\"getCategoryColor(selectedType.Category) + '20'\" [style.color]=\"getCategoryColor(selectedType.Category)\">\n <i [class]=\"getCategoryIcon(selectedType.Category)\"></i>\n {{selectedType.Category}}\n </span>\n </div>\n <div class=\"detail-actions\">\n @if (UserCanUpdate) {\n <button class=\"action-btn\" (click)=\"editType(selectedType)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n <button class=\"close-btn\" (click)=\"closeDetail()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"detail-body\">\n <!-- Stats Row -->\n <div class=\"detail-stats\">\n <div class=\"detail-stat\">\n <div class=\"stat-value\">{{selectedType.credentialCount}}</div>\n <div class=\"stat-label\">Credentials</div>\n </div>\n <div class=\"detail-stat active\">\n <div class=\"stat-value\">{{selectedType.activeCount}}</div>\n <div class=\"stat-label\">Active</div>\n </div>\n @if (selectedType.expiringCount > 0) {\n <div class=\"detail-stat warning\">\n <div class=\"stat-value\">{{selectedType.expiringCount}}</div>\n <div class=\"stat-label\">Expiring</div>\n </div>\n }\n </div>\n @if (selectedType.Description) {\n <p class=\"description\">\n {{selectedType.Description}}\n </p>\n }\n <div class=\"schema-section\">\n <h3>\n <i class=\"fa-solid fa-list-check\"></i>\n Field Schema\n </h3>\n @if (schemaProperties.length > 0) {\n <div class=\"field-list\">\n @for (prop of schemaProperties; track prop) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{prop.title}}</span>\n <span class=\"field-badges\">\n <span class=\"badge type\">{{prop.type}}</span>\n @if (prop.isSecret) {\n <span class=\"badge secret\">\n <i class=\"fa-solid fa-lock\"></i> Secret\n </span>\n }\n @if (prop.required) {\n <span class=\"badge required\">Required</span>\n }\n </span>\n </div>\n @if (prop.description) {\n <p class=\"field-description\">\n {{prop.description}}\n </p>\n }\n </div>\n }\n </div>\n }\n @if (schemaProperties.length === 0) {\n <div class=\"no-fields\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>No fields defined in schema</span>\n </div>\n }\n </div>\n @if (selectedType.ValidationEndpoint) {\n <div class=\"validation-section\">\n <h3>\n <i class=\"fa-solid fa-check-circle\"></i>\n Validation\n </h3>\n <div class=\"validation-endpoint\">\n <i class=\"fa-solid fa-link\"></i>\n <span>{{selectedType.ValidationEndpoint}}</span>\n </div>\n </div>\n }\n <!-- Quick Actions -->\n @if (UserCanCreateCredential) {\n <div class=\"detail-quick-actions\">\n <button class=\"btn-primary\" (click)=\"createCredentialForType(selectedType)\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Credential\n </button>\n </div>\n }\n </div>\n </div>\n }\n <!-- No Selection -->\n @if (!selectedType && filteredTypes.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 Credential Type</h3>\n <p>Click on a credential type to view its details and field schema</p>\n </div>\n }\n </div>\n }\n</div>\n\n<!-- Type Edit Panel -->\n<mj-credential-type-edit-panel\n #typeEditPanel\n (saved)=\"onTypeSaved($any($event))\"\n (deleted)=\"onTypeDeleted($any($event))\"\n></mj-credential-type-edit-panel>\n"]}
|
|
1
|
+
{"version":3,"file":"credentials-types-resource.component.js","sourceRoot":"","sources":["../../../src/Credentials/components/credentials-types-resource.component.ts","../../../src/Credentials/components/credentials-types-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { ResourceData, MJCredentialTypeEntity, MJCredentialEntity } 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 { CredentialTypeEditPanelComponent } from '@memberjunction/ng-credentials';\ninterface FieldSchemaProperty {\n name: string;\n type: string;\n title: string;\n description: string;\n isSecret: boolean;\n required: boolean;\n}\n\ninterface TypeWithStats extends MJCredentialTypeEntity {\n credentialCount: number;\n activeCount: number;\n expiringCount: number;\n}\n\n@RegisterClass(BaseResourceComponent, 'CredentialsTypesResource')\n@Component({\n standalone: false,\n selector: 'mj-credentials-types-resource',\n templateUrl: './credentials-types-resource.component.html',\n styleUrls: ['./credentials-types-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CredentialsTypesResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = true;\n public types: TypeWithStats[] = [];\n public filteredTypes: TypeWithStats[] = [];\n public credentials: MJCredentialEntity[] = [];\n public selectedType: TypeWithStats | null = null;\n public schemaProperties: FieldSchemaProperty[] = [];\n\n // Filters\n public searchText = '';\n public selectedCategoryFilter = '';\n public categories: string[] = [];\n\n // Permissions\n private _metadata = new Metadata();\n private _permissionCache = new Map<string, boolean>();\n\n @ViewChild('typeEditPanel') typeEditPanel!: CredentialTypeEditPanelComponent;\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 'Credential Types';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-cubes';\n }\n\n // === Permission Checks ===\n\n public get UserCanCreate(): boolean {\n return this.checkEntityPermission('MJ: Credential Types', 'Create');\n }\n\n public get UserCanUpdate(): boolean {\n return this.checkEntityPermission('MJ: Credential Types', 'Update');\n }\n\n public get UserCanDelete(): boolean {\n return this.checkEntityPermission('MJ: Credential Types', 'Delete');\n }\n\n public get UserCanCreateCredential(): boolean {\n return this.checkEntityPermission('MJ: Credentials', 'Create');\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 [typeResult, credResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Credential Types',\n OrderBy: 'Category, Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Credentials',\n ResultType: 'entity_object'\n }\n ]);\n\n if (typeResult.Success) {\n const baseTypes = typeResult.Results as MJCredentialTypeEntity[];\n this.credentials = credResult.Success ? credResult.Results as MJCredentialEntity[] : [];\n\n // Calculate stats for each type\n this.types = baseTypes.map(type => this.enrichTypeWithStats(type));\n\n // Extract unique categories\n this.categories = [...new Set(this.types.map(t => t.Category))].sort();\n }\n\n // Apply any navigation config (e.g., category filter from Categories nav item)\n this.handleNavigationConfig();\n\n this.applyFilters();\n\n } catch (error) {\n console.error('Error loading credential types:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error loading credential types', 'error', 3000);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n private handleNavigationConfig(): void {\n const config = this.Data?.Configuration;\n if (!config) {\n return;\n }\n\n // Apply category filter from navigation config\n if (config.categoryFilter) {\n this.selectedCategoryFilter = config.categoryFilter as string;\n }\n }\n\n private enrichTypeWithStats(type: MJCredentialTypeEntity): TypeWithStats {\n const typeCredentials = this.credentials.filter(c => UUIDsEqual(c.CredentialTypeID, type.ID));\n const now = new Date();\n const thirtyDaysFromNow = new Date();\n thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);\n\n // Add stats properties directly to the entity object\n const enrichedType = type as TypeWithStats;\n enrichedType.credentialCount = typeCredentials.length;\n enrichedType.activeCount = typeCredentials.filter(c => c.IsActive).length;\n enrichedType.expiringCount = typeCredentials.filter(c =>\n c.ExpiresAt &&\n new Date(c.ExpiresAt) >= now &&\n new Date(c.ExpiresAt) <= thirtyDaysFromNow\n ).length;\n\n return enrichedType;\n }\n\n // === CRUD Operations ===\n\n public createNewType(): void {\n if (this.typeEditPanel) {\n this.typeEditPanel.open(null);\n }\n }\n\n public editType(type: TypeWithStats, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.typeEditPanel) {\n this.typeEditPanel.open(type);\n }\n }\n\n public async deleteType(type: TypeWithStats, 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 credential types', 'warning', 3000);\n return;\n }\n\n if (type.credentialCount > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Cannot delete \"${type.Name}\" - it has ${type.credentialCount} credential(s) using it`,\n 'warning',\n 4000\n );\n return;\n }\n\n const confirmed = confirm(`Are you sure you want to delete \"${type.Name}\"? This action cannot be undone.`);\n if (!confirmed) return;\n\n try {\n const success = await type.Delete();\n if (success) {\n MJNotificationService.Instance.CreateSimpleNotification(`Credential type \"${type.Name}\" deleted successfully`, 'success', 3000);\n this.types = this.types.filter(t => !UUIDsEqual(t.ID, type.ID));\n if (UUIDsEqual(this.selectedType?.ID, type.ID)) {\n this.closeDetail();\n }\n this.applyFilters();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credential type', 'error', 3000);\n }\n } catch (error) {\n console.error('Error deleting credential type:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error deleting credential type', 'error', 3000);\n }\n }\n\n public createCredentialForType(type: TypeWithStats, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n // Navigate to Credentials nav item with the type pre-selected and create panel open\n this.navigationService.OpenNavItemByName('Credentials', {\n typeId: type.ID,\n openCreatePanel: true\n });\n }\n\n // === Panel Event Handlers ===\n\n public onTypeSaved(type: MJCredentialTypeEntity): void {\n const existingIndex = this.types.findIndex(t => UUIDsEqual(t.ID, type.ID));\n const enrichedType = this.enrichTypeWithStats(type);\n\n if (existingIndex >= 0) {\n this.types[existingIndex] = enrichedType;\n } else {\n this.types.unshift(enrichedType);\n }\n\n // Update categories if a new one was added\n if (!this.categories.includes(type.Category)) {\n this.categories = [...new Set(this.types.map(t => t.Category))].sort();\n }\n\n this.applyFilters();\n this.cdr.markForCheck();\n }\n\n public onTypeDeleted(typeId: string): void {\n this.types = this.types.filter(t => !UUIDsEqual(t.ID, typeId));\n if (UUIDsEqual(this.selectedType?.ID, typeId)) {\n this.closeDetail();\n }\n this.applyFilters();\n this.cdr.markForCheck();\n }\n\n // === Filtering ===\n\n public onSearchChange(value: string): void {\n this.searchText = value;\n this.applyFilters();\n }\n\n public onCategoryFilterChange(category: string): void {\n this.selectedCategoryFilter = category;\n this.applyFilters();\n }\n\n public clearFilters(): void {\n this.searchText = '';\n this.selectedCategoryFilter = '';\n this.applyFilters();\n }\n\n private applyFilters(): void {\n let filtered = [...this.types];\n\n // Filter by category\n if (this.selectedCategoryFilter) {\n filtered = filtered.filter(t => t.Category === this.selectedCategoryFilter);\n }\n\n // Filter by search text\n if (this.searchText.trim()) {\n const search = this.searchText.toLowerCase().trim();\n filtered = filtered.filter(t =>\n t.Name.toLowerCase().includes(search) ||\n (t.Description && t.Description.toLowerCase().includes(search)) ||\n t.Category.toLowerCase().includes(search)\n );\n }\n\n this.filteredTypes = filtered;\n this.cdr.markForCheck();\n }\n\n // === Selection ===\n\n public selectType(type: TypeWithStats): void {\n this.selectedType = type;\n this.parseFieldSchema(type.FieldSchema);\n this.cdr.markForCheck();\n }\n\n public closeDetail(): void {\n this.selectedType = null;\n this.schemaProperties = [];\n this.cdr.markForCheck();\n }\n\n private parseFieldSchema(schemaJson: string): void {\n try {\n const schema = JSON.parse(schemaJson) as { properties?: Record<string, Record<string, unknown>>; required?: string[] };\n const properties = schema.properties || {};\n const required = schema.required || [];\n\n this.schemaProperties = Object.entries(properties).map(([name, prop]) => ({\n name,\n type: (prop.type as string) || 'string',\n title: (prop.title as string) || name,\n description: (prop.description as string) || '',\n isSecret: prop.isSecret === true,\n required: required.includes(name)\n }));\n\n // Sort by order if available, otherwise by name\n this.schemaProperties.sort((a, b) => {\n const propA = properties[a.name];\n const propB = properties[b.name];\n const orderA = typeof propA.order === 'number' ? propA.order : 999;\n const orderB = typeof propB.order === 'number' ? propB.order : 999;\n return orderA - orderB;\n });\n\n } catch (e) {\n console.error('Failed to parse field schema:', e);\n this.schemaProperties = [];\n }\n }\n\n // === Helpers ===\n\n public getCategoryIcon(category: string): string {\n const iconMap: Record<string, string> = {\n 'AI': 'fa-solid fa-brain',\n 'Communication': 'fa-solid fa-envelope',\n 'Storage': 'fa-solid fa-cloud',\n 'Database': 'fa-solid fa-database',\n 'Authentication': 'fa-solid fa-shield-halved',\n 'Integration': 'fa-solid fa-plug'\n };\n return iconMap[category] || 'fa-solid fa-key';\n }\n\n public getCategoryColor(category: string): string {\n const colorMap: Record<string, string> = {\n 'AI': '#8b5cf6',\n 'Communication': '#3b82f6',\n 'Storage': '#06b6d4',\n 'Database': '#f59e0b',\n 'Authentication': '#10b981',\n 'Integration': '#ec4899'\n };\n return colorMap[category] || '#6366f1';\n }\n\n public getTypesByCategory(): Map<string, TypeWithStats[]> {\n const grouped = new Map<string, TypeWithStats[]>();\n for (const type of this.filteredTypes) {\n const category = type.Category;\n if (!grouped.has(category)) {\n grouped.set(category, []);\n }\n grouped.get(category)!.push(type);\n }\n return grouped;\n }\n\n /** Case-insensitive UUID check whether a credential type is the currently selected type. */\n public IsTypeSelected(type: TypeWithStats): boolean {\n return UUIDsEqual(this.selectedType?.ID, type.ID);\n }\n\n public getTotalCredentialCount(): number {\n return this.types.reduce((sum, t) => sum + t.credentialCount, 0);\n }\n\n public refresh(): void {\n this.loadData();\n }\n}\n","<div class=\"types-container\">\n @if (isLoading) {\n <mj-loading text=\"Loading credential types...\"></mj-loading>\n }\n\n @if (!isLoading) {\n <!-- Header -->\n <div class=\"types-header\">\n <div class=\"header-info\">\n <h2 class=\"types-title\">Credential Types</h2>\n <div class=\"header-stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-shapes\"></i>\n {{types.length}} types\n </span>\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-folder\"></i>\n {{categories.length}} categories\n </span>\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-key\"></i>\n {{getTotalCredentialCount()}} credentials\n </span>\n </div>\n </div>\n <div class=\"header-actions\">\n @if (UserCanCreate) {\n <button class=\"btn-primary\" (click)=\"createNewType()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Type</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 types...\"\n [value]=\"searchText\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n @if (searchText) {\n <button class=\"search-clear\" (click)=\"onSearchChange('')\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <select\n class=\"filter-select\"\n [value]=\"selectedCategoryFilter\"\n (change)=\"onCategoryFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Categories</option>\n @for (cat of categories; track cat) {\n <option [value]=\"cat\">{{cat}}</option>\n }\n </select>\n </div>\n <div class=\"toolbar-right\">\n <div class=\"results-info\">\n {{filteredTypes.length}} of {{types.length}} types\n </div>\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=\"types-layout\">\n <!-- Types List -->\n <div class=\"types-list\">\n @for (entry of getTypesByCategory() | keyvalue; track entry) {\n <div class=\"category-section\">\n <div class=\"category-header\" [style.borderLeftColor]=\"getCategoryColor(entry.key)\">\n <i [class]=\"getCategoryIcon(entry.key)\" [style.color]=\"getCategoryColor(entry.key)\"></i>\n <span class=\"category-name\">{{entry.key}}</span>\n <span class=\"count\">{{entry.value.length}}</span>\n </div>\n <div class=\"type-items\">\n @for (type of entry.value; track type) {\n <div\n class=\"type-item\"\n [class.selected]=\"IsTypeSelected(type)\"\n (click)=\"selectType(type)\"\n >\n <div class=\"type-icon\" [style.backgroundColor]=\"getCategoryColor(type.Category) + '15'\" [style.color]=\"getCategoryColor(type.Category)\">\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-description\">\n {{type.Description | slice:0:60}}{{type.Description.length > 60 ? '...' : ''}}\n </div>\n }\n <div class=\"type-meta\">\n @if (type.credentialCount > 0) {\n <span class=\"meta-badge\">\n <i class=\"fa-solid fa-key\"></i>\n {{type.credentialCount}}\n </span>\n }\n @if (type.activeCount > 0) {\n <span class=\"meta-badge active\">\n <i class=\"fa-solid fa-check\"></i>\n {{type.activeCount}} active\n </span>\n }\n @if (type.expiringCount > 0) {\n <span class=\"meta-badge warning\">\n <i class=\"fa-solid fa-clock\"></i>\n {{type.expiringCount}} expiring\n </span>\n }\n </div>\n </div>\n <div class=\"type-actions\">\n @if (UserCanCreateCredential) {\n <button\n class=\"action-btn\"\n (click)=\"createCredentialForType(type, $event)\"\n title=\"Add Credential\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n @if (UserCanUpdate) {\n <button\n class=\"action-btn\"\n (click)=\"editType(type, $event)\"\n title=\"Edit Type\"\n >\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete && type.credentialCount === 0) {\n <button\n class=\"action-btn danger\"\n (click)=\"deleteType(type, $event)\"\n title=\"Delete Type\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n <i class=\"fa-solid fa-chevron-right arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n @if (filteredTypes.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-cubes\"></i>\n </div>\n <h3>No Credential Types Found</h3>\n @if (searchText || selectedCategoryFilter) {\n <p>\n No types match your current filters.\n <button class=\"btn-link\" (click)=\"clearFilters()\">Clear filters</button>\n </p>\n }\n @if (!searchText && !selectedCategoryFilter) {\n <p>\n Get started by creating your first credential type.\n </p>\n }\n @if (UserCanCreate && !searchText && !selectedCategoryFilter) {\n <button class=\"btn-primary\" (click)=\"createNewType()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Type\n </button>\n }\n </div>\n }\n </div>\n <!-- Type Detail -->\n @if (selectedType) {\n <div class=\"type-detail\">\n <div class=\"detail-header\">\n <div class=\"detail-icon\" [style.backgroundColor]=\"getCategoryColor(selectedType.Category) + '15'\" [style.color]=\"getCategoryColor(selectedType.Category)\">\n <i [class]=\"selectedType.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"detail-title\">\n <h2>{{selectedType.Name}}</h2>\n <span class=\"category-badge\" [style.backgroundColor]=\"getCategoryColor(selectedType.Category) + '20'\" [style.color]=\"getCategoryColor(selectedType.Category)\">\n <i [class]=\"getCategoryIcon(selectedType.Category)\"></i>\n {{selectedType.Category}}\n </span>\n </div>\n <div class=\"detail-actions\">\n @if (UserCanUpdate) {\n <button class=\"action-btn\" (click)=\"editType(selectedType)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n <button class=\"close-btn\" (click)=\"closeDetail()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"detail-body\">\n <!-- Stats Row -->\n <div class=\"detail-stats\">\n <div class=\"detail-stat\">\n <div class=\"stat-value\">{{selectedType.credentialCount}}</div>\n <div class=\"stat-label\">Credentials</div>\n </div>\n <div class=\"detail-stat active\">\n <div class=\"stat-value\">{{selectedType.activeCount}}</div>\n <div class=\"stat-label\">Active</div>\n </div>\n @if (selectedType.expiringCount > 0) {\n <div class=\"detail-stat warning\">\n <div class=\"stat-value\">{{selectedType.expiringCount}}</div>\n <div class=\"stat-label\">Expiring</div>\n </div>\n }\n </div>\n @if (selectedType.Description) {\n <p class=\"description\">\n {{selectedType.Description}}\n </p>\n }\n <div class=\"schema-section\">\n <h3>\n <i class=\"fa-solid fa-list-check\"></i>\n Field Schema\n </h3>\n @if (schemaProperties.length > 0) {\n <div class=\"field-list\">\n @for (prop of schemaProperties; track prop) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{prop.title}}</span>\n <span class=\"field-badges\">\n <span class=\"badge type\">{{prop.type}}</span>\n @if (prop.isSecret) {\n <span class=\"badge secret\">\n <i class=\"fa-solid fa-lock\"></i> Secret\n </span>\n }\n @if (prop.required) {\n <span class=\"badge required\">Required</span>\n }\n </span>\n </div>\n @if (prop.description) {\n <p class=\"field-description\">\n {{prop.description}}\n </p>\n }\n </div>\n }\n </div>\n }\n @if (schemaProperties.length === 0) {\n <div class=\"no-fields\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>No fields defined in schema</span>\n </div>\n }\n </div>\n @if (selectedType.ValidationEndpoint) {\n <div class=\"validation-section\">\n <h3>\n <i class=\"fa-solid fa-check-circle\"></i>\n Validation\n </h3>\n <div class=\"validation-endpoint\">\n <i class=\"fa-solid fa-link\"></i>\n <span>{{selectedType.ValidationEndpoint}}</span>\n </div>\n </div>\n }\n <!-- Quick Actions -->\n @if (UserCanCreateCredential) {\n <div class=\"detail-quick-actions\">\n <button class=\"btn-primary\" (click)=\"createCredentialForType(selectedType)\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Credential\n </button>\n </div>\n }\n </div>\n </div>\n }\n <!-- No Selection -->\n @if (!selectedType && filteredTypes.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 Credential Type</h3>\n <p>Click on a credential type to view its details and field schema</p>\n </div>\n }\n </div>\n }\n</div>\n\n<!-- Type Edit Panel -->\n<mj-credential-type-edit-panel\n #typeEditPanel\n (saved)=\"onTypeSaved($any($event))\"\n (deleted)=\"onTypeDeleted($any($event))\"\n></mj-credential-type-edit-panel>\n"]}
|
|
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { Component, ChangeDetectionStrategy, ViewChild } from '@angular/core';
|
|
8
8
|
import { Subject } from 'rxjs';
|
|
9
9
|
import { takeUntil } from 'rxjs/operators';
|
|
10
|
-
import { RegisterClass } from '@memberjunction/global';
|
|
10
|
+
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
11
11
|
import { Metadata, CompositeKey } from '@memberjunction/core';
|
|
12
12
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
13
13
|
import { DashboardEngine } from '@memberjunction/core-entities';
|
|
@@ -274,7 +274,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
274
274
|
for (const dashboard of event.Dashboards) {
|
|
275
275
|
const deleted = await dashboard.Delete();
|
|
276
276
|
if (deleted) {
|
|
277
|
-
const index = this.dashboards.findIndex(d => d.ID
|
|
277
|
+
const index = this.dashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));
|
|
278
278
|
if (index >= 0) {
|
|
279
279
|
this.dashboards.splice(index, 1);
|
|
280
280
|
}
|
|
@@ -342,7 +342,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
342
342
|
async createOrUpdateCategoryLink(dashboardId, userId, categoryId) {
|
|
343
343
|
const md = new Metadata();
|
|
344
344
|
// Check if a link already exists for this user/dashboard
|
|
345
|
-
const existingLinks = DashboardEngine.Instance.DashboardCategoryLinks.filter(link => link.DashboardID
|
|
345
|
+
const existingLinks = DashboardEngine.Instance.DashboardCategoryLinks.filter(link => UUIDsEqual(link.DashboardID, dashboardId) && UUIDsEqual(link.UserID, userId));
|
|
346
346
|
let link;
|
|
347
347
|
if (existingLinks.length > 0) {
|
|
348
348
|
// Update existing link
|
|
@@ -460,7 +460,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
460
460
|
// Delete in reverse order (children first)
|
|
461
461
|
for (const cat of categoriesToDelete.reverse()) {
|
|
462
462
|
// First, move any dashboards in this category to uncategorized
|
|
463
|
-
const dashboardsInCategory = this.dashboards.filter(d => d.CategoryID
|
|
463
|
+
const dashboardsInCategory = this.dashboards.filter(d => UUIDsEqual(d.CategoryID, cat.ID));
|
|
464
464
|
for (const dashboard of dashboardsInCategory) {
|
|
465
465
|
dashboard.CategoryID = null;
|
|
466
466
|
await dashboard.Save();
|
|
@@ -468,7 +468,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
468
468
|
// Then delete the category
|
|
469
469
|
const deleted = await cat.Delete();
|
|
470
470
|
if (deleted) {
|
|
471
|
-
const index = this.categories.findIndex(c => c.ID
|
|
471
|
+
const index = this.categories.findIndex(c => UUIDsEqual(c.ID, cat.ID));
|
|
472
472
|
if (index >= 0) {
|
|
473
473
|
this.categories.splice(index, 1);
|
|
474
474
|
}
|
|
@@ -734,7 +734,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
734
734
|
}
|
|
735
735
|
case 'OpenDashboard': {
|
|
736
736
|
// Navigate to another dashboard
|
|
737
|
-
const targetDashboard = this.dashboards.find(d => d.ID
|
|
737
|
+
const targetDashboard = this.dashboards.find(d => UUIDsEqual(d.ID, request.dashboardId));
|
|
738
738
|
if (targetDashboard) {
|
|
739
739
|
if (openInNewTab) {
|
|
740
740
|
this.navigationService.OpenDashboard(targetDashboard.ID, targetDashboard.Name, { forceNewTab: true });
|
|
@@ -748,7 +748,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
748
748
|
case 'OpenQuery': {
|
|
749
749
|
// Navigate to query viewer
|
|
750
750
|
const md = new Metadata();
|
|
751
|
-
const queryInfo = md.Queries.find(q => q.ID
|
|
751
|
+
const queryInfo = md.Queries.find(q => UUIDsEqual(q.ID, request.queryId));
|
|
752
752
|
if (queryInfo) {
|
|
753
753
|
this.navigationService.OpenQuery(request.queryId, queryInfo.Name, { forceNewTab: openInNewTab });
|
|
754
754
|
}
|
|
@@ -892,14 +892,14 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
892
892
|
this.dashboardPermissionsMap = new Map();
|
|
893
893
|
this.effectiveCategoryMap = new Map();
|
|
894
894
|
// Get category links for current user (from engine's cached data)
|
|
895
|
-
const userCategoryLinks = engine.DashboardCategoryLinks.filter(link => link.UserID
|
|
895
|
+
const userCategoryLinks = engine.DashboardCategoryLinks.filter(link => UUIDsEqual(link.UserID, currentUserId));
|
|
896
896
|
for (const dashboard of this.dashboards) {
|
|
897
897
|
const perms = engine.GetDashboardPermissions(dashboard.ID, currentUserId);
|
|
898
898
|
this.dashboardPermissionsMap.set(dashboard.ID, perms);
|
|
899
899
|
// For shared dashboards (not owned), determine effective category
|
|
900
900
|
if (!perms.IsOwner) {
|
|
901
901
|
// Look for a category link for this dashboard
|
|
902
|
-
const categoryLink = userCategoryLinks.find(link => link.DashboardID
|
|
902
|
+
const categoryLink = userCategoryLinks.find(link => UUIDsEqual(link.DashboardID, dashboard.ID));
|
|
903
903
|
if (categoryLink) {
|
|
904
904
|
// User has explicitly organized this shared dashboard
|
|
905
905
|
this.effectiveCategoryMap.set(dashboard.ID, categoryLink.DashboardCategoryID);
|
|
@@ -946,7 +946,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
946
946
|
if (dashboardId !== currentDashboardId) {
|
|
947
947
|
if (dashboardId) {
|
|
948
948
|
// Find and open the dashboard
|
|
949
|
-
const dashboard = this.dashboards.find(d => d.ID
|
|
949
|
+
const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));
|
|
950
950
|
if (dashboard) {
|
|
951
951
|
this.selectedDashboard = dashboard;
|
|
952
952
|
this.mode = 'view';
|
|
@@ -995,7 +995,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
995
995
|
*/
|
|
996
996
|
getChildCategoriesRecursive(parentId) {
|
|
997
997
|
const children = [];
|
|
998
|
-
const directChildren = this.categories.filter(c => c.ParentID
|
|
998
|
+
const directChildren = this.categories.filter(c => UUIDsEqual(c.ParentID, parentId));
|
|
999
999
|
for (const child of directChildren) {
|
|
1000
1000
|
children.push(child);
|
|
1001
1001
|
children.push(...this.getChildCategoriesRecursive(child.ID));
|