@memberjunction/ng-dashboards 5.35.0 → 5.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +3 -3
  2. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  3. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +22 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +157 -137
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2075 -2068
  10. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  11. package/dist/AI/components/models/model-management.component.js +4 -4
  12. package/dist/AI/components/models/model-management.component.js.map +1 -1
  13. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  14. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  15. package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
  16. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  17. package/dist/AI/components/tags/tags-resource.component.js +1411 -1424
  18. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  19. package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
  20. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-keys-resource.component.js +329 -371
  22. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  23. package/dist/Actions/components/actions-overview.component.js +137 -142
  24. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  25. package/dist/Actions/components/execution-monitoring.component.js +111 -116
  26. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  27. package/dist/Admin/admin-data-schema.component.js +13 -65
  28. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  29. package/dist/Admin/admin-dev-tools-resource.component.js +13 -65
  30. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  31. package/dist/Admin/admin-identity-access.component.js +13 -65
  32. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  33. package/dist/Admin/admin-monitoring.component.js +13 -65
  34. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  35. package/dist/Admin/base-admin-container.component.d.ts +9 -7
  36. package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
  37. package/dist/Admin/base-admin-container.component.js +26 -17
  38. package/dist/Admin/base-admin-container.component.js.map +1 -1
  39. package/dist/ApplicationRoles/application-roles-resource.component.js +74 -67
  40. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  41. package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
  42. package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
  43. package/dist/Communication/communication-new-message-resource.component.js +661 -0
  44. package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
  45. package/dist/Credentials/components/credentials-categories-resource.component.js +152 -159
  46. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  47. package/dist/Credentials/components/credentials-types-resource.component.js +151 -155
  48. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  49. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +20 -21
  50. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  51. package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
  52. package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
  53. package/dist/DatabaseDesigner/components/entity-list.component.js +131 -125
  54. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  55. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  56. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  57. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +7 -1
  58. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  59. package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
  60. package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
  61. package/dist/DevTools/app-state-inspector.component.js +46 -72
  62. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  63. package/dist/DevTools/class-registry.component.js +88 -100
  64. package/dist/DevTools/class-registry.component.js.map +1 -1
  65. package/dist/DevTools/event-monitor.component.js +158 -168
  66. package/dist/DevTools/event-monitor.component.js.map +1 -1
  67. package/dist/DevTools/graphql-console.component.js +257 -264
  68. package/dist/DevTools/graphql-console.component.js.map +1 -1
  69. package/dist/DevTools/layout-inspector.component.d.ts +5 -0
  70. package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
  71. package/dist/DevTools/layout-inspector.component.js +46 -64
  72. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  73. package/dist/DevTools/lazy-module-status.component.js +75 -84
  74. package/dist/DevTools/lazy-module-status.component.js.map +1 -1
  75. package/dist/DevTools/settings-explorer.component.js +76 -85
  76. package/dist/DevTools/settings-explorer.component.js.map +1 -1
  77. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
  78. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  79. package/dist/EntityAdmin/entity-admin-dashboard.component.js +7 -3
  80. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  81. package/dist/Integration/components/activity/activity.component.js +97 -99
  82. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  83. package/dist/Integration/components/connections/connections.component.js +842 -855
  84. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  85. package/dist/Integration/components/pipelines/pipelines.component.js +502 -517
  86. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  87. package/dist/Integration/components/schedules/schedules.component.js +78 -89
  88. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  89. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
  90. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  91. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1120 -1128
  92. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  93. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
  94. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  95. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +606 -661
  96. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  97. package/dist/Lists/components/lists-browse-resource.component.d.ts +102 -0
  98. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  99. package/dist/Lists/components/lists-browse-resource.component.js +1179 -504
  100. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  101. package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
  102. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  103. package/dist/Lists/components/lists-operations-resource.component.js +1527 -327
  104. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  105. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
  106. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
  107. package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
  108. package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
  109. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
  110. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
  111. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
  112. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  113. package/dist/Lists/index.d.ts +1 -0
  114. package/dist/Lists/index.d.ts.map +1 -1
  115. package/dist/Lists/index.js +1 -0
  116. package/dist/Lists/index.js.map +1 -1
  117. package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
  118. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  119. package/dist/Lists/services/list-set-operations.service.js +236 -10
  120. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  121. package/dist/MCP/mcp-dashboard.component.js +19 -19
  122. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  123. package/dist/Scheduling/scheduling-dashboard.component.js +58 -60
  124. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  125. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
  126. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  127. package/dist/SystemDiagnostics/system-diagnostics.component.js +1007 -1252
  128. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  129. package/dist/Testing/components/testing-explorer.component.d.ts +31 -6
  130. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  131. package/dist/Testing/components/testing-explorer.component.js +543 -629
  132. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  133. package/dist/Testing/testing-dashboard.component.js +50 -49
  134. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  135. package/dist/ai-dashboards.module.d.ts +1 -1
  136. package/dist/ai-dashboards.module.d.ts.map +1 -1
  137. package/dist/ai-dashboards.module.js +16 -1
  138. package/dist/ai-dashboards.module.js.map +1 -1
  139. package/dist/communication-dashboards.module.d.ts +9 -7
  140. package/dist/communication-dashboards.module.d.ts.map +1 -1
  141. package/dist/communication-dashboards.module.js +13 -4
  142. package/dist/communication-dashboards.module.js.map +1 -1
  143. package/dist/core-dashboards.module.d.ts +1 -1
  144. package/dist/core-dashboards.module.d.ts.map +1 -1
  145. package/dist/core-dashboards.module.js +16 -1
  146. package/dist/core-dashboards.module.js.map +1 -1
  147. package/dist/lists-dashboards.module.d.ts +10 -9
  148. package/dist/lists-dashboards.module.d.ts.map +1 -1
  149. package/dist/lists-dashboards.module.js +13 -2
  150. package/dist/lists-dashboards.module.js.map +1 -1
  151. package/dist/public-api.d.ts +1 -0
  152. package/dist/public-api.d.ts.map +1 -1
  153. package/dist/public-api.js +1 -0
  154. package/dist/public-api.js.map +1 -1
  155. package/dist/testing-dashboards.module.d.ts +1 -1
  156. package/dist/testing-dashboards.module.d.ts.map +1 -1
  157. package/dist/testing-dashboards.module.js +13 -1
  158. package/dist/testing-dashboards.module.js.map +1 -1
  159. package/package.json +53 -52
@@ -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 , 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';\nimport { FilterFieldConfig } from '@memberjunction/ng-ui-components';\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 = this.ProviderToUse;\n private _permissionCache = new Map<string, boolean>();\n\n @ViewChild('typeEditPanel') typeEditPanel!: CredentialTypeEditPanelComponent;\n\n public get FilterFields(): FilterFieldConfig[] {\n return [\n {\n key: 'categoryFilter',\n type: 'dropdown',\n label: 'Category',\n icon: 'fa-solid fa-folder',\n placeholder: 'All Categories',\n filterable: true,\n options: [\n { text: 'All Categories', value: '' },\n ...this.categories.map(c => ({ text: c, value: c }))\n ]\n }\n ];\n }\n public get FilterValues(): Record<string, unknown> {\n return { categoryFilter: this.selectedCategoryFilter };\n }\n public get ActiveFilterCount(): number {\n return this.selectedCategoryFilter ? 1 : 0;\n }\n public onFilterValuesChange(v: Record<string, unknown>): void {\n const next = (v ?? {}) as { categoryFilter?: string };\n if ((next.categoryFilter ?? '') !== this.selectedCategoryFilter) {\n this.onCategoryFilterChange(next.categoryFilter ?? '');\n }\n }\n public resetFilters(): void {\n if (this.selectedCategoryFilter) this.onCategoryFilterChange('');\n }\n\n constructor(\n private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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': 'var(--mj-brand-primary)',\n 'Communication': 'var(--mj-brand-primary)',\n 'Storage': 'var(--mj-brand-primary)',\n 'Database': 'var(--mj-status-warning)',\n 'Authentication': 'var(--mj-status-success)',\n 'Integration': 'var(--mj-brand-primary)'\n };\n return colorMap[category] || 'var(--mj-brand-primary)';\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","<mj-page-layout>\n <mj-page-header\n Title=\"Credential Types\"\n Icon=\"fa-solid fa-shapes\">\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredTypes.length\"\n [Total]=\"types.length\"\n Label=\"types\">\n </mj-stat-badge>\n <mj-stat-badge\n Icon=\"fa-solid fa-folder\"\n [Count]=\"categories.length\"\n Label=\"categories\">\n </mj-stat-badge>\n <mj-stat-badge\n Icon=\"fa-solid fa-key\"\n [Count]=\"getTotalCredentialCount()\"\n Label=\"credentials\">\n </mj-stat-badge>\n </div>\n <div actions>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetFilters()\">\n <mj-filter-panel\n [Fields]=\"FilterFields\"\n [Values]=\"FilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n <mj-refresh-button [Loading]=\"isLoading\" (Clicked)=\"refresh()\"></mj-refresh-button>\n @if (UserCanCreate) {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewType()\">\n <i class=\"fa-solid fa-plus\"></i> New Type\n </button>\n }\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search types...\"\n [Value]=\"searchText\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\">\n @if (isLoading) {\n <mj-loading text=\"Loading credential types...\"></mj-loading>\n }\n\n @if (!isLoading) {\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 mjButton variant=\"flat\" size=\"sm\"\n (click)=\"createCredentialForType(type, $event)\"\n title=\"Add Credential\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n @if (UserCanUpdate) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editType(type, $event)\"\n title=\"Edit Type\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete && type.credentialCount === 0) {\n <button mjButton variant=\"danger\" size=\"sm\"\n (click)=\"deleteType(type, $event)\"\n title=\"Delete Type\">\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 mjButton variant=\"flat\" size=\"sm\" (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 </mj-page-body>\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</mj-page-layout>\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';\nimport { FilterFieldConfig } from '@memberjunction/ng-ui-components';\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 = this.ProviderToUse;\n private _permissionCache = new Map<string, boolean>();\n\n @ViewChild('typeEditPanel') typeEditPanel!: CredentialTypeEditPanelComponent;\n\n public get FilterFields(): FilterFieldConfig[] {\n return [\n {\n key: 'categoryFilter',\n type: 'dropdown',\n label: 'Category',\n icon: 'fa-solid fa-folder',\n placeholder: 'All Categories',\n filterable: true,\n options: [\n { text: 'All Categories', value: '' },\n ...this.categories.map(c => ({ text: c, value: c }))\n ]\n }\n ];\n }\n public get FilterValues(): Record<string, unknown> {\n return { categoryFilter: this.selectedCategoryFilter };\n }\n public get ActiveFilterCount(): number {\n return this.selectedCategoryFilter ? 1 : 0;\n }\n public onFilterValuesChange(v: Record<string, unknown>): void {\n const next = (v ?? {}) as { categoryFilter?: string };\n if ((next.categoryFilter ?? '') !== this.selectedCategoryFilter) {\n this.onCategoryFilterChange(next.categoryFilter ?? '');\n }\n }\n public resetFilters(): void {\n if (this.selectedCategoryFilter) this.onCategoryFilterChange('');\n }\n\n constructor(\n private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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': 'var(--mj-brand-primary)',\n 'Communication': 'var(--mj-brand-primary)',\n 'Storage': 'var(--mj-brand-primary)',\n 'Database': 'var(--mj-status-warning)',\n 'Authentication': 'var(--mj-status-success)',\n 'Integration': 'var(--mj-brand-primary)'\n };\n return colorMap[category] || 'var(--mj-brand-primary)';\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","<mj-page-layout>\n <mj-page-header\n Title=\"Credential Types\"\n Icon=\"fa-solid fa-shapes\">\n <div meta>\n <!-- Result-count of the filtered Types list — passes the meta rule\n (filtered/total is signal about how the filter narrowed the data,\n not visible by glancing at the list). Cross-entity reference\n counts (categories, credentials) dropped per chrome slot\n discipline audit Task B — those belong on their own pages. -->\n <mj-stat-badge\n [Count]=\"filteredTypes.length\"\n [Total]=\"types.length\"\n Label=\"types\">\n </mj-stat-badge>\n </div>\n <div actions>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetFilters()\">\n <mj-filter-panel\n [Fields]=\"FilterFields\"\n [Values]=\"FilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n <mj-refresh-button [Loading]=\"isLoading\" (Clicked)=\"refresh()\"></mj-refresh-button>\n @if (UserCanCreate) {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewType()\">\n <i class=\"fa-solid fa-plus\"></i> New Type\n </button>\n }\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search types...\"\n [Value]=\"searchText\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\">\n @if (isLoading) {\n <mj-loading text=\"Loading credential types...\"></mj-loading>\n }\n\n @if (!isLoading) {\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 mjButton variant=\"flat\" size=\"sm\"\n (click)=\"createCredentialForType(type, $event)\"\n title=\"Add Credential\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n @if (UserCanUpdate) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editType(type, $event)\"\n title=\"Edit Type\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete && type.credentialCount === 0) {\n <button mjButton variant=\"danger\" size=\"sm\"\n (click)=\"deleteType(type, $event)\"\n title=\"Delete Type\">\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 mjButton variant=\"flat\" size=\"sm\" (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 </mj-page-body>\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</mj-page-layout>\n"]}
@@ -30,23 +30,23 @@ import * as i1 from "@memberjunction/ng-versions";
30
30
  import * as i2 from "./entity-list.component";
31
31
  import * as i3 from "./create-wizard/database-create-wizard.component";
32
32
  import * as i4 from "./modify/database-modify.component";
33
- function DatabaseDesignerDashboardComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
33
+ function DatabaseDesignerDashboardComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
34
34
  const _r1 = i0.ɵɵgetCurrentView();
35
- i0.ɵɵelementStart(0, "mj-slide-panel", 5);
36
- i0.ɵɵlistener("Closed", function DatabaseDesignerDashboardComponent_Conditional_3_Template_mj_slide_panel_Closed_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnWizardClosed()); });
37
- i0.ɵɵelementStart(1, "mj-database-create-wizard", 6);
38
- i0.ɵɵlistener("EntityCreated", function DatabaseDesignerDashboardComponent_Conditional_3_Template_mj_database_create_wizard_EntityCreated_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnEntityCreated()); })("Cancelled", function DatabaseDesignerDashboardComponent_Conditional_3_Template_mj_database_create_wizard_Cancelled_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnWizardClosed()); });
35
+ i0.ɵɵelementStart(0, "mj-slide-panel", 3);
36
+ i0.ɵɵlistener("Closed", function DatabaseDesignerDashboardComponent_Conditional_1_Template_mj_slide_panel_Closed_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnWizardClosed()); });
37
+ i0.ɵɵelementStart(1, "mj-database-create-wizard", 4);
38
+ i0.ɵɵlistener("EntityCreated", function DatabaseDesignerDashboardComponent_Conditional_1_Template_mj_database_create_wizard_EntityCreated_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnEntityCreated()); })("Cancelled", function DatabaseDesignerDashboardComponent_Conditional_1_Template_mj_database_create_wizard_Cancelled_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnWizardClosed()); });
39
39
  i0.ɵɵelementEnd()();
40
40
  } if (rf & 2) {
41
41
  const ctx_r1 = i0.ɵɵnextContext();
42
42
  i0.ɵɵproperty("Visible", ctx_r1.ShowCreateWizard)("Resizable", true)("WidthPx", 9999)("MaxWidthRatio", 1)("MinWidthPx", 960);
43
43
  } }
44
- function DatabaseDesignerDashboardComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
44
+ function DatabaseDesignerDashboardComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
45
45
  const _r3 = i0.ɵɵgetCurrentView();
46
- i0.ɵɵelementStart(0, "mj-slide-panel", 7);
47
- i0.ɵɵlistener("Closed", function DatabaseDesignerDashboardComponent_Conditional_4_Template_mj_slide_panel_Closed_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnModifyPanelClosed()); });
48
- i0.ɵɵelementStart(1, "mj-database-modify", 8);
49
- i0.ɵɵlistener("EntityModified", function DatabaseDesignerDashboardComponent_Conditional_4_Template_mj_database_modify_EntityModified_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnEntityModified()); })("Cancelled", function DatabaseDesignerDashboardComponent_Conditional_4_Template_mj_database_modify_Cancelled_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnModifyPanelClosed()); });
46
+ i0.ɵɵelementStart(0, "mj-slide-panel", 5);
47
+ i0.ɵɵlistener("Closed", function DatabaseDesignerDashboardComponent_Conditional_2_Template_mj_slide_panel_Closed_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnModifyPanelClosed()); });
48
+ i0.ɵɵelementStart(1, "mj-database-modify", 6);
49
+ i0.ɵɵlistener("EntityModified", function DatabaseDesignerDashboardComponent_Conditional_2_Template_mj_database_modify_EntityModified_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnEntityModified()); })("Cancelled", function DatabaseDesignerDashboardComponent_Conditional_2_Template_mj_database_modify_Cancelled_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnModifyPanelClosed()); });
50
50
  i0.ɵɵelementEnd()();
51
51
  } if (rf & 2) {
52
52
  const ctx_r1 = i0.ɵɵnextContext();
@@ -194,19 +194,18 @@ let DatabaseDesignerDashboardComponent = class DatabaseDesignerDashboardComponen
194
194
  } if (rf & 2) {
195
195
  let _t;
196
196
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.modifyRef = _t.first);
197
- } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 2, consts: [[1, "database-designer-dashboard"], [1, "database-designer-content"], [3, "NewEntity", "EditEntity", "ViewEntity"], ["Mode", "slide", "Title", "New Entity", 3, "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx"], ["Mode", "slide", "Title", "Edit Entity", 3, "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx", "CanClose"], ["Mode", "slide", "Title", "New Entity", 3, "Closed", "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx"], [3, "EntityCreated", "Cancelled"], ["Mode", "slide", "Title", "Edit Entity", 3, "Closed", "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx", "CanClose"], [3, "EntityModified", "Cancelled", "EntityId"]], template: function DatabaseDesignerDashboardComponent_Template(rf, ctx) { if (rf & 1) {
198
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "mj-database-entity-list", 2);
199
- i0.ɵɵlistener("NewEntity", function DatabaseDesignerDashboardComponent_Template_mj_database_entity_list_NewEntity_2_listener() { return ctx.OnNewEntity(); })("EditEntity", function DatabaseDesignerDashboardComponent_Template_mj_database_entity_list_EditEntity_2_listener($event) { return ctx.OnEditEntity($event); })("ViewEntity", function DatabaseDesignerDashboardComponent_Template_mj_database_entity_list_ViewEntity_2_listener($event) { return ctx.OnViewEntity($event); });
200
- i0.ɵɵelementEnd()();
201
- i0.ɵɵconditionalCreate(3, DatabaseDesignerDashboardComponent_Conditional_3_Template, 2, 5, "mj-slide-panel", 3);
202
- i0.ɵɵconditionalCreate(4, DatabaseDesignerDashboardComponent_Conditional_4_Template, 2, 7, "mj-slide-panel", 4);
197
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 2, consts: [[3, "NewEntity", "EditEntity", "ViewEntity"], ["Mode", "slide", "Title", "New Entity", 3, "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx"], ["Mode", "slide", "Title", "Edit Entity", 3, "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx", "CanClose"], ["Mode", "slide", "Title", "New Entity", 3, "Closed", "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx"], [3, "EntityCreated", "Cancelled"], ["Mode", "slide", "Title", "Edit Entity", 3, "Closed", "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx", "CanClose"], [3, "EntityModified", "Cancelled", "EntityId"]], template: function DatabaseDesignerDashboardComponent_Template(rf, ctx) { if (rf & 1) {
198
+ i0.ɵɵelementStart(0, "mj-database-entity-list", 0);
199
+ i0.ɵɵlistener("NewEntity", function DatabaseDesignerDashboardComponent_Template_mj_database_entity_list_NewEntity_0_listener() { return ctx.OnNewEntity(); })("EditEntity", function DatabaseDesignerDashboardComponent_Template_mj_database_entity_list_EditEntity_0_listener($event) { return ctx.OnEditEntity($event); })("ViewEntity", function DatabaseDesignerDashboardComponent_Template_mj_database_entity_list_ViewEntity_0_listener($event) { return ctx.OnViewEntity($event); });
203
200
  i0.ɵɵelementEnd();
201
+ i0.ɵɵconditionalCreate(1, DatabaseDesignerDashboardComponent_Conditional_1_Template, 2, 5, "mj-slide-panel", 1);
202
+ i0.ɵɵconditionalCreate(2, DatabaseDesignerDashboardComponent_Conditional_2_Template, 2, 7, "mj-slide-panel", 2);
204
203
  } if (rf & 2) {
205
- i0.ɵɵadvance(3);
206
- i0.ɵɵconditional(ctx.ShowCreateWizard ? 3 : -1);
207
204
  i0.ɵɵadvance();
208
- i0.ɵɵconditional(ctx.ModifyEntityId ? 4 : -1);
209
- } }, dependencies: [i1.MjSlidePanelComponent, i2.EntityListComponent, i3.DatabaseCreateWizardComponent, i4.DatabaseModifyComponent], styles: ["\n\n\n.database-designer-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-page);\n overflow: hidden;\n position: relative;\n}\n\n\n\n\n.database-designer-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n margin: 16px;\n box-shadow: 0 1px 4px color-mix(in srgb, var(--mj-border-strong) 20%, transparent);\n}\n\n\n\n\n.panel-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n padding: 60px 32px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.panel-placeholder[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n}\n\n.panel-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.95rem;\n}"], changeDetection: 0 });
205
+ i0.ɵɵconditional(ctx.ShowCreateWizard ? 1 : -1);
206
+ i0.ɵɵadvance();
207
+ i0.ɵɵconditional(ctx.ModifyEntityId ? 2 : -1);
208
+ } }, dependencies: [i1.MjSlidePanelComponent, i2.EntityListComponent, i3.DatabaseCreateWizardComponent, i4.DatabaseModifyComponent], styles: ["\n\n\n\n\n\n\n[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n background: var(--mj-bg-page);\n position: relative;\n}\n\nmj-database-entity-list[_ngcontent-%COMP%] {\n display: block;\n flex: 1;\n min-height: 0;\n}\n\n\n\n\n.panel-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n padding: 60px 32px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.panel-placeholder[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n}\n\n.panel-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.95rem;\n}"], changeDetection: 0 });
210
209
  };
211
210
  DatabaseDesignerDashboardComponent = __decorate([
212
211
  RegisterClass(BaseResourceComponent, 'DatabaseDesignerDashboard')
@@ -214,7 +213,7 @@ DatabaseDesignerDashboardComponent = __decorate([
214
213
  export { DatabaseDesignerDashboardComponent };
215
214
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DatabaseDesignerDashboardComponent, [{
216
215
  type: Component,
217
- args: [{ standalone: false, selector: 'mj-database-designer-dashboard', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"database-designer-dashboard\">\n\n <!-- \u2500\u2500 Main entity list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <div class=\"database-designer-content\">\n <mj-database-entity-list\n (NewEntity)=\"OnNewEntity()\"\n (EditEntity)=\"OnEditEntity($event)\"\n (ViewEntity)=\"OnViewEntity($event)\">\n </mj-database-entity-list>\n </div>\n\n <!-- \u2500\u2500 Create Wizard slide-over panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n @if (ShowCreateWizard) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"New Entity\"\n [Visible]=\"ShowCreateWizard\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n (Closed)=\"OnWizardClosed()\">\n <mj-database-create-wizard\n (EntityCreated)=\"OnEntityCreated()\"\n (Cancelled)=\"OnWizardClosed()\">\n </mj-database-create-wizard>\n </mj-slide-panel>\n }\n\n <!-- \u2500\u2500 Modify slide-over panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n @if (ModifyEntityId) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"Edit Entity\"\n [Visible]=\"!!ModifyEntityId\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n [CanClose]=\"ModifyPanelCanClose\"\n (Closed)=\"OnModifyPanelClosed()\">\n <mj-database-modify\n [EntityId]=\"ModifyEntityId!\"\n (EntityModified)=\"OnEntityModified()\"\n (Cancelled)=\"OnModifyPanelClosed()\">\n </mj-database-modify>\n </mj-slide-panel>\n }\n\n</div>\n", styles: ["/* \u2500\u2500 Dashboard root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.database-designer-dashboard {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-page);\n overflow: hidden;\n position: relative;\n}\n\n/* \u2500\u2500 Content area \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.database-designer-content {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n margin: 16px;\n box-shadow: 0 1px 4px color-mix(in srgb, var(--mj-border-strong) 20%, transparent);\n}\n\n/* \u2500\u2500 Placeholder (pre-Phase 5d/5e wiring) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.panel-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n padding: 60px 32px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.panel-placeholder i {\n font-size: 2rem;\n}\n\n.panel-placeholder p {\n margin: 0;\n font-size: 0.95rem;\n}\n"] }]
216
+ args: [{ standalone: false, selector: 'mj-database-designer-dashboard', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n Thin wrapper \u2014 the entity-list component owns the interior chrome card\n (<mj-page-header-interior>) and the scrollable body. The dashboard's role is\n to host the slide-over panels (create-wizard, modify) and route their lifecycle.\n-->\n<mj-database-entity-list\n (NewEntity)=\"OnNewEntity()\"\n (EditEntity)=\"OnEditEntity($event)\"\n (ViewEntity)=\"OnViewEntity($event)\">\n</mj-database-entity-list>\n\n <!-- \u2500\u2500 Create Wizard slide-over panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n @if (ShowCreateWizard) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"New Entity\"\n [Visible]=\"ShowCreateWizard\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n (Closed)=\"OnWizardClosed()\">\n <mj-database-create-wizard\n (EntityCreated)=\"OnEntityCreated()\"\n (Cancelled)=\"OnWizardClosed()\">\n </mj-database-create-wizard>\n </mj-slide-panel>\n }\n\n <!-- \u2500\u2500 Modify slide-over panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n @if (ModifyEntityId) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"Edit Entity\"\n [Visible]=\"!!ModifyEntityId\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n [CanClose]=\"ModifyPanelCanClose\"\n (Closed)=\"OnModifyPanelClosed()\">\n <mj-database-modify\n [EntityId]=\"ModifyEntityId!\"\n (EntityModified)=\"OnEntityModified()\"\n (Cancelled)=\"OnModifyPanelClosed()\">\n </mj-database-modify>\n </mj-slide-panel>\n }\n", styles: ["/*\n Database Designer dashboard root \u2014 thin wrapper that hosts the entity-list\n child + slide-over panels. The entity-list owns its own interior chrome\n (<mj-page-header-interior>) so this component is a flex column that just\n lets the child fill the body. See Section 10 of plans/explorer-chrome-conventions.md.\n*/\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n background: var(--mj-bg-page);\n position: relative;\n}\n\nmj-database-entity-list {\n display: block;\n flex: 1;\n min-height: 0;\n}\n\n/* \u2500\u2500 Placeholder (pre-Phase 5d/5e wiring) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.panel-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n padding: 60px 32px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.panel-placeholder i {\n font-size: 2rem;\n}\n\n.panel-placeholder p {\n margin: 0;\n font-size: 0.95rem;\n}\n"] }]
218
217
  }], null, { modifyRef: [{
219
218
  type: ViewChild,
220
219
  args: [DatabaseModifyComponent]
@@ -1 +1 @@
1
- {"version":3,"file":"database-designer-dashboard.component.js","sourceRoot":"","sources":["../../../src/DatabaseDesigner/components/database-designer-dashboard.component.ts","../../../src/DatabaseDesigner/components/database-designer-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module database-designer-dashboard.component\n * @description Root dashboard for the Database Designer feature area.\n *\n * Registered as 'DatabaseDesignerDashboard' via `@RegisterClass(BaseDashboard, ...)`.\n * Registered as a navigation item via metadata (metadata/applications/).\n *\n * Lifecycle:\n * - `initDashboard()` — sync ?entity= URL param (deep-link support), initialize slide-panel state\n * - `loadData()` — delegate to DatabaseDesignerEngine singleton; pass result to EntityListComponent\n *\n * The wizard and modify panels open as MjSlidePanel drawers so the entity\n * list remains visible behind them. The dashboard orchestrates all state\n * transitions; child components communicate only via @Output events.\n */\n\nimport {\n Component, ChangeDetectionStrategy, ChangeDetectorRef,\n inject, ViewChild,\n} from '@angular/core';\nimport { BaseDashboard, BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { ResourceData } from '@memberjunction/core-entities';\n\nimport { DatabaseDesignerEngine } from '../services/database-designer.engine.js';\nimport { DatabaseDesignerService } from '../services/database-designer.service.js';\nimport { DatabaseModifyComponent } from './modify/database-modify.component.js';\nimport type { AccessibleEntity } from '../database-designer.types.js';\n\n@Component({\n standalone: false,\n selector: 'mj-database-designer-dashboard',\n templateUrl: './database-designer-dashboard.component.html',\n styleUrls: ['./database-designer-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n@RegisterClass(BaseResourceComponent, 'DatabaseDesignerDashboard')\nexport class DatabaseDesignerDashboardComponent extends BaseDashboard {\n\n // ─── Injected services ─────────────────────────────────────────────────\n\n /** Angular DI: write operations (create, modify, validate). */\n protected readonly designerService = inject(DatabaseDesignerService);\n\n /** Change detection ref for OnPush updates. */\n private readonly cdr = inject(ChangeDetectorRef);\n\n // ─── ViewChild ─────────────────────────────────────────────────────────\n\n /** Reference to the active modify component — used for close-guard state. */\n @ViewChild(DatabaseModifyComponent) private modifyRef?: DatabaseModifyComponent;\n\n // ─── Slide-panel close guard ───────────────────────────────────────────\n\n /**\n * Passed as `[CanClose]` to the modify slide panel.\n * Prevents the panel from closing while a pipeline is running and prompts the user\n * for confirmation. Defined as an arrow function so `this` is captured correctly\n * when called by `MjSlidePanelComponent` (no angular binding issues).\n */\n public readonly ModifyPanelCanClose = (): boolean => {\n if (!this.modifyRef?.IsPipelineRunning) return true;\n return window.confirm(\n 'A pipeline operation is in progress. Closing will hide the progress panel ' +\n 'but the operation will continue running on the server.\\n\\nAre you sure?'\n );\n };\n\n // ─── Entity list ───────────────────────────────────────────────────────\n\n /** Entities displayed in EntityListComponent — set by loadData(). */\n public Entities: AccessibleEntity[] = [];\n\n public IsLoadingEntities = false;\n public LoadError: string | null = null;\n\n // ─── Slide panel state ─────────────────────────────────────────────────\n\n /** Whether the Create Wizard drawer is open. */\n public ShowCreateWizard = false;\n\n /** ID of the entity currently being modified; null if panel is closed. */\n public ModifyEntityId: string | null = null;\n\n /** ID to deep-link into on first load (from ?entity= query param). */\n private _deepLinkEntityId: string | null = null;\n\n // ─── BaseDashboard implementation ──────────────────────────────────────\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Database Designer';\n }\n\n /** Sync ?entity=<id> URL param; set initial slide-panel state. */\n protected initDashboard(): void {\n const params = this.GetQueryParams();\n if (params['entity']) {\n this._deepLinkEntityId = params['entity'];\n }\n }\n\n /** Load accessible entities from the engine's cached store. */\n protected async loadData(): Promise<void> {\n this.IsLoadingEntities = true;\n this.LoadError = null;\n this.cdr.markForCheck();\n\n try {\n this.Entities = await DatabaseDesignerEngine.Instance.loadAccessibleEntities();\n\n // Honor deep-link: open modify panel if the entity exists in the list.\n if (this._deepLinkEntityId) {\n const target = this.Entities.find(e => e.entityId === this._deepLinkEntityId);\n if (target) {\n this.openModifyPanel(target);\n }\n this._deepLinkEntityId = null;\n }\n } catch (err) {\n this.LoadError = err instanceof Error ? err.message : String(err);\n } finally {\n this.IsLoadingEntities = false;\n this.cdr.markForCheck();\n }\n }\n\n // ─── Entity list event handlers ────────────────────────────────────────\n\n /** Opens the Create Wizard drawer. */\n public OnNewEntity(): void {\n this.ShowCreateWizard = true;\n this.cdr.markForCheck();\n }\n\n /** Opens the Modify panel for an existing entity. */\n public OnEditEntity(entity: AccessibleEntity): void {\n this.openModifyPanel(entity);\n }\n\n /** Opens the Modify panel (read-only view) for an existing entity. */\n public OnViewEntity(entity: AccessibleEntity): void {\n this.openModifyPanel(entity);\n }\n\n // ─── Slide-panel event handlers ────────────────────────────────────────\n\n /** Called when the Create Wizard drawer closes (cancel or success). */\n public OnWizardClosed(): void {\n this.ShowCreateWizard = false;\n this.cdr.markForCheck();\n }\n\n /** Called when the wizard successfully creates an entity. */\n public OnEntityCreated(): void {\n this.ShowCreateWizard = false;\n DatabaseDesignerEngine.Instance.invalidateCache();\n this.loadData();\n }\n\n /** Called when the Modify panel drawer closes. */\n public OnModifyPanelClosed(): void {\n this.ModifyEntityId = null;\n this.UpdateQueryParams({ entity: null });\n this.cdr.markForCheck();\n }\n\n /** Called when the modify wizard successfully alters an entity. */\n public OnEntityModified(): void {\n this.ModifyEntityId = null;\n DatabaseDesignerEngine.Instance.invalidateCache();\n this.loadData();\n }\n\n /**\n * React to ?entity= changes that arrive after initial load — e.g. clicking a Home pin\n * for a specific entity, or browser back/forward — when this tab is re-focused rather\n * than freshly mounted (so initDashboard() does not run again). Without this, the modify\n * panel would not open for the pinned/linked entity. (initDashboard handles the very\n * first load via _deepLinkEntityId.)\n */\n protected override OnQueryParamsChanged(params: Record<string, string>, _source: 'popstate' | 'deeplink'): void {\n const entityId = params['entity'] || null;\n if (entityId) {\n if (entityId !== this.ModifyEntityId) {\n const target = this.Entities.find(e => e.entityId === entityId);\n if (target) {\n this.openModifyPanel(target);\n }\n }\n } else if (this.ModifyEntityId) {\n this.OnModifyPanelClosed();\n }\n }\n\n // ─── Helpers ───────────────────────────────────────────────────────────\n\n private openModifyPanel(entity: AccessibleEntity): void {\n this.ModifyEntityId = entity.entityId;\n this.UpdateQueryParams({ entity: entity.entityId });\n this.cdr.markForCheck();\n }\n}\n\n/** Tree-shaking prevention — called from module's public-api.ts. */\nexport function LoadDatabaseDesignerDashboard(): void { /* noop — forces import */ }\n","<div class=\"database-designer-dashboard\">\n\n <!-- ── Main entity list ───────────────────────────────────────────────── -->\n <div class=\"database-designer-content\">\n <mj-database-entity-list\n (NewEntity)=\"OnNewEntity()\"\n (EditEntity)=\"OnEditEntity($event)\"\n (ViewEntity)=\"OnViewEntity($event)\">\n </mj-database-entity-list>\n </div>\n\n <!-- ── Create Wizard slide-over panel ────────────────────────────────── -->\n @if (ShowCreateWizard) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"New Entity\"\n [Visible]=\"ShowCreateWizard\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n (Closed)=\"OnWizardClosed()\">\n <mj-database-create-wizard\n (EntityCreated)=\"OnEntityCreated()\"\n (Cancelled)=\"OnWizardClosed()\">\n </mj-database-create-wizard>\n </mj-slide-panel>\n }\n\n <!-- ── Modify slide-over panel ───────────────────────────────────────── -->\n @if (ModifyEntityId) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"Edit Entity\"\n [Visible]=\"!!ModifyEntityId\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n [CanClose]=\"ModifyPanelCanClose\"\n (Closed)=\"OnModifyPanelClosed()\">\n <mj-database-modify\n [EntityId]=\"ModifyEntityId!\"\n (EntityModified)=\"OnEntityModified()\"\n (Cancelled)=\"OnModifyPanelClosed()\">\n </mj-database-modify>\n </mj-slide-panel>\n }\n\n</div>\n"]}
1
+ {"version":3,"file":"database-designer-dashboard.component.js","sourceRoot":"","sources":["../../../src/DatabaseDesigner/components/database-designer-dashboard.component.ts","../../../src/DatabaseDesigner/components/database-designer-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module database-designer-dashboard.component\n * @description Root dashboard for the Database Designer feature area.\n *\n * Registered as 'DatabaseDesignerDashboard' via `@RegisterClass(BaseDashboard, ...)`.\n * Registered as a navigation item via metadata (metadata/applications/).\n *\n * Lifecycle:\n * - `initDashboard()` — sync ?entity= URL param (deep-link support), initialize slide-panel state\n * - `loadData()` — delegate to DatabaseDesignerEngine singleton; pass result to EntityListComponent\n *\n * The wizard and modify panels open as MjSlidePanel drawers so the entity\n * list remains visible behind them. The dashboard orchestrates all state\n * transitions; child components communicate only via @Output events.\n */\n\nimport {\n Component, ChangeDetectionStrategy, ChangeDetectorRef,\n inject, ViewChild,\n} from '@angular/core';\nimport { BaseDashboard, BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { ResourceData } from '@memberjunction/core-entities';\n\nimport { DatabaseDesignerEngine } from '../services/database-designer.engine.js';\nimport { DatabaseDesignerService } from '../services/database-designer.service.js';\nimport { DatabaseModifyComponent } from './modify/database-modify.component.js';\nimport type { AccessibleEntity } from '../database-designer.types.js';\n\n@Component({\n standalone: false,\n selector: 'mj-database-designer-dashboard',\n templateUrl: './database-designer-dashboard.component.html',\n styleUrls: ['./database-designer-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n@RegisterClass(BaseResourceComponent, 'DatabaseDesignerDashboard')\nexport class DatabaseDesignerDashboardComponent extends BaseDashboard {\n\n // ─── Injected services ─────────────────────────────────────────────────\n\n /** Angular DI: write operations (create, modify, validate). */\n protected readonly designerService = inject(DatabaseDesignerService);\n\n /** Change detection ref for OnPush updates. */\n private readonly cdr = inject(ChangeDetectorRef);\n\n // ─── ViewChild ─────────────────────────────────────────────────────────\n\n /** Reference to the active modify component — used for close-guard state. */\n @ViewChild(DatabaseModifyComponent) private modifyRef?: DatabaseModifyComponent;\n\n // ─── Slide-panel close guard ───────────────────────────────────────────\n\n /**\n * Passed as `[CanClose]` to the modify slide panel.\n * Prevents the panel from closing while a pipeline is running and prompts the user\n * for confirmation. Defined as an arrow function so `this` is captured correctly\n * when called by `MjSlidePanelComponent` (no angular binding issues).\n */\n public readonly ModifyPanelCanClose = (): boolean => {\n if (!this.modifyRef?.IsPipelineRunning) return true;\n return window.confirm(\n 'A pipeline operation is in progress. Closing will hide the progress panel ' +\n 'but the operation will continue running on the server.\\n\\nAre you sure?'\n );\n };\n\n // ─── Entity list ───────────────────────────────────────────────────────\n\n /** Entities displayed in EntityListComponent — set by loadData(). */\n public Entities: AccessibleEntity[] = [];\n\n public IsLoadingEntities = false;\n public LoadError: string | null = null;\n\n // ─── Slide panel state ─────────────────────────────────────────────────\n\n /** Whether the Create Wizard drawer is open. */\n public ShowCreateWizard = false;\n\n /** ID of the entity currently being modified; null if panel is closed. */\n public ModifyEntityId: string | null = null;\n\n /** ID to deep-link into on first load (from ?entity= query param). */\n private _deepLinkEntityId: string | null = null;\n\n // ─── BaseDashboard implementation ──────────────────────────────────────\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Database Designer';\n }\n\n /** Sync ?entity=<id> URL param; set initial slide-panel state. */\n protected initDashboard(): void {\n const params = this.GetQueryParams();\n if (params['entity']) {\n this._deepLinkEntityId = params['entity'];\n }\n }\n\n /** Load accessible entities from the engine's cached store. */\n protected async loadData(): Promise<void> {\n this.IsLoadingEntities = true;\n this.LoadError = null;\n this.cdr.markForCheck();\n\n try {\n this.Entities = await DatabaseDesignerEngine.Instance.loadAccessibleEntities();\n\n // Honor deep-link: open modify panel if the entity exists in the list.\n if (this._deepLinkEntityId) {\n const target = this.Entities.find(e => e.entityId === this._deepLinkEntityId);\n if (target) {\n this.openModifyPanel(target);\n }\n this._deepLinkEntityId = null;\n }\n } catch (err) {\n this.LoadError = err instanceof Error ? err.message : String(err);\n } finally {\n this.IsLoadingEntities = false;\n this.cdr.markForCheck();\n }\n }\n\n // ─── Entity list event handlers ────────────────────────────────────────\n\n /** Opens the Create Wizard drawer. */\n public OnNewEntity(): void {\n this.ShowCreateWizard = true;\n this.cdr.markForCheck();\n }\n\n /** Opens the Modify panel for an existing entity. */\n public OnEditEntity(entity: AccessibleEntity): void {\n this.openModifyPanel(entity);\n }\n\n /** Opens the Modify panel (read-only view) for an existing entity. */\n public OnViewEntity(entity: AccessibleEntity): void {\n this.openModifyPanel(entity);\n }\n\n // ─── Slide-panel event handlers ────────────────────────────────────────\n\n /** Called when the Create Wizard drawer closes (cancel or success). */\n public OnWizardClosed(): void {\n this.ShowCreateWizard = false;\n this.cdr.markForCheck();\n }\n\n /** Called when the wizard successfully creates an entity. */\n public OnEntityCreated(): void {\n this.ShowCreateWizard = false;\n DatabaseDesignerEngine.Instance.invalidateCache();\n this.loadData();\n }\n\n /** Called when the Modify panel drawer closes. */\n public OnModifyPanelClosed(): void {\n this.ModifyEntityId = null;\n this.UpdateQueryParams({ entity: null });\n this.cdr.markForCheck();\n }\n\n /** Called when the modify wizard successfully alters an entity. */\n public OnEntityModified(): void {\n this.ModifyEntityId = null;\n DatabaseDesignerEngine.Instance.invalidateCache();\n this.loadData();\n }\n\n /**\n * React to ?entity= changes that arrive after initial load — e.g. clicking a Home pin\n * for a specific entity, or browser back/forward — when this tab is re-focused rather\n * than freshly mounted (so initDashboard() does not run again). Without this, the modify\n * panel would not open for the pinned/linked entity. (initDashboard handles the very\n * first load via _deepLinkEntityId.)\n */\n protected override OnQueryParamsChanged(params: Record<string, string>, _source: 'popstate' | 'deeplink'): void {\n const entityId = params['entity'] || null;\n if (entityId) {\n if (entityId !== this.ModifyEntityId) {\n const target = this.Entities.find(e => e.entityId === entityId);\n if (target) {\n this.openModifyPanel(target);\n }\n }\n } else if (this.ModifyEntityId) {\n this.OnModifyPanelClosed();\n }\n }\n\n // ─── Helpers ───────────────────────────────────────────────────────────\n\n private openModifyPanel(entity: AccessibleEntity): void {\n this.ModifyEntityId = entity.entityId;\n this.UpdateQueryParams({ entity: entity.entityId });\n this.cdr.markForCheck();\n }\n}\n\n/** Tree-shaking prevention — called from module's public-api.ts. */\nexport function LoadDatabaseDesignerDashboard(): void { /* noop — forces import */ }\n","<!--\n Thin wrapper — the entity-list component owns the interior chrome card\n (<mj-page-header-interior>) and the scrollable body. The dashboard's role is\n to host the slide-over panels (create-wizard, modify) and route their lifecycle.\n-->\n<mj-database-entity-list\n (NewEntity)=\"OnNewEntity()\"\n (EditEntity)=\"OnEditEntity($event)\"\n (ViewEntity)=\"OnViewEntity($event)\">\n</mj-database-entity-list>\n\n <!-- ── Create Wizard slide-over panel ────────────────────────────────── -->\n @if (ShowCreateWizard) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"New Entity\"\n [Visible]=\"ShowCreateWizard\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n (Closed)=\"OnWizardClosed()\">\n <mj-database-create-wizard\n (EntityCreated)=\"OnEntityCreated()\"\n (Cancelled)=\"OnWizardClosed()\">\n </mj-database-create-wizard>\n </mj-slide-panel>\n }\n\n <!-- ── Modify slide-over panel ───────────────────────────────────────── -->\n @if (ModifyEntityId) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"Edit Entity\"\n [Visible]=\"!!ModifyEntityId\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n [CanClose]=\"ModifyPanelCanClose\"\n (Closed)=\"OnModifyPanelClosed()\">\n <mj-database-modify\n [EntityId]=\"ModifyEntityId!\"\n (EntityModified)=\"OnEntityModified()\"\n (Cancelled)=\"OnModifyPanelClosed()\">\n </mj-database-modify>\n </mj-slide-panel>\n }\n"]}
@@ -22,6 +22,8 @@ export declare class EntityListComponent implements OnInit, OnDestroy {
22
22
  ErrorMessage: string | null;
23
23
  /** Full unfiltered list from the engine. */
24
24
  private _allEntities;
25
+ /** Public accessor for the chrome's X-of-Y badge. */
26
+ get TotalEntityCount(): number;
25
27
  /** Cached sorted unique schema names — recomputed only when _allEntities changes. */
26
28
  private _availableFilterSchemas;
27
29
  /** Currently displayed (filtered + sorted) rows. */
@@ -1 +1 @@
1
- {"version":3,"file":"entity-list.component.d.ts","sourceRoot":"","sources":["../../../src/DatabaseDesigner/components/entity-list.component.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACQ,MAAM,EAAE,SAAS,EAAU,YAAY,EAErD,MAAM,eAAe,CAAC;AAKvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;;AAItE,KAAK,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AACnF,KAAK,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAEpC,qBAOa,mBAAoB,YAAW,MAAM,EAAE,SAAS;IAEzD,4DAA4D;IAC5D,SAA0B,UAAU,iCAAwC;IAC5E,oEAAoE;IACpE,SAA0B,UAAU,iCAAwC;IAC5E,iDAAiD;IACjD,SAA0B,SAAS,qBAA4B;IAExD,SAAS,UAAS;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,4CAA4C;IAC5C,OAAO,CAAC,YAAY,CAA0B;IAE9C,qFAAqF;IACrF,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,oDAAoD;IAC7C,gBAAgB,EAAE,gBAAgB,EAAE,CAAM;IAEjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgD;IAC5E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6C;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAEjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAIjD,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAOnB,IAAI,UAAU,IAAI,MAAM,CAAgC;IACxD,IAAI,UAAU,CAAC,CAAC,EAAE,MAAM,EAA4B;IAEpD,IAAI,cAAc,IAAI,MAAM,CAAgC;IAC5D,IAAI,cAAc,CAAC,CAAC,EAAE,MAAM,EAA4B;IAExD,oFAAoF;IACpF,IAAI,sBAAsB,IAAI,MAAM,EAAE,CAAyC;IAE/E,IAAI,SAAS,IAAI,SAAS,CAAmC;IAC7D,IAAI,aAAa,IAAI,aAAa,CAAiC;IAEnE,0EAA0E;IACnE,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IASpC,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAI5C,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAI5C,WAAW,IAAI,IAAI;IAInB,SAAS,IAAI,IAAI;IAKjB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAI5D,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAMrC,OAAO,CAAC,WAAW;YAaL,YAAY;IAwB1B,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,SAAS;yCA3JR,mBAAmB;2CAAnB,mBAAmB;CAqK/B"}
1
+ {"version":3,"file":"entity-list.component.d.ts","sourceRoot":"","sources":["../../../src/DatabaseDesigner/components/entity-list.component.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACQ,MAAM,EAAE,SAAS,EAAU,YAAY,EAErD,MAAM,eAAe,CAAC;AAKvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;;AAItE,KAAK,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AACnF,KAAK,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAEpC,qBAOa,mBAAoB,YAAW,MAAM,EAAE,SAAS;IAEzD,4DAA4D;IAC5D,SAA0B,UAAU,iCAAwC;IAC5E,oEAAoE;IACpE,SAA0B,UAAU,iCAAwC;IAC5E,iDAAiD;IACjD,SAA0B,SAAS,qBAA4B;IAExD,SAAS,UAAS;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,4CAA4C;IAC5C,OAAO,CAAC,YAAY,CAA0B;IAE9C,qDAAqD;IACrD,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAED,qFAAqF;IACrF,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,oDAAoD;IAC7C,gBAAgB,EAAE,gBAAgB,EAAE,CAAM;IAEjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgD;IAC5E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6C;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAEjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAIjD,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAOnB,IAAI,UAAU,IAAI,MAAM,CAAgC;IACxD,IAAI,UAAU,CAAC,CAAC,EAAE,MAAM,EAA4B;IAEpD,IAAI,cAAc,IAAI,MAAM,CAAgC;IAC5D,IAAI,cAAc,CAAC,CAAC,EAAE,MAAM,EAA4B;IAExD,oFAAoF;IACpF,IAAI,sBAAsB,IAAI,MAAM,EAAE,CAAyC;IAE/E,IAAI,SAAS,IAAI,SAAS,CAAmC;IAC7D,IAAI,aAAa,IAAI,aAAa,CAAiC;IAEnE,0EAA0E;IACnE,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IASpC,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAI5C,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAI5C,WAAW,IAAI,IAAI;IAInB,SAAS,IAAI,IAAI;IAKjB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAI5D,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAMrC,OAAO,CAAC,WAAW;YAaL,YAAY;IAwB1B,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,SAAS;yCAhKR,mBAAmB;2CAAnB,mBAAmB;CA0K/B"}